@convai/web-sdk 1.8.0-beta.0 → 1.8.0-beta.1
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConvaiWidget.d.ts","sourceRoot":"","sources":["../../src/vanilla/ConvaiWidget.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EAEd,MAAM,SAAS,CAAC;AA2HjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE,oBAAoB,GAC5B,aAAa,
|
|
1
|
+
{"version":3,"file":"ConvaiWidget.d.ts","sourceRoot":"","sources":["../../src/vanilla/ConvaiWidget.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EAEd,MAAM,SAAS,CAAC;AA2HjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,WAAW,EACtB,OAAO,EAAE,oBAAoB,GAC5B,aAAa,CAu9Ef;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAE/D"}
|
|
@@ -239,16 +239,28 @@ export function createConvaiWidget(container, options) {
|
|
|
239
239
|
// Prefer authToken over apiKey, matching the precedence ConvaiClient
|
|
240
240
|
// uses when building /connect headers -- a client carrying both must
|
|
241
241
|
// behave identically in both places.
|
|
242
|
+
//
|
|
243
|
+
// The two credentials travel in *different* headers: api.convai.com reads
|
|
244
|
+
// an auth token from API-AUTH-TOKEN and an API key from X-API-Key, and
|
|
245
|
+
// answers an API key sent as API-AUTH-TOKEN with `400 Your session has
|
|
246
|
+
// expired.` Because the failure is swallowed below, sending the wrong one
|
|
247
|
+
// showed up only as a header stuck on the fallback name.
|
|
242
248
|
const credential = client.authToken ?? client.apiKey;
|
|
243
249
|
if (!credential || !client.characterId)
|
|
244
250
|
return;
|
|
251
|
+
const headers = {
|
|
252
|
+
"Content-Type": "application/json",
|
|
253
|
+
};
|
|
254
|
+
if (client.authToken) {
|
|
255
|
+
headers["API-AUTH-TOKEN"] = client.authToken;
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
headers["X-API-Key"] = credential;
|
|
259
|
+
}
|
|
245
260
|
try {
|
|
246
261
|
const response = await fetch("https://api.convai.com/character/get", {
|
|
247
262
|
method: "POST",
|
|
248
|
-
headers
|
|
249
|
-
"Content-Type": "application/json",
|
|
250
|
-
"API-AUTH-TOKEN": credential,
|
|
251
|
-
},
|
|
263
|
+
headers,
|
|
252
264
|
body: JSON.stringify({ charID: client.characterId }),
|
|
253
265
|
});
|
|
254
266
|
if (response.ok) {
|
|
@@ -541,7 +553,19 @@ export function createConvaiWidget(container, options) {
|
|
|
541
553
|
if (label) {
|
|
542
554
|
label.textContent = `Connecting to ${characterName}...`;
|
|
543
555
|
}
|
|
544
|
-
|
|
556
|
+
// `isConnecting` matters as much as `isConnected` here. The panel opens
|
|
557
|
+
// on the click that *starts* the connect, so between that click and the
|
|
558
|
+
// transport coming up (a real network round trip — ~3s against the live
|
|
559
|
+
// service) `isConnected` is still false. Gating on it alone left the
|
|
560
|
+
// whole of that window with no overlay at all: an empty message area and
|
|
561
|
+
// a nameless header, i.e. the widget looked broken for exactly as long as
|
|
562
|
+
// it was doing the one thing the user asked for. Then the label appeared
|
|
563
|
+
// *after* the transport was already up, which reads backwards.
|
|
564
|
+
//
|
|
565
|
+
// The embed makes this the normal path rather than an edge case: its
|
|
566
|
+
// launcher click opens the panel immediately by design, so the pre-connect
|
|
567
|
+
// window is always visible to the user.
|
|
568
|
+
const shouldShow = (client.state.isConnected || client.state.isConnecting) && !client.isBotReady;
|
|
545
569
|
connectingOverlay.style.opacity = shouldShow ? "1" : "0";
|
|
546
570
|
connectingOverlay.style.pointerEvents = shouldShow ? "auto" : "none";
|
|
547
571
|
};
|
|
@@ -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 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 const credential = client.authToken ?? client.apiKey;\n if (!credential || !client.characterId) return;\n\n try {\n const response = await fetch(\"https://api.convai.com/character/get\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"API-AUTH-TOKEN\": credential,\n },\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 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: 24px;\n `;\n\n // Bars Container\n const barsContainer = document.createElement(\"div\");\n barsContainer.id = \"voice-bars-container\";\n barsContainer.style.cssText = `\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 2px;\n height: 80px;\n max-width: 300px;\n `;\n\n // Create 40 bars\n for (let i = 0; i < 40; i++) {\n const bar = document.createElement(\"div\");\n bar.className = \"voice-bar\";\n bar.style.cssText = `\n width: 3px;\n height: 15px;\n background-color: ${aeroTheme.colors.neutral[400]};\n border-radius: 1.5px;\n transition: height 0.08s ease-out, background-color 0.2s;\n transform-origin: center;\n `;\n barsContainer.appendChild(bar);\n }\n overlay.appendChild(barsContainer);\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: 14px;\n font-weight: 500;\n color: var(--convai-panel-fg, ${aeroTheme.colors.text.primary});\n margin-bottom: 8px;\n `;\n statusTitle.textContent = \"Voice Only 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: 12px;\n color: ${aeroTheme.colors.text.secondary};\n `;\n statusSubtitle.textContent = \"Press and hold the microphone to talk\";\n\n statusContainer.appendChild(statusTitle);\n statusContainer.appendChild(statusSubtitle);\n overlay.appendChild(statusContainer);\n\n return overlay;\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 const shouldShow = client.state.isConnected && !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 targetLevels: number[] = Array(40).fill(0.05);\n let currentLevels: number[] = Array(40).fill(0.05);\n let startTime = 0;\n\n // Audio Analysis Logic\n const updateAudioBars = () => {\n if (!voiceModeOverlay) return;\n\n const bars = voiceModeOverlay.querySelectorAll(\".voice-bar\");\n const isTalking = client.state.isSpeaking;\n const isListening = client.state.isListening; // User is speaking (from user-started-speaking)\n const isAnimating = isListening || isTalking;\n\n // Update colors based on state\n bars.forEach((bar) => {\n (bar as HTMLElement).style.backgroundColor = isTalking\n ? `var(--convai-accent, ${aeroTheme.colors.convai.light})`\n : isListening\n ? aeroTheme.colors.text.primary\n : aeroTheme.colors.neutral[400];\n });\n\n // Update Text\n const title = refs.voiceModeTitle;\n const subtitle = refs.voiceModeSubtitle;\n if (title) {\n title.textContent = isTalking\n ? \"Character Speaking...\"\n : isListening\n ? \"Listening...\"\n : \"Voice Only Mode\";\n }\n if (subtitle) {\n subtitle.textContent =\n isListening || isTalking\n ? \"Audio active\"\n : \"Press and hold the microphone to talk\";\n }\n\n // Animation Logic - Matches React version (animate when user or bot is active)\n if ((isListening || !client.audioControls.isAudioMuted) && analyzer && dataArray) {\n // Use time domain data (waveform) instead of frequency\n // @ts-ignore - TypeScript strict mode issue with Uint8Array type\n analyzer.getByteTimeDomainData(dataArray);\n\n // Calculate RMS (Root Mean Square) for volume\n let sum = 0;\n for (let i = 0; i < dataArray.length; i++) {\n const normalized = (dataArray[i] - 128) / 128; // Center around 0\n sum += normalized * normalized;\n }\n const rms = Math.sqrt(sum / dataArray.length);\n\n // Apply some scaling and clamping\n const volume = Math.min(1, rms * 3); // Boost sensitivity\n\n // Create left-to-right wave effect\n const minHeight = 8;\n const maxHeight = 70;\n\n bars.forEach((bar, i) => {\n // Progressive wave from left to right\n const position = i / 40; // 0 to 1 from left to right\n const wavePhase = Date.now() / 300 + position * Math.PI * 2;\n const waveVariation = Math.sin(wavePhase) * 0.15 + 0.85; // 0.7 to 1.0\n const level = volume * waveVariation;\n const height = minHeight + level * (maxHeight - minHeight);\n (bar as HTMLElement).style.height = `${Math.max(minHeight, height)}px`;\n });\n } else if (isTalking) {\n // Simulate speaking bars with natural speech patterns\n const elapsed = (Date.now() - startTime) / 1000; // seconds\n\n // Generate new random target levels occasionally (simulating syllables/words)\n if (Math.random() < 0.08) {\n // 8% chance per frame = ~5 times per second\n targetLevels = Array(40)\n .fill(0)\n .map((_, i) => {\n // More variation in the middle bars, less on edges for natural spread\n const position = i / 40;\n const centerWeight = 1 - Math.abs(position - 0.5) * 0.5;\n\n // Random peaks and valleys like speech patterns\n const randomPeak = 0.2 + Math.random() * 0.7; // 0.2 to 0.9\n\n // Add some neighbor correlation so bars don't jump independently\n const prevTarget = targetLevels[i] || 0.3;\n const correlation = prevTarget * 0.4 + randomPeak * 0.6;\n\n return correlation * centerWeight;\n });\n }\n\n // Smoothly interpolate current levels toward targets (organic movement)\n currentLevels = currentLevels.map((current, i) => {\n const target = targetLevels[i];\n const speed = 0.2; // Smooth but responsive\n return current + (target - current) * speed;\n });\n\n // Apply a gentle fade-in for the first 0.3 seconds\n const fadeIn = Math.min(1, elapsed / 0.3);\n\n const minHeight = 8;\n const maxHeight = 70;\n\n bars.forEach((bar, i) => {\n // Small random jitter for micro-variation\n const microJitter = 0.95 + Math.random() * 0.1; // 0.95 to 1.05\n const level = Math.max(\n 0.05,\n Math.min(1, currentLevels[i] * fadeIn * microJitter),\n );\n const height = minHeight + level * (maxHeight - minHeight);\n (bar as HTMLElement).style.height = `${Math.max(minHeight, height)}px`;\n });\n } else {\n // Reset to idle state\n bars.forEach((bar) => {\n (bar as HTMLElement).style.height = \"15px\";\n });\n }\n\n rafId = requestAnimationFrame(updateAudioBars);\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 };\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 currentLevels = Array(40).fill(0.05);\n targetLevels = Array(40).fill(0.05);\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 currentLevels = Array(40).fill(0.05);\n targetLevels = Array(40).fill(0.05);\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 { 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 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 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: 24px;\n `;\n\n // Bars Container\n const barsContainer = document.createElement(\"div\");\n barsContainer.id = \"voice-bars-container\";\n barsContainer.style.cssText = `\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 2px;\n height: 80px;\n max-width: 300px;\n `;\n\n // Create 40 bars\n for (let i = 0; i < 40; i++) {\n const bar = document.createElement(\"div\");\n bar.className = \"voice-bar\";\n bar.style.cssText = `\n width: 3px;\n height: 15px;\n background-color: ${aeroTheme.colors.neutral[400]};\n border-radius: 1.5px;\n transition: height 0.08s ease-out, background-color 0.2s;\n transform-origin: center;\n `;\n barsContainer.appendChild(bar);\n }\n overlay.appendChild(barsContainer);\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: 14px;\n font-weight: 500;\n color: var(--convai-panel-fg, ${aeroTheme.colors.text.primary});\n margin-bottom: 8px;\n `;\n statusTitle.textContent = \"Voice Only 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: 12px;\n color: ${aeroTheme.colors.text.secondary};\n `;\n statusSubtitle.textContent = \"Press and hold the microphone to talk\";\n\n statusContainer.appendChild(statusTitle);\n statusContainer.appendChild(statusSubtitle);\n overlay.appendChild(statusContainer);\n\n return overlay;\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 targetLevels: number[] = Array(40).fill(0.05);\n let currentLevels: number[] = Array(40).fill(0.05);\n let startTime = 0;\n\n // Audio Analysis Logic\n const updateAudioBars = () => {\n if (!voiceModeOverlay) return;\n\n const bars = voiceModeOverlay.querySelectorAll(\".voice-bar\");\n const isTalking = client.state.isSpeaking;\n const isListening = client.state.isListening; // User is speaking (from user-started-speaking)\n const isAnimating = isListening || isTalking;\n\n // Update colors based on state\n bars.forEach((bar) => {\n (bar as HTMLElement).style.backgroundColor = isTalking\n ? `var(--convai-accent, ${aeroTheme.colors.convai.light})`\n : isListening\n ? aeroTheme.colors.text.primary\n : aeroTheme.colors.neutral[400];\n });\n\n // Update Text\n const title = refs.voiceModeTitle;\n const subtitle = refs.voiceModeSubtitle;\n if (title) {\n title.textContent = isTalking\n ? \"Character Speaking...\"\n : isListening\n ? \"Listening...\"\n : \"Voice Only Mode\";\n }\n if (subtitle) {\n subtitle.textContent =\n isListening || isTalking\n ? \"Audio active\"\n : \"Press and hold the microphone to talk\";\n }\n\n // Animation Logic - Matches React version (animate when user or bot is active)\n if ((isListening || !client.audioControls.isAudioMuted) && analyzer && dataArray) {\n // Use time domain data (waveform) instead of frequency\n // @ts-ignore - TypeScript strict mode issue with Uint8Array type\n analyzer.getByteTimeDomainData(dataArray);\n\n // Calculate RMS (Root Mean Square) for volume\n let sum = 0;\n for (let i = 0; i < dataArray.length; i++) {\n const normalized = (dataArray[i] - 128) / 128; // Center around 0\n sum += normalized * normalized;\n }\n const rms = Math.sqrt(sum / dataArray.length);\n\n // Apply some scaling and clamping\n const volume = Math.min(1, rms * 3); // Boost sensitivity\n\n // Create left-to-right wave effect\n const minHeight = 8;\n const maxHeight = 70;\n\n bars.forEach((bar, i) => {\n // Progressive wave from left to right\n const position = i / 40; // 0 to 1 from left to right\n const wavePhase = Date.now() / 300 + position * Math.PI * 2;\n const waveVariation = Math.sin(wavePhase) * 0.15 + 0.85; // 0.7 to 1.0\n const level = volume * waveVariation;\n const height = minHeight + level * (maxHeight - minHeight);\n (bar as HTMLElement).style.height = `${Math.max(minHeight, height)}px`;\n });\n } else if (isTalking) {\n // Simulate speaking bars with natural speech patterns\n const elapsed = (Date.now() - startTime) / 1000; // seconds\n\n // Generate new random target levels occasionally (simulating syllables/words)\n if (Math.random() < 0.08) {\n // 8% chance per frame = ~5 times per second\n targetLevels = Array(40)\n .fill(0)\n .map((_, i) => {\n // More variation in the middle bars, less on edges for natural spread\n const position = i / 40;\n const centerWeight = 1 - Math.abs(position - 0.5) * 0.5;\n\n // Random peaks and valleys like speech patterns\n const randomPeak = 0.2 + Math.random() * 0.7; // 0.2 to 0.9\n\n // Add some neighbor correlation so bars don't jump independently\n const prevTarget = targetLevels[i] || 0.3;\n const correlation = prevTarget * 0.4 + randomPeak * 0.6;\n\n return correlation * centerWeight;\n });\n }\n\n // Smoothly interpolate current levels toward targets (organic movement)\n currentLevels = currentLevels.map((current, i) => {\n const target = targetLevels[i];\n const speed = 0.2; // Smooth but responsive\n return current + (target - current) * speed;\n });\n\n // Apply a gentle fade-in for the first 0.3 seconds\n const fadeIn = Math.min(1, elapsed / 0.3);\n\n const minHeight = 8;\n const maxHeight = 70;\n\n bars.forEach((bar, i) => {\n // Small random jitter for micro-variation\n const microJitter = 0.95 + Math.random() * 0.1; // 0.95 to 1.05\n const level = Math.max(\n 0.05,\n Math.min(1, currentLevels[i] * fadeIn * microJitter),\n );\n const height = minHeight + level * (maxHeight - minHeight);\n (bar as HTMLElement).style.height = `${Math.max(minHeight, height)}px`;\n });\n } else {\n // Reset to idle state\n bars.forEach((bar) => {\n (bar as HTMLElement).style.height = \"15px\";\n });\n }\n\n rafId = requestAnimationFrame(updateAudioBars);\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 };\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 currentLevels = Array(40).fill(0.05);\n targetLevels = Array(40).fill(0.05);\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 currentLevels = Array(40).fill(0.05);\n targetLevels = Array(40).fill(0.05);\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"]}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const SDK_VERSION = "1.8.0-beta.
|
|
1
|
+
export declare const SDK_VERSION = "1.8.0-beta.1";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
package/dist/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,gDAAgD;AAChD,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC","sourcesContent":["// GENERATED by scripts/sync-version.mjs — do not edit by hand.\n// Regenerated from package.json on every build.\nexport const SDK_VERSION = \"1.8.0-beta.
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,gDAAgD;AAChD,MAAM,CAAC,MAAM,WAAW,GAAG,cAAc,CAAC","sourcesContent":["// GENERATED by scripts/sync-version.mjs — do not edit by hand.\n// Regenerated from package.json on every build.\nexport const SDK_VERSION = \"1.8.0-beta.1\";\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@convai/web-sdk",
|
|
3
|
-
"version": "1.8.0-beta.
|
|
3
|
+
"version": "1.8.0-beta.1",
|
|
4
4
|
"description": "Build web apps with lifelike AI characters. The Convai Web SDK gives you real-time voice, lipsync, emotions, and dynamic context — with first-class support for React and vanilla TypeScript.",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|