@unctad-ai/voice-agent-ui 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +13 -4
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -1499,6 +1499,7 @@ function CopilotFAB({ onClick, portraitSrc }) {
|
|
|
1499
1499
|
height: 54
|
|
1500
1500
|
},
|
|
1501
1501
|
"aria-label": "Open voice assistant",
|
|
1502
|
+
"data-testid": "voice-agent-fab",
|
|
1502
1503
|
children: /* @__PURE__ */ jsx9("div", { className: "agent-fab-border", style: { width: 54, height: 54, "--agent-primary": colors.primary }, children: /* @__PURE__ */ jsx9("div", { className: "agent-fab-border-inner", children: portraitSrc ? /* @__PURE__ */ jsx9(
|
|
1503
1504
|
"img",
|
|
1504
1505
|
{
|
|
@@ -1552,6 +1553,7 @@ function CollapsedBar({
|
|
|
1552
1553
|
style: { padding: "0 16px" },
|
|
1553
1554
|
role: "button",
|
|
1554
1555
|
tabIndex: 0,
|
|
1556
|
+
"data-testid": "voice-agent-bar",
|
|
1555
1557
|
onClick: onExpand,
|
|
1556
1558
|
onKeyDown: (e) => {
|
|
1557
1559
|
if (e.key === "Enter" || e.key === " ") {
|
|
@@ -1805,6 +1807,7 @@ function ComposerBar({
|
|
|
1805
1807
|
color: isListening ? "white" : "rgba(0,0,0,0.5)"
|
|
1806
1808
|
},
|
|
1807
1809
|
"aria-label": isListening ? "Stop listening" : "Start listening",
|
|
1810
|
+
"data-testid": "voice-agent-mic",
|
|
1808
1811
|
children: [
|
|
1809
1812
|
isListening && /* @__PURE__ */ jsx9(
|
|
1810
1813
|
motion5.span,
|
|
@@ -1853,6 +1856,7 @@ function ComposerBar({
|
|
|
1853
1856
|
color: "rgba(0,0,0,0.4)"
|
|
1854
1857
|
},
|
|
1855
1858
|
"aria-label": "Type a message",
|
|
1859
|
+
"data-testid": "voice-agent-keyboard",
|
|
1856
1860
|
children: /* @__PURE__ */ jsx9(Keyboard, { style: { width: 18, height: 18 } })
|
|
1857
1861
|
}
|
|
1858
1862
|
)
|
|
@@ -1908,6 +1912,7 @@ function ComposerBar({
|
|
|
1908
1912
|
},
|
|
1909
1913
|
placeholder: "Ask about services...",
|
|
1910
1914
|
"aria-label": "Type your question",
|
|
1915
|
+
"data-testid": "voice-agent-input",
|
|
1911
1916
|
className: "w-full font-[DM_Sans]",
|
|
1912
1917
|
style: {
|
|
1913
1918
|
fontSize: "14px",
|
|
@@ -1938,6 +1943,7 @@ function ComposerBar({
|
|
|
1938
1943
|
color: "white"
|
|
1939
1944
|
},
|
|
1940
1945
|
"aria-label": "Send message",
|
|
1946
|
+
"data-testid": "voice-agent-send",
|
|
1941
1947
|
children: /* @__PURE__ */ jsx9(ArrowUp, { style: { width: 18, height: 18 } })
|
|
1942
1948
|
}
|
|
1943
1949
|
) }),
|
|
@@ -1955,6 +1961,7 @@ function ComposerBar({
|
|
|
1955
1961
|
color: "rgba(0,0,0,0.4)"
|
|
1956
1962
|
},
|
|
1957
1963
|
"aria-label": "Back to voice mode",
|
|
1964
|
+
"data-testid": "voice-agent-voice-mode",
|
|
1958
1965
|
children: /* @__PURE__ */ jsx9(Mic2, { style: { width: 18, height: 18 } })
|
|
1959
1966
|
}
|
|
1960
1967
|
)
|
|
@@ -2043,7 +2050,7 @@ function ExpandedContent({
|
|
|
2043
2050
|
),
|
|
2044
2051
|
/* @__PURE__ */ jsxs8("div", { className: "flex-1 min-w-0", children: [
|
|
2045
2052
|
/* @__PURE__ */ jsx9("p", { className: "font-[DM_Sans] truncate", style: { fontSize: "14px", fontWeight: 600, color: "#1a1a1a" }, children: copilotName }),
|
|
2046
|
-
/* @__PURE__ */ jsx9("p", { className: "font-[DM_Sans] truncate", style: { fontSize: "12px", fontWeight: 400, color: isOffline ? "rgba(220,38,38,0.7)" : "rgba(0,0,0,0.42)", letterSpacing: "0.01em" }, children: isOffline ? /* @__PURE__ */ jsxs8("span", { className: "inline-flex items-center gap-1", children: [
|
|
2053
|
+
/* @__PURE__ */ jsx9("p", { className: "font-[DM_Sans] truncate", "data-testid": "voice-agent-status", style: { fontSize: "12px", fontWeight: 400, color: isOffline ? "rgba(220,38,38,0.7)" : "rgba(0,0,0,0.42)", letterSpacing: "0.01em" }, children: isOffline ? /* @__PURE__ */ jsxs8("span", { className: "inline-flex items-center gap-1", children: [
|
|
2047
2054
|
"Offline",
|
|
2048
2055
|
onRetry && /* @__PURE__ */ jsx9("button", { onClick: (e) => {
|
|
2049
2056
|
e.stopPropagation();
|
|
@@ -2066,16 +2073,17 @@ function ExpandedContent({
|
|
|
2066
2073
|
backgroundColor: showSettings ? `${colors.primary}14` : "rgba(0,0,0,0.05)"
|
|
2067
2074
|
},
|
|
2068
2075
|
"aria-label": showSettings ? "Close settings" : "Open settings",
|
|
2076
|
+
"data-testid": "voice-agent-settings",
|
|
2069
2077
|
children: /* @__PURE__ */ jsx9(Settings, { style: { width: 16, height: 16 } })
|
|
2070
2078
|
}
|
|
2071
2079
|
),
|
|
2072
|
-
/* @__PURE__ */ jsx9("button", { onClick: onCollapse, className: "shrink-0 rounded-full transition-colors cursor-pointer", style: { color: "rgba(0,0,0,0.4)", width: 44, height: 44, display: "flex", alignItems: "center", justifyContent: "center", backgroundColor: "rgba(0,0,0,0.05)" }, "aria-label": "Minimize panel", children: /* @__PURE__ */ jsx9(ChevronDown, { style: { width: 16, height: 16 } }) }),
|
|
2073
|
-
/* @__PURE__ */ jsx9("button", { onClick: onClose, className: "shrink-0 rounded-full transition-colors cursor-pointer", style: { color: "rgba(0,0,0,0.4)", width: 44, height: 44, display: "flex", alignItems: "center", justifyContent: "center", backgroundColor: "rgba(0,0,0,0.05)" }, "aria-label": "Close voice assistant", children: /* @__PURE__ */ jsx9(X, { style: { width: 16, height: 16 } }) })
|
|
2080
|
+
/* @__PURE__ */ jsx9("button", { onClick: onCollapse, className: "shrink-0 rounded-full transition-colors cursor-pointer", style: { color: "rgba(0,0,0,0.4)", width: 44, height: 44, display: "flex", alignItems: "center", justifyContent: "center", backgroundColor: "rgba(0,0,0,0.05)" }, "aria-label": "Minimize panel", "data-testid": "voice-agent-minimize", children: /* @__PURE__ */ jsx9(ChevronDown, { style: { width: 16, height: 16 } }) }),
|
|
2081
|
+
/* @__PURE__ */ jsx9("button", { onClick: onClose, className: "shrink-0 rounded-full transition-colors cursor-pointer", style: { color: "rgba(0,0,0,0.4)", width: 44, height: 44, display: "flex", alignItems: "center", justifyContent: "center", backgroundColor: "rgba(0,0,0,0.05)" }, "aria-label": "Close voice assistant", "data-testid": "voice-agent-close", children: /* @__PURE__ */ jsx9(X, { style: { width: 16, height: 16 } }) })
|
|
2074
2082
|
]
|
|
2075
2083
|
}
|
|
2076
2084
|
),
|
|
2077
2085
|
/* @__PURE__ */ jsxs8("div", { className: "flex-1 min-h-0 flex flex-col overflow-hidden", children: [
|
|
2078
|
-
/* @__PURE__ */ jsx9(VoiceTranscript, { messages, isTyping, variant: "panel", voiceError }),
|
|
2086
|
+
/* @__PURE__ */ jsx9("div", { "data-testid": "voice-agent-transcript", children: /* @__PURE__ */ jsx9(VoiceTranscript, { messages, isTyping, variant: "panel", voiceError }) }),
|
|
2079
2087
|
/* @__PURE__ */ jsxs8("div", { className: "shrink-0", children: [
|
|
2080
2088
|
/* @__PURE__ */ jsx9(PipelineMetricsBar, { timings: lastTimings ?? null, show: showPipelineMetrics, autoHideMs: pipelineMetricsAutoHideMs }),
|
|
2081
2089
|
isOffline && onRetry && /* @__PURE__ */ jsx9("div", { style: { padding: "0 16px 8px", display: "flex", justifyContent: "center" }, children: /* @__PURE__ */ jsxs8(motion5.button, { whileHover: { scale: 1.04 }, whileTap: { scale: 0.96 }, onClick: onRetry, disabled: isRetrying, className: "inline-flex items-center gap-2 rounded-full cursor-pointer transition-colors", style: { padding: "8px 18px", fontSize: "13px", fontWeight: 500, fontFamily: "DM Sans, sans-serif", color: isRetrying ? "rgba(0,0,0,0.35)" : "rgba(220,38,38,0.8)", backgroundColor: isRetrying ? "rgba(0,0,0,0.04)" : "rgba(220,38,38,0.08)", border: "1px solid", borderColor: isRetrying ? "rgba(0,0,0,0.06)" : "rgba(220,38,38,0.15)" }, "aria-label": "Retry connection", children: [
|
|
@@ -2352,6 +2360,7 @@ function GlassCopilotPanel({ isOpen, onOpen, onClose, onStateChange, portraitSrc
|
|
|
2352
2360
|
role: "dialog",
|
|
2353
2361
|
"aria-label": "Voice Assistant",
|
|
2354
2362
|
"aria-modal": "false",
|
|
2363
|
+
"data-testid": "voice-agent-panel",
|
|
2355
2364
|
initial: { width: 48, height: 48, borderRadius: 24, opacity: 0, scale: 0.9 },
|
|
2356
2365
|
animate: { width: PANEL_WIDTH, height: Math.min(targetHeight, window.innerHeight - 48), borderRadius: PANEL_BORDER_RADIUS, opacity: 1, scale: 1, transition: SPRING_PANEL },
|
|
2357
2366
|
exit: { width: 48, height: 48, borderRadius: 24, opacity: 0, scale: 0.95, transition: SPRING_PANEL_EXIT },
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/VoiceAgentProvider.tsx","../src/components/GlassCopilotPanel.tsx","../src/components/AgentAvatar.tsx","../src/components/VoiceOrb.tsx","../src/components/agentFabStyles.ts","../src/components/VoiceTranscript.tsx","../src/utils.ts","../src/components/VoiceToolCard.tsx","../src/components/VoiceErrorBoundary.tsx","../src/components/VoiceErrorDisplay.tsx","../src/components/PipelineMetricsBar.tsx","../src/components/VoiceA11yAnnouncer.tsx","../src/components/VoiceCopilotFAB.tsx","../src/components/VoiceControls.tsx","../src/components/VoiceDotRing.tsx","../src/components/VoiceOnboarding.tsx","../src/components/VoiceOverlay.tsx","../src/components/VoiceWaveformCanvas.tsx"],"sourcesContent":["import { SiteConfigProvider } from '@unctad-ai/voice-agent-core';\nimport { CopilotProvider } from '@unctad-ai/voice-agent-registries';\nimport { VoiceSettingsProvider } from './contexts/VoiceSettingsContext';\nimport type { SiteConfig } from '@unctad-ai/voice-agent-core';\n\nexport function VoiceAgentProvider({\n config,\n children,\n}: {\n config: SiteConfig;\n children: React.ReactNode;\n}) {\n return (\n <SiteConfigProvider config={config}>\n <CopilotProvider>\n <VoiceSettingsProvider>\n {children}\n </VoiceSettingsProvider>\n </CopilotProvider>\n </SiteConfigProvider>\n );\n}\n","import {\n useState,\n useEffect,\n useCallback,\n useRef,\n lazy,\n Suspense,\n Component,\n type ReactNode,\n type ErrorInfo,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { ChevronDown, X, Mic, ArrowUp, Keyboard, RotateCw, Settings, VolumeX } from 'lucide-react';\nimport {\n useVoiceAgent,\n voiceStateToOrbState,\n checkLLMHealth,\n useSiteConfig,\n RECOVERY_POLL_MS,\n PANEL_WIDTH,\n PANEL_COLLAPSED_HEIGHT,\n PANEL_EXPANDED_HEIGHT,\n PANEL_BORDER_RADIUS,\n PANEL_BOTTOM,\n PANEL_RIGHT,\n PANEL_Z_INDEX,\n SPRING_PANEL,\n SPRING_MICRO,\n SPRING_PANEL_EXIT,\n} from '@unctad-ai/voice-agent-core';\nimport type { OrbState, VoiceToolResult, VoiceState, VoiceMessage, PipelineTimings } from '@unctad-ai/voice-agent-core';\nimport { useVoiceSettings } from '../contexts/VoiceSettingsContext';\nimport AgentAvatar from './AgentAvatar';\nimport { injectAgentFabCSS } from './agentFabStyles';\nimport VoiceTranscript from './VoiceTranscript';\nimport VoiceToolCard from './VoiceToolCard';\nimport VoiceErrorBoundary from './VoiceErrorBoundary';\nimport VoiceErrorDisplay from './VoiceErrorDisplay';\nimport type { VoiceErrorType } from './VoiceErrorDisplay';\nimport PipelineMetricsBar from './PipelineMetricsBar';\nconst VoiceSettingsView = lazy(() => import('./VoiceSettingsView'));\n\n// ---------------------------------------------------------------------------\n// State labels for composer bar\n// ---------------------------------------------------------------------------\nconst STATE_LABELS: Record<VoiceState, string> = {\n IDLE: 'Tap mic to speak',\n LISTENING: 'Listening...',\n USER_SPEAKING: 'Listening...',\n PROCESSING: 'Processing...',\n AI_SPEAKING: 'Speaking...',\n};\n\n// ---------------------------------------------------------------------------\n// Aria-live announcements for screen readers\n// ---------------------------------------------------------------------------\nconst ARIA_LIVE_LABELS: Record<OrbState, string> = {\n idle: '',\n listening: 'Listening for your question',\n processing: 'Processing your request',\n speaking: 'Playing response',\n error: 'An error occurred',\n};\n\n// ---------------------------------------------------------------------------\n// Panel states\n// ---------------------------------------------------------------------------\ntype PanelState = 'hidden' | 'collapsed' | 'expanded';\n\ninterface GlassCopilotPanelProps {\n isOpen: boolean;\n onOpen?: () => void;\n onClose: () => void;\n onStateChange?: (orbState: OrbState) => void;\n /** URL for the avatar portrait image */\n portraitSrc?: string;\n}\n\n// ---------------------------------------------------------------------------\n// FAB — shown when panel is hidden\n// ---------------------------------------------------------------------------\nfunction CopilotFAB({ onClick, portraitSrc }: { onClick: () => void; portraitSrc?: string }) {\n const { colors } = useSiteConfig();\n return (\n <motion.button\n onClick={onClick}\n whileHover={{ scale: 1.08 }}\n whileTap={{ scale: 0.95 }}\n className=\"shadow-lg cursor-pointer\"\n style={{\n background: 'transparent',\n border: 'none',\n padding: 0,\n borderRadius: '50%',\n width: 54,\n height: 54,\n }}\n aria-label=\"Open voice assistant\"\n >\n <div className=\"agent-fab-border\" style={{ width: 54, height: 54, '--agent-primary': colors.primary } as React.CSSProperties}>\n <div className=\"agent-fab-border-inner\">\n {portraitSrc ? (\n <img\n src={portraitSrc}\n alt=\"Assistant\"\n style={{ width: '100%', height: '100%', objectFit: 'cover', borderRadius: '50%' }}\n draggable={false}\n />\n ) : (\n <div\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#6b7280',\n color: 'white',\n fontSize: 20,\n fontWeight: 700,\n }}\n >\n AI\n </div>\n )}\n </div>\n </div>\n </motion.button>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Collapsed header bar\n// ---------------------------------------------------------------------------\nfunction CollapsedBar({\n orbState,\n getAmplitude,\n analyser: _analyser,\n voiceState,\n onExpand,\n onClose,\n onRetry,\n isRetrying = false,\n voiceError,\n micPaused = false,\n onMicToggle,\n ttsEnabled = true,\n copilotName,\n portraitSrc,\n}: {\n orbState: OrbState;\n getAmplitude: () => number;\n analyser: AnalyserNode | null;\n voiceState: VoiceState;\n onExpand: () => void;\n onClose: () => void;\n onRetry?: () => void;\n isRetrying?: boolean;\n voiceError?: VoiceErrorType;\n micPaused?: boolean;\n onMicToggle?: () => void;\n ttsEnabled?: boolean;\n copilotName: string;\n portraitSrc?: string;\n}) {\n const { colors } = useSiteConfig();\n const isOffline = voiceError === 'network_error';\n\n return (\n <div\n className=\"flex items-center gap-3 h-full cursor-pointer select-none\"\n style={{ padding: '0 16px' }}\n role=\"button\"\n tabIndex={0}\n onClick={onExpand}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onExpand();\n }\n }}\n >\n {/* Mini avatar */}\n <div\n className=\"relative shrink-0\"\n style={{ width: 46, height: 46, opacity: isOffline ? 0.4 : 1 }}\n >\n <AgentAvatar state={orbState} getAmplitude={getAmplitude} size={46} portraitSrc={portraitSrc} />\n {!ttsEnabled && (\n <div\n className=\"absolute flex items-center justify-center\"\n style={{\n bottom: -2,\n right: -2,\n width: 18,\n height: 18,\n borderRadius: 9,\n backgroundColor: 'rgba(0,0,0,0.65)',\n border: '1.5px solid rgba(255,255,255,0.8)',\n }}\n >\n <VolumeX style={{ width: 10, height: 10, color: '#fff' }} />\n </div>\n )}\n </div>\n\n {/* Title */}\n <div className=\"flex-1 min-w-0\">\n <p\n className=\"font-[DM_Sans] truncate\"\n style={{ fontSize: '14px', fontWeight: 600, color: '#1a1a1a' }}\n >\n {copilotName}\n </p>\n <p\n className=\"font-[DM_Sans] truncate\"\n style={{\n fontSize: '12px',\n fontWeight: 400,\n color: isOffline ? 'rgba(220, 38, 38, 0.7)' : 'rgba(0,0,0,0.42)',\n letterSpacing: '0.01em',\n }}\n >\n {isOffline ? (\n <span className=\"inline-flex items-center gap-1\">\n Offline\n {onRetry && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRetry();\n }}\n className=\"inline-flex items-center justify-center rounded-full transition-colors cursor-pointer\"\n style={{\n width: 18,\n height: 18,\n color: 'rgba(220, 38, 38, 0.5)',\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLElement).style.color = 'rgba(220, 38, 38, 0.8)';\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLElement).style.color = 'rgba(220, 38, 38, 0.5)';\n }}\n aria-label=\"Retry connection\"\n >\n <motion.span\n animate={isRetrying ? { rotate: 360 } : { rotate: 0 }}\n transition={\n isRetrying\n ? { duration: 0.8, repeat: Infinity, ease: 'linear' }\n : { duration: 0.3 }\n }\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n >\n <RotateCw style={{ width: 12, height: 12 }} />\n </motion.span>\n </button>\n )}\n </span>\n ) : micPaused ? (\n 'Paused'\n ) : (\n STATE_LABELS[voiceState]\n )}\n </p>\n </div>\n\n {/* Mic toggle button */}\n {!isOffline && onMicToggle && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onMicToggle();\n }}\n className=\"shrink-0 rounded-full flex items-center justify-center transition-all cursor-pointer relative\"\n style={{\n width: 44,\n height: 44,\n backgroundColor:\n voiceState === 'LISTENING' || voiceState === 'USER_SPEAKING'\n ? colors.primary\n : 'rgba(0,0,0,0.06)',\n color:\n voiceState === 'LISTENING' || voiceState === 'USER_SPEAKING'\n ? 'white'\n : 'rgba(0,0,0,0.45)',\n }}\n aria-label={\n voiceState === 'LISTENING' || voiceState === 'USER_SPEAKING'\n ? 'Stop listening'\n : 'Start listening'\n }\n >\n {(voiceState === 'LISTENING' || voiceState === 'USER_SPEAKING') && (\n <motion.span\n className=\"absolute inset-0 rounded-full\"\n animate={{ scale: [1, 1.3, 1], opacity: [0.3, 0, 0.3] }}\n transition={{ duration: 1.8, repeat: Infinity, ease: 'easeInOut' }}\n style={{ backgroundColor: `${colors.primary}40` }}\n />\n )}\n <Mic style={{ width: 16, height: 16, position: 'relative', zIndex: 1 }} />\n </button>\n )}\n\n {/* Offline status dot */}\n {isOffline && (\n <span\n className=\"shrink-0 rounded-full\"\n style={{\n width: 8,\n height: 8,\n backgroundColor: 'rgba(220, 38, 38, 0.5)',\n }}\n />\n )}\n\n {/* Close */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onClose();\n }}\n className=\"shrink-0 rounded-full flex items-center justify-center transition-colors cursor-pointer\"\n style={{\n width: 44,\n height: 44,\n color: 'rgba(0,0,0,0.4)',\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLElement).style.color = 'rgba(0,0,0,0.7)';\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLElement).style.color = 'rgba(0,0,0,0.4)';\n }}\n aria-label=\"Close voice assistant\"\n >\n <X style={{ width: 18, height: 18 }} />\n </button>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Composer bar\n// ---------------------------------------------------------------------------\nfunction ComposerBar({\n voiceState,\n isListening,\n micPaused = false,\n onTextSubmit,\n onMicToggle,\n disabled = false,\n}: {\n voiceState: VoiceState;\n isListening: boolean;\n micPaused?: boolean;\n onTextSubmit: (text: string) => void;\n onMicToggle: () => void;\n disabled?: boolean;\n}) {\n const { colors } = useSiteConfig();\n const [mode, setMode] = useState<'voice' | 'text'>('voice');\n const [text, setText] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (mode === 'text') {\n requestAnimationFrame(() => inputRef.current?.focus());\n }\n }, [mode]);\n\n const handleSubmit = () => {\n const trimmed = text.trim();\n if (!trimmed) return;\n onTextSubmit(trimmed);\n setText('');\n setMode('voice');\n };\n\n const handleCancel = () => {\n setText('');\n setMode('voice');\n onMicToggle();\n };\n\n if (disabled) {\n return (\n <div\n className=\"flex items-center gap-3 shrink-0\"\n style={{\n height: 56,\n padding: '10px 14px',\n borderTop: '1px solid rgba(0,0,0,0.08)',\n }}\n >\n <div\n className=\"shrink-0 rounded-full flex items-center justify-center\"\n style={{\n width: 36,\n height: 36,\n backgroundColor: 'rgba(0,0,0,0.04)',\n color: 'rgba(0,0,0,0.2)',\n opacity: 0.5,\n }}\n >\n <Mic style={{ width: 18, height: 18 }} />\n </div>\n <span\n className=\"font-[DM_Sans] italic\"\n style={{ fontSize: '13px', color: 'rgba(0,0,0,0.3)' }}\n >\n Service unavailable\n </span>\n </div>\n );\n }\n\n return (\n <div\n className=\"shrink-0 overflow-hidden\"\n style={{\n height: 56,\n borderTop: '1px solid rgba(0,0,0,0.08)',\n }}\n >\n <AnimatePresence mode=\"wait\" initial={false}>\n {mode === 'voice' ? (\n <motion.div\n key=\"voice-mode\"\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -8 }}\n transition={{ duration: 0.18, ease: [0.22, 1, 0.36, 1] }}\n className=\"flex items-center gap-3\"\n style={{ height: 56, padding: '10px 14px' }}\n >\n <button\n onClick={onMicToggle}\n className=\"shrink-0 rounded-full flex items-center justify-center transition-all relative cursor-pointer\"\n style={{\n width: 44,\n height: 44,\n backgroundColor: isListening ? colors.primary : 'rgba(0,0,0,0.06)',\n color: isListening ? 'white' : 'rgba(0,0,0,0.5)',\n }}\n aria-label={isListening ? 'Stop listening' : 'Start listening'}\n >\n {isListening && (\n <motion.span\n className=\"absolute inset-0 rounded-full\"\n animate={{ scale: [1, 1.22, 1], opacity: [0.25, 0.08, 0.25] }}\n transition={{ duration: 1.8, repeat: Infinity, ease: 'easeInOut' }}\n style={{ backgroundColor: `${colors.primary}33`, filter: 'blur(4px)' }}\n />\n )}\n <Mic style={{ width: 18, height: 18, position: 'relative', zIndex: 1 }} />\n </button>\n\n <div className=\"flex-1 min-w-0\">\n <AnimatePresence mode=\"wait\">\n <motion.p\n key={micPaused ? 'paused' : voiceState}\n initial={{ opacity: 0, y: 4 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -4 }}\n transition={{ duration: 0.15 }}\n className=\"font-[DM_Sans] truncate\"\n style={{\n fontSize: '14px',\n fontWeight: 400,\n color: micPaused\n ? 'rgba(0,0,0,0.35)'\n : voiceState === 'LISTENING' || voiceState === 'USER_SPEAKING'\n ? colors.primary\n : 'rgba(0,0,0,0.45)',\n }}\n >\n {micPaused ? 'Paused' : STATE_LABELS[voiceState]}\n </motion.p>\n </AnimatePresence>\n </div>\n\n <motion.button\n whileHover={{ scale: 1.08 }}\n whileTap={{ scale: 0.92 }}\n onClick={() => {\n if (isListening) onMicToggle();\n setMode('text');\n }}\n className=\"shrink-0 rounded-full flex items-center justify-center cursor-pointer\"\n style={{\n width: 44,\n height: 44,\n backgroundColor: 'rgba(0,0,0,0.05)',\n color: 'rgba(0,0,0,0.4)',\n }}\n aria-label=\"Type a message\"\n >\n <Keyboard style={{ width: 18, height: 18 }} />\n </motion.button>\n </motion.div>\n ) : (\n <motion.div\n key=\"text-mode\"\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -8 }}\n transition={{ duration: 0.18, ease: [0.22, 1, 0.36, 1] }}\n className=\"flex items-center gap-2\"\n style={{ height: 56, padding: '10px 14px' }}\n >\n <div\n className=\"flex-1 min-w-0 flex items-center\"\n style={{\n height: 36,\n borderRadius: 18,\n padding: '0 14px',\n backgroundColor: 'rgba(0,0,0,0.03)',\n border: '1px solid rgba(0,0,0,0.08)',\n transition: 'border-color 0.15s, box-shadow 0.15s',\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleSubmit();\n if (e.key === 'Escape') handleCancel();\n }}\n onFocus={(e) => {\n const pill = e.currentTarget.parentElement;\n if (pill) {\n pill.style.borderColor = `${colors.primary}4D`;\n pill.style.boxShadow = `0 0 0 2px ${colors.primary}14`;\n }\n }}\n onBlur={(e) => {\n const pill = e.currentTarget.parentElement;\n if (pill) {\n pill.style.borderColor = 'rgba(0,0,0,0.08)';\n pill.style.boxShadow = 'none';\n }\n }}\n placeholder=\"Ask about services...\"\n aria-label=\"Type your question\"\n className=\"w-full font-[DM_Sans]\"\n style={{\n fontSize: '14px',\n color: '#1a1a1a',\n background: 'transparent',\n border: 'none',\n outline: 'none',\n padding: 0,\n }}\n />\n </div>\n\n <AnimatePresence>\n {text.trim().length > 0 && (\n <motion.button\n initial={{ scale: 0, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0, opacity: 0 }}\n transition={SPRING_MICRO}\n whileTap={{ scale: 0.9 }}\n onClick={handleSubmit}\n className=\"shrink-0 rounded-full flex items-center justify-center cursor-pointer\"\n style={{\n width: 44,\n height: 44,\n backgroundColor: colors.primary,\n color: 'white',\n }}\n aria-label=\"Send message\"\n >\n <ArrowUp style={{ width: 18, height: 18 }} />\n </motion.button>\n )}\n </AnimatePresence>\n\n <motion.button\n whileHover={{ scale: 1.08 }}\n whileTap={{ scale: 0.92 }}\n onClick={handleCancel}\n className=\"shrink-0 rounded-full flex items-center justify-center cursor-pointer\"\n style={{\n width: 44,\n height: 44,\n backgroundColor: 'rgba(0,0,0,0.05)',\n color: 'rgba(0,0,0,0.4)',\n }}\n aria-label=\"Back to voice mode\"\n >\n <Mic style={{ width: 18, height: 18 }} />\n </motion.button>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Expanded panel content\n// ---------------------------------------------------------------------------\nfunction ExpandedContent({\n orbState, getAmplitude, analyser, voiceState, messages, isTyping,\n toolResult, voiceError, dismissError, onCollapse, onClose, onTextSubmit,\n onMicToggle, micPaused = false, onToolDismiss, onInteraction, onRetry,\n isRetrying = false, lastTimings, showPipelineMetrics, pipelineMetricsAutoHideMs,\n showSettings, onSettingsToggle, ttsEnabled = true, copilotName, portraitSrc,\n}: {\n orbState: OrbState; getAmplitude: () => number; analyser: AnalyserNode | null;\n voiceState: VoiceState; messages: VoiceMessage[]; isTyping: boolean;\n toolResult: VoiceToolResult | null; voiceError: VoiceErrorType; dismissError: () => void;\n onCollapse: () => void; onClose: () => void; onTextSubmit: (text: string) => void;\n onMicToggle: () => void; micPaused?: boolean; onToolDismiss: () => void;\n onInteraction: () => void; onRetry?: () => void; isRetrying?: boolean;\n lastTimings?: PipelineTimings | null; showPipelineMetrics?: boolean;\n pipelineMetricsAutoHideMs?: number; showSettings: boolean; onSettingsToggle: () => void;\n ttsEnabled?: boolean; copilotName: string; portraitSrc?: string;\n}) {\n const { colors } = useSiteConfig();\n const isListening = voiceState === 'LISTENING' || voiceState === 'USER_SPEAKING';\n const isOffline = voiceError === 'network_error';\n\n return (\n <div\n className=\"flex flex-col h-full overflow-hidden\"\n onClick={onInteraction}\n onKeyDown={onInteraction}\n >\n {/* Header (64px) */}\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.18, ease: [0.25, 0.1, 0.25, 1], delay: 0.12 }}\n className=\"flex items-center gap-3 shrink-0\"\n style={{ height: 64, padding: '12px 16px', borderBottom: '1px solid rgba(0,0,0,0.06)' }}\n >\n <motion.div\n initial={{ scale: 0.8 }}\n animate={{ scale: 1, opacity: isOffline ? 0.35 : 1 }}\n transition={{ ...SPRING_MICRO, delay: 0.14 }}\n className=\"relative shrink-0\"\n style={{ width: 46, height: 46, filter: isOffline ? 'grayscale(0.8)' : 'none' }}\n >\n <AgentAvatar state={orbState} getAmplitude={getAmplitude} size={46} showRing portraitSrc={portraitSrc} />\n {!ttsEnabled && (\n <div\n className=\"absolute flex items-center justify-center\"\n style={{\n bottom: -2, right: -2, width: 18, height: 18, borderRadius: 9,\n backgroundColor: 'rgba(0,0,0,0.65)', border: '1.5px solid rgba(255,255,255,0.8)',\n }}\n >\n <VolumeX style={{ width: 10, height: 10, color: '#fff' }} />\n </div>\n )}\n </motion.div>\n\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-[DM_Sans] truncate\" style={{ fontSize: '14px', fontWeight: 600, color: '#1a1a1a' }}>{copilotName}</p>\n <p className=\"font-[DM_Sans] truncate\" style={{ fontSize: '12px', fontWeight: 400, color: isOffline ? 'rgba(220,38,38,0.7)' : 'rgba(0,0,0,0.42)', letterSpacing: '0.01em' }}>\n {isOffline ? (\n <span className=\"inline-flex items-center gap-1\">\n Offline\n {onRetry && (\n <button onClick={(e) => { e.stopPropagation(); onRetry(); }} className=\"inline-flex items-center justify-center rounded-full transition-colors cursor-pointer\" style={{ width: 18, height: 18, color: 'rgba(220,38,38,0.5)' }} aria-label=\"Retry connection\">\n <motion.span animate={isRetrying ? { rotate: 360 } : { rotate: 0 }} transition={isRetrying ? { duration: 0.8, repeat: Infinity, ease: 'linear' } : { duration: 0.3 }} style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <RotateCw style={{ width: 12, height: 12 }} />\n </motion.span>\n </button>\n )}\n </span>\n ) : micPaused ? 'Paused' : STATE_LABELS[voiceState]}\n </p>\n </div>\n\n <button\n onClick={onSettingsToggle}\n className=\"shrink-0 rounded-full transition-colors cursor-pointer\"\n style={{\n color: showSettings ? colors.primary : 'rgba(0,0,0,0.4)',\n width: 44, height: 44, display: 'flex', alignItems: 'center', justifyContent: 'center',\n backgroundColor: showSettings ? `${colors.primary}14` : 'rgba(0,0,0,0.05)',\n }}\n aria-label={showSettings ? 'Close settings' : 'Open settings'}\n >\n <Settings style={{ width: 16, height: 16 }} />\n </button>\n <button onClick={onCollapse} className=\"shrink-0 rounded-full transition-colors cursor-pointer\" style={{ color: 'rgba(0,0,0,0.4)', width: 44, height: 44, display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: 'rgba(0,0,0,0.05)' }} aria-label=\"Minimize panel\">\n <ChevronDown style={{ width: 16, height: 16 }} />\n </button>\n <button onClick={onClose} className=\"shrink-0 rounded-full transition-colors cursor-pointer\" style={{ color: 'rgba(0,0,0,0.4)', width: 44, height: 44, display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: 'rgba(0,0,0,0.05)' }} aria-label=\"Close voice assistant\">\n <X style={{ width: 16, height: 16 }} />\n </button>\n </motion.div>\n\n <div className=\"flex-1 min-h-0 flex flex-col overflow-hidden\">\n <VoiceTranscript messages={messages} isTyping={isTyping} variant=\"panel\" voiceError={voiceError} />\n <div className=\"shrink-0\">\n <PipelineMetricsBar timings={lastTimings ?? null} show={showPipelineMetrics} autoHideMs={pipelineMetricsAutoHideMs} />\n {isOffline && onRetry && (\n <div style={{ padding: '0 16px 8px', display: 'flex', justifyContent: 'center' }}>\n <motion.button whileHover={{ scale: 1.04 }} whileTap={{ scale: 0.96 }} onClick={onRetry} disabled={isRetrying} className=\"inline-flex items-center gap-2 rounded-full cursor-pointer transition-colors\" style={{ padding: '8px 18px', fontSize: '13px', fontWeight: 500, fontFamily: 'DM Sans, sans-serif', color: isRetrying ? 'rgba(0,0,0,0.35)' : 'rgba(220,38,38,0.8)', backgroundColor: isRetrying ? 'rgba(0,0,0,0.04)' : 'rgba(220,38,38,0.08)', border: '1px solid', borderColor: isRetrying ? 'rgba(0,0,0,0.06)' : 'rgba(220,38,38,0.15)' }} aria-label=\"Retry connection\">\n <motion.span animate={isRetrying ? { rotate: 360 } : { rotate: 0 }} transition={isRetrying ? { duration: 0.8, repeat: Infinity, ease: 'linear' } : { duration: 0.3 }} style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <RotateCw style={{ width: 14, height: 14 }} />\n </motion.span>\n {isRetrying ? 'Checking...' : 'Retry connection'}\n </motion.button>\n </div>\n )}\n {voiceError !== 'network_error' && (\n <div style={{ padding: '0 16px 8px' }}><VoiceErrorDisplay error={voiceError} onDismiss={dismissError} /></div>\n )}\n <div style={{ padding: '0 16px 8px' }}><VoiceToolCard result={toolResult} onDismiss={onToolDismiss} variant=\"capsule\" /></div>\n </div>\n </div>\n\n <motion.div initial={{ opacity: 0, y: 12 }} animate={{ opacity: 1, y: 0 }} transition={{ ...SPRING_MICRO, delay: 0.2 }} className=\"shrink-0\">\n <ComposerBar voiceState={voiceState} isListening={isListening} micPaused={micPaused} onTextSubmit={onTextSubmit} onMicToggle={onMicToggle} disabled={voiceError === 'network_error'} />\n </motion.div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Static panel shell\n// ---------------------------------------------------------------------------\nfunction StaticPanelShell({\n panelState, onCollapse, onExpand, onClose, onRetry, copilotName, portraitSrc,\n}: {\n panelState: PanelState; onCollapse: () => void; onExpand: () => void; onClose: () => void;\n onRetry?: () => Promise<boolean>; copilotName: string; portraitSrc?: string;\n}) {\n const noopAmplitude = useCallback(() => 0, []);\n const [isRetrying, setIsRetrying] = useState(false);\n const handleRetry = useCallback(() => { if (isRetrying || !onRetry) return; setIsRetrying(true); onRetry().finally(() => setIsRetrying(false)); }, [onRetry, isRetrying]);\n\n if (panelState === 'collapsed') {\n return <CollapsedBar orbState=\"idle\" getAmplitude={noopAmplitude} analyser={null} voiceState=\"IDLE\" onExpand={onExpand} onClose={onClose} onRetry={handleRetry} isRetrying={isRetrying} voiceError=\"network_error\" copilotName={copilotName} portraitSrc={portraitSrc} />;\n }\n return <ExpandedContent orbState=\"idle\" getAmplitude={noopAmplitude} analyser={null} voiceState=\"IDLE\" messages={[]} isTyping={false} toolResult={null} voiceError=\"network_error\" dismissError={() => {}} onCollapse={onCollapse} onClose={onClose} onTextSubmit={() => {}} onMicToggle={() => {}} onToolDismiss={() => {}} onInteraction={() => {}} onRetry={handleRetry} isRetrying={isRetrying} showSettings={false} onSettingsToggle={() => {}} copilotName={copilotName} portraitSrc={portraitSrc} />;\n}\n\n// ---------------------------------------------------------------------------\n// Error boundary\n// ---------------------------------------------------------------------------\nclass WiredPanelErrorBoundary extends Component<\n { children: ReactNode; panelState: PanelState; onCollapse: () => void; onExpand: () => void; onClose: () => void; copilotName: string; portraitSrc?: string },\n { hasError: boolean }\n> {\n state = { hasError: false };\n static getDerivedStateFromError() { return { hasError: true }; }\n componentDidCatch(error: Error, _info: ErrorInfo) { console.warn('[GlassCopilotPanel] Voice agent unavailable:', error.message); }\n handleRetry = (): Promise<boolean> => {\n return checkLLMHealth().then(({ available }) => {\n if (available) this.setState({ hasError: false });\n return available;\n });\n };\n render() {\n if (this.state.hasError) {\n return <StaticPanelShell panelState={this.props.panelState} onCollapse={this.props.onCollapse} onExpand={this.props.onExpand} onClose={this.props.onClose} onRetry={this.handleRetry} copilotName={this.props.copilotName} portraitSrc={this.props.portraitSrc} />;\n }\n return this.props.children;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Wired panel\n// ---------------------------------------------------------------------------\nfunction WiredPanel({\n panelState, onCollapse, onExpand, onClose, onStateChange, portraitSrc,\n}: {\n panelState: PanelState; onCollapse: () => void; onExpand: () => void; onClose: () => void;\n onStateChange?: (orbState: OrbState) => void; portraitSrc?: string;\n}) {\n const config = useSiteConfig();\n return (\n <WiredPanelErrorBoundary panelState={panelState} onCollapse={onCollapse} onExpand={onExpand} onClose={onClose} copilotName={config.copilotName} portraitSrc={portraitSrc}>\n <WiredPanelInner panelState={panelState} onCollapse={onCollapse} onExpand={onExpand} onClose={onClose} onStateChange={onStateChange} portraitSrc={portraitSrc} />\n </WiredPanelErrorBoundary>\n );\n}\n\nfunction WiredPanelInner({\n panelState, onCollapse, onExpand, onClose, onStateChange, portraitSrc,\n}: {\n panelState: PanelState; onCollapse: () => void; onExpand: () => void; onClose: () => void;\n onStateChange?: (orbState: OrbState) => void; portraitSrc?: string;\n}) {\n const config = useSiteConfig();\n const resolvedPortrait = portraitSrc ?? config.avatarUrl;\n const { settings: voiceSettings, volumeRef, speedRef } = useVoiceSettings();\n const { state, start, stop, messages, isLLMLoading, getAmplitude, analyser, sendTextMessage, voiceError, dismissError, sessionEnded, lastTimings, applyVolume, settings } = useVoiceAgent({ settings: voiceSettings, volumeRef, speedRef });\n\n useEffect(() => { if (sessionEnded) onClose(); }, [sessionEnded, onClose]);\n\n const [toolResult, setToolResult] = useState<VoiceToolResult | null>(null);\n const orbState = voiceStateToOrbState(state);\n const [backendDown, setBackendDown] = useState(false);\n const autoStartedRef = useRef(false);\n const pollTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const cancelledRef = useRef(false);\n\n const runHealthCheck = useCallback(() => {\n checkLLMHealth().then(({ available }) => {\n if (cancelledRef.current) return;\n setBackendDown(!available);\n if (available) {\n dismissError();\n if (!autoStartedRef.current && settings.autoListen) { autoStartedRef.current = true; startRef.current(); }\n } else {\n if (pollTimerRef.current) clearTimeout(pollTimerRef.current);\n pollTimerRef.current = setTimeout(runHealthCheck, RECOVERY_POLL_MS);\n }\n });\n }, [dismissError, settings.autoListen]);\n\n useEffect(() => { cancelledRef.current = false; runHealthCheck(); return () => { cancelledRef.current = true; if (pollTimerRef.current) clearTimeout(pollTimerRef.current); }; }, [runHealthCheck]);\n\n const onStateChangeRef = useRef(onStateChange);\n useEffect(() => { onStateChangeRef.current = onStateChange; });\n useEffect(() => { onStateChangeRef.current?.(orbState); }, [orbState]);\n\n const startRef = useRef(start);\n const stopRef = useRef(stop);\n useEffect(() => { startRef.current = start; }, [start]);\n useEffect(() => { stopRef.current = stop; }, [stop]);\n useEffect(() => { return () => { stopRef.current(true); }; }, []);\n\n const [micPaused, setMicPaused] = useState(false);\n const [activity, setActivity] = useState(0);\n const hasConversationRef = useRef(false);\n hasConversationRef.current = messages.length > 0;\n const onCollapseRef = useRef(onCollapse);\n useEffect(() => { onCollapseRef.current = onCollapse; });\n\n const bumpActivity = useCallback(() => { setActivity((c) => c + 1); }, []);\n\n const handleMicToggle = useCallback(() => {\n setMicPaused(false); bumpActivity();\n if (state === 'LISTENING' || state === 'USER_SPEAKING') { stop(); }\n else if (state === 'IDLE') { start(); }\n }, [state, start, stop, bumpActivity]);\n\n useEffect(() => { if (panelState === 'hidden') stopRef.current(true); }, [panelState]);\n\n useEffect(() => {\n if (panelState === 'hidden' || micPaused) return;\n if (state === 'PROCESSING' || state === 'AI_SPEAKING') return;\n const timer = setTimeout(() => { stopRef.current(); if (hasConversationRef.current) { setMicPaused(true); } else { onCollapseRef.current(); } }, settings.idleTimeoutMs);\n return () => clearTimeout(timer);\n }, [state, panelState, micPaused, activity, settings.idleTimeoutMs]);\n\n useEffect(() => {\n if (!micPaused || panelState !== 'expanded') return;\n if (settings.panelCollapseTimeoutMs === 0) return;\n const timer = setTimeout(() => { onCollapseRef.current(); }, settings.panelCollapseTimeoutMs);\n return () => clearTimeout(timer);\n }, [micPaused, panelState, activity, settings.panelCollapseTimeoutMs]);\n\n const handleTextSubmit = useCallback((text: string) => { setMicPaused(false); bumpActivity(); sendTextMessage(text); }, [sendTextMessage, bumpActivity]);\n\n const isTyping = state === 'AI_SPEAKING' || isLLMLoading;\n const effectiveError = backendDown ? ('network_error' as const) : voiceError;\n\n const [isRetrying, setIsRetrying] = useState(false);\n const handleRetryClick = useCallback(() => {\n if (isRetrying) return; setIsRetrying(true);\n checkLLMHealth().then(({ available }) => {\n if (cancelledRef.current) return; setIsRetrying(false); setBackendDown(!available);\n if (available) { dismissError(); if (!autoStartedRef.current && settings.autoListen) { autoStartedRef.current = true; startRef.current(); } }\n if (!available) { if (pollTimerRef.current) clearTimeout(pollTimerRef.current); pollTimerRef.current = setTimeout(runHealthCheck, RECOVERY_POLL_MS); }\n }).catch(() => setIsRetrying(false));\n }, [isRetrying, runHealthCheck, dismissError, settings.autoListen]);\n\n const [showSettings, setShowSettings] = useState(false);\n const toggleSettings = useCallback(() => setShowSettings((p) => !p), []);\n\n if (panelState === 'collapsed') {\n return <CollapsedBar orbState={orbState} getAmplitude={getAmplitude} analyser={analyser} voiceState={state} onExpand={onExpand} onClose={onClose} onRetry={handleRetryClick} isRetrying={isRetrying} voiceError={effectiveError} micPaused={micPaused} onMicToggle={handleMicToggle} ttsEnabled={settings.ttsEnabled} copilotName={config.copilotName} portraitSrc={resolvedPortrait} />;\n }\n\n return (\n <div className=\"relative h-full\">\n <ExpandedContent orbState={orbState} getAmplitude={getAmplitude} analyser={analyser} voiceState={state} messages={messages} isTyping={isTyping} toolResult={toolResult} voiceError={effectiveError} dismissError={dismissError} onCollapse={onCollapse} onClose={onClose} onTextSubmit={handleTextSubmit} onMicToggle={handleMicToggle} micPaused={micPaused} onToolDismiss={() => setToolResult(null)} onInteraction={bumpActivity} onRetry={handleRetryClick} isRetrying={isRetrying} lastTimings={lastTimings} showPipelineMetrics={settings.showPipelineMetrics} pipelineMetricsAutoHideMs={settings.pipelineMetricsAutoHideMs} showSettings={showSettings} onSettingsToggle={toggleSettings} ttsEnabled={settings.ttsEnabled} copilotName={config.copilotName} portraitSrc={resolvedPortrait} />\n <AnimatePresence>\n {showSettings && (<Suspense fallback={null}><VoiceSettingsView onBack={toggleSettings} onVolumeChange={applyVolume} /></Suspense>)}\n </AnimatePresence>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main exported component\n// ---------------------------------------------------------------------------\nexport default function GlassCopilotPanel({ isOpen, onOpen, onClose, onStateChange, portraitSrc }: GlassCopilotPanelProps) {\n injectAgentFabCSS();\n const config = useSiteConfig();\n const resolvedPortrait = portraitSrc ?? config.avatarUrl;\n const [internalState, setInternalState] = useState<'collapsed' | 'expanded'>('collapsed');\n const panelState: PanelState = isOpen ? internalState : 'hidden';\n const handleClose = useCallback(() => { onClose(); }, [onClose]);\n const handleCollapse = useCallback(() => { setInternalState('collapsed'); }, []);\n const handleExpand = useCallback(() => { setInternalState('expanded'); }, []);\n\n const isVisible = panelState !== 'hidden';\n const isExpanded = panelState === 'expanded';\n const targetHeight = isExpanded ? PANEL_EXPANDED_HEIGHT : PANEL_COLLAPSED_HEIGHT;\n\n const panelRef = useRef<HTMLDivElement>(null);\n const fabRef = useRef<HTMLDivElement>(null);\n const prevVisibleRef = useRef(isVisible);\n\n useEffect(() => {\n if (isVisible && !prevVisibleRef.current) { requestAnimationFrame(() => panelRef.current?.focus()); }\n else if (!isVisible && prevVisibleRef.current) { requestAnimationFrame(() => { const fabButton = fabRef.current?.querySelector('button'); fabButton?.focus(); }); }\n prevVisibleRef.current = isVisible;\n }, [isVisible]);\n\n const [ariaAnnouncement, setAriaAnnouncement] = useState('');\n const handleStateChange = useCallback((orbState: OrbState) => { setAriaAnnouncement(ARIA_LIVE_LABELS[orbState]); onStateChange?.(orbState); }, [onStateChange]);\n\n return createPortal(\n <VoiceErrorBoundary onReset={handleClose}>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0\" height=\"0\" style={{ position: 'absolute', overflow: 'hidden' }} aria-hidden=\"true\">\n <defs>\n <filter id=\"liquid-glass-panel\" x=\"0%\" y=\"0%\" width=\"100%\" height=\"100%\">\n <feTurbulence type=\"fractalNoise\" baseFrequency=\"0.008 0.008\" numOctaves=\"2\" seed=\"42\" result=\"noise\" />\n <feGaussianBlur in=\"noise\" stdDeviation=\"2\" result=\"blurred_noise\" />\n <feDisplacementMap in=\"SourceGraphic\" in2=\"blurred_noise\" scale=\"50\" xChannelSelector=\"R\" yChannelSelector=\"G\" />\n </filter>\n </defs>\n </svg>\n\n <span aria-live=\"polite\" aria-atomic=\"true\" style={{ position: 'absolute', width: 1, height: 1, padding: 0, margin: -1, overflow: 'hidden', clip: 'rect(0,0,0,0)', whiteSpace: 'nowrap', borderWidth: 0 }}>\n {ariaAnnouncement}\n </span>\n\n <AnimatePresence>\n {!isVisible && (\n <motion.div ref={fabRef} key=\"copilot-fab\" initial={{ scale: 0, opacity: 0 }} animate={{ scale: 1, opacity: 1 }} exit={{ scale: 0, opacity: 0 }} transition={{ duration: 0.25, ease: 'easeOut' }} className=\"fixed\" style={{ bottom: PANEL_BOTTOM, right: PANEL_RIGHT, zIndex: PANEL_Z_INDEX }}>\n <CopilotFAB onClick={() => onOpen?.()} portraitSrc={resolvedPortrait} />\n </motion.div>\n )}\n\n {isVisible && (\n <motion.div ref={panelRef} tabIndex={-1} key=\"copilot-panel\" role=\"dialog\" aria-label=\"Voice Assistant\" aria-modal=\"false\"\n initial={{ width: 48, height: 48, borderRadius: 24, opacity: 0, scale: 0.9 }}\n animate={{ width: PANEL_WIDTH, height: Math.min(targetHeight, window.innerHeight - 48), borderRadius: PANEL_BORDER_RADIUS, opacity: 1, scale: 1, transition: SPRING_PANEL }}\n exit={{ width: 48, height: 48, borderRadius: 24, opacity: 0, scale: 0.95, transition: SPRING_PANEL_EXIT }}\n className=\"fixed\"\n style={{ bottom: PANEL_BOTTOM, right: PANEL_RIGHT, zIndex: PANEL_Z_INDEX, transformOrigin: 'bottom right', maxWidth: 'calc(100vw - 32px)', outline: 'none' }}\n >\n <div className=\"absolute inset-0 pointer-events-none\" style={{ borderRadius: PANEL_BORDER_RADIUS, overflow: 'hidden', backdropFilter: 'blur(2px)', WebkitBackdropFilter: 'blur(2px)', filter: 'url(#liquid-glass-panel)', isolation: 'isolate' }} />\n <div className=\"absolute inset-0 pointer-events-none\" style={{ borderRadius: PANEL_BORDER_RADIUS, overflow: 'hidden', backdropFilter: 'blur(14px) saturate(1.4)', WebkitBackdropFilter: 'blur(14px) saturate(1.4)', backgroundColor: 'rgba(230,232,245,0.32)', border: '1px solid rgba(255,255,255,0.4)', boxShadow: 'inset 0 0 20px -5px rgba(255,255,255,0.3), inset 0 1px 0 0 rgba(255,255,255,0.8), 0 0 0 1px rgba(0,0,0,0.08), 0 1px 3px rgba(0,0,0,0.08), 0 8px 24px rgba(0,0,0,0.14), 0 24px 48px rgba(0,0,0,0.10)' }} />\n <div className=\"absolute inset-0 pointer-events-none\" style={{ borderRadius: PANEL_BORDER_RADIUS, background: 'linear-gradient(to bottom, rgba(255,255,255,0.15) 0%, rgba(255,255,255,0) 20%)' }} />\n <div style={{ position: 'relative', zIndex: 1, height: '100%', overflow: 'hidden', borderRadius: PANEL_BORDER_RADIUS }}>\n <WiredPanel panelState={panelState} onCollapse={handleCollapse} onExpand={handleExpand} onClose={handleClose} onStateChange={handleStateChange} portraitSrc={resolvedPortrait} />\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </VoiceErrorBoundary>,\n document.body\n );\n}\n","import { useRef, useEffect, useState, useCallback } from 'react';\nimport VoiceOrb from './VoiceOrb';\nimport {\n AVATAR_PORTRAIT_RATIO,\n AVATAR_STATE_FILTERS,\n buildGlowColors,\n useSiteConfig,\n} from '@unctad-ai/voice-agent-core';\nimport type { OrbState } from '@unctad-ai/voice-agent-core';\n\n/** Conic gradient colors per state — [color1, color2] */\nconst RING_COLORS: Record<OrbState, [string, string]> = {\n idle: ['#93a3c8', '#b0bfdb'],\n listening: ['#DB2129', '#34d399'],\n processing: ['#F59E0B', '#FBBF24'],\n speaking: ['#14B8A6', '#34d399'],\n error: ['#DC2626', '#991B1B'],\n};\n\ninterface AgentAvatarProps {\n state: OrbState;\n getAmplitude: () => number;\n size?: number;\n showAura?: boolean;\n /** Show audio-reactive conic-gradient ring around portrait */\n showRing?: boolean;\n /** URL for the avatar portrait image */\n portraitSrc?: string;\n /** Monogram letter shown when image fails to load */\n monogram?: string;\n}\n\nfunction lerp(a: number, b: number, t: number) {\n return a + (b - a) * t;\n}\n\nexport default function AgentAvatar({\n state,\n getAmplitude,\n size = 36,\n showAura = true,\n showRing = false,\n portraitSrc,\n monogram,\n}: AgentAvatarProps) {\n const config = useSiteConfig();\n const initial = monogram ?? config.copilotName?.charAt(0)?.toUpperCase() ?? 'A';\n const { colors } = useSiteConfig();\n const AVATAR_GLOW_COLORS = buildGlowColors(colors);\n const portraitSize = Math.round(size * AVATAR_PORTRAIT_RATIO);\n const offset = Math.round((size - portraitSize) / 2);\n\n // Ring sits between aura and portrait — 3px border around portrait\n const ringWidth = 3;\n const ringSize = portraitSize + ringWidth * 2;\n const ringOffset = Math.round((size - ringSize) / 2);\n\n const imgRef = useRef<HTMLImageElement>(null);\n const glowRef = useRef<HTMLDivElement>(null);\n const ringRef = useRef<HTMLDivElement>(null);\n const rafRef = useRef<number>(0);\n const stateRef = useRef<OrbState>(state);\n useEffect(() => {\n stateRef.current = state;\n });\n const getAmpRef = useRef(getAmplitude);\n useEffect(() => {\n getAmpRef.current = getAmplitude;\n });\n\n const [loaded, setLoaded] = useState(false);\n const [errored, setErrored] = useState(false);\n\n // Detect prefers-reduced-motion\n const reducedRef = useRef(false);\n useEffect(() => {\n const mql = window.matchMedia('(prefers-reduced-motion: reduce)');\n reducedRef.current = mql.matches;\n const handler = (e: MediaQueryListEvent) => {\n reducedRef.current = e.matches;\n };\n mql.addEventListener('change', handler);\n return () => mql.removeEventListener('change', handler);\n }, []);\n\n // Animated filter values — lerped each frame, no React re-renders\n const animRef = useRef({\n brightness: AVATAR_STATE_FILTERS.idle.brightness,\n saturate: AVATAR_STATE_FILTERS.idle.saturate,\n opacity: AVATAR_STATE_FILTERS.idle.opacity,\n scale: AVATAR_STATE_FILTERS.idle.scale,\n glowIntensity: AVATAR_STATE_FILTERS.idle.glowIntensity,\n ringAngle: 0,\n });\n\n useEffect(() => {\n let startTime: number | null = null;\n let prevTimestamp = 0;\n\n const tick = (timestamp: number) => {\n if (startTime === null) startTime = timestamp;\n const elapsed = (timestamp - startTime) / 1000;\n const dt = prevTimestamp ? (timestamp - prevTimestamp) / 1000 : 0.016;\n prevTimestamp = timestamp;\n\n const target = AVATAR_STATE_FILTERS[stateRef.current];\n const a = animRef.current;\n const speed = 0.08;\n\n a.brightness = lerp(a.brightness, target.brightness, speed);\n a.saturate = lerp(a.saturate, target.saturate, speed);\n a.scale = lerp(a.scale, target.scale, speed);\n a.glowIntensity = lerp(a.glowIntensity, target.glowIntensity, speed);\n\n // Processing opacity pulses\n let targetOpacity = target.opacity;\n if (stateRef.current === 'processing') {\n targetOpacity = 0.92 + Math.sin(elapsed * 4) * 0.06;\n }\n a.opacity = lerp(a.opacity, targetOpacity, speed);\n\n // Speaking state: portrait scale reacts to amplitude\n const amp = getAmpRef.current();\n const ampFactor = reducedRef.current ? 0.2 : 1;\n let scaleBoost = 0;\n if (stateRef.current === 'speaking') {\n scaleBoost = amp * 0.03 * ampFactor;\n }\n\n // Apply to portrait image via direct DOM mutation\n const img = imgRef.current;\n if (img) {\n img.style.filter = `brightness(${a.brightness}) saturate(${a.saturate})`;\n img.style.opacity = String(a.opacity);\n img.style.transform = `scale(${a.scale + scaleBoost})`;\n }\n\n // Apply glow overlay\n const glow = glowRef.current;\n if (glow) {\n glow.style.backgroundColor = AVATAR_GLOW_COLORS[stateRef.current];\n glow.style.opacity = String(a.glowIntensity);\n }\n\n // Audio-reactive ring\n const ring = ringRef.current;\n if (ring) {\n const ringColors = RING_COLORS[stateRef.current];\n // Rotation: base 120 deg/s, amplitude boosts up to 3x\n const rotSpeed = reducedRef.current ? 0 : 120 * (1 + amp * 2);\n a.ringAngle = (a.ringAngle + rotSpeed * dt) % 360;\n // Ring opacity: idle = subtle, active states = brighter with amplitude boost\n const isActive = stateRef.current !== 'idle';\n const ringOpacity = isActive ? 0.7 + amp * 0.3 : 0.35;\n // Scale pulse with amplitude\n const ringScale = 1 + amp * 0.04 * ampFactor;\n\n ring.style.background = `conic-gradient(from ${a.ringAngle}deg, ${ringColors[0]}, ${ringColors[1]}, ${ringColors[0]})`;\n ring.style.opacity = String(ringOpacity);\n ring.style.transform = `scale(${ringScale})`;\n }\n\n rafRef.current = requestAnimationFrame(tick);\n };\n\n rafRef.current = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(rafRef.current);\n }, []);\n\n const handleLoad = useCallback(() => setLoaded(true), []);\n const handleError = useCallback(() => setErrored(true), []);\n\n return (\n <div\n style={{\n position: 'relative',\n width: size,\n height: size,\n flexShrink: 0,\n }}\n >\n {/* Layer 1: Aura — VoiceOrb as reactive background */}\n {showAura && (\n <div style={{ position: 'absolute', inset: 0 }}>\n <VoiceOrb state={state} getAmplitude={getAmplitude} size={size} />\n </div>\n )}\n\n {/* Layer 1.5: Audio-reactive conic-gradient ring */}\n {showRing && (\n <div\n ref={ringRef}\n style={{\n position: 'absolute',\n top: ringOffset,\n left: ringOffset,\n width: ringSize,\n height: ringSize,\n borderRadius: '50%',\n background: `conic-gradient(from 0deg, ${RING_COLORS.idle[0]}, ${RING_COLORS.idle[1]}, ${RING_COLORS.idle[0]})`,\n opacity: 0.35,\n WebkitMask: `radial-gradient(circle, transparent ${Math.round((portraitSize / ringSize) * 50)}%, black ${Math.round((portraitSize / ringSize) * 50)}%)`,\n mask: `radial-gradient(circle, transparent ${Math.round((portraitSize / ringSize) * 50)}%, black ${Math.round((portraitSize / ringSize) * 50)}%)`,\n pointerEvents: 'none',\n willChange: 'transform, background, opacity',\n }}\n />\n )}\n\n {/* Layer 2: Glow overlay — color wash per state */}\n <div\n ref={glowRef}\n style={{\n position: 'absolute',\n top: offset,\n left: offset,\n width: portraitSize,\n height: portraitSize,\n borderRadius: '50%',\n mixBlendMode: 'soft-light',\n opacity: 0,\n pointerEvents: 'none',\n transition: 'background-color 0.3s',\n }}\n />\n\n {/* Layer 3: Portrait */}\n <div\n style={{\n position: 'absolute',\n top: offset,\n left: offset,\n width: portraitSize,\n height: portraitSize,\n borderRadius: '50%',\n overflow: 'hidden',\n }}\n >\n {errored || !portraitSrc ? (\n // Monogram fallback\n <div\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: colors.primary,\n color: 'white',\n fontFamily: 'DM Sans, sans-serif',\n fontWeight: 700,\n fontSize: Math.round(portraitSize * 0.45),\n }}\n >\n {initial}\n </div>\n ) : (\n <img\n ref={imgRef}\n src={portraitSrc}\n alt=\"Avatar\"\n onLoad={handleLoad}\n onError={handleError}\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n borderRadius: '50%',\n opacity: loaded ? 0.95 : 0,\n transition: loaded ? 'none' : 'opacity 0.3s ease-in',\n willChange: 'filter, transform, opacity',\n }}\n draggable={false}\n />\n )}\n </div>\n </div>\n );\n}\n","import { useRef, useEffect, useCallback, useState } from 'react';\nimport { createNoise3D } from 'simplex-noise';\nimport { ORB_NUM_POINTS, ORB_LERP_SPEED, useSiteConfig } from '@unctad-ai/voice-agent-core';\nimport type { OrbState } from '@unctad-ai/voice-agent-core';\n\ninterface VoiceOrbProps {\n state: OrbState;\n /** Getter function called each animation frame — avoids 60fps React re-renders */\n getAmplitude: () => number;\n size?: number;\n}\n\n// ---------- state config ----------\n\ninterface StateConfig {\n colors: [string, string];\n noiseSpeed: number;\n noiseMag: number;\n baseScale: number;\n breathAmp: number;\n breathSpeed: number;\n rotation: number;\n shimmer: boolean;\n}\n\n/** Glow color that pulses around the orb per state */\nconst STATE_GLOW: Record<OrbState, string> = {\n idle: 'rgba(59, 130, 246, 0.25)',\n listening: 'rgba(219, 33, 41, 0.45)',\n processing: 'rgba(245, 158, 11, 0.4)',\n speaking: 'rgba(20, 184, 166, 0.4)',\n error: 'rgba(220, 38, 38, 0.4)',\n};\n\nfunction buildStateConfig(primaryColor: string): Record<OrbState, StateConfig> {\n return {\n idle: {\n colors: ['#1E3A5F', '#3B82F6'],\n noiseSpeed: 0.3,\n noiseMag: 8,\n baseScale: 0.975,\n breathAmp: 0.025,\n breathSpeed: 0.25,\n rotation: 0,\n shimmer: false,\n },\n listening: {\n colors: [primaryColor, '#F59E0B'],\n noiseSpeed: 0.6,\n noiseMag: 18,\n baseScale: 1.0,\n breathAmp: 0.04,\n breathSpeed: 0.5,\n rotation: 0,\n shimmer: false,\n },\n processing: {\n colors: ['#D97706', '#FBBF24'],\n noiseSpeed: 1.0,\n noiseMag: 14,\n baseScale: 1.0,\n breathAmp: 0.02,\n breathSpeed: 0.8,\n rotation: 0.4,\n shimmer: true,\n },\n speaking: {\n colors: ['#1B7A50', '#2DD4BF'],\n noiseSpeed: 0.5,\n noiseMag: 16,\n baseScale: 1.0,\n breathAmp: 0.05,\n breathSpeed: 0.4,\n rotation: 0,\n shimmer: false,\n },\n error: {\n colors: ['#DC2626', '#991B1B'],\n noiseSpeed: 1.4,\n noiseMag: 22,\n baseScale: 0.95,\n breathAmp: 0.01,\n breathSpeed: 1.2,\n rotation: 0,\n shimmer: false,\n },\n };\n}\n\nconst NUM_POINTS = ORB_NUM_POINTS;\nconst LERP_SPEED = ORB_LERP_SPEED;\n\nfunction useReducedMotion() {\n const [reduced, setReduced] = useState(\n () => window.matchMedia('(prefers-reduced-motion: reduce)').matches\n );\n useEffect(() => {\n const mql = window.matchMedia('(prefers-reduced-motion: reduce)');\n const handler = (e: MediaQueryListEvent) => setReduced(e.matches);\n mql.addEventListener('change', handler);\n return () => mql.removeEventListener('change', handler);\n }, []);\n return reduced;\n}\n\nfunction lerp(a: number, b: number, t: number) {\n return a + (b - a) * t;\n}\n\nfunction lerpColor(a: string, b: string, t: number): string {\n const parseHex = (h: string) => [\n parseInt(h.slice(1, 3), 16),\n parseInt(h.slice(3, 5), 16),\n parseInt(h.slice(5, 7), 16),\n ];\n const ca = parseHex(a);\n const cb = parseHex(b);\n const r = Math.round(lerp(ca[0], cb[0], t));\n const g = Math.round(lerp(ca[1], cb[1], t));\n const bl = Math.round(lerp(ca[2], cb[2], t));\n return `#${((1 << 24) | (r << 16) | (g << 8) | bl).toString(16).slice(1)}`;\n}\n\nexport default function VoiceOrb({ state, getAmplitude, size = 200 }: VoiceOrbProps) {\n const config = useSiteConfig();\n const STATE_CONFIG = buildStateConfig(config.colors.primary);\n\n const svgRef = useRef<SVGSVGElement>(null);\n const rafRef = useRef<number>(0);\n const noise3D = useRef(createNoise3D());\n const prefersReduced = useReducedMotion();\n const reducedRef = useRef(prefersReduced);\n reducedRef.current = prefersReduced;\n\n // Animated (lerped) config values that transition smoothly between states\n const animRef = useRef({\n noiseSpeed: STATE_CONFIG.idle.noiseSpeed,\n noiseMag: STATE_CONFIG.idle.noiseMag,\n baseScale: STATE_CONFIG.idle.baseScale,\n breathAmp: STATE_CONFIG.idle.breathAmp,\n breathSpeed: STATE_CONFIG.idle.breathSpeed,\n rotation: STATE_CONFIG.idle.rotation,\n color0: STATE_CONFIG.idle.colors[0],\n color1: STATE_CONFIG.idle.colors[1],\n shimmer: 0,\n errorShake: 0,\n });\n\n const stateRef = useRef<OrbState>(state);\n stateRef.current = state;\n\n const getAmplitudeRef = useRef(getAmplitude);\n getAmplitudeRef.current = getAmplitude;\n\n const stateConfigRef = useRef(STATE_CONFIG);\n stateConfigRef.current = STATE_CONFIG;\n\n const buildPath = useCallback(\n (time: number, a: typeof animRef.current): string => {\n const cx = size / 2;\n const cy = size / 2;\n const baseR = size * 0.35;\n const amp = getAmplitudeRef.current();\n\n // amplitude influences noise magnitude\n const mag = a.noiseMag + amp * 20;\n\n const points: [number, number][] = [];\n for (let i = 0; i < NUM_POINTS; i++) {\n const angle = (i / NUM_POINTS) * Math.PI * 2;\n const nx = Math.cos(angle);\n const ny = Math.sin(angle);\n const noiseVal = noise3D.current(nx * 1.5, ny * 1.5, time * a.noiseSpeed);\n const r = baseR + noiseVal * mag;\n points.push([cx + Math.cos(angle) * r, cy + Math.sin(angle) * r]);\n }\n\n // Build smooth closed path with cubic beziers\n let d = `M ${points[0][0]},${points[0][1]} `;\n for (let i = 0; i < NUM_POINTS; i++) {\n const curr = points[i];\n const next = points[(i + 1) % NUM_POINTS];\n const prev = points[(i - 1 + NUM_POINTS) % NUM_POINTS];\n const next2 = points[(i + 2) % NUM_POINTS];\n\n const cp1x = curr[0] + (next[0] - prev[0]) / 6;\n const cp1y = curr[1] + (next[1] - prev[1]) / 6;\n const cp2x = next[0] - (next2[0] - curr[0]) / 6;\n const cp2y = next[1] - (next2[1] - curr[1]) / 6;\n\n d += `C ${cp1x},${cp1y} ${cp2x},${cp2y} ${next[0]},${next[1]} `;\n }\n d += 'Z';\n return d;\n },\n [size]\n );\n\n useEffect(() => {\n let startTime: number | null = null;\n\n const tick = (timestamp: number) => {\n if (startTime === null) startTime = timestamp;\n const elapsed = (timestamp - startTime) / 1000;\n\n const target = stateConfigRef.current[stateRef.current];\n const a = animRef.current;\n\n // When prefers-reduced-motion is active, dampen animations significantly\n const rd = reducedRef.current ? 0.15 : 1;\n\n // Lerp all animated values toward target\n a.noiseSpeed = lerp(a.noiseSpeed, target.noiseSpeed * rd, LERP_SPEED);\n a.noiseMag = lerp(a.noiseMag, target.noiseMag * rd, LERP_SPEED);\n a.baseScale = lerp(a.baseScale, target.baseScale, LERP_SPEED);\n a.breathAmp = lerp(a.breathAmp, target.breathAmp * rd, LERP_SPEED);\n a.breathSpeed = lerp(a.breathSpeed, target.breathSpeed * rd, LERP_SPEED);\n a.rotation = lerp(a.rotation, target.rotation * rd, LERP_SPEED);\n a.shimmer = lerp(a.shimmer, target.shimmer ? (reducedRef.current ? 0 : 1) : 0, LERP_SPEED);\n a.color0 = lerpColor(a.color0, target.colors[0], LERP_SPEED);\n a.color1 = lerpColor(a.color1, target.colors[1], LERP_SPEED);\n\n // Error shake decays\n if (stateRef.current === 'error') {\n a.errorShake = lerp(a.errorShake, 1, 0.1);\n } else {\n a.errorShake = lerp(a.errorShake, 0, 0.08);\n }\n\n const svg = svgRef.current;\n if (!svg) {\n rafRef.current = requestAnimationFrame(tick);\n return;\n }\n\n // Breathing scale\n const breath = a.baseScale + Math.sin(elapsed * Math.PI * 2 * a.breathSpeed) * a.breathAmp;\n\n // Error shake offset\n const shakeX = a.errorShake * Math.sin(elapsed * 30) * 3 * (1 - Math.min(elapsed * 0.3, 1));\n\n // Rotation\n const rot = elapsed * a.rotation * 360;\n\n // Update transform\n const group = svg.querySelector<SVGGElement>('[data-orb-group]');\n if (group) {\n group.setAttribute(\n 'transform',\n `translate(${size / 2 + shakeX}, ${size / 2}) scale(${breath}) rotate(${rot}) translate(${-size / 2}, ${-size / 2})`\n );\n }\n\n // Update blob path\n const path = svg.querySelector<SVGPathElement>('[data-orb-path]');\n if (path) {\n path.setAttribute('d', buildPath(elapsed, a));\n }\n\n // Update gradient colors\n const stop0 = svg.querySelector<SVGStopElement>('[data-stop-0]');\n const stop1 = svg.querySelector<SVGStopElement>('[data-stop-1]');\n if (stop0) stop0.setAttribute('stop-color', a.color0);\n if (stop1) stop1.setAttribute('stop-color', a.color1);\n\n // Shimmer opacity\n const shimmerEl = svg.querySelector<SVGCircleElement>('[data-shimmer]');\n if (shimmerEl) {\n const shimmerOpacity = a.shimmer * (0.15 + Math.sin(elapsed * 6) * 0.1);\n shimmerEl.setAttribute('opacity', String(shimmerOpacity));\n }\n\n // Ambient glow — color follows state, opacity pulses with breath\n const glowEl = svg.querySelector<SVGCircleElement>('[data-orb-glow]');\n if (glowEl) {\n const amp = getAmplitudeRef.current();\n const glowPulse = 0.35 + Math.sin(elapsed * Math.PI * 2 * a.breathSpeed) * 0.15 + amp * 0.3;\n glowEl.setAttribute('opacity', String(Math.min(glowPulse, 1)));\n glowEl.setAttribute('fill', STATE_GLOW[stateRef.current]);\n }\n\n rafRef.current = requestAnimationFrame(tick);\n };\n\n rafRef.current = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(rafRef.current);\n }, [size, buildPath]);\n\n const idRef = useRef<string>(null);\n idRef.current ??= Math.random().toString(36).slice(2, 8);\n const gradientId = `orb-gradient-${idRef.current}`;\n const shimmerId = `orb-shimmer-${idRef.current}`;\n const glowFilterId = `orb-glow-${idRef.current}`;\n\n return (\n <svg\n ref={svgRef}\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n className=\"select-none\"\n style={{ overflow: 'visible' }}\n aria-hidden=\"true\"\n >\n <defs>\n <radialGradient id={gradientId} cx=\"40%\" cy=\"35%\" r=\"60%\">\n <stop data-stop-0 offset=\"0%\" stopColor={STATE_CONFIG.idle.colors[0]} />\n <stop data-stop-1 offset=\"100%\" stopColor={STATE_CONFIG.idle.colors[1]} />\n </radialGradient>\n <radialGradient id={shimmerId} cx=\"30%\" cy=\"30%\" r=\"50%\">\n <stop offset=\"0%\" stopColor=\"white\" stopOpacity=\"0.6\" />\n <stop offset=\"100%\" stopColor=\"white\" stopOpacity=\"0\" />\n </radialGradient>\n <filter id={glowFilterId} x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\">\n <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"18\" />\n </filter>\n </defs>\n {/* Ambient glow halo behind the orb */}\n <circle\n data-orb-glow\n cx={size / 2}\n cy={size / 2}\n r={size * 0.38}\n fill={STATE_GLOW.idle}\n opacity=\"0.5\"\n filter={`url(#${glowFilterId})`}\n />\n <g data-orb-group>\n <path data-orb-path fill={`url(#${gradientId})`} />\n <circle\n data-shimmer\n cx={size / 2}\n cy={size / 2}\n r={size * 0.3}\n fill={`url(#${shimmerId})`}\n opacity=\"0\"\n />\n </g>\n </svg>\n );\n}\n","const AGENT_FAB_CSS = `\n@keyframes agent-fab-rotate {\n from { --agent-angle: 0deg; }\n to { --agent-angle: 360deg; }\n}\n@property --agent-angle {\n syntax: '<angle>';\n initial-value: 0deg;\n inherits: false;\n}\n.agent-fab-border {\n position: relative;\n border-radius: 50%;\n padding: 3px;\n background: conic-gradient(from var(--agent-angle), var(--agent-primary, #db2129) 0%, #34d399 50%, var(--agent-primary, #db2129) 100%);\n animation: agent-fab-rotate 3s linear infinite;\n}\n.agent-fab-border-inner {\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n overflow: hidden;\n width: 100%;\n height: 100%;\n background: #fff;\n}\n.agent-fab-border-inner img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 50%;\n}\n@media (prefers-reduced-motion: reduce) {\n .agent-fab-border { animation: none; }\n}`;\n\nlet injected = false;\nexport function injectAgentFabCSS() {\n if (injected || typeof document === 'undefined') return;\n const style = document.createElement('style');\n style.textContent = AGENT_FAB_CSS;\n document.head.appendChild(style);\n injected = true;\n}\n","import { useState, useEffect, useRef } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { cn } from '../utils';\nimport {\n MAX_VISIBLE_MESSAGES,\n MAX_TEXT_LENGTH,\n TYPEWRITER_DELAY_MS,\n MIN_DISPLAY_LENGTH,\n PANEL_MAX_VISIBLE_MESSAGES,\n PANEL_MAX_TEXT_LENGTH,\n} from '@unctad-ai/voice-agent-core';\nimport type { VoiceMessage, ActionCategory } from '@unctad-ai/voice-agent-core';\nimport type { VoiceErrorType } from './VoiceErrorDisplay';\nimport { ArrowRight, PenLine, MousePointerClick, Search, Info } from 'lucide-react';\n\n/** Strip markdown/HTML artifacts, TTS paralinguistic tags, and emojis — preserves line breaks */\nfunction cleanForDisplay(text: string): string {\n return text\n .replace(/\\[(laugh|chuckle|sigh|gasp|cough|clear throat|sniff|groan|shush)\\]/gi, '') // TTS paralinguistic tags\n .replace(/\\*\\*(.*?)\\*\\*/g, '$1') // **bold** → bold\n .replace(/^\\s*\\*\\s+/gm, '- ') // * list items → dash lists\n .replace(/\\*(.*?)\\*/g, '$1') // *italic* → italic\n .replace(/`([^`]+)`/g, '$1') // `code` → code\n .replace(/^#{1,6}\\s+/gm, '') // # headings → plain text\n .replace(/<br\\s*\\/?>/gi, '\\n') // <br> → newline\n .replace(/<[^>]+>/g, '') // strip remaining HTML tags\n .replace(/\\|[-:\\s|]+\\|/g, '') // table separator rows\n .replace(/\\|/g, '\\n') // | cell dividers → newlines\n .replace(/\\p{Emoji_Presentation}|\\p{Extended_Pictographic}/gu, '') // strip emojis\n .replace(/[ \\t]{3,}/g, ' ') // collapse horizontal whitespace (preserve \\n)\n .replace(/\\n{3,}/g, '\\n\\n') // collapse 3+ newlines to double\n .replace(/^[\\s-]{3,}$/gm, '') // --- horizontal rules\n .trim();\n}\n\n/** Render cleaned text with line breaks and styled list items */\nfunction FormattedText({\n text,\n className,\n style,\n}: {\n text: string;\n className?: string;\n style?: React.CSSProperties;\n}) {\n const lines = text.split('\\n').filter((l) => l.trim().length > 0);\n\n if (lines.length <= 1) {\n return (\n <p className={className} style={style}>\n {text}\n </p>\n );\n }\n\n return (\n <div className={className} style={style}>\n {lines.map((line, i) => {\n const trimmed = line.trim();\n const isListItem = /^\\d+[.)]\\s/.test(trimmed) || /^[-]\\s/.test(trimmed);\n return (\n <p\n key={i}\n style={{\n marginTop: i === 0 ? 0 : isListItem ? 4 : 8,\n paddingLeft: isListItem ? 8 : 0,\n }}\n >\n {trimmed}\n </p>\n );\n })}\n </div>\n );\n}\n\ninterface VoiceTranscriptProps {\n messages: VoiceMessage[];\n isTyping: boolean;\n /** When true, uses minimal text layout (no glass background) for the panel */\n variant?: 'overlay' | 'panel';\n /** When set, replaces the empty-state placeholder with a prominent error message */\n voiceError?: VoiceErrorType;\n}\n\n/** Progressively reveals words while preserving FormattedText structure */\nfunction TypewriterFormattedText({\n text,\n className,\n style,\n}: {\n text: string;\n className?: string;\n style?: React.CSSProperties;\n}) {\n const [visibleWords, setVisibleWords] = useState(0);\n const words = text.split(' ');\n\n useEffect(() => {\n setVisibleWords(0);\n if (words.length === 0) return;\n\n let i = 0;\n const interval = setInterval(() => {\n i++;\n setVisibleWords(i);\n if (i >= words.length) clearInterval(interval);\n }, TYPEWRITER_DELAY_MS);\n\n return () => clearInterval(interval);\n }, [text, words.length]);\n\n const partialText = words.slice(0, visibleWords).join(' ');\n return <FormattedText text={partialText} className={className} style={style} />;\n}\n\n// ---------------------------------------------------------------------------\n// Action Badge — colors aligned to design system\n// ---------------------------------------------------------------------------\n\n// Subtle tints from project palette — same low-opacity family, gentle differentiation\nconst ACTION_CATEGORY_STYLES: Record<\n ActionCategory,\n { bg: string; border: string; text: string; Icon: typeof ArrowRight }\n> = {\n navigation: {\n bg: 'rgba(45,134,89,0.07)',\n border: 'rgba(45,134,89,0.14)',\n text: 'rgba(31,110,71,0.75)',\n Icon: ArrowRight,\n },\n form: {\n bg: 'rgba(110,114,138,0.07)',\n border: 'rgba(110,114,138,0.14)',\n text: 'rgba(85,88,102,0.75)',\n Icon: PenLine,\n },\n ui: {\n bg: 'rgba(141,145,168,0.07)',\n border: 'rgba(141,145,168,0.14)',\n text: 'rgba(85,88,102,0.75)',\n Icon: MousePointerClick,\n },\n search: {\n bg: 'rgba(219,33,41,0.05)',\n border: 'rgba(219,33,41,0.11)',\n text: 'rgba(168,26,31,0.7)',\n Icon: Search,\n },\n info: {\n bg: 'rgba(172,176,195,0.08)',\n border: 'rgba(172,176,195,0.14)',\n text: 'rgba(110,114,138,0.7)',\n Icon: Info,\n },\n};\n\nconst BADGE_CONTAINER_STYLE: React.CSSProperties = {\n display: 'flex',\n justifyContent: 'flex-start',\n};\nconst BADGE_TRANSITION = { duration: 0.2, ease: 'easeOut' as const };\n\nfunction ActionBadge({ msg, count = 1 }: { msg: VoiceMessage; count?: number }) {\n const category = msg.action?.category ?? 'info';\n const styles = ACTION_CATEGORY_STYLES[category];\n const { Icon } = styles;\n\n return (\n <motion.div\n initial={{ opacity: 0, scale: 0.92 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.92 }}\n transition={BADGE_TRANSITION}\n style={BADGE_CONTAINER_STYLE}\n role=\"status\"\n aria-label={count > 1 ? `${msg.text} (${count} times)` : msg.text}\n >\n <span\n className=\"inline-flex items-center gap-1.5 rounded-full\"\n style={{\n padding: '3px 10px',\n fontSize: '11px',\n fontWeight: 500,\n lineHeight: '1.3',\n color: styles.text,\n backgroundColor: styles.bg,\n border: `1px solid ${styles.border}`,\n }}\n >\n <Icon size={11} strokeWidth={2.2} aria-hidden=\"true\" />\n {msg.text}\n {count > 1 && (\n <span\n className=\"inline-flex items-center justify-center rounded-full\"\n style={{\n minWidth: 16,\n height: 16,\n padding: '0 4px',\n fontSize: '10px',\n fontWeight: 600,\n lineHeight: 1,\n color: styles.text,\n backgroundColor: styles.text.replace(/[\\d.]+\\)$/, '0.10)'),\n }}\n >\n {count}x\n </span>\n )}\n </span>\n </motion.div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Group consecutive action badges by action name\n// ---------------------------------------------------------------------------\n\ntype DisplayItem =\n | { type: 'message'; msg: VoiceMessage }\n | { type: 'action'; msg: VoiceMessage; count: number };\n\nfunction groupDisplayItems(messages: VoiceMessage[]): DisplayItem[] {\n const items: DisplayItem[] = [];\n for (const msg of messages) {\n if (msg.role !== 'action') {\n items.push({ type: 'message', msg });\n continue;\n }\n const prev = items[items.length - 1];\n if (prev?.type === 'action' && prev.msg.action?.name === msg.action?.name) {\n prev.count++;\n prev.msg = msg; // keep latest text/timestamp for display\n } else {\n items.push({ type: 'action', msg, count: 1 });\n }\n }\n return items;\n}\n\n/** Filter out noise, protocol leaks, and very short fragments */\nfunction isDisplayWorthy(msg: VoiceMessage): boolean {\n if (msg.role === 'action') return msg.text.trim().length > 0;\n const t = msg.text.trim();\n if (t.length < MIN_DISPLAY_LENGTH) return false;\n const alphaOnly = t.replace(/[\\s\\p{P}\\p{S}]+/gu, '');\n if (alphaOnly.length === 0) return false;\n return true;\n}\n\nexport default function VoiceTranscript({\n messages,\n isTyping,\n variant = 'overlay',\n voiceError,\n}: VoiceTranscriptProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const isPanel = variant === 'panel';\n const maxVisible = isPanel ? PANEL_MAX_VISIBLE_MESSAGES : MAX_VISIBLE_MESSAGES;\n const maxTextLen = isPanel ? PANEL_MAX_TEXT_LENGTH : MAX_TEXT_LENGTH;\n const visible = messages.filter(isDisplayWorthy).slice(-maxVisible);\n\n // Track whether user has manually scrolled away from bottom\n const userScrolledRef = useRef(false);\n const lastMessageCountRef = useRef(0);\n const contentRef = useRef<HTMLDivElement>(null);\n\n // Detect manual scroll: if user scrolls up, stop auto-scrolling\n useEffect(() => {\n if (!isPanel) return;\n const el = containerRef.current;\n if (!el) return;\n const handleScroll = () => {\n const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 40;\n userScrolledRef.current = !atBottom;\n };\n el.addEventListener('scroll', handleScroll, { passive: true });\n return () => el.removeEventListener('scroll', handleScroll);\n }, [isPanel]);\n\n // Reset manual scroll flag when a new message arrives\n useEffect(() => {\n if (visible.length > lastMessageCountRef.current) {\n userScrolledRef.current = false;\n }\n lastMessageCountRef.current = visible.length;\n }, [visible.length]);\n\n // Auto-scroll whenever content height changes (typewriter words, streaming, new messages)\n useEffect(() => {\n if (!isPanel) return;\n const contentEl = contentRef.current;\n const scrollEl = containerRef.current;\n if (!contentEl || !scrollEl) return;\n const observer = new ResizeObserver(() => {\n if (!userScrolledRef.current) {\n scrollEl.scrollTop = scrollEl.scrollHeight;\n }\n });\n observer.observe(contentEl);\n return () => observer.disconnect();\n }, [isPanel]);\n\n if (isPanel) {\n return (\n <div\n ref={containerRef}\n className=\"flex-1 min-h-0 overflow-y-auto overscroll-contain\"\n style={{\n padding: '16px 16px 12px',\n maskImage:\n 'linear-gradient(to bottom, transparent 0%, black 8px, black calc(100% - 8px), transparent 100%)',\n WebkitMaskImage:\n 'linear-gradient(to bottom, transparent 0%, black 8px, black calc(100% - 8px), transparent 100%)',\n }}\n >\n <div ref={contentRef} className=\"flex flex-col\">\n <AnimatePresence mode=\"popLayout\">\n {groupDisplayItems(visible).map((item, idx, arr) => {\n if (item.type === 'action') {\n // Show \"Copilot\" label before first action in a group\n const prevIsAction = idx > 0 && arr[idx - 1].type === 'action';\n const showLabel = !prevIsAction;\n return (\n <motion.div\n key={item.msg.timestamp}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -4 }}\n transition={{ duration: 0.2, ease: 'easeOut' }}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n marginTop: idx === 0 ? 0 : prevIsAction ? 4 : 12,\n }}\n >\n {showLabel && (\n <p\n className=\"font-[DM_Sans] uppercase tracking-wider\"\n style={{\n fontSize: '10px',\n fontWeight: 500,\n letterSpacing: '0.06em',\n color: 'rgba(0,0,0,0.35)',\n marginBottom: '4px',\n }}\n >\n Copilot\n </p>\n )}\n <ActionBadge msg={item.msg} count={item.count} />\n </motion.div>\n );\n }\n\n const { msg } = item;\n const isLast = idx === arr.length - 1;\n const isAI = msg.role === 'assistant';\n\n const cleaned = cleanForDisplay(msg.text);\n const displayText =\n cleaned.length > maxTextLen\n ? cleaned.slice(0, maxTextLen).trimEnd() + '...'\n : cleaned;\n\n return (\n <motion.div\n key={msg.timestamp}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -4 }}\n transition={{ duration: 0.2, ease: 'easeOut' }}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: isAI ? 'flex-start' : 'flex-end',\n marginTop: idx === 0 ? 0 : 12,\n }}\n >\n <p\n className=\"font-[DM_Sans] uppercase tracking-wider\"\n style={{\n fontSize: '10px',\n fontWeight: 500,\n letterSpacing: '0.06em',\n color: isAI ? 'rgba(0,0,0,0.35)' : 'rgba(219,33,41,0.5)',\n marginBottom: '4px',\n }}\n >\n {isAI ? 'Copilot' : 'You'}\n </p>\n <div\n style={{\n ...(isAI\n ? {}\n : {\n backgroundColor: 'rgba(219,33,41,0.07)',\n border: '1px solid rgba(219,33,41,0.12)',\n borderRadius: '14px 14px 4px 14px',\n padding: '10px 14px',\n maxWidth: '88%',\n }),\n }}\n >\n {isAI && isLast && isTyping ? (\n <TypewriterFormattedText\n text={displayText}\n className=\"font-[DM_Sans]\"\n style={{\n fontSize: '14px',\n fontWeight: 400,\n lineHeight: '1.45',\n color: '#1a1a1a',\n }}\n />\n ) : (\n <FormattedText\n text={displayText}\n className=\"font-[DM_Sans]\"\n style={{\n fontSize: '14px',\n fontWeight: isAI ? 400 : 450,\n lineHeight: '1.45',\n color: isAI ? '#1a1a1a' : '#3d0a0b',\n }}\n />\n )}\n </div>\n </motion.div>\n );\n })}\n </AnimatePresence>\n\n {visible.length === 0 &&\n !isTyping &&\n (voiceError === 'llm_failed' || voiceError === 'network_error' ? (\n <motion.div\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.4, delay: 0.15 }}\n className=\"text-center font-[DM_Sans]\"\n style={{ paddingTop: '48px', paddingBottom: '16px' }}\n >\n <div\n className=\"mx-auto rounded-full flex items-center justify-center\"\n style={{\n width: 48,\n height: 48,\n backgroundColor: 'rgba(220, 38, 38, 0.08)',\n marginBottom: '14px',\n }}\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"rgba(220,38,38,0.6)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n <path d=\"M16.72 11.06A10.94 10.94 0 0 1 19 12.55\" />\n <path d=\"M5 12.55a10.94 10.94 0 0 1 5.17-2.39\" />\n <path d=\"M10.71 5.05A16 16 0 0 1 22.56 9\" />\n <path d=\"M1.42 9a15.91 15.91 0 0 1 4.7-2.88\" />\n <path d=\"M8.53 16.11a6 6 0 0 1 6.95 0\" />\n <line x1=\"12\" y1=\"20\" x2=\"12.01\" y2=\"20\" />\n </svg>\n </div>\n <p\n style={{\n fontSize: '15px',\n fontWeight: 600,\n color: 'rgba(0,0,0,0.7)',\n marginBottom: '6px',\n }}\n >\n Service offline\n </p>\n <p\n style={{\n fontSize: '13px',\n color: 'rgba(0,0,0,0.4)',\n lineHeight: '1.4',\n maxWidth: '240px',\n margin: '0 auto',\n }}\n >\n The AI assistant is currently unavailable. Please try again shortly.\n </p>\n </motion.div>\n ) : (\n <motion.p\n initial={{ opacity: 0, y: 4 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.4, delay: 0.2 }}\n className=\"text-center italic font-[DM_Sans]\"\n style={{ fontSize: '14px', color: 'rgba(0,0,0,0.4)', paddingTop: '60px' }}\n >\n Ask me anything\n </motion.p>\n ))}\n\n {isTyping && visible.length === 0 && (\n <motion.p\n initial={{ opacity: 0 }}\n animate={{ opacity: 0.5 }}\n style={{ color: 'rgba(0,0,0,0.4)', fontSize: '14px' }}\n >\n ...\n </motion.p>\n )}\n </div>\n </div>\n );\n }\n\n // Original overlay variant (unchanged)\n return (\n <div\n ref={containerRef}\n className=\"relative w-full max-w-md text-center rounded-2xl overflow-hidden\"\n >\n {/* Glass refraction layer */}\n <div\n className=\"absolute inset-0 rounded-2xl\"\n style={{\n backdropFilter: 'blur(2px)',\n WebkitBackdropFilter: 'blur(2px)',\n filter: 'url(#liquid-glass-orb)',\n isolation: 'isolate',\n }}\n />\n {/* Glass surface */}\n <div\n className=\"absolute inset-0 rounded-2xl\"\n style={{\n backgroundColor: 'rgba(255, 255, 255, 0.6)',\n border: '1px solid rgba(255, 255, 255, 0.4)',\n boxShadow: '0 6px 24px rgba(0, 0, 0, 0.05), inset 0 0 20px -5px rgba(255, 255, 255, 0.5)',\n }}\n />\n {/* Specular highlight */}\n <div\n className=\"absolute inset-0 rounded-2xl pointer-events-none\"\n style={{\n background:\n 'linear-gradient(to bottom, rgba(255,255,255,0.8) 0%, rgba(255,255,255,0) 40%)',\n }}\n />\n {/* Content */}\n <div className=\"relative flex flex-col gap-2 px-6 py-4\">\n <AnimatePresence mode=\"popLayout\">\n {groupDisplayItems(visible).map((item, idx, arr) => {\n if (item.type === 'action') {\n const prevIsAction = idx > 0 && arr[idx - 1].type === 'action';\n return (\n <div key={item.msg.timestamp} style={{ marginTop: prevIsAction ? -4 : 0 }}>\n <ActionBadge msg={item.msg} count={item.count} />\n </div>\n );\n }\n\n const { msg } = item;\n const isLatest = idx === arr.length - 1;\n const isAI = msg.role === 'assistant';\n const isFading = idx < arr.length - 1;\n\n const displayText =\n msg.text.length > maxTextLen\n ? msg.text.slice(0, maxTextLen).trimEnd() + '...'\n : msg.text;\n\n return (\n <motion.p\n key={msg.timestamp}\n initial={{ opacity: 0, y: 12 }}\n animate={{ opacity: isFading ? 0.5 : 1, y: 0 }}\n exit={{ opacity: 0, y: -8 }}\n transition={{ duration: 0.3, ease: 'easeOut' }}\n className={cn('text-lg font-[DM_Sans] leading-relaxed', isAI ? '' : 'italic')}\n style={{\n color: isAI ? '#1a1a1a' : 'rgba(0,0,0,0.7)',\n }}\n >\n {isAI && isLatest && isTyping ? (\n <TypewriterFormattedText text={displayText} />\n ) : (\n displayText\n )}\n </motion.p>\n );\n })}\n </AnimatePresence>\n\n {visible.length === 0 && !isTyping && (\n <motion.p\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.5, delay: 0.3 }}\n className=\"text-lg italic\"\n style={{ color: 'rgba(0,0,0,0.5)' }}\n >\n Ask me anything\n </motion.p>\n )}\n\n {isTyping && visible.length === 0 && (\n <motion.p\n initial={{ opacity: 0 }}\n animate={{ opacity: 0.5 }}\n className=\"text-black/50 text-lg\"\n >\n ...\n </motion.p>\n )}\n </div>\n </div>\n );\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { useEffect } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { ArrowUpRight } from 'lucide-react';\nimport { cn } from '../utils';\nimport type { VoiceToolResult } from '@unctad-ai/voice-agent-core';\n\ninterface VoiceToolCardProps {\n result: VoiceToolResult | null;\n onAction?: (result: VoiceToolResult) => void;\n onDismiss?: () => void;\n /** When 'capsule', uses inline panel capsule style */\n variant?: 'overlay' | 'capsule';\n}\n\nconst AUTO_DISMISS_MS = 8000;\n\nexport default function VoiceToolCard({\n result,\n onAction,\n onDismiss,\n variant = 'overlay',\n}: VoiceToolCardProps) {\n useEffect(() => {\n if (!result) return;\n const timer = setTimeout(() => onDismiss?.(), AUTO_DISMISS_MS);\n return () => clearTimeout(timer);\n }, [result, onDismiss]);\n\n const isCapsule = variant === 'capsule';\n\n return (\n <AnimatePresence>\n {result && (\n <motion.div\n initial={{ opacity: 0, y: isCapsule ? 8 : 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: isCapsule ? 4 : 10 }}\n transition={{ duration: 0.3, ease: 'easeOut' }}\n className={cn(\n 'cursor-pointer transition-colors duration-200',\n isCapsule\n ? 'w-full rounded-xl px-4 py-2.5 flex items-center gap-3'\n : 'bg-white/10 backdrop-blur-md rounded-xl border border-white/20 px-5 py-4 max-w-sm w-full hover:bg-white/15'\n )}\n style={\n isCapsule\n ? {\n backgroundColor: 'rgba(0,0,0,0.04)',\n border: '1px solid rgba(0,0,0,0.08)',\n }\n : undefined\n }\n onClick={() => onAction?.(result)}\n onMouseEnter={\n isCapsule\n ? (e) => {\n (e.currentTarget as HTMLElement).style.backgroundColor = 'rgba(0,0,0,0.06)';\n }\n : undefined\n }\n onMouseLeave={\n isCapsule\n ? (e) => {\n (e.currentTarget as HTMLElement).style.backgroundColor = 'rgba(0,0,0,0.04)';\n }\n : undefined\n }\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onAction?.(result);\n }\n }}\n >\n {isCapsule ? (\n <>\n <ArrowUpRight\n className=\"shrink-0\"\n style={{ width: 14, height: 14, color: 'rgba(0,0,0,0.5)' }}\n />\n <span\n className=\"font-[DM_Sans] truncate\"\n style={{ fontSize: '13px', fontWeight: 500, color: 'rgba(0,0,0,0.7)' }}\n >\n {result.displayText}\n </span>\n </>\n ) : (\n <>\n <p className=\"text-white/50 text-xs uppercase tracking-wider mb-1\">{result.name}</p>\n <p className=\"text-white text-sm leading-relaxed\">{result.displayText}</p>\n </>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n","import { Component } from 'react';\nimport type { ReactNode, ErrorInfo } from 'react';\nimport { cn } from '../utils';\nimport { AlertTriangle, RefreshCw } from 'lucide-react';\n\ninterface Props {\n children: ReactNode;\n onReset?: () => void;\n}\n\ninterface State {\n hasError: boolean;\n error: Error | null;\n}\n\nexport default class VoiceErrorBoundary extends Component<Props, State> {\n state: State = { hasError: false, error: null };\n\n static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n console.error('Voice component error:', error, info.componentStack);\n }\n\n handleReset = () => {\n this.setState({ hasError: false, error: null });\n this.props.onReset?.();\n };\n\n render() {\n if (this.state.hasError) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-4 p-8 text-center\">\n <AlertTriangle className=\"h-10 w-10 text-red-400\" />\n <p className=\"text-white text-lg\">Something went wrong with the voice assistant.</p>\n <p className=\"text-white/50 text-sm max-w-sm\">\n {this.state.error?.message || 'An unexpected error occurred.'}\n </p>\n <button\n onClick={this.handleReset}\n className={cn(\n 'flex items-center gap-2 px-4 py-2',\n 'bg-white/10 backdrop-blur-md rounded-full',\n 'text-white text-sm hover:bg-white/20 transition-colors cursor-pointer'\n )}\n >\n <RefreshCw className=\"h-4 w-4\" />\n Try again\n </button>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n","import { motion, AnimatePresence } from 'motion/react';\nimport { AlertTriangle, Hourglass, Mic, MicOff, VolumeX, Wifi, WifiOff } from 'lucide-react';\nimport { cn } from '../utils';\n\nexport type VoiceErrorType =\n | 'mic_denied'\n | 'mic_unavailable'\n | 'vad_load_failed'\n | 'stt_failed'\n | 'tts_failed'\n | 'network_error'\n | 'llm_failed'\n | 'speech_too_short'\n | 'not_addressed'\n | 'processing'\n | null;\n\ninterface VoiceErrorDisplayProps {\n error: VoiceErrorType;\n onDismiss: () => void;\n}\n\ntype Severity = 'error' | 'warning' | 'info';\n\nconst SEVERITY_STYLES: Record<\n Severity,\n { bg: string; border: string; icon: string; text: string; dismiss: string }\n> = {\n error: {\n bg: 'rgba(220, 38, 38, 0.08)',\n border: 'rgba(220, 38, 38, 0.15)',\n icon: 'text-red-500',\n text: 'text-red-700',\n dismiss: 'text-red-400 hover:text-red-600',\n },\n warning: {\n bg: 'rgba(217, 119, 6, 0.08)',\n border: 'rgba(217, 119, 6, 0.15)',\n icon: 'text-amber-500',\n text: 'text-amber-700',\n dismiss: 'text-amber-400 hover:text-amber-600',\n },\n info: {\n bg: 'rgba(0, 0, 0, 0.04)',\n border: 'rgba(0, 0, 0, 0.08)',\n icon: 'text-neutral-500',\n text: 'text-neutral-600',\n dismiss: 'text-neutral-400 hover:text-neutral-600',\n },\n};\n\nconst ERROR_CONFIG: Record<\n NonNullable<VoiceErrorType>,\n { icon: typeof AlertTriangle; title: string; severity: Severity }\n> = {\n mic_denied: {\n icon: MicOff,\n title: 'Microphone access denied',\n severity: 'error',\n },\n mic_unavailable: {\n icon: MicOff,\n title: 'No microphone found',\n severity: 'error',\n },\n vad_load_failed: {\n icon: AlertTriangle,\n title: 'Voice detection unavailable',\n severity: 'warning',\n },\n stt_failed: {\n icon: Mic,\n title: \"Didn't catch that\",\n severity: 'info',\n },\n tts_failed: {\n icon: AlertTriangle,\n title: 'Voice response unavailable',\n severity: 'warning',\n },\n network_error: {\n icon: WifiOff,\n title: 'Connection lost',\n severity: 'error',\n },\n llm_failed: {\n icon: Wifi,\n title: 'AI service unavailable',\n severity: 'error',\n },\n speech_too_short: {\n icon: Mic,\n title: \"Didn't catch that\",\n severity: 'info',\n },\n not_addressed: {\n icon: VolumeX,\n title: 'Not addressed to me',\n severity: 'info',\n },\n processing: {\n icon: Hourglass,\n title: 'Still processing...',\n severity: 'info',\n },\n};\n\nexport default function VoiceErrorDisplay({ error, onDismiss }: VoiceErrorDisplayProps) {\n return (\n <AnimatePresence>\n {error && (\n <motion.div\n initial={{ opacity: 0, y: 16, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: -8, scale: 0.95 }}\n transition={{ duration: 0.25 }}\n className={cn('max-w-xs mx-auto', 'rounded-xl', 'px-4 py-2')}\n style={{\n backgroundColor: SEVERITY_STYLES[ERROR_CONFIG[error].severity].bg,\n border: `1px solid ${SEVERITY_STYLES[ERROR_CONFIG[error].severity].border}`,\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n pointerEvents: 'auto',\n }}\n >\n {(() => {\n const config = ERROR_CONFIG[error];\n const styles = SEVERITY_STYLES[config.severity];\n const Icon = config.icon;\n return (\n <div className=\"flex items-center gap-2\">\n <Icon className={cn('h-4 w-4 shrink-0', styles.icon)} />\n <span className={cn('text-xs flex-1', styles.text)}>{config.title}</span>\n <button\n onClick={onDismiss}\n className={cn('text-xs transition-colors cursor-pointer', styles.dismiss)}\n >\n ×\n </button>\n </div>\n );\n })()}\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport type { PipelineTimings } from '@unctad-ai/voice-agent-core';\nimport {\n DEFAULT_SHOW_PIPELINE_METRICS,\n DEFAULT_PIPELINE_METRICS_AUTO_HIDE_MS,\n} from '@unctad-ai/voice-agent-core';\n\nfunction fmt(ms: number): string {\n return ms >= 1000 ? `${(ms / 1000).toFixed(1)}s` : `${Math.round(ms)}ms`;\n}\n\nexport default function PipelineMetricsBar({\n timings,\n show = DEFAULT_SHOW_PIPELINE_METRICS,\n autoHideMs = DEFAULT_PIPELINE_METRICS_AUTO_HIDE_MS,\n}: {\n timings: PipelineTimings | null;\n show?: boolean;\n autoHideMs?: number;\n}) {\n const [visible, setVisible] = useState(false);\n const [display, setDisplay] = useState<PipelineTimings | null>(null);\n\n // React-recommended pattern: adjust state during render based on prop change.\n // https://react.dev/reference/react/useState#storing-information-from-previous-renders\n const [prevTimings, setPrevTimings] = useState(timings);\n if (timings !== prevTimings) {\n setPrevTimings(timings);\n if (timings) {\n setDisplay(timings);\n setVisible(true);\n }\n }\n\n // Auto-hide timer: only the setTimeout callback calls setState (async, not synchronous)\n useEffect(() => {\n if (!visible || autoHideMs <= 0) return;\n const timer = setTimeout(() => setVisible(false), autoHideMs);\n return () => clearTimeout(timer);\n }, [visible, display, autoHideMs]);\n\n if (!display || !show) return null;\n\n const pills: { label: string; value: string }[] = [];\n\n pills.push({ label: display.pipeline, value: '' });\n\n if (display.sttMs != null) pills.push({ label: 'STT', value: fmt(display.sttMs) });\n if (display.llmTotalMs != null) pills.push({ label: 'LLM', value: fmt(display.llmTotalMs) });\n if (display.ttsFirstChunkMs != null && display.ttsTotalMs != null) {\n pills.push({\n label: 'TTS',\n value: `${fmt(display.ttsFirstChunkMs)} / ${fmt(display.ttsTotalMs)}`,\n });\n } else if (display.ttsMs != null) {\n pills.push({ label: 'TTS', value: fmt(display.ttsMs) });\n }\n pills.push({ label: 'Total', value: fmt(display.totalMs) });\n\n return (\n <AnimatePresence>\n {visible && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 28 }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.2, ease: [0.25, 0.1, 0.25, 1] }}\n className=\"flex items-center gap-2 overflow-hidden select-none\"\n style={{\n height: 28,\n padding: '0 16px',\n fontSize: 11,\n fontFamily: 'DM Sans, sans-serif',\n fontVariantNumeric: 'tabular-nums',\n borderTop: '1px solid rgba(0,0,0,0.06)',\n background: 'rgba(0,0,0,0.03)',\n }}\n >\n {pills.map((p, i) =>\n i === 0 ? (\n <span\n key=\"type\"\n style={{\n color: 'rgba(0,0,0,0.35)',\n fontWeight: 500,\n textTransform: 'uppercase',\n fontSize: 10,\n letterSpacing: '0.04em',\n }}\n >\n {p.label}\n </span>\n ) : (\n <span key={p.label} className=\"inline-flex items-center gap-1\">\n <span style={{ color: 'rgba(0,0,0,0.4)' }}>{p.label}</span>\n <span style={{ color: 'rgba(0,0,0,0.65)', fontWeight: 500 }}>{p.value}</span>\n </span>\n )\n )}\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport type { OrbState } from '@unctad-ai/voice-agent-core';\n\ninterface VoiceA11yAnnouncerProps {\n isOpen: boolean;\n orbState: OrbState;\n}\n\nconst STATE_ANNOUNCEMENTS: Record<OrbState, string> = {\n idle: 'Voice assistant ready',\n listening: 'Listening for your question',\n processing: 'Processing your request',\n speaking: 'Assistant is responding',\n error: 'An error occurred',\n};\n\nexport default function VoiceA11yAnnouncer({ isOpen, orbState }: VoiceA11yAnnouncerProps) {\n const prevOpen = useRef(isOpen);\n const prevState = useRef(orbState);\n const announceRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!announceRef.current) return;\n\n if (isOpen && !prevOpen.current) {\n announceRef.current.textContent =\n 'Voice assistant opened. Press Escape to close. Use Ctrl+Shift+V to toggle.';\n } else if (!isOpen && prevOpen.current) {\n announceRef.current.textContent = 'Voice assistant closed';\n } else if (isOpen && orbState !== prevState.current) {\n announceRef.current.textContent = STATE_ANNOUNCEMENTS[orbState];\n }\n\n prevOpen.current = isOpen;\n prevState.current = orbState;\n }, [isOpen, orbState]);\n\n return (\n <div\n ref={announceRef}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"sr-only\"\n role=\"status\"\n />\n );\n}\n","import { motion, AnimatePresence, useReducedMotion } from 'motion/react';\nimport { Mic } from 'lucide-react';\nimport { useSiteConfig } from '@unctad-ai/voice-agent-core';\n\ninterface VoiceCopilotFABProps {\n onClick: () => void;\n isActive?: boolean;\n isOverlayOpen?: boolean;\n onMouseEnter?: () => void;\n}\n\nexport default function VoiceCopilotFAB({\n onClick,\n isActive,\n isOverlayOpen,\n onMouseEnter,\n}: VoiceCopilotFABProps) {\n const prefersReduced = useReducedMotion();\n const { colors } = useSiteConfig();\n\n return (\n <AnimatePresence>\n {!isOverlayOpen && (\n <motion.div\n key=\"voice-fab-wrapper\"\n initial={{ scale: 0, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0, opacity: 0 }}\n transition={{ duration: 0.25, ease: 'easeOut' }}\n className=\"fixed bottom-6 right-6 z-50\"\n >\n <motion.button\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n animate={prefersReduced ? {} : { scale: [1, 1.15, 1] }}\n transition={\n prefersReduced\n ? {}\n : { scale: { duration: 1.5, repeat: Infinity, ease: 'easeInOut' } }\n }\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.95 }}\n className=\"relative rounded-full p-3 shadow-lg text-white transition-all cursor-pointer\"\n style={{ backgroundColor: colors.primary }}\n aria-label=\"Open voice assistant\"\n >\n {isActive ? (\n <span className=\"h-3 w-3 rounded-full bg-white animate-pulse\" />\n ) : (\n <Mic className=\"w-6 h-6\" />\n )}\n </motion.button>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n","import { useState, useRef, useEffect } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { Keyboard, Send, X } from 'lucide-react';\nimport { cn } from '../utils';\nimport { useSiteConfig } from '@unctad-ai/voice-agent-core';\nimport type { VoiceState } from '@unctad-ai/voice-agent-core';\n\ninterface VoiceControlsProps {\n state: VoiceState;\n onTextSubmit: (text: string) => void;\n isListening: boolean;\n}\n\nconst STATE_LABELS: Record<VoiceState, string> = {\n IDLE: 'How can I help you?',\n LISTENING: \"I'm listening...\",\n USER_SPEAKING: 'Go ahead...',\n PROCESSING: 'Let me look into that...',\n AI_SPEAKING: \"Here's what I found...\",\n};\n\n/** Shared glass-pill style for control buttons */\nconst GLASS_PILL_BASE = cn(\n 'backdrop-blur-xl rounded-full',\n 'flex items-center justify-center',\n 'border border-white/15',\n 'transition-all duration-200 cursor-pointer',\n 'hover:border-white/30 hover:shadow-[0_0_16px_rgba(255,255,255,0.08)]'\n);\n\nexport default function VoiceControls({ state, onTextSubmit, isListening }: VoiceControlsProps) {\n const { colors } = useSiteConfig();\n const [showTextInput, setShowTextInput] = useState(false);\n const [text, setText] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (showTextInput) inputRef.current?.focus();\n }, [showTextInput]);\n\n const handleSubmit = () => {\n const trimmed = text.trim();\n if (!trimmed) return;\n onTextSubmit(trimmed);\n setText('');\n setShowTextInput(false);\n };\n\n return (\n <div className=\"w-full max-w-2xl mx-auto mt-auto pb-8 px-4\">\n <AnimatePresence mode=\"wait\">\n {showTextInput ? (\n <motion.div\n key=\"text-input\"\n initial={{ opacity: 0, y: 16, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 16, scale: 0.95 }}\n transition={{ duration: 0.25, ease: [0.22, 1, 0.36, 1] }}\n className={cn(\n 'rounded-full',\n 'flex items-center gap-4',\n 'border border-white/20',\n 'px-8 py-3'\n )}\n style={{\n backgroundColor: 'rgba(0, 0, 0, 0.4)',\n backdropFilter: 'blur(16px) saturate(1.2)',\n WebkitBackdropFilter: 'blur(16px) saturate(1.2)',\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && handleSubmit()}\n placeholder=\"Ask a question...\"\n className=\"flex-1 text-sm placeholder:text-white/40 min-w-0\"\n style={{\n color: 'white',\n background: 'none',\n border: 'none',\n outline: 'none',\n boxShadow: 'none',\n WebkitAppearance: 'none',\n padding: 0,\n }}\n />\n <motion.button\n onClick={handleSubmit}\n whileTap={{ scale: 0.9 }}\n className=\"rounded-full p-2 text-white transition-colors cursor-pointer\"\n style={{ backgroundColor: colors.primary }}\n aria-label=\"Send message\"\n >\n <Send className=\"h-4 w-4\" />\n </motion.button>\n <button\n onClick={() => {\n setShowTextInput(false);\n setText('');\n }}\n className=\"rounded-full p-2 text-white/60 hover:text-white hover:bg-white/10 transition-all cursor-pointer\"\n aria-label=\"Cancel text input\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </motion.div>\n ) : (\n <motion.div\n key=\"controls\"\n initial={{ opacity: 0, y: 16, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 16, scale: 0.95 }}\n transition={{ duration: 0.25, ease: [0.22, 1, 0.36, 1] }}\n className=\"flex items-center justify-center gap-3\"\n >\n {/* Mic status + keyboard — unified control bar */}\n <div\n className={cn(\n 'rounded-full',\n 'text-white text-sm font-medium',\n 'flex items-center gap-6',\n 'border border-white/20',\n 'pl-8 pr-4 py-1.5'\n )}\n style={{\n backgroundColor: 'rgba(0, 0, 0, 0.4)',\n backdropFilter: 'blur(16px) saturate(1.2)',\n WebkitBackdropFilter: 'blur(16px) saturate(1.2)',\n color: 'white',\n }}\n >\n {/* Pulse dot */}\n <span className=\"relative flex items-center justify-center w-3 h-3 ml-0.5\">\n {isListening && (\n <span\n className=\"absolute inset-0 rounded-full animate-ping\"\n style={{ backgroundColor: `${colors.primary}80` }}\n />\n )}\n <span\n className={cn(\n 'relative h-2.5 w-2.5 rounded-full transition-colors duration-300',\n )}\n style={isListening ? {\n backgroundColor: colors.primary,\n boxShadow: `0 0 8px ${colors.primary}99`,\n } : {\n backgroundColor: 'rgba(255,255,255,0.3)',\n }}\n />\n </span>\n {/* Animated label */}\n <AnimatePresence mode=\"wait\">\n <motion.span\n key={state}\n initial={{ opacity: 0, y: 4 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -4 }}\n transition={{ duration: 0.2 }}\n className=\"pr-1\"\n >\n {STATE_LABELS[state]}\n </motion.span>\n </AnimatePresence>\n\n {/* Type button — integrated into the bar */}\n <button\n onClick={() => setShowTextInput(true)}\n className={cn(\n 'rounded-full p-2',\n 'text-white/60 hover:text-white',\n 'hover:bg-white/10',\n 'transition-all duration-200 cursor-pointer'\n )}\n aria-label=\"Type a message\"\n >\n <Keyboard className=\"h-4 w-4\" />\n </button>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n}\n","import { useRef, useEffect, useState } from 'react';\nimport {\n DOT_RING_COUNT,\n DOT_RING_GAP,\n DOT_RING_BASE_RADIUS,\n DOT_RING_PEAK_RADIUS,\n DOT_RING_SMOOTHING,\n} from '@unctad-ai/voice-agent-core';\nimport type { OrbState } from '@unctad-ai/voice-agent-core';\n\ninterface VoiceDotRingProps {\n analyserNode: AnalyserNode | null;\n state: OrbState;\n orbRadius: number;\n}\n\nconst STATE_COLORS: Record<OrbState, string> = {\n idle: 'rgba(59,130,246,0.6)',\n listening: 'rgba(219,33,41,0.8)',\n processing: 'rgba(245,158,11,0.7)',\n speaking: 'rgba(34,197,94,0.7)',\n error: 'rgba(220,38,38,0.6)',\n};\n\nexport default function VoiceDotRing({ analyserNode, state, orbRadius }: VoiceDotRingProps) {\n const dotsRef = useRef<(SVGCircleElement | null)[]>([]);\n const barsRef = useRef<Float32Array>(new Float32Array(DOT_RING_COUNT));\n const rafRef = useRef<number>(0);\n const colorRef = useRef(STATE_COLORS.idle);\n\n const [reducedMotion] = useState(\n () => window.matchMedia('(prefers-reduced-motion: reduce)').matches\n );\n\n const ringRadius = orbRadius + DOT_RING_GAP;\n const svgSize = (ringRadius + DOT_RING_PEAK_RADIUS + 2) * 2;\n const cx = svgSize / 2;\n const cy = svgSize / 2;\n\n useEffect(() => {\n const freqData = analyserNode ? new Uint8Array(analyserNode.frequencyBinCount) : null;\n\n const tick = () => {\n // Lerp color toward target\n colorRef.current = STATE_COLORS[state];\n\n if (analyserNode && freqData) {\n analyserNode.getByteFrequencyData(freqData);\n }\n\n for (let i = 0; i < DOT_RING_COUNT; i++) {\n const dot = dotsRef.current[i];\n if (!dot) continue;\n\n let targetVal = 0;\n if (freqData && freqData.length > 0) {\n const binIndex = Math.floor((i / DOT_RING_COUNT) * freqData.length);\n targetVal = freqData[binIndex] / 255;\n }\n\n barsRef.current[i] += (targetVal - barsRef.current[i]) * DOT_RING_SMOOTHING;\n\n const val = reducedMotion ? 0 : barsRef.current[i];\n const r = DOT_RING_BASE_RADIUS + val * (DOT_RING_PEAK_RADIUS - DOT_RING_BASE_RADIUS);\n const opacity = 0.3 + val * 0.5;\n\n dot.setAttribute('r', String(r));\n dot.setAttribute('opacity', String(opacity));\n dot.setAttribute('fill', colorRef.current);\n }\n\n rafRef.current = requestAnimationFrame(tick);\n };\n\n rafRef.current = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(rafRef.current);\n }, [analyserNode, state, reducedMotion, ringRadius]);\n\n return (\n <svg\n width={svgSize}\n height={svgSize}\n viewBox={`0 0 ${svgSize} ${svgSize}`}\n className=\"absolute pointer-events-none\"\n style={{\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n }}\n aria-hidden=\"true\"\n >\n {Array.from({ length: DOT_RING_COUNT }, (_, i) => {\n const angle = (i / DOT_RING_COUNT) * Math.PI * 2 - Math.PI / 2;\n const x = cx + Math.cos(angle) * ringRadius;\n const y = cy + Math.sin(angle) * ringRadius;\n return (\n <circle\n key={i}\n ref={(el) => {\n dotsRef.current[i] = el;\n }}\n cx={x}\n cy={y}\n r={DOT_RING_BASE_RADIUS}\n fill={STATE_COLORS.idle}\n opacity={0.3}\n />\n );\n })}\n </svg>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { cn } from '../utils';\nimport { useSiteConfig } from '@unctad-ai/voice-agent-core';\n\nconst STORAGE_KEY = 'voice-onboarding-dismissed';\n\ninterface VoiceOnboardingProps {\n onTryNow: () => void;\n /** Custom description text shown in the onboarding tooltip */\n description?: string;\n}\n\nexport default function VoiceOnboarding({ onTryNow, description }: VoiceOnboardingProps) {\n const { colors } = useSiteConfig();\n const [show, setShow] = useState(false);\n\n useEffect(() => {\n const dismissed = localStorage.getItem(STORAGE_KEY);\n if (!dismissed) {\n // Small delay so FAB renders first\n const timer = setTimeout(() => setShow(true), 1500);\n return () => clearTimeout(timer);\n }\n }, []);\n\n const dismiss = () => {\n setShow(false);\n localStorage.setItem(STORAGE_KEY, 'true');\n };\n\n const handleTryNow = () => {\n dismiss();\n onTryNow();\n };\n\n return (\n <AnimatePresence>\n {show && (\n <motion.div\n initial={{ opacity: 0, y: 8, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 8, scale: 0.95 }}\n transition={{ duration: 0.25, ease: 'easeOut' }}\n className={cn(\n 'fixed bottom-24 right-6 z-50',\n 'md:bottom-[104px] md:right-6',\n 'bg-white rounded-xl shadow-xl',\n 'border border-neutral-200',\n 'p-4 max-w-[280px]'\n )}\n role=\"tooltip\"\n >\n {/* Arrow pointing down to FAB */}\n <div className=\"absolute -bottom-2 right-6 w-4 h-4 bg-white border-b border-r border-neutral-200 rotate-45\" />\n\n <p className=\"text-sm text-neutral-700 leading-relaxed mb-3\">\n {description ?? 'Meet your AI assistant. Ask about services, permits, or opportunities.'}\n </p>\n <div className=\"flex gap-2\">\n <button\n onClick={handleTryNow}\n className={cn(\n 'text-white text-sm font-medium',\n 'rounded-lg px-3 py-1.5',\n 'transition-colors cursor-pointer'\n )}\n style={{ backgroundColor: colors.primary }}\n >\n Try it now\n </button>\n <button\n onClick={dismiss}\n className={cn(\n 'text-neutral-500 text-sm',\n 'rounded-lg px-3 py-1.5',\n 'hover:text-neutral-700 hover:bg-neutral-100',\n 'transition-colors cursor-pointer'\n )}\n >\n Maybe later\n </button>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { motion } from 'motion/react';\nimport { X } from 'lucide-react';\nimport { useVoiceAgent, voiceStateToOrbState } from '@unctad-ai/voice-agent-core';\nimport { IDLE_TIMEOUT_MS, WIND_DOWN_MS, EXIT_ANIMATION_MS } from '@unctad-ai/voice-agent-core';\nimport type { OrbState, VoiceToolResult } from '@unctad-ai/voice-agent-core';\nimport { useVoiceSettings } from '../contexts/VoiceSettingsContext';\nimport VoiceOrb from './VoiceOrb';\nimport VoiceWaveformCanvas from './VoiceWaveformCanvas';\nimport VoiceTranscript from './VoiceTranscript';\nimport VoiceToolCard from './VoiceToolCard';\nimport VoiceControls from './VoiceControls';\nimport VoiceErrorBoundary from './VoiceErrorBoundary';\nimport VoiceErrorDisplay from './VoiceErrorDisplay';\n\n/** Inline z-index guarantees stacking above all page elements */\nconst OVERLAY_Z = 2147483647;\n\n/** Liquid spring configs for entrance choreography */\nconst SPRING_BOUNCY = { type: 'spring' as const, damping: 20, stiffness: 180 };\nconst SPRING_SMOOTH = { type: 'spring' as const, damping: 28, stiffness: 160 };\n\n/** Exit easing — smooth start, accelerating pull */\nconst EXIT_EASE: [number, number, number, number] = [0.4, 0, 0.7, 0.2];\n\ninterface VoiceOverlayProps {\n isOpen: boolean;\n onClose: () => void;\n onStateChange?: (orbState: OrbState) => void;\n}\n\nfunction WiredOverlayContent({\n isMobile,\n onClose,\n onStateChange,\n isClosing,\n}: {\n isMobile: boolean;\n onClose: () => void;\n onStateChange?: (orbState: OrbState) => void;\n isClosing: boolean;\n}) {\n const orbSize = isMobile ? 120 : 200;\n const { settings, volumeRef, speedRef } = useVoiceSettings();\n\n const {\n state,\n start,\n stop,\n messages,\n isLLMLoading,\n getAmplitude,\n analyser,\n sendTextMessage,\n voiceError,\n dismissError,\n } = useVoiceAgent({ settings, volumeRef, speedRef });\n\n const [toolResult, setToolResult] = useState<VoiceToolResult | null>(null);\n\n const orbState = voiceStateToOrbState(state);\n\n // Notify parent of state changes for a11y announcer\n const onStateChangeRef = useRef(onStateChange);\n useEffect(() => {\n onStateChangeRef.current = onStateChange;\n });\n useEffect(() => {\n onStateChangeRef.current?.(orbState);\n }, [orbState]);\n\n // Start VAD when overlay mounts, force-stop on unmount (bypass debounce)\n const startRef = useRef(start);\n const stopRef = useRef(stop);\n useEffect(() => {\n startRef.current = start;\n }, [start]);\n useEffect(() => {\n stopRef.current = stop;\n }, [stop]);\n useEffect(() => {\n startRef.current();\n return () => stopRef.current(true);\n }, []);\n\n // Stop VAD immediately when exit starts\n useEffect(() => {\n if (isClosing) stop();\n }, [isClosing, stop]);\n\n // --- Idle timeout: auto-close after 30s of no user activity ---\n const [isWindingDown, setIsWindingDown] = useState(false);\n const idleTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const windDownTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const onCloseRef = useRef(onClose);\n useEffect(() => {\n onCloseRef.current = onClose;\n });\n\n useEffect(() => {\n const clear = () => {\n if (idleTimerRef.current) clearTimeout(idleTimerRef.current);\n if (windDownTimerRef.current) clearTimeout(windDownTimerRef.current);\n idleTimerRef.current = null;\n windDownTimerRef.current = null;\n };\n\n if (isClosing || state === 'PROCESSING' || state === 'AI_SPEAKING') {\n clear();\n setIsWindingDown(false);\n return;\n }\n clear();\n setIsWindingDown(false);\n windDownTimerRef.current = setTimeout(() => {\n setIsWindingDown(true);\n }, IDLE_TIMEOUT_MS - WIND_DOWN_MS);\n idleTimerRef.current = setTimeout(() => {\n onCloseRef.current();\n }, IDLE_TIMEOUT_MS);\n return clear;\n }, [state, isClosing]);\n\n const handleTextSubmit = useCallback(\n (text: string) => {\n sendTextMessage(text);\n },\n [sendTextMessage]\n );\n\n const isListening = state === 'LISTENING' || state === 'USER_SPEAKING';\n\n return (\n <div\n className=\"flex flex-col items-center justify-center gap-6 h-full px-6\"\n style={{ pointerEvents: 'none' }}\n >\n {/* Orb + Waveform */}\n <motion.div\n initial={{ opacity: 0, scale: 0.15 }}\n animate={\n isClosing\n ? { opacity: 0, scale: 0 }\n : { opacity: isWindingDown ? 0.3 : 1, scale: isWindingDown ? 0.92 : 1 }\n }\n transition={\n isClosing\n ? { duration: 0.3, ease: EXIT_EASE, delay: 0.15 }\n : isWindingDown\n ? { duration: WIND_DOWN_MS / 1000, ease: 'easeOut' }\n : { ...SPRING_BOUNCY, delay: 0.1 }\n }\n className=\"relative flex items-center justify-center\"\n style={{ width: orbSize + 100, height: orbSize + 100, pointerEvents: 'auto' }}\n >\n <div\n className=\"absolute rounded-full\"\n style={{\n width: orbSize + 100,\n height: orbSize + 100,\n backdropFilter: 'blur(2px)',\n WebkitBackdropFilter: 'blur(2px)',\n filter: 'url(#liquid-glass-orb)',\n isolation: 'isolate',\n }}\n />\n <div\n className=\"absolute rounded-full pointer-events-none\"\n style={{\n width: orbSize + 100,\n height: orbSize + 100,\n backgroundColor: 'rgba(255, 255, 255, 0.02)',\n border: '1px solid rgba(255, 255, 255, 0.15)',\n boxShadow:\n '0 6px 24px rgba(0, 0, 0, 0.08), inset 0 0 20px -5px rgba(255, 255, 255, 0.3)',\n }}\n />\n <div\n className=\"absolute rounded-full pointer-events-none\"\n style={{\n width: orbSize + 100,\n height: orbSize + 100,\n background:\n 'radial-gradient(ellipse 70% 40% at 50% 12%, rgba(255,255,255,0.2) 0%, transparent 55%)',\n }}\n />\n <VoiceWaveformCanvas analyserNode={analyser} state={orbState} size={orbSize + 100} />\n <div className=\"absolute rounded-full\" style={{ width: orbSize, height: orbSize }}>\n <VoiceOrb state={orbState} getAmplitude={getAmplitude} size={orbSize} />\n </div>\n </motion.div>\n\n {/* Transcript */}\n <motion.div\n initial={{ opacity: 0, y: 24 }}\n animate={isClosing ? { opacity: 0, y: 16 } : { opacity: 1, y: 0 }}\n transition={\n isClosing\n ? { duration: 0.25, ease: EXIT_EASE, delay: 0.08 }\n : { ...SPRING_SMOOTH, delay: 0.3 }\n }\n >\n <VoiceTranscript messages={messages} isTyping={state === 'AI_SPEAKING' || isLLMLoading} />\n </motion.div>\n\n {/* Error display */}\n <div style={{ pointerEvents: 'auto' }}>\n <VoiceErrorDisplay error={voiceError} onDismiss={dismissError} />\n </div>\n\n {/* Tool result card */}\n <div style={{ pointerEvents: 'auto' }}>\n <VoiceToolCard result={toolResult} onDismiss={() => setToolResult(null)} />\n </div>\n\n {/* Controls */}\n <motion.div\n initial={{ opacity: 0, y: 48 }}\n animate={isClosing ? { opacity: 0, y: 30 } : { opacity: 1, y: 0 }}\n transition={\n isClosing\n ? { duration: 0.25, ease: EXIT_EASE, delay: 0 }\n : { ...SPRING_SMOOTH, delay: 0.4 }\n }\n className=\"w-full\"\n style={{ pointerEvents: 'auto' }}\n >\n <VoiceControls state={state} onTextSubmit={handleTextSubmit} isListening={isListening} />\n </motion.div>\n </div>\n );\n}\n\nfunction OverlayPortal({\n isOpen,\n isClosing,\n onClose,\n onStateChange,\n isMobile,\n}: VoiceOverlayProps & { isMobile: boolean; isClosing: boolean }) {\n if (!isOpen) return null;\n\n return createPortal(\n <>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"0\"\n height=\"0\"\n style={{ position: 'absolute', overflow: 'hidden' }}\n aria-hidden=\"true\"\n >\n <defs>\n <filter id=\"liquid-glass-orb\" x=\"0%\" y=\"0%\" width=\"100%\" height=\"100%\">\n <feTurbulence\n type=\"fractalNoise\"\n baseFrequency=\"0.008 0.008\"\n numOctaves=\"2\"\n seed=\"92\"\n result=\"noise\"\n />\n <feGaussianBlur in=\"noise\" stdDeviation=\"2\" result=\"blurred_noise\" />\n <feDisplacementMap\n in=\"SourceGraphic\"\n in2=\"blurred_noise\"\n scale=\"50\"\n xChannelSelector=\"R\"\n yChannelSelector=\"G\"\n />\n </filter>\n </defs>\n </svg>\n\n <motion.div\n key=\"voice-overlay-bg\"\n initial={{ opacity: 0 }}\n animate={isClosing ? { opacity: 0 } : { opacity: 1 }}\n transition={{\n duration: isClosing ? 0.35 : 0.4,\n ease: 'easeOut',\n delay: isClosing ? 0.2 : 0,\n }}\n aria-hidden=\"true\"\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: OVERLAY_Z,\n pointerEvents: 'none',\n backgroundColor: 'rgba(0, 0, 0, 0.15)',\n }}\n />\n\n <motion.div\n key=\"voice-overlay-gradient\"\n initial={{ opacity: 0, y: 80 }}\n animate={isClosing ? { opacity: 0, y: 60 } : { opacity: 1, y: 0 }}\n transition={\n isClosing\n ? { duration: 0.3, ease: EXIT_EASE, delay: 0.2 }\n : { duration: 0.6, ease: [0.22, 1, 0.36, 1], delay: 0.05 }\n }\n aria-hidden=\"true\"\n style={{\n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n height: '28rem',\n zIndex: OVERLAY_Z,\n pointerEvents: 'none',\n background:\n 'linear-gradient(to top, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.15) 40%, transparent 100%)',\n }}\n />\n\n <div\n role=\"dialog\"\n aria-label=\"Voice Assistant\"\n aria-modal=\"false\"\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: OVERLAY_Z,\n pointerEvents: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <motion.button\n initial={{ opacity: 0, scale: 0.7 }}\n animate={isClosing ? { opacity: 0, scale: 0.7 } : { opacity: 1, scale: 1 }}\n transition={\n isClosing\n ? { duration: 0.2, ease: EXIT_EASE, delay: 0.06 }\n : { ...SPRING_SMOOTH, delay: 0.35 }\n }\n onClick={onClose}\n className=\"absolute top-6 right-6 flex items-center justify-center rounded-full transition-all duration-200 cursor-pointer hover:scale-110\"\n style={{\n pointerEvents: 'auto',\n zIndex: OVERLAY_Z,\n width: 44,\n height: 44,\n backgroundColor: 'rgba(255, 255, 255, 0.12)',\n border: '1px solid rgba(255, 255, 255, 0.25)',\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n color: 'rgba(255, 255, 255, 0.85)',\n }}\n aria-label=\"Close voice assistant\"\n >\n <X className=\"h-5 w-5\" />\n </motion.button>\n\n <div className=\"w-full h-full\" style={{ pointerEvents: 'none' }}>\n <WiredOverlayContent\n isMobile={isMobile}\n onClose={onClose}\n onStateChange={onStateChange}\n isClosing={isClosing}\n />\n </div>\n </div>\n </>,\n document.body\n );\n}\n\nfunction useIsMobile(breakpoint = 768) {\n const [isMobile, setIsMobile] = useState(\n () => window.matchMedia(`(max-width: ${breakpoint - 1}px)`).matches\n );\n useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${breakpoint - 1}px)`);\n const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n mql.addEventListener('change', handler);\n return () => mql.removeEventListener('change', handler);\n }, [breakpoint]);\n return isMobile;\n}\n\nexport default function VoiceOverlay({ isOpen, onClose, onStateChange }: VoiceOverlayProps) {\n const isMobile = useIsMobile();\n const [isClosing, setIsClosing] = useState(false);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handleClose = useCallback(() => {\n if (isClosing) return;\n setIsClosing(true);\n closeTimerRef.current = setTimeout(() => {\n setIsClosing(false);\n onClose();\n }, EXIT_ANIMATION_MS);\n }, [isClosing, onClose]);\n\n useEffect(() => {\n return () => {\n if (closeTimerRef.current != null) clearTimeout(closeTimerRef.current);\n };\n }, []);\n\n if (!isOpen) return null;\n\n return (\n <VoiceErrorBoundary onReset={onClose}>\n <OverlayPortal\n isOpen={isOpen}\n isClosing={isClosing}\n onClose={handleClose}\n onStateChange={onStateChange}\n isMobile={isMobile}\n />\n </VoiceErrorBoundary>\n );\n}\n","import { useRef, useEffect, useState } from 'react';\nimport {\n WAVEFORM_NUM_BARS,\n WAVEFORM_MIN_BAR_HEIGHT,\n WAVEFORM_MAX_BAR_HEIGHT,\n WAVEFORM_GAP,\n WAVEFORM_SMOOTHING,\n} from '@unctad-ai/voice-agent-core';\nimport type { OrbState } from '@unctad-ai/voice-agent-core';\n\ninterface VoiceWaveformCanvasProps {\n analyserNode: AnalyserNode | null;\n state: OrbState;\n size: number;\n}\n\nconst STATE_COLORS: Record<OrbState, [string, string]> = {\n idle: ['rgba(59,130,246,0.35)', 'rgba(96,165,250,0.12)'],\n listening: ['rgba(239,68,68,0.75)', 'rgba(251,191,36,0.3)'],\n processing: ['rgba(245,158,11,0.7)', 'rgba(251,191,36,0.3)'],\n speaking: ['rgba(34,197,94,0.7)', 'rgba(45,212,191,0.3)'],\n error: ['rgba(220,38,38,0.6)', 'rgba(153,27,27,0.25)'],\n};\n\nfunction lerpColor(a: string, b: string, t: number): string {\n // Parse rgba strings\n const parse = (s: string) => {\n const m = s.match(/[\\d.]+/g);\n return m ? m.map(Number) : [0, 0, 0, 0];\n };\n const ca = parse(a);\n const cb = parse(b);\n const r = ca.map((v, i) => v + (cb[i] - v) * t);\n return `rgba(${Math.round(r[0])},${Math.round(r[1])},${Math.round(r[2])},${r[3].toFixed(3)})`;\n}\n\nexport default function VoiceWaveformCanvas({\n analyserNode,\n state,\n size,\n}: VoiceWaveformCanvasProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const rafRef = useRef<number>(0);\n const barsRef = useRef<Float32Array>(new Float32Array(WAVEFORM_NUM_BARS));\n const colorRef = useRef({ inner: STATE_COLORS.idle[0], outer: STATE_COLORS.idle[1] });\n\n const [reducedMotion] = useState(\n () => window.matchMedia('(prefers-reduced-motion: reduce)').matches\n );\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const dpr = window.devicePixelRatio || 1;\n canvas.width = size * dpr;\n canvas.height = size * dpr;\n ctx.scale(dpr, dpr);\n\n const freqData = analyserNode ? new Uint8Array(analyserNode.frequencyBinCount) : null;\n\n const tick = () => {\n ctx.clearRect(0, 0, size, size);\n\n // Lerp colors toward target state\n const target = STATE_COLORS[state];\n colorRef.current.inner = lerpColor(colorRef.current.inner, target[0], WAVEFORM_SMOOTHING);\n colorRef.current.outer = lerpColor(colorRef.current.outer, target[1], WAVEFORM_SMOOTHING);\n\n // Get frequency data\n if (analyserNode && freqData) {\n analyserNode.getByteFrequencyData(freqData);\n }\n\n const cx = size / 2;\n const cy = size / 2;\n const baseRadius = size * 0.35 + WAVEFORM_GAP;\n const baseBarWidth = Math.max(1.5, ((2 * Math.PI * baseRadius) / WAVEFORM_NUM_BARS) * 0.55);\n\n for (let i = 0; i < WAVEFORM_NUM_BARS; i++) {\n // Map frequency bin to target height\n let targetVal = 0;\n if (freqData && freqData.length > 0) {\n const binIndex = Math.floor((i / WAVEFORM_NUM_BARS) * freqData.length);\n targetVal = freqData[binIndex] / 255;\n }\n\n // Smooth interpolation\n barsRef.current[i] += (targetVal - barsRef.current[i]) * WAVEFORM_SMOOTHING;\n\n const effectiveMax = reducedMotion ? WAVEFORM_MIN_BAR_HEIGHT + 5 : WAVEFORM_MAX_BAR_HEIGHT;\n const barHeight =\n WAVEFORM_MIN_BAR_HEIGHT + barsRef.current[i] * (effectiveMax - WAVEFORM_MIN_BAR_HEIGHT);\n\n const angle = (i / WAVEFORM_NUM_BARS) * Math.PI * 2 - Math.PI / 2;\n const x1 = cx + Math.cos(angle) * baseRadius;\n const y1 = cy + Math.sin(angle) * baseRadius;\n const x2 = cx + Math.cos(angle) * (baseRadius + barHeight);\n const y2 = cy + Math.sin(angle) * (baseRadius + barHeight);\n\n // Draw bar with gradient\n const gradient = ctx.createLinearGradient(x1, y1, x2, y2);\n gradient.addColorStop(0, colorRef.current.inner);\n gradient.addColorStop(1, colorRef.current.outer);\n\n // Bars thicken with amplitude for a more alive feel\n const barWidth = baseBarWidth + barsRef.current[i] * baseBarWidth * 0.6;\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.strokeStyle = gradient;\n ctx.lineWidth = barWidth;\n ctx.lineCap = 'round';\n ctx.stroke();\n }\n\n rafRef.current = requestAnimationFrame(tick);\n };\n\n rafRef.current = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(rafRef.current);\n }, [analyserNode, state, size, reducedMotion]);\n\n return (\n <canvas\n ref={canvasRef}\n style={{ width: size, height: size }}\n className=\"absolute inset-0 pointer-events-none\"\n aria-hidden=\"true\"\n />\n );\n}\n"],"mappings":"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","names":["useState","useEffect","useCallback","useRef","Component","motion","AnimatePresence","Mic","VolumeX","useSiteConfig","useRef","useEffect","useState","useCallback","jsx","useSiteConfig","jsx","jsxs","lerp","useRef","useEffect","useState","useCallback","useState","useEffect","useRef","jsx","jsxs","useState","useEffect","useRef","useEffect","motion","AnimatePresence","jsx","jsxs","useEffect","AnimatePresence","motion","jsx","jsxs","motion","AnimatePresence","AlertTriangle","jsx","jsxs","AlertTriangle","AnimatePresence","motion","useState","useEffect","motion","AnimatePresence","jsx","jsxs","jsx","jsxs","VoiceSettingsView","useSiteConfig","motion","VolumeX","Mic","useState","useRef","useEffect","AnimatePresence","useCallback","Component","useEffect","useRef","jsx","motion","AnimatePresence","useReducedMotion","Mic","useSiteConfig","jsx","useState","useRef","useEffect","motion","AnimatePresence","Keyboard","X","useSiteConfig","jsx","jsxs","STATE_LABELS","useState","useRef","useEffect","AnimatePresence","motion","X","Keyboard","useRef","useEffect","useState","jsx","useState","useEffect","motion","AnimatePresence","useSiteConfig","jsx","jsxs","useState","useEffect","AnimatePresence","motion","useState","useEffect","useCallback","useRef","createPortal","motion","X","useVoiceAgent","voiceStateToOrbState","useRef","useEffect","useState","jsx","STATE_COLORS","lerpColor","Fragment","jsx","jsxs","useVoiceAgent","useState","voiceStateToOrbState","useRef","useEffect","useCallback","motion","createPortal","X"]}
|
|
1
|
+
{"version":3,"sources":["../src/VoiceAgentProvider.tsx","../src/components/GlassCopilotPanel.tsx","../src/components/AgentAvatar.tsx","../src/components/VoiceOrb.tsx","../src/components/agentFabStyles.ts","../src/components/VoiceTranscript.tsx","../src/utils.ts","../src/components/VoiceToolCard.tsx","../src/components/VoiceErrorBoundary.tsx","../src/components/VoiceErrorDisplay.tsx","../src/components/PipelineMetricsBar.tsx","../src/components/VoiceA11yAnnouncer.tsx","../src/components/VoiceCopilotFAB.tsx","../src/components/VoiceControls.tsx","../src/components/VoiceDotRing.tsx","../src/components/VoiceOnboarding.tsx","../src/components/VoiceOverlay.tsx","../src/components/VoiceWaveformCanvas.tsx"],"sourcesContent":["import { SiteConfigProvider } from '@unctad-ai/voice-agent-core';\nimport { CopilotProvider } from '@unctad-ai/voice-agent-registries';\nimport { VoiceSettingsProvider } from './contexts/VoiceSettingsContext';\nimport type { SiteConfig } from '@unctad-ai/voice-agent-core';\n\nexport function VoiceAgentProvider({\n config,\n children,\n}: {\n config: SiteConfig;\n children: React.ReactNode;\n}) {\n return (\n <SiteConfigProvider config={config}>\n <CopilotProvider>\n <VoiceSettingsProvider>\n {children}\n </VoiceSettingsProvider>\n </CopilotProvider>\n </SiteConfigProvider>\n );\n}\n","import {\n useState,\n useEffect,\n useCallback,\n useRef,\n lazy,\n Suspense,\n Component,\n type ReactNode,\n type ErrorInfo,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { ChevronDown, X, Mic, ArrowUp, Keyboard, RotateCw, Settings, VolumeX } from 'lucide-react';\nimport {\n useVoiceAgent,\n voiceStateToOrbState,\n checkLLMHealth,\n useSiteConfig,\n RECOVERY_POLL_MS,\n PANEL_WIDTH,\n PANEL_COLLAPSED_HEIGHT,\n PANEL_EXPANDED_HEIGHT,\n PANEL_BORDER_RADIUS,\n PANEL_BOTTOM,\n PANEL_RIGHT,\n PANEL_Z_INDEX,\n SPRING_PANEL,\n SPRING_MICRO,\n SPRING_PANEL_EXIT,\n} from '@unctad-ai/voice-agent-core';\nimport type { OrbState, VoiceToolResult, VoiceState, VoiceMessage, PipelineTimings } from '@unctad-ai/voice-agent-core';\nimport { useVoiceSettings } from '../contexts/VoiceSettingsContext';\nimport AgentAvatar from './AgentAvatar';\nimport { injectAgentFabCSS } from './agentFabStyles';\nimport VoiceTranscript from './VoiceTranscript';\nimport VoiceToolCard from './VoiceToolCard';\nimport VoiceErrorBoundary from './VoiceErrorBoundary';\nimport VoiceErrorDisplay from './VoiceErrorDisplay';\nimport type { VoiceErrorType } from './VoiceErrorDisplay';\nimport PipelineMetricsBar from './PipelineMetricsBar';\nconst VoiceSettingsView = lazy(() => import('./VoiceSettingsView'));\n\n// ---------------------------------------------------------------------------\n// State labels for composer bar\n// ---------------------------------------------------------------------------\nconst STATE_LABELS: Record<VoiceState, string> = {\n IDLE: 'Tap mic to speak',\n LISTENING: 'Listening...',\n USER_SPEAKING: 'Listening...',\n PROCESSING: 'Processing...',\n AI_SPEAKING: 'Speaking...',\n};\n\n// ---------------------------------------------------------------------------\n// Aria-live announcements for screen readers\n// ---------------------------------------------------------------------------\nconst ARIA_LIVE_LABELS: Record<OrbState, string> = {\n idle: '',\n listening: 'Listening for your question',\n processing: 'Processing your request',\n speaking: 'Playing response',\n error: 'An error occurred',\n};\n\n// ---------------------------------------------------------------------------\n// Panel states\n// ---------------------------------------------------------------------------\ntype PanelState = 'hidden' | 'collapsed' | 'expanded';\n\ninterface GlassCopilotPanelProps {\n isOpen: boolean;\n onOpen?: () => void;\n onClose: () => void;\n onStateChange?: (orbState: OrbState) => void;\n /** URL for the avatar portrait image */\n portraitSrc?: string;\n}\n\n// ---------------------------------------------------------------------------\n// FAB — shown when panel is hidden\n// ---------------------------------------------------------------------------\nfunction CopilotFAB({ onClick, portraitSrc }: { onClick: () => void; portraitSrc?: string }) {\n const { colors } = useSiteConfig();\n return (\n <motion.button\n onClick={onClick}\n whileHover={{ scale: 1.08 }}\n whileTap={{ scale: 0.95 }}\n className=\"shadow-lg cursor-pointer\"\n style={{\n background: 'transparent',\n border: 'none',\n padding: 0,\n borderRadius: '50%',\n width: 54,\n height: 54,\n }}\n aria-label=\"Open voice assistant\"\n data-testid=\"voice-agent-fab\"\n >\n <div className=\"agent-fab-border\" style={{ width: 54, height: 54, '--agent-primary': colors.primary } as React.CSSProperties}>\n <div className=\"agent-fab-border-inner\">\n {portraitSrc ? (\n <img\n src={portraitSrc}\n alt=\"Assistant\"\n style={{ width: '100%', height: '100%', objectFit: 'cover', borderRadius: '50%' }}\n draggable={false}\n />\n ) : (\n <div\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: '#6b7280',\n color: 'white',\n fontSize: 20,\n fontWeight: 700,\n }}\n >\n AI\n </div>\n )}\n </div>\n </div>\n </motion.button>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Collapsed header bar\n// ---------------------------------------------------------------------------\nfunction CollapsedBar({\n orbState,\n getAmplitude,\n analyser: _analyser,\n voiceState,\n onExpand,\n onClose,\n onRetry,\n isRetrying = false,\n voiceError,\n micPaused = false,\n onMicToggle,\n ttsEnabled = true,\n copilotName,\n portraitSrc,\n}: {\n orbState: OrbState;\n getAmplitude: () => number;\n analyser: AnalyserNode | null;\n voiceState: VoiceState;\n onExpand: () => void;\n onClose: () => void;\n onRetry?: () => void;\n isRetrying?: boolean;\n voiceError?: VoiceErrorType;\n micPaused?: boolean;\n onMicToggle?: () => void;\n ttsEnabled?: boolean;\n copilotName: string;\n portraitSrc?: string;\n}) {\n const { colors } = useSiteConfig();\n const isOffline = voiceError === 'network_error';\n\n return (\n <div\n className=\"flex items-center gap-3 h-full cursor-pointer select-none\"\n style={{ padding: '0 16px' }}\n role=\"button\"\n tabIndex={0}\n data-testid=\"voice-agent-bar\"\n onClick={onExpand}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onExpand();\n }\n }}\n >\n {/* Mini avatar */}\n <div\n className=\"relative shrink-0\"\n style={{ width: 46, height: 46, opacity: isOffline ? 0.4 : 1 }}\n >\n <AgentAvatar state={orbState} getAmplitude={getAmplitude} size={46} portraitSrc={portraitSrc} />\n {!ttsEnabled && (\n <div\n className=\"absolute flex items-center justify-center\"\n style={{\n bottom: -2,\n right: -2,\n width: 18,\n height: 18,\n borderRadius: 9,\n backgroundColor: 'rgba(0,0,0,0.65)',\n border: '1.5px solid rgba(255,255,255,0.8)',\n }}\n >\n <VolumeX style={{ width: 10, height: 10, color: '#fff' }} />\n </div>\n )}\n </div>\n\n {/* Title */}\n <div className=\"flex-1 min-w-0\">\n <p\n className=\"font-[DM_Sans] truncate\"\n style={{ fontSize: '14px', fontWeight: 600, color: '#1a1a1a' }}\n >\n {copilotName}\n </p>\n <p\n className=\"font-[DM_Sans] truncate\"\n style={{\n fontSize: '12px',\n fontWeight: 400,\n color: isOffline ? 'rgba(220, 38, 38, 0.7)' : 'rgba(0,0,0,0.42)',\n letterSpacing: '0.01em',\n }}\n >\n {isOffline ? (\n <span className=\"inline-flex items-center gap-1\">\n Offline\n {onRetry && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRetry();\n }}\n className=\"inline-flex items-center justify-center rounded-full transition-colors cursor-pointer\"\n style={{\n width: 18,\n height: 18,\n color: 'rgba(220, 38, 38, 0.5)',\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLElement).style.color = 'rgba(220, 38, 38, 0.8)';\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLElement).style.color = 'rgba(220, 38, 38, 0.5)';\n }}\n aria-label=\"Retry connection\"\n >\n <motion.span\n animate={isRetrying ? { rotate: 360 } : { rotate: 0 }}\n transition={\n isRetrying\n ? { duration: 0.8, repeat: Infinity, ease: 'linear' }\n : { duration: 0.3 }\n }\n style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}\n >\n <RotateCw style={{ width: 12, height: 12 }} />\n </motion.span>\n </button>\n )}\n </span>\n ) : micPaused ? (\n 'Paused'\n ) : (\n STATE_LABELS[voiceState]\n )}\n </p>\n </div>\n\n {/* Mic toggle button */}\n {!isOffline && onMicToggle && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onMicToggle();\n }}\n className=\"shrink-0 rounded-full flex items-center justify-center transition-all cursor-pointer relative\"\n style={{\n width: 44,\n height: 44,\n backgroundColor:\n voiceState === 'LISTENING' || voiceState === 'USER_SPEAKING'\n ? colors.primary\n : 'rgba(0,0,0,0.06)',\n color:\n voiceState === 'LISTENING' || voiceState === 'USER_SPEAKING'\n ? 'white'\n : 'rgba(0,0,0,0.45)',\n }}\n aria-label={\n voiceState === 'LISTENING' || voiceState === 'USER_SPEAKING'\n ? 'Stop listening'\n : 'Start listening'\n }\n >\n {(voiceState === 'LISTENING' || voiceState === 'USER_SPEAKING') && (\n <motion.span\n className=\"absolute inset-0 rounded-full\"\n animate={{ scale: [1, 1.3, 1], opacity: [0.3, 0, 0.3] }}\n transition={{ duration: 1.8, repeat: Infinity, ease: 'easeInOut' }}\n style={{ backgroundColor: `${colors.primary}40` }}\n />\n )}\n <Mic style={{ width: 16, height: 16, position: 'relative', zIndex: 1 }} />\n </button>\n )}\n\n {/* Offline status dot */}\n {isOffline && (\n <span\n className=\"shrink-0 rounded-full\"\n style={{\n width: 8,\n height: 8,\n backgroundColor: 'rgba(220, 38, 38, 0.5)',\n }}\n />\n )}\n\n {/* Close */}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onClose();\n }}\n className=\"shrink-0 rounded-full flex items-center justify-center transition-colors cursor-pointer\"\n style={{\n width: 44,\n height: 44,\n color: 'rgba(0,0,0,0.4)',\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLElement).style.color = 'rgba(0,0,0,0.7)';\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLElement).style.color = 'rgba(0,0,0,0.4)';\n }}\n aria-label=\"Close voice assistant\"\n >\n <X style={{ width: 18, height: 18 }} />\n </button>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Composer bar\n// ---------------------------------------------------------------------------\nfunction ComposerBar({\n voiceState,\n isListening,\n micPaused = false,\n onTextSubmit,\n onMicToggle,\n disabled = false,\n}: {\n voiceState: VoiceState;\n isListening: boolean;\n micPaused?: boolean;\n onTextSubmit: (text: string) => void;\n onMicToggle: () => void;\n disabled?: boolean;\n}) {\n const { colors } = useSiteConfig();\n const [mode, setMode] = useState<'voice' | 'text'>('voice');\n const [text, setText] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (mode === 'text') {\n requestAnimationFrame(() => inputRef.current?.focus());\n }\n }, [mode]);\n\n const handleSubmit = () => {\n const trimmed = text.trim();\n if (!trimmed) return;\n onTextSubmit(trimmed);\n setText('');\n setMode('voice');\n };\n\n const handleCancel = () => {\n setText('');\n setMode('voice');\n onMicToggle();\n };\n\n if (disabled) {\n return (\n <div\n className=\"flex items-center gap-3 shrink-0\"\n style={{\n height: 56,\n padding: '10px 14px',\n borderTop: '1px solid rgba(0,0,0,0.08)',\n }}\n >\n <div\n className=\"shrink-0 rounded-full flex items-center justify-center\"\n style={{\n width: 36,\n height: 36,\n backgroundColor: 'rgba(0,0,0,0.04)',\n color: 'rgba(0,0,0,0.2)',\n opacity: 0.5,\n }}\n >\n <Mic style={{ width: 18, height: 18 }} />\n </div>\n <span\n className=\"font-[DM_Sans] italic\"\n style={{ fontSize: '13px', color: 'rgba(0,0,0,0.3)' }}\n >\n Service unavailable\n </span>\n </div>\n );\n }\n\n return (\n <div\n className=\"shrink-0 overflow-hidden\"\n style={{\n height: 56,\n borderTop: '1px solid rgba(0,0,0,0.08)',\n }}\n >\n <AnimatePresence mode=\"wait\" initial={false}>\n {mode === 'voice' ? (\n <motion.div\n key=\"voice-mode\"\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -8 }}\n transition={{ duration: 0.18, ease: [0.22, 1, 0.36, 1] }}\n className=\"flex items-center gap-3\"\n style={{ height: 56, padding: '10px 14px' }}\n >\n <button\n onClick={onMicToggle}\n className=\"shrink-0 rounded-full flex items-center justify-center transition-all relative cursor-pointer\"\n style={{\n width: 44,\n height: 44,\n backgroundColor: isListening ? colors.primary : 'rgba(0,0,0,0.06)',\n color: isListening ? 'white' : 'rgba(0,0,0,0.5)',\n }}\n aria-label={isListening ? 'Stop listening' : 'Start listening'}\n data-testid=\"voice-agent-mic\"\n >\n {isListening && (\n <motion.span\n className=\"absolute inset-0 rounded-full\"\n animate={{ scale: [1, 1.22, 1], opacity: [0.25, 0.08, 0.25] }}\n transition={{ duration: 1.8, repeat: Infinity, ease: 'easeInOut' }}\n style={{ backgroundColor: `${colors.primary}33`, filter: 'blur(4px)' }}\n />\n )}\n <Mic style={{ width: 18, height: 18, position: 'relative', zIndex: 1 }} />\n </button>\n\n <div className=\"flex-1 min-w-0\">\n <AnimatePresence mode=\"wait\">\n <motion.p\n key={micPaused ? 'paused' : voiceState}\n initial={{ opacity: 0, y: 4 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -4 }}\n transition={{ duration: 0.15 }}\n className=\"font-[DM_Sans] truncate\"\n style={{\n fontSize: '14px',\n fontWeight: 400,\n color: micPaused\n ? 'rgba(0,0,0,0.35)'\n : voiceState === 'LISTENING' || voiceState === 'USER_SPEAKING'\n ? colors.primary\n : 'rgba(0,0,0,0.45)',\n }}\n >\n {micPaused ? 'Paused' : STATE_LABELS[voiceState]}\n </motion.p>\n </AnimatePresence>\n </div>\n\n <motion.button\n whileHover={{ scale: 1.08 }}\n whileTap={{ scale: 0.92 }}\n onClick={() => {\n if (isListening) onMicToggle();\n setMode('text');\n }}\n className=\"shrink-0 rounded-full flex items-center justify-center cursor-pointer\"\n style={{\n width: 44,\n height: 44,\n backgroundColor: 'rgba(0,0,0,0.05)',\n color: 'rgba(0,0,0,0.4)',\n }}\n aria-label=\"Type a message\"\n data-testid=\"voice-agent-keyboard\"\n >\n <Keyboard style={{ width: 18, height: 18 }} />\n </motion.button>\n </motion.div>\n ) : (\n <motion.div\n key=\"text-mode\"\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -8 }}\n transition={{ duration: 0.18, ease: [0.22, 1, 0.36, 1] }}\n className=\"flex items-center gap-2\"\n style={{ height: 56, padding: '10px 14px' }}\n >\n <div\n className=\"flex-1 min-w-0 flex items-center\"\n style={{\n height: 36,\n borderRadius: 18,\n padding: '0 14px',\n backgroundColor: 'rgba(0,0,0,0.03)',\n border: '1px solid rgba(0,0,0,0.08)',\n transition: 'border-color 0.15s, box-shadow 0.15s',\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleSubmit();\n if (e.key === 'Escape') handleCancel();\n }}\n onFocus={(e) => {\n const pill = e.currentTarget.parentElement;\n if (pill) {\n pill.style.borderColor = `${colors.primary}4D`;\n pill.style.boxShadow = `0 0 0 2px ${colors.primary}14`;\n }\n }}\n onBlur={(e) => {\n const pill = e.currentTarget.parentElement;\n if (pill) {\n pill.style.borderColor = 'rgba(0,0,0,0.08)';\n pill.style.boxShadow = 'none';\n }\n }}\n placeholder=\"Ask about services...\"\n aria-label=\"Type your question\"\n data-testid=\"voice-agent-input\"\n className=\"w-full font-[DM_Sans]\"\n style={{\n fontSize: '14px',\n color: '#1a1a1a',\n background: 'transparent',\n border: 'none',\n outline: 'none',\n padding: 0,\n }}\n />\n </div>\n\n <AnimatePresence>\n {text.trim().length > 0 && (\n <motion.button\n initial={{ scale: 0, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0, opacity: 0 }}\n transition={SPRING_MICRO}\n whileTap={{ scale: 0.9 }}\n onClick={handleSubmit}\n className=\"shrink-0 rounded-full flex items-center justify-center cursor-pointer\"\n style={{\n width: 44,\n height: 44,\n backgroundColor: colors.primary,\n color: 'white',\n }}\n aria-label=\"Send message\"\n data-testid=\"voice-agent-send\"\n >\n <ArrowUp style={{ width: 18, height: 18 }} />\n </motion.button>\n )}\n </AnimatePresence>\n\n <motion.button\n whileHover={{ scale: 1.08 }}\n whileTap={{ scale: 0.92 }}\n onClick={handleCancel}\n className=\"shrink-0 rounded-full flex items-center justify-center cursor-pointer\"\n style={{\n width: 44,\n height: 44,\n backgroundColor: 'rgba(0,0,0,0.05)',\n color: 'rgba(0,0,0,0.4)',\n }}\n aria-label=\"Back to voice mode\"\n data-testid=\"voice-agent-voice-mode\"\n >\n <Mic style={{ width: 18, height: 18 }} />\n </motion.button>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Expanded panel content\n// ---------------------------------------------------------------------------\nfunction ExpandedContent({\n orbState, getAmplitude, analyser, voiceState, messages, isTyping,\n toolResult, voiceError, dismissError, onCollapse, onClose, onTextSubmit,\n onMicToggle, micPaused = false, onToolDismiss, onInteraction, onRetry,\n isRetrying = false, lastTimings, showPipelineMetrics, pipelineMetricsAutoHideMs,\n showSettings, onSettingsToggle, ttsEnabled = true, copilotName, portraitSrc,\n}: {\n orbState: OrbState; getAmplitude: () => number; analyser: AnalyserNode | null;\n voiceState: VoiceState; messages: VoiceMessage[]; isTyping: boolean;\n toolResult: VoiceToolResult | null; voiceError: VoiceErrorType; dismissError: () => void;\n onCollapse: () => void; onClose: () => void; onTextSubmit: (text: string) => void;\n onMicToggle: () => void; micPaused?: boolean; onToolDismiss: () => void;\n onInteraction: () => void; onRetry?: () => void; isRetrying?: boolean;\n lastTimings?: PipelineTimings | null; showPipelineMetrics?: boolean;\n pipelineMetricsAutoHideMs?: number; showSettings: boolean; onSettingsToggle: () => void;\n ttsEnabled?: boolean; copilotName: string; portraitSrc?: string;\n}) {\n const { colors } = useSiteConfig();\n const isListening = voiceState === 'LISTENING' || voiceState === 'USER_SPEAKING';\n const isOffline = voiceError === 'network_error';\n\n return (\n <div\n className=\"flex flex-col h-full overflow-hidden\"\n onClick={onInteraction}\n onKeyDown={onInteraction}\n >\n {/* Header (64px) */}\n <motion.div\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.18, ease: [0.25, 0.1, 0.25, 1], delay: 0.12 }}\n className=\"flex items-center gap-3 shrink-0\"\n style={{ height: 64, padding: '12px 16px', borderBottom: '1px solid rgba(0,0,0,0.06)' }}\n >\n <motion.div\n initial={{ scale: 0.8 }}\n animate={{ scale: 1, opacity: isOffline ? 0.35 : 1 }}\n transition={{ ...SPRING_MICRO, delay: 0.14 }}\n className=\"relative shrink-0\"\n style={{ width: 46, height: 46, filter: isOffline ? 'grayscale(0.8)' : 'none' }}\n >\n <AgentAvatar state={orbState} getAmplitude={getAmplitude} size={46} showRing portraitSrc={portraitSrc} />\n {!ttsEnabled && (\n <div\n className=\"absolute flex items-center justify-center\"\n style={{\n bottom: -2, right: -2, width: 18, height: 18, borderRadius: 9,\n backgroundColor: 'rgba(0,0,0,0.65)', border: '1.5px solid rgba(255,255,255,0.8)',\n }}\n >\n <VolumeX style={{ width: 10, height: 10, color: '#fff' }} />\n </div>\n )}\n </motion.div>\n\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-[DM_Sans] truncate\" style={{ fontSize: '14px', fontWeight: 600, color: '#1a1a1a' }}>{copilotName}</p>\n <p className=\"font-[DM_Sans] truncate\" data-testid=\"voice-agent-status\" style={{ fontSize: '12px', fontWeight: 400, color: isOffline ? 'rgba(220,38,38,0.7)' : 'rgba(0,0,0,0.42)', letterSpacing: '0.01em' }}>\n {isOffline ? (\n <span className=\"inline-flex items-center gap-1\">\n Offline\n {onRetry && (\n <button onClick={(e) => { e.stopPropagation(); onRetry(); }} className=\"inline-flex items-center justify-center rounded-full transition-colors cursor-pointer\" style={{ width: 18, height: 18, color: 'rgba(220,38,38,0.5)' }} aria-label=\"Retry connection\">\n <motion.span animate={isRetrying ? { rotate: 360 } : { rotate: 0 }} transition={isRetrying ? { duration: 0.8, repeat: Infinity, ease: 'linear' } : { duration: 0.3 }} style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <RotateCw style={{ width: 12, height: 12 }} />\n </motion.span>\n </button>\n )}\n </span>\n ) : micPaused ? 'Paused' : STATE_LABELS[voiceState]}\n </p>\n </div>\n\n <button\n onClick={onSettingsToggle}\n className=\"shrink-0 rounded-full transition-colors cursor-pointer\"\n style={{\n color: showSettings ? colors.primary : 'rgba(0,0,0,0.4)',\n width: 44, height: 44, display: 'flex', alignItems: 'center', justifyContent: 'center',\n backgroundColor: showSettings ? `${colors.primary}14` : 'rgba(0,0,0,0.05)',\n }}\n aria-label={showSettings ? 'Close settings' : 'Open settings'}\n data-testid=\"voice-agent-settings\"\n >\n <Settings style={{ width: 16, height: 16 }} />\n </button>\n <button onClick={onCollapse} className=\"shrink-0 rounded-full transition-colors cursor-pointer\" style={{ color: 'rgba(0,0,0,0.4)', width: 44, height: 44, display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: 'rgba(0,0,0,0.05)' }} aria-label=\"Minimize panel\" data-testid=\"voice-agent-minimize\">\n <ChevronDown style={{ width: 16, height: 16 }} />\n </button>\n <button onClick={onClose} className=\"shrink-0 rounded-full transition-colors cursor-pointer\" style={{ color: 'rgba(0,0,0,0.4)', width: 44, height: 44, display: 'flex', alignItems: 'center', justifyContent: 'center', backgroundColor: 'rgba(0,0,0,0.05)' }} aria-label=\"Close voice assistant\" data-testid=\"voice-agent-close\">\n <X style={{ width: 16, height: 16 }} />\n </button>\n </motion.div>\n\n <div className=\"flex-1 min-h-0 flex flex-col overflow-hidden\">\n <div data-testid=\"voice-agent-transcript\"><VoiceTranscript messages={messages} isTyping={isTyping} variant=\"panel\" voiceError={voiceError} /></div>\n <div className=\"shrink-0\">\n <PipelineMetricsBar timings={lastTimings ?? null} show={showPipelineMetrics} autoHideMs={pipelineMetricsAutoHideMs} />\n {isOffline && onRetry && (\n <div style={{ padding: '0 16px 8px', display: 'flex', justifyContent: 'center' }}>\n <motion.button whileHover={{ scale: 1.04 }} whileTap={{ scale: 0.96 }} onClick={onRetry} disabled={isRetrying} className=\"inline-flex items-center gap-2 rounded-full cursor-pointer transition-colors\" style={{ padding: '8px 18px', fontSize: '13px', fontWeight: 500, fontFamily: 'DM Sans, sans-serif', color: isRetrying ? 'rgba(0,0,0,0.35)' : 'rgba(220,38,38,0.8)', backgroundColor: isRetrying ? 'rgba(0,0,0,0.04)' : 'rgba(220,38,38,0.08)', border: '1px solid', borderColor: isRetrying ? 'rgba(0,0,0,0.06)' : 'rgba(220,38,38,0.15)' }} aria-label=\"Retry connection\">\n <motion.span animate={isRetrying ? { rotate: 360 } : { rotate: 0 }} transition={isRetrying ? { duration: 0.8, repeat: Infinity, ease: 'linear' } : { duration: 0.3 }} style={{ display: 'flex', alignItems: 'center', justifyContent: 'center' }}>\n <RotateCw style={{ width: 14, height: 14 }} />\n </motion.span>\n {isRetrying ? 'Checking...' : 'Retry connection'}\n </motion.button>\n </div>\n )}\n {voiceError !== 'network_error' && (\n <div style={{ padding: '0 16px 8px' }}><VoiceErrorDisplay error={voiceError} onDismiss={dismissError} /></div>\n )}\n <div style={{ padding: '0 16px 8px' }}><VoiceToolCard result={toolResult} onDismiss={onToolDismiss} variant=\"capsule\" /></div>\n </div>\n </div>\n\n <motion.div initial={{ opacity: 0, y: 12 }} animate={{ opacity: 1, y: 0 }} transition={{ ...SPRING_MICRO, delay: 0.2 }} className=\"shrink-0\">\n <ComposerBar voiceState={voiceState} isListening={isListening} micPaused={micPaused} onTextSubmit={onTextSubmit} onMicToggle={onMicToggle} disabled={voiceError === 'network_error'} />\n </motion.div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Static panel shell\n// ---------------------------------------------------------------------------\nfunction StaticPanelShell({\n panelState, onCollapse, onExpand, onClose, onRetry, copilotName, portraitSrc,\n}: {\n panelState: PanelState; onCollapse: () => void; onExpand: () => void; onClose: () => void;\n onRetry?: () => Promise<boolean>; copilotName: string; portraitSrc?: string;\n}) {\n const noopAmplitude = useCallback(() => 0, []);\n const [isRetrying, setIsRetrying] = useState(false);\n const handleRetry = useCallback(() => { if (isRetrying || !onRetry) return; setIsRetrying(true); onRetry().finally(() => setIsRetrying(false)); }, [onRetry, isRetrying]);\n\n if (panelState === 'collapsed') {\n return <CollapsedBar orbState=\"idle\" getAmplitude={noopAmplitude} analyser={null} voiceState=\"IDLE\" onExpand={onExpand} onClose={onClose} onRetry={handleRetry} isRetrying={isRetrying} voiceError=\"network_error\" copilotName={copilotName} portraitSrc={portraitSrc} />;\n }\n return <ExpandedContent orbState=\"idle\" getAmplitude={noopAmplitude} analyser={null} voiceState=\"IDLE\" messages={[]} isTyping={false} toolResult={null} voiceError=\"network_error\" dismissError={() => {}} onCollapse={onCollapse} onClose={onClose} onTextSubmit={() => {}} onMicToggle={() => {}} onToolDismiss={() => {}} onInteraction={() => {}} onRetry={handleRetry} isRetrying={isRetrying} showSettings={false} onSettingsToggle={() => {}} copilotName={copilotName} portraitSrc={portraitSrc} />;\n}\n\n// ---------------------------------------------------------------------------\n// Error boundary\n// ---------------------------------------------------------------------------\nclass WiredPanelErrorBoundary extends Component<\n { children: ReactNode; panelState: PanelState; onCollapse: () => void; onExpand: () => void; onClose: () => void; copilotName: string; portraitSrc?: string },\n { hasError: boolean }\n> {\n state = { hasError: false };\n static getDerivedStateFromError() { return { hasError: true }; }\n componentDidCatch(error: Error, _info: ErrorInfo) { console.warn('[GlassCopilotPanel] Voice agent unavailable:', error.message); }\n handleRetry = (): Promise<boolean> => {\n return checkLLMHealth().then(({ available }) => {\n if (available) this.setState({ hasError: false });\n return available;\n });\n };\n render() {\n if (this.state.hasError) {\n return <StaticPanelShell panelState={this.props.panelState} onCollapse={this.props.onCollapse} onExpand={this.props.onExpand} onClose={this.props.onClose} onRetry={this.handleRetry} copilotName={this.props.copilotName} portraitSrc={this.props.portraitSrc} />;\n }\n return this.props.children;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Wired panel\n// ---------------------------------------------------------------------------\nfunction WiredPanel({\n panelState, onCollapse, onExpand, onClose, onStateChange, portraitSrc,\n}: {\n panelState: PanelState; onCollapse: () => void; onExpand: () => void; onClose: () => void;\n onStateChange?: (orbState: OrbState) => void; portraitSrc?: string;\n}) {\n const config = useSiteConfig();\n return (\n <WiredPanelErrorBoundary panelState={panelState} onCollapse={onCollapse} onExpand={onExpand} onClose={onClose} copilotName={config.copilotName} portraitSrc={portraitSrc}>\n <WiredPanelInner panelState={panelState} onCollapse={onCollapse} onExpand={onExpand} onClose={onClose} onStateChange={onStateChange} portraitSrc={portraitSrc} />\n </WiredPanelErrorBoundary>\n );\n}\n\nfunction WiredPanelInner({\n panelState, onCollapse, onExpand, onClose, onStateChange, portraitSrc,\n}: {\n panelState: PanelState; onCollapse: () => void; onExpand: () => void; onClose: () => void;\n onStateChange?: (orbState: OrbState) => void; portraitSrc?: string;\n}) {\n const config = useSiteConfig();\n const resolvedPortrait = portraitSrc ?? config.avatarUrl;\n const { settings: voiceSettings, volumeRef, speedRef } = useVoiceSettings();\n const { state, start, stop, messages, isLLMLoading, getAmplitude, analyser, sendTextMessage, voiceError, dismissError, sessionEnded, lastTimings, applyVolume, settings } = useVoiceAgent({ settings: voiceSettings, volumeRef, speedRef });\n\n useEffect(() => { if (sessionEnded) onClose(); }, [sessionEnded, onClose]);\n\n const [toolResult, setToolResult] = useState<VoiceToolResult | null>(null);\n const orbState = voiceStateToOrbState(state);\n const [backendDown, setBackendDown] = useState(false);\n const autoStartedRef = useRef(false);\n const pollTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const cancelledRef = useRef(false);\n\n const runHealthCheck = useCallback(() => {\n checkLLMHealth().then(({ available }) => {\n if (cancelledRef.current) return;\n setBackendDown(!available);\n if (available) {\n dismissError();\n if (!autoStartedRef.current && settings.autoListen) { autoStartedRef.current = true; startRef.current(); }\n } else {\n if (pollTimerRef.current) clearTimeout(pollTimerRef.current);\n pollTimerRef.current = setTimeout(runHealthCheck, RECOVERY_POLL_MS);\n }\n });\n }, [dismissError, settings.autoListen]);\n\n useEffect(() => { cancelledRef.current = false; runHealthCheck(); return () => { cancelledRef.current = true; if (pollTimerRef.current) clearTimeout(pollTimerRef.current); }; }, [runHealthCheck]);\n\n const onStateChangeRef = useRef(onStateChange);\n useEffect(() => { onStateChangeRef.current = onStateChange; });\n useEffect(() => { onStateChangeRef.current?.(orbState); }, [orbState]);\n\n const startRef = useRef(start);\n const stopRef = useRef(stop);\n useEffect(() => { startRef.current = start; }, [start]);\n useEffect(() => { stopRef.current = stop; }, [stop]);\n useEffect(() => { return () => { stopRef.current(true); }; }, []);\n\n const [micPaused, setMicPaused] = useState(false);\n const [activity, setActivity] = useState(0);\n const hasConversationRef = useRef(false);\n hasConversationRef.current = messages.length > 0;\n const onCollapseRef = useRef(onCollapse);\n useEffect(() => { onCollapseRef.current = onCollapse; });\n\n const bumpActivity = useCallback(() => { setActivity((c) => c + 1); }, []);\n\n const handleMicToggle = useCallback(() => {\n setMicPaused(false); bumpActivity();\n if (state === 'LISTENING' || state === 'USER_SPEAKING') { stop(); }\n else if (state === 'IDLE') { start(); }\n }, [state, start, stop, bumpActivity]);\n\n useEffect(() => { if (panelState === 'hidden') stopRef.current(true); }, [panelState]);\n\n useEffect(() => {\n if (panelState === 'hidden' || micPaused) return;\n if (state === 'PROCESSING' || state === 'AI_SPEAKING') return;\n const timer = setTimeout(() => { stopRef.current(); if (hasConversationRef.current) { setMicPaused(true); } else { onCollapseRef.current(); } }, settings.idleTimeoutMs);\n return () => clearTimeout(timer);\n }, [state, panelState, micPaused, activity, settings.idleTimeoutMs]);\n\n useEffect(() => {\n if (!micPaused || panelState !== 'expanded') return;\n if (settings.panelCollapseTimeoutMs === 0) return;\n const timer = setTimeout(() => { onCollapseRef.current(); }, settings.panelCollapseTimeoutMs);\n return () => clearTimeout(timer);\n }, [micPaused, panelState, activity, settings.panelCollapseTimeoutMs]);\n\n const handleTextSubmit = useCallback((text: string) => { setMicPaused(false); bumpActivity(); sendTextMessage(text); }, [sendTextMessage, bumpActivity]);\n\n const isTyping = state === 'AI_SPEAKING' || isLLMLoading;\n const effectiveError = backendDown ? ('network_error' as const) : voiceError;\n\n const [isRetrying, setIsRetrying] = useState(false);\n const handleRetryClick = useCallback(() => {\n if (isRetrying) return; setIsRetrying(true);\n checkLLMHealth().then(({ available }) => {\n if (cancelledRef.current) return; setIsRetrying(false); setBackendDown(!available);\n if (available) { dismissError(); if (!autoStartedRef.current && settings.autoListen) { autoStartedRef.current = true; startRef.current(); } }\n if (!available) { if (pollTimerRef.current) clearTimeout(pollTimerRef.current); pollTimerRef.current = setTimeout(runHealthCheck, RECOVERY_POLL_MS); }\n }).catch(() => setIsRetrying(false));\n }, [isRetrying, runHealthCheck, dismissError, settings.autoListen]);\n\n const [showSettings, setShowSettings] = useState(false);\n const toggleSettings = useCallback(() => setShowSettings((p) => !p), []);\n\n if (panelState === 'collapsed') {\n return <CollapsedBar orbState={orbState} getAmplitude={getAmplitude} analyser={analyser} voiceState={state} onExpand={onExpand} onClose={onClose} onRetry={handleRetryClick} isRetrying={isRetrying} voiceError={effectiveError} micPaused={micPaused} onMicToggle={handleMicToggle} ttsEnabled={settings.ttsEnabled} copilotName={config.copilotName} portraitSrc={resolvedPortrait} />;\n }\n\n return (\n <div className=\"relative h-full\">\n <ExpandedContent orbState={orbState} getAmplitude={getAmplitude} analyser={analyser} voiceState={state} messages={messages} isTyping={isTyping} toolResult={toolResult} voiceError={effectiveError} dismissError={dismissError} onCollapse={onCollapse} onClose={onClose} onTextSubmit={handleTextSubmit} onMicToggle={handleMicToggle} micPaused={micPaused} onToolDismiss={() => setToolResult(null)} onInteraction={bumpActivity} onRetry={handleRetryClick} isRetrying={isRetrying} lastTimings={lastTimings} showPipelineMetrics={settings.showPipelineMetrics} pipelineMetricsAutoHideMs={settings.pipelineMetricsAutoHideMs} showSettings={showSettings} onSettingsToggle={toggleSettings} ttsEnabled={settings.ttsEnabled} copilotName={config.copilotName} portraitSrc={resolvedPortrait} />\n <AnimatePresence>\n {showSettings && (<Suspense fallback={null}><VoiceSettingsView onBack={toggleSettings} onVolumeChange={applyVolume} /></Suspense>)}\n </AnimatePresence>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Main exported component\n// ---------------------------------------------------------------------------\nexport default function GlassCopilotPanel({ isOpen, onOpen, onClose, onStateChange, portraitSrc }: GlassCopilotPanelProps) {\n injectAgentFabCSS();\n const config = useSiteConfig();\n const resolvedPortrait = portraitSrc ?? config.avatarUrl;\n const [internalState, setInternalState] = useState<'collapsed' | 'expanded'>('collapsed');\n const panelState: PanelState = isOpen ? internalState : 'hidden';\n const handleClose = useCallback(() => { onClose(); }, [onClose]);\n const handleCollapse = useCallback(() => { setInternalState('collapsed'); }, []);\n const handleExpand = useCallback(() => { setInternalState('expanded'); }, []);\n\n const isVisible = panelState !== 'hidden';\n const isExpanded = panelState === 'expanded';\n const targetHeight = isExpanded ? PANEL_EXPANDED_HEIGHT : PANEL_COLLAPSED_HEIGHT;\n\n const panelRef = useRef<HTMLDivElement>(null);\n const fabRef = useRef<HTMLDivElement>(null);\n const prevVisibleRef = useRef(isVisible);\n\n useEffect(() => {\n if (isVisible && !prevVisibleRef.current) { requestAnimationFrame(() => panelRef.current?.focus()); }\n else if (!isVisible && prevVisibleRef.current) { requestAnimationFrame(() => { const fabButton = fabRef.current?.querySelector('button'); fabButton?.focus(); }); }\n prevVisibleRef.current = isVisible;\n }, [isVisible]);\n\n const [ariaAnnouncement, setAriaAnnouncement] = useState('');\n const handleStateChange = useCallback((orbState: OrbState) => { setAriaAnnouncement(ARIA_LIVE_LABELS[orbState]); onStateChange?.(orbState); }, [onStateChange]);\n\n return createPortal(\n <VoiceErrorBoundary onReset={handleClose}>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"0\" height=\"0\" style={{ position: 'absolute', overflow: 'hidden' }} aria-hidden=\"true\">\n <defs>\n <filter id=\"liquid-glass-panel\" x=\"0%\" y=\"0%\" width=\"100%\" height=\"100%\">\n <feTurbulence type=\"fractalNoise\" baseFrequency=\"0.008 0.008\" numOctaves=\"2\" seed=\"42\" result=\"noise\" />\n <feGaussianBlur in=\"noise\" stdDeviation=\"2\" result=\"blurred_noise\" />\n <feDisplacementMap in=\"SourceGraphic\" in2=\"blurred_noise\" scale=\"50\" xChannelSelector=\"R\" yChannelSelector=\"G\" />\n </filter>\n </defs>\n </svg>\n\n <span aria-live=\"polite\" aria-atomic=\"true\" style={{ position: 'absolute', width: 1, height: 1, padding: 0, margin: -1, overflow: 'hidden', clip: 'rect(0,0,0,0)', whiteSpace: 'nowrap', borderWidth: 0 }}>\n {ariaAnnouncement}\n </span>\n\n <AnimatePresence>\n {!isVisible && (\n <motion.div ref={fabRef} key=\"copilot-fab\" initial={{ scale: 0, opacity: 0 }} animate={{ scale: 1, opacity: 1 }} exit={{ scale: 0, opacity: 0 }} transition={{ duration: 0.25, ease: 'easeOut' }} className=\"fixed\" style={{ bottom: PANEL_BOTTOM, right: PANEL_RIGHT, zIndex: PANEL_Z_INDEX }}>\n <CopilotFAB onClick={() => onOpen?.()} portraitSrc={resolvedPortrait} />\n </motion.div>\n )}\n\n {isVisible && (\n <motion.div ref={panelRef} tabIndex={-1} key=\"copilot-panel\" role=\"dialog\" aria-label=\"Voice Assistant\" aria-modal=\"false\" data-testid=\"voice-agent-panel\"\n initial={{ width: 48, height: 48, borderRadius: 24, opacity: 0, scale: 0.9 }}\n animate={{ width: PANEL_WIDTH, height: Math.min(targetHeight, window.innerHeight - 48), borderRadius: PANEL_BORDER_RADIUS, opacity: 1, scale: 1, transition: SPRING_PANEL }}\n exit={{ width: 48, height: 48, borderRadius: 24, opacity: 0, scale: 0.95, transition: SPRING_PANEL_EXIT }}\n className=\"fixed\"\n style={{ bottom: PANEL_BOTTOM, right: PANEL_RIGHT, zIndex: PANEL_Z_INDEX, transformOrigin: 'bottom right', maxWidth: 'calc(100vw - 32px)', outline: 'none' }}\n >\n <div className=\"absolute inset-0 pointer-events-none\" style={{ borderRadius: PANEL_BORDER_RADIUS, overflow: 'hidden', backdropFilter: 'blur(2px)', WebkitBackdropFilter: 'blur(2px)', filter: 'url(#liquid-glass-panel)', isolation: 'isolate' }} />\n <div className=\"absolute inset-0 pointer-events-none\" style={{ borderRadius: PANEL_BORDER_RADIUS, overflow: 'hidden', backdropFilter: 'blur(14px) saturate(1.4)', WebkitBackdropFilter: 'blur(14px) saturate(1.4)', backgroundColor: 'rgba(230,232,245,0.32)', border: '1px solid rgba(255,255,255,0.4)', boxShadow: 'inset 0 0 20px -5px rgba(255,255,255,0.3), inset 0 1px 0 0 rgba(255,255,255,0.8), 0 0 0 1px rgba(0,0,0,0.08), 0 1px 3px rgba(0,0,0,0.08), 0 8px 24px rgba(0,0,0,0.14), 0 24px 48px rgba(0,0,0,0.10)' }} />\n <div className=\"absolute inset-0 pointer-events-none\" style={{ borderRadius: PANEL_BORDER_RADIUS, background: 'linear-gradient(to bottom, rgba(255,255,255,0.15) 0%, rgba(255,255,255,0) 20%)' }} />\n <div style={{ position: 'relative', zIndex: 1, height: '100%', overflow: 'hidden', borderRadius: PANEL_BORDER_RADIUS }}>\n <WiredPanel panelState={panelState} onCollapse={handleCollapse} onExpand={handleExpand} onClose={handleClose} onStateChange={handleStateChange} portraitSrc={resolvedPortrait} />\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </VoiceErrorBoundary>,\n document.body\n );\n}\n","import { useRef, useEffect, useState, useCallback } from 'react';\nimport VoiceOrb from './VoiceOrb';\nimport {\n AVATAR_PORTRAIT_RATIO,\n AVATAR_STATE_FILTERS,\n buildGlowColors,\n useSiteConfig,\n} from '@unctad-ai/voice-agent-core';\nimport type { OrbState } from '@unctad-ai/voice-agent-core';\n\n/** Conic gradient colors per state — [color1, color2] */\nconst RING_COLORS: Record<OrbState, [string, string]> = {\n idle: ['#93a3c8', '#b0bfdb'],\n listening: ['#DB2129', '#34d399'],\n processing: ['#F59E0B', '#FBBF24'],\n speaking: ['#14B8A6', '#34d399'],\n error: ['#DC2626', '#991B1B'],\n};\n\ninterface AgentAvatarProps {\n state: OrbState;\n getAmplitude: () => number;\n size?: number;\n showAura?: boolean;\n /** Show audio-reactive conic-gradient ring around portrait */\n showRing?: boolean;\n /** URL for the avatar portrait image */\n portraitSrc?: string;\n /** Monogram letter shown when image fails to load */\n monogram?: string;\n}\n\nfunction lerp(a: number, b: number, t: number) {\n return a + (b - a) * t;\n}\n\nexport default function AgentAvatar({\n state,\n getAmplitude,\n size = 36,\n showAura = true,\n showRing = false,\n portraitSrc,\n monogram,\n}: AgentAvatarProps) {\n const config = useSiteConfig();\n const initial = monogram ?? config.copilotName?.charAt(0)?.toUpperCase() ?? 'A';\n const { colors } = useSiteConfig();\n const AVATAR_GLOW_COLORS = buildGlowColors(colors);\n const portraitSize = Math.round(size * AVATAR_PORTRAIT_RATIO);\n const offset = Math.round((size - portraitSize) / 2);\n\n // Ring sits between aura and portrait — 3px border around portrait\n const ringWidth = 3;\n const ringSize = portraitSize + ringWidth * 2;\n const ringOffset = Math.round((size - ringSize) / 2);\n\n const imgRef = useRef<HTMLImageElement>(null);\n const glowRef = useRef<HTMLDivElement>(null);\n const ringRef = useRef<HTMLDivElement>(null);\n const rafRef = useRef<number>(0);\n const stateRef = useRef<OrbState>(state);\n useEffect(() => {\n stateRef.current = state;\n });\n const getAmpRef = useRef(getAmplitude);\n useEffect(() => {\n getAmpRef.current = getAmplitude;\n });\n\n const [loaded, setLoaded] = useState(false);\n const [errored, setErrored] = useState(false);\n\n // Detect prefers-reduced-motion\n const reducedRef = useRef(false);\n useEffect(() => {\n const mql = window.matchMedia('(prefers-reduced-motion: reduce)');\n reducedRef.current = mql.matches;\n const handler = (e: MediaQueryListEvent) => {\n reducedRef.current = e.matches;\n };\n mql.addEventListener('change', handler);\n return () => mql.removeEventListener('change', handler);\n }, []);\n\n // Animated filter values — lerped each frame, no React re-renders\n const animRef = useRef({\n brightness: AVATAR_STATE_FILTERS.idle.brightness,\n saturate: AVATAR_STATE_FILTERS.idle.saturate,\n opacity: AVATAR_STATE_FILTERS.idle.opacity,\n scale: AVATAR_STATE_FILTERS.idle.scale,\n glowIntensity: AVATAR_STATE_FILTERS.idle.glowIntensity,\n ringAngle: 0,\n });\n\n useEffect(() => {\n let startTime: number | null = null;\n let prevTimestamp = 0;\n\n const tick = (timestamp: number) => {\n if (startTime === null) startTime = timestamp;\n const elapsed = (timestamp - startTime) / 1000;\n const dt = prevTimestamp ? (timestamp - prevTimestamp) / 1000 : 0.016;\n prevTimestamp = timestamp;\n\n const target = AVATAR_STATE_FILTERS[stateRef.current];\n const a = animRef.current;\n const speed = 0.08;\n\n a.brightness = lerp(a.brightness, target.brightness, speed);\n a.saturate = lerp(a.saturate, target.saturate, speed);\n a.scale = lerp(a.scale, target.scale, speed);\n a.glowIntensity = lerp(a.glowIntensity, target.glowIntensity, speed);\n\n // Processing opacity pulses\n let targetOpacity = target.opacity;\n if (stateRef.current === 'processing') {\n targetOpacity = 0.92 + Math.sin(elapsed * 4) * 0.06;\n }\n a.opacity = lerp(a.opacity, targetOpacity, speed);\n\n // Speaking state: portrait scale reacts to amplitude\n const amp = getAmpRef.current();\n const ampFactor = reducedRef.current ? 0.2 : 1;\n let scaleBoost = 0;\n if (stateRef.current === 'speaking') {\n scaleBoost = amp * 0.03 * ampFactor;\n }\n\n // Apply to portrait image via direct DOM mutation\n const img = imgRef.current;\n if (img) {\n img.style.filter = `brightness(${a.brightness}) saturate(${a.saturate})`;\n img.style.opacity = String(a.opacity);\n img.style.transform = `scale(${a.scale + scaleBoost})`;\n }\n\n // Apply glow overlay\n const glow = glowRef.current;\n if (glow) {\n glow.style.backgroundColor = AVATAR_GLOW_COLORS[stateRef.current];\n glow.style.opacity = String(a.glowIntensity);\n }\n\n // Audio-reactive ring\n const ring = ringRef.current;\n if (ring) {\n const ringColors = RING_COLORS[stateRef.current];\n // Rotation: base 120 deg/s, amplitude boosts up to 3x\n const rotSpeed = reducedRef.current ? 0 : 120 * (1 + amp * 2);\n a.ringAngle = (a.ringAngle + rotSpeed * dt) % 360;\n // Ring opacity: idle = subtle, active states = brighter with amplitude boost\n const isActive = stateRef.current !== 'idle';\n const ringOpacity = isActive ? 0.7 + amp * 0.3 : 0.35;\n // Scale pulse with amplitude\n const ringScale = 1 + amp * 0.04 * ampFactor;\n\n ring.style.background = `conic-gradient(from ${a.ringAngle}deg, ${ringColors[0]}, ${ringColors[1]}, ${ringColors[0]})`;\n ring.style.opacity = String(ringOpacity);\n ring.style.transform = `scale(${ringScale})`;\n }\n\n rafRef.current = requestAnimationFrame(tick);\n };\n\n rafRef.current = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(rafRef.current);\n }, []);\n\n const handleLoad = useCallback(() => setLoaded(true), []);\n const handleError = useCallback(() => setErrored(true), []);\n\n return (\n <div\n style={{\n position: 'relative',\n width: size,\n height: size,\n flexShrink: 0,\n }}\n >\n {/* Layer 1: Aura — VoiceOrb as reactive background */}\n {showAura && (\n <div style={{ position: 'absolute', inset: 0 }}>\n <VoiceOrb state={state} getAmplitude={getAmplitude} size={size} />\n </div>\n )}\n\n {/* Layer 1.5: Audio-reactive conic-gradient ring */}\n {showRing && (\n <div\n ref={ringRef}\n style={{\n position: 'absolute',\n top: ringOffset,\n left: ringOffset,\n width: ringSize,\n height: ringSize,\n borderRadius: '50%',\n background: `conic-gradient(from 0deg, ${RING_COLORS.idle[0]}, ${RING_COLORS.idle[1]}, ${RING_COLORS.idle[0]})`,\n opacity: 0.35,\n WebkitMask: `radial-gradient(circle, transparent ${Math.round((portraitSize / ringSize) * 50)}%, black ${Math.round((portraitSize / ringSize) * 50)}%)`,\n mask: `radial-gradient(circle, transparent ${Math.round((portraitSize / ringSize) * 50)}%, black ${Math.round((portraitSize / ringSize) * 50)}%)`,\n pointerEvents: 'none',\n willChange: 'transform, background, opacity',\n }}\n />\n )}\n\n {/* Layer 2: Glow overlay — color wash per state */}\n <div\n ref={glowRef}\n style={{\n position: 'absolute',\n top: offset,\n left: offset,\n width: portraitSize,\n height: portraitSize,\n borderRadius: '50%',\n mixBlendMode: 'soft-light',\n opacity: 0,\n pointerEvents: 'none',\n transition: 'background-color 0.3s',\n }}\n />\n\n {/* Layer 3: Portrait */}\n <div\n style={{\n position: 'absolute',\n top: offset,\n left: offset,\n width: portraitSize,\n height: portraitSize,\n borderRadius: '50%',\n overflow: 'hidden',\n }}\n >\n {errored || !portraitSrc ? (\n // Monogram fallback\n <div\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: colors.primary,\n color: 'white',\n fontFamily: 'DM Sans, sans-serif',\n fontWeight: 700,\n fontSize: Math.round(portraitSize * 0.45),\n }}\n >\n {initial}\n </div>\n ) : (\n <img\n ref={imgRef}\n src={portraitSrc}\n alt=\"Avatar\"\n onLoad={handleLoad}\n onError={handleError}\n style={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n borderRadius: '50%',\n opacity: loaded ? 0.95 : 0,\n transition: loaded ? 'none' : 'opacity 0.3s ease-in',\n willChange: 'filter, transform, opacity',\n }}\n draggable={false}\n />\n )}\n </div>\n </div>\n );\n}\n","import { useRef, useEffect, useCallback, useState } from 'react';\nimport { createNoise3D } from 'simplex-noise';\nimport { ORB_NUM_POINTS, ORB_LERP_SPEED, useSiteConfig } from '@unctad-ai/voice-agent-core';\nimport type { OrbState } from '@unctad-ai/voice-agent-core';\n\ninterface VoiceOrbProps {\n state: OrbState;\n /** Getter function called each animation frame — avoids 60fps React re-renders */\n getAmplitude: () => number;\n size?: number;\n}\n\n// ---------- state config ----------\n\ninterface StateConfig {\n colors: [string, string];\n noiseSpeed: number;\n noiseMag: number;\n baseScale: number;\n breathAmp: number;\n breathSpeed: number;\n rotation: number;\n shimmer: boolean;\n}\n\n/** Glow color that pulses around the orb per state */\nconst STATE_GLOW: Record<OrbState, string> = {\n idle: 'rgba(59, 130, 246, 0.25)',\n listening: 'rgba(219, 33, 41, 0.45)',\n processing: 'rgba(245, 158, 11, 0.4)',\n speaking: 'rgba(20, 184, 166, 0.4)',\n error: 'rgba(220, 38, 38, 0.4)',\n};\n\nfunction buildStateConfig(primaryColor: string): Record<OrbState, StateConfig> {\n return {\n idle: {\n colors: ['#1E3A5F', '#3B82F6'],\n noiseSpeed: 0.3,\n noiseMag: 8,\n baseScale: 0.975,\n breathAmp: 0.025,\n breathSpeed: 0.25,\n rotation: 0,\n shimmer: false,\n },\n listening: {\n colors: [primaryColor, '#F59E0B'],\n noiseSpeed: 0.6,\n noiseMag: 18,\n baseScale: 1.0,\n breathAmp: 0.04,\n breathSpeed: 0.5,\n rotation: 0,\n shimmer: false,\n },\n processing: {\n colors: ['#D97706', '#FBBF24'],\n noiseSpeed: 1.0,\n noiseMag: 14,\n baseScale: 1.0,\n breathAmp: 0.02,\n breathSpeed: 0.8,\n rotation: 0.4,\n shimmer: true,\n },\n speaking: {\n colors: ['#1B7A50', '#2DD4BF'],\n noiseSpeed: 0.5,\n noiseMag: 16,\n baseScale: 1.0,\n breathAmp: 0.05,\n breathSpeed: 0.4,\n rotation: 0,\n shimmer: false,\n },\n error: {\n colors: ['#DC2626', '#991B1B'],\n noiseSpeed: 1.4,\n noiseMag: 22,\n baseScale: 0.95,\n breathAmp: 0.01,\n breathSpeed: 1.2,\n rotation: 0,\n shimmer: false,\n },\n };\n}\n\nconst NUM_POINTS = ORB_NUM_POINTS;\nconst LERP_SPEED = ORB_LERP_SPEED;\n\nfunction useReducedMotion() {\n const [reduced, setReduced] = useState(\n () => window.matchMedia('(prefers-reduced-motion: reduce)').matches\n );\n useEffect(() => {\n const mql = window.matchMedia('(prefers-reduced-motion: reduce)');\n const handler = (e: MediaQueryListEvent) => setReduced(e.matches);\n mql.addEventListener('change', handler);\n return () => mql.removeEventListener('change', handler);\n }, []);\n return reduced;\n}\n\nfunction lerp(a: number, b: number, t: number) {\n return a + (b - a) * t;\n}\n\nfunction lerpColor(a: string, b: string, t: number): string {\n const parseHex = (h: string) => [\n parseInt(h.slice(1, 3), 16),\n parseInt(h.slice(3, 5), 16),\n parseInt(h.slice(5, 7), 16),\n ];\n const ca = parseHex(a);\n const cb = parseHex(b);\n const r = Math.round(lerp(ca[0], cb[0], t));\n const g = Math.round(lerp(ca[1], cb[1], t));\n const bl = Math.round(lerp(ca[2], cb[2], t));\n return `#${((1 << 24) | (r << 16) | (g << 8) | bl).toString(16).slice(1)}`;\n}\n\nexport default function VoiceOrb({ state, getAmplitude, size = 200 }: VoiceOrbProps) {\n const config = useSiteConfig();\n const STATE_CONFIG = buildStateConfig(config.colors.primary);\n\n const svgRef = useRef<SVGSVGElement>(null);\n const rafRef = useRef<number>(0);\n const noise3D = useRef(createNoise3D());\n const prefersReduced = useReducedMotion();\n const reducedRef = useRef(prefersReduced);\n reducedRef.current = prefersReduced;\n\n // Animated (lerped) config values that transition smoothly between states\n const animRef = useRef({\n noiseSpeed: STATE_CONFIG.idle.noiseSpeed,\n noiseMag: STATE_CONFIG.idle.noiseMag,\n baseScale: STATE_CONFIG.idle.baseScale,\n breathAmp: STATE_CONFIG.idle.breathAmp,\n breathSpeed: STATE_CONFIG.idle.breathSpeed,\n rotation: STATE_CONFIG.idle.rotation,\n color0: STATE_CONFIG.idle.colors[0],\n color1: STATE_CONFIG.idle.colors[1],\n shimmer: 0,\n errorShake: 0,\n });\n\n const stateRef = useRef<OrbState>(state);\n stateRef.current = state;\n\n const getAmplitudeRef = useRef(getAmplitude);\n getAmplitudeRef.current = getAmplitude;\n\n const stateConfigRef = useRef(STATE_CONFIG);\n stateConfigRef.current = STATE_CONFIG;\n\n const buildPath = useCallback(\n (time: number, a: typeof animRef.current): string => {\n const cx = size / 2;\n const cy = size / 2;\n const baseR = size * 0.35;\n const amp = getAmplitudeRef.current();\n\n // amplitude influences noise magnitude\n const mag = a.noiseMag + amp * 20;\n\n const points: [number, number][] = [];\n for (let i = 0; i < NUM_POINTS; i++) {\n const angle = (i / NUM_POINTS) * Math.PI * 2;\n const nx = Math.cos(angle);\n const ny = Math.sin(angle);\n const noiseVal = noise3D.current(nx * 1.5, ny * 1.5, time * a.noiseSpeed);\n const r = baseR + noiseVal * mag;\n points.push([cx + Math.cos(angle) * r, cy + Math.sin(angle) * r]);\n }\n\n // Build smooth closed path with cubic beziers\n let d = `M ${points[0][0]},${points[0][1]} `;\n for (let i = 0; i < NUM_POINTS; i++) {\n const curr = points[i];\n const next = points[(i + 1) % NUM_POINTS];\n const prev = points[(i - 1 + NUM_POINTS) % NUM_POINTS];\n const next2 = points[(i + 2) % NUM_POINTS];\n\n const cp1x = curr[0] + (next[0] - prev[0]) / 6;\n const cp1y = curr[1] + (next[1] - prev[1]) / 6;\n const cp2x = next[0] - (next2[0] - curr[0]) / 6;\n const cp2y = next[1] - (next2[1] - curr[1]) / 6;\n\n d += `C ${cp1x},${cp1y} ${cp2x},${cp2y} ${next[0]},${next[1]} `;\n }\n d += 'Z';\n return d;\n },\n [size]\n );\n\n useEffect(() => {\n let startTime: number | null = null;\n\n const tick = (timestamp: number) => {\n if (startTime === null) startTime = timestamp;\n const elapsed = (timestamp - startTime) / 1000;\n\n const target = stateConfigRef.current[stateRef.current];\n const a = animRef.current;\n\n // When prefers-reduced-motion is active, dampen animations significantly\n const rd = reducedRef.current ? 0.15 : 1;\n\n // Lerp all animated values toward target\n a.noiseSpeed = lerp(a.noiseSpeed, target.noiseSpeed * rd, LERP_SPEED);\n a.noiseMag = lerp(a.noiseMag, target.noiseMag * rd, LERP_SPEED);\n a.baseScale = lerp(a.baseScale, target.baseScale, LERP_SPEED);\n a.breathAmp = lerp(a.breathAmp, target.breathAmp * rd, LERP_SPEED);\n a.breathSpeed = lerp(a.breathSpeed, target.breathSpeed * rd, LERP_SPEED);\n a.rotation = lerp(a.rotation, target.rotation * rd, LERP_SPEED);\n a.shimmer = lerp(a.shimmer, target.shimmer ? (reducedRef.current ? 0 : 1) : 0, LERP_SPEED);\n a.color0 = lerpColor(a.color0, target.colors[0], LERP_SPEED);\n a.color1 = lerpColor(a.color1, target.colors[1], LERP_SPEED);\n\n // Error shake decays\n if (stateRef.current === 'error') {\n a.errorShake = lerp(a.errorShake, 1, 0.1);\n } else {\n a.errorShake = lerp(a.errorShake, 0, 0.08);\n }\n\n const svg = svgRef.current;\n if (!svg) {\n rafRef.current = requestAnimationFrame(tick);\n return;\n }\n\n // Breathing scale\n const breath = a.baseScale + Math.sin(elapsed * Math.PI * 2 * a.breathSpeed) * a.breathAmp;\n\n // Error shake offset\n const shakeX = a.errorShake * Math.sin(elapsed * 30) * 3 * (1 - Math.min(elapsed * 0.3, 1));\n\n // Rotation\n const rot = elapsed * a.rotation * 360;\n\n // Update transform\n const group = svg.querySelector<SVGGElement>('[data-orb-group]');\n if (group) {\n group.setAttribute(\n 'transform',\n `translate(${size / 2 + shakeX}, ${size / 2}) scale(${breath}) rotate(${rot}) translate(${-size / 2}, ${-size / 2})`\n );\n }\n\n // Update blob path\n const path = svg.querySelector<SVGPathElement>('[data-orb-path]');\n if (path) {\n path.setAttribute('d', buildPath(elapsed, a));\n }\n\n // Update gradient colors\n const stop0 = svg.querySelector<SVGStopElement>('[data-stop-0]');\n const stop1 = svg.querySelector<SVGStopElement>('[data-stop-1]');\n if (stop0) stop0.setAttribute('stop-color', a.color0);\n if (stop1) stop1.setAttribute('stop-color', a.color1);\n\n // Shimmer opacity\n const shimmerEl = svg.querySelector<SVGCircleElement>('[data-shimmer]');\n if (shimmerEl) {\n const shimmerOpacity = a.shimmer * (0.15 + Math.sin(elapsed * 6) * 0.1);\n shimmerEl.setAttribute('opacity', String(shimmerOpacity));\n }\n\n // Ambient glow — color follows state, opacity pulses with breath\n const glowEl = svg.querySelector<SVGCircleElement>('[data-orb-glow]');\n if (glowEl) {\n const amp = getAmplitudeRef.current();\n const glowPulse = 0.35 + Math.sin(elapsed * Math.PI * 2 * a.breathSpeed) * 0.15 + amp * 0.3;\n glowEl.setAttribute('opacity', String(Math.min(glowPulse, 1)));\n glowEl.setAttribute('fill', STATE_GLOW[stateRef.current]);\n }\n\n rafRef.current = requestAnimationFrame(tick);\n };\n\n rafRef.current = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(rafRef.current);\n }, [size, buildPath]);\n\n const idRef = useRef<string>(null);\n idRef.current ??= Math.random().toString(36).slice(2, 8);\n const gradientId = `orb-gradient-${idRef.current}`;\n const shimmerId = `orb-shimmer-${idRef.current}`;\n const glowFilterId = `orb-glow-${idRef.current}`;\n\n return (\n <svg\n ref={svgRef}\n width={size}\n height={size}\n viewBox={`0 0 ${size} ${size}`}\n className=\"select-none\"\n style={{ overflow: 'visible' }}\n aria-hidden=\"true\"\n >\n <defs>\n <radialGradient id={gradientId} cx=\"40%\" cy=\"35%\" r=\"60%\">\n <stop data-stop-0 offset=\"0%\" stopColor={STATE_CONFIG.idle.colors[0]} />\n <stop data-stop-1 offset=\"100%\" stopColor={STATE_CONFIG.idle.colors[1]} />\n </radialGradient>\n <radialGradient id={shimmerId} cx=\"30%\" cy=\"30%\" r=\"50%\">\n <stop offset=\"0%\" stopColor=\"white\" stopOpacity=\"0.6\" />\n <stop offset=\"100%\" stopColor=\"white\" stopOpacity=\"0\" />\n </radialGradient>\n <filter id={glowFilterId} x=\"-50%\" y=\"-50%\" width=\"200%\" height=\"200%\">\n <feGaussianBlur in=\"SourceGraphic\" stdDeviation=\"18\" />\n </filter>\n </defs>\n {/* Ambient glow halo behind the orb */}\n <circle\n data-orb-glow\n cx={size / 2}\n cy={size / 2}\n r={size * 0.38}\n fill={STATE_GLOW.idle}\n opacity=\"0.5\"\n filter={`url(#${glowFilterId})`}\n />\n <g data-orb-group>\n <path data-orb-path fill={`url(#${gradientId})`} />\n <circle\n data-shimmer\n cx={size / 2}\n cy={size / 2}\n r={size * 0.3}\n fill={`url(#${shimmerId})`}\n opacity=\"0\"\n />\n </g>\n </svg>\n );\n}\n","const AGENT_FAB_CSS = `\n@keyframes agent-fab-rotate {\n from { --agent-angle: 0deg; }\n to { --agent-angle: 360deg; }\n}\n@property --agent-angle {\n syntax: '<angle>';\n initial-value: 0deg;\n inherits: false;\n}\n.agent-fab-border {\n position: relative;\n border-radius: 50%;\n padding: 3px;\n background: conic-gradient(from var(--agent-angle), var(--agent-primary, #db2129) 0%, #34d399 50%, var(--agent-primary, #db2129) 100%);\n animation: agent-fab-rotate 3s linear infinite;\n}\n.agent-fab-border-inner {\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n overflow: hidden;\n width: 100%;\n height: 100%;\n background: #fff;\n}\n.agent-fab-border-inner img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 50%;\n}\n@media (prefers-reduced-motion: reduce) {\n .agent-fab-border { animation: none; }\n}`;\n\nlet injected = false;\nexport function injectAgentFabCSS() {\n if (injected || typeof document === 'undefined') return;\n const style = document.createElement('style');\n style.textContent = AGENT_FAB_CSS;\n document.head.appendChild(style);\n injected = true;\n}\n","import { useState, useEffect, useRef } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { cn } from '../utils';\nimport {\n MAX_VISIBLE_MESSAGES,\n MAX_TEXT_LENGTH,\n TYPEWRITER_DELAY_MS,\n MIN_DISPLAY_LENGTH,\n PANEL_MAX_VISIBLE_MESSAGES,\n PANEL_MAX_TEXT_LENGTH,\n} from '@unctad-ai/voice-agent-core';\nimport type { VoiceMessage, ActionCategory } from '@unctad-ai/voice-agent-core';\nimport type { VoiceErrorType } from './VoiceErrorDisplay';\nimport { ArrowRight, PenLine, MousePointerClick, Search, Info } from 'lucide-react';\n\n/** Strip markdown/HTML artifacts, TTS paralinguistic tags, and emojis — preserves line breaks */\nfunction cleanForDisplay(text: string): string {\n return text\n .replace(/\\[(laugh|chuckle|sigh|gasp|cough|clear throat|sniff|groan|shush)\\]/gi, '') // TTS paralinguistic tags\n .replace(/\\*\\*(.*?)\\*\\*/g, '$1') // **bold** → bold\n .replace(/^\\s*\\*\\s+/gm, '- ') // * list items → dash lists\n .replace(/\\*(.*?)\\*/g, '$1') // *italic* → italic\n .replace(/`([^`]+)`/g, '$1') // `code` → code\n .replace(/^#{1,6}\\s+/gm, '') // # headings → plain text\n .replace(/<br\\s*\\/?>/gi, '\\n') // <br> → newline\n .replace(/<[^>]+>/g, '') // strip remaining HTML tags\n .replace(/\\|[-:\\s|]+\\|/g, '') // table separator rows\n .replace(/\\|/g, '\\n') // | cell dividers → newlines\n .replace(/\\p{Emoji_Presentation}|\\p{Extended_Pictographic}/gu, '') // strip emojis\n .replace(/[ \\t]{3,}/g, ' ') // collapse horizontal whitespace (preserve \\n)\n .replace(/\\n{3,}/g, '\\n\\n') // collapse 3+ newlines to double\n .replace(/^[\\s-]{3,}$/gm, '') // --- horizontal rules\n .trim();\n}\n\n/** Render cleaned text with line breaks and styled list items */\nfunction FormattedText({\n text,\n className,\n style,\n}: {\n text: string;\n className?: string;\n style?: React.CSSProperties;\n}) {\n const lines = text.split('\\n').filter((l) => l.trim().length > 0);\n\n if (lines.length <= 1) {\n return (\n <p className={className} style={style}>\n {text}\n </p>\n );\n }\n\n return (\n <div className={className} style={style}>\n {lines.map((line, i) => {\n const trimmed = line.trim();\n const isListItem = /^\\d+[.)]\\s/.test(trimmed) || /^[-]\\s/.test(trimmed);\n return (\n <p\n key={i}\n style={{\n marginTop: i === 0 ? 0 : isListItem ? 4 : 8,\n paddingLeft: isListItem ? 8 : 0,\n }}\n >\n {trimmed}\n </p>\n );\n })}\n </div>\n );\n}\n\ninterface VoiceTranscriptProps {\n messages: VoiceMessage[];\n isTyping: boolean;\n /** When true, uses minimal text layout (no glass background) for the panel */\n variant?: 'overlay' | 'panel';\n /** When set, replaces the empty-state placeholder with a prominent error message */\n voiceError?: VoiceErrorType;\n}\n\n/** Progressively reveals words while preserving FormattedText structure */\nfunction TypewriterFormattedText({\n text,\n className,\n style,\n}: {\n text: string;\n className?: string;\n style?: React.CSSProperties;\n}) {\n const [visibleWords, setVisibleWords] = useState(0);\n const words = text.split(' ');\n\n useEffect(() => {\n setVisibleWords(0);\n if (words.length === 0) return;\n\n let i = 0;\n const interval = setInterval(() => {\n i++;\n setVisibleWords(i);\n if (i >= words.length) clearInterval(interval);\n }, TYPEWRITER_DELAY_MS);\n\n return () => clearInterval(interval);\n }, [text, words.length]);\n\n const partialText = words.slice(0, visibleWords).join(' ');\n return <FormattedText text={partialText} className={className} style={style} />;\n}\n\n// ---------------------------------------------------------------------------\n// Action Badge — colors aligned to design system\n// ---------------------------------------------------------------------------\n\n// Subtle tints from project palette — same low-opacity family, gentle differentiation\nconst ACTION_CATEGORY_STYLES: Record<\n ActionCategory,\n { bg: string; border: string; text: string; Icon: typeof ArrowRight }\n> = {\n navigation: {\n bg: 'rgba(45,134,89,0.07)',\n border: 'rgba(45,134,89,0.14)',\n text: 'rgba(31,110,71,0.75)',\n Icon: ArrowRight,\n },\n form: {\n bg: 'rgba(110,114,138,0.07)',\n border: 'rgba(110,114,138,0.14)',\n text: 'rgba(85,88,102,0.75)',\n Icon: PenLine,\n },\n ui: {\n bg: 'rgba(141,145,168,0.07)',\n border: 'rgba(141,145,168,0.14)',\n text: 'rgba(85,88,102,0.75)',\n Icon: MousePointerClick,\n },\n search: {\n bg: 'rgba(219,33,41,0.05)',\n border: 'rgba(219,33,41,0.11)',\n text: 'rgba(168,26,31,0.7)',\n Icon: Search,\n },\n info: {\n bg: 'rgba(172,176,195,0.08)',\n border: 'rgba(172,176,195,0.14)',\n text: 'rgba(110,114,138,0.7)',\n Icon: Info,\n },\n};\n\nconst BADGE_CONTAINER_STYLE: React.CSSProperties = {\n display: 'flex',\n justifyContent: 'flex-start',\n};\nconst BADGE_TRANSITION = { duration: 0.2, ease: 'easeOut' as const };\n\nfunction ActionBadge({ msg, count = 1 }: { msg: VoiceMessage; count?: number }) {\n const category = msg.action?.category ?? 'info';\n const styles = ACTION_CATEGORY_STYLES[category];\n const { Icon } = styles;\n\n return (\n <motion.div\n initial={{ opacity: 0, scale: 0.92 }}\n animate={{ opacity: 1, scale: 1 }}\n exit={{ opacity: 0, scale: 0.92 }}\n transition={BADGE_TRANSITION}\n style={BADGE_CONTAINER_STYLE}\n role=\"status\"\n aria-label={count > 1 ? `${msg.text} (${count} times)` : msg.text}\n >\n <span\n className=\"inline-flex items-center gap-1.5 rounded-full\"\n style={{\n padding: '3px 10px',\n fontSize: '11px',\n fontWeight: 500,\n lineHeight: '1.3',\n color: styles.text,\n backgroundColor: styles.bg,\n border: `1px solid ${styles.border}`,\n }}\n >\n <Icon size={11} strokeWidth={2.2} aria-hidden=\"true\" />\n {msg.text}\n {count > 1 && (\n <span\n className=\"inline-flex items-center justify-center rounded-full\"\n style={{\n minWidth: 16,\n height: 16,\n padding: '0 4px',\n fontSize: '10px',\n fontWeight: 600,\n lineHeight: 1,\n color: styles.text,\n backgroundColor: styles.text.replace(/[\\d.]+\\)$/, '0.10)'),\n }}\n >\n {count}x\n </span>\n )}\n </span>\n </motion.div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Group consecutive action badges by action name\n// ---------------------------------------------------------------------------\n\ntype DisplayItem =\n | { type: 'message'; msg: VoiceMessage }\n | { type: 'action'; msg: VoiceMessage; count: number };\n\nfunction groupDisplayItems(messages: VoiceMessage[]): DisplayItem[] {\n const items: DisplayItem[] = [];\n for (const msg of messages) {\n if (msg.role !== 'action') {\n items.push({ type: 'message', msg });\n continue;\n }\n const prev = items[items.length - 1];\n if (prev?.type === 'action' && prev.msg.action?.name === msg.action?.name) {\n prev.count++;\n prev.msg = msg; // keep latest text/timestamp for display\n } else {\n items.push({ type: 'action', msg, count: 1 });\n }\n }\n return items;\n}\n\n/** Filter out noise, protocol leaks, and very short fragments */\nfunction isDisplayWorthy(msg: VoiceMessage): boolean {\n if (msg.role === 'action') return msg.text.trim().length > 0;\n const t = msg.text.trim();\n if (t.length < MIN_DISPLAY_LENGTH) return false;\n const alphaOnly = t.replace(/[\\s\\p{P}\\p{S}]+/gu, '');\n if (alphaOnly.length === 0) return false;\n return true;\n}\n\nexport default function VoiceTranscript({\n messages,\n isTyping,\n variant = 'overlay',\n voiceError,\n}: VoiceTranscriptProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const isPanel = variant === 'panel';\n const maxVisible = isPanel ? PANEL_MAX_VISIBLE_MESSAGES : MAX_VISIBLE_MESSAGES;\n const maxTextLen = isPanel ? PANEL_MAX_TEXT_LENGTH : MAX_TEXT_LENGTH;\n const visible = messages.filter(isDisplayWorthy).slice(-maxVisible);\n\n // Track whether user has manually scrolled away from bottom\n const userScrolledRef = useRef(false);\n const lastMessageCountRef = useRef(0);\n const contentRef = useRef<HTMLDivElement>(null);\n\n // Detect manual scroll: if user scrolls up, stop auto-scrolling\n useEffect(() => {\n if (!isPanel) return;\n const el = containerRef.current;\n if (!el) return;\n const handleScroll = () => {\n const atBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 40;\n userScrolledRef.current = !atBottom;\n };\n el.addEventListener('scroll', handleScroll, { passive: true });\n return () => el.removeEventListener('scroll', handleScroll);\n }, [isPanel]);\n\n // Reset manual scroll flag when a new message arrives\n useEffect(() => {\n if (visible.length > lastMessageCountRef.current) {\n userScrolledRef.current = false;\n }\n lastMessageCountRef.current = visible.length;\n }, [visible.length]);\n\n // Auto-scroll whenever content height changes (typewriter words, streaming, new messages)\n useEffect(() => {\n if (!isPanel) return;\n const contentEl = contentRef.current;\n const scrollEl = containerRef.current;\n if (!contentEl || !scrollEl) return;\n const observer = new ResizeObserver(() => {\n if (!userScrolledRef.current) {\n scrollEl.scrollTop = scrollEl.scrollHeight;\n }\n });\n observer.observe(contentEl);\n return () => observer.disconnect();\n }, [isPanel]);\n\n if (isPanel) {\n return (\n <div\n ref={containerRef}\n className=\"flex-1 min-h-0 overflow-y-auto overscroll-contain\"\n style={{\n padding: '16px 16px 12px',\n maskImage:\n 'linear-gradient(to bottom, transparent 0%, black 8px, black calc(100% - 8px), transparent 100%)',\n WebkitMaskImage:\n 'linear-gradient(to bottom, transparent 0%, black 8px, black calc(100% - 8px), transparent 100%)',\n }}\n >\n <div ref={contentRef} className=\"flex flex-col\">\n <AnimatePresence mode=\"popLayout\">\n {groupDisplayItems(visible).map((item, idx, arr) => {\n if (item.type === 'action') {\n // Show \"Copilot\" label before first action in a group\n const prevIsAction = idx > 0 && arr[idx - 1].type === 'action';\n const showLabel = !prevIsAction;\n return (\n <motion.div\n key={item.msg.timestamp}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -4 }}\n transition={{ duration: 0.2, ease: 'easeOut' }}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n marginTop: idx === 0 ? 0 : prevIsAction ? 4 : 12,\n }}\n >\n {showLabel && (\n <p\n className=\"font-[DM_Sans] uppercase tracking-wider\"\n style={{\n fontSize: '10px',\n fontWeight: 500,\n letterSpacing: '0.06em',\n color: 'rgba(0,0,0,0.35)',\n marginBottom: '4px',\n }}\n >\n Copilot\n </p>\n )}\n <ActionBadge msg={item.msg} count={item.count} />\n </motion.div>\n );\n }\n\n const { msg } = item;\n const isLast = idx === arr.length - 1;\n const isAI = msg.role === 'assistant';\n\n const cleaned = cleanForDisplay(msg.text);\n const displayText =\n cleaned.length > maxTextLen\n ? cleaned.slice(0, maxTextLen).trimEnd() + '...'\n : cleaned;\n\n return (\n <motion.div\n key={msg.timestamp}\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -4 }}\n transition={{ duration: 0.2, ease: 'easeOut' }}\n style={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: isAI ? 'flex-start' : 'flex-end',\n marginTop: idx === 0 ? 0 : 12,\n }}\n >\n <p\n className=\"font-[DM_Sans] uppercase tracking-wider\"\n style={{\n fontSize: '10px',\n fontWeight: 500,\n letterSpacing: '0.06em',\n color: isAI ? 'rgba(0,0,0,0.35)' : 'rgba(219,33,41,0.5)',\n marginBottom: '4px',\n }}\n >\n {isAI ? 'Copilot' : 'You'}\n </p>\n <div\n style={{\n ...(isAI\n ? {}\n : {\n backgroundColor: 'rgba(219,33,41,0.07)',\n border: '1px solid rgba(219,33,41,0.12)',\n borderRadius: '14px 14px 4px 14px',\n padding: '10px 14px',\n maxWidth: '88%',\n }),\n }}\n >\n {isAI && isLast && isTyping ? (\n <TypewriterFormattedText\n text={displayText}\n className=\"font-[DM_Sans]\"\n style={{\n fontSize: '14px',\n fontWeight: 400,\n lineHeight: '1.45',\n color: '#1a1a1a',\n }}\n />\n ) : (\n <FormattedText\n text={displayText}\n className=\"font-[DM_Sans]\"\n style={{\n fontSize: '14px',\n fontWeight: isAI ? 400 : 450,\n lineHeight: '1.45',\n color: isAI ? '#1a1a1a' : '#3d0a0b',\n }}\n />\n )}\n </div>\n </motion.div>\n );\n })}\n </AnimatePresence>\n\n {visible.length === 0 &&\n !isTyping &&\n (voiceError === 'llm_failed' || voiceError === 'network_error' ? (\n <motion.div\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.4, delay: 0.15 }}\n className=\"text-center font-[DM_Sans]\"\n style={{ paddingTop: '48px', paddingBottom: '16px' }}\n >\n <div\n className=\"mx-auto rounded-full flex items-center justify-center\"\n style={{\n width: 48,\n height: 48,\n backgroundColor: 'rgba(220, 38, 38, 0.08)',\n marginBottom: '14px',\n }}\n >\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"rgba(220,38,38,0.6)\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"1\" y1=\"1\" x2=\"23\" y2=\"23\" />\n <path d=\"M16.72 11.06A10.94 10.94 0 0 1 19 12.55\" />\n <path d=\"M5 12.55a10.94 10.94 0 0 1 5.17-2.39\" />\n <path d=\"M10.71 5.05A16 16 0 0 1 22.56 9\" />\n <path d=\"M1.42 9a15.91 15.91 0 0 1 4.7-2.88\" />\n <path d=\"M8.53 16.11a6 6 0 0 1 6.95 0\" />\n <line x1=\"12\" y1=\"20\" x2=\"12.01\" y2=\"20\" />\n </svg>\n </div>\n <p\n style={{\n fontSize: '15px',\n fontWeight: 600,\n color: 'rgba(0,0,0,0.7)',\n marginBottom: '6px',\n }}\n >\n Service offline\n </p>\n <p\n style={{\n fontSize: '13px',\n color: 'rgba(0,0,0,0.4)',\n lineHeight: '1.4',\n maxWidth: '240px',\n margin: '0 auto',\n }}\n >\n The AI assistant is currently unavailable. Please try again shortly.\n </p>\n </motion.div>\n ) : (\n <motion.p\n initial={{ opacity: 0, y: 4 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.4, delay: 0.2 }}\n className=\"text-center italic font-[DM_Sans]\"\n style={{ fontSize: '14px', color: 'rgba(0,0,0,0.4)', paddingTop: '60px' }}\n >\n Ask me anything\n </motion.p>\n ))}\n\n {isTyping && visible.length === 0 && (\n <motion.p\n initial={{ opacity: 0 }}\n animate={{ opacity: 0.5 }}\n style={{ color: 'rgba(0,0,0,0.4)', fontSize: '14px' }}\n >\n ...\n </motion.p>\n )}\n </div>\n </div>\n );\n }\n\n // Original overlay variant (unchanged)\n return (\n <div\n ref={containerRef}\n className=\"relative w-full max-w-md text-center rounded-2xl overflow-hidden\"\n >\n {/* Glass refraction layer */}\n <div\n className=\"absolute inset-0 rounded-2xl\"\n style={{\n backdropFilter: 'blur(2px)',\n WebkitBackdropFilter: 'blur(2px)',\n filter: 'url(#liquid-glass-orb)',\n isolation: 'isolate',\n }}\n />\n {/* Glass surface */}\n <div\n className=\"absolute inset-0 rounded-2xl\"\n style={{\n backgroundColor: 'rgba(255, 255, 255, 0.6)',\n border: '1px solid rgba(255, 255, 255, 0.4)',\n boxShadow: '0 6px 24px rgba(0, 0, 0, 0.05), inset 0 0 20px -5px rgba(255, 255, 255, 0.5)',\n }}\n />\n {/* Specular highlight */}\n <div\n className=\"absolute inset-0 rounded-2xl pointer-events-none\"\n style={{\n background:\n 'linear-gradient(to bottom, rgba(255,255,255,0.8) 0%, rgba(255,255,255,0) 40%)',\n }}\n />\n {/* Content */}\n <div className=\"relative flex flex-col gap-2 px-6 py-4\">\n <AnimatePresence mode=\"popLayout\">\n {groupDisplayItems(visible).map((item, idx, arr) => {\n if (item.type === 'action') {\n const prevIsAction = idx > 0 && arr[idx - 1].type === 'action';\n return (\n <div key={item.msg.timestamp} style={{ marginTop: prevIsAction ? -4 : 0 }}>\n <ActionBadge msg={item.msg} count={item.count} />\n </div>\n );\n }\n\n const { msg } = item;\n const isLatest = idx === arr.length - 1;\n const isAI = msg.role === 'assistant';\n const isFading = idx < arr.length - 1;\n\n const displayText =\n msg.text.length > maxTextLen\n ? msg.text.slice(0, maxTextLen).trimEnd() + '...'\n : msg.text;\n\n return (\n <motion.p\n key={msg.timestamp}\n initial={{ opacity: 0, y: 12 }}\n animate={{ opacity: isFading ? 0.5 : 1, y: 0 }}\n exit={{ opacity: 0, y: -8 }}\n transition={{ duration: 0.3, ease: 'easeOut' }}\n className={cn('text-lg font-[DM_Sans] leading-relaxed', isAI ? '' : 'italic')}\n style={{\n color: isAI ? '#1a1a1a' : 'rgba(0,0,0,0.7)',\n }}\n >\n {isAI && isLatest && isTyping ? (\n <TypewriterFormattedText text={displayText} />\n ) : (\n displayText\n )}\n </motion.p>\n );\n })}\n </AnimatePresence>\n\n {visible.length === 0 && !isTyping && (\n <motion.p\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ duration: 0.5, delay: 0.3 }}\n className=\"text-lg italic\"\n style={{ color: 'rgba(0,0,0,0.5)' }}\n >\n Ask me anything\n </motion.p>\n )}\n\n {isTyping && visible.length === 0 && (\n <motion.p\n initial={{ opacity: 0 }}\n animate={{ opacity: 0.5 }}\n className=\"text-black/50 text-lg\"\n >\n ...\n </motion.p>\n )}\n </div>\n </div>\n );\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import { useEffect } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { ArrowUpRight } from 'lucide-react';\nimport { cn } from '../utils';\nimport type { VoiceToolResult } from '@unctad-ai/voice-agent-core';\n\ninterface VoiceToolCardProps {\n result: VoiceToolResult | null;\n onAction?: (result: VoiceToolResult) => void;\n onDismiss?: () => void;\n /** When 'capsule', uses inline panel capsule style */\n variant?: 'overlay' | 'capsule';\n}\n\nconst AUTO_DISMISS_MS = 8000;\n\nexport default function VoiceToolCard({\n result,\n onAction,\n onDismiss,\n variant = 'overlay',\n}: VoiceToolCardProps) {\n useEffect(() => {\n if (!result) return;\n const timer = setTimeout(() => onDismiss?.(), AUTO_DISMISS_MS);\n return () => clearTimeout(timer);\n }, [result, onDismiss]);\n\n const isCapsule = variant === 'capsule';\n\n return (\n <AnimatePresence>\n {result && (\n <motion.div\n initial={{ opacity: 0, y: isCapsule ? 8 : 20 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: isCapsule ? 4 : 10 }}\n transition={{ duration: 0.3, ease: 'easeOut' }}\n className={cn(\n 'cursor-pointer transition-colors duration-200',\n isCapsule\n ? 'w-full rounded-xl px-4 py-2.5 flex items-center gap-3'\n : 'bg-white/10 backdrop-blur-md rounded-xl border border-white/20 px-5 py-4 max-w-sm w-full hover:bg-white/15'\n )}\n style={\n isCapsule\n ? {\n backgroundColor: 'rgba(0,0,0,0.04)',\n border: '1px solid rgba(0,0,0,0.08)',\n }\n : undefined\n }\n onClick={() => onAction?.(result)}\n onMouseEnter={\n isCapsule\n ? (e) => {\n (e.currentTarget as HTMLElement).style.backgroundColor = 'rgba(0,0,0,0.06)';\n }\n : undefined\n }\n onMouseLeave={\n isCapsule\n ? (e) => {\n (e.currentTarget as HTMLElement).style.backgroundColor = 'rgba(0,0,0,0.04)';\n }\n : undefined\n }\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onAction?.(result);\n }\n }}\n >\n {isCapsule ? (\n <>\n <ArrowUpRight\n className=\"shrink-0\"\n style={{ width: 14, height: 14, color: 'rgba(0,0,0,0.5)' }}\n />\n <span\n className=\"font-[DM_Sans] truncate\"\n style={{ fontSize: '13px', fontWeight: 500, color: 'rgba(0,0,0,0.7)' }}\n >\n {result.displayText}\n </span>\n </>\n ) : (\n <>\n <p className=\"text-white/50 text-xs uppercase tracking-wider mb-1\">{result.name}</p>\n <p className=\"text-white text-sm leading-relaxed\">{result.displayText}</p>\n </>\n )}\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n","import { Component } from 'react';\nimport type { ReactNode, ErrorInfo } from 'react';\nimport { cn } from '../utils';\nimport { AlertTriangle, RefreshCw } from 'lucide-react';\n\ninterface Props {\n children: ReactNode;\n onReset?: () => void;\n}\n\ninterface State {\n hasError: boolean;\n error: Error | null;\n}\n\nexport default class VoiceErrorBoundary extends Component<Props, State> {\n state: State = { hasError: false, error: null };\n\n static getDerivedStateFromError(error: Error): State {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo) {\n console.error('Voice component error:', error, info.componentStack);\n }\n\n handleReset = () => {\n this.setState({ hasError: false, error: null });\n this.props.onReset?.();\n };\n\n render() {\n if (this.state.hasError) {\n return (\n <div className=\"flex flex-col items-center justify-center gap-4 p-8 text-center\">\n <AlertTriangle className=\"h-10 w-10 text-red-400\" />\n <p className=\"text-white text-lg\">Something went wrong with the voice assistant.</p>\n <p className=\"text-white/50 text-sm max-w-sm\">\n {this.state.error?.message || 'An unexpected error occurred.'}\n </p>\n <button\n onClick={this.handleReset}\n className={cn(\n 'flex items-center gap-2 px-4 py-2',\n 'bg-white/10 backdrop-blur-md rounded-full',\n 'text-white text-sm hover:bg-white/20 transition-colors cursor-pointer'\n )}\n >\n <RefreshCw className=\"h-4 w-4\" />\n Try again\n </button>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n","import { motion, AnimatePresence } from 'motion/react';\nimport { AlertTriangle, Hourglass, Mic, MicOff, VolumeX, Wifi, WifiOff } from 'lucide-react';\nimport { cn } from '../utils';\n\nexport type VoiceErrorType =\n | 'mic_denied'\n | 'mic_unavailable'\n | 'vad_load_failed'\n | 'stt_failed'\n | 'tts_failed'\n | 'network_error'\n | 'llm_failed'\n | 'speech_too_short'\n | 'not_addressed'\n | 'processing'\n | null;\n\ninterface VoiceErrorDisplayProps {\n error: VoiceErrorType;\n onDismiss: () => void;\n}\n\ntype Severity = 'error' | 'warning' | 'info';\n\nconst SEVERITY_STYLES: Record<\n Severity,\n { bg: string; border: string; icon: string; text: string; dismiss: string }\n> = {\n error: {\n bg: 'rgba(220, 38, 38, 0.08)',\n border: 'rgba(220, 38, 38, 0.15)',\n icon: 'text-red-500',\n text: 'text-red-700',\n dismiss: 'text-red-400 hover:text-red-600',\n },\n warning: {\n bg: 'rgba(217, 119, 6, 0.08)',\n border: 'rgba(217, 119, 6, 0.15)',\n icon: 'text-amber-500',\n text: 'text-amber-700',\n dismiss: 'text-amber-400 hover:text-amber-600',\n },\n info: {\n bg: 'rgba(0, 0, 0, 0.04)',\n border: 'rgba(0, 0, 0, 0.08)',\n icon: 'text-neutral-500',\n text: 'text-neutral-600',\n dismiss: 'text-neutral-400 hover:text-neutral-600',\n },\n};\n\nconst ERROR_CONFIG: Record<\n NonNullable<VoiceErrorType>,\n { icon: typeof AlertTriangle; title: string; severity: Severity }\n> = {\n mic_denied: {\n icon: MicOff,\n title: 'Microphone access denied',\n severity: 'error',\n },\n mic_unavailable: {\n icon: MicOff,\n title: 'No microphone found',\n severity: 'error',\n },\n vad_load_failed: {\n icon: AlertTriangle,\n title: 'Voice detection unavailable',\n severity: 'warning',\n },\n stt_failed: {\n icon: Mic,\n title: \"Didn't catch that\",\n severity: 'info',\n },\n tts_failed: {\n icon: AlertTriangle,\n title: 'Voice response unavailable',\n severity: 'warning',\n },\n network_error: {\n icon: WifiOff,\n title: 'Connection lost',\n severity: 'error',\n },\n llm_failed: {\n icon: Wifi,\n title: 'AI service unavailable',\n severity: 'error',\n },\n speech_too_short: {\n icon: Mic,\n title: \"Didn't catch that\",\n severity: 'info',\n },\n not_addressed: {\n icon: VolumeX,\n title: 'Not addressed to me',\n severity: 'info',\n },\n processing: {\n icon: Hourglass,\n title: 'Still processing...',\n severity: 'info',\n },\n};\n\nexport default function VoiceErrorDisplay({ error, onDismiss }: VoiceErrorDisplayProps) {\n return (\n <AnimatePresence>\n {error && (\n <motion.div\n initial={{ opacity: 0, y: 16, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: -8, scale: 0.95 }}\n transition={{ duration: 0.25 }}\n className={cn('max-w-xs mx-auto', 'rounded-xl', 'px-4 py-2')}\n style={{\n backgroundColor: SEVERITY_STYLES[ERROR_CONFIG[error].severity].bg,\n border: `1px solid ${SEVERITY_STYLES[ERROR_CONFIG[error].severity].border}`,\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n pointerEvents: 'auto',\n }}\n >\n {(() => {\n const config = ERROR_CONFIG[error];\n const styles = SEVERITY_STYLES[config.severity];\n const Icon = config.icon;\n return (\n <div className=\"flex items-center gap-2\">\n <Icon className={cn('h-4 w-4 shrink-0', styles.icon)} />\n <span className={cn('text-xs flex-1', styles.text)}>{config.title}</span>\n <button\n onClick={onDismiss}\n className={cn('text-xs transition-colors cursor-pointer', styles.dismiss)}\n >\n ×\n </button>\n </div>\n );\n })()}\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport type { PipelineTimings } from '@unctad-ai/voice-agent-core';\nimport {\n DEFAULT_SHOW_PIPELINE_METRICS,\n DEFAULT_PIPELINE_METRICS_AUTO_HIDE_MS,\n} from '@unctad-ai/voice-agent-core';\n\nfunction fmt(ms: number): string {\n return ms >= 1000 ? `${(ms / 1000).toFixed(1)}s` : `${Math.round(ms)}ms`;\n}\n\nexport default function PipelineMetricsBar({\n timings,\n show = DEFAULT_SHOW_PIPELINE_METRICS,\n autoHideMs = DEFAULT_PIPELINE_METRICS_AUTO_HIDE_MS,\n}: {\n timings: PipelineTimings | null;\n show?: boolean;\n autoHideMs?: number;\n}) {\n const [visible, setVisible] = useState(false);\n const [display, setDisplay] = useState<PipelineTimings | null>(null);\n\n // React-recommended pattern: adjust state during render based on prop change.\n // https://react.dev/reference/react/useState#storing-information-from-previous-renders\n const [prevTimings, setPrevTimings] = useState(timings);\n if (timings !== prevTimings) {\n setPrevTimings(timings);\n if (timings) {\n setDisplay(timings);\n setVisible(true);\n }\n }\n\n // Auto-hide timer: only the setTimeout callback calls setState (async, not synchronous)\n useEffect(() => {\n if (!visible || autoHideMs <= 0) return;\n const timer = setTimeout(() => setVisible(false), autoHideMs);\n return () => clearTimeout(timer);\n }, [visible, display, autoHideMs]);\n\n if (!display || !show) return null;\n\n const pills: { label: string; value: string }[] = [];\n\n pills.push({ label: display.pipeline, value: '' });\n\n if (display.sttMs != null) pills.push({ label: 'STT', value: fmt(display.sttMs) });\n if (display.llmTotalMs != null) pills.push({ label: 'LLM', value: fmt(display.llmTotalMs) });\n if (display.ttsFirstChunkMs != null && display.ttsTotalMs != null) {\n pills.push({\n label: 'TTS',\n value: `${fmt(display.ttsFirstChunkMs)} / ${fmt(display.ttsTotalMs)}`,\n });\n } else if (display.ttsMs != null) {\n pills.push({ label: 'TTS', value: fmt(display.ttsMs) });\n }\n pills.push({ label: 'Total', value: fmt(display.totalMs) });\n\n return (\n <AnimatePresence>\n {visible && (\n <motion.div\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 28 }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.2, ease: [0.25, 0.1, 0.25, 1] }}\n className=\"flex items-center gap-2 overflow-hidden select-none\"\n style={{\n height: 28,\n padding: '0 16px',\n fontSize: 11,\n fontFamily: 'DM Sans, sans-serif',\n fontVariantNumeric: 'tabular-nums',\n borderTop: '1px solid rgba(0,0,0,0.06)',\n background: 'rgba(0,0,0,0.03)',\n }}\n >\n {pills.map((p, i) =>\n i === 0 ? (\n <span\n key=\"type\"\n style={{\n color: 'rgba(0,0,0,0.35)',\n fontWeight: 500,\n textTransform: 'uppercase',\n fontSize: 10,\n letterSpacing: '0.04em',\n }}\n >\n {p.label}\n </span>\n ) : (\n <span key={p.label} className=\"inline-flex items-center gap-1\">\n <span style={{ color: 'rgba(0,0,0,0.4)' }}>{p.label}</span>\n <span style={{ color: 'rgba(0,0,0,0.65)', fontWeight: 500 }}>{p.value}</span>\n </span>\n )\n )}\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n","import { useEffect, useRef } from 'react';\nimport type { OrbState } from '@unctad-ai/voice-agent-core';\n\ninterface VoiceA11yAnnouncerProps {\n isOpen: boolean;\n orbState: OrbState;\n}\n\nconst STATE_ANNOUNCEMENTS: Record<OrbState, string> = {\n idle: 'Voice assistant ready',\n listening: 'Listening for your question',\n processing: 'Processing your request',\n speaking: 'Assistant is responding',\n error: 'An error occurred',\n};\n\nexport default function VoiceA11yAnnouncer({ isOpen, orbState }: VoiceA11yAnnouncerProps) {\n const prevOpen = useRef(isOpen);\n const prevState = useRef(orbState);\n const announceRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!announceRef.current) return;\n\n if (isOpen && !prevOpen.current) {\n announceRef.current.textContent =\n 'Voice assistant opened. Press Escape to close. Use Ctrl+Shift+V to toggle.';\n } else if (!isOpen && prevOpen.current) {\n announceRef.current.textContent = 'Voice assistant closed';\n } else if (isOpen && orbState !== prevState.current) {\n announceRef.current.textContent = STATE_ANNOUNCEMENTS[orbState];\n }\n\n prevOpen.current = isOpen;\n prevState.current = orbState;\n }, [isOpen, orbState]);\n\n return (\n <div\n ref={announceRef}\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"sr-only\"\n role=\"status\"\n />\n );\n}\n","import { motion, AnimatePresence, useReducedMotion } from 'motion/react';\nimport { Mic } from 'lucide-react';\nimport { useSiteConfig } from '@unctad-ai/voice-agent-core';\n\ninterface VoiceCopilotFABProps {\n onClick: () => void;\n isActive?: boolean;\n isOverlayOpen?: boolean;\n onMouseEnter?: () => void;\n}\n\nexport default function VoiceCopilotFAB({\n onClick,\n isActive,\n isOverlayOpen,\n onMouseEnter,\n}: VoiceCopilotFABProps) {\n const prefersReduced = useReducedMotion();\n const { colors } = useSiteConfig();\n\n return (\n <AnimatePresence>\n {!isOverlayOpen && (\n <motion.div\n key=\"voice-fab-wrapper\"\n initial={{ scale: 0, opacity: 0 }}\n animate={{ scale: 1, opacity: 1 }}\n exit={{ scale: 0, opacity: 0 }}\n transition={{ duration: 0.25, ease: 'easeOut' }}\n className=\"fixed bottom-6 right-6 z-50\"\n >\n <motion.button\n onClick={onClick}\n onMouseEnter={onMouseEnter}\n animate={prefersReduced ? {} : { scale: [1, 1.15, 1] }}\n transition={\n prefersReduced\n ? {}\n : { scale: { duration: 1.5, repeat: Infinity, ease: 'easeInOut' } }\n }\n whileHover={{ scale: 1.1 }}\n whileTap={{ scale: 0.95 }}\n className=\"relative rounded-full p-3 shadow-lg text-white transition-all cursor-pointer\"\n style={{ backgroundColor: colors.primary }}\n aria-label=\"Open voice assistant\"\n >\n {isActive ? (\n <span className=\"h-3 w-3 rounded-full bg-white animate-pulse\" />\n ) : (\n <Mic className=\"w-6 h-6\" />\n )}\n </motion.button>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n","import { useState, useRef, useEffect } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { Keyboard, Send, X } from 'lucide-react';\nimport { cn } from '../utils';\nimport { useSiteConfig } from '@unctad-ai/voice-agent-core';\nimport type { VoiceState } from '@unctad-ai/voice-agent-core';\n\ninterface VoiceControlsProps {\n state: VoiceState;\n onTextSubmit: (text: string) => void;\n isListening: boolean;\n}\n\nconst STATE_LABELS: Record<VoiceState, string> = {\n IDLE: 'How can I help you?',\n LISTENING: \"I'm listening...\",\n USER_SPEAKING: 'Go ahead...',\n PROCESSING: 'Let me look into that...',\n AI_SPEAKING: \"Here's what I found...\",\n};\n\n/** Shared glass-pill style for control buttons */\nconst GLASS_PILL_BASE = cn(\n 'backdrop-blur-xl rounded-full',\n 'flex items-center justify-center',\n 'border border-white/15',\n 'transition-all duration-200 cursor-pointer',\n 'hover:border-white/30 hover:shadow-[0_0_16px_rgba(255,255,255,0.08)]'\n);\n\nexport default function VoiceControls({ state, onTextSubmit, isListening }: VoiceControlsProps) {\n const { colors } = useSiteConfig();\n const [showTextInput, setShowTextInput] = useState(false);\n const [text, setText] = useState('');\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (showTextInput) inputRef.current?.focus();\n }, [showTextInput]);\n\n const handleSubmit = () => {\n const trimmed = text.trim();\n if (!trimmed) return;\n onTextSubmit(trimmed);\n setText('');\n setShowTextInput(false);\n };\n\n return (\n <div className=\"w-full max-w-2xl mx-auto mt-auto pb-8 px-4\">\n <AnimatePresence mode=\"wait\">\n {showTextInput ? (\n <motion.div\n key=\"text-input\"\n initial={{ opacity: 0, y: 16, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 16, scale: 0.95 }}\n transition={{ duration: 0.25, ease: [0.22, 1, 0.36, 1] }}\n className={cn(\n 'rounded-full',\n 'flex items-center gap-4',\n 'border border-white/20',\n 'px-8 py-3'\n )}\n style={{\n backgroundColor: 'rgba(0, 0, 0, 0.4)',\n backdropFilter: 'blur(16px) saturate(1.2)',\n WebkitBackdropFilter: 'blur(16px) saturate(1.2)',\n }}\n >\n <input\n ref={inputRef}\n type=\"text\"\n value={text}\n onChange={(e) => setText(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && handleSubmit()}\n placeholder=\"Ask a question...\"\n className=\"flex-1 text-sm placeholder:text-white/40 min-w-0\"\n style={{\n color: 'white',\n background: 'none',\n border: 'none',\n outline: 'none',\n boxShadow: 'none',\n WebkitAppearance: 'none',\n padding: 0,\n }}\n />\n <motion.button\n onClick={handleSubmit}\n whileTap={{ scale: 0.9 }}\n className=\"rounded-full p-2 text-white transition-colors cursor-pointer\"\n style={{ backgroundColor: colors.primary }}\n aria-label=\"Send message\"\n >\n <Send className=\"h-4 w-4\" />\n </motion.button>\n <button\n onClick={() => {\n setShowTextInput(false);\n setText('');\n }}\n className=\"rounded-full p-2 text-white/60 hover:text-white hover:bg-white/10 transition-all cursor-pointer\"\n aria-label=\"Cancel text input\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n </motion.div>\n ) : (\n <motion.div\n key=\"controls\"\n initial={{ opacity: 0, y: 16, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 16, scale: 0.95 }}\n transition={{ duration: 0.25, ease: [0.22, 1, 0.36, 1] }}\n className=\"flex items-center justify-center gap-3\"\n >\n {/* Mic status + keyboard — unified control bar */}\n <div\n className={cn(\n 'rounded-full',\n 'text-white text-sm font-medium',\n 'flex items-center gap-6',\n 'border border-white/20',\n 'pl-8 pr-4 py-1.5'\n )}\n style={{\n backgroundColor: 'rgba(0, 0, 0, 0.4)',\n backdropFilter: 'blur(16px) saturate(1.2)',\n WebkitBackdropFilter: 'blur(16px) saturate(1.2)',\n color: 'white',\n }}\n >\n {/* Pulse dot */}\n <span className=\"relative flex items-center justify-center w-3 h-3 ml-0.5\">\n {isListening && (\n <span\n className=\"absolute inset-0 rounded-full animate-ping\"\n style={{ backgroundColor: `${colors.primary}80` }}\n />\n )}\n <span\n className={cn(\n 'relative h-2.5 w-2.5 rounded-full transition-colors duration-300',\n )}\n style={isListening ? {\n backgroundColor: colors.primary,\n boxShadow: `0 0 8px ${colors.primary}99`,\n } : {\n backgroundColor: 'rgba(255,255,255,0.3)',\n }}\n />\n </span>\n {/* Animated label */}\n <AnimatePresence mode=\"wait\">\n <motion.span\n key={state}\n initial={{ opacity: 0, y: 4 }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y: -4 }}\n transition={{ duration: 0.2 }}\n className=\"pr-1\"\n >\n {STATE_LABELS[state]}\n </motion.span>\n </AnimatePresence>\n\n {/* Type button — integrated into the bar */}\n <button\n onClick={() => setShowTextInput(true)}\n className={cn(\n 'rounded-full p-2',\n 'text-white/60 hover:text-white',\n 'hover:bg-white/10',\n 'transition-all duration-200 cursor-pointer'\n )}\n aria-label=\"Type a message\"\n >\n <Keyboard className=\"h-4 w-4\" />\n </button>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n );\n}\n","import { useRef, useEffect, useState } from 'react';\nimport {\n DOT_RING_COUNT,\n DOT_RING_GAP,\n DOT_RING_BASE_RADIUS,\n DOT_RING_PEAK_RADIUS,\n DOT_RING_SMOOTHING,\n} from '@unctad-ai/voice-agent-core';\nimport type { OrbState } from '@unctad-ai/voice-agent-core';\n\ninterface VoiceDotRingProps {\n analyserNode: AnalyserNode | null;\n state: OrbState;\n orbRadius: number;\n}\n\nconst STATE_COLORS: Record<OrbState, string> = {\n idle: 'rgba(59,130,246,0.6)',\n listening: 'rgba(219,33,41,0.8)',\n processing: 'rgba(245,158,11,0.7)',\n speaking: 'rgba(34,197,94,0.7)',\n error: 'rgba(220,38,38,0.6)',\n};\n\nexport default function VoiceDotRing({ analyserNode, state, orbRadius }: VoiceDotRingProps) {\n const dotsRef = useRef<(SVGCircleElement | null)[]>([]);\n const barsRef = useRef<Float32Array>(new Float32Array(DOT_RING_COUNT));\n const rafRef = useRef<number>(0);\n const colorRef = useRef(STATE_COLORS.idle);\n\n const [reducedMotion] = useState(\n () => window.matchMedia('(prefers-reduced-motion: reduce)').matches\n );\n\n const ringRadius = orbRadius + DOT_RING_GAP;\n const svgSize = (ringRadius + DOT_RING_PEAK_RADIUS + 2) * 2;\n const cx = svgSize / 2;\n const cy = svgSize / 2;\n\n useEffect(() => {\n const freqData = analyserNode ? new Uint8Array(analyserNode.frequencyBinCount) : null;\n\n const tick = () => {\n // Lerp color toward target\n colorRef.current = STATE_COLORS[state];\n\n if (analyserNode && freqData) {\n analyserNode.getByteFrequencyData(freqData);\n }\n\n for (let i = 0; i < DOT_RING_COUNT; i++) {\n const dot = dotsRef.current[i];\n if (!dot) continue;\n\n let targetVal = 0;\n if (freqData && freqData.length > 0) {\n const binIndex = Math.floor((i / DOT_RING_COUNT) * freqData.length);\n targetVal = freqData[binIndex] / 255;\n }\n\n barsRef.current[i] += (targetVal - barsRef.current[i]) * DOT_RING_SMOOTHING;\n\n const val = reducedMotion ? 0 : barsRef.current[i];\n const r = DOT_RING_BASE_RADIUS + val * (DOT_RING_PEAK_RADIUS - DOT_RING_BASE_RADIUS);\n const opacity = 0.3 + val * 0.5;\n\n dot.setAttribute('r', String(r));\n dot.setAttribute('opacity', String(opacity));\n dot.setAttribute('fill', colorRef.current);\n }\n\n rafRef.current = requestAnimationFrame(tick);\n };\n\n rafRef.current = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(rafRef.current);\n }, [analyserNode, state, reducedMotion, ringRadius]);\n\n return (\n <svg\n width={svgSize}\n height={svgSize}\n viewBox={`0 0 ${svgSize} ${svgSize}`}\n className=\"absolute pointer-events-none\"\n style={{\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n }}\n aria-hidden=\"true\"\n >\n {Array.from({ length: DOT_RING_COUNT }, (_, i) => {\n const angle = (i / DOT_RING_COUNT) * Math.PI * 2 - Math.PI / 2;\n const x = cx + Math.cos(angle) * ringRadius;\n const y = cy + Math.sin(angle) * ringRadius;\n return (\n <circle\n key={i}\n ref={(el) => {\n dotsRef.current[i] = el;\n }}\n cx={x}\n cy={y}\n r={DOT_RING_BASE_RADIUS}\n fill={STATE_COLORS.idle}\n opacity={0.3}\n />\n );\n })}\n </svg>\n );\n}\n","import { useState, useEffect } from 'react';\nimport { motion, AnimatePresence } from 'motion/react';\nimport { cn } from '../utils';\nimport { useSiteConfig } from '@unctad-ai/voice-agent-core';\n\nconst STORAGE_KEY = 'voice-onboarding-dismissed';\n\ninterface VoiceOnboardingProps {\n onTryNow: () => void;\n /** Custom description text shown in the onboarding tooltip */\n description?: string;\n}\n\nexport default function VoiceOnboarding({ onTryNow, description }: VoiceOnboardingProps) {\n const { colors } = useSiteConfig();\n const [show, setShow] = useState(false);\n\n useEffect(() => {\n const dismissed = localStorage.getItem(STORAGE_KEY);\n if (!dismissed) {\n // Small delay so FAB renders first\n const timer = setTimeout(() => setShow(true), 1500);\n return () => clearTimeout(timer);\n }\n }, []);\n\n const dismiss = () => {\n setShow(false);\n localStorage.setItem(STORAGE_KEY, 'true');\n };\n\n const handleTryNow = () => {\n dismiss();\n onTryNow();\n };\n\n return (\n <AnimatePresence>\n {show && (\n <motion.div\n initial={{ opacity: 0, y: 8, scale: 0.95 }}\n animate={{ opacity: 1, y: 0, scale: 1 }}\n exit={{ opacity: 0, y: 8, scale: 0.95 }}\n transition={{ duration: 0.25, ease: 'easeOut' }}\n className={cn(\n 'fixed bottom-24 right-6 z-50',\n 'md:bottom-[104px] md:right-6',\n 'bg-white rounded-xl shadow-xl',\n 'border border-neutral-200',\n 'p-4 max-w-[280px]'\n )}\n role=\"tooltip\"\n >\n {/* Arrow pointing down to FAB */}\n <div className=\"absolute -bottom-2 right-6 w-4 h-4 bg-white border-b border-r border-neutral-200 rotate-45\" />\n\n <p className=\"text-sm text-neutral-700 leading-relaxed mb-3\">\n {description ?? 'Meet your AI assistant. Ask about services, permits, or opportunities.'}\n </p>\n <div className=\"flex gap-2\">\n <button\n onClick={handleTryNow}\n className={cn(\n 'text-white text-sm font-medium',\n 'rounded-lg px-3 py-1.5',\n 'transition-colors cursor-pointer'\n )}\n style={{ backgroundColor: colors.primary }}\n >\n Try it now\n </button>\n <button\n onClick={dismiss}\n className={cn(\n 'text-neutral-500 text-sm',\n 'rounded-lg px-3 py-1.5',\n 'hover:text-neutral-700 hover:bg-neutral-100',\n 'transition-colors cursor-pointer'\n )}\n >\n Maybe later\n </button>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n );\n}\n","import { useState, useEffect, useCallback, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { motion } from 'motion/react';\nimport { X } from 'lucide-react';\nimport { useVoiceAgent, voiceStateToOrbState } from '@unctad-ai/voice-agent-core';\nimport { IDLE_TIMEOUT_MS, WIND_DOWN_MS, EXIT_ANIMATION_MS } from '@unctad-ai/voice-agent-core';\nimport type { OrbState, VoiceToolResult } from '@unctad-ai/voice-agent-core';\nimport { useVoiceSettings } from '../contexts/VoiceSettingsContext';\nimport VoiceOrb from './VoiceOrb';\nimport VoiceWaveformCanvas from './VoiceWaveformCanvas';\nimport VoiceTranscript from './VoiceTranscript';\nimport VoiceToolCard from './VoiceToolCard';\nimport VoiceControls from './VoiceControls';\nimport VoiceErrorBoundary from './VoiceErrorBoundary';\nimport VoiceErrorDisplay from './VoiceErrorDisplay';\n\n/** Inline z-index guarantees stacking above all page elements */\nconst OVERLAY_Z = 2147483647;\n\n/** Liquid spring configs for entrance choreography */\nconst SPRING_BOUNCY = { type: 'spring' as const, damping: 20, stiffness: 180 };\nconst SPRING_SMOOTH = { type: 'spring' as const, damping: 28, stiffness: 160 };\n\n/** Exit easing — smooth start, accelerating pull */\nconst EXIT_EASE: [number, number, number, number] = [0.4, 0, 0.7, 0.2];\n\ninterface VoiceOverlayProps {\n isOpen: boolean;\n onClose: () => void;\n onStateChange?: (orbState: OrbState) => void;\n}\n\nfunction WiredOverlayContent({\n isMobile,\n onClose,\n onStateChange,\n isClosing,\n}: {\n isMobile: boolean;\n onClose: () => void;\n onStateChange?: (orbState: OrbState) => void;\n isClosing: boolean;\n}) {\n const orbSize = isMobile ? 120 : 200;\n const { settings, volumeRef, speedRef } = useVoiceSettings();\n\n const {\n state,\n start,\n stop,\n messages,\n isLLMLoading,\n getAmplitude,\n analyser,\n sendTextMessage,\n voiceError,\n dismissError,\n } = useVoiceAgent({ settings, volumeRef, speedRef });\n\n const [toolResult, setToolResult] = useState<VoiceToolResult | null>(null);\n\n const orbState = voiceStateToOrbState(state);\n\n // Notify parent of state changes for a11y announcer\n const onStateChangeRef = useRef(onStateChange);\n useEffect(() => {\n onStateChangeRef.current = onStateChange;\n });\n useEffect(() => {\n onStateChangeRef.current?.(orbState);\n }, [orbState]);\n\n // Start VAD when overlay mounts, force-stop on unmount (bypass debounce)\n const startRef = useRef(start);\n const stopRef = useRef(stop);\n useEffect(() => {\n startRef.current = start;\n }, [start]);\n useEffect(() => {\n stopRef.current = stop;\n }, [stop]);\n useEffect(() => {\n startRef.current();\n return () => stopRef.current(true);\n }, []);\n\n // Stop VAD immediately when exit starts\n useEffect(() => {\n if (isClosing) stop();\n }, [isClosing, stop]);\n\n // --- Idle timeout: auto-close after 30s of no user activity ---\n const [isWindingDown, setIsWindingDown] = useState(false);\n const idleTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const windDownTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const onCloseRef = useRef(onClose);\n useEffect(() => {\n onCloseRef.current = onClose;\n });\n\n useEffect(() => {\n const clear = () => {\n if (idleTimerRef.current) clearTimeout(idleTimerRef.current);\n if (windDownTimerRef.current) clearTimeout(windDownTimerRef.current);\n idleTimerRef.current = null;\n windDownTimerRef.current = null;\n };\n\n if (isClosing || state === 'PROCESSING' || state === 'AI_SPEAKING') {\n clear();\n setIsWindingDown(false);\n return;\n }\n clear();\n setIsWindingDown(false);\n windDownTimerRef.current = setTimeout(() => {\n setIsWindingDown(true);\n }, IDLE_TIMEOUT_MS - WIND_DOWN_MS);\n idleTimerRef.current = setTimeout(() => {\n onCloseRef.current();\n }, IDLE_TIMEOUT_MS);\n return clear;\n }, [state, isClosing]);\n\n const handleTextSubmit = useCallback(\n (text: string) => {\n sendTextMessage(text);\n },\n [sendTextMessage]\n );\n\n const isListening = state === 'LISTENING' || state === 'USER_SPEAKING';\n\n return (\n <div\n className=\"flex flex-col items-center justify-center gap-6 h-full px-6\"\n style={{ pointerEvents: 'none' }}\n >\n {/* Orb + Waveform */}\n <motion.div\n initial={{ opacity: 0, scale: 0.15 }}\n animate={\n isClosing\n ? { opacity: 0, scale: 0 }\n : { opacity: isWindingDown ? 0.3 : 1, scale: isWindingDown ? 0.92 : 1 }\n }\n transition={\n isClosing\n ? { duration: 0.3, ease: EXIT_EASE, delay: 0.15 }\n : isWindingDown\n ? { duration: WIND_DOWN_MS / 1000, ease: 'easeOut' }\n : { ...SPRING_BOUNCY, delay: 0.1 }\n }\n className=\"relative flex items-center justify-center\"\n style={{ width: orbSize + 100, height: orbSize + 100, pointerEvents: 'auto' }}\n >\n <div\n className=\"absolute rounded-full\"\n style={{\n width: orbSize + 100,\n height: orbSize + 100,\n backdropFilter: 'blur(2px)',\n WebkitBackdropFilter: 'blur(2px)',\n filter: 'url(#liquid-glass-orb)',\n isolation: 'isolate',\n }}\n />\n <div\n className=\"absolute rounded-full pointer-events-none\"\n style={{\n width: orbSize + 100,\n height: orbSize + 100,\n backgroundColor: 'rgba(255, 255, 255, 0.02)',\n border: '1px solid rgba(255, 255, 255, 0.15)',\n boxShadow:\n '0 6px 24px rgba(0, 0, 0, 0.08), inset 0 0 20px -5px rgba(255, 255, 255, 0.3)',\n }}\n />\n <div\n className=\"absolute rounded-full pointer-events-none\"\n style={{\n width: orbSize + 100,\n height: orbSize + 100,\n background:\n 'radial-gradient(ellipse 70% 40% at 50% 12%, rgba(255,255,255,0.2) 0%, transparent 55%)',\n }}\n />\n <VoiceWaveformCanvas analyserNode={analyser} state={orbState} size={orbSize + 100} />\n <div className=\"absolute rounded-full\" style={{ width: orbSize, height: orbSize }}>\n <VoiceOrb state={orbState} getAmplitude={getAmplitude} size={orbSize} />\n </div>\n </motion.div>\n\n {/* Transcript */}\n <motion.div\n initial={{ opacity: 0, y: 24 }}\n animate={isClosing ? { opacity: 0, y: 16 } : { opacity: 1, y: 0 }}\n transition={\n isClosing\n ? { duration: 0.25, ease: EXIT_EASE, delay: 0.08 }\n : { ...SPRING_SMOOTH, delay: 0.3 }\n }\n >\n <VoiceTranscript messages={messages} isTyping={state === 'AI_SPEAKING' || isLLMLoading} />\n </motion.div>\n\n {/* Error display */}\n <div style={{ pointerEvents: 'auto' }}>\n <VoiceErrorDisplay error={voiceError} onDismiss={dismissError} />\n </div>\n\n {/* Tool result card */}\n <div style={{ pointerEvents: 'auto' }}>\n <VoiceToolCard result={toolResult} onDismiss={() => setToolResult(null)} />\n </div>\n\n {/* Controls */}\n <motion.div\n initial={{ opacity: 0, y: 48 }}\n animate={isClosing ? { opacity: 0, y: 30 } : { opacity: 1, y: 0 }}\n transition={\n isClosing\n ? { duration: 0.25, ease: EXIT_EASE, delay: 0 }\n : { ...SPRING_SMOOTH, delay: 0.4 }\n }\n className=\"w-full\"\n style={{ pointerEvents: 'auto' }}\n >\n <VoiceControls state={state} onTextSubmit={handleTextSubmit} isListening={isListening} />\n </motion.div>\n </div>\n );\n}\n\nfunction OverlayPortal({\n isOpen,\n isClosing,\n onClose,\n onStateChange,\n isMobile,\n}: VoiceOverlayProps & { isMobile: boolean; isClosing: boolean }) {\n if (!isOpen) return null;\n\n return createPortal(\n <>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"0\"\n height=\"0\"\n style={{ position: 'absolute', overflow: 'hidden' }}\n aria-hidden=\"true\"\n >\n <defs>\n <filter id=\"liquid-glass-orb\" x=\"0%\" y=\"0%\" width=\"100%\" height=\"100%\">\n <feTurbulence\n type=\"fractalNoise\"\n baseFrequency=\"0.008 0.008\"\n numOctaves=\"2\"\n seed=\"92\"\n result=\"noise\"\n />\n <feGaussianBlur in=\"noise\" stdDeviation=\"2\" result=\"blurred_noise\" />\n <feDisplacementMap\n in=\"SourceGraphic\"\n in2=\"blurred_noise\"\n scale=\"50\"\n xChannelSelector=\"R\"\n yChannelSelector=\"G\"\n />\n </filter>\n </defs>\n </svg>\n\n <motion.div\n key=\"voice-overlay-bg\"\n initial={{ opacity: 0 }}\n animate={isClosing ? { opacity: 0 } : { opacity: 1 }}\n transition={{\n duration: isClosing ? 0.35 : 0.4,\n ease: 'easeOut',\n delay: isClosing ? 0.2 : 0,\n }}\n aria-hidden=\"true\"\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: OVERLAY_Z,\n pointerEvents: 'none',\n backgroundColor: 'rgba(0, 0, 0, 0.15)',\n }}\n />\n\n <motion.div\n key=\"voice-overlay-gradient\"\n initial={{ opacity: 0, y: 80 }}\n animate={isClosing ? { opacity: 0, y: 60 } : { opacity: 1, y: 0 }}\n transition={\n isClosing\n ? { duration: 0.3, ease: EXIT_EASE, delay: 0.2 }\n : { duration: 0.6, ease: [0.22, 1, 0.36, 1], delay: 0.05 }\n }\n aria-hidden=\"true\"\n style={{\n position: 'fixed',\n bottom: 0,\n left: 0,\n right: 0,\n height: '28rem',\n zIndex: OVERLAY_Z,\n pointerEvents: 'none',\n background:\n 'linear-gradient(to top, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.15) 40%, transparent 100%)',\n }}\n />\n\n <div\n role=\"dialog\"\n aria-label=\"Voice Assistant\"\n aria-modal=\"false\"\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: OVERLAY_Z,\n pointerEvents: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <motion.button\n initial={{ opacity: 0, scale: 0.7 }}\n animate={isClosing ? { opacity: 0, scale: 0.7 } : { opacity: 1, scale: 1 }}\n transition={\n isClosing\n ? { duration: 0.2, ease: EXIT_EASE, delay: 0.06 }\n : { ...SPRING_SMOOTH, delay: 0.35 }\n }\n onClick={onClose}\n className=\"absolute top-6 right-6 flex items-center justify-center rounded-full transition-all duration-200 cursor-pointer hover:scale-110\"\n style={{\n pointerEvents: 'auto',\n zIndex: OVERLAY_Z,\n width: 44,\n height: 44,\n backgroundColor: 'rgba(255, 255, 255, 0.12)',\n border: '1px solid rgba(255, 255, 255, 0.25)',\n backdropFilter: 'blur(12px)',\n WebkitBackdropFilter: 'blur(12px)',\n color: 'rgba(255, 255, 255, 0.85)',\n }}\n aria-label=\"Close voice assistant\"\n >\n <X className=\"h-5 w-5\" />\n </motion.button>\n\n <div className=\"w-full h-full\" style={{ pointerEvents: 'none' }}>\n <WiredOverlayContent\n isMobile={isMobile}\n onClose={onClose}\n onStateChange={onStateChange}\n isClosing={isClosing}\n />\n </div>\n </div>\n </>,\n document.body\n );\n}\n\nfunction useIsMobile(breakpoint = 768) {\n const [isMobile, setIsMobile] = useState(\n () => window.matchMedia(`(max-width: ${breakpoint - 1}px)`).matches\n );\n useEffect(() => {\n const mql = window.matchMedia(`(max-width: ${breakpoint - 1}px)`);\n const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n mql.addEventListener('change', handler);\n return () => mql.removeEventListener('change', handler);\n }, [breakpoint]);\n return isMobile;\n}\n\nexport default function VoiceOverlay({ isOpen, onClose, onStateChange }: VoiceOverlayProps) {\n const isMobile = useIsMobile();\n const [isClosing, setIsClosing] = useState(false);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handleClose = useCallback(() => {\n if (isClosing) return;\n setIsClosing(true);\n closeTimerRef.current = setTimeout(() => {\n setIsClosing(false);\n onClose();\n }, EXIT_ANIMATION_MS);\n }, [isClosing, onClose]);\n\n useEffect(() => {\n return () => {\n if (closeTimerRef.current != null) clearTimeout(closeTimerRef.current);\n };\n }, []);\n\n if (!isOpen) return null;\n\n return (\n <VoiceErrorBoundary onReset={onClose}>\n <OverlayPortal\n isOpen={isOpen}\n isClosing={isClosing}\n onClose={handleClose}\n onStateChange={onStateChange}\n isMobile={isMobile}\n />\n </VoiceErrorBoundary>\n );\n}\n","import { useRef, useEffect, useState } from 'react';\nimport {\n WAVEFORM_NUM_BARS,\n WAVEFORM_MIN_BAR_HEIGHT,\n WAVEFORM_MAX_BAR_HEIGHT,\n WAVEFORM_GAP,\n WAVEFORM_SMOOTHING,\n} from '@unctad-ai/voice-agent-core';\nimport type { OrbState } from '@unctad-ai/voice-agent-core';\n\ninterface VoiceWaveformCanvasProps {\n analyserNode: AnalyserNode | null;\n state: OrbState;\n size: number;\n}\n\nconst STATE_COLORS: Record<OrbState, [string, string]> = {\n idle: ['rgba(59,130,246,0.35)', 'rgba(96,165,250,0.12)'],\n listening: ['rgba(239,68,68,0.75)', 'rgba(251,191,36,0.3)'],\n processing: ['rgba(245,158,11,0.7)', 'rgba(251,191,36,0.3)'],\n speaking: ['rgba(34,197,94,0.7)', 'rgba(45,212,191,0.3)'],\n error: ['rgba(220,38,38,0.6)', 'rgba(153,27,27,0.25)'],\n};\n\nfunction lerpColor(a: string, b: string, t: number): string {\n // Parse rgba strings\n const parse = (s: string) => {\n const m = s.match(/[\\d.]+/g);\n return m ? m.map(Number) : [0, 0, 0, 0];\n };\n const ca = parse(a);\n const cb = parse(b);\n const r = ca.map((v, i) => v + (cb[i] - v) * t);\n return `rgba(${Math.round(r[0])},${Math.round(r[1])},${Math.round(r[2])},${r[3].toFixed(3)})`;\n}\n\nexport default function VoiceWaveformCanvas({\n analyserNode,\n state,\n size,\n}: VoiceWaveformCanvasProps) {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const rafRef = useRef<number>(0);\n const barsRef = useRef<Float32Array>(new Float32Array(WAVEFORM_NUM_BARS));\n const colorRef = useRef({ inner: STATE_COLORS.idle[0], outer: STATE_COLORS.idle[1] });\n\n const [reducedMotion] = useState(\n () => window.matchMedia('(prefers-reduced-motion: reduce)').matches\n );\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const dpr = window.devicePixelRatio || 1;\n canvas.width = size * dpr;\n canvas.height = size * dpr;\n ctx.scale(dpr, dpr);\n\n const freqData = analyserNode ? new Uint8Array(analyserNode.frequencyBinCount) : null;\n\n const tick = () => {\n ctx.clearRect(0, 0, size, size);\n\n // Lerp colors toward target state\n const target = STATE_COLORS[state];\n colorRef.current.inner = lerpColor(colorRef.current.inner, target[0], WAVEFORM_SMOOTHING);\n colorRef.current.outer = lerpColor(colorRef.current.outer, target[1], WAVEFORM_SMOOTHING);\n\n // Get frequency data\n if (analyserNode && freqData) {\n analyserNode.getByteFrequencyData(freqData);\n }\n\n const cx = size / 2;\n const cy = size / 2;\n const baseRadius = size * 0.35 + WAVEFORM_GAP;\n const baseBarWidth = Math.max(1.5, ((2 * Math.PI * baseRadius) / WAVEFORM_NUM_BARS) * 0.55);\n\n for (let i = 0; i < WAVEFORM_NUM_BARS; i++) {\n // Map frequency bin to target height\n let targetVal = 0;\n if (freqData && freqData.length > 0) {\n const binIndex = Math.floor((i / WAVEFORM_NUM_BARS) * freqData.length);\n targetVal = freqData[binIndex] / 255;\n }\n\n // Smooth interpolation\n barsRef.current[i] += (targetVal - barsRef.current[i]) * WAVEFORM_SMOOTHING;\n\n const effectiveMax = reducedMotion ? WAVEFORM_MIN_BAR_HEIGHT + 5 : WAVEFORM_MAX_BAR_HEIGHT;\n const barHeight =\n WAVEFORM_MIN_BAR_HEIGHT + barsRef.current[i] * (effectiveMax - WAVEFORM_MIN_BAR_HEIGHT);\n\n const angle = (i / WAVEFORM_NUM_BARS) * Math.PI * 2 - Math.PI / 2;\n const x1 = cx + Math.cos(angle) * baseRadius;\n const y1 = cy + Math.sin(angle) * baseRadius;\n const x2 = cx + Math.cos(angle) * (baseRadius + barHeight);\n const y2 = cy + Math.sin(angle) * (baseRadius + barHeight);\n\n // Draw bar with gradient\n const gradient = ctx.createLinearGradient(x1, y1, x2, y2);\n gradient.addColorStop(0, colorRef.current.inner);\n gradient.addColorStop(1, colorRef.current.outer);\n\n // Bars thicken with amplitude for a more alive feel\n const barWidth = baseBarWidth + barsRef.current[i] * baseBarWidth * 0.6;\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.strokeStyle = gradient;\n ctx.lineWidth = barWidth;\n ctx.lineCap = 'round';\n ctx.stroke();\n }\n\n rafRef.current = requestAnimationFrame(tick);\n };\n\n rafRef.current = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(rafRef.current);\n }, [analyserNode, state, size, reducedMotion]);\n\n return (\n <canvas\n ref={canvasRef}\n style={{ width: size, height: size }}\n className=\"absolute inset-0 pointer-events-none\"\n aria-hidden=\"true\"\n />\n );\n}\n"],"mappings":"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","names":["useState","useEffect","useCallback","useRef","Component","motion","AnimatePresence","Mic","VolumeX","useSiteConfig","useRef","useEffect","useState","useCallback","jsx","useSiteConfig","jsx","jsxs","lerp","useRef","useEffect","useState","useCallback","useState","useEffect","useRef","jsx","jsxs","useState","useEffect","useRef","useEffect","motion","AnimatePresence","jsx","jsxs","useEffect","AnimatePresence","motion","jsx","jsxs","motion","AnimatePresence","AlertTriangle","jsx","jsxs","AlertTriangle","AnimatePresence","motion","useState","useEffect","motion","AnimatePresence","jsx","jsxs","jsx","jsxs","VoiceSettingsView","useSiteConfig","motion","VolumeX","Mic","useState","useRef","useEffect","AnimatePresence","useCallback","Component","useEffect","useRef","jsx","motion","AnimatePresence","useReducedMotion","Mic","useSiteConfig","jsx","useState","useRef","useEffect","motion","AnimatePresence","Keyboard","X","useSiteConfig","jsx","jsxs","STATE_LABELS","useState","useRef","useEffect","AnimatePresence","motion","X","Keyboard","useRef","useEffect","useState","jsx","useState","useEffect","motion","AnimatePresence","useSiteConfig","jsx","jsxs","useState","useEffect","AnimatePresence","motion","useState","useEffect","useCallback","useRef","createPortal","motion","X","useVoiceAgent","voiceStateToOrbState","useRef","useEffect","useState","jsx","STATE_COLORS","lerpColor","Fragment","jsx","jsxs","useVoiceAgent","useState","voiceStateToOrbState","useRef","useEffect","useCallback","motion","createPortal","X"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unctad-ai/voice-agent-ui",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"clsx": "^2.1.0",
|
|
21
21
|
"tailwind-merge": "^2.0.0",
|
|
22
|
-
"@unctad-ai/voice-agent-
|
|
23
|
-
"@unctad-ai/voice-agent-
|
|
22
|
+
"@unctad-ai/voice-agent-registries": "0.1.6",
|
|
23
|
+
"@unctad-ai/voice-agent-core": "0.1.6"
|
|
24
24
|
},
|
|
25
25
|
"peerDependencies": {
|
|
26
26
|
"lucide-react": "*",
|