@unctad-ai/voice-agent-ui 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/VoiceAgentProvider.d.ts +6 -0
  2. package/dist/VoiceAgentProvider.d.ts.map +1 -0
  3. package/dist/VoiceAgentProvider.js +8 -0
  4. package/dist/VoiceAgentProvider.js.map +1 -0
  5. package/dist/components/AgentAvatar.d.ts +16 -0
  6. package/dist/components/AgentAvatar.d.ts.map +1 -0
  7. package/dist/components/AgentAvatar.js +186 -0
  8. package/dist/components/AgentAvatar.js.map +1 -0
  9. package/dist/components/GlassCopilotPanel.d.ts +13 -0
  10. package/dist/components/GlassCopilotPanel.d.ts.map +1 -0
  11. package/dist/components/GlassCopilotPanel.js +438 -0
  12. package/dist/components/GlassCopilotPanel.js.map +1 -0
  13. package/dist/components/PipelineMetricsBar.d.ts +7 -0
  14. package/dist/components/PipelineMetricsBar.d.ts.map +1 -0
  15. package/dist/components/PipelineMetricsBar.js +62 -0
  16. package/dist/components/PipelineMetricsBar.js.map +1 -0
  17. package/dist/components/VoiceA11yAnnouncer.d.ts +8 -0
  18. package/dist/components/VoiceA11yAnnouncer.d.ts.map +1 -0
  19. package/dist/components/VoiceA11yAnnouncer.js +32 -0
  20. package/dist/components/VoiceA11yAnnouncer.js.map +1 -0
  21. package/dist/components/VoiceControls.d.ts +9 -0
  22. package/dist/components/VoiceControls.d.ts.map +1 -0
  23. package/dist/components/VoiceControls.js +60 -0
  24. package/dist/components/VoiceControls.js.map +1 -0
  25. package/dist/components/VoiceCopilotFAB.d.ts +9 -0
  26. package/dist/components/VoiceCopilotFAB.d.ts.map +1 -0
  27. package/dist/components/VoiceCopilotFAB.js +12 -0
  28. package/dist/components/VoiceCopilotFAB.js.map +1 -0
  29. package/dist/components/VoiceDotRing.d.ts +9 -0
  30. package/dist/components/VoiceDotRing.d.ts.map +1 -0
  31. package/dist/components/VoiceDotRing.js +64 -0
  32. package/dist/components/VoiceDotRing.js.map +1 -0
  33. package/dist/components/VoiceErrorBoundary.d.ts +19 -0
  34. package/dist/components/VoiceErrorBoundary.d.ts.map +1 -0
  35. package/dist/components/VoiceErrorBoundary.js +24 -0
  36. package/dist/components/VoiceErrorBoundary.js.map +1 -0
  37. package/dist/components/VoiceErrorDisplay.d.ts +8 -0
  38. package/dist/components/VoiceErrorDisplay.d.ts.map +1 -0
  39. package/dist/components/VoiceErrorDisplay.js +94 -0
  40. package/dist/components/VoiceErrorDisplay.js.map +1 -0
  41. package/dist/components/VoiceOnboarding.d.ts +8 -0
  42. package/dist/components/VoiceOnboarding.d.ts.map +1 -0
  43. package/dist/components/VoiceOnboarding.js +28 -0
  44. package/dist/components/VoiceOnboarding.js.map +1 -0
  45. package/dist/components/VoiceOrb.d.ts +10 -0
  46. package/dist/components/VoiceOrb.d.ts.map +1 -0
  47. package/dist/components/VoiceOrb.js +236 -0
  48. package/dist/components/VoiceOrb.js.map +1 -0
  49. package/dist/components/VoiceOverlay.d.ts +9 -0
  50. package/dist/components/VoiceOverlay.d.ts.map +1 -0
  51. package/dist/components/VoiceOverlay.js +199 -0
  52. package/dist/components/VoiceOverlay.js.map +1 -0
  53. package/dist/components/VoiceSettingsView.d.ts +7 -0
  54. package/dist/components/VoiceSettingsView.d.ts.map +1 -0
  55. package/dist/components/VoiceSettingsView.js +109 -0
  56. package/dist/components/VoiceSettingsView.js.map +1 -0
  57. package/dist/components/VoiceToolCard.d.ts +11 -0
  58. package/dist/components/VoiceToolCard.d.ts.map +1 -0
  59. package/dist/components/VoiceToolCard.js +37 -0
  60. package/dist/components/VoiceToolCard.js.map +1 -0
  61. package/dist/components/VoiceTranscript.d.ts +13 -0
  62. package/dist/components/VoiceTranscript.d.ts.map +1 -0
  63. package/dist/components/VoiceTranscript.js +313 -0
  64. package/dist/components/VoiceTranscript.js.map +1 -0
  65. package/dist/components/VoiceWaveformCanvas.d.ts +9 -0
  66. package/dist/components/VoiceWaveformCanvas.d.ts.map +1 -0
  67. package/dist/components/VoiceWaveformCanvas.js +91 -0
  68. package/dist/components/VoiceWaveformCanvas.js.map +1 -0
  69. package/dist/contexts/VoiceSettingsContext.d.ts +37 -0
  70. package/dist/contexts/VoiceSettingsContext.d.ts.map +1 -0
  71. package/dist/contexts/VoiceSettingsContext.js +89 -0
  72. package/dist/contexts/VoiceSettingsContext.js.map +1 -0
  73. package/dist/index.d.ts +22 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +22 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/utils.d.ts +3 -0
  78. package/dist/utils.d.ts.map +1 -0
  79. package/dist/utils.js +6 -0
  80. package/dist/utils.js.map +1 -0
  81. package/package.json +53 -0
