@convai/web-sdk 1.8.0-beta.5 → 1.8.0-beta.7

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 (110) hide show
  1. package/README.md +333 -13
  2. package/dist/core/CharacterRoster.d.ts +84 -0
  3. package/dist/core/CharacterRoster.d.ts.map +1 -0
  4. package/dist/core/CharacterRoster.js +348 -0
  5. package/dist/core/CharacterRoster.js.map +1 -0
  6. package/dist/core/ConvaiClient.d.ts +152 -2
  7. package/dist/core/ConvaiClient.d.ts.map +1 -1
  8. package/dist/core/ConvaiClient.js +1036 -49
  9. package/dist/core/ConvaiClient.js.map +1 -1
  10. package/dist/core/ConvaiRoomError.d.ts +48 -0
  11. package/dist/core/ConvaiRoomError.d.ts.map +1 -0
  12. package/dist/core/ConvaiRoomError.js +111 -0
  13. package/dist/core/ConvaiRoomError.js.map +1 -0
  14. package/dist/core/MessageHandler.d.ts +25 -0
  15. package/dist/core/MessageHandler.d.ts.map +1 -1
  16. package/dist/core/MessageHandler.js +431 -30
  17. package/dist/core/MessageHandler.js.map +1 -1
  18. package/dist/core/SSESession.d.ts +15 -0
  19. package/dist/core/SSESession.d.ts.map +1 -1
  20. package/dist/core/SSESession.js +92 -3
  21. package/dist/core/SSESession.js.map +1 -1
  22. package/dist/core/connectRequest.d.ts +38 -2
  23. package/dist/core/connectRequest.d.ts.map +1 -1
  24. package/dist/core/connectRequest.js +57 -0
  25. package/dist/core/connectRequest.js.map +1 -1
  26. package/dist/core/index.d.ts +6 -1
  27. package/dist/core/index.d.ts.map +1 -1
  28. package/dist/core/index.js +5 -1
  29. package/dist/core/index.js.map +1 -1
  30. package/dist/core/logicalTurn.d.ts +4 -1
  31. package/dist/core/logicalTurn.d.ts.map +1 -1
  32. package/dist/core/logicalTurn.js +35 -4
  33. package/dist/core/logicalTurn.js.map +1 -1
  34. package/dist/core/modelOutput.d.ts +40 -0
  35. package/dist/core/modelOutput.d.ts.map +1 -0
  36. package/dist/core/modelOutput.js +187 -0
  37. package/dist/core/modelOutput.js.map +1 -0
  38. package/dist/core/publishedChat.d.ts +9 -0
  39. package/dist/core/publishedChat.d.ts.map +1 -0
  40. package/dist/core/publishedChat.js +13 -0
  41. package/dist/core/publishedChat.js.map +1 -0
  42. package/dist/core/rosterRequest.d.ts +57 -0
  43. package/dist/core/rosterRequest.d.ts.map +1 -0
  44. package/dist/core/rosterRequest.js +210 -0
  45. package/dist/core/rosterRequest.js.map +1 -0
  46. package/dist/core/types.d.ts +667 -10
  47. package/dist/core/types.d.ts.map +1 -1
  48. package/dist/core/types.js.map +1 -1
  49. package/dist/embed/ConvaiChatElement.d.ts +27 -0
  50. package/dist/embed/ConvaiChatElement.d.ts.map +1 -0
  51. package/dist/embed/ConvaiChatElement.js +300 -0
  52. package/dist/embed/ConvaiChatElement.js.map +1 -0
  53. package/dist/embed/browser.d.ts +3 -0
  54. package/dist/embed/browser.d.ts.map +1 -0
  55. package/dist/embed/browser.js +5 -0
  56. package/dist/embed/browser.js.map +1 -0
  57. package/dist/embed/chat-embed-v1.js +100 -0
  58. package/dist/embed/chat-embed-v1.js.map +7 -0
  59. package/dist/embed/index.d.ts +9 -0
  60. package/dist/embed/index.d.ts.map +1 -0
  61. package/dist/embed/index.js +9 -0
  62. package/dist/embed/index.js.map +1 -0
  63. package/dist/embed/publicationApi.d.ts +23 -0
  64. package/dist/embed/publicationApi.d.ts.map +1 -0
  65. package/dist/embed/publicationApi.js +141 -0
  66. package/dist/embed/publicationApi.js.map +1 -0
  67. package/dist/react/components/ConvaiWidget.d.ts +11 -1
  68. package/dist/react/components/ConvaiWidget.d.ts.map +1 -1
  69. package/dist/react/components/ConvaiWidget.js +67 -11
  70. package/dist/react/components/ConvaiWidget.js.map +1 -1
  71. package/dist/react/components/rtc-widget/components/MarkdownRenderer.d.ts.map +1 -1
  72. package/dist/react/components/rtc-widget/components/MarkdownRenderer.js +39 -44
  73. package/dist/react/components/rtc-widget/components/MarkdownRenderer.js.map +1 -1
  74. package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.d.ts +1 -1
  75. package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.d.ts.map +1 -1
  76. package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.js +2 -2
  77. package/dist/react/components/rtc-widget/components/conviComponents/SettingsTray.js.map +1 -1
  78. package/dist/react/hooks/useConvaiClient.d.ts +2 -0
  79. package/dist/react/hooks/useConvaiClient.d.ts.map +1 -1
  80. package/dist/react/hooks/useConvaiClient.js +16 -0
  81. package/dist/react/hooks/useConvaiClient.js.map +1 -1
  82. package/dist/react/index.d.ts +1 -1
  83. package/dist/react/index.d.ts.map +1 -1
  84. package/dist/react/index.js +1 -1
  85. package/dist/react/index.js.map +1 -1
  86. package/dist/utils/inlineMarkdown.d.ts +38 -0
  87. package/dist/utils/inlineMarkdown.d.ts.map +1 -0
  88. package/dist/utils/inlineMarkdown.js +106 -0
  89. package/dist/utils/inlineMarkdown.js.map +1 -0
  90. package/dist/vanilla/AudioRenderer.d.ts.map +1 -1
  91. package/dist/vanilla/AudioRenderer.js +6 -0
  92. package/dist/vanilla/AudioRenderer.js.map +1 -1
  93. package/dist/vanilla/ConvaiWidget.d.ts.map +1 -1
  94. package/dist/vanilla/ConvaiWidget.js +224 -89
  95. package/dist/vanilla/ConvaiWidget.js.map +1 -1
  96. package/dist/vanilla/WidgetEventSubscriptions.d.ts +15 -0
  97. package/dist/vanilla/WidgetEventSubscriptions.d.ts.map +1 -0
  98. package/dist/vanilla/WidgetEventSubscriptions.js +37 -0
  99. package/dist/vanilla/WidgetEventSubscriptions.js.map +1 -0
  100. package/dist/vanilla/index.d.ts +2 -1
  101. package/dist/vanilla/index.d.ts.map +1 -1
  102. package/dist/vanilla/index.js +2 -1
  103. package/dist/vanilla/index.js.map +1 -1
  104. package/dist/vanilla/types.d.ts +8 -1
  105. package/dist/vanilla/types.d.ts.map +1 -1
  106. package/dist/vanilla/types.js.map +1 -1
  107. package/dist/version.d.ts +1 -1
  108. package/dist/version.js +1 -1
  109. package/dist/version.js.map +1 -1
  110. package/package.json +19 -6
