@singlebase/elements 0.1.0 → 0.5.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.
Files changed (51) hide show
  1. package/README.md +2 -0
  2. package/dist/{display-8HEcKYR4.js → authui-display-BCZBP7HR.js} +11 -10
  3. package/dist/authui-display-BCZBP7HR.js.map +1 -0
  4. package/dist/{display-CLDNNZQy.cjs → authui-display-CLGFSqRi.cjs} +21 -21
  5. package/dist/authui-display-CLGFSqRi.cjs.map +1 -0
  6. package/dist/authui.cjs +1 -1
  7. package/dist/authui.d.ts +9 -9
  8. package/dist/authui.js +2 -2
  9. package/dist/chat-DRenTJlI.cjs +3001 -0
  10. package/dist/chat-DRenTJlI.cjs.map +1 -0
  11. package/dist/chat-bXaRWel7.js +4926 -0
  12. package/dist/chat-bXaRWel7.js.map +1 -0
  13. package/dist/chat-messages.d.ts +109 -0
  14. package/dist/chat.cjs +2 -0
  15. package/dist/chat.cjs.map +1 -0
  16. package/dist/chat.d.ts +10 -0
  17. package/dist/chat.js +13 -0
  18. package/dist/chat.js.map +1 -0
  19. package/dist/elements/{account-screen.d.ts → authui-account.d.ts} +1 -1
  20. package/dist/elements/{buttons.d.ts → authui-buttons.d.ts} +1 -1
  21. package/dist/elements/{display.d.ts → authui-display.d.ts} +1 -1
  22. package/dist/elements/{form-base.d.ts → authui-form-base.d.ts} +1 -1
  23. package/dist/elements/{guard.d.ts → authui-guard.d.ts} +1 -1
  24. package/dist/elements/{auth-screen.d.ts → authui.d.ts} +3 -3
  25. package/dist/elements/chat.d.ts +312 -0
  26. package/dist/files-BOwtpYyQ.js +168 -0
  27. package/dist/files-BOwtpYyQ.js.map +1 -0
  28. package/dist/files-DW8A4Jl-.cjs +38 -0
  29. package/dist/files-DW8A4Jl-.cjs.map +1 -0
  30. package/dist/index.cjs +1 -1
  31. package/dist/index.d.ts +3 -2
  32. package/dist/index.js +36 -25
  33. package/dist/index.js.map +1 -1
  34. package/dist/singlebase-elements.min.js +6845 -1829
  35. package/dist/singlebase-elements.min.js.map +1 -1
  36. package/dist/styles/chat.d.ts +6 -0
  37. package/dist/styles/tokens.d.ts +1 -1
  38. package/dist/{uploader-eFYKpk8b.cjs → uploader-DGV2y9uT.cjs} +41 -77
  39. package/dist/uploader-DGV2y9uT.cjs.map +1 -0
  40. package/dist/{uploader-D-Da1trc.js → uploader-abQoem5q.js} +309 -463
  41. package/dist/uploader-abQoem5q.js.map +1 -0
  42. package/dist/uploader.cjs +1 -1
  43. package/dist/uploader.js +5 -4
  44. package/dist/uploader.js.map +1 -1
  45. package/dist/utils/markdown.d.ts +108 -0
  46. package/package.json +13 -5
  47. package/dist/display-8HEcKYR4.js.map +0 -1
  48. package/dist/display-CLDNNZQy.cjs.map +0 -1
  49. package/dist/uploader-D-Da1trc.js.map +0 -1
  50. package/dist/uploader-eFYKpk8b.cjs.map +0 -1
  51. /package/dist/elements/{base.d.ts → authui-base.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-DRenTJlI.cjs","sources":["../src/styles/chat.ts","../src/chat-messages.ts","../src/utils/markdown.ts","../src/elements/chat.ts"],"sourcesContent":["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: var(--sb-radius, 4px);\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-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 {\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 .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-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 .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 .branding {\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 .branding a {\n font-family: var(--c-mono);\n font-size: 10.5px;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--c-muted);\n text-decoration: none;\n }\n\n .branding a:hover {\n color: var(--c-ink);\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 eyebrowRich: string;\n headingChat: string;\n headingRag: string;\n headingRich: string;\n descriptionChat: string;\n descriptionRag: string;\n descriptionRich: string;\n\n // composer\n placeholderChat: string;\n placeholderRag: string;\n placeholderRich: string;\n footnote: string;\n attach: string;\n send: string;\n stop: string;\n removeFile: string;\n dropTitle: string;\n dropSub: string;\n\n // status pills\n thinking: string;\n searching: string;\n building: 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 // 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 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 brandingLabel: string;\n}\n\nexport const defaultChatMessages: SinglebaseChatMessages = {\n eyebrowChat: \"Chat\",\n eyebrowRag: \"Grounded answers\",\n eyebrowRich: \"Charts · tables · images\",\n headingChat: \"What can I help with?\",\n headingRag: \"Ask your knowledge base\",\n headingRich: \"Ask for a chart or a table\",\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 descriptionRich:\n \"Answers come back with charts, tables and images when they help. Attach CSV or JSON files to use your own data.\",\n\n placeholderChat: \"Message {name}…\",\n placeholderRag: \"Ask about your sources…\",\n placeholderRich: \"Ask for a chart, table or breakdown…\",\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 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 building: \"Building charts and tables\",\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 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 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 brandingLabel: \"Chat by Singlebase\"\n};\n\nexport function resolveChatMessages(\n overrides: Partial<SinglebaseChatMessages> | undefined\n): SinglebaseChatMessages {\n return { ...defaultChatMessages, ...(overrides ?? {}) };\n}\n","/**\n * The small Markdown subset <singlebase-chat> renders, parsed into plain\n * blocks. Nothing here produces HTML: the element turns blocks into Lit\n * templates, so model output is always text, never markup.\n *\n * Supported: paragraphs, `#`–`####` headings, `-`/`*`/`1.` lists, `>` quotes,\n * fenced code, ```chart JSON blocks, pipe tables, `![alt](src)` images,\n * `**bold**`, `` `code` ``, `[text](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 type Block =\n | { type: \"p\"; text: string }\n | { type: \"h\"; level: number; text: string }\n | { type: \"list\"; ordered: boolean; items: string[] }\n | { type: \"quote\"; text: string }\n | { type: \"code\"; lang: string; text: string }\n | { type: \"table\"; head: string[]; rows: string[][] }\n | { type: \"chart\"; spec: ChartSpec }\n | { type: \"chartPending\" }\n | { type: \"img\"; images: ImageRef[] }\n | { type: \"raw\"; text: string };\n\nexport type Segment =\n | { type: \"text\"; text: string }\n | { type: \"bold\"; text: string }\n | { type: \"code\"; text: string }\n | { type: \"link\"; text: string; href: string }\n | { type: \"cite\"; n: number };\n\nexport type RenderAs = \"rich\" | \"markdown\" | \"text\";\n\nconst TABLE_ROW = /^\\|.*\\|$/;\nconst TABLE_RULE = /^\\|[\\s:|-]+\\|$/;\nconst IMAGE_LINE = /^!\\[([^\\]]*)\\]\\(([^)]*)\\)$/;\nconst LIST_ITEM = /^([-*]|\\d+\\.)\\s+/;\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 lang = (newline > -1 ? part.slice(0, newline) : part).trim().toLowerCase();\n const body = (newline > -1 ? part.slice(newline + 1) : \"\").replace(/\\n$/, \"\");\n const open = index === parts.length - 1;\n if (lang === \"chart\") {\n const spec = open ? null : parseChart(body);\n blocks.push(spec ? { type: \"chart\", spec } : { type: \"chartPending\" });\n } else {\n blocks.push({ type: \"code\", lang: lang || \"code\", text: body });\n }\n return;\n }\n\n for (const chunk of part.split(/\\n{2,}/)) {\n const trimmed = chunk.trim();\n if (!trimmed) continue;\n blocks.push(...parseChunk(trimmed));\n }\n });\n\n return blocks;\n}\n\nfunction parseChunk(chunk: string): Block[] {\n const lines = chunk\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n\n if (lines.length > 1 && lines.every((line) => TABLE_ROW.test(line))) {\n const rows = lines\n .filter((line) => !TABLE_RULE.test(line))\n .map((line) =>\n line\n .replace(/^\\||\\|$/g, \"\")\n .split(\"|\")\n .map((cell) => cell.trim())\n );\n return [{ type: \"table\", head: rows[0] ?? [], rows: rows.slice(1) }];\n }\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 return [{ type: \"quote\", text: lines.map((line) => line.replace(/^>\\s?/, \"\")).join(\" \") }];\n }\n\n if (lines.every((line) => LIST_ITEM.test(line))) {\n return [\n {\n type: \"list\",\n ordered: /^\\d+\\./.test(lines[0]),\n items: lines.map((line) => line.replace(LIST_ITEM, \"\"))\n }\n ];\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 = lines.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/** 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 =\n /\\*\\*([^*]+)\\*\\*|`([^`]+)`|\\[([^\\]]+)\\]\\((https?:\\/\\/[^)\\s]+)\\)|\\s?\\[(\\d+(?:\\s*,\\s*\\d+)*)\\]/g;\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: \"code\", text: match[2] });\n else if (match[3] !== undefined) out.push({ type: \"link\", text: match[3], href: match[4] });\n else {\n const numbers = match[5].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/** 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): { head: string[]; rows: string[][] } {\n return {\n head: [\"\", ...spec.series.map((s) => s.name)],\n rows: 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 stripInline = (text: string) =>\n text\n .replace(/\\*\\*/g, \"\")\n .replace(/`/g, \"\")\n .replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^)\\s]+)\\)/g, \"$1\");\n\n/**\n * Applies `render-as`. `rich` keeps everything; `markdown` turns charts into\n * tables and images into a line of text; `text` flattens it all to one block.\n */\nexport function adaptBlocks(blocks: Block[], renderAs: RenderAs): Block[] {\n if (renderAs === \"markdown\") {\n return blocks.flatMap((block): Block[] => {\n if (block.type === \"chart\") {\n const table = chartRows(block.spec);\n return [\n ...(block.spec.title ? [{ type: \"p\", text: `**${block.spec.title}**` } as Block] : []),\n { type: \"table\", ...table }\n ];\n }\n if (block.type === \"img\") {\n return block.images.map((image) => ({\n type: \"p\",\n text: `Image: ${image.alt || \"untitled\"}`\n }));\n }\n return [block];\n });\n }\n\n if (renderAs === \"text\") {\n const joined = blocks\n .map((block) => {\n switch (block.type) {\n case \"chart\": {\n const table = chartRows(block.spec);\n return [block.spec.title, ...[table.head, ...table.rows].map((r) => r.join(\" · \"))]\n .filter(Boolean)\n .join(\"\\n\");\n }\n case \"chartPending\":\n return \"\";\n case \"img\":\n return block.images.map((image) => `Image: ${image.alt || \"untitled\"}`).join(\"\\n\");\n case \"table\":\n return [block.head, ...block.rows]\n .map((r) => r.map(stripInline).join(\" · \"))\n .join(\"\\n\");\n case \"list\":\n return block.items.map((item) => `- ${stripInline(item)}`).join(\"\\n\");\n case \"code\":\n case \"raw\":\n return block.text;\n default:\n return stripInline(block.text);\n }\n })\n .filter(Boolean)\n .join(\"\\n\\n\");\n return joined ? [{ type: \"raw\", text: joined }] : [];\n }\n\n return blocks;\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) => (lang === \"chart\" ? \"[Chart] \" : \"[Code] \"))\n .replace(/!\\[([^\\]]*)\\]\\([^)]*\\)/g, \"[Image: $1]\")\n .replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^)\\s]+)\\)/g, \"$1\")\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","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 { 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 splitFollowups,\n type Block,\n type ChartSpec,\n type RenderAs\n} from \"../utils/markdown.js\";\n\n// ── public types ───────────────────────────────────────────\n\nexport type ChatMode = \"chat\" | \"rag\" | \"rich\";\nexport type ChatEmbed = \"page\" | \"inline\" | \"launcher\";\nexport type ChatGlow = \"subtle\" | \"vivid\" | \"off\";\nexport type ChatExportFormat = \"md\" | \"txt\" | \"json\" | \"copy\";\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}\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\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 embed: ChatEmbed;\n mode: ChatMode;\n renderAs: RenderAs;\n glow: ChatGlow;\n position: \"right\" | \"left\";\n sidebar: boolean | undefined;\n showTitle: boolean;\n assistantName: string;\n logoUrl: string;\n heading: string;\n description: string;\n prompts: string | (string | ChatPrompt)[];\n bubbleText: string;\n greetingBubble: boolean;\n unreadBadge: boolean;\n allowUpload: boolean;\n allowExport: boolean;\n branding: boolean;\n followups: 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}\n\nconst CONFIG_KEYS: readonly (keyof ChatConfig)[] = [\n \"embed\",\n \"mode\",\n \"renderAs\",\n \"glow\",\n \"position\",\n \"sidebar\",\n \"showTitle\",\n \"assistantName\",\n \"logoUrl\",\n \"heading\",\n \"description\",\n \"prompts\",\n \"bubbleText\",\n \"greetingBubble\",\n \"unreadBadge\",\n \"allowUpload\",\n \"allowExport\",\n \"branding\",\n \"followups\",\n \"autoTitle\",\n \"model\",\n \"params\",\n \"systemMessage\",\n \"retrieval\",\n \"metadata\",\n \"messages\",\n \"theme\"\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/** Absent means \"decide for me\". */\nconst optionalFlagAttr = {\n fromAttribute: (value: string | null) => (value === null ? undefined : value !== \"false\"),\n toAttribute: (value: boolean | undefined) => (value === undefined ? null : String(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 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 \"Answer ONLY from the sources provided with each message, numbered in the order given. \" +\n \"Put a citation like [1] right after each claim it supports. \" +\n \"If the sources don't cover the question, say so plainly.\",\n rich:\n \"Lead with one sentence stating the key finding, with key numbers in **bold**. \" +\n 'For trends and comparisons, include a chart as a fenced code block with the language \"chart\" containing only JSON: ' +\n '{\"type\":\"bar\"|\"line\",\"title\":string,\"unit\":string,\"labels\":[string],\"series\":[{\"name\":string,\"values\":[number]}]}. ' +\n \"Use Markdown tables for exact values. Keep prose short.\"\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 rich: [\n [\"Bar chart\", \"Compare the five most spoken languages in a bar chart\"],\n [\"Line chart\", \"Show world population from 1950 to 2020\"],\n [\"Table\", \"List the planets with their diameters in a table\"],\n [\"Breakdown\", \"Break down a $4,000 monthly budget by category\"]\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 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 return {\n n,\n title: pick(s.title, s.name, s.filename, meta.title, meta.name) ?? `Source ${n}`,\n path: pick(s.path, s.url, s.key, s.source, 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\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, 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 // ── behaviour ─────────────────────────────────────────────\n /** `chat` free-form, `rag` grounded with citations, `rich` charts and tables. */\n @property({ reflect: true }) accessor mode: ChatMode = \"chat\";\n\n /** How replies display. Copy and export always use the original text. */\n @property({ attribute: \"render-as\" }) accessor renderAs: RenderAs = \"rich\";\n\n @property({ reflect: true }) accessor glow: ChatGlow = \"subtle\";\n\n /** Ask for follow-up questions with each reply. */\n @property({ converter: flagAttr }) accessor followups = 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 /** Force the chat list open or closed. Unset, it docks when there's room. */\n @property({ converter: optionalFlagAttr }) accessor sidebar: boolean | undefined = undefined;\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 /** Suggested prompts: `|`-separated in markup, an array in JavaScript. */\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 /** 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 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\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 loaded chat list. */\n get chats(): readonly ChatSummary[] {\n return this.chatList;\n }\n\n set config(value: Partial<ChatConfig>) {\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 get config(): Partial<ChatConfig> {\n const source = this as unknown as Record<string, unknown>;\n return Object.fromEntries(CONFIG_KEYS.map((key) => [key, source[key]]));\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\") && this.sidebar !== undefined) this.sidebarOpen = this.sidebar;\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 ?? this.docked;\n });\n this.observer.observe(root);\n }\n }\n\n if (this.sidebarOpen && this.listState === \"idle\" && this.resolvedClient) void this.loadChats();\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.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 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 this.threadError = this.msg.errNoClient;\n return;\n }\n\n const run = ++this.run;\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.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 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 if (this.model) payload.model = this.model;\n if (Object.keys(this.params ?? {}).length) payload.params = this.params;\n\n const names = (user.attachments ?? []).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.retrieval ?? []), ...toRetrieval(user.attachments ?? [])];\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 const payload = this.payloadFor(user);\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 } else if (chatId) {\n this.touchChat(chatId);\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 Object.assign(bot, {\n id: reply._id ?? null,\n content: text,\n sources: Array.isArray(reply.sources) ? reply.sources : [],\n followups: this.followups ? 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 this.failTurn(bot, notFound ? this.msg.errNotFound : this.msg.errGeneric, errorCode(error));\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: this.followups ? 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 private upsertChat(chat: ChatSummary) {\n const rest = this.chatList.filter((c) => c._id !== chat._id);\n const existing = this.chatList.find((c) => c._id === chat._id);\n this.chatList = [{ ...existing, ...chat }, ...rest];\n }\n\n private touchChat(chatId: string) {\n const existing = this.chatList.find((c) => c._id === chatId);\n if (existing) this.upsertChat({ ...existing, _modified_at: new Date().toISOString() });\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 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({ name: file.name, size: file.size, content: await file.text() });\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 || !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.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()}\n ${\n this.branding\n ? html`<div class=\"branding\" part=\"branding\">\n <a href=\"https://singlebase.cloud\" target=\"_blank\" rel=\"noopener noreferrer\"\n >${this.msg.brandingLabel}</a\n >\n </div>`\n : nothing\n }\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.search.trim().toLowerCase();\n const shown = this.chatList.filter(\n (chat) => !query || (chat.title ?? \"\").toLowerCase().includes(query)\n );\n const groups: [string, ChatSummary[]][] = [\n [msg.groupBookmarked, shown.filter((c) => c.bookmarked)],\n [\n msg.groupToday,\n shown.filter((c) => !c.bookmarked && dayGroup(c._modified_at ?? c._created_at) === \"today\")\n ],\n [\n msg.groupYesterday,\n shown.filter(\n (c) => !c.bookmarked && dayGroup(c._modified_at ?? c._created_at) === \"yesterday\"\n )\n ],\n [\n msg.groupWeek,\n shown.filter((c) => !c.bookmarked && dayGroup(c._modified_at ?? c._created_at) === \"week\")\n ],\n [\n msg.groupOlder,\n shown.filter((c) => !c.bookmarked && dayGroup(c._modified_at ?? c._created_at) === \"older\")\n ]\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 <button type=\"button\" class=\"new-chat\" @click=${() => this.newChat()}>\n ${I.plus()}<span>${msg.newChat}</span>\n </button>\n <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 </div>\n <div class=\"threads\">${body}</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 <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 <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 <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 </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}\n title=${hasChat ? 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.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 <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 ${\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 <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 ${\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 private promptList(): ChatPrompt[] {\n const custom = this.prompts;\n if (Array.isArray(custom) && custom.length) {\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()) {\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 === \"rich\" ? \"Rich\" : \"Chat\";\n const pick = (key: string) => msg[`${key}${mode}` as keyof SinglebaseChatMessages];\n return html`<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 <span class=\"label\">${pick(\"eyebrow\")}</span>\n <h2>${this.heading || pick(\"heading\")}</h2>\n <p>${this.description || pick(\"description\")}</p>\n </div>\n <div class=\"prompts\">\n ${this.promptList().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 </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 ${m.bookmarked ? html`<span class=\"saved\">${I.bookmark(true)}${msg.saved}</span>` : nothing}\n <span class=\"time\">${time}</span>\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 <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 ${\n 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 <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 </div>`\n }\n </div>`;\n }\n\n private pillLabel(): string {\n if (this.mode === \"rag\") return this.msg.searching;\n if (this.mode === \"rich\") return this.msg.building;\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 ${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 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}</span><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 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}</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 <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 ${\n 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 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 <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 <span class=\"time\">${time}</span>\n ${m.stopped ? html`<span class=\"note\">${msg.stopped}</span>` : nothing}\n <span class=\"spacer\"></span>\n ${\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 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 blocks = adaptBlocks(parseMarkdown(m.content), this.renderAs);\n const maxCite = this.renderAs === \"text\" ? 0 : m.sources.length;\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 \"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>${this.renderInline(block.text, m, maxCite)}</h3>`;\n case \"list\": {\n const items = block.items.map(\n (item) => html`<li>${this.renderInline(item, m, maxCite)}</li>`\n );\n return block.ordered\n ? html`<ol>\n ${items}\n </ol>`\n : html`<ul>\n ${items}\n </ul>`;\n }\n case \"quote\":\n return html`<div class=\"quote\">${this.renderInline(block.text, m, maxCite)}</div>`;\n case \"code\": {\n const key = `${m.key}:${index}`;\n return html`<div class=\"code\">\n <div class=\"code-head\">\n <span class=\"label\">${block.lang}</span>\n <button type=\"button\" class=\"text-btn\" @click=${() => this.copy(key, block.text)}>\n ${this.copiedKey === key ? this.msg.copied : this.msg.copy}\n </button>\n </div>\n <pre><code>${block.text}</code></pre>\n </div>`;\n }\n case \"table\":\n return html`<div class=\"table\">\n <table>\n <thead>\n <tr>\n ${block.head.map((cell) => html`<th>${this.renderInline(cell, m, maxCite)}</th>`)}\n </tr>\n </thead>\n <tbody>\n ${block.rows.map(\n (row) =>\n html`<tr>\n ${row.map((cell) => html`<td>${this.renderInline(cell, m, maxCite)}</td>`)}\n </tr>`\n )}\n </tbody>\n </table>\n </div>`;\n case \"chart\":\n return this.renderChart(block.spec);\n case \"chartPending\":\n return html`<div class=\"chart-pending\"><span class=\"label\">Rendering chart</span></div>`;\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 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 const source = m?.sources[this.panel.n - 1];\n if (!m || !source) return nothing;\n const msg = this.msg;\n const s = describeSource(source, this.panel.n);\n const cited = citedNumbers(m.content);\n const others = m.sources\n .map((x, i) => describeSource(x, i + 1))\n .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.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 === \"rich\"\n ? msg.placeholderRich\n : fill(msg.placeholderChat, { name: this.assistantName });\n const cantSend = !this.draft.trim();\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.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 <span class=\"footnote\">${fill(msg.footnote, { name: this.assistantName })}</span>\n </div>\n </div>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"singlebase-chat\": SinglebaseChat;\n }\n}\n"],"names":["chatStyles","css","defaultChatMessages","resolveChatMessages","overrides","TABLE_ROW","TABLE_RULE","IMAGE_LINE","LIST_ITEM","parseMarkdown","text","blocks","parts","part","index","newline","lang","body","open","spec","parseChart","chunk","trimmed","parseChunk","lines","line","rows","cell","match","heading","rest","raw","series","entry","value","labels","_","i","INLINE","parseInline","maxCite","out","last","pushText","prev","valid","n","citedNumbers","found","group","chartRows","s","label","stripInline","adaptBlocks","renderAs","block","table","image","joined","r","item","splitFollowups","content","source","followups","q","plainText","_m","provisionalTitle","max","clean","cut","space","cleanTitle","isSafeUrl","url","CONFIG_KEYS","jsonAttr","flagAttr","optionalFlagAttr","SIDEBAR_WIDTH","DOCK_SIDEBAR_AT","DOCK_PANEL_AT","MAX_FILES","MAX_FILE_SIZE","TEXT_FILE","TOAST_MS","ARRIVED_MS","CHART_COLORS","MODE_PROMPTS","FOLLOWUP_PROMPT","DEFAULT_PROMPTS","icon","cls","html","I","svg","on","down","keySeed","newKey","isNotFound","error","e","_a","errorCode","reducedMotion","formatNumber","unit","fileExt","name","dot","describeSource","meta","pick","values","v","score","toRetrieval","files","documents","file","dayGroup","iso","at","start","day","SinglebaseChat","LitElement","__privateAdd","_client","_messages","_theme","_mode","_renderAs","_glow","_followups","_autoTitle","_model","_params","_systemMessage","_retrieval","_metadata","_embed","_position","_sidebar","_showTitle","_chatIdAttr","_assistantName","_logoUrl","_heading","_description","_prompts","_bubbleText","_greetingBubble","_unreadBadge","_allowUpload","_allowExport","_branding","_chatList","_listState","_activeId","_chatTitle","_bookmarked","_msgs","_loadingThread","_threadError","_busy","_draft","_files","_search","_sidebarOpen","_width","_panel","_menuOpen","_editingKey","_editDraft","_editingTitle","_renamingId","_toast","_copiedKey","_retrievalOpen","_arrivedKey","_dragging","_showJump","_offline","_isOpen","_expanded","_bubble","_seen","_mobile","__publicField","__privateGet","__privateSet","getDefaultClient","target","key","_b","changed","root","width","fn","ms","id","detail","used","client","summary","chat","run","data","m","attachments","input","format","title","who","when","sources","d","a","mime","ext","anchor","fill","user","payload","names","retrieval","bot","controller","isNew","chatId","reply","notFound","message","code","total","finish","full","step","shown","resolve","question","answer","auto","previous","assistant","c","existing","ids","removed","x","current","next","apply","wasActive","snapshot","actions","toast","list","picked","accepted","formatSize","size","scroller","event","el","classes","msg","frame","panel","nothing","bubble","button","overlay","query","groups","active","stop","hasChat","canExpand","minimize","items","custom","p","mode","lastBot","repeat","time","f","latest","pending","done","count","cited","numbered","cards","copyText","retrievalOpen","b","seg","row","legend","k","head","peak","scale","totals","sum","others","o","refKey","reference","placeholder","cantSend","tokenDefaults","__decorateClass","property","state","customElement"],"mappings":"gqBAOA,GAAI,OAAO,IAAQ,KAAe,qBAAsB,IACtD,GAAI,CACF,IAAI,iBAAiB,CACnB,KAAM,gBACN,OAAQ,UACR,SAAU,GACV,aAAc,MAAA,CACf,CACH,MAAQ,CAER,CAQK,MAAMA,GAAaC,EAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;AAAAA;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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"}