@@ -0,0 +1,6 @@
1
+ import type { SiteConfig } from '@unctad-ai/voice-agent-core';
2
+ export declare function VoiceAgentProvider({ config, children, }: {
3
+ config: SiteConfig;
4
+ children: React.ReactNode;
5
+ }): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=VoiceAgentProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VoiceAgentProvider.d.ts","sourceRoot":"","sources":["../src/VoiceAgentProvider.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9D,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,QAAQ,GACT,EAAE;IACD,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,2CAUA"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { SiteConfigProvider } from '@unctad-ai/voice-agent-core';
3
+ import { CopilotProvider } from '@unctad-ai/voice-agent-registries';
4
+ import { VoiceSettingsProvider } from './contexts/VoiceSettingsContext';
5
+ export function VoiceAgentProvider({ config, children, }) {
6
+ return (_jsx(SiteConfigProvider, { config: config, children: _jsx(CopilotProvider, { children: _jsx(VoiceSettingsProvider, { children: children }) }) }));
7
+ }
8
+ //# sourceMappingURL=VoiceAgentProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VoiceAgentProvider.js","sourceRoot":"","sources":["../src/VoiceAgentProvider.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAGxE,MAAM,UAAU,kBAAkB,CAAC,EACjC,MAAM,EACN,QAAQ,GAIT;IACC,OAAO,CACL,KAAC,kBAAkB,IAAC,MAAM,EAAE,MAAM,YAChC,KAAC,eAAe,cACd,KAAC,qBAAqB,cACnB,QAAQ,GACa,GACR,GACC,CACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { OrbState } from '@unctad-ai/voice-agent-core';
2
+ interface AgentAvatarProps {
3
+ state: OrbState;
4
+ getAmplitude: () => number;
5
+ size?: number;
6
+ showAura?: boolean;
7
+ /** Show audio-reactive conic-gradient ring around portrait */
8
+ showRing?: boolean;
9
+ /** URL for the avatar portrait image */
10
+ portraitSrc?: string;
11
+ /** Monogram letter shown when image fails to load */
12
+ monogram?: string;
13
+ }
14
+ export default function AgentAvatar({ state, getAmplitude, size, showAura, showRing, portraitSrc, monogram, }: AgentAvatarProps): import("react/jsx-runtime").JSX.Element;
15
+ export {};
16
+ //# sourceMappingURL=AgentAvatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentAvatar.d.ts","sourceRoot":"","sources":["../../src/components/AgentAvatar.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAW5D,UAAU,gBAAgB;IACxB,KAAK,EAAE,QAAQ,CAAC;IAChB,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAMD,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAClC,KAAK,EACL,YAAY,EACZ,IAAS,EACT,QAAe,EACf,QAAgB,EAChB,WAAW,EACX,QAAQ,GACT,EAAE,gBAAgB,2CA0OlB"}
@@ -0,0 +1,186 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useRef, useEffect, useState, useCallback } from 'react';
3
+ import VoiceOrb from './VoiceOrb';
4
+ import { AVATAR_PORTRAIT_RATIO, AVATAR_STATE_FILTERS, buildGlowColors, useSiteConfig, } from '@unctad-ai/voice-agent-core';
5
+ /** Conic gradient colors per state — [color1, color2] */
6
+ const RING_COLORS = {
7
+ idle: ['#93a3c8', '#b0bfdb'],
8
+ listening: ['#DB2129', '#34d399'],
9
+ processing: ['#F59E0B', '#FBBF24'],
10
+ speaking: ['#14B8A6', '#34d399'],
11
+ error: ['#DC2626', '#991B1B'],
12
+ };
13
+ function lerp(a, b, t) {
14
+ return a + (b - a) * t;
15
+ }
16
+ export default function AgentAvatar({ state, getAmplitude, size = 36, showAura = true, showRing = false, portraitSrc, monogram, }) {
17
+ const config = useSiteConfig();
18
+ const initial = monogram ?? config.copilotName?.charAt(0)?.toUpperCase() ?? 'A';
19
+ const { colors } = useSiteConfig();
20
+ const AVATAR_GLOW_COLORS = buildGlowColors(colors);
21
+ const portraitSize = Math.round(size * AVATAR_PORTRAIT_RATIO);
22
+ const offset = Math.round((size - portraitSize) / 2);
23
+ // Ring sits between aura and portrait — 3px border around portrait
24
+ const ringWidth = 3;
25
+ const ringSize = portraitSize + ringWidth * 2;
26
+ const ringOffset = Math.round((size - ringSize) / 2);
27
+ const imgRef = useRef(null);
28
+ const glowRef = useRef(null);
29
+ const ringRef = useRef(null);
30
+ const rafRef = useRef(0);
31
+ const stateRef = useRef(state);
32
+ useEffect(() => {
33
+ stateRef.current = state;
34
+ });
35
+ const getAmpRef = useRef(getAmplitude);
36
+ useEffect(() => {
37
+ getAmpRef.current = getAmplitude;
38
+ });
39
+ const [loaded, setLoaded] = useState(false);
40
+ const [errored, setErrored] = useState(false);
41
+ // Detect prefers-reduced-motion
42
+ const reducedRef = useRef(false);
43
+ useEffect(() => {
44
+ const mql = window.matchMedia('(prefers-reduced-motion: reduce)');
45
+ reducedRef.current = mql.matches;
46
+ const handler = (e) => {
47
+ reducedRef.current = e.matches;
48
+ };
49
+ mql.addEventListener('change', handler);
50
+ return () => mql.removeEventListener('change', handler);
51
+ }, []);
52
+ // Animated filter values — lerped each frame, no React re-renders
53
+ const animRef = useRef({
54
+ brightness: AVATAR_STATE_FILTERS.idle.brightness,
55
+ saturate: AVATAR_STATE_FILTERS.idle.saturate,
56
+ opacity: AVATAR_STATE_FILTERS.idle.opacity,
57
+ scale: AVATAR_STATE_FILTERS.idle.scale,
58
+ glowIntensity: AVATAR_STATE_FILTERS.idle.glowIntensity,
59
+ ringAngle: 0,
60
+ });
61
+ useEffect(() => {
62
+ let startTime = null;
63
+ let prevTimestamp = 0;
64
+ const tick = (timestamp) => {
65
+ if (startTime === null)
66
+ startTime = timestamp;
67
+ const elapsed = (timestamp - startTime) / 1000;
68
+ const dt = prevTimestamp ? (timestamp - prevTimestamp) / 1000 : 0.016;
69
+ prevTimestamp = timestamp;
70
+ const target = AVATAR_STATE_FILTERS[stateRef.current];
71
+ const a = animRef.current;
72
+ const speed = 0.08;
73
+ a.brightness = lerp(a.brightness, target.brightness, speed);
74
+ a.saturate = lerp(a.saturate, target.saturate, speed);
75
+ a.scale = lerp(a.scale, target.scale, speed);
76
+ a.glowIntensity = lerp(a.glowIntensity, target.glowIntensity, speed);
77
+ // Processing opacity pulses
78
+ let targetOpacity = target.opacity;
79
+ if (stateRef.current === 'processing') {
80
+ targetOpacity = 0.92 + Math.sin(elapsed * 4) * 0.06;
81
+ }
82
+ a.opacity = lerp(a.opacity, targetOpacity, speed);
83
+ // Speaking state: portrait scale reacts to amplitude
84
+ const amp = getAmpRef.current();
85
+ const ampFactor = reducedRef.current ? 0.2 : 1;
86
+ let scaleBoost = 0;
87
+ if (stateRef.current === 'speaking') {
88
+ scaleBoost = amp * 0.03 * ampFactor;
89
+ }
90
+ // Apply to portrait image via direct DOM mutation
91
+ const img = imgRef.current;
92
+ if (img) {
93
+ img.style.filter = `brightness(${a.brightness}) saturate(${a.saturate})`;
94
+ img.style.opacity = String(a.opacity);
95
+ img.style.transform = `scale(${a.scale + scaleBoost})`;
96
+ }
97
+ // Apply glow overlay
98
+ const glow = glowRef.current;
99
+ if (glow) {
100
+ glow.style.backgroundColor = AVATAR_GLOW_COLORS[stateRef.current];
101
+ glow.style.opacity = String(a.glowIntensity);
102
+ }
103
+ // Audio-reactive ring
104
+ const ring = ringRef.current;
105
+ if (ring) {
106
+ const ringColors = RING_COLORS[stateRef.current];
107
+ // Rotation: base 120 deg/s, amplitude boosts up to 3x
108
+ const rotSpeed = reducedRef.current ? 0 : 120 * (1 + amp * 2);
109
+ a.ringAngle = (a.ringAngle + rotSpeed * dt) % 360;
110
+ // Ring opacity: idle = subtle, active states = brighter with amplitude boost
111
+ const isActive = stateRef.current !== 'idle';
112
+ const ringOpacity = isActive ? 0.7 + amp * 0.3 : 0.35;
113
+ // Scale pulse with amplitude
114
+ const ringScale = 1 + amp * 0.04 * ampFactor;
115
+ ring.style.background = `conic-gradient(from ${a.ringAngle}deg, ${ringColors[0]}, ${ringColors[1]}, ${ringColors[0]})`;
116
+ ring.style.opacity = String(ringOpacity);
117
+ ring.style.transform = `scale(${ringScale})`;
118
+ }
119
+ rafRef.current = requestAnimationFrame(tick);
120
+ };
121
+ rafRef.current = requestAnimationFrame(tick);
122
+ return () => cancelAnimationFrame(rafRef.current);
123
+ }, []);
124
+ const handleLoad = useCallback(() => setLoaded(true), []);
125
+ const handleError = useCallback(() => setErrored(true), []);
126
+ return (_jsxs("div", { style: {
127
+ position: 'relative',
128
+ width: size,
129
+ height: size,
130
+ flexShrink: 0,
131
+ }, children: [showAura && (_jsx("div", { style: { position: 'absolute', inset: 0 }, children: _jsx(VoiceOrb, { state: state, getAmplitude: getAmplitude, size: size }) })), showRing && (_jsx("div", { ref: ringRef, style: {
132
+ position: 'absolute',
133
+ top: ringOffset,
134
+ left: ringOffset,
135
+ width: ringSize,
136
+ height: ringSize,
137
+ borderRadius: '50%',
138
+ background: `conic-gradient(from 0deg, ${RING_COLORS.idle[0]}, ${RING_COLORS.idle[1]}, ${RING_COLORS.idle[0]})`,
139
+ opacity: 0.35,
140
+ WebkitMask: `radial-gradient(circle, transparent ${Math.round((portraitSize / ringSize) * 50)}%, black ${Math.round((portraitSize / ringSize) * 50)}%)`,
141
+ mask: `radial-gradient(circle, transparent ${Math.round((portraitSize / ringSize) * 50)}%, black ${Math.round((portraitSize / ringSize) * 50)}%)`,
142
+ pointerEvents: 'none',
143
+ willChange: 'transform, background, opacity',
144
+ } })), _jsx("div", { ref: glowRef, style: {
145
+ position: 'absolute',
146
+ top: offset,
147
+ left: offset,
148
+ width: portraitSize,
149
+ height: portraitSize,
150
+ borderRadius: '50%',
151
+ mixBlendMode: 'soft-light',
152
+ opacity: 0,
153
+ pointerEvents: 'none',
154
+ transition: 'background-color 0.3s',
155
+ } }), _jsx("div", { style: {
156
+ position: 'absolute',
157
+ top: offset,
158
+ left: offset,
159
+ width: portraitSize,
160
+ height: portraitSize,
161
+ borderRadius: '50%',
162
+ overflow: 'hidden',
163
+ }, children: errored || !portraitSrc ? (
164
+ // Monogram fallback
165
+ _jsx("div", { style: {
166
+ width: '100%',
167
+ height: '100%',
168
+ display: 'flex',
169
+ alignItems: 'center',
170
+ justifyContent: 'center',
171
+ backgroundColor: colors.primary,
172
+ color: 'white',
173
+ fontFamily: 'DM Sans, sans-serif',
174
+ fontWeight: 700,
175
+ fontSize: Math.round(portraitSize * 0.45),
176
+ }, children: initial })) : (_jsx("img", { ref: imgRef, src: portraitSrc, alt: "Avatar", onLoad: handleLoad, onError: handleError, style: {
177
+ width: '100%',
178
+ height: '100%',
179
+ objectFit: 'cover',
180
+ borderRadius: '50%',
181
+ opacity: loaded ? 0.95 : 0,
182
+ transition: loaded ? 'none' : 'opacity 0.3s ease-in',
183
+ willChange: 'filter, transform, opacity',
184
+ }, draggable: false })) })] }));
185
+ }
186
+ //# sourceMappingURL=AgentAvatar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AgentAvatar.js","sourceRoot":"","sources":["../../src/components/AgentAvatar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { OrbState } from '@unctad-ai/voice-agent-core';
2
+ import './AgentAvatarFAB.css';
3
+ interface GlassCopilotPanelProps {
4
+ isOpen: boolean;
5
+ onOpen?: () => void;
6
+ onClose: () => void;
7
+ onStateChange?: (orbState: OrbState) => void;
8
+ /** URL for the avatar portrait image */
9
+ portraitSrc?: string;
10
+ }
11
+ export default function GlassCopilotPanel({ isOpen, onOpen, onClose, onStateChange, portraitSrc }: GlassCopilotPanelProps): import("react").ReactPortal;
12
+ export {};
13
+ //# sourceMappingURL=GlassCopilotPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GlassCopilotPanel.d.ts","sourceRoot":"","sources":["../../src/components/GlassCopilotPanel.tsx"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,QAAQ,EAA8D,MAAM,6BAA6B,CAAC;AAGxH,OAAO,sBAAsB,CAAC;AAoC9B,UAAU,sBAAsB;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC7C,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AA2zBD,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,EAAE,sBAAsB,+BAqExH"}