@@ -1 +1 @@
1
- {"version":3,"file":"ConvaiWidget.js","sourceRoot":"","sources":["../../src/vanilla/ConvaiWidget.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Vanilla ConvaiWidget - Complete UI widget for Convai conversations\n * Ports the React ConvaiWidget to vanilla TypeScript with DOM manipulation\n */\n\nimport { AudioRenderer } from \"./AudioRenderer\";\nimport {\n aeroTheme,\n injectGlobalStyles,\n injectKeyframes,\n type StyleTarget,\n} from \"./styles\";\nimport { Icons } from \"./icons\";\nimport { ConvaiClient } from \"../core/ConvaiClient\";\nimport type {\n VanillaWidgetOptions,\n VanillaWidget,\n WidgetPlacement,\n} from \"./types\";\nimport type { ChatMessage, IConvaiClient } from \"../core/types\";\n\n/**\n * Positioning declarations for the widget root, keyed by `placement`. The\n * `bottom-right` entry must stay byte-identical to the literals it replaces --\n * the inline-style parity suite snapshots the resolved `cssText` and compares\n * it to a committed fixture.\n */\n/** Gap between a fixed-placement widget and the viewport edge it anchors to. */\nconst PLACEMENT_INSET_PX = 24;\n\nconst PLACEMENT_CSS: Record<WidgetPlacement, string> = {\n \"bottom-right\": `position: fixed; bottom: ${PLACEMENT_INSET_PX}px; right: ${PLACEMENT_INSET_PX}px;`,\n \"bottom-left\": `position: fixed; bottom: ${PLACEMENT_INSET_PX}px; left: ${PLACEMENT_INSET_PX}px;`,\n \"top-right\": `position: fixed; top: ${PLACEMENT_INSET_PX}px; right: ${PLACEMENT_INSET_PX}px;`,\n \"top-left\": `position: fixed; top: ${PLACEMENT_INSET_PX}px; left: ${PLACEMENT_INSET_PX}px;`,\n inline: \"position: relative;\",\n};\n\n/** The open panel's preferred size. Capped by `PANEL_MAX_*` — see below. */\nconst PANEL_W_PX = 400;\nconst PANEL_H_PX = 600;\n\n/**\n * A ceiling on the open panel, so it can never be clipped by the viewport.\n *\n * The panel used to be a flat 400x600. The widget is `position: fixed`\n * anchored `PLACEMENT_INSET_PX` from one edge, so on any viewport narrower\n * than 448px — or shorter than 648px — the panel ran past the opposite edge\n * and was silently cut off, with no scrollbar to reveal it, because fixed\n * elements do not contribute to scrollable overflow. That is most phones: at\n * 393px (iPhone 15 Pro) 30px of the panel sat off-screen, at 360px 63px did,\n * and in landscape 233px of it — the entire header, including the close\n * button — sat above the viewport, leaving nothing on screen to dismiss it.\n *\n * Expressed as `max-width`/`max-height` rather than folding the cap into the\n * width with `min()`. Both compute the same thing, but they fail differently:\n * a parser that does not know `min()` drops the whole declaration and the\n * panel is left with no width at all, which is worse than the bug. An unknown\n * `max-width` drops only the ceiling and leaves the previous behaviour intact.\n * (Not hypothetical — happy-dom, which this package's own tests run in, parses\n * the `max-width` form and discards the `min()` one.)\n *\n * Dynamic viewport units so mobile browser chrome is accounted for as it shows\n * and hides, rather than sizing against a viewport the user cannot fully see.\n * Applied to the container permanently rather than per state: the collapsed\n * bubble is far below the ceiling, so it is unaffected.\n */\nconst PANEL_MAX_W = `calc(100dvw - ${PLACEMENT_INSET_PX * 2}px)`;\nconst PANEL_MAX_H = `calc(100dvh - ${PLACEMENT_INSET_PX * 2}px)`;\n\ninterface RTCChatMessage {\n id: string;\n text: string;\n isUser: boolean;\n timestamp: string;\n sender?: string;\n showLogo: boolean;\n}\n\n/** `convai-error{code:'mic-permission'}` per the embed's error-handling contract. */\nconst MIC_PERMISSION_ERROR_CODE = \"mic-permission\" as const;\n\n/**\n * Distinguishes a microphone-permission denial from any other audio failure.\n *\n * Traced (not assumed): `client.audioControls.unmuteAudio()` delegates to\n * `AudioManager.enableAudio()`, which calls\n * `room.localParticipant.setMicrophoneEnabled(true)`. That's LiveKit's\n * `setTrackEnabled()`, which on failure does `throw e` unchanged, from a\n * `catch` around `createLocalTracks()`, which itself does `throw e` unchanged\n * around `navigator.mediaDevices.getUserMedia()`. `AudioManager.enableAudio()`\n * also just does `throw error` in its own catch. Nothing on that path wraps or\n * replaces the error, so a user's permission denial reaches here as the exact\n * `DOMException` `getUserMedia()` produced, with `.name === 'NotAllowedError'`\n * (`'PermissionDeniedError'` is the old pre-spec name some browsers used).\n */\nfunction isMicPermissionDenial(error: unknown): boolean {\n const name = (error as { name?: unknown } | null | undefined)?.name;\n return name === \"NotAllowedError\" || name === \"PermissionDeniedError\";\n}\n\n/**\n * Wraps a mic-permission denial so a consumer of the client's `error`\n * channel can tell it apart from a generic failure without knowing anything\n * about `DOMException` internals -- it only has to check `error.code`. The\n * original error is preserved on `.cause` for anyone who wants the detail.\n */\nfunction toMicPermissionError(\n cause: unknown,\n): Error & { code: typeof MIC_PERMISSION_ERROR_CODE; cause: unknown } {\n const err = new Error(\n \"Microphone access was denied. Continuing in text-only mode.\",\n ) as Error & { code: typeof MIC_PERMISSION_ERROR_CODE; cause: unknown };\n err.name = \"ConvaiMicPermissionError\";\n err.code = MIC_PERMISSION_ERROR_CODE;\n err.cause = cause;\n return err;\n}\n\n/**\n * Routes a failed `enableAudio()`/`unmuteAudio()` call onto the client's\n * *existing* `error` channel -- the same one `ConvaiClient` already uses --\n * instead of letting it become an unhandled rejection (the click-handler\n * site) or vanish into a bare `console.error` (the auto-voice-mode sites).\n * `console.error` is kept alongside for local debugging; this just adds the\n * event emission next to it. `client.emit` is called defensively since it\n * isn't part of the public `IConvaiClient` surface -- see the `emit?` field\n * on `VanillaWidgetOptions.convaiClient` in `./types.ts`.\n */\nfunction reportMicFailure(\n client: { emit?: (event: string, ...args: any[]) => void },\n logLabel: string,\n error: unknown,\n): void {\n console.error(logLabel, error);\n const payload = isMicPermissionDenial(error)\n ? toMicPermissionError(error)\n : error;\n client.emit?.(\"error\", payload);\n}\n\n/**\n * Create a Convai chat widget in the specified container\n *\n * @param container - HTML element to attach the widget to\n * @param options - Widget configuration options\n * @returns VanillaWidget instance with destroy method\n *\n * @example Simple usage with config\n * ```typescript\n * import { createConvaiWidget } from '@convai/web-sdk/vanilla';\n *\n * const widget = createConvaiWidget(document.body, {\n * apiKey: 'your-api-key',\n * characterId: 'your-character-id',\n * enableVideo: false\n * });\n * ```\n *\n * @example Advanced usage with client instance\n * ```typescript\n * import { ConvaiClient, createConvaiWidget } from '@convai/web-sdk/vanilla';\n *\n * const client = new ConvaiClient({\n * apiKey: 'your-api-key',\n * characterId: 'your-character-id'\n * });\n *\n * const widget = createConvaiWidget(document.body, {\n * convaiClient: client,\n * showVideo: true,\n * showScreenShare: true,\n * defaultVoiceMode: true\n * });\n * ```\n */\nexport function createConvaiWidget(\n container: HTMLElement,\n options: VanillaWidgetOptions,\n): VanillaWidget {\n /**\n * Where global styles and `@keyframes` are injected.\n *\n * An explicit `options.styleTarget` wins and is used verbatim. Otherwise we\n * fall back to deriving it from the container's current root — which is what\n * every existing caller relies on, but only works when the container is\n * already attached to its final root. A caller that builds a detached\n * subtree and appends it to a shadow root afterwards must pass\n * `styleTarget` explicitly, or the styles land in `document.head` and the\n * shadow tree renders unstyled with no error.\n */\n const styleTarget: StyleTarget =\n options.styleTarget ??\n ((container.getRootNode() as StyleTarget | null) instanceof ShadowRoot\n ? (container.getRootNode() as ShadowRoot)\n : document);\n\n // Create client if not provided - guarantee it's defined\n const client: IConvaiClient & {\n activity?: string;\n chatMessages: ChatMessage[];\n emit?: (event: string, ...args: any[]) => void;\n } =\n options.convaiClient ||\n (() => {\n const hasAuth = Boolean(options.apiKey || options.authToken);\n if (!hasAuth || !options.characterId) {\n throw new Error(\n \"Either convaiClient or (apiKey or authToken) and characterId must be provided\",\n );\n }\n\n return new ConvaiClient({\n apiKey: options?.apiKey || undefined,\n authToken: options?.authToken || undefined,\n characterId: options.characterId,\n enableVideo: options.enableVideo ?? false,\n startWithVideoOn: options.startWithVideoOn ?? false,\n enableLipsync: options.enableLipsync ?? false,\n enableEmotion: options.enableEmotion,\n blendshapeConfig: options.blendshapeConfig,\n });\n })();\n\n const {\n showVideo = true,\n showScreenShare = true,\n defaultVoiceMode = true,\n onConnect,\n onDisconnect,\n onMessage,\n } = options;\n\n // Unknown/typo'd values fall back to the default rather than throwing --\n // a bad `placement` attribute on a customer's page must not blank the\n // widget.\n const placement: WidgetPlacement =\n options.placement && options.placement in PLACEMENT_CSS\n ? options.placement\n : \"bottom-right\";\n\n // Inject global styles\n injectGlobalStyles(styleTarget);\n\n // State\n let isOpen = false;\n let isSettingsOpen = false;\n let isVoiceMode = defaultVoiceMode;\n let isMuted = false;\n let isVideoVisible = false;\n let inputValue = \"\";\n let characterName = \"Character\";\n let characterImage = \"\";\n let audioRenderer: AudioRenderer | null = null;\n let hasEnteredDefaultVoiceMode = false;\n /** True after we have connected at least once; used to call reconnect() instead of connect() when opening after disconnect */\n let hasConnectedBefore = false;\n /**\n * True from the moment an open is requested on a *disconnected* client\n * until that open either completes or is cancelled.\n *\n * `isOpen` alone cannot express this: the first open awaits a real\n * `connect()` (0.5-3s in production) and only flips `isOpen` afterwards, so\n * for that whole window the widget is neither open nor idle. Without this\n * flag `close()` sees `isOpen === false` and no-ops -- and the connect then\n * pops the panel open behind the user -- while `toggle()` sees the same\n * `false`, starts a *second* open, and lands on the already-connecting\n * branch that opens immediately. Every entry point below treats\n * `pendingOpen` as \"open\" for the purpose of deciding what a close/toggle\n * means, and `handleToggle` re-checks it before committing `setIsOpen(true)`\n * so a cancellation during the await is honoured.\n */\n let pendingOpen = false;\n\n // DOM elements (will be created below)\n let rootElement!: HTMLDivElement;\n let morphingContainer!: HTMLDivElement;\n let buttonContent!: HTMLDivElement;\n let chatContent!: HTMLDivElement;\n let headerElement!: HTMLDivElement;\n let contentElement!: HTMLDivElement;\n let footerElement!: HTMLDivElement;\n let inputElement!: HTMLInputElement;\n let messageListElement!: HTMLDivElement;\n let settingsTray!: HTMLDivElement;\n let floatingVideo!: HTMLDivElement;\n let voiceModeOverlay!: HTMLDivElement;\n let connectingOverlay!: HTMLDivElement;\n\n /**\n * Elements captured at creation. IDs are scoped per DOM tree, so\n * document.getElementById() returns null when the widget is mounted\n * inside a shadow root. Every element here is created in this file.\n */\n const refs: {\n voiceModeTitle?: HTMLElement;\n voiceModeSubtitle?: HTMLElement;\n voiceModeAvatar?: HTMLElement;\n voiceModeAvatarClip?: HTMLElement;\n voiceModeCanvas?: HTMLCanvasElement;\n widgetTitle?: HTMLElement;\n sendButton?: HTMLButtonElement;\n footerStandard?: HTMLElement;\n voiceExitBtn?: HTMLElement;\n settingsVideoBtn?: HTMLElement;\n settingsShareBtn?: HTMLElement;\n connectingLabel?: HTMLElement;\n } = {};\n\n // Audio Analysis State\n let audioContext: AudioContext | null = null;\n let analyzer: AnalyserNode | null = null;\n let dataArray: Uint8Array<ArrayBuffer> | null = null;\n let rafId: number | null = null;\n let source: MediaStreamAudioSourceNode | null = null;\n\n // Fetch character info - matches React useCharacterInfo hook\n const fetchCharacterInfo = async () => {\n // Prefer authToken over apiKey, matching the precedence ConvaiClient\n // uses when building /connect headers -- a client carrying both must\n // behave identically in both places.\n //\n // The two credentials travel in *different* headers: api.convai.com reads\n // an auth token from API-AUTH-TOKEN and an API key from X-API-Key, and\n // answers an API key sent as API-AUTH-TOKEN with `400 Your session has\n // expired.` Because the failure is swallowed below, sending the wrong one\n // showed up only as a header stuck on the fallback name.\n const credential = client.authToken ?? client.apiKey;\n if (!credential || !client.characterId) return;\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (client.authToken) {\n headers[\"API-AUTH-TOKEN\"] = client.authToken;\n } else {\n headers[\"X-API-Key\"] = credential;\n }\n\n try {\n const response = await fetch(\"https://api.convai.com/character/get\", {\n method: \"POST\",\n headers,\n body: JSON.stringify({ charID: client.characterId }),\n });\n\n if (response.ok) {\n const data = await response.json();\n\n // Extract character name and image with fallbacks - matches React version\n characterName = data.character_name || \"Convi\";\n characterImage =\n data.model_details?.METAHUMAN?.avatar_image_square ||\n data.model_details?.METAHUMAN?.avatar_image ||\n data.model_details?.modelPlaceholder ||\n \"\";\n\n updateHeader();\n }\n } catch (error) {\n console.error(\"Failed to fetch character info:\", error);\n }\n };\n\n // Create root structure\n const createDOM = () => {\n rootElement = document.createElement(\"div\");\n rootElement.className = \"convai-widget\";\n rootElement.style.cssText = `\n ${PLACEMENT_CSS[placement]}\n z-index: var(--convai-z-index, ${aeroTheme.zIndex.modal});\n font-family: var(--convai-font, ${aeroTheme.typography.fontFamily.primary});\n `;\n\n // Morphing container\n morphingContainer = document.createElement(\"div\");\n // `part=\"launcher\"` is precise only while collapsed: this same element\n // morphs into the open panel (400x600, capped to the viewport — see PANEL_MAX_W)\n // and carries that panel's background,\n // radius and shadow. See the `part=\"panel\"` call site below for the full\n // semantics a host needs to know.\n morphingContainer.setAttribute(\"part\", \"launcher\");\n // NOTE on border-radius: deliberately NOT themable. `--convai-radius`\n // drives the open panel only. One token cannot serve both geometries --\n // `--convai-radius: 8px` would squircle the circular launcher, and `50%`\n // would turn the panel into an ellipse. A dedicated\n // `--convai-launcher-radius` can be added additively later if wanted.\n morphingContainer.style.cssText = `\n position: relative;\n width: var(--convai-launcher-size, 64px);\n height: var(--convai-launcher-size, 64px);\n max-width: ${PANEL_MAX_W};\n max-height: ${PANEL_MAX_H};\n background: var(--convai-panel-bg, ${aeroTheme.colors.glass.backdrop});\n backdrop-filter: ${aeroTheme.glass.backdrop};\n border: ${aeroTheme.glass.border};\n border-radius: 50%;\n box-shadow: var(--convai-shadow, ${aeroTheme.shadows.glass});\n transition: all 0.3s ease-in-out;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n `;\n\n // Button content (logo)\n buttonContent = document.createElement(\"div\");\n buttonContent.style.cssText = `\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: opacity 0.3s, transform 0.3s;\n opacity: 1;\n transform: scale(1);\n `;\n const convaiLogo = Icons.ConvaiLogo(\"xl\", \"idle\");\n convaiLogo.style.color = `var(--convai-accent, ${aeroTheme.colors.convai.light})`;\n buttonContent.appendChild(convaiLogo);\n\n // Chat content\n chatContent = document.createElement(\"div\");\n // ----------------------------------------------------------------------\n // `launcher` / `panel` part semantics. Read before writing theming docs.\n //\n // This widget morphs rather than swapping trees: `morphingContainer` IS\n // the 64px circle AND the open panel, animating between them (see\n // setIsOpen). It therefore owns every painted surface property of both\n // states -- background, border, border-radius, box-shadow. `buttonContent`\n // and `chatContent` are transparent `inset: 0` overlays that only\n // cross-fade their contents.\n //\n // So, precisely:\n // ::part(launcher) -> morphingContainer. Paints the collapsed circle\n // AND the open panel; there is no rule that hits\n // only one. This is the surface part.\n // ::part(panel) -> chatContent. The open state's *content layer*:\n // useful for padding, colour, font, opacity. It has\n // no background, no border and no radius of its\n // own, so `::part(panel){border-radius}` does\n // nothing -- set radius via ::part(launcher) or\n // `--convai-radius` (which is panel-scoped).\n //\n // Assessed and deliberately not \"fixed\": moving `launcher` onto\n // buttonContent would make `::part(launcher){background}` state-specific\n // but would silently break `border-radius` and `box-shadow` on it, since\n // buttonContent is clipped by the container's own radius + overflow:\n // hidden. Correcting this properly needs a separate launcher element\n // instead of a morph -- a rendering change, out of scope here.\n // ----------------------------------------------------------------------\n chatContent.setAttribute(\"part\", \"panel\");\n chatContent.style.cssText = `\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n opacity: 0;\n transform: scale(0.8);\n transition: opacity 0.2s, transform 0.2s;\n pointer-events: none;\n `;\n\n // Voice Mode Overlay\n voiceModeOverlay = createVoiceModeOverlay();\n chatContent.appendChild(voiceModeOverlay);\n\n // Header\n headerElement = createHeader();\n\n // Content area\n contentElement = document.createElement(\"div\");\n contentElement.style.cssText = `\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n background: transparent;\n position: relative;\n `;\n messageListElement = createMessageList();\n contentElement.appendChild(messageListElement);\n // Connecting overlay -- shown until the bot is ready. Appended last, not\n // to match DOM order (position: absolute + z-index: 100, set inside\n // createConnectingOverlay, is what keeps it on top regardless of source\n // order) but so inserting it doesn't shift every existing sibling's\n // index-based path in the inline-style-parity fixture.\n connectingOverlay = createConnectingOverlay();\n contentElement.appendChild(connectingOverlay);\n\n // Footer\n footerElement = createFooter();\n\n chatContent.appendChild(headerElement);\n chatContent.appendChild(contentElement);\n chatContent.appendChild(footerElement);\n\n morphingContainer.appendChild(buttonContent);\n morphingContainer.appendChild(chatContent);\n rootElement.appendChild(morphingContainer);\n\n // Settings tray\n settingsTray = createSettingsTray();\n rootElement.appendChild(settingsTray);\n\n // Floating video\n floatingVideo = createFloatingVideo();\n container.appendChild(floatingVideo);\n\n container.appendChild(rootElement);\n\n // Event listeners\n morphingContainer.addEventListener(\"click\", handleLauncherClick);\n };\n\n // Create Voice Mode Overlay\n /**\n * Voice mode, matched to the React overlay (VoiceModeOverlay.tsx) rather\n * than to what this file used to draw.\n *\n * The two had diverged badly: React centres the character's avatar inside\n * two counter-rotating liquid-gradient layers and paints the user's\n * microphone as three overlapping sine waves on a canvas, while this file\n * drew forty grey vertical bars and no avatar at all. Same product, two\n * unrelated screens.\n *\n * What is reproduced here, value for value: the 120px avatar with its 3px\n * rgba(255,255,255,0.2) ring and letter fallback, the 126px conic and\n * radial gradient layers (20s clockwise / 15s anticlockwise, blurred 8px\n * and 6px), the 250x80 canvas carrying three waves, and the status text at\n * 16px/600 over 13px with React's wording.\n *\n * The one deliberate omission is the `AudioVisualizer` ring that React\n * fades in behind the avatar while the character speaks: it is a 364-line\n * component wired directly to a LiveKit `Room`, and porting it is its own\n * change. The avatar still breathes while the character speaks, so the\n * speaking state reads without it.\n */\n const createVoiceModeOverlay = (): HTMLDivElement => {\n const overlay = document.createElement(\"div\");\n overlay.style.cssText = `\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n text-align: center;\n padding: 16px;\n z-index: 10;\n pointer-events: auto;\n display: none;\n flex-direction: column;\n align-items: center;\n gap: 32px;\n `;\n\n // --- Avatar, with the two rotating gradient layers behind it ----------\n const avatarWrap = document.createElement(\"div\");\n avatarWrap.style.cssText = `\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n isolation: isolate;\n `;\n\n const avatarStack = document.createElement(\"div\");\n avatarStack.className = \"convai-voice-avatar\";\n refs.voiceModeAvatar = avatarStack;\n avatarStack.style.cssText = `\n position: relative;\n z-index: 10;\n border-radius: 50%;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);\n background: white;\n display: flex;\n align-items: center;\n justify-content: center;\n `;\n\n const accent = `var(--convai-accent, ${aeroTheme.colors.convai.light})`;\n const layer1 = document.createElement(\"div\");\n layer1.className = \"convai-voice-gradient\";\n layer1.style.cssText = `\n position: absolute;\n width: 126px;\n height: 126px;\n border-radius: 50%;\n background: conic-gradient(\n from 0deg,\n ${aeroTheme.colors.convai.light}00 0%,\n ${aeroTheme.colors.convai.light}40 25%,\n ${aeroTheme.colors.convai.dark}60 50%,\n ${aeroTheme.colors.convai.light}40 75%,\n ${aeroTheme.colors.convai.light}00 100%\n );\n opacity: 0.8;\n filter: blur(8px);\n z-index: -2;\n animation: convaiVoiceSpin 20s linear infinite;\n `;\n\n const layer2 = document.createElement(\"div\");\n layer2.className = \"convai-voice-gradient\";\n layer2.style.cssText = `\n position: absolute;\n width: 126px;\n height: 126px;\n border-radius: 50%;\n background:\n radial-gradient(ellipse 80% 100% at 30% 40%,\n ${aeroTheme.colors.convai.light}50,\n ${aeroTheme.colors.convai.light}30 40%,\n transparent 70%),\n radial-gradient(ellipse 80% 100% at 70% 60%,\n ${aeroTheme.colors.convai.dark}50,\n ${aeroTheme.colors.convai.dark}30 40%,\n transparent 70%);\n opacity: 0.9;\n filter: blur(6px);\n z-index: -1;\n animation: convaiVoiceSpinReverse 15s linear infinite;\n `;\n\n // The image is clipped by its own container so the gradients above stay\n // visible outside it — React nests it the same way for the same reason.\n const avatarClip = document.createElement(\"div\");\n avatarClip.style.cssText = `\n position: relative;\n border-radius: 50%;\n overflow: hidden;\n border: 3px solid rgba(255, 255, 255, 0.2);\n width: 120px;\n height: 120px;\n display: flex;\n align-items: center;\n justify-content: center;\n `;\n refs.voiceModeAvatarClip = avatarClip;\n\n avatarStack.append(layer1, layer2, avatarClip);\n avatarWrap.appendChild(avatarStack);\n overlay.appendChild(avatarWrap);\n\n // --- The user's microphone, as three waves on a canvas ----------------\n const canvas = document.createElement(\"canvas\");\n canvas.className = \"convai-voice-wave\";\n canvas.style.cssText = `width: 250px; height: 80px;`;\n refs.voiceModeCanvas = canvas;\n overlay.appendChild(canvas);\n\n // --- Status text ------------------------------------------------------\n const statusContainer = document.createElement(\"div\");\n\n const statusTitle = document.createElement(\"div\");\n statusTitle.id = \"voice-mode-title\";\n refs.voiceModeTitle = statusTitle;\n statusTitle.style.cssText = `\n font-size: 16px;\n font-weight: 600;\n color: var(--convai-panel-fg, ${aeroTheme.colors.text.primary});\n margin-bottom: 8px;\n `;\n statusTitle.textContent = \"Voice Mode\";\n\n const statusSubtitle = document.createElement(\"div\");\n statusSubtitle.id = \"voice-mode-subtitle\";\n refs.voiceModeSubtitle = statusSubtitle;\n statusSubtitle.style.cssText = `\n font-size: 13px;\n color: ${aeroTheme.colors.text.secondary};\n `;\n statusSubtitle.textContent = \"Tap microphone to talk\";\n\n statusContainer.append(statusTitle, statusSubtitle);\n overlay.appendChild(statusContainer);\n\n void accent;\n return overlay;\n };\n\n /**\n * Fills the voice-mode avatar from the character info fetch, or falls back\n * to the character's initial the way React does. Called from\n * updateHeader(), so it tracks a late `fetchCharacterInfo()` rather than\n * being fixed at construction.\n */\n const updateVoiceModeAvatar = (): void => {\n const clip = refs.voiceModeAvatarClip;\n if (!clip) return;\n const wanted = characterImage || `letter:${characterName}`;\n if (clip.dataset.filledWith === wanted) return;\n clip.dataset.filledWith = wanted;\n clip.replaceChildren();\n\n if (characterImage) {\n const img = document.createElement(\"img\");\n img.src = characterImage;\n img.alt = characterName;\n img.style.cssText = `width: 120px; height: 120px; object-fit: cover; display: block;`;\n clip.appendChild(img);\n return;\n }\n\n const letter = document.createElement(\"div\");\n letter.style.cssText = `\n width: 120px;\n height: 120px;\n background-color: ${aeroTheme.colors.convai.light}20;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 48px;\n font-weight: 600;\n color: var(--convai-accent, ${aeroTheme.colors.convai.light});\n `;\n letter.textContent = characterName[0]?.toUpperCase() || \"C\";\n clip.appendChild(letter);\n };\n\n // Create Connecting Overlay -- matches React's inline AnimatePresence\n // block exactly (ConvaiWidget.tsx:681-737): shown whenever\n // `isConnected && !isBotReady`, covering just the content area (not the\n // header/footer) so the chrome stays interactive while the character\n // joins. Persistent in the DOM like voiceModeOverlay above -- toggled via\n // opacity/pointer-events rather than mounted/unmounted, since this file has\n // no AnimatePresence-style exit-animation machinery. Visibility is driven\n // by updateConnectingOverlay().\n const createConnectingOverlay = (): HTMLDivElement => {\n const overlay = document.createElement(\"div\");\n overlay.id = \"convai-connecting-overlay\";\n overlay.style.cssText = `\n position: absolute;\n inset: 0;\n z-index: 100;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n background: rgba(255, 255, 255, 0.95);\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.3s;\n `;\n\n // Keyframes live in the shadow-safe injector (styles.ts), not\n // document.head -- @keyframes defined there do not resolve for shadow\n // content. Idempotent; also called from createSettingsTray().\n injectKeyframes(styleTarget);\n\n // Spinning logo: a full turn every 2s, linear, infinite.\n const spinWrapper = document.createElement(\"div\");\n spinWrapper.className = \"convai-connecting-spin\";\n spinWrapper.style.cssText = `\n display: inline-flex;\n animation: convaiConnectingSpin 2s linear infinite;\n `;\n const logo = Icons.ConvaiLogo(\"xl\", \"connecting\");\n // Themable, like every other accent usage in this file (see\n // theming.test.ts) -- var() with the exact literal React passes\n // (`aeroTheme.colors.convai.light`) as the fallback, so an unset\n // --convai-accent renders identically to the React value.\n logo.style.color = `var(--convai-accent, ${aeroTheme.colors.convai.light})`;\n spinWrapper.appendChild(logo);\n overlay.appendChild(spinWrapper);\n\n // Pulsing \"Connecting to {characterName}...\" label.\n const label = document.createElement(\"div\");\n label.id = \"convai-connecting-text\";\n label.className = \"convai-connecting-pulse\";\n label.style.cssText = `\n font-size: 14px;\n font-weight: 500;\n color: ${aeroTheme.colors.text.secondary};\n animation: convaiConnectingPulse 2s ease-in-out infinite;\n `;\n refs.connectingLabel = label;\n overlay.appendChild(label);\n\n return overlay;\n };\n\n /** Shows/hides the connecting overlay and refreshes its label. Called\n * from updateHeader() so every existing call site (stateChange, botReady,\n * connect/disconnect via stateChange, character-info fetch, ...) stays in\n * sync automatically. */\n const updateConnectingOverlay = () => {\n if (!connectingOverlay) return;\n const label = refs.connectingLabel;\n if (label) {\n label.textContent = `Connecting to ${characterName}...`;\n }\n // `isConnecting` matters as much as `isConnected` here. The panel opens\n // on the click that *starts* the connect, so between that click and the\n // transport coming up (a real network round trip — ~3s against the live\n // service) `isConnected` is still false. Gating on it alone left the\n // whole of that window with no overlay at all: an empty message area and\n // a nameless header, i.e. the widget looked broken for exactly as long as\n // it was doing the one thing the user asked for. Then the label appeared\n // *after* the transport was already up, which reads backwards.\n //\n // The embed makes this the normal path rather than an edge case: its\n // launcher click opens the panel immediately by design, so the pre-connect\n // window is always visible to the user.\n const shouldShow =\n (client.state.isConnected || client.state.isConnecting) && !client.isBotReady;\n connectingOverlay.style.opacity = shouldShow ? \"1\" : \"0\";\n connectingOverlay.style.pointerEvents = shouldShow ? \"auto\" : \"none\";\n };\n\n // Audio Analysis State for Voice Mode\n let audioLevels: number[] = Array(40).fill(0);\n let startTime = 0;\n /**\n * Paints the three overlapping sine waves React draws for the user's\n * microphone (VoiceModeOverlay.tsx's `drawWaves`), including its two\n * performance guards, which matter more here than there: this canvas sits\n * over whatever the host page is rendering, and every repaint forces the\n * compositor to re-blend the whole panel. So it runs at 30fps rather than\n * 60, and stops entirely while the input is silent — the static line is\n * already on the canvas at that point.\n */\n let waveFrameParity = 0;\n let waveWasSilent = false;\n const drawWaves = () => {\n const canvas = refs.voiceModeCanvas;\n if (!canvas) return;\n\n waveFrameParity ^= 1;\n if (waveFrameParity) return;\n\n let sum = 0;\n for (let i = 0; i < audioLevels.length; i++) sum += audioLevels[i]!;\n const silent = sum / audioLevels.length < 0.012;\n if (silent && waveWasSilent) return;\n waveWasSilent = silent;\n\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n if (canvas.width !== 250 * dpr) {\n canvas.width = 250 * dpr;\n canvas.height = 80 * dpr;\n }\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, 250, 80);\n\n const centerY = 40;\n const waveWidth = 250;\n const segments = 40;\n const avgLevel = sum / audioLevels.length;\n const waveColors = [\n aeroTheme.colors.convai.light,\n aeroTheme.colors.convai.light,\n \"#34d399\",\n ];\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n for (let waveIndex = 2; waveIndex >= 0; waveIndex--) {\n ctx.beginPath();\n for (let i = 0; i <= segments; i++) {\n const x = (i / segments) * waveWidth;\n const levelIndex = Math.floor((i / segments) * (audioLevels.length - 1));\n const level = audioLevels[levelIndex] || 0;\n const phase =\n (Date.now() / 500 + i * 0.2 + waveIndex * 1.5) % (Math.PI * 2);\n const baseAmplitude = avgLevel > 0.05 ? 2 + waveIndex * 1.5 : 0;\n const amplitude = baseAmplitude + level * (25 - baseAmplitude);\n const y = centerY + Math.sin(phase) * amplitude;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.strokeStyle = waveColors[waveIndex]!;\n ctx.globalAlpha = 0.18 * (0.3 + avgLevel);\n ctx.lineWidth = 2.5 - waveIndex * 0.4 + 8 * avgLevel + 3;\n ctx.stroke();\n ctx.globalAlpha = 0.95 - waveIndex * 0.15;\n ctx.lineWidth = 2.5 - waveIndex * 0.4;\n ctx.stroke();\n }\n ctx.globalAlpha = 1;\n };\n\n /**\n * The voice-mode frame loop. Keeps the name `updateAudioBars` because\n * every call site refers to it; what it drives is now the avatar, the\n * canvas and the status text rather than forty bars.\n */\n const updateAudioBars = () => {\n if (!voiceModeOverlay) return;\n\n const isTalking = client.state.isSpeaking;\n const isListening = client.state.isListening;\n const micOpen = !client.audioControls.isAudioMuted;\n\n // The avatar breathes while the character speaks — React drives the same\n // thing with a framer-motion scale keyframe.\n const avatar = refs.voiceModeAvatar;\n if (avatar) {\n const wanted = isTalking ? \"convaiVoiceBreathe 3s ease-in-out infinite\" : \"\";\n if (avatar.style.animation !== wanted) avatar.style.animation = wanted;\n }\n\n // React's exact wording, including \"Voice Mode\" rather than the\n // \"Voice Only Mode\" this file used to show.\n const title = refs.voiceModeTitle;\n const subtitle = refs.voiceModeSubtitle;\n if (title) {\n title.textContent = isTalking\n ? `${characterName} Speaking...`\n : isListening || micOpen\n ? \"Listening...\"\n : \"Voice Mode\";\n }\n if (subtitle) {\n subtitle.textContent =\n isListening || micOpen || isTalking ? \"Audio active\" : \"Tap microphone to talk\";\n }\n\n if ((isListening || micOpen) && analyzer && dataArray) {\n // @ts-ignore - TypeScript strict mode issue with Uint8Array type\n analyzer.getByteTimeDomainData(dataArray);\n let sum = 0;\n for (let i = 0; i < dataArray.length; i++) {\n const normalized = (dataArray[i]! - 128) / 128;\n sum += normalized * normalized;\n }\n const rms = Math.sqrt(sum / dataArray.length);\n const volume = Math.min(1, rms * 3);\n\n for (let i = 0; i < audioLevels.length; i++) {\n const position = i / audioLevels.length;\n const wavePhase = Date.now() / 300 + position * Math.PI * 2;\n const waveVariation = Math.sin(wavePhase) * 0.15 + 0.85;\n audioLevels[i] = volume * waveVariation;\n }\n } else {\n // The waves settle to a flat line rather than animating on the\n // character's behalf: React paints this canvas from the microphone\n // only, and the character's own speech is the avatar's job.\n for (let i = 0; i < audioLevels.length; i++) audioLevels[i] = 0;\n }\n drawWaves();\n\n rafId = requestAnimationFrame(updateAudioBars);\n };\n\n\n const startAudioAnalysis = async () => {\n try {\n if (!audioContext) {\n audioContext = new (window.AudioContext ||\n (window as any).webkitAudioContext)();\n }\n\n if (audioContext.state === \"suspended\") {\n await audioContext.resume();\n }\n\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n analyzer = audioContext.createAnalyser();\n analyzer.fftSize = 256;\n analyzer.smoothingTimeConstant = 0.7;\n\n source = audioContext.createMediaStreamSource(stream);\n source.connect(analyzer);\n\n dataArray = new Uint8Array(analyzer.fftSize);\n updateAudioBars();\n } catch (e) {\n // Fourth mic-acquiring call site: this getUserMedia() is independent\n // of client.audioControls (it's a separate analyser-only stream, not\n // routed through AudioManager), but a denial here is the identical\n // failure mode -- most commonly a mid-session permission revocation,\n // since by the time voice mode is entered the mic has usually already\n // been granted via unmuteAudio(). Same helper, same channel, so a\n // consumer sees one consistent signal regardless of which internal\n // path acquired the mic.\n reportMicFailure(client, \"Audio analysis setup failed:\", e);\n }\n };\n\n const stopAudioAnalysis = () => {\n if (rafId) cancelAnimationFrame(rafId);\n if (source) {\n source.disconnect();\n source.mediaStream.getTracks().forEach((t) => t.stop());\n source = null;\n }\n // Keep context alive if possible, or close it? React component closes it.\n // We can keep it for reuse or close. Let's keep it simple.\n };\n\n // Create header\n const createHeader = (): HTMLDivElement => {\n const header = document.createElement(\"div\");\n header.setAttribute(\"part\", \"header\");\n header.style.cssText = `\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px;\n border-bottom: 1px solid ${aeroTheme.colors.neutral[200]};\n background: var(--convai-panel-bg, white);\n position: relative;\n `;\n\n // Close button on the left\n const closeButton = document.createElement(\"button\");\n const chevronIcon = Icons.ChevronDown(\"md\");\n closeButton.appendChild(chevronIcon);\n closeButton.style.cssText = `\n font-size: 20px;\n color: ${aeroTheme.colors.text.secondary};\n cursor: pointer;\n padding: 4px;\n transition: ${aeroTheme.transitions.fast};\n background: transparent;\n border: none;\n `;\n closeButton.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n handleClose();\n });\n\n // Title section centered - matches React version\n const titleSection = document.createElement(\"div\");\n titleSection.style.cssText = `\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: ${aeroTheme.typography.fontSize.base};\n font-weight: ${aeroTheme.typography.fontWeight.semibold};\n color: var(--convai-panel-fg, ${aeroTheme.colors.text.primary});\n `;\n titleSection.id = \"convai-widget-title\";\n refs.widgetTitle = titleSection;\n\n // Settings button on the right\n const settingsButton = document.createElement(\"button\");\n const moreIcon = Icons.MoreVertical(\"md\");\n settingsButton.appendChild(moreIcon);\n settingsButton.style.cssText = `\n font-size: 24px;\n color: ${aeroTheme.colors.text.secondary};\n cursor: pointer;\n padding: 4px;\n transition: ${aeroTheme.transitions.fast};\n background: transparent;\n border: none;\n margin-left: auto;\n `;\n settingsButton.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n handleSettingsToggle();\n });\n\n header.appendChild(closeButton);\n header.appendChild(titleSection);\n header.appendChild(settingsButton);\n\n return header;\n };\n\n // Update header with character info\n const updateHeader = () => {\n const titleSection = refs.widgetTitle;\n if (!titleSection) return;\n\n titleSection.innerHTML = \"\";\n\n if (characterImage) {\n const img = document.createElement(\"img\");\n img.src = characterImage;\n img.alt = characterName;\n img.style.cssText = `\n width: 24px;\n height: 24px;\n border-radius: 50%;\n object-fit: cover;\n border: 1.5px solid ${getBotStatusColor().color};\n box-shadow: 0 0 6px ${getBotStatusColor().color}40;\n transition: all 0.3s ease;\n `;\n titleSection.appendChild(img);\n }\n\n const nameSpan = document.createElement(\"span\");\n nameSpan.textContent = characterName;\n titleSection.appendChild(nameSpan);\n\n // Mute button\n const muteButton = document.createElement(\"button\");\n muteButton.innerHTML = \"\";\n const volumeIcon = isMuted\n ? Icons.VolumeMute(\"sm\")\n : Icons.VolumeHigh(\"sm\");\n volumeIcon.style.color = isMuted ? \"#919EABA6\" : \"#0E7360\";\n muteButton.appendChild(volumeIcon);\n muteButton.style.cssText = `\n cursor: pointer;\n background: transparent;\n border: none;\n box-shadow: none;\n width: auto;\n height: auto;\n padding: 0;\n display: inline-flex;\n align-items: center;\n margin-left: 8px;\n outline: none;\n transition: transform 0.1s ease-out;\n `;\n muteButton.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n handleToggleMute();\n });\n muteButton.addEventListener(\"mouseenter\", () => {\n muteButton.style.transform = \"scale(1.1)\";\n });\n muteButton.addEventListener(\"mouseleave\", () => {\n muteButton.style.transform = \"scale(1)\";\n });\n titleSection.appendChild(muteButton);\n\n // Voice Mode Badge\n if (isVoiceMode) {\n const voiceBadge = document.createElement(\"span\");\n voiceBadge.textContent = \"VOICE\";\n voiceBadge.style.cssText = `\n font-size: 10px;\n color: var(--convai-accent, ${aeroTheme.colors.convai.light});\n font-weight: 500;\n margin-left: 8px;\n padding: 2px 6px;\n border-radius: 4px;\n background-color: ${aeroTheme.colors.convai.light}20;\n `;\n titleSection.appendChild(voiceBadge);\n }\n\n // Speaking tag (top bar, same style as React)\n if (client.state.isSpeaking) {\n const speakingTag = document.createElement(\"span\");\n speakingTag.textContent = \"SPEAKING\";\n speakingTag.style.cssText = `\n font-size: 10px;\n color: #10b981;\n font-weight: 600;\n margin-left: 8px;\n padding: 3px 8px;\n border-radius: 6px;\n background-color: #10b98120;\n border: 1px solid #10b98140;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n `;\n const dot = document.createElement(\"span\");\n dot.style.cssText = `\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: #10b981;\n display: inline-block;\n `;\n speakingTag.insertBefore(dot, speakingTag.firstChild);\n titleSection.appendChild(speakingTag);\n }\n\n // Listening tag (top bar, when user is speaking)\n if (client.state.isListening && !client.state.isSpeaking) {\n const listeningTag = document.createElement(\"span\");\n listeningTag.textContent = \"LISTENING\";\n listeningTag.style.cssText = `\n font-size: 10px;\n color: #3b82f6;\n font-weight: 600;\n margin-left: 8px;\n padding: 3px 8px;\n border-radius: 6px;\n background-color: #3b82f620;\n border: 1px solid #3b82f640;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n `;\n const dot = document.createElement(\"span\");\n dot.style.cssText = `\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: #3b82f6;\n display: inline-block;\n `;\n listeningTag.insertBefore(dot, listeningTag.firstChild);\n titleSection.appendChild(listeningTag);\n }\n\n // Every call site that refreshes the header (stateChange, botReady,\n // connect/disconnect via stateChange, character-info fetch, ...) also\n // needs the connecting overlay re-evaluated -- it depends on the same\n // `isConnected`/`isBotReady`/`characterName` inputs.\n updateConnectingOverlay();\n updateVoiceModeAvatar();\n };\n\n // Create message list\n const createMessageList = (): HTMLDivElement => {\n const list = document.createElement(\"div\");\n list.id = \"convai-message-list\";\n list.setAttribute(\"part\", \"messages\");\n list.style.cssText = `\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-height: 100%;\n `;\n return list;\n };\n\n // Create footer\n const createFooter = (): HTMLDivElement => {\n const footer = document.createElement(\"div\");\n footer.style.cssText = `\n padding: 16px;\n border-top: 1px solid ${aeroTheme.colors.neutral[200]};\n background: var(--convai-panel-bg, white);\n display: flex;\n gap: 8px;\n align-items: center;\n position: relative;\n `;\n\n // Voice Mode Exit Button (Initially hidden)\n const voiceExitButton = document.createElement(\"button\");\n voiceExitButton.id = \"convai-voice-exit-btn\";\n refs.voiceExitBtn = voiceExitButton;\n const exitIcon = Icons.PhoneOff(\"md\");\n voiceExitButton.appendChild(exitIcon);\n voiceExitButton.style.cssText = `\n width: 36px;\n height: 36px;\n border-radius: 50%;\n background: ${aeroTheme.colors.error[500]};\n color: white;\n display: none; /* Hidden by default */\n align-items: center;\n justify-content: center;\n cursor: pointer;\n margin: 0 auto;\n border: none;\n `;\n voiceExitButton.addEventListener(\"click\", () => {\n // Deliberately a *sync* listener. It used to be `async` with a bare\n // `await client.audioControls.muteAudio()` and no try/catch: on the\n // LiveKit path that call rethrows when the room has dropped, so a\n // network blip mid-call plus a tap on exit leaked an unhandled\n // rejection onto the host page *and* skipped the two lines below,\n // stranding the user in the voice overlay with no way out.\n //\n // The mute is not dropped -- `applyVoiceMode()` -> `updateVoiceMode()`\n // performs it (conditionally, if the mic is live) inside the exit\n // branch, where a failure is now reported rather than fatal. Exiting\n // the UI is unconditional either way: the overlay must never outlive\n // the user's decision to leave it.\n client.sendInterruptMessage();\n isVoiceMode = false;\n applyVoiceMode();\n });\n footer.appendChild(voiceExitButton);\n\n // Standard Footer Content (Mic + Input)\n const standardContent = document.createElement(\"div\");\n standardContent.id = \"convai-footer-standard\";\n refs.footerStandard = standardContent;\n standardContent.style.cssText = `\n display: flex;\n gap: 8px;\n align-items: center;\n width: 100%;\n `;\n\n // Input container (microphone button removed from text mode)\n const inputContainer = document.createElement(\"div\");\n inputContainer.style.cssText = `\n flex: 1;\n position: relative;\n display: flex;\n align-items: center;\n `;\n\n inputElement = document.createElement(\"input\");\n inputElement.setAttribute(\"part\", \"input\");\n inputElement.type = \"text\";\n inputElement.placeholder = \"Conversation\";\n inputElement.style.cssText = `\n width: 100%;\n padding: 12px 44px 12px 16px;\n border-radius: ${aeroTheme.borderRadius.full};\n border: 1px solid ${aeroTheme.colors.neutral[300]};\n background: ${aeroTheme.colors.glass.medium};\n color: var(--convai-panel-fg, ${aeroTheme.colors.text.primary});\n font-size: ${aeroTheme.typography.fontSize.sm};\n transition: ${aeroTheme.transitions.fast};\n outline: none;\n `;\n inputElement.addEventListener(\"input\", (e) => {\n inputValue = (e.target as HTMLInputElement).value;\n updateSendButton();\n });\n inputElement.addEventListener(\"keypress\", (e) => {\n if (e.key === \"Enter\") handleSend();\n });\n\n // Send button\n const sendButton = document.createElement(\"button\");\n sendButton.id = \"convai-send-button\";\n // This button is dual-role -- it sends text when the input has a draft,\n // and toggles voice mode when empty -- but there is no separate mic\n // element, so only the send-button part applies. `mic-button` is\n // reserved for a future version that splits the two; see parts.test.ts.\n sendButton.setAttribute(\"part\", \"send-button\");\n refs.sendButton = sendButton;\n const sendIcon = Icons.Send(\"md\");\n sendButton.appendChild(sendIcon);\n sendButton.style.cssText = `\n position: absolute;\n right: 6px;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n background: transparent; /* Initial transparent for voice toggle */\n color: var(--convai-panel-fg, ${aeroTheme.colors.text.primary});\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: ${aeroTheme.transitions.fast};\n border: none;\n `;\n sendButton.addEventListener(\"click\", async () => {\n if (inputValue.length > 0) {\n handleSend();\n } else {\n // Toggle Voice Mode\n client.sendInterruptMessage();\n try {\n await client.audioControls.unmuteAudio(); // Unmute on enter\n isVoiceMode = true;\n // Awaited so this try/catch actually covers it -- bare, the promise\n // escaped the block it looks like it belongs to.\n await updateVoiceMode();\n } catch (error) {\n // isVoiceMode is only flipped after a successful unmute, so a\n // denial here leaves the widget in text mode, not stranded\n // mid-transition into voice mode.\n reportMicFailure(client, \"Failed to enable microphone:\", error);\n }\n }\n });\n\n inputContainer.appendChild(inputElement);\n inputContainer.appendChild(sendButton);\n standardContent.appendChild(inputContainer);\n footer.appendChild(standardContent);\n\n return footer;\n };\n\n // Create settings tray - Matches React SettingsTray component exactly\n const createSettingsTray = (): HTMLDivElement => {\n const tray = document.createElement(\"div\");\n tray.setAttribute(\"data-settings-tray\", \"true\");\n tray.style.cssText = `\n position: absolute;\n top: 60px;\n right: 16px;\n background: var(--convai-panel-bg, white);\n border-radius: ${aeroTheme.borderRadius.xl};\n box-shadow: ${aeroTheme.shadows.xl};\n padding: 0;\n display: none;\n flex-direction: row;\n align-items: center;\n gap: 0;\n z-index: 9999;\n min-width: auto;\n transform-origin: top right;\n animation: popIn 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n overflow: hidden;\n `;\n\n // Add animation keyframes if not present\n injectKeyframes(styleTarget);\n\n // Horizontal Settings Row Container\n const settingsRow = document.createElement(\"div\");\n settingsRow.style.cssText = `\n display: flex;\n flex-direction: row;\n align-items: center;\n padding: 8px;\n gap: 4px;\n `;\n\n const createOption = (\n icon: HTMLElement | SVGSVGElement,\n label: string,\n onClick: () => void,\n isActive: boolean = false,\n isDestructive: boolean = false,\n ) => {\n const btn = document.createElement(\"div\");\n btn.style.cssText = `\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n padding: 8px 12px;\n cursor: pointer;\n border-radius: ${aeroTheme.borderRadius.md};\n background-color: ${\n isActive\n ? \"rgba(16, 185, 129, 0.15)\"\n : isDestructive\n ? \"rgba(239, 68, 68, 0.1)\"\n : \"transparent\"\n };\n color: ${\n isActive\n ? \"#10b981\"\n : isDestructive\n ? \"#ef4444\"\n : `var(--convai-panel-fg, ${aeroTheme.colors.text.primary})`\n };\n transition: ${aeroTheme.transitions.fast};\n min-width: 50px;\n `;\n\n // Icon container\n const iconContainer = document.createElement(\"div\");\n iconContainer.appendChild(icon);\n btn.appendChild(iconContainer);\n\n const span = document.createElement(\"span\");\n span.textContent = label;\n span.style.cssText = `\n font-size: 10px;\n font-weight: 500;\n `;\n btn.appendChild(span);\n\n btn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n onClick();\n });\n\n btn.addEventListener(\"mouseover\", () => {\n btn.style.transform = \"scale(1.02)\";\n if (!isActive && !isDestructive) {\n btn.style.backgroundColor = aeroTheme.colors.neutral[100];\n }\n });\n btn.addEventListener(\"mouseout\", () => {\n btn.style.transform = \"scale(1)\";\n btn.style.backgroundColor = isActive\n ? \"rgba(16, 185, 129, 0.15)\"\n : isDestructive\n ? \"rgba(239, 68, 68, 0.1)\"\n : \"transparent\";\n });\n\n return btn;\n };\n\n // Reset\n const resetIcon = Icons.Redo(\"md\");\n resetIcon.style.width = \"18px\";\n resetIcon.style.height = \"18px\";\n settingsRow.appendChild(createOption(resetIcon, \"Reset\", handleReset));\n\n // Video - only show if connection type is video\n const connectionType = client.connectionType;\n if (connectionType === \"video\" && showVideo) {\n const videoIcon = isVideoVisible\n ? Icons.Video(\"md\")\n : Icons.VideoOff(\"md\");\n videoIcon.style.width = \"18px\";\n videoIcon.style.height = \"18px\";\n const videoBtn = createOption(\n videoIcon,\n \"Video\",\n handleToggleVideo,\n isVideoVisible,\n );\n videoBtn.id = \"convai-settings-video-btn\";\n refs.settingsVideoBtn = videoBtn;\n settingsRow.appendChild(videoBtn);\n }\n\n // Screen Share - only show if connection type is video\n if (connectionType === \"video\" && showScreenShare) {\n const isSharing = client.screenShareControls.isScreenShareActive;\n const shareIcon = isSharing\n ? Icons.StopScreenShare(\"md\")\n : Icons.ScreenShare(\"md\");\n shareIcon.style.width = \"18px\";\n shareIcon.style.height = \"18px\";\n const shareBtn = createOption(\n shareIcon,\n \"Screen\",\n handleToggleScreenShare,\n isSharing,\n );\n shareBtn.id = \"convai-settings-share-btn\";\n refs.settingsShareBtn = shareBtn;\n settingsRow.appendChild(shareBtn);\n }\n\n // Disconnect\n const disconnectIcon = document.createElement(\"span\");\n disconnectIcon.innerHTML = \"⏻\";\n disconnectIcon.style.fontSize = \"18px\";\n settingsRow.appendChild(\n createOption(disconnectIcon, \"Disconnect\", handleDisconnect, false, true),\n );\n\n tray.appendChild(settingsRow);\n return tray;\n };\n\n // Update settings tray content to reflect current connection state\n const updateSettingsTray = () => {\n const settingsRow = settingsTray.querySelector(\"div\");\n if (!settingsRow) return;\n\n // Clear existing content\n settingsRow.innerHTML = \"\";\n\n const createOption = (\n icon: HTMLElement | SVGSVGElement,\n label: string,\n onClick: () => void,\n isActive: boolean = false,\n isDestructive: boolean = false,\n ) => {\n const btn = document.createElement(\"div\");\n btn.style.cssText = `\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n padding: 8px 12px;\n cursor: pointer;\n border-radius: ${aeroTheme.borderRadius.md};\n background-color: ${\n isActive\n ? \"rgba(16, 185, 129, 0.15)\"\n : isDestructive\n ? \"rgba(239, 68, 68, 0.1)\"\n : \"transparent\"\n };\n color: ${\n isActive\n ? \"#10b981\"\n : isDestructive\n ? \"#ef4444\"\n : `var(--convai-panel-fg, ${aeroTheme.colors.text.primary})`\n };\n transition: ${aeroTheme.transitions.fast};\n min-width: 50px;\n `;\n\n // Icon container\n const iconContainer = document.createElement(\"div\");\n iconContainer.appendChild(icon);\n btn.appendChild(iconContainer);\n\n const span = document.createElement(\"span\");\n span.textContent = label;\n span.style.cssText = `\n font-size: 10px;\n font-weight: 500;\n `;\n btn.appendChild(span);\n\n btn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n onClick();\n });\n\n btn.addEventListener(\"mouseover\", () => {\n btn.style.transform = \"scale(1.02)\";\n if (!isActive && !isDestructive) {\n btn.style.backgroundColor = aeroTheme.colors.neutral[100];\n }\n });\n btn.addEventListener(\"mouseout\", () => {\n btn.style.transform = \"scale(1)\";\n btn.style.backgroundColor = isActive\n ? \"rgba(16, 185, 129, 0.15)\"\n : isDestructive\n ? \"rgba(239, 68, 68, 0.1)\"\n : \"transparent\";\n });\n\n return btn;\n };\n\n // Reset\n const resetIcon = Icons.Redo(\"md\");\n resetIcon.style.width = \"18px\";\n resetIcon.style.height = \"18px\";\n settingsRow.appendChild(createOption(resetIcon, \"Reset\", handleReset));\n\n // Video - Always show if showVideo is true and connection type is video\n const connectionType = client.connectionType;\n if (connectionType === \"video\" && showVideo) {\n const videoIcon = isVideoVisible\n ? Icons.Video(\"md\")\n : Icons.VideoOff(\"md\");\n videoIcon.style.width = \"18px\";\n videoIcon.style.height = \"18px\";\n const videoBtn = createOption(\n videoIcon,\n \"Video\",\n handleToggleVideo,\n isVideoVisible,\n );\n videoBtn.id = \"convai-settings-video-btn\";\n refs.settingsVideoBtn = videoBtn;\n settingsRow.appendChild(videoBtn);\n }\n\n // Screen Share - Always show if showScreenShare is true and connection type is video\n if (connectionType === \"video\" && showScreenShare) {\n const isSharing = client.screenShareControls.isScreenShareActive;\n const shareIcon = isSharing\n ? Icons.StopScreenShare(\"md\")\n : Icons.ScreenShare(\"md\");\n shareIcon.style.width = \"18px\";\n shareIcon.style.height = \"18px\";\n const shareBtn = createOption(\n shareIcon,\n \"Screen\",\n handleToggleScreenShare,\n isSharing,\n );\n shareBtn.id = \"convai-settings-share-btn\";\n refs.settingsShareBtn = shareBtn;\n settingsRow.appendChild(shareBtn);\n }\n\n // Disconnect\n const disconnectIcon = document.createElement(\"span\");\n disconnectIcon.innerHTML = \"⏻\";\n disconnectIcon.style.fontSize = \"18px\";\n settingsRow.appendChild(\n createOption(disconnectIcon, \"Disconnect\", handleDisconnect, false, true),\n );\n };\n\n // Create floating video - Matches React FloatingVideo component\n const createFloatingVideo = (): HTMLDivElement => {\n const container = document.createElement(\"div\");\n container.id = \"floating-video-container\";\n // NOTE on z-index: deliberately NOT themable. `--convai-z-index` drives the\n // widget root only. Both elements are `position: fixed` and this one is\n // appended *before* the widget root, so on a tie the widget paints on top:\n // a host raising the token to clear their nav bar would hide the user's own\n // camera preview behind the panel. Video/screen share are also out of scope\n // for the embed, which is chat-only.\n container.style.cssText = `\n position: fixed;\n left: 20px;\n top: 20px;\n z-index: 10000;\n width: 320px;\n border-radius: ${aeroTheme.borderRadius.lg};\n overflow: hidden;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);\n cursor: grab;\n display: none;\n transition: opacity 0.4s cubic-bezier(0.4, 0, 0.2, 1), transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n `;\n\n const wrapper = document.createElement(\"div\");\n wrapper.style.cssText = `\n background: rgba(15, 23, 42, 0.95);\n backdrop-filter: blur(20px);\n border: 1px solid ${aeroTheme.colors.neutral[700]};\n border-radius: ${aeroTheme.borderRadius.lg};\n overflow: hidden;\n `;\n\n // Header\n const header = document.createElement(\"div\");\n header.style.cssText = `\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: rgba(0, 0, 0, 0.3);\n border-bottom: 1px solid ${aeroTheme.colors.neutral[700]};\n `;\n\n const headerLeft = document.createElement(\"div\");\n headerLeft.style.cssText = `\n display: flex;\n align-items: center;\n gap: 8px;\n color: ${aeroTheme.colors.neutral[300]};\n font-size: 12px;\n font-weight: 500;\n `;\n\n const dragIcon = Icons.DragIndicator(\"sm\");\n dragIcon.style.width = \"16px\";\n dragIcon.style.height = \"16px\";\n headerLeft.appendChild(dragIcon);\n\n const label = document.createElement(\"span\");\n label.textContent = \"Your Camera\";\n headerLeft.appendChild(label);\n\n const closeButton = document.createElement(\"button\");\n closeButton.innerHTML = \"\";\n const closeIcon = Icons.Close(\"md\");\n closeIcon.style.width = \"20px\";\n closeIcon.style.height = \"20px\";\n closeButton.appendChild(closeIcon);\n closeButton.style.cssText = `\n background: transparent;\n border: none;\n color: ${aeroTheme.colors.neutral[400]};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 4px;\n transition: transform 0.1s ease-out;\n `;\n closeButton.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n client.videoControls.disableVideo();\n });\n closeButton.addEventListener(\"mouseenter\", () => {\n closeButton.style.transform = \"scale(1.1)\";\n });\n closeButton.addEventListener(\"mouseleave\", () => {\n closeButton.style.transform = \"scale(1)\";\n });\n\n header.appendChild(headerLeft);\n header.appendChild(closeButton);\n\n // Video Container\n const videoContainer = document.createElement(\"div\");\n videoContainer.style.cssText = `\n position: relative;\n width: 100%;\n padding-bottom: 75%;\n background: #000;\n `;\n\n const videoWrapper = document.createElement(\"div\");\n videoWrapper.id = \"floating-video-wrapper\";\n videoWrapper.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n `;\n\n const videoElement = document.createElement(\"video\");\n videoElement.id = \"floating-video-element\";\n videoElement.autoplay = true;\n videoElement.playsInline = true;\n videoElement.muted = true;\n videoElement.style.cssText = `\n width: 100%;\n height: 100%;\n object-fit: cover;\n transform: scaleX(-1);\n `;\n\n // Camera off placeholder\n const cameraOffPlaceholder = document.createElement(\"div\");\n cameraOffPlaceholder.id = \"camera-off-placeholder\";\n cameraOffPlaceholder.style.cssText = `\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: ${aeroTheme.colors.neutral[400]};\n gap: 12px;\n background: #000;\n `;\n const cameraOffIcon = Icons.VideoOff(\"lg\");\n cameraOffIcon.style.width = \"48px\";\n cameraOffIcon.style.height = \"48px\";\n cameraOffPlaceholder.appendChild(cameraOffIcon);\n const cameraOffText = document.createElement(\"span\");\n cameraOffText.textContent = \"Camera is off\";\n cameraOffText.style.cssText = `\n font-size: 14px;\n text-align: center;\n `;\n cameraOffPlaceholder.appendChild(cameraOffText);\n\n videoWrapper.appendChild(videoElement);\n videoWrapper.appendChild(cameraOffPlaceholder);\n videoContainer.appendChild(videoWrapper);\n\n wrapper.appendChild(header);\n wrapper.appendChild(videoContainer);\n container.appendChild(wrapper);\n\n // Add drag functionality\n let isDragging = false;\n let startX = 0;\n let startY = 0;\n let startLeft = 20;\n let startTop = 20;\n\n const handleMouseDown = (e: MouseEvent) => {\n if ((e.target as HTMLElement).closest(\"button\")) return;\n isDragging = true;\n startX = e.clientX;\n startY = e.clientY;\n const style = window.getComputedStyle(container);\n startLeft = parseInt(style.left);\n startTop = parseInt(style.top);\n container.style.cursor = \"grabbing\";\n e.preventDefault();\n };\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!isDragging) return;\n const deltaX = e.clientX - startX;\n const deltaY = e.clientY - startY;\n const newLeft = startLeft + deltaX;\n const newTop = startTop + deltaY;\n\n // Keep within bounds\n const maxX = window.innerWidth - 320;\n const maxY = window.innerHeight - 240;\n const boundedLeft = Math.max(0, Math.min(newLeft, maxX));\n const boundedTop = Math.max(0, Math.min(newTop, maxY));\n\n container.style.left = `${boundedLeft}px`;\n container.style.top = `${boundedTop}px`;\n };\n\n const handleMouseUp = () => {\n if (isDragging) {\n isDragging = false;\n container.style.cursor = \"grab\";\n }\n };\n\n container.addEventListener(\"mousedown\", handleMouseDown);\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n\n return container;\n };\n\n // Event handlers\n const handleToggle = async () => {\n if (isOpen || pendingOpen) {\n // Already open, or an open is already in flight: nothing to do. The\n // `pendingOpen` half is what keeps a repeat call from falling through\n // to the `isConnecting` branch below and opening the panel *before* the\n // connect it is waiting on has finished.\n return;\n }\n\n // Connect on first click if not already connected/connecting\n if (!client.state.isConnected && !client.state.isConnecting) {\n pendingOpen = true;\n try {\n // Use reconnect when opening again after a disconnect (reuses stored config)\n if (hasConnectedBefore && typeof client.reconnect === \"function\") {\n await client.reconnect();\n } else {\n await client.connect();\n }\n // Re-checked *after* the await: a close()/toggle()/launcher click\n // during the connect clears the flag, and that cancellation has to\n // win. The client stays connected either way -- only the panel is\n // held back -- so a later open() takes the already-connected branch\n // and opens instantly.\n if (!pendingOpen) return;\n setIsOpen(true);\n } catch (error) {\n console.error(\"Failed to connect:\", error);\n } finally {\n pendingOpen = false;\n }\n } else {\n // Just toggle open/close if already connected\n setIsOpen(!isOpen);\n }\n };\n\n /** A launcher click while an open is pending means \"cancel\", same as `toggle()`. */\n const handleLauncherClick = () => {\n if (pendingOpen) {\n handleClose();\n return;\n }\n void handleToggle();\n };\n\n const handleClose = () => {\n // Cancels an in-flight open as well as closing an open panel; see\n // `pendingOpen`. `setIsOpen(false)` on an already-closed widget just\n // re-applies the collapsed styles, so this is safe in both cases.\n pendingOpen = false;\n setIsOpen(false);\n };\n\n const handleSend = () => {\n if (inputValue.trim() && client.state.isConnected) {\n client.sendUserTextMessage(inputValue);\n inputValue = \"\";\n inputElement.value = \"\";\n updateSendButton();\n }\n };\n\n // Microphone toggle removed - only controlled via voice mode now\n\n const handleToggleMute = () => {\n isMuted = !isMuted;\n\n if (client.room) {\n const remoteParticipants = Array.from(\n client.room.remoteParticipants.values(),\n );\n remoteParticipants.forEach((participant: any) => {\n participant.audioTrackPublications.forEach((publication: any) => {\n if (publication.track) {\n publication.track.setMuted(isMuted);\n }\n });\n });\n }\n\n updateHeader();\n };\n\n const handleReset = async () => {\n setIsSettingsOpen(false);\n try {\n await client.disconnect();\n client.resetSession();\n isMuted = false;\n isVoiceMode = false;\n hasEnteredDefaultVoiceMode = false;\n updateHeader();\n await updateVoiceMode();\n updateSendButton();\n } catch (error) {\n console.error(\"Failed to reset:\", error);\n }\n };\n\n const handleDisconnect = async () => {\n setIsSettingsOpen(false);\n await client.disconnect();\n isMuted = false;\n isVoiceMode = false;\n hasEnteredDefaultVoiceMode = false;\n updateHeader();\n // Not awaited: this function has no try/catch of its own and is wired\n // straight to a click, so awaiting would only move a rejection from one\n // unguarded place to another. See the note on `handleDisconnect`'s own\n // `await client.disconnect()` in the fix report.\n applyVoiceMode();\n updateSendButton();\n };\n\n const handleToggleVideo = async () => {\n if (client.connectionType !== \"video\") return;\n\n try {\n if (isVideoVisible) {\n await client.videoControls.disableVideo();\n } else {\n await client.videoControls.enableVideo();\n }\n // State will be updated via event listener below\n } catch (e) {\n console.error(\"Failed to toggle video:\", e);\n }\n };\n\n const handleToggleScreenShare = async () => {\n try {\n await client.screenShareControls.toggleScreenShare();\n // State will be updated via event listener above\n } catch (e) {\n console.error(\"Failed to toggle screen share:\", e);\n }\n };\n\n const handleSettingsToggle = () => {\n // Regenerate settings tray content BEFORE opening to reflect current connection type\n if (!isSettingsOpen) {\n updateSettingsTray();\n }\n\n setIsSettingsOpen(!isSettingsOpen);\n };\n\n // Update functions\n const setIsOpen = async (open: boolean) => {\n isOpen = open;\n\n if (open) {\n morphingContainer.style.width = `${PANEL_W_PX}px`;\n morphingContainer.style.height = `${PANEL_H_PX}px`;\n morphingContainer.style.borderRadius = `var(--convai-radius, ${aeroTheme.borderRadius.xl})`;\n morphingContainer.style.cursor = \"default\";\n\n // The open panel is a *different* glass treatment from the launcher\n // bubble, matching the React widget: near-opaque and saturated, so the\n // host page does not bleed through. At the bubble's 0.8 alpha a dark\n // host page shows through the panel and reads as grey.\n morphingContainer.style.background =\n \"var(--convai-panel-bg, rgba(252, 252, 253, 0.95))\";\n morphingContainer.style.backdropFilter = \"blur(20px) saturate(180%)\";\n\n buttonContent.style.opacity = \"0\";\n buttonContent.style.transform = \"scale(0.8)\";\n buttonContent.style.pointerEvents = \"none\";\n\n chatContent.style.opacity = \"1\";\n chatContent.style.transform = \"scale(1)\";\n chatContent.style.pointerEvents = \"auto\";\n\n // Auto-enter voice mode if defaultVoiceMode is true and not already entered\n if (\n defaultVoiceMode &&\n !hasEnteredDefaultVoiceMode &&\n client.state.isConnected\n ) {\n setTimeout(async () => {\n try {\n await client.audioControls.unmuteAudio();\n isVoiceMode = true;\n hasEnteredDefaultVoiceMode = true;\n await updateVoiceMode();\n } catch (error) {\n reportMicFailure(client, \"Failed to enter voice mode on open:\", error);\n }\n }, 100);\n }\n } else {\n morphingContainer.style.width = \"var(--convai-launcher-size, 64px)\";\n morphingContainer.style.height = \"var(--convai-launcher-size, 64px)\";\n // Literal, not `--convai-radius` — see the creation site: that token is\n // the *panel* radius, and reusing it here would squircle the launcher.\n morphingContainer.style.borderRadius = \"50%\";\n morphingContainer.style.cursor = \"pointer\";\n\n // Back to the launcher bubble's lighter glass — see the open branch.\n morphingContainer.style.background = `var(--convai-panel-bg, ${aeroTheme.colors.glass.backdrop})`;\n morphingContainer.style.backdropFilter = aeroTheme.glass.backdrop;\n\n buttonContent.style.opacity = \"1\";\n buttonContent.style.transform = \"scale(1)\";\n buttonContent.style.pointerEvents = \"auto\";\n\n chatContent.style.opacity = \"0\";\n chatContent.style.transform = \"scale(0.8)\";\n chatContent.style.pointerEvents = \"none\";\n }\n };\n\n const setIsSettingsOpen = (open: boolean) => {\n isSettingsOpen = open;\n settingsTray.style.display = open ? \"flex\" : \"none\";\n };\n\n const updateSendButton = () => {\n const sendButton = refs.sendButton;\n if (!sendButton) return;\n\n // Clear previous content\n sendButton.innerHTML = \"\";\n\n if (inputValue.length > 0) {\n // Show Send Button\n sendButton.appendChild(Icons.Send(\"md\"));\n sendButton.style.background = `var(--convai-accent, ${aeroTheme.colors.text.primary})`;\n // The label sits *on* the accent fill, so it must follow the panel\n // surface colour rather than stay a hardcoded \"white\" -- a host setting\n // a pale --convai-accent would otherwise get white-on-white. `white` is\n // byte-identical to the fallback --convai-panel-bg already carries at\n // its three other sites, so the default rendering is unchanged.\n // Pairing requirement for hosts: --convai-accent and --convai-panel-bg\n // must contrast with each other, since this is the one place they meet.\n sendButton.style.color = \"var(--convai-panel-bg, white)\";\n sendButton.style.border = \"none\";\n sendButton.title = \"Send\";\n } else {\n // Show Voice Mode Toggle\n sendButton.appendChild(Icons.Waveform(\"md\"));\n sendButton.style.background = \"transparent\";\n sendButton.style.color = `var(--convai-panel-fg, ${aeroTheme.colors.text.primary})`;\n sendButton.style.border = `1px solid ${aeroTheme.colors.neutral[300]}`;\n sendButton.title = \"Voice Mode\";\n }\n };\n\n const updateVideoTrack = () => {\n if (!floatingVideo || !client.room || !client.room.localParticipant) return;\n\n const videoEl = floatingVideo.querySelector(\n \"#floating-video-element\",\n ) as HTMLVideoElement;\n const placeholder = floatingVideo.querySelector(\n \"#camera-off-placeholder\",\n ) as HTMLElement;\n\n if (!videoEl || !placeholder) return;\n\n if (isVideoVisible && !isVoiceMode) {\n const tracks = Array.from(\n client.room.localParticipant.videoTrackPublications.values(),\n );\n const videoPub = tracks.find((t: any) => t.kind === \"video\");\n\n if (videoPub && videoPub.track) {\n videoPub.track.attach(videoEl);\n videoEl.style.display = \"block\";\n placeholder.style.display = \"none\";\n } else {\n videoEl.style.display = \"none\";\n placeholder.style.display = \"flex\";\n }\n } else {\n videoEl.style.display = \"none\";\n placeholder.style.display = \"flex\";\n }\n };\n\n const updateVoiceMode = async () => {\n const standardFooter = refs.footerStandard;\n const voiceExitBtn = refs.voiceExitBtn;\n\n if (isVoiceMode) {\n // Show Voice Overlay\n if (voiceModeOverlay) voiceModeOverlay.style.display = \"flex\";\n if (messageListElement) messageListElement.style.display = \"none\";\n if (floatingVideo) floatingVideo.style.display = \"none\";\n\n // Footer: Show Exit Button, Hide Standard\n if (standardFooter) standardFooter.style.display = \"none\";\n if (voiceExitBtn) voiceExitBtn.style.display = \"flex\";\n if (footerElement) footerElement.style.justifyContent = \"center\";\n\n // Update header to show VOICE badge\n updateHeader();\n\n // Reset animation state for voice mode\n startTime = Date.now();\n\n // Start Audio Analysis\n startAudioAnalysis();\n } else {\n // Ensure microphone is muted when not in voice mode.\n //\n // This await is the only one in this function that can reject, and\n // everything below it -- hiding the overlay, restoring the standard\n // footer, updating the header, stopping the analyser -- is the only\n // route out of the voice UI. So a failed mute must never short-circuit\n // it: report it and carry on tearing the overlay down. (LiveKit's\n // setMicrophoneEnabled(false) rethrows on a dropped room, which is\n // exactly when the user is most likely to be hitting exit.)\n if (!client.audioControls.isAudioMuted) {\n try {\n await client.audioControls.muteAudio();\n } catch (error) {\n reportMicFailure(client, \"Failed to mute microphone:\", error);\n }\n }\n\n // Hide Overlay\n if (voiceModeOverlay) voiceModeOverlay.style.display = \"none\";\n\n // Show Video or Message List\n if (isVideoVisible) {\n if (messageListElement) messageListElement.style.display = \"none\";\n if (floatingVideo) floatingVideo.style.display = \"block\";\n updateVideoTrack();\n } else {\n if (messageListElement) messageListElement.style.display = \"flex\";\n if (floatingVideo) floatingVideo.style.display = \"none\";\n }\n\n // Footer: Show Standard, Hide Exit\n if (standardFooter) standardFooter.style.display = \"flex\";\n if (voiceExitBtn) voiceExitBtn.style.display = \"none\";\n if (footerElement) footerElement.style.justifyContent = \"flex-start\";\n\n // Update header to hide VOICE badge\n updateHeader();\n\n // Stop Audio Analysis\n stopAudioAnalysis();\n }\n };\n\n /**\n * Fire-and-forget `updateVoiceMode()` for the call sites that are\n * synchronous (DOM listeners, the constructor tail) and therefore have no\n * caller to catch anything it rejects with.\n *\n * `updateVoiceMode()` is `async`, so a bare call there would put a floating\n * promise on the host page. Its one rejecting await is now guarded\n * internally, which makes this belt-and-braces -- but it is the guarantee\n * that keeps a future await added inside `updateVoiceMode()` from silently\n * reintroducing the unhandled rejection this replaces. Routed through\n * `reportMicFailure` so a failure is observable on the client's `error`\n * channel rather than console-only.\n */\n const applyVoiceMode = (): void => {\n void updateVoiceMode().catch((error) => {\n reportMicFailure(client, \"Failed to apply voice mode:\", error);\n });\n };\n\n // Microphone button removed - only controlled via voice mode now\n\n // Helper for Markdown - matches React MarkdownRenderer.tsx\n const renderMarkdown = (text: string, container: HTMLElement) => {\n if (!text) return;\n\n // Handle both actual newlines and \\n escape sequences\n const normalizedText = text.replace(/\\\\n/g, \"\\n\");\n const lines = normalizedText.split(\"\\n\");\n\n lines.forEach((line, lineIndex) => {\n // Process markdown within each line\n const processLine = (text: string): (HTMLElement | Text)[] => {\n const parts: (HTMLElement | Text)[] = [];\n let remaining = text;\n\n // Process bold and italic markdown\n // Bold: **text** or __text__\n // Italic: *text* or _text_\n const markdownRegex = /(\\*\\*|__)(.*?)\\1|\\*([^*]+)\\*|_([^_]+)_/g;\n let lastIndex = 0;\n let match;\n\n while ((match = markdownRegex.exec(remaining)) !== null) {\n // Add text before the match\n if (match.index > lastIndex) {\n const textBefore = remaining.substring(lastIndex, match.index);\n if (textBefore) {\n parts.push(document.createTextNode(textBefore));\n }\n }\n\n // Determine if it's bold or italic\n if (match[1] && match[2]) {\n // Bold text (** or __) - matches React UserBubble styling\n const strong = document.createElement(\"strong\");\n strong.textContent = match[2];\n strong.style.cssText = `\n font-weight: 600;\n color: var(--convai-panel-fg, ${aeroTheme.colors.text.primary});\n `;\n parts.push(strong);\n } else if (match[3]) {\n // Italic text (*) - matches React UserBubble styling\n const em = document.createElement(\"em\");\n em.textContent = match[3];\n em.style.cssText = `\n font-style: italic;\n `;\n parts.push(em);\n } else if (match[4]) {\n // Italic text (_) - matches React UserBubble styling\n const em = document.createElement(\"em\");\n em.textContent = match[4];\n em.style.cssText = `\n font-style: italic;\n `;\n parts.push(em);\n }\n\n lastIndex = match.index + match[0].length;\n }\n\n // Add remaining text\n if (lastIndex < remaining.length) {\n const textAfter = remaining.substring(lastIndex);\n if (textAfter) {\n parts.push(document.createTextNode(textAfter));\n }\n }\n\n return parts;\n };\n\n const processedLine = processLine(line);\n\n // Handle empty lines (creates paragraph spacing)\n if (line.trim() === \"\" && lineIndex > 0) {\n container.appendChild(document.createElement(\"br\"));\n return;\n }\n\n // Append the processed line\n if (processedLine.length > 0) {\n processedLine.forEach((part) => container.appendChild(part));\n } else {\n container.appendChild(document.createTextNode(line));\n }\n\n // Add line break between lines\n if (lineIndex < lines.length - 1) {\n container.appendChild(document.createElement(\"br\"));\n }\n });\n };\n\n const updateMessageList = () => {\n if (!messageListElement) return;\n\n const messages = formatMessages();\n messageListElement.innerHTML = \"\";\n\n if (messages.length === 0) {\n const emptyState = document.createElement(\"div\");\n emptyState.style.cssText = `\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: ${aeroTheme.colors.text.secondary};\n text-align: center;\n padding: 32px;\n `;\n emptyState.innerHTML = `\n <p style=\"font-weight: 500; margin-bottom: 8px;\">Start a conversation</p>\n <p style=\"font-size: 12px;\">Type a message below to begin chatting</p>\n `;\n messageListElement.appendChild(emptyState);\n return;\n }\n\n messages.forEach((msg) => {\n // MessageWrapper - matches React UserMessageContainer\n const messageWrapper = document.createElement(\"div\");\n messageWrapper.style.cssText = `\n display: flex;\n flex-direction: column;\n max-width: ${msg.isUser ? \"70%\" : \"70%\"};\n margin-left: ${msg.isUser ? \"auto\" : \"0\"};\n width: 100%;\n isolation: isolate;\n contain: layout style paint;\n `;\n\n const bubble = document.createElement(\"div\");\n bubble.setAttribute(\"part\", msg.isUser ? \"message message-user\" : \"message message-bot\");\n // Add data attribute to identify user messages for debugging/styling\n if (msg.isUser) {\n bubble.setAttribute(\"data-message-type\", \"user\");\n }\n\n // Set base styles first - explicitly set background to match React UserBubble exactly\n // CRITICAL: Use the exact same background for both user and bot messages\n const backgroundColor = \"rgba(252, 252, 253, 0.95)\";\n // NOTE on border-radius: deliberately NOT themable. `--convai-radius` is\n // the open panel's radius; a bubble's asymmetric tail corner is a\n // different geometry (`50%` would make ellipses of these). A dedicated\n // `--convai-bubble-radius` can be added additively later if wanted.\n bubble.style.cssText = `\n padding: 12px;\n border-radius: ${msg.isUser ? \"12px 12px 4px 12px\" : \"12px 12px 12px 4px\"};\n background: ${backgroundColor};\n background-color: ${backgroundColor};\n backdrop-filter: blur(20px) saturate(180%);\n border: 1px solid rgba(0, 0, 0, 0.06);\n box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.8) inset, 0 2px 8px rgba(0, 0, 0, 0.08);\n color: var(--convai-panel-fg, ${aeroTheme.colors.text.primary});\n font-family: var(--convai-font, ${aeroTheme.typography.fontFamily.body});\n font-size: 14px;\n line-height: 1.5;\n word-wrap: break-word;\n max-width: 100%;\n display: flex;\n flex-direction: column;\n font-synthesis: none;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n -webkit-text-size-adjust: 100%;\n isolation: isolate;\n contain: layout style paint;\n `;\n // Set background with !important to override any other styles (this is critical)\n bubble.style.setProperty(\"background\", backgroundColor, \"important\");\n bubble.style.setProperty(\n \"background-color\",\n backgroundColor,\n \"important\",\n );\n\n // Header (Logo/Icon + Name) inside bubble - matches React MessageHeader\n if (msg.sender) {\n const header = document.createElement(\"div\");\n header.style.cssText = `\n display: flex;\n align-items: center;\n gap: ${aeroTheme.spacing.xs};\n margin-bottom: ${aeroTheme.spacing.xs};\n isolation: isolate;\n contain: layout style paint;\n `;\n\n // Logo/Icon - matches React LogoWrapper\n const logoContainer = document.createElement(\"div\");\n logoContainer.style.cssText = `\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n isolation: isolate;\n contain: layout style paint;\n `;\n\n if (msg.isUser) {\n // User Icon - FaUser from react-icons/fa, matches React exactly\n const userIcon = Icons.User(\"sm\");\n userIcon.style.width = \"16px\";\n userIcon.style.height = \"16px\";\n userIcon.style.color = aeroTheme.colors.convai.dark;\n logoContainer.appendChild(userIcon);\n } else {\n // Bot Logo - ConvaiLogo sm size with connected state\n const botLogo = Icons.ConvaiLogo(\"sm\", \"connected\");\n botLogo.style.width = \"16px\";\n botLogo.style.height = \"16px\";\n botLogo.style.color = \"#10b981\";\n logoContainer.appendChild(botLogo);\n }\n\n // Name Label - matches React UserLabel exactly\n const nameLabel = document.createElement(\"span\");\n nameLabel.textContent = msg.sender === \"User\" ? \"You\" : msg.sender;\n nameLabel.style.cssText = `\n font-size: 12px;\n color: ${msg.isUser ? aeroTheme.colors.convai.dark : \"#10b981\"};\n font-weight: 500;\n font-family: var(--convai-font, ${aeroTheme.typography.fontFamily.body});\n isolation: isolate;\n contain: layout style paint;\n `;\n\n header.appendChild(logoContainer);\n header.appendChild(nameLabel);\n bubble.appendChild(header);\n }\n\n // Message Content\n const contentDiv = document.createElement(\"div\");\n contentDiv.style.cssText = `\n white-space: pre-wrap;\n word-wrap: break-word;\n `;\n renderMarkdown(msg.text, contentDiv);\n bubble.appendChild(contentDiv);\n\n messageWrapper.appendChild(bubble);\n\n // Timestamp - matches React exactly\n if (msg.timestamp) {\n const timestamp = document.createElement(\"span\");\n timestamp.textContent = msg.timestamp;\n timestamp.style.cssText = `\n font-size: 12px;\n color: ${aeroTheme.colors.text.secondary};\n margin-top: 4px;\n align-self: ${msg.isUser ? \"flex-end\" : \"flex-start\"};\n font-family: var(--convai-font, ${aeroTheme.typography.fontFamily.body});\n `;\n messageWrapper.appendChild(timestamp);\n }\n\n messageListElement.appendChild(messageWrapper);\n });\n\n // Scroll to bottom\n messageListElement.scrollTop = messageListElement.scrollHeight;\n };\n\n const getBotStatusColor = () => {\n if (!client.state.isConnected) {\n return { color: \"#ef4444\", label: \"Disconnected\" };\n }\n if (client.state.isConnecting || !client.isBotReady) {\n return { color: \"#f59e0b\", label: \"Connecting\" };\n }\n if (client.state.isListening) {\n return { color: \"#3b82f6\", label: \"Listening\" };\n }\n return { color: \"#10b981\", label: \"Connected\" };\n };\n\n const formatMessages = (): RTCChatMessage[] => {\n const filteredMessages = client.chatMessages.filter(\n (msg: ChatMessage) =>\n (msg.type === \"user-transcription\" ||\n msg.type === \"user-llm-text\" ||\n msg.type === \"bot-llm-text\" ||\n msg.type === \"bot-output\" ||\n msg.type === \"bot-emotion\") &&\n msg.content &&\n msg.content.trim().length > 0,\n );\n\n return filteredMessages.map((msg: ChatMessage) => ({\n id: msg.id,\n text: msg.content,\n isUser: msg.type.includes(\"user\"),\n timestamp: new Date(msg.timestamp).toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }),\n sender: msg.type.includes(\"user\") ? \"You\" : characterName,\n showLogo: msg.type.includes(\"bot\"),\n }));\n };\n\n // Setup event listeners for client state changes\n const setupClientListeners = () => {\n client.on(\"stateChange\", () => {\n updateHeader();\n\n // Update pulse animation based on connecting state\n if (client.state.isConnecting) {\n morphingContainer.style.animation =\n \"convai-pulse 2s ease-in-out infinite\";\n } else {\n morphingContainer.style.animation = \"none\";\n }\n\n // Update speaking animation state\n if (client.state.isSpeaking) {\n if (!startTime) {\n startTime = Date.now();\n }\n } else {\n // Reset when not speaking\n if (startTime && !client.state.isSpeaking) {\n startTime = 0;\n }\n }\n\n // Auto-collapse when disconnected\n if (!client.state.isConnected && !client.state.isConnecting) {\n if (isOpen) {\n setIsOpen(false);\n }\n isMuted = false;\n isVoiceMode = false;\n isVideoVisible = false;\n hasEnteredDefaultVoiceMode = false;\n updateHeader();\n // Synchronous listener: nothing here can catch a rejection, and the\n // mute inside is the one most likely to fail (the room has just\n // dropped -- that is why we are collapsing).\n applyVoiceMode();\n }\n\n // Auto-enter voice mode on first connection if defaultVoiceMode is true\n if (\n client.state.isConnected &&\n defaultVoiceMode &&\n isOpen &&\n !hasEnteredDefaultVoiceMode &&\n !isVoiceMode\n ) {\n setTimeout(async () => {\n try {\n await client.audioControls.unmuteAudio();\n isVoiceMode = true;\n hasEnteredDefaultVoiceMode = true;\n await updateVoiceMode();\n } catch (error) {\n reportMicFailure(client, \"Failed to enter voice mode:\", error);\n }\n }, 100);\n }\n });\n\n // Audio state changes now only affect voice mode (microphone button removed)\n\n // Video state change listener\n client.videoControls.on(\"videoStateChange\", (videoState: any) => {\n if (videoState.isVideoEnabled !== undefined) {\n isVideoVisible = videoState.isVideoEnabled;\n applyVoiceMode(); // synchronous listener; see applyVoiceMode()\n\n // Update tray button state\n const videoBtn = refs.settingsVideoBtn;\n if (videoBtn) {\n const isActive = isVideoVisible;\n videoBtn.style.backgroundColor = isActive\n ? \"rgba(16, 185, 129, 0.15)\"\n : \"transparent\";\n videoBtn.style.color = isActive\n ? \"#10b981\"\n : `var(--convai-panel-fg, ${aeroTheme.colors.text.primary})`;\n // Update Icon - first child is icon container\n const iconContainer = videoBtn.querySelector(\"div\");\n if (iconContainer) {\n iconContainer.innerHTML = \"\";\n const icon = isActive ? Icons.Video(\"md\") : Icons.VideoOff(\"md\");\n icon.style.width = \"18px\";\n icon.style.height = \"18px\";\n iconContainer.appendChild(icon);\n }\n }\n }\n });\n\n // Screen share state change listener\n client.screenShareControls.on(\n \"screenShareStateChange\",\n (screenShareState: any) => {\n if (screenShareState.isScreenShareActive !== undefined) {\n const isSharing = screenShareState.isScreenShareActive;\n const shareBtn = refs.settingsShareBtn;\n if (shareBtn) {\n const isActive = isSharing;\n shareBtn.style.backgroundColor = isActive\n ? \"rgba(16, 185, 129, 0.15)\"\n : \"transparent\";\n shareBtn.style.color = isActive\n ? \"#10b981\"\n : `var(--convai-panel-fg, ${aeroTheme.colors.text.primary})`;\n // Update Icon - first child is icon container\n const iconContainer = shareBtn.querySelector(\"div\");\n if (iconContainer) {\n iconContainer.innerHTML = \"\";\n const icon = isActive\n ? Icons.StopScreenShare(\"md\")\n : Icons.ScreenShare(\"md\");\n icon.style.width = \"18px\";\n icon.style.height = \"18px\";\n iconContainer.appendChild(icon);\n }\n }\n }\n },\n );\n\n client.on(\"messagesChange\", () => {\n updateMessageList();\n\n // Call onMessage callback if provided\n if (onMessage && client.chatMessages.length > 0) {\n const lastMessage = client.chatMessages[client.chatMessages.length - 1];\n onMessage(lastMessage);\n }\n });\n\n // Bot ready listener - updates UI when bot becomes ready\n client.on(\"botReady\", () => {\n updateHeader(); // Update header to show green status\n });\n\n client.on(\"connect\", () => {\n hasConnectedBefore = true;\n\n // Initialize audio renderer on connection\n // NOTE: the audio elements live under rootElement, so playback ends if\n // the host *removes or re-parents* its mount container mid-call. Merely\n // hiding it (display: none / visibility: hidden) does NOT stop\n // HTMLMediaElement playback in any browser — an earlier version of this\n // comment claimed otherwise and was wrong.\n if (client.room && !audioRenderer) {\n audioRenderer = new AudioRenderer(client.room, { container: rootElement });\n }\n\n // Fetch character info\n fetchCharacterInfo();\n\n // Call onConnect callback if provided\n if (onConnect) {\n onConnect();\n }\n });\n\n client.on(\"disconnect\", () => {\n // Cleanup audio renderer\n if (audioRenderer) {\n audioRenderer.destroy();\n audioRenderer = null;\n }\n\n updateMessageList();\n\n // Call onDisconnect callback if provided\n if (onDisconnect) {\n onDisconnect();\n }\n });\n };\n\n // Initialize\n createDOM();\n setupClientListeners();\n\n // Paint the connecting overlay's initial state. updateHeader() (which also\n // calls updateConnectingOverlay()) is otherwise only reached via a client\n // event or a successful character-info fetch, so a widget constructed\n // already connected-but-not-ready would show nothing until one of those\n // fires without this.\n updateConnectingOverlay();\n\n // Set initial button state\n updateSendButton(); // Show voice mode button initially since input is empty\n\n // Set initial voice mode UI if defaultVoiceMode is true\n if (defaultVoiceMode) {\n applyVoiceMode(); // synchronous constructor tail; see applyVoiceMode()\n }\n\n // If already connected, initialize audio renderer and fetch character info\n // NOTE: same lifetime caveat as the \"connect\" handler above — the audio\n // elements are torn down with rootElement if the host detaches it.\n if (client.state.isConnected && client.room) {\n audioRenderer = new AudioRenderer(client.room, { container: rootElement });\n fetchCharacterInfo();\n }\n\n // Return widget instance\n const widget: VanillaWidget = {\n element: rootElement,\n client: client,\n // `isOpen` reports *requested* state, which on a warm client is the same\n // thing as rendered state: `setIsOpen()` runs synchronously. The one case\n // where they differ is the first open on a disconnected client, where the\n // panel is committed only after `connect()` resolves; reporting `false`\n // for those seconds would tell an embed reconciling its own\n // convai-open/convai-close events that a widget it just opened is closed.\n // `pendingOpen` is cleared by every cancellation path, so this never\n // reports open for a request that was called off.\n get isOpen() {\n return isOpen || pendingOpen;\n },\n // Drives the exact same path the launcher click does: `handleToggle`\n // (connect-on-first-open, then `setIsOpen(true)`). Idempotent against an\n // in-flight open as well as an open panel, so repeat calls never start a\n // second connect.\n open: () => {\n if (isOpen || pendingOpen) return;\n void handleToggle();\n },\n // Drives the same path the header's close button does: `handleClose` ->\n // `setIsOpen(false)`. Also cancels an open that is still waiting on\n // `connect()`; a redundant `close()` is a no-op.\n close: () => {\n if (!isOpen && !pendingOpen) return;\n handleClose();\n },\n toggle: () => {\n if (isOpen || pendingOpen) {\n handleClose();\n } else {\n void handleToggle();\n }\n },\n // Pushes a synthetic ChatMessage straight onto `client.chatMessages` and\n // re-renders via the widget's existing `updateMessageList()`. It never\n // calls a client send method (e.g. `sendUserTextMessage`), so the\n // message never reaches the character and is never billed as an LLM\n // turn. The `local-` id keeps it from colliding with a server-issued id.\n appendMessage: (message) => {\n const chatMessage: ChatMessage = {\n id: `local-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`,\n type: message.sender === \"user\" ? \"user-llm-text\" : \"bot-llm-text\",\n content: message.content,\n timestamp: new Date().toISOString(),\n };\n client.chatMessages.push(chatMessage);\n updateMessageList();\n },\n destroy: () => {\n // Cleanup audio renderer\n if (audioRenderer) {\n audioRenderer.destroy();\n audioRenderer = null;\n }\n\n // Remove event listeners\n morphingContainer.removeEventListener(\"click\", handleLauncherClick);\n\n // Remove DOM elements\n if (rootElement.parentElement) {\n rootElement.remove();\n }\n if (floatingVideo.parentElement) {\n floatingVideo.remove();\n }\n\n // Unsubscribe from client events\n client.off(\"stateChange\", () => {});\n client.off(\"messagesChange\", () => {});\n client.off(\"botReady\", () => {});\n client.off(\"connect\", () => {});\n client.off(\"disconnect\", () => {});\n },\n };\n\n return widget;\n}\n\n/**\n * Destroy a Convai widget instance\n * @param widget - Widget instance to destroy\n */\nexport function destroyConvaiWidget(widget: VanillaWidget): void {\n widget.destroy();\n}\n"]}
1
+ {"version":3,"file":"ConvaiWidget.js","sourceRoot":"","sources":["../../src/vanilla/ConvaiWidget.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Vanilla ConvaiWidget - Complete UI widget for Convai conversations\n * Ports the React ConvaiWidget to vanilla TypeScript with DOM manipulation\n */\n\nimport { AudioRenderer } from \"./AudioRenderer\";\nimport {\n aeroTheme,\n injectGlobalStyles,\n injectKeyframes,\n type StyleTarget,\n} from \"./styles\";\nimport { Icons } from \"./icons\";\nimport { WidgetEventSubscriptions } from \"./WidgetEventSubscriptions\";\nimport { ConvaiClient } from \"../core/ConvaiClient\";\nimport type {\n VanillaWidgetOptions,\n VanillaWidget,\n WidgetPlacement,\n} from \"./types\";\nimport type { ChatMessage, IConvaiClient } from \"../core/types\";\nimport { parseInlineMarkdown, type MediaKind } from \"../utils/inlineMarkdown\";\nimport { freshPublicationGrantOptions } from \"../core/publishedChat\";\n\n/**\n * Positioning declarations for the widget root, keyed by `placement`. The\n * `bottom-right` entry must stay byte-identical to the literals it replaces --\n * the inline-style parity suite snapshots the resolved `cssText` and compares\n * it to a committed fixture.\n */\n/** Gap between a fixed-placement widget and the viewport edge it anchors to. */\nconst PLACEMENT_INSET_PX = 24;\n\nconst PLACEMENT_CSS: Record<WidgetPlacement, string> = {\n \"bottom-right\": `position: fixed; bottom: ${PLACEMENT_INSET_PX}px; right: ${PLACEMENT_INSET_PX}px;`,\n \"bottom-left\": `position: fixed; bottom: ${PLACEMENT_INSET_PX}px; left: ${PLACEMENT_INSET_PX}px;`,\n \"top-right\": `position: fixed; top: ${PLACEMENT_INSET_PX}px; right: ${PLACEMENT_INSET_PX}px;`,\n \"top-left\": `position: fixed; top: ${PLACEMENT_INSET_PX}px; left: ${PLACEMENT_INSET_PX}px;`,\n inline: \"position: relative;\",\n};\n\n/** The open panel's preferred size. Capped by `PANEL_MAX_*` — see below. */\nconst PANEL_W_PX = 400;\nconst PANEL_H_PX = 600;\n\n/**\n * A ceiling on the open panel, so it can never be clipped by the viewport.\n *\n * The panel used to be a flat 400x600. The widget is `position: fixed`\n * anchored `PLACEMENT_INSET_PX` from one edge, so on any viewport narrower\n * than 448px — or shorter than 648px — the panel ran past the opposite edge\n * and was silently cut off, with no scrollbar to reveal it, because fixed\n * elements do not contribute to scrollable overflow. That is most phones: at\n * 393px (iPhone 15 Pro) 30px of the panel sat off-screen, at 360px 63px did,\n * and in landscape 233px of it — the entire header, including the close\n * button — sat above the viewport, leaving nothing on screen to dismiss it.\n *\n * Expressed as `max-width`/`max-height` rather than folding the cap into the\n * width with `min()`. Both compute the same thing, but they fail differently:\n * a parser that does not know `min()` drops the whole declaration and the\n * panel is left with no width at all, which is worse than the bug. An unknown\n * `max-width` drops only the ceiling and leaves the previous behaviour intact.\n * (Not hypothetical — happy-dom, which this package's own tests run in, parses\n * the `max-width` form and discards the `min()` one.)\n *\n * Dynamic viewport units so mobile browser chrome is accounted for as it shows\n * and hides, rather than sizing against a viewport the user cannot fully see.\n * Applied to the container permanently rather than per state: the collapsed\n * bubble is far below the ceiling, so it is unaffected.\n */\nconst PANEL_MAX_W = `calc(100dvw - ${PLACEMENT_INSET_PX * 2}px)`;\nconst PANEL_MAX_H = `calc(100dvh - ${PLACEMENT_INSET_PX * 2}px)`;\ninterface RTCChatMessage {\n id: string;\n text: string;\n isUser: boolean;\n timestamp: string;\n sender?: string;\n showLogo: boolean;\n}\n\n/** `convai-error{code:'mic-permission'}` per the embed's error-handling contract. */\nconst MIC_PERMISSION_ERROR_CODE = \"mic-permission\" as const;\n\n/**\n * Distinguishes a microphone-permission denial from any other audio failure.\n *\n * Traced (not assumed): `client.audioControls.unmuteAudio()` delegates to\n * `AudioManager.enableAudio()`, which calls\n * `room.localParticipant.setMicrophoneEnabled(true)`. That's LiveKit's\n * `setTrackEnabled()`, which on failure does `throw e` unchanged, from a\n * `catch` around `createLocalTracks()`, which itself does `throw e` unchanged\n * around `navigator.mediaDevices.getUserMedia()`. `AudioManager.enableAudio()`\n * also just does `throw error` in its own catch. Nothing on that path wraps or\n * replaces the error, so a user's permission denial reaches here as the exact\n * `DOMException` `getUserMedia()` produced, with `.name === 'NotAllowedError'`\n * (`'PermissionDeniedError'` is the old pre-spec name some browsers used).\n */\nfunction isMicPermissionDenial(error: unknown): boolean {\n const name = (error as { name?: unknown } | null | undefined)?.name;\n return name === \"NotAllowedError\" || name === \"PermissionDeniedError\";\n}\n\n/**\n * Wraps a mic-permission denial so a consumer of the client's `error`\n * channel can tell it apart from a generic failure without knowing anything\n * about `DOMException` internals -- it only has to check `error.code`. The\n * original error is preserved on `.cause` for anyone who wants the detail.\n */\nfunction toMicPermissionError(\n cause: unknown,\n): Error & { code: typeof MIC_PERMISSION_ERROR_CODE; cause: unknown } {\n const err = new Error(\n \"Microphone access was denied. Continuing in text-only mode.\",\n ) as Error & { code: typeof MIC_PERMISSION_ERROR_CODE; cause: unknown };\n err.name = \"ConvaiMicPermissionError\";\n err.code = MIC_PERMISSION_ERROR_CODE;\n err.cause = cause;\n return err;\n}\n\n/**\n * Routes a failed `enableAudio()`/`unmuteAudio()` call onto the client's\n * *existing* `error` channel -- the same one `ConvaiClient` already uses --\n * instead of letting it become an unhandled rejection (the click-handler\n * site) or vanish into a bare `console.error` (the auto-voice-mode sites).\n * `console.error` is kept alongside for local debugging; this just adds the\n * event emission next to it. `client.emit` is called defensively since it\n * isn't part of the public `IConvaiClient` surface -- see the `emit?` field\n * on `VanillaWidgetOptions.convaiClient` in `./types.ts`.\n */\nfunction reportMicFailure(\n client: { emit?: (event: string, ...args: any[]) => void },\n logLabel: string,\n error: unknown,\n): void {\n console.error(logLabel, error);\n const payload = isMicPermissionDenial(error)\n ? toMicPermissionError(error)\n : error;\n client.emit?.(\"error\", payload);\n}\n\n/**\n * Create a Convai chat widget in the specified container\n *\n * @param container - HTML element to attach the widget to\n * @param options - Widget configuration options\n * @returns VanillaWidget instance with destroy method\n *\n * @example Simple usage with config\n * ```typescript\n * import { createConvaiWidget } from '@convai/web-sdk/vanilla';\n *\n * const widget = createConvaiWidget(document.body, {\n * apiKey: 'your-api-key',\n * characterId: 'your-character-id',\n * enableVideo: false\n * });\n * ```\n *\n * @example Advanced usage with client instance\n * ```typescript\n * import { ConvaiClient, createConvaiWidget } from '@convai/web-sdk/vanilla';\n *\n * const client = new ConvaiClient({\n * apiKey: 'your-api-key',\n * characterId: 'your-character-id'\n * });\n *\n * const widget = createConvaiWidget(document.body, {\n * convaiClient: client,\n * showVideo: true,\n * showScreenShare: true,\n * defaultVoiceMode: true\n * });\n * ```\n */\nexport function createConvaiWidget(\n container: HTMLElement,\n options: VanillaWidgetOptions,\n): VanillaWidget {\n /**\n * Where global styles and `@keyframes` are injected.\n *\n * An explicit `options.styleTarget` wins and is used verbatim. Otherwise we\n * fall back to deriving it from the container's current root — which is what\n * every existing caller relies on, but only works when the container is\n * already attached to its final root. A caller that builds a detached\n * subtree and appends it to a shadow root afterwards must pass\n * `styleTarget` explicitly, or the styles land in `document.head` and the\n * shadow tree renders unstyled with no error.\n */\n const styleTarget: StyleTarget =\n options.styleTarget ??\n ((container.getRootNode() as StyleTarget | null) instanceof ShadowRoot\n ? (container.getRootNode() as ShadowRoot)\n : document);\n\n // Create client if not provided - guarantee it's defined\n const client: IConvaiClient & {\n activity?: string;\n chatMessages: ChatMessage[];\n emit?: (event: string, ...args: any[]) => void;\n } =\n options.convaiClient ||\n (() => {\n const hasAuth = Boolean(options.apiKey || options.authToken);\n if (!hasAuth || !options.characterId) {\n throw new Error(\n \"Either convaiClient or (apiKey or authToken) and characterId must be provided\",\n );\n }\n\n return new ConvaiClient({\n apiKey: options?.apiKey || undefined,\n authToken: options?.authToken || undefined,\n characterId: options.characterId,\n enableVideo: options.enableVideo ?? false,\n startWithVideoOn: options.startWithVideoOn ?? false,\n enableLipsync: options.enableLipsync ?? false,\n enableEmotion: options.enableEmotion,\n blendshapeConfig: options.blendshapeConfig,\n });\n })();\n\n const {\n showVideo = true,\n showScreenShare = true,\n defaultVoiceMode = true,\n requestPublicationGrant,\n publishedChatConnectOptions,\n publishedChatDescriptor,\n onConnect,\n onDisconnect,\n onMessage,\n } = options;\n\n // Unknown/typo'd values fall back to the default rather than throwing --\n // a bad `placement` attribute on a customer's page must not blank the\n // widget.\n const placement: WidgetPlacement =\n options.placement && options.placement in PLACEMENT_CSS\n ? options.placement\n : \"bottom-right\";\n\n // Inject global styles\n injectGlobalStyles(styleTarget);\n\n // State\n let isOpen = false;\n let isSettingsOpen = false;\n let isVoiceMode =\n defaultVoiceMode &&\n !requestPublicationGrant &&\n client.connectionType !== \"text\";\n let isMuted = false;\n let isVideoVisible = false;\n let inputValue = \"\";\n let characterName = publishedChatDescriptor?.display_name || \"Character\";\n let characterImage = publishedChatDescriptor?.image_url || \"\";\n let audioRenderer: AudioRenderer | null = null;\n let hasEnteredDefaultVoiceMode = false;\n /** True after we have connected at least once; used to call reconnect() instead of connect() when opening after disconnect */\n let hasConnectedBefore = false;\n /**\n * True from the moment an open is requested on a *disconnected* client\n * until that open either completes or is cancelled.\n *\n * `isOpen` alone cannot express this: the first open awaits a real\n * `connect()` (0.5-3s in production) and only flips `isOpen` afterwards, so\n * for that whole window the widget is neither open nor idle. Without this\n * flag `close()` sees `isOpen === false` and no-ops -- and the connect then\n * pops the panel open behind the user -- while `toggle()` sees the same\n * `false`, starts a *second* open, and lands on the already-connecting\n * branch that opens immediately. Every entry point below treats\n * `pendingOpen` as \"open\" for the purpose of deciding what a close/toggle\n * means, and `handleToggle` re-checks it before committing `setIsOpen(true)`\n * so a cancellation during the await is honoured.\n */\n let pendingOpen = false;\n /** Prevent an in-flight publication grant request from connecting after teardown. */\n let isDestroyed = false;\n const eventSubscriptions = new WidgetEventSubscriptions(() => isDestroyed);\n\n // DOM elements (will be created below)\n let rootElement!: HTMLDivElement;\n let morphingContainer!: HTMLDivElement;\n let buttonContent!: HTMLDivElement;\n let chatContent!: HTMLDivElement;\n let headerElement!: HTMLDivElement;\n let contentElement!: HTMLDivElement;\n let footerElement!: HTMLDivElement;\n let inputElement!: HTMLInputElement;\n let messageListElement!: HTMLDivElement;\n let settingsTray!: HTMLDivElement;\n let floatingVideo!: HTMLDivElement;\n let voiceModeOverlay!: HTMLDivElement;\n let connectingOverlay!: HTMLDivElement;\n\n /**\n * Elements captured at creation. IDs are scoped per DOM tree, so\n * document.getElementById() returns null when the widget is mounted\n * inside a shadow root. Every element here is created in this file.\n */\n const refs: {\n voiceModeTitle?: HTMLElement;\n voiceModeSubtitle?: HTMLElement;\n voiceModeAvatar?: HTMLElement;\n voiceModeAvatarClip?: HTMLElement;\n voiceModeCanvas?: HTMLCanvasElement;\n widgetTitle?: HTMLElement;\n sendButton?: HTMLButtonElement;\n footerStandard?: HTMLElement;\n voiceExitBtn?: HTMLElement;\n settingsVideoBtn?: HTMLElement;\n settingsShareBtn?: HTMLElement;\n connectingLabel?: HTMLElement;\n } = {};\n\n // Audio Analysis State\n let audioContext: AudioContext | null = null;\n let analyzer: AnalyserNode | null = null;\n let dataArray: Uint8Array<ArrayBuffer> | null = null;\n let rafId: number | null = null;\n let source: MediaStreamAudioSourceNode | null = null;\n\n // Fetch character info - matches React useCharacterInfo hook\n const fetchCharacterInfo = async () => {\n if (publishedChatDescriptor) return;\n // Prefer authToken over apiKey, matching the precedence ConvaiClient\n // uses when building /connect headers -- a client carrying both must\n // behave identically in both places.\n //\n // The two credentials travel in *different* headers: api.convai.com reads\n // an auth token from API-AUTH-TOKEN and an API key from X-API-Key, and\n // answers an API key sent as API-AUTH-TOKEN with `400 Your session has\n // expired.` Because the failure is swallowed below, sending the wrong one\n // showed up only as a header stuck on the fallback name.\n const credential = client.authToken ?? client.apiKey;\n if (!credential || !client.characterId) return;\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (client.authToken) {\n headers[\"API-AUTH-TOKEN\"] = client.authToken;\n } else {\n headers[\"X-API-Key\"] = credential;\n }\n\n try {\n const response = await fetch(\"https://api.convai.com/character/get\", {\n method: \"POST\",\n headers,\n body: JSON.stringify({ charID: client.characterId }),\n });\n\n if (response.ok) {\n const data = await response.json();\n\n // Extract character name and image with fallbacks - matches React version\n characterName = data.character_name || \"Convi\";\n characterImage =\n data.model_details?.METAHUMAN?.avatar_image_square ||\n data.model_details?.METAHUMAN?.avatar_image ||\n data.model_details?.modelPlaceholder ||\n \"\";\n\n updateHeader();\n }\n } catch (error) {\n console.error(\"Failed to fetch character info:\", error);\n }\n };\n\n // Create root structure\n const createDOM = () => {\n rootElement = document.createElement(\"div\");\n rootElement.className = \"convai-widget\";\n rootElement.style.cssText = `\n ${PLACEMENT_CSS[placement]}\n z-index: var(--convai-z-index, ${aeroTheme.zIndex.modal});\n font-family: var(--convai-font, ${aeroTheme.typography.fontFamily.primary});\n `;\n\n // Morphing container\n morphingContainer = document.createElement(\"div\");\n // `part=\"launcher\"` is precise only while collapsed: this same element\n // morphs into the open panel (400x600, capped to the viewport — see PANEL_MAX_W)\n // and carries that panel's background,\n // radius and shadow. See the `part=\"panel\"` call site below for the full\n // semantics a host needs to know.\n morphingContainer.setAttribute(\"part\", \"launcher\");\n // NOTE on border-radius: deliberately NOT themable. `--convai-radius`\n // drives the open panel only. One token cannot serve both geometries --\n // `--convai-radius: 8px` would squircle the circular launcher, and `50%`\n // would turn the panel into an ellipse. A dedicated\n // `--convai-launcher-radius` can be added additively later if wanted.\n morphingContainer.style.cssText = `\n position: relative;\n width: var(--convai-launcher-size, 64px);\n height: var(--convai-launcher-size, 64px);\n max-width: ${PANEL_MAX_W};\n max-height: ${PANEL_MAX_H};\n background: var(--convai-panel-bg, ${aeroTheme.colors.glass.backdrop});\n backdrop-filter: ${aeroTheme.glass.backdrop};\n border: ${aeroTheme.glass.border};\n border-radius: 50%;\n box-shadow: var(--convai-shadow, ${aeroTheme.shadows.glass});\n transition: all 0.3s ease-in-out;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n `;\n\n // Button content (logo)\n buttonContent = document.createElement(\"div\");\n buttonContent.style.cssText = `\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: opacity 0.3s, transform 0.3s;\n opacity: 1;\n transform: scale(1);\n `;\n const convaiLogo = Icons.ConvaiLogo(\"xl\", \"idle\");\n convaiLogo.style.color = `var(--convai-accent, ${aeroTheme.colors.convai.light})`;\n buttonContent.appendChild(convaiLogo);\n\n // Chat content\n chatContent = document.createElement(\"div\");\n // ----------------------------------------------------------------------\n // `launcher` / `panel` part semantics. Read before writing theming docs.\n //\n // This widget morphs rather than swapping trees: `morphingContainer` IS\n // the 64px circle AND the open panel, animating between them (see\n // setIsOpen). It therefore owns every painted surface property of both\n // states -- background, border, border-radius, box-shadow. `buttonContent`\n // and `chatContent` are transparent `inset: 0` overlays that only\n // cross-fade their contents.\n //\n // So, precisely:\n // ::part(launcher) -> morphingContainer. Paints the collapsed circle\n // AND the open panel; there is no rule that hits\n // only one. This is the surface part.\n // ::part(panel) -> chatContent. The open state's *content layer*:\n // useful for padding, colour, font, opacity. It has\n // no background, no border and no radius of its\n // own, so `::part(panel){border-radius}` does\n // nothing -- set radius via ::part(launcher) or\n // `--convai-radius` (which is panel-scoped).\n //\n // Assessed and deliberately not \"fixed\": moving `launcher` onto\n // buttonContent would make `::part(launcher){background}` state-specific\n // but would silently break `border-radius` and `box-shadow` on it, since\n // buttonContent is clipped by the container's own radius + overflow:\n // hidden. Correcting this properly needs a separate launcher element\n // instead of a morph -- a rendering change, out of scope here.\n // ----------------------------------------------------------------------\n chatContent.setAttribute(\"part\", \"panel\");\n chatContent.style.cssText = `\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n opacity: 0;\n transform: scale(0.8);\n transition: opacity 0.2s, transform 0.2s;\n pointer-events: none;\n `;\n\n // Voice Mode Overlay\n voiceModeOverlay = createVoiceModeOverlay();\n chatContent.appendChild(voiceModeOverlay);\n\n // Header\n headerElement = createHeader();\n\n // Content area\n contentElement = document.createElement(\"div\");\n contentElement.style.cssText = `\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n background: transparent;\n position: relative;\n `;\n messageListElement = createMessageList();\n contentElement.appendChild(messageListElement);\n // Connecting overlay -- shown until the bot is ready. Appended last, not\n // to match DOM order (position: absolute + z-index: 100, set inside\n // createConnectingOverlay, is what keeps it on top regardless of source\n // order) but so inserting it doesn't shift every existing sibling's\n // index-based path in the inline-style-parity fixture.\n connectingOverlay = createConnectingOverlay();\n contentElement.appendChild(connectingOverlay);\n\n // Footer\n footerElement = createFooter();\n\n chatContent.appendChild(headerElement);\n chatContent.appendChild(contentElement);\n chatContent.appendChild(footerElement);\n\n morphingContainer.appendChild(buttonContent);\n morphingContainer.appendChild(chatContent);\n rootElement.appendChild(morphingContainer);\n\n // Settings tray\n settingsTray = createSettingsTray();\n rootElement.appendChild(settingsTray);\n\n // Floating video\n floatingVideo = createFloatingVideo();\n container.appendChild(floatingVideo);\n\n container.appendChild(rootElement);\n\n // Event listeners\n morphingContainer.addEventListener(\"click\", handleLauncherClick);\n };\n\n // Create Voice Mode Overlay\n /**\n * Voice mode, matched to the React overlay (VoiceModeOverlay.tsx) rather\n * than to what this file used to draw.\n *\n * The two had diverged badly: React centres the character's avatar inside\n * two counter-rotating liquid-gradient layers and paints the user's\n * microphone as three overlapping sine waves on a canvas, while this file\n * drew forty grey vertical bars and no avatar at all. Same product, two\n * unrelated screens.\n *\n * What is reproduced here, value for value: the 120px avatar with its 3px\n * rgba(255,255,255,0.2) ring and letter fallback, the 126px conic and\n * radial gradient layers (20s clockwise / 15s anticlockwise, blurred 8px\n * and 6px), the 250x80 canvas carrying three waves, and the status text at\n * 16px/600 over 13px with React's wording.\n *\n * The one deliberate omission is the `AudioVisualizer` ring that React\n * fades in behind the avatar while the character speaks: it is a 364-line\n * component wired directly to a LiveKit `Room`, and porting it is its own\n * change. The avatar still breathes while the character speaks, so the\n * speaking state reads without it.\n */\n const createVoiceModeOverlay = (): HTMLDivElement => {\n const overlay = document.createElement(\"div\");\n overlay.style.cssText = `\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n text-align: center;\n padding: 16px;\n z-index: 10;\n pointer-events: auto;\n display: none;\n flex-direction: column;\n align-items: center;\n gap: 32px;\n `;\n\n // --- Avatar, with the two rotating gradient layers behind it ----------\n const avatarWrap = document.createElement(\"div\");\n avatarWrap.style.cssText = `\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n isolation: isolate;\n `;\n\n const avatarStack = document.createElement(\"div\");\n avatarStack.className = \"convai-voice-avatar\";\n refs.voiceModeAvatar = avatarStack;\n avatarStack.style.cssText = `\n position: relative;\n z-index: 10;\n border-radius: 50%;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);\n background: white;\n display: flex;\n align-items: center;\n justify-content: center;\n `;\n\n const accent = `var(--convai-accent, ${aeroTheme.colors.convai.light})`;\n const layer1 = document.createElement(\"div\");\n layer1.className = \"convai-voice-gradient\";\n layer1.style.cssText = `\n position: absolute;\n width: 126px;\n height: 126px;\n border-radius: 50%;\n background: conic-gradient(\n from 0deg,\n ${aeroTheme.colors.convai.light}00 0%,\n ${aeroTheme.colors.convai.light}40 25%,\n ${aeroTheme.colors.convai.dark}60 50%,\n ${aeroTheme.colors.convai.light}40 75%,\n ${aeroTheme.colors.convai.light}00 100%\n );\n opacity: 0.8;\n filter: blur(8px);\n z-index: -2;\n animation: convaiVoiceSpin 20s linear infinite;\n `;\n\n const layer2 = document.createElement(\"div\");\n layer2.className = \"convai-voice-gradient\";\n layer2.style.cssText = `\n position: absolute;\n width: 126px;\n height: 126px;\n border-radius: 50%;\n background:\n radial-gradient(ellipse 80% 100% at 30% 40%,\n ${aeroTheme.colors.convai.light}50,\n ${aeroTheme.colors.convai.light}30 40%,\n transparent 70%),\n radial-gradient(ellipse 80% 100% at 70% 60%,\n ${aeroTheme.colors.convai.dark}50,\n ${aeroTheme.colors.convai.dark}30 40%,\n transparent 70%);\n opacity: 0.9;\n filter: blur(6px);\n z-index: -1;\n animation: convaiVoiceSpinReverse 15s linear infinite;\n `;\n\n // The image is clipped by its own container so the gradients above stay\n // visible outside it — React nests it the same way for the same reason.\n const avatarClip = document.createElement(\"div\");\n avatarClip.style.cssText = `\n position: relative;\n border-radius: 50%;\n overflow: hidden;\n border: 3px solid rgba(255, 255, 255, 0.2);\n width: 120px;\n height: 120px;\n display: flex;\n align-items: center;\n justify-content: center;\n `;\n refs.voiceModeAvatarClip = avatarClip;\n\n avatarStack.append(layer1, layer2, avatarClip);\n avatarWrap.appendChild(avatarStack);\n overlay.appendChild(avatarWrap);\n\n // --- The user's microphone, as three waves on a canvas ----------------\n const canvas = document.createElement(\"canvas\");\n canvas.className = \"convai-voice-wave\";\n canvas.style.cssText = `width: 250px; height: 80px;`;\n refs.voiceModeCanvas = canvas;\n overlay.appendChild(canvas);\n\n // --- Status text ------------------------------------------------------\n const statusContainer = document.createElement(\"div\");\n\n const statusTitle = document.createElement(\"div\");\n statusTitle.id = \"voice-mode-title\";\n refs.voiceModeTitle = statusTitle;\n statusTitle.style.cssText = `\n font-size: 16px;\n font-weight: 600;\n color: var(--convai-panel-fg, ${aeroTheme.colors.text.primary});\n margin-bottom: 8px;\n `;\n statusTitle.textContent = \"Voice Mode\";\n\n const statusSubtitle = document.createElement(\"div\");\n statusSubtitle.id = \"voice-mode-subtitle\";\n refs.voiceModeSubtitle = statusSubtitle;\n statusSubtitle.style.cssText = `\n font-size: 13px;\n color: ${aeroTheme.colors.text.secondary};\n `;\n statusSubtitle.textContent = \"Tap microphone to talk\";\n\n statusContainer.append(statusTitle, statusSubtitle);\n overlay.appendChild(statusContainer);\n\n void accent;\n return overlay;\n };\n\n /**\n * Fills the voice-mode avatar from the character info fetch, or falls back\n * to the character's initial the way React does. Called from\n * updateHeader(), so it tracks a late `fetchCharacterInfo()` rather than\n * being fixed at construction.\n */\n const updateVoiceModeAvatar = (): void => {\n const clip = refs.voiceModeAvatarClip;\n if (!clip) return;\n const wanted = characterImage || `letter:${characterName}`;\n if (clip.dataset.filledWith === wanted) return;\n clip.dataset.filledWith = wanted;\n clip.replaceChildren();\n\n if (characterImage) {\n const img = document.createElement(\"img\");\n img.src = characterImage;\n img.alt = characterName;\n img.style.cssText = `width: 120px; height: 120px; object-fit: cover; display: block;`;\n clip.appendChild(img);\n return;\n }\n\n const letter = document.createElement(\"div\");\n letter.style.cssText = `\n width: 120px;\n height: 120px;\n background-color: ${aeroTheme.colors.convai.light}20;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 48px;\n font-weight: 600;\n color: var(--convai-accent, ${aeroTheme.colors.convai.light});\n `;\n letter.textContent = characterName[0]?.toUpperCase() || \"C\";\n clip.appendChild(letter);\n };\n\n // Create Connecting Overlay -- matches React's inline AnimatePresence\n // block exactly (ConvaiWidget.tsx:681-737): shown whenever\n // `isConnected && !isBotReady`, covering just the content area (not the\n // header/footer) so the chrome stays interactive while the character\n // joins. Persistent in the DOM like voiceModeOverlay above -- toggled via\n // opacity/pointer-events rather than mounted/unmounted, since this file has\n // no AnimatePresence-style exit-animation machinery. Visibility is driven\n // by updateConnectingOverlay().\n const createConnectingOverlay = (): HTMLDivElement => {\n const overlay = document.createElement(\"div\");\n overlay.id = \"convai-connecting-overlay\";\n overlay.style.cssText = `\n position: absolute;\n inset: 0;\n z-index: 100;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n background: rgba(255, 255, 255, 0.95);\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.3s;\n `;\n\n // Keyframes live in the shadow-safe injector (styles.ts), not\n // document.head -- @keyframes defined there do not resolve for shadow\n // content. Idempotent; also called from createSettingsTray().\n injectKeyframes(styleTarget);\n\n // Spinning logo: a full turn every 2s, linear, infinite.\n const spinWrapper = document.createElement(\"div\");\n spinWrapper.className = \"convai-connecting-spin\";\n spinWrapper.style.cssText = `\n display: inline-flex;\n animation: convaiConnectingSpin 2s linear infinite;\n `;\n const logo = Icons.ConvaiLogo(\"xl\", \"connecting\");\n // Themable, like every other accent usage in this file (see\n // theming.test.ts) -- var() with the exact literal React passes\n // (`aeroTheme.colors.convai.light`) as the fallback, so an unset\n // --convai-accent renders identically to the React value.\n logo.style.color = `var(--convai-accent, ${aeroTheme.colors.convai.light})`;\n spinWrapper.appendChild(logo);\n overlay.appendChild(spinWrapper);\n\n // Pulsing \"Connecting to {characterName}...\" label.\n const label = document.createElement(\"div\");\n label.id = \"convai-connecting-text\";\n label.className = \"convai-connecting-pulse\";\n label.style.cssText = `\n font-size: 14px;\n font-weight: 500;\n color: ${aeroTheme.colors.text.secondary};\n animation: convaiConnectingPulse 2s ease-in-out infinite;\n `;\n refs.connectingLabel = label;\n overlay.appendChild(label);\n\n return overlay;\n };\n\n /** Shows/hides the connecting overlay and refreshes its label. Called\n * from updateHeader() so every existing call site (stateChange, botReady,\n * connect/disconnect via stateChange, character-info fetch, ...) stays in\n * sync automatically. */\n const updateConnectingOverlay = () => {\n if (!connectingOverlay) return;\n const label = refs.connectingLabel;\n if (label) {\n label.textContent = `Connecting to ${characterName}...`;\n }\n // `isConnecting` matters as much as `isConnected` here. The panel opens\n // on the click that *starts* the connect, so between that click and the\n // transport coming up (a real network round trip — ~3s against the live\n // service) `isConnected` is still false. Gating on it alone left the\n // whole of that window with no overlay at all: an empty message area and\n // a nameless header, i.e. the widget looked broken for exactly as long as\n // it was doing the one thing the user asked for. Then the label appeared\n // *after* the transport was already up, which reads backwards.\n //\n // The embed makes this the normal path rather than an edge case: its\n // launcher click opens the panel immediately by design, so the pre-connect\n // window is always visible to the user.\n const shouldShow =\n (client.state.isConnected || client.state.isConnecting) && !client.isBotReady;\n connectingOverlay.style.opacity = shouldShow ? \"1\" : \"0\";\n connectingOverlay.style.pointerEvents = shouldShow ? \"auto\" : \"none\";\n };\n\n // Audio Analysis State for Voice Mode\n let audioLevels: number[] = Array(40).fill(0);\n let startTime = 0;\n /**\n * Paints the three overlapping sine waves React draws for the user's\n * microphone (VoiceModeOverlay.tsx's `drawWaves`), including its two\n * performance guards, which matter more here than there: this canvas sits\n * over whatever the host page is rendering, and every repaint forces the\n * compositor to re-blend the whole panel. So it runs at 30fps rather than\n * 60, and stops entirely while the input is silent — the static line is\n * already on the canvas at that point.\n */\n let waveFrameParity = 0;\n let waveWasSilent = false;\n const drawWaves = () => {\n const canvas = refs.voiceModeCanvas;\n if (!canvas) return;\n\n waveFrameParity ^= 1;\n if (waveFrameParity) return;\n\n let sum = 0;\n for (let i = 0; i < audioLevels.length; i++) sum += audioLevels[i]!;\n const silent = sum / audioLevels.length < 0.012;\n if (silent && waveWasSilent) return;\n waveWasSilent = silent;\n\n const dpr = Math.min(window.devicePixelRatio || 1, 2);\n if (canvas.width !== 250 * dpr) {\n canvas.width = 250 * dpr;\n canvas.height = 80 * dpr;\n }\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) return;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, 250, 80);\n\n const centerY = 40;\n const waveWidth = 250;\n const segments = 40;\n const avgLevel = sum / audioLevels.length;\n const waveColors = [\n aeroTheme.colors.convai.light,\n aeroTheme.colors.convai.light,\n \"#34d399\",\n ];\n ctx.lineCap = \"round\";\n ctx.lineJoin = \"round\";\n for (let waveIndex = 2; waveIndex >= 0; waveIndex--) {\n ctx.beginPath();\n for (let i = 0; i <= segments; i++) {\n const x = (i / segments) * waveWidth;\n const levelIndex = Math.floor((i / segments) * (audioLevels.length - 1));\n const level = audioLevels[levelIndex] || 0;\n const phase =\n (Date.now() / 500 + i * 0.2 + waveIndex * 1.5) % (Math.PI * 2);\n const baseAmplitude = avgLevel > 0.05 ? 2 + waveIndex * 1.5 : 0;\n const amplitude = baseAmplitude + level * (25 - baseAmplitude);\n const y = centerY + Math.sin(phase) * amplitude;\n if (i === 0) ctx.moveTo(x, y);\n else ctx.lineTo(x, y);\n }\n ctx.strokeStyle = waveColors[waveIndex]!;\n ctx.globalAlpha = 0.18 * (0.3 + avgLevel);\n ctx.lineWidth = 2.5 - waveIndex * 0.4 + 8 * avgLevel + 3;\n ctx.stroke();\n ctx.globalAlpha = 0.95 - waveIndex * 0.15;\n ctx.lineWidth = 2.5 - waveIndex * 0.4;\n ctx.stroke();\n }\n ctx.globalAlpha = 1;\n };\n\n /**\n * The voice-mode frame loop. Keeps the name `updateAudioBars` because\n * every call site refers to it; what it drives is now the avatar, the\n * canvas and the status text rather than forty bars.\n */\n const updateAudioBars = () => {\n if (!voiceModeOverlay) return;\n\n const isTalking = client.state.isSpeaking;\n const isListening = client.state.isListening;\n const micOpen = !client.audioControls.isAudioMuted;\n\n // The avatar breathes while the character speaks — React drives the same\n // thing with a framer-motion scale keyframe.\n const avatar = refs.voiceModeAvatar;\n if (avatar) {\n const wanted = isTalking ? \"convaiVoiceBreathe 3s ease-in-out infinite\" : \"\";\n if (avatar.style.animation !== wanted) avatar.style.animation = wanted;\n }\n\n // React's exact wording, including \"Voice Mode\" rather than the\n // \"Voice Only Mode\" this file used to show.\n const title = refs.voiceModeTitle;\n const subtitle = refs.voiceModeSubtitle;\n if (title) {\n title.textContent = isTalking\n ? `${characterName} Speaking...`\n : isListening || micOpen\n ? \"Listening...\"\n : \"Voice Mode\";\n }\n if (subtitle) {\n subtitle.textContent =\n isListening || micOpen || isTalking ? \"Audio active\" : \"Tap microphone to talk\";\n }\n\n if ((isListening || micOpen) && analyzer && dataArray) {\n // @ts-ignore - TypeScript strict mode issue with Uint8Array type\n analyzer.getByteTimeDomainData(dataArray);\n let sum = 0;\n for (let i = 0; i < dataArray.length; i++) {\n const normalized = (dataArray[i]! - 128) / 128;\n sum += normalized * normalized;\n }\n const rms = Math.sqrt(sum / dataArray.length);\n const volume = Math.min(1, rms * 3);\n\n for (let i = 0; i < audioLevels.length; i++) {\n const position = i / audioLevels.length;\n const wavePhase = Date.now() / 300 + position * Math.PI * 2;\n const waveVariation = Math.sin(wavePhase) * 0.15 + 0.85;\n audioLevels[i] = volume * waveVariation;\n }\n } else {\n // The waves settle to a flat line rather than animating on the\n // character's behalf: React paints this canvas from the microphone\n // only, and the character's own speech is the avatar's job.\n for (let i = 0; i < audioLevels.length; i++) audioLevels[i] = 0;\n }\n drawWaves();\n\n rafId = requestAnimationFrame(updateAudioBars);\n };\n\n\n const startAudioAnalysis = async () => {\n try {\n if (!audioContext) {\n audioContext = new (window.AudioContext ||\n (window as any).webkitAudioContext)();\n }\n\n if (audioContext.state === \"suspended\") {\n await audioContext.resume();\n }\n\n const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n analyzer = audioContext.createAnalyser();\n analyzer.fftSize = 256;\n analyzer.smoothingTimeConstant = 0.7;\n\n source = audioContext.createMediaStreamSource(stream);\n source.connect(analyzer);\n\n dataArray = new Uint8Array(analyzer.fftSize);\n updateAudioBars();\n } catch (e) {\n // Fourth mic-acquiring call site: this getUserMedia() is independent\n // of client.audioControls (it's a separate analyser-only stream, not\n // routed through AudioManager), but a denial here is the identical\n // failure mode -- most commonly a mid-session permission revocation,\n // since by the time voice mode is entered the mic has usually already\n // been granted via unmuteAudio(). Same helper, same channel, so a\n // consumer sees one consistent signal regardless of which internal\n // path acquired the mic.\n reportMicFailure(client, \"Audio analysis setup failed:\", e);\n }\n };\n\n const stopAudioAnalysis = () => {\n if (rafId) cancelAnimationFrame(rafId);\n if (source) {\n source.disconnect();\n source.mediaStream.getTracks().forEach((t) => t.stop());\n source = null;\n }\n // Keep context alive if possible, or close it? React component closes it.\n // We can keep it for reuse or close. Let's keep it simple.\n };\n\n // Create header\n const createHeader = (): HTMLDivElement => {\n const header = document.createElement(\"div\");\n header.setAttribute(\"part\", \"header\");\n header.style.cssText = `\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px;\n border-bottom: 1px solid ${aeroTheme.colors.neutral[200]};\n background: var(--convai-panel-bg, white);\n position: relative;\n `;\n\n // Close button on the left\n const closeButton = document.createElement(\"button\");\n const chevronIcon = Icons.ChevronDown(\"md\");\n closeButton.appendChild(chevronIcon);\n closeButton.style.cssText = `\n font-size: 20px;\n color: ${aeroTheme.colors.text.secondary};\n cursor: pointer;\n padding: 4px;\n transition: ${aeroTheme.transitions.fast};\n background: transparent;\n border: none;\n `;\n closeButton.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n handleClose();\n });\n\n // Title section centered - matches React version\n const titleSection = document.createElement(\"div\");\n titleSection.style.cssText = `\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: ${aeroTheme.typography.fontSize.base};\n font-weight: ${aeroTheme.typography.fontWeight.semibold};\n color: var(--convai-panel-fg, ${aeroTheme.colors.text.primary});\n `;\n titleSection.id = \"convai-widget-title\";\n refs.widgetTitle = titleSection;\n\n // Settings button on the right\n const settingsButton = document.createElement(\"button\");\n const moreIcon = Icons.MoreVertical(\"md\");\n settingsButton.appendChild(moreIcon);\n settingsButton.style.cssText = `\n font-size: 24px;\n color: ${aeroTheme.colors.text.secondary};\n cursor: pointer;\n padding: 4px;\n transition: ${aeroTheme.transitions.fast};\n background: transparent;\n border: none;\n margin-left: auto;\n `;\n settingsButton.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n handleSettingsToggle();\n });\n\n header.appendChild(closeButton);\n header.appendChild(titleSection);\n header.appendChild(settingsButton);\n\n return header;\n };\n\n // Update header with character info\n const updateHeader = () => {\n const titleSection = refs.widgetTitle;\n if (!titleSection) return;\n\n titleSection.innerHTML = \"\";\n\n if (characterImage) {\n const img = document.createElement(\"img\");\n img.src = characterImage;\n img.alt = characterName;\n img.style.cssText = `\n width: 24px;\n height: 24px;\n border-radius: 50%;\n object-fit: cover;\n border: 1.5px solid ${getBotStatusColor().color};\n box-shadow: 0 0 6px ${getBotStatusColor().color}40;\n transition: all 0.3s ease;\n `;\n titleSection.appendChild(img);\n }\n\n const nameSpan = document.createElement(\"span\");\n nameSpan.textContent = characterName;\n titleSection.appendChild(nameSpan);\n\n // Mute button\n const muteButton = document.createElement(\"button\");\n muteButton.innerHTML = \"\";\n const volumeIcon = isMuted\n ? Icons.VolumeMute(\"sm\")\n : Icons.VolumeHigh(\"sm\");\n volumeIcon.style.color = isMuted ? \"#919EABA6\" : \"#0E7360\";\n muteButton.appendChild(volumeIcon);\n muteButton.style.cssText = `\n cursor: pointer;\n background: transparent;\n border: none;\n box-shadow: none;\n width: auto;\n height: auto;\n padding: 0;\n display: inline-flex;\n align-items: center;\n margin-left: 8px;\n outline: none;\n transition: transform 0.1s ease-out;\n `;\n muteButton.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n handleToggleMute();\n });\n muteButton.addEventListener(\"mouseenter\", () => {\n muteButton.style.transform = \"scale(1.1)\";\n });\n muteButton.addEventListener(\"mouseleave\", () => {\n muteButton.style.transform = \"scale(1)\";\n });\n titleSection.appendChild(muteButton);\n\n // Voice Mode Badge\n if (isVoiceMode) {\n const voiceBadge = document.createElement(\"span\");\n voiceBadge.textContent = \"VOICE\";\n voiceBadge.style.cssText = `\n font-size: 10px;\n color: var(--convai-accent, ${aeroTheme.colors.convai.light});\n font-weight: 500;\n margin-left: 8px;\n padding: 2px 6px;\n border-radius: 4px;\n background-color: ${aeroTheme.colors.convai.light}20;\n `;\n titleSection.appendChild(voiceBadge);\n }\n\n // Speaking tag (top bar, same style as React)\n if (client.state.isSpeaking) {\n const speakingTag = document.createElement(\"span\");\n speakingTag.textContent = \"SPEAKING\";\n speakingTag.style.cssText = `\n font-size: 10px;\n color: #10b981;\n font-weight: 600;\n margin-left: 8px;\n padding: 3px 8px;\n border-radius: 6px;\n background-color: #10b98120;\n border: 1px solid #10b98140;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n `;\n const dot = document.createElement(\"span\");\n dot.style.cssText = `\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: #10b981;\n display: inline-block;\n `;\n speakingTag.insertBefore(dot, speakingTag.firstChild);\n titleSection.appendChild(speakingTag);\n }\n\n // Listening tag (top bar, when user is speaking)\n if (client.state.isListening && !client.state.isSpeaking) {\n const listeningTag = document.createElement(\"span\");\n listeningTag.textContent = \"LISTENING\";\n listeningTag.style.cssText = `\n font-size: 10px;\n color: #3b82f6;\n font-weight: 600;\n margin-left: 8px;\n padding: 3px 8px;\n border-radius: 6px;\n background-color: #3b82f620;\n border: 1px solid #3b82f640;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n `;\n const dot = document.createElement(\"span\");\n dot.style.cssText = `\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: #3b82f6;\n display: inline-block;\n `;\n listeningTag.insertBefore(dot, listeningTag.firstChild);\n titleSection.appendChild(listeningTag);\n }\n\n // Every call site that refreshes the header (stateChange, botReady,\n // connect/disconnect via stateChange, character-info fetch, ...) also\n // needs the connecting overlay re-evaluated -- it depends on the same\n // `isConnected`/`isBotReady`/`characterName` inputs.\n updateConnectingOverlay();\n updateVoiceModeAvatar();\n };\n\n // Create message list\n const createMessageList = (): HTMLDivElement => {\n const list = document.createElement(\"div\");\n list.id = \"convai-message-list\";\n list.setAttribute(\"part\", \"messages\");\n list.style.cssText = `\n display: flex;\n flex-direction: column;\n gap: 12px;\n min-height: 100%;\n `;\n return list;\n };\n\n // Create footer\n const createFooter = (): HTMLDivElement => {\n const footer = document.createElement(\"div\");\n footer.style.cssText = `\n padding: 16px;\n border-top: 1px solid ${aeroTheme.colors.neutral[200]};\n background: var(--convai-panel-bg, white);\n display: flex;\n gap: 8px;\n align-items: center;\n position: relative;\n `;\n\n // Voice Mode Exit Button (Initially hidden)\n const voiceExitButton = document.createElement(\"button\");\n voiceExitButton.id = \"convai-voice-exit-btn\";\n refs.voiceExitBtn = voiceExitButton;\n const exitIcon = Icons.PhoneOff(\"md\");\n voiceExitButton.appendChild(exitIcon);\n voiceExitButton.style.cssText = `\n width: 36px;\n height: 36px;\n border-radius: 50%;\n background: ${aeroTheme.colors.error[500]};\n color: white;\n display: none; /* Hidden by default */\n align-items: center;\n justify-content: center;\n cursor: pointer;\n margin: 0 auto;\n border: none;\n `;\n voiceExitButton.addEventListener(\"click\", () => {\n // Deliberately a *sync* listener. It used to be `async` with a bare\n // `await client.audioControls.muteAudio()` and no try/catch: on the\n // LiveKit path that call rethrows when the room has dropped, so a\n // network blip mid-call plus a tap on exit leaked an unhandled\n // rejection onto the host page *and* skipped the two lines below,\n // stranding the user in the voice overlay with no way out.\n //\n // The mute is not dropped -- `applyVoiceMode()` -> `updateVoiceMode()`\n // performs it (conditionally, if the mic is live) inside the exit\n // branch, where a failure is now reported rather than fatal. Exiting\n // the UI is unconditional either way: the overlay must never outlive\n // the user's decision to leave it.\n client.sendInterruptMessage();\n isVoiceMode = false;\n applyVoiceMode();\n });\n footer.appendChild(voiceExitButton);\n\n // Standard Footer Content (Mic + Input)\n const standardContent = document.createElement(\"div\");\n standardContent.id = \"convai-footer-standard\";\n refs.footerStandard = standardContent;\n standardContent.style.cssText = `\n display: flex;\n gap: 8px;\n align-items: center;\n width: 100%;\n `;\n\n // Input container (microphone button removed from text mode)\n const inputContainer = document.createElement(\"div\");\n inputContainer.style.cssText = `\n flex: 1;\n position: relative;\n display: flex;\n align-items: center;\n `;\n\n inputElement = document.createElement(\"input\");\n inputElement.setAttribute(\"part\", \"input\");\n inputElement.type = \"text\";\n inputElement.placeholder = \"Conversation\";\n inputElement.style.cssText = `\n width: 100%;\n padding: 12px 44px 12px 16px;\n border-radius: ${aeroTheme.borderRadius.full};\n border: 1px solid ${aeroTheme.colors.neutral[300]};\n background: ${aeroTheme.colors.glass.medium};\n color: var(--convai-panel-fg, ${aeroTheme.colors.text.primary});\n font-size: ${aeroTheme.typography.fontSize.sm};\n transition: ${aeroTheme.transitions.fast};\n outline: none;\n `;\n inputElement.addEventListener(\"input\", (e) => {\n inputValue = (e.target as HTMLInputElement).value;\n updateSendButton();\n });\n inputElement.addEventListener(\"keypress\", (e) => {\n if (e.key === \"Enter\") handleSend();\n });\n\n // Send button\n const sendButton = document.createElement(\"button\");\n sendButton.id = \"convai-send-button\";\n // This button is dual-role -- it sends text when the input has a draft,\n // and toggles voice mode when empty -- but there is no separate mic\n // element, so only the send-button part applies. `mic-button` is\n // reserved for a future version that splits the two; see parts.test.ts.\n sendButton.setAttribute(\"part\", \"send-button\");\n refs.sendButton = sendButton;\n const sendIcon = Icons.Send(\"md\");\n sendButton.appendChild(sendIcon);\n sendButton.style.cssText = `\n position: absolute;\n right: 6px;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n background: transparent; /* Initial transparent for voice toggle */\n color: var(--convai-panel-fg, ${aeroTheme.colors.text.primary});\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: ${aeroTheme.transitions.fast};\n border: none;\n `;\n sendButton.addEventListener(\"click\", async () => {\n if (inputValue.length > 0) {\n handleSend();\n } else if (\n !requestPublicationGrant &&\n client.connectionType !== \"text\"\n ) {\n // Toggle Voice Mode\n client.sendInterruptMessage();\n try {\n await client.audioControls.unmuteAudio(); // Unmute on enter\n isVoiceMode = true;\n // Awaited so this try/catch actually covers it -- bare, the promise\n // escaped the block it looks like it belongs to.\n await updateVoiceMode();\n } catch (error) {\n // isVoiceMode is only flipped after a successful unmute, so a\n // denial here leaves the widget in text mode, not stranded\n // mid-transition into voice mode.\n reportMicFailure(client, \"Failed to enable microphone:\", error);\n }\n }\n });\n\n inputContainer.appendChild(inputElement);\n inputContainer.appendChild(sendButton);\n standardContent.appendChild(inputContainer);\n footer.appendChild(standardContent);\n\n return footer;\n };\n\n // Create settings tray - Matches React SettingsTray component exactly\n const createSettingsTray = (): HTMLDivElement => {\n const tray = document.createElement(\"div\");\n tray.setAttribute(\"data-settings-tray\", \"true\");\n tray.style.cssText = `\n position: absolute;\n top: 60px;\n right: 16px;\n background: var(--convai-panel-bg, white);\n border-radius: ${aeroTheme.borderRadius.xl};\n box-shadow: ${aeroTheme.shadows.xl};\n padding: 0;\n display: none;\n flex-direction: row;\n align-items: center;\n gap: 0;\n z-index: 9999;\n min-width: auto;\n transform-origin: top right;\n animation: popIn 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n overflow: hidden;\n `;\n\n // Add animation keyframes if not present\n injectKeyframes(styleTarget);\n\n // Horizontal Settings Row Container\n const settingsRow = document.createElement(\"div\");\n settingsRow.style.cssText = `\n display: flex;\n flex-direction: row;\n align-items: center;\n padding: 8px;\n gap: 4px;\n `;\n\n const createOption = (\n icon: HTMLElement | SVGSVGElement,\n label: string,\n onClick: () => void,\n isActive: boolean = false,\n isDestructive: boolean = false,\n ) => {\n const btn = document.createElement(\"div\");\n btn.style.cssText = `\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n padding: 8px 12px;\n cursor: pointer;\n border-radius: ${aeroTheme.borderRadius.md};\n background-color: ${\n isActive\n ? \"rgba(16, 185, 129, 0.15)\"\n : isDestructive\n ? \"rgba(239, 68, 68, 0.1)\"\n : \"transparent\"\n };\n color: ${\n isActive\n ? \"#10b981\"\n : isDestructive\n ? \"#ef4444\"\n : `var(--convai-panel-fg, ${aeroTheme.colors.text.primary})`\n };\n transition: ${aeroTheme.transitions.fast};\n min-width: 50px;\n `;\n\n // Icon container\n const iconContainer = document.createElement(\"div\");\n iconContainer.appendChild(icon);\n btn.appendChild(iconContainer);\n\n const span = document.createElement(\"span\");\n span.textContent = label;\n span.style.cssText = `\n font-size: 10px;\n font-weight: 500;\n `;\n btn.appendChild(span);\n\n btn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n onClick();\n });\n\n btn.addEventListener(\"mouseover\", () => {\n btn.style.transform = \"scale(1.02)\";\n if (!isActive && !isDestructive) {\n btn.style.backgroundColor = aeroTheme.colors.neutral[100];\n }\n });\n btn.addEventListener(\"mouseout\", () => {\n btn.style.transform = \"scale(1)\";\n btn.style.backgroundColor = isActive\n ? \"rgba(16, 185, 129, 0.15)\"\n : isDestructive\n ? \"rgba(239, 68, 68, 0.1)\"\n : \"transparent\";\n });\n\n return btn;\n };\n\n // Reset\n const resetIcon = Icons.Redo(\"md\");\n resetIcon.style.width = \"18px\";\n resetIcon.style.height = \"18px\";\n if (!client.isPublishedChatSession || requestPublicationGrant) {\n settingsRow.appendChild(createOption(resetIcon, \"Reset\", handleReset));\n }\n\n // Video - only show if connection type is video\n const connectionType = client.connectionType;\n if (connectionType === \"video\" && showVideo) {\n const videoIcon = isVideoVisible\n ? Icons.Video(\"md\")\n : Icons.VideoOff(\"md\");\n videoIcon.style.width = \"18px\";\n videoIcon.style.height = \"18px\";\n const videoBtn = createOption(\n videoIcon,\n \"Video\",\n handleToggleVideo,\n isVideoVisible,\n );\n videoBtn.id = \"convai-settings-video-btn\";\n refs.settingsVideoBtn = videoBtn;\n settingsRow.appendChild(videoBtn);\n }\n\n // Screen Share - only show if connection type is video\n if (connectionType === \"video\" && showScreenShare) {\n const isSharing = client.screenShareControls.isScreenShareActive;\n const shareIcon = isSharing\n ? Icons.StopScreenShare(\"md\")\n : Icons.ScreenShare(\"md\");\n shareIcon.style.width = \"18px\";\n shareIcon.style.height = \"18px\";\n const shareBtn = createOption(\n shareIcon,\n \"Screen\",\n handleToggleScreenShare,\n isSharing,\n );\n shareBtn.id = \"convai-settings-share-btn\";\n refs.settingsShareBtn = shareBtn;\n settingsRow.appendChild(shareBtn);\n }\n\n // Disconnect\n const disconnectIcon = document.createElement(\"span\");\n disconnectIcon.innerHTML = \"⏻\";\n disconnectIcon.style.fontSize = \"18px\";\n if (!client.isPublishedChatSession || requestPublicationGrant) {\n settingsRow.appendChild(\n createOption(disconnectIcon, \"Disconnect\", handleDisconnect, false, true),\n );\n }\n\n tray.appendChild(settingsRow);\n return tray;\n };\n\n // Update settings tray content to reflect current connection state\n const updateSettingsTray = () => {\n const settingsRow = settingsTray.querySelector(\"div\");\n if (!settingsRow) return;\n\n // Clear existing content\n settingsRow.innerHTML = \"\";\n\n const createOption = (\n icon: HTMLElement | SVGSVGElement,\n label: string,\n onClick: () => void,\n isActive: boolean = false,\n isDestructive: boolean = false,\n ) => {\n const btn = document.createElement(\"div\");\n btn.style.cssText = `\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n padding: 8px 12px;\n cursor: pointer;\n border-radius: ${aeroTheme.borderRadius.md};\n background-color: ${\n isActive\n ? \"rgba(16, 185, 129, 0.15)\"\n : isDestructive\n ? \"rgba(239, 68, 68, 0.1)\"\n : \"transparent\"\n };\n color: ${\n isActive\n ? \"#10b981\"\n : isDestructive\n ? \"#ef4444\"\n : `var(--convai-panel-fg, ${aeroTheme.colors.text.primary})`\n };\n transition: ${aeroTheme.transitions.fast};\n min-width: 50px;\n `;\n\n // Icon container\n const iconContainer = document.createElement(\"div\");\n iconContainer.appendChild(icon);\n btn.appendChild(iconContainer);\n\n const span = document.createElement(\"span\");\n span.textContent = label;\n span.style.cssText = `\n font-size: 10px;\n font-weight: 500;\n `;\n btn.appendChild(span);\n\n btn.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n onClick();\n });\n\n btn.addEventListener(\"mouseover\", () => {\n btn.style.transform = \"scale(1.02)\";\n if (!isActive && !isDestructive) {\n btn.style.backgroundColor = aeroTheme.colors.neutral[100];\n }\n });\n btn.addEventListener(\"mouseout\", () => {\n btn.style.transform = \"scale(1)\";\n btn.style.backgroundColor = isActive\n ? \"rgba(16, 185, 129, 0.15)\"\n : isDestructive\n ? \"rgba(239, 68, 68, 0.1)\"\n : \"transparent\";\n });\n\n return btn;\n };\n\n // Reset\n const resetIcon = Icons.Redo(\"md\");\n resetIcon.style.width = \"18px\";\n resetIcon.style.height = \"18px\";\n if (!client.isPublishedChatSession || requestPublicationGrant) {\n settingsRow.appendChild(createOption(resetIcon, \"Reset\", handleReset));\n }\n\n // Video - Always show if showVideo is true and connection type is video\n const connectionType = client.connectionType;\n if (connectionType === \"video\" && showVideo) {\n const videoIcon = isVideoVisible\n ? Icons.Video(\"md\")\n : Icons.VideoOff(\"md\");\n videoIcon.style.width = \"18px\";\n videoIcon.style.height = \"18px\";\n const videoBtn = createOption(\n videoIcon,\n \"Video\",\n handleToggleVideo,\n isVideoVisible,\n );\n videoBtn.id = \"convai-settings-video-btn\";\n refs.settingsVideoBtn = videoBtn;\n settingsRow.appendChild(videoBtn);\n }\n\n // Screen Share - Always show if showScreenShare is true and connection type is video\n if (connectionType === \"video\" && showScreenShare) {\n const isSharing = client.screenShareControls.isScreenShareActive;\n const shareIcon = isSharing\n ? Icons.StopScreenShare(\"md\")\n : Icons.ScreenShare(\"md\");\n shareIcon.style.width = \"18px\";\n shareIcon.style.height = \"18px\";\n const shareBtn = createOption(\n shareIcon,\n \"Screen\",\n handleToggleScreenShare,\n isSharing,\n );\n shareBtn.id = \"convai-settings-share-btn\";\n refs.settingsShareBtn = shareBtn;\n settingsRow.appendChild(shareBtn);\n }\n\n // Disconnect\n const disconnectIcon = document.createElement(\"span\");\n disconnectIcon.innerHTML = \"⏻\";\n disconnectIcon.style.fontSize = \"18px\";\n if (!client.isPublishedChatSession || requestPublicationGrant) {\n settingsRow.appendChild(\n createOption(disconnectIcon, \"Disconnect\", handleDisconnect, false, true),\n );\n }\n };\n\n // Create floating video - Matches React FloatingVideo component\n const createFloatingVideo = (): HTMLDivElement => {\n const container = document.createElement(\"div\");\n container.id = \"floating-video-container\";\n // NOTE on z-index: deliberately NOT themable. `--convai-z-index` drives the\n // widget root only. Both elements are `position: fixed` and this one is\n // appended *before* the widget root, so on a tie the widget paints on top:\n // a host raising the token to clear their nav bar would hide the user's own\n // camera preview behind the panel. Video/screen share are also out of scope\n // for the embed, which is chat-only.\n container.style.cssText = `\n position: fixed;\n left: 20px;\n top: 20px;\n z-index: 10000;\n width: 320px;\n border-radius: ${aeroTheme.borderRadius.lg};\n overflow: hidden;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);\n cursor: grab;\n display: none;\n transition: opacity 0.4s cubic-bezier(0.4, 0, 0.2, 1), transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n `;\n\n const wrapper = document.createElement(\"div\");\n wrapper.style.cssText = `\n background: rgba(15, 23, 42, 0.95);\n backdrop-filter: blur(20px);\n border: 1px solid ${aeroTheme.colors.neutral[700]};\n border-radius: ${aeroTheme.borderRadius.lg};\n overflow: hidden;\n `;\n\n // Header\n const header = document.createElement(\"div\");\n header.style.cssText = `\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 8px 12px;\n background: rgba(0, 0, 0, 0.3);\n border-bottom: 1px solid ${aeroTheme.colors.neutral[700]};\n `;\n\n const headerLeft = document.createElement(\"div\");\n headerLeft.style.cssText = `\n display: flex;\n align-items: center;\n gap: 8px;\n color: ${aeroTheme.colors.neutral[300]};\n font-size: 12px;\n font-weight: 500;\n `;\n\n const dragIcon = Icons.DragIndicator(\"sm\");\n dragIcon.style.width = \"16px\";\n dragIcon.style.height = \"16px\";\n headerLeft.appendChild(dragIcon);\n\n const label = document.createElement(\"span\");\n label.textContent = \"Your Camera\";\n headerLeft.appendChild(label);\n\n const closeButton = document.createElement(\"button\");\n closeButton.innerHTML = \"\";\n const closeIcon = Icons.Close(\"md\");\n closeIcon.style.width = \"20px\";\n closeIcon.style.height = \"20px\";\n closeButton.appendChild(closeIcon);\n closeButton.style.cssText = `\n background: transparent;\n border: none;\n color: ${aeroTheme.colors.neutral[400]};\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 4px;\n transition: transform 0.1s ease-out;\n `;\n closeButton.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n client.videoControls.disableVideo();\n });\n closeButton.addEventListener(\"mouseenter\", () => {\n closeButton.style.transform = \"scale(1.1)\";\n });\n closeButton.addEventListener(\"mouseleave\", () => {\n closeButton.style.transform = \"scale(1)\";\n });\n\n header.appendChild(headerLeft);\n header.appendChild(closeButton);\n\n // Video Container\n const videoContainer = document.createElement(\"div\");\n videoContainer.style.cssText = `\n position: relative;\n width: 100%;\n padding-bottom: 75%;\n background: #000;\n `;\n\n const videoWrapper = document.createElement(\"div\");\n videoWrapper.id = \"floating-video-wrapper\";\n videoWrapper.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n `;\n\n const videoElement = document.createElement(\"video\");\n videoElement.id = \"floating-video-element\";\n videoElement.autoplay = true;\n videoElement.playsInline = true;\n videoElement.muted = true;\n videoElement.style.cssText = `\n width: 100%;\n height: 100%;\n object-fit: cover;\n transform: scaleX(-1);\n `;\n\n // Camera off placeholder\n const cameraOffPlaceholder = document.createElement(\"div\");\n cameraOffPlaceholder.id = \"camera-off-placeholder\";\n cameraOffPlaceholder.style.cssText = `\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n color: ${aeroTheme.colors.neutral[400]};\n gap: 12px;\n background: #000;\n `;\n const cameraOffIcon = Icons.VideoOff(\"lg\");\n cameraOffIcon.style.width = \"48px\";\n cameraOffIcon.style.height = \"48px\";\n cameraOffPlaceholder.appendChild(cameraOffIcon);\n const cameraOffText = document.createElement(\"span\");\n cameraOffText.textContent = \"Camera is off\";\n cameraOffText.style.cssText = `\n font-size: 14px;\n text-align: center;\n `;\n cameraOffPlaceholder.appendChild(cameraOffText);\n\n videoWrapper.appendChild(videoElement);\n videoWrapper.appendChild(cameraOffPlaceholder);\n videoContainer.appendChild(videoWrapper);\n\n wrapper.appendChild(header);\n wrapper.appendChild(videoContainer);\n container.appendChild(wrapper);\n\n // Add drag functionality\n let isDragging = false;\n let startX = 0;\n let startY = 0;\n let startLeft = 20;\n let startTop = 20;\n\n const handleMouseDown = (e: MouseEvent) => {\n if ((e.target as HTMLElement).closest(\"button\")) return;\n isDragging = true;\n startX = e.clientX;\n startY = e.clientY;\n const style = window.getComputedStyle(container);\n startLeft = parseInt(style.left);\n startTop = parseInt(style.top);\n container.style.cursor = \"grabbing\";\n e.preventDefault();\n };\n\n const handleMouseMove = (e: MouseEvent) => {\n if (!isDragging) return;\n const deltaX = e.clientX - startX;\n const deltaY = e.clientY - startY;\n const newLeft = startLeft + deltaX;\n const newTop = startTop + deltaY;\n\n // Keep within bounds\n const maxX = window.innerWidth - 320;\n const maxY = window.innerHeight - 240;\n const boundedLeft = Math.max(0, Math.min(newLeft, maxX));\n const boundedTop = Math.max(0, Math.min(newTop, maxY));\n\n container.style.left = `${boundedLeft}px`;\n container.style.top = `${boundedTop}px`;\n };\n\n const handleMouseUp = () => {\n if (isDragging) {\n isDragging = false;\n container.style.cursor = \"grab\";\n }\n };\n\n container.addEventListener(\"mousedown\", handleMouseDown);\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n\n return container;\n };\n\n // Event handlers\n const handleToggle = async () => {\n if (isDestroyed) return;\n\n if (isOpen || pendingOpen) {\n // Already open, or an open is already in flight: nothing to do. The\n // `pendingOpen` half is what keeps a repeat call from falling through\n // to the `isConnecting` branch below and opening the panel *before* the\n // connect it is waiting on has finished.\n return;\n }\n\n // Connect on first click if not already connected/connecting\n if (!client.state.isConnected && !client.state.isConnecting) {\n pendingOpen = true;\n try {\n if (requestPublicationGrant || client.isPublishedChatSession) {\n if (!requestPublicationGrant) {\n throw new Error(\n \"Published chat widgets require requestPublicationGrant to start a new session\",\n );\n }\n if (!client.connectWithPublicationGrant) {\n throw new Error(\n \"This Convai client does not support published chat connections\",\n );\n }\n const launchToken = await requestPublicationGrant();\n // destroy() can run while the grant endpoint is in flight. A one-time\n // grant must not start a session for a widget which no longer exists.\n if (isDestroyed) {\n return;\n }\n await client.connectWithPublicationGrant(\n launchToken,\n freshPublicationGrantOptions(publishedChatConnectOptions),\n );\n } else if (hasConnectedBefore && typeof client.reconnect === \"function\") {\n await client.reconnect();\n } else {\n await client.connect();\n }\n if (isDestroyed) {\n // destroy() can also run after the grant is exchanged but before\n // Core or LiveKit finishes connecting. Disconnect that late session\n // instead of leaving an invisible room alive.\n await client.disconnect();\n return;\n }\n // Re-checked *after* the await: a close()/toggle()/launcher click\n // during the connect clears the flag, and that cancellation has to\n // win. The client stays connected either way -- only the panel is\n // held back -- so a later open() takes the already-connected branch\n // and opens instantly.\n if (isDestroyed) {\n // destroy() can also run after the grant is exchanged but before\n // Core or LiveKit finishes connecting. Disconnect that late session\n // instead of leaving an invisible room alive.\n await client.disconnect();\n return;\n }\n if (!pendingOpen) return;\n setIsOpen(true);\n } catch (error) {\n if (!isDestroyed) {\n console.error(\"Failed to connect:\", error);\n }\n } finally {\n pendingOpen = false;\n }\n } else {\n // Just toggle open/close if already connected\n setIsOpen(!isOpen);\n }\n };\n\n /** A launcher click while an open is pending means \"cancel\", same as `toggle()`. */\n const handleLauncherClick = () => {\n if (pendingOpen) {\n handleClose();\n return;\n }\n void handleToggle();\n };\n\n const handleClose = () => {\n // Cancels an in-flight open as well as closing an open panel; see\n // `pendingOpen`. `setIsOpen(false)` on an already-closed widget just\n // re-applies the collapsed styles, so this is safe in both cases.\n pendingOpen = false;\n setIsOpen(false);\n };\n\n // Published sessions must wait for Core's bot-ready handshake. A normal\n // authenticated text session still gets the text-only UI, but can send as\n // soon as it connects.\n const requiresBotReadyForText = () =>\n Boolean(requestPublicationGrant) || Boolean(client.isPublishedChatSession);\n const isTextInputReady = () =>\n client.state.isConnected &&\n (!requiresBotReadyForText() || client.isBotReady);\n\n const handleSend = () => {\n if (inputValue.trim() && isTextInputReady()) {\n client.sendUserTextMessage(inputValue);\n inputValue = \"\";\n inputElement.value = \"\";\n updateSendButton();\n }\n };\n\n // Microphone toggle removed - only controlled via voice mode now\n\n const handleToggleMute = () => {\n isMuted = !isMuted;\n\n if (client.room) {\n const remoteParticipants = Array.from(\n client.room.remoteParticipants.values(),\n );\n remoteParticipants.forEach((participant: any) => {\n participant.audioTrackPublications.forEach((publication: any) => {\n if (publication.track) {\n publication.track.setMuted(isMuted);\n }\n });\n });\n }\n\n updateHeader();\n };\n\n const handleReset = async () => {\n setIsSettingsOpen(false);\n try {\n await client.disconnect();\n client.resetSession();\n isMuted = false;\n isVoiceMode = false;\n hasEnteredDefaultVoiceMode = false;\n updateHeader();\n await updateVoiceMode();\n updateSendButton();\n } catch (error) {\n console.error(\"Failed to reset:\", error);\n }\n };\n\n const handleDisconnect = async () => {\n setIsSettingsOpen(false);\n await client.disconnect();\n isMuted = false;\n isVoiceMode = false;\n hasEnteredDefaultVoiceMode = false;\n updateHeader();\n // Not awaited: this function has no try/catch of its own and is wired\n // straight to a click, so awaiting would only move a rejection from one\n // unguarded place to another. See the note on `handleDisconnect`'s own\n // `await client.disconnect()` in the fix report.\n applyVoiceMode();\n updateSendButton();\n };\n\n const handleToggleVideo = async () => {\n if (client.connectionType !== \"video\") return;\n\n try {\n if (isVideoVisible) {\n await client.videoControls.disableVideo();\n } else {\n await client.videoControls.enableVideo();\n }\n // State will be updated via event listener below\n } catch (e) {\n console.error(\"Failed to toggle video:\", e);\n }\n };\n\n const handleToggleScreenShare = async () => {\n try {\n await client.screenShareControls.toggleScreenShare();\n // State will be updated via event listener above\n } catch (e) {\n console.error(\"Failed to toggle screen share:\", e);\n }\n };\n\n const handleSettingsToggle = () => {\n // Regenerate settings tray content BEFORE opening to reflect current connection type\n if (!isSettingsOpen) {\n updateSettingsTray();\n }\n\n setIsSettingsOpen(!isSettingsOpen);\n };\n\n // Update functions\n const setIsOpen = async (open: boolean) => {\n isOpen = open;\n\n if (open) {\n morphingContainer.style.width = `${PANEL_W_PX}px`;\n morphingContainer.style.height = `${PANEL_H_PX}px`;\n morphingContainer.style.borderRadius = `var(--convai-radius, ${aeroTheme.borderRadius.xl})`;\n morphingContainer.style.cursor = \"default\";\n\n // The open panel is a *different* glass treatment from the launcher\n // bubble, matching the React widget: near-opaque and saturated, so the\n // host page does not bleed through. At the bubble's 0.8 alpha a dark\n // host page shows through the panel and reads as grey.\n morphingContainer.style.background =\n \"var(--convai-panel-bg, rgba(252, 252, 253, 0.95))\";\n morphingContainer.style.backdropFilter = \"blur(20px) saturate(180%)\";\n\n buttonContent.style.opacity = \"0\";\n buttonContent.style.transform = \"scale(0.8)\";\n buttonContent.style.pointerEvents = \"none\";\n\n chatContent.style.opacity = \"1\";\n chatContent.style.transform = \"scale(1)\";\n chatContent.style.pointerEvents = \"auto\";\n\n // Auto-enter voice mode if defaultVoiceMode is true and not already entered\n if (\n defaultVoiceMode &&\n !requestPublicationGrant &&\n client.connectionType !== \"text\" &&\n !hasEnteredDefaultVoiceMode &&\n client.state.isConnected\n ) {\n setTimeout(async () => {\n try {\n await client.audioControls.unmuteAudio();\n isVoiceMode = true;\n hasEnteredDefaultVoiceMode = true;\n await updateVoiceMode();\n } catch (error) {\n reportMicFailure(client, \"Failed to enter voice mode on open:\", error);\n }\n }, 100);\n }\n } else {\n morphingContainer.style.width = \"var(--convai-launcher-size, 64px)\";\n morphingContainer.style.height = \"var(--convai-launcher-size, 64px)\";\n // Literal, not `--convai-radius` — see the creation site: that token is\n // the *panel* radius, and reusing it here would squircle the launcher.\n morphingContainer.style.borderRadius = \"50%\";\n morphingContainer.style.cursor = \"pointer\";\n\n // Back to the launcher bubble's lighter glass — see the open branch.\n morphingContainer.style.background = `var(--convai-panel-bg, ${aeroTheme.colors.glass.backdrop})`;\n morphingContainer.style.backdropFilter = aeroTheme.glass.backdrop;\n\n buttonContent.style.opacity = \"1\";\n buttonContent.style.transform = \"scale(1)\";\n buttonContent.style.pointerEvents = \"auto\";\n\n chatContent.style.opacity = \"0\";\n chatContent.style.transform = \"scale(0.8)\";\n chatContent.style.pointerEvents = \"none\";\n }\n };\n\n const setIsSettingsOpen = (open: boolean) => {\n isSettingsOpen = open;\n settingsTray.style.display = open ? \"flex\" : \"none\";\n };\n\n const updateSendButton = () => {\n const sendButton = refs.sendButton;\n if (!sendButton) return;\n\n // Clear previous content\n sendButton.innerHTML = \"\";\n\n // A published session must wait for Core's bot-ready handshake before\n // accepting text. Preserve the established interactive-widget behavior\n // for authenticated voice/video sessions.\n const isPublishedTextChat = requiresBotReadyForText();\n const textInputReady = isTextInputReady();\n inputElement.disabled = isPublishedTextChat && !textInputReady;\n\n if (\n inputValue.length > 0 ||\n requestPublicationGrant ||\n client.connectionType === \"text\"\n ) {\n // Show Send Button\n sendButton.appendChild(Icons.Send(\"md\"));\n sendButton.style.background = `var(--convai-accent, ${aeroTheme.colors.text.primary})`;\n // The label sits *on* the accent fill, so it must follow the panel\n // surface colour rather than stay a hardcoded \"white\" -- a host setting\n // a pale --convai-accent would otherwise get white-on-white. `white` is\n // byte-identical to the fallback --convai-panel-bg already carries at\n // its three other sites, so the default rendering is unchanged.\n // Pairing requirement for hosts: --convai-accent and --convai-panel-bg\n // must contrast with each other, since this is the one place they meet.\n sendButton.style.color = \"var(--convai-panel-bg, white)\";\n sendButton.style.border = \"none\";\n sendButton.disabled =\n isPublishedTextChat && (inputValue.length === 0 || !textInputReady);\n if (isPublishedTextChat) {\n sendButton.style.opacity =\n inputValue.length > 0 && textInputReady ? \"1\" : \"0.5\";\n sendButton.title = textInputReady\n ? inputValue.length > 0\n ? \"Send\"\n : \"Type a message\"\n : \"Waiting for character\";\n } else {\n sendButton.title = \"Send\";\n }\n } else {\n // Show Voice Mode Toggle\n sendButton.appendChild(Icons.Waveform(\"md\"));\n sendButton.style.background = \"transparent\";\n sendButton.style.color = `var(--convai-panel-fg, ${aeroTheme.colors.text.primary})`;\n sendButton.style.border = `1px solid ${aeroTheme.colors.neutral[300]}`;\n sendButton.style.opacity = \"1\";\n sendButton.disabled = false;\n sendButton.title = \"Voice Mode\";\n }\n };\n\n const updateVideoTrack = () => {\n if (!floatingVideo || !client.room || !client.room.localParticipant) return;\n\n const videoEl = floatingVideo.querySelector(\n \"#floating-video-element\",\n ) as HTMLVideoElement;\n const placeholder = floatingVideo.querySelector(\n \"#camera-off-placeholder\",\n ) as HTMLElement;\n\n if (!videoEl || !placeholder) return;\n\n if (isVideoVisible && !isVoiceMode) {\n const tracks = Array.from(\n client.room.localParticipant.videoTrackPublications.values(),\n );\n const videoPub = tracks.find((t: any) => t.kind === \"video\");\n\n if (videoPub && videoPub.track) {\n videoPub.track.attach(videoEl);\n videoEl.style.display = \"block\";\n placeholder.style.display = \"none\";\n } else {\n videoEl.style.display = \"none\";\n placeholder.style.display = \"flex\";\n }\n } else {\n videoEl.style.display = \"none\";\n placeholder.style.display = \"flex\";\n }\n };\n\n const updateVoiceMode = async () => {\n const standardFooter = refs.footerStandard;\n const voiceExitBtn = refs.voiceExitBtn;\n\n if (isVoiceMode) {\n // Show Voice Overlay\n if (voiceModeOverlay) voiceModeOverlay.style.display = \"flex\";\n if (messageListElement) messageListElement.style.display = \"none\";\n if (floatingVideo) floatingVideo.style.display = \"none\";\n\n // Footer: Show Exit Button, Hide Standard\n if (standardFooter) standardFooter.style.display = \"none\";\n if (voiceExitBtn) voiceExitBtn.style.display = \"flex\";\n if (footerElement) footerElement.style.justifyContent = \"center\";\n\n // Update header to show VOICE badge\n updateHeader();\n\n // Reset animation state for voice mode\n startTime = Date.now();\n\n // Start Audio Analysis\n startAudioAnalysis();\n } else {\n // Ensure microphone is muted when not in voice mode.\n //\n // This await is the only one in this function that can reject, and\n // everything below it -- hiding the overlay, restoring the standard\n // footer, updating the header, stopping the analyser -- is the only\n // route out of the voice UI. So a failed mute must never short-circuit\n // it: report it and carry on tearing the overlay down. (LiveKit's\n // setMicrophoneEnabled(false) rethrows on a dropped room, which is\n // exactly when the user is most likely to be hitting exit.)\n if (!client.audioControls.isAudioMuted) {\n try {\n await client.audioControls.muteAudio();\n } catch (error) {\n reportMicFailure(client, \"Failed to mute microphone:\", error);\n }\n }\n\n // Hide Overlay\n if (voiceModeOverlay) voiceModeOverlay.style.display = \"none\";\n\n // Show Video or Message List\n if (isVideoVisible) {\n if (messageListElement) messageListElement.style.display = \"none\";\n if (floatingVideo) floatingVideo.style.display = \"block\";\n updateVideoTrack();\n } else {\n if (messageListElement) messageListElement.style.display = \"flex\";\n if (floatingVideo) floatingVideo.style.display = \"none\";\n }\n\n // Footer: Show Standard, Hide Exit\n if (standardFooter) standardFooter.style.display = \"flex\";\n if (voiceExitBtn) voiceExitBtn.style.display = \"none\";\n if (footerElement) footerElement.style.justifyContent = \"flex-start\";\n\n // Update header to hide VOICE badge\n updateHeader();\n\n // Stop Audio Analysis\n stopAudioAnalysis();\n }\n };\n\n /**\n * Fire-and-forget `updateVoiceMode()` for the call sites that are\n * synchronous (DOM listeners, the constructor tail) and therefore have no\n * caller to catch anything it rejects with.\n *\n * `updateVoiceMode()` is `async`, so a bare call there would put a floating\n * promise on the host page. Its one rejecting await is now guarded\n * internally, which makes this belt-and-braces -- but it is the guarantee\n * that keeps a future await added inside `updateVoiceMode()` from silently\n * reintroducing the unhandled rejection this replaces. Routed through\n * `reportMicFailure` so a failure is observable on the client's `error`\n * channel rather than console-only.\n */\n const applyVoiceMode = (): void => {\n void updateVoiceMode().catch((error) => {\n reportMicFailure(client, \"Failed to apply voice mode:\", error);\n });\n };\n\n // Microphone button removed - only controlled via voice mode now\n\n // Helper for Markdown - matches React MarkdownRenderer.tsx\n const renderMarkdown = (text: string, container: HTMLElement) => {\n if (!text) return;\n\n // Handle both actual newlines and \\n escape sequences\n const normalizedText = text.replace(/\\\\n/g, \"\\n\");\n const lines = normalizedText.split(\"\\n\");\n\n lines.forEach((line, lineIndex) => {\n // Process markdown within each line\n // Bold, italic, links, images and bare URLs — see utils/inlineMarkdown.\n const mediaPreview = (src: string, alt: string, media: MediaKind) => {\n const el =\n media === \"image\"\n ? Object.assign(document.createElement(\"img\"), { src, alt, loading: \"lazy\" })\n : Object.assign(document.createElement(\"video\"), { src, controls: true, preload: \"metadata\" });\n el.setAttribute(\"part\", \"message-media\");\n el.style.cssText = `\n display: block;\n max-width: 100%;\n max-height: 240px;\n margin-top: 6px;\n border-radius: 8px;\n `;\n return el;\n };\n\n const processLine = (text: string): (HTMLElement | Text)[] => {\n const parts: (HTMLElement | Text)[] = [];\n for (const node of parseInlineMarkdown(text)) {\n switch (node.kind) {\n case \"strong\": {\n // matches React UserBubble styling\n const strong = document.createElement(\"strong\");\n strong.textContent = node.text;\n strong.style.cssText = `\n font-weight: 600;\n color: var(--convai-panel-fg, ${aeroTheme.colors.text.primary});\n `;\n parts.push(strong);\n break;\n }\n case \"em\": {\n const em = document.createElement(\"em\");\n em.textContent = node.text;\n em.style.cssText = `font-style: italic;`;\n parts.push(em);\n break;\n }\n case \"link\": {\n const a = document.createElement(\"a\");\n a.href = node.href;\n a.textContent = node.label;\n a.target = \"_blank\";\n a.rel = \"noopener noreferrer\";\n a.setAttribute(\"part\", \"message-link\");\n a.style.cssText = `\n color: #10b981;\n text-decoration: underline;\n word-break: break-all;\n `;\n parts.push(a);\n if (node.media) parts.push(mediaPreview(node.href, node.label, node.media));\n break;\n }\n case \"image\":\n parts.push(mediaPreview(node.src, node.alt, \"image\"));\n break;\n default:\n parts.push(document.createTextNode(node.text));\n }\n }\n return parts;\n };\n\n const processedLine = processLine(line);\n\n // Handle empty lines (creates paragraph spacing)\n if (line.trim() === \"\" && lineIndex > 0) {\n container.appendChild(document.createElement(\"br\"));\n return;\n }\n\n // Append the processed line\n if (processedLine.length > 0) {\n processedLine.forEach((part) => container.appendChild(part));\n } else {\n container.appendChild(document.createTextNode(line));\n }\n\n // Add line break between lines\n if (lineIndex < lines.length - 1) {\n container.appendChild(document.createElement(\"br\"));\n }\n });\n };\n\n const updateMessageList = () => {\n if (!messageListElement) return;\n\n const messages = formatMessages();\n messageListElement.innerHTML = \"\";\n\n if (messages.length === 0) {\n const emptyState = document.createElement(\"div\");\n emptyState.style.cssText = `\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: ${aeroTheme.colors.text.secondary};\n text-align: center;\n padding: 32px;\n `;\n emptyState.innerHTML = `\n <p style=\"font-weight: 500; margin-bottom: 8px;\">Start a conversation</p>\n <p style=\"font-size: 12px;\">Type a message below to begin chatting</p>\n `;\n messageListElement.appendChild(emptyState);\n return;\n }\n\n messages.forEach((msg) => {\n // MessageWrapper - matches React UserMessageContainer\n const messageWrapper = document.createElement(\"div\");\n messageWrapper.style.cssText = `\n display: flex;\n flex-direction: column;\n max-width: ${msg.isUser ? \"70%\" : \"70%\"};\n margin-left: ${msg.isUser ? \"auto\" : \"0\"};\n width: 100%;\n isolation: isolate;\n contain: layout style paint;\n `;\n\n const bubble = document.createElement(\"div\");\n bubble.setAttribute(\"part\", msg.isUser ? \"message message-user\" : \"message message-bot\");\n // Add data attribute to identify user messages for debugging/styling\n if (msg.isUser) {\n bubble.setAttribute(\"data-message-type\", \"user\");\n }\n\n // Set base styles first - explicitly set background to match React UserBubble exactly\n // CRITICAL: Use the exact same background for both user and bot messages\n const backgroundColor = \"rgba(252, 252, 253, 0.95)\";\n // NOTE on border-radius: deliberately NOT themable. `--convai-radius` is\n // the open panel's radius; a bubble's asymmetric tail corner is a\n // different geometry (`50%` would make ellipses of these). A dedicated\n // `--convai-bubble-radius` can be added additively later if wanted.\n bubble.style.cssText = `\n padding: 12px;\n border-radius: ${msg.isUser ? \"12px 12px 4px 12px\" : \"12px 12px 12px 4px\"};\n background: ${backgroundColor};\n background-color: ${backgroundColor};\n backdrop-filter: blur(20px) saturate(180%);\n border: 1px solid rgba(0, 0, 0, 0.06);\n box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.8) inset, 0 2px 8px rgba(0, 0, 0, 0.08);\n color: var(--convai-panel-fg, ${aeroTheme.colors.text.primary});\n font-family: var(--convai-font, ${aeroTheme.typography.fontFamily.body});\n font-size: 14px;\n line-height: 1.5;\n word-wrap: break-word;\n max-width: 100%;\n display: flex;\n flex-direction: column;\n font-synthesis: none;\n text-rendering: optimizeLegibility;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n -webkit-text-size-adjust: 100%;\n isolation: isolate;\n contain: layout style paint;\n `;\n // Set background with !important to override any other styles (this is critical)\n bubble.style.setProperty(\"background\", backgroundColor, \"important\");\n bubble.style.setProperty(\n \"background-color\",\n backgroundColor,\n \"important\",\n );\n\n // Header (Logo/Icon + Name) inside bubble - matches React MessageHeader\n if (msg.sender) {\n const header = document.createElement(\"div\");\n header.style.cssText = `\n display: flex;\n align-items: center;\n gap: ${aeroTheme.spacing.xs};\n margin-bottom: ${aeroTheme.spacing.xs};\n isolation: isolate;\n contain: layout style paint;\n `;\n\n // Logo/Icon - matches React LogoWrapper\n const logoContainer = document.createElement(\"div\");\n logoContainer.style.cssText = `\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n isolation: isolate;\n contain: layout style paint;\n `;\n\n if (msg.isUser) {\n // User Icon - FaUser from react-icons/fa, matches React exactly\n const userIcon = Icons.User(\"sm\");\n userIcon.style.width = \"16px\";\n userIcon.style.height = \"16px\";\n userIcon.style.color = aeroTheme.colors.convai.dark;\n logoContainer.appendChild(userIcon);\n } else {\n // Bot Logo - ConvaiLogo sm size with connected state\n const botLogo = Icons.ConvaiLogo(\"sm\", \"connected\");\n botLogo.style.width = \"16px\";\n botLogo.style.height = \"16px\";\n botLogo.style.color = \"#10b981\";\n logoContainer.appendChild(botLogo);\n }\n\n // Name Label - matches React UserLabel exactly\n const nameLabel = document.createElement(\"span\");\n nameLabel.textContent = msg.sender === \"User\" ? \"You\" : msg.sender;\n nameLabel.style.cssText = `\n font-size: 12px;\n color: ${msg.isUser ? aeroTheme.colors.convai.dark : \"#10b981\"};\n font-weight: 500;\n font-family: var(--convai-font, ${aeroTheme.typography.fontFamily.body});\n isolation: isolate;\n contain: layout style paint;\n `;\n\n header.appendChild(logoContainer);\n header.appendChild(nameLabel);\n bubble.appendChild(header);\n }\n\n // Message Content\n const contentDiv = document.createElement(\"div\");\n contentDiv.style.cssText = `\n white-space: pre-wrap;\n word-wrap: break-word;\n `;\n renderMarkdown(msg.text, contentDiv);\n bubble.appendChild(contentDiv);\n\n messageWrapper.appendChild(bubble);\n\n // Timestamp - matches React exactly\n if (msg.timestamp) {\n const timestamp = document.createElement(\"span\");\n timestamp.textContent = msg.timestamp;\n timestamp.style.cssText = `\n font-size: 12px;\n color: ${aeroTheme.colors.text.secondary};\n margin-top: 4px;\n align-self: ${msg.isUser ? \"flex-end\" : \"flex-start\"};\n font-family: var(--convai-font, ${aeroTheme.typography.fontFamily.body});\n `;\n messageWrapper.appendChild(timestamp);\n }\n\n messageListElement.appendChild(messageWrapper);\n });\n\n // Scroll to bottom\n messageListElement.scrollTop = messageListElement.scrollHeight;\n };\n\n const getBotStatusColor = () => {\n if (!client.state.isConnected) {\n return { color: \"#ef4444\", label: \"Disconnected\" };\n }\n if (client.state.isConnecting || !client.isBotReady) {\n return { color: \"#f59e0b\", label: \"Connecting\" };\n }\n if (client.state.isListening) {\n return { color: \"#3b82f6\", label: \"Listening\" };\n }\n return { color: \"#10b981\", label: \"Connected\" };\n };\n\n const formatMessages = (): RTCChatMessage[] => {\n const filteredMessages = client.chatMessages.filter(\n (msg: ChatMessage) =>\n (msg.type === \"user-transcription\" ||\n msg.type === \"user-llm-text\" ||\n msg.type === \"bot-llm-text\" ||\n msg.type === \"bot-output\" ||\n msg.type === \"bot-emotion\") &&\n msg.content &&\n msg.content.trim().length > 0,\n );\n\n return filteredMessages.map((msg: ChatMessage) => ({\n id: msg.id,\n text: msg.content,\n isUser: msg.type.includes(\"user\"),\n timestamp: new Date(msg.timestamp).toLocaleTimeString([], {\n hour: \"2-digit\",\n minute: \"2-digit\",\n }),\n sender: msg.type.includes(\"user\") ? \"You\" : characterName,\n showLogo: msg.type.includes(\"bot\"),\n }));\n };\n\n // Setup event listeners for client state changes\n const setupClientListeners = () => {\n eventSubscriptions.register(\n (listener) => client.on(\"stateChange\", listener),\n () => {\n // Published chat (connectionType \"text\") has no microphone: never let\n // a voice-mode transition leave the panel in a mode it cannot honour.\n if (client.connectionType === \"text\") {\n if (isVoiceMode) {\n isVoiceMode = false;\n hasEnteredDefaultVoiceMode = true;\n void updateVoiceMode();\n }\n updateSendButton();\n }\n updateHeader();\n\n // Update pulse animation based on connecting state\n if (client.state.isConnecting) {\n morphingContainer.style.animation =\n \"convai-pulse 2s ease-in-out infinite\";\n } else {\n morphingContainer.style.animation = \"none\";\n }\n\n // Update speaking animation state\n if (client.state.isSpeaking) {\n if (!startTime) {\n startTime = Date.now();\n }\n } else {\n // Reset when not speaking\n if (startTime && !client.state.isSpeaking) {\n startTime = 0;\n }\n }\n\n // Auto-collapse when disconnected\n if (!client.state.isConnected && !client.state.isConnecting) {\n if (isOpen) {\n setIsOpen(false);\n }\n isMuted = false;\n isVoiceMode = false;\n isVideoVisible = false;\n hasEnteredDefaultVoiceMode = false;\n updateHeader();\n // Synchronous listener: nothing here can catch a rejection, and the\n // mute inside is the one most likely to fail (the room has just\n // dropped -- that is why we are collapsing).\n applyVoiceMode();\n }\n\n // Auto-enter voice mode on first connection if defaultVoiceMode is true\n if (\n client.state.isConnected &&\n defaultVoiceMode &&\n isOpen &&\n !hasEnteredDefaultVoiceMode &&\n !isVoiceMode\n ) {\n setTimeout(async () => {\n try {\n await client.audioControls.unmuteAudio();\n isVoiceMode = true;\n hasEnteredDefaultVoiceMode = true;\n await updateVoiceMode();\n } catch (error) {\n reportMicFailure(client, \"Failed to enter voice mode:\", error);\n }\n }, 100);\n }\n },\n );\n\n // Audio state changes now only affect voice mode (microphone button removed)\n\n // Video state change listener\n eventSubscriptions.register(\n (listener) => client.videoControls.on(\"videoStateChange\", listener),\n (videoState: any) => {\n if (videoState.isVideoEnabled !== undefined) {\n isVideoVisible = videoState.isVideoEnabled;\n applyVoiceMode(); // synchronous listener; see applyVoiceMode()\n\n // Update tray button state\n const videoBtn = refs.settingsVideoBtn;\n if (videoBtn) {\n const isActive = isVideoVisible;\n videoBtn.style.backgroundColor = isActive\n ? \"rgba(16, 185, 129, 0.15)\"\n : \"transparent\";\n videoBtn.style.color = isActive\n ? \"#10b981\"\n : `var(--convai-panel-fg, ${aeroTheme.colors.text.primary})`;\n // Update Icon - first child is icon container\n const iconContainer = videoBtn.querySelector(\"div\");\n if (iconContainer) {\n iconContainer.innerHTML = \"\";\n const icon = isActive ? Icons.Video(\"md\") : Icons.VideoOff(\"md\");\n icon.style.width = \"18px\";\n icon.style.height = \"18px\";\n iconContainer.appendChild(icon);\n }\n }\n }\n },\n );\n\n // Screen share state change listener\n client.screenShareControls.on(\n \"screenShareStateChange\",\n (screenShareState: any) => {\n if (screenShareState.isScreenShareActive !== undefined) {\n const isSharing = screenShareState.isScreenShareActive;\n const shareBtn = refs.settingsShareBtn;\n if (shareBtn) {\n const isActive = isSharing;\n shareBtn.style.backgroundColor = isActive\n ? \"rgba(16, 185, 129, 0.15)\"\n : \"transparent\";\n shareBtn.style.color = isActive\n ? \"#10b981\"\n : `var(--convai-panel-fg, ${aeroTheme.colors.text.primary})`;\n // Update Icon - first child is icon container\n const iconContainer = shareBtn.querySelector(\"div\");\n if (iconContainer) {\n iconContainer.innerHTML = \"\";\n const icon = isActive\n ? Icons.StopScreenShare(\"md\")\n : Icons.ScreenShare(\"md\");\n icon.style.width = \"18px\";\n icon.style.height = \"18px\";\n iconContainer.appendChild(icon);\n }\n }\n }\n },\n );\n\n eventSubscriptions.register(\n (listener) => client.on(\"messagesChange\", listener),\n () => {\n updateMessageList();\n },\n );\n\n // Bot ready listener - updates UI when bot becomes ready\n eventSubscriptions.register(\n (listener) => client.on(\"botReady\", listener),\n () => {\n updateHeader(); // Update header to show green status\n updateSendButton();\n },\n );\n\n eventSubscriptions.register(\n (listener) => client.on(\"connect\", listener),\n () => {\n hasConnectedBefore = true;\n\n // Initialize audio renderer on connection\n // NOTE: the audio elements live under rootElement, so playback ends if\n // the host *removes or re-parents* its mount container mid-call. Merely\n // hiding it (display: none / visibility: hidden) does NOT stop\n // HTMLMediaElement playback in any browser — an earlier version of this\n // comment claimed otherwise and was wrong.\n if (client.room && !audioRenderer) {\n audioRenderer = new AudioRenderer(client.room, { container: rootElement });\n }\n\n // Fetch character info\n fetchCharacterInfo();\n\n // Call onConnect callback if provided\n if (onConnect) {\n onConnect();\n }\n },\n );\n\n eventSubscriptions.register(\n (listener) => client.on(\"disconnect\", listener),\n () => {\n // Cleanup audio renderer\n if (audioRenderer) {\n audioRenderer.destroy();\n audioRenderer = null;\n }\n\n updateMessageList();\n\n // Call onDisconnect callback if provided\n if (onDisconnect) {\n onDisconnect();\n }\n },\n );\n\n // `message` carries the row actually updated. That can differ from the\n // list tail when correlated v2 streams interleave, which is why onMessage\n // no longer reads the last element of chatMessages.\n eventSubscriptions.register(\n (listener) => client.on(\"message\", listener),\n (message: unknown) => {\n const row = message as ChatMessage | undefined;\n if (onMessage && row) {\n onMessage(row);\n }\n },\n );\n\n // Screen share state change listener\n eventSubscriptions.register(\n (listener) =>\n client.screenShareControls.on(\"screenShareStateChange\", listener),\n (screenShareState: any) => {\n if (screenShareState.isScreenShareActive !== undefined) {\n const isSharing = screenShareState.isScreenShareActive;\n const shareBtn = document.getElementById(\"convai-settings-share-btn\");\n if (shareBtn) {\n const isActive = isSharing;\n shareBtn.style.backgroundColor = isActive\n ? \"rgba(16, 185, 129, 0.15)\"\n : \"transparent\";\n shareBtn.style.color = isActive\n ? \"#10b981\"\n : aeroTheme.colors.text.primary;\n // Update Icon - first child is icon container\n const iconContainer = shareBtn.querySelector(\"div\");\n if (iconContainer) {\n iconContainer.innerHTML = \"\";\n const icon = isActive\n ? Icons.StopScreenShare(\"md\")\n : Icons.ScreenShare(\"md\");\n icon.style.width = \"18px\";\n icon.style.height = \"18px\";\n iconContainer.appendChild(icon);\n }\n }\n }\n },\n );\n };\n\n // Initialize\n createDOM();\n setupClientListeners();\n\n // Paint the connecting overlay's initial state. updateHeader() (which also\n // calls updateConnectingOverlay()) is otherwise only reached via a client\n // event or a successful character-info fetch, so a widget constructed\n // already connected-but-not-ready would show nothing until one of those\n // fires without this.\n updateConnectingOverlay();\n\n // Set initial button state\n updateSendButton(); // Show voice mode button initially since input is empty\n\n // Set initial voice mode UI if defaultVoiceMode is true\n if (defaultVoiceMode) {\n applyVoiceMode(); // synchronous constructor tail; see applyVoiceMode()\n }\n\n // If already connected, initialize audio renderer and fetch character info\n // NOTE: same lifetime caveat as the \"connect\" handler above — the audio\n // elements are torn down with rootElement if the host detaches it.\n if (client.state.isConnected && client.room) {\n audioRenderer = new AudioRenderer(client.room, { container: rootElement });\n fetchCharacterInfo();\n }\n\n // Return widget instance\n const widget: VanillaWidget = {\n element: rootElement,\n client: client,\n // `isOpen` reports *requested* state, which on a warm client is the same\n // thing as rendered state: `setIsOpen()` runs synchronously. The one case\n // where they differ is the first open on a disconnected client, where the\n // panel is committed only after `connect()` resolves; reporting `false`\n // for those seconds would tell an embed reconciling its own\n // convai-open/convai-close events that a widget it just opened is closed.\n // `pendingOpen` is cleared by every cancellation path, so this never\n // reports open for a request that was called off.\n get isOpen() {\n return isOpen || pendingOpen;\n },\n // Drives the exact same path the launcher click does: `handleToggle`\n // (connect-on-first-open, then `setIsOpen(true)`). Idempotent against an\n // in-flight open as well as an open panel, so repeat calls never start a\n // second connect.\n open: () => {\n if (isOpen || pendingOpen) return;\n void handleToggle();\n },\n // Drives the same path the header's close button does: `handleClose` ->\n // `setIsOpen(false)`. Also cancels an open that is still waiting on\n // `connect()`; a redundant `close()` is a no-op.\n close: () => {\n if (!isOpen && !pendingOpen) return;\n handleClose();\n },\n toggle: () => {\n if (isOpen || pendingOpen) {\n handleClose();\n } else {\n void handleToggle();\n }\n },\n // Pushes a synthetic ChatMessage straight onto `client.chatMessages` and\n // re-renders via the widget's existing `updateMessageList()`. It never\n // calls a client send method (e.g. `sendUserTextMessage`), so the\n // message never reaches the character and is never billed as an LLM\n // turn. The `local-` id keeps it from colliding with a server-issued id.\n appendMessage: (message) => {\n // Shared core path, so React and vanilla insert identically. A\n // hand-rolled IConvaiClient without it falls back to the old local push.\n if (typeof client.appendMessage === \"function\") {\n client.appendMessage(message);\n } else {\n const chatMessage: ChatMessage = {\n id: `local-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`,\n type: message.sender === \"user\" ? \"user-llm-text\" : \"bot-llm-text\",\n content: message.content,\n timestamp: new Date().toISOString(),\n };\n client.chatMessages.push(chatMessage);\n }\n updateMessageList();\n },\n destroy: () => {\n isDestroyed = true;\n\n // Cleanup audio renderer\n if (audioRenderer) {\n audioRenderer.destroy();\n audioRenderer = null;\n }\n\n // Remove event listeners\n morphingContainer.removeEventListener(\"click\", handleLauncherClick);\n\n // Remove DOM elements\n if (rootElement.parentElement) {\n rootElement.remove();\n }\n if (floatingVideo.parentElement) {\n floatingVideo.remove();\n }\n\n // Unsubscribe using the exact callbacks registered above. The guards\n // also suppress an event that was queued just before teardown.\n eventSubscriptions.unsubscribeAll();\n },\n };\n\n return widget;\n}\n\n/**\n * Destroy a Convai widget instance\n * @param widget - Widget instance to destroy\n */\nexport function destroyConvaiWidget(widget: VanillaWidget): void {\n widget.destroy();\n}\n"]}