@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.
- package/dist/VoiceAgentProvider.d.ts +6 -0
- package/dist/VoiceAgentProvider.d.ts.map +1 -0
- package/dist/VoiceAgentProvider.js +8 -0
- package/dist/VoiceAgentProvider.js.map +1 -0
- package/dist/components/AgentAvatar.d.ts +16 -0
- package/dist/components/AgentAvatar.d.ts.map +1 -0
- package/dist/components/AgentAvatar.js +186 -0
- package/dist/components/AgentAvatar.js.map +1 -0
- package/dist/components/GlassCopilotPanel.d.ts +13 -0
- package/dist/components/GlassCopilotPanel.d.ts.map +1 -0
- package/dist/components/GlassCopilotPanel.js +438 -0
- package/dist/components/GlassCopilotPanel.js.map +1 -0
- package/dist/components/PipelineMetricsBar.d.ts +7 -0
- package/dist/components/PipelineMetricsBar.d.ts.map +1 -0
- package/dist/components/PipelineMetricsBar.js +62 -0
- package/dist/components/PipelineMetricsBar.js.map +1 -0
- package/dist/components/VoiceA11yAnnouncer.d.ts +8 -0
- package/dist/components/VoiceA11yAnnouncer.d.ts.map +1 -0
- package/dist/components/VoiceA11yAnnouncer.js +32 -0
- package/dist/components/VoiceA11yAnnouncer.js.map +1 -0
- package/dist/components/VoiceControls.d.ts +9 -0
- package/dist/components/VoiceControls.d.ts.map +1 -0
- package/dist/components/VoiceControls.js +60 -0
- package/dist/components/VoiceControls.js.map +1 -0
- package/dist/components/VoiceCopilotFAB.d.ts +9 -0
- package/dist/components/VoiceCopilotFAB.d.ts.map +1 -0
- package/dist/components/VoiceCopilotFAB.js +12 -0
- package/dist/components/VoiceCopilotFAB.js.map +1 -0
- package/dist/components/VoiceDotRing.d.ts +9 -0
- package/dist/components/VoiceDotRing.d.ts.map +1 -0
- package/dist/components/VoiceDotRing.js +64 -0
- package/dist/components/VoiceDotRing.js.map +1 -0
- package/dist/components/VoiceErrorBoundary.d.ts +19 -0
- package/dist/components/VoiceErrorBoundary.d.ts.map +1 -0
- package/dist/components/VoiceErrorBoundary.js +24 -0
- package/dist/components/VoiceErrorBoundary.js.map +1 -0
- package/dist/components/VoiceErrorDisplay.d.ts +8 -0
- package/dist/components/VoiceErrorDisplay.d.ts.map +1 -0
- package/dist/components/VoiceErrorDisplay.js +94 -0
- package/dist/components/VoiceErrorDisplay.js.map +1 -0
- package/dist/components/VoiceOnboarding.d.ts +8 -0
- package/dist/components/VoiceOnboarding.d.ts.map +1 -0
- package/dist/components/VoiceOnboarding.js +28 -0
- package/dist/components/VoiceOnboarding.js.map +1 -0
- package/dist/components/VoiceOrb.d.ts +10 -0
- package/dist/components/VoiceOrb.d.ts.map +1 -0
- package/dist/components/VoiceOrb.js +236 -0
- package/dist/components/VoiceOrb.js.map +1 -0
- package/dist/components/VoiceOverlay.d.ts +9 -0
- package/dist/components/VoiceOverlay.d.ts.map +1 -0
- package/dist/components/VoiceOverlay.js +199 -0
- package/dist/components/VoiceOverlay.js.map +1 -0
- package/dist/components/VoiceSettingsView.d.ts +7 -0
- package/dist/components/VoiceSettingsView.d.ts.map +1 -0
- package/dist/components/VoiceSettingsView.js +109 -0
- package/dist/components/VoiceSettingsView.js.map +1 -0
- package/dist/components/VoiceToolCard.d.ts +11 -0
- package/dist/components/VoiceToolCard.d.ts.map +1 -0
- package/dist/components/VoiceToolCard.js +37 -0
- package/dist/components/VoiceToolCard.js.map +1 -0
- package/dist/components/VoiceTranscript.d.ts +13 -0
- package/dist/components/VoiceTranscript.d.ts.map +1 -0
- package/dist/components/VoiceTranscript.js +313 -0
- package/dist/components/VoiceTranscript.js.map +1 -0
- package/dist/components/VoiceWaveformCanvas.d.ts +9 -0
- package/dist/components/VoiceWaveformCanvas.d.ts.map +1 -0
- package/dist/components/VoiceWaveformCanvas.js +91 -0
- package/dist/components/VoiceWaveformCanvas.js.map +1 -0
- package/dist/contexts/VoiceSettingsContext.d.ts +37 -0
- package/dist/contexts/VoiceSettingsContext.d.ts.map +1 -0
- package/dist/contexts/VoiceSettingsContext.js +89 -0
- package/dist/contexts/VoiceSettingsContext.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/utils.d.ts +3 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +6 -0
- package/dist/utils.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useRef, useEffect, useCallback, useState } from 'react';
|
|
3
|
+
import { createNoise3D } from 'simplex-noise';
|
|
4
|
+
import { ORB_NUM_POINTS, ORB_LERP_SPEED, useSiteConfig } from '@unctad-ai/voice-agent-core';
|
|
5
|
+
/** Glow color that pulses around the orb per state */
|
|
6
|
+
const STATE_GLOW = {
|
|
7
|
+
idle: 'rgba(59, 130, 246, 0.25)',
|
|
8
|
+
listening: 'rgba(219, 33, 41, 0.45)',
|
|
9
|
+
processing: 'rgba(245, 158, 11, 0.4)',
|
|
10
|
+
speaking: 'rgba(20, 184, 166, 0.4)',
|
|
11
|
+
error: 'rgba(220, 38, 38, 0.4)',
|
|
12
|
+
};
|
|
13
|
+
function buildStateConfig(primaryColor) {
|
|
14
|
+
return {
|
|
15
|
+
idle: {
|
|
16
|
+
colors: ['#1E3A5F', '#3B82F6'],
|
|
17
|
+
noiseSpeed: 0.3,
|
|
18
|
+
noiseMag: 8,
|
|
19
|
+
baseScale: 0.975,
|
|
20
|
+
breathAmp: 0.025,
|
|
21
|
+
breathSpeed: 0.25,
|
|
22
|
+
rotation: 0,
|
|
23
|
+
shimmer: false,
|
|
24
|
+
},
|
|
25
|
+
listening: {
|
|
26
|
+
colors: [primaryColor, '#F59E0B'],
|
|
27
|
+
noiseSpeed: 0.6,
|
|
28
|
+
noiseMag: 18,
|
|
29
|
+
baseScale: 1.0,
|
|
30
|
+
breathAmp: 0.04,
|
|
31
|
+
breathSpeed: 0.5,
|
|
32
|
+
rotation: 0,
|
|
33
|
+
shimmer: false,
|
|
34
|
+
},
|
|
35
|
+
processing: {
|
|
36
|
+
colors: ['#D97706', '#FBBF24'],
|
|
37
|
+
noiseSpeed: 1.0,
|
|
38
|
+
noiseMag: 14,
|
|
39
|
+
baseScale: 1.0,
|
|
40
|
+
breathAmp: 0.02,
|
|
41
|
+
breathSpeed: 0.8,
|
|
42
|
+
rotation: 0.4,
|
|
43
|
+
shimmer: true,
|
|
44
|
+
},
|
|
45
|
+
speaking: {
|
|
46
|
+
colors: ['#1B7A50', '#2DD4BF'],
|
|
47
|
+
noiseSpeed: 0.5,
|
|
48
|
+
noiseMag: 16,
|
|
49
|
+
baseScale: 1.0,
|
|
50
|
+
breathAmp: 0.05,
|
|
51
|
+
breathSpeed: 0.4,
|
|
52
|
+
rotation: 0,
|
|
53
|
+
shimmer: false,
|
|
54
|
+
},
|
|
55
|
+
error: {
|
|
56
|
+
colors: ['#DC2626', '#991B1B'],
|
|
57
|
+
noiseSpeed: 1.4,
|
|
58
|
+
noiseMag: 22,
|
|
59
|
+
baseScale: 0.95,
|
|
60
|
+
breathAmp: 0.01,
|
|
61
|
+
breathSpeed: 1.2,
|
|
62
|
+
rotation: 0,
|
|
63
|
+
shimmer: false,
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const NUM_POINTS = ORB_NUM_POINTS;
|
|
68
|
+
const LERP_SPEED = ORB_LERP_SPEED;
|
|
69
|
+
function useReducedMotion() {
|
|
70
|
+
const [reduced, setReduced] = useState(() => window.matchMedia('(prefers-reduced-motion: reduce)').matches);
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
const mql = window.matchMedia('(prefers-reduced-motion: reduce)');
|
|
73
|
+
const handler = (e) => setReduced(e.matches);
|
|
74
|
+
mql.addEventListener('change', handler);
|
|
75
|
+
return () => mql.removeEventListener('change', handler);
|
|
76
|
+
}, []);
|
|
77
|
+
return reduced;
|
|
78
|
+
}
|
|
79
|
+
function lerp(a, b, t) {
|
|
80
|
+
return a + (b - a) * t;
|
|
81
|
+
}
|
|
82
|
+
function lerpColor(a, b, t) {
|
|
83
|
+
const parseHex = (h) => [
|
|
84
|
+
parseInt(h.slice(1, 3), 16),
|
|
85
|
+
parseInt(h.slice(3, 5), 16),
|
|
86
|
+
parseInt(h.slice(5, 7), 16),
|
|
87
|
+
];
|
|
88
|
+
const ca = parseHex(a);
|
|
89
|
+
const cb = parseHex(b);
|
|
90
|
+
const r = Math.round(lerp(ca[0], cb[0], t));
|
|
91
|
+
const g = Math.round(lerp(ca[1], cb[1], t));
|
|
92
|
+
const bl = Math.round(lerp(ca[2], cb[2], t));
|
|
93
|
+
return `#${((1 << 24) | (r << 16) | (g << 8) | bl).toString(16).slice(1)}`;
|
|
94
|
+
}
|
|
95
|
+
export default function VoiceOrb({ state, getAmplitude, size = 200 }) {
|
|
96
|
+
const config = useSiteConfig();
|
|
97
|
+
const STATE_CONFIG = buildStateConfig(config.colors.primary);
|
|
98
|
+
const svgRef = useRef(null);
|
|
99
|
+
const rafRef = useRef(0);
|
|
100
|
+
const noise3D = useRef(createNoise3D());
|
|
101
|
+
const prefersReduced = useReducedMotion();
|
|
102
|
+
const reducedRef = useRef(prefersReduced);
|
|
103
|
+
reducedRef.current = prefersReduced;
|
|
104
|
+
// Animated (lerped) config values that transition smoothly between states
|
|
105
|
+
const animRef = useRef({
|
|
106
|
+
noiseSpeed: STATE_CONFIG.idle.noiseSpeed,
|
|
107
|
+
noiseMag: STATE_CONFIG.idle.noiseMag,
|
|
108
|
+
baseScale: STATE_CONFIG.idle.baseScale,
|
|
109
|
+
breathAmp: STATE_CONFIG.idle.breathAmp,
|
|
110
|
+
breathSpeed: STATE_CONFIG.idle.breathSpeed,
|
|
111
|
+
rotation: STATE_CONFIG.idle.rotation,
|
|
112
|
+
color0: STATE_CONFIG.idle.colors[0],
|
|
113
|
+
color1: STATE_CONFIG.idle.colors[1],
|
|
114
|
+
shimmer: 0,
|
|
115
|
+
errorShake: 0,
|
|
116
|
+
});
|
|
117
|
+
const stateRef = useRef(state);
|
|
118
|
+
stateRef.current = state;
|
|
119
|
+
const getAmplitudeRef = useRef(getAmplitude);
|
|
120
|
+
getAmplitudeRef.current = getAmplitude;
|
|
121
|
+
const stateConfigRef = useRef(STATE_CONFIG);
|
|
122
|
+
stateConfigRef.current = STATE_CONFIG;
|
|
123
|
+
const buildPath = useCallback((time, a) => {
|
|
124
|
+
const cx = size / 2;
|
|
125
|
+
const cy = size / 2;
|
|
126
|
+
const baseR = size * 0.35;
|
|
127
|
+
const amp = getAmplitudeRef.current();
|
|
128
|
+
// amplitude influences noise magnitude
|
|
129
|
+
const mag = a.noiseMag + amp * 20;
|
|
130
|
+
const points = [];
|
|
131
|
+
for (let i = 0; i < NUM_POINTS; i++) {
|
|
132
|
+
const angle = (i / NUM_POINTS) * Math.PI * 2;
|
|
133
|
+
const nx = Math.cos(angle);
|
|
134
|
+
const ny = Math.sin(angle);
|
|
135
|
+
const noiseVal = noise3D.current(nx * 1.5, ny * 1.5, time * a.noiseSpeed);
|
|
136
|
+
const r = baseR + noiseVal * mag;
|
|
137
|
+
points.push([cx + Math.cos(angle) * r, cy + Math.sin(angle) * r]);
|
|
138
|
+
}
|
|
139
|
+
// Build smooth closed path with cubic beziers
|
|
140
|
+
let d = `M ${points[0][0]},${points[0][1]} `;
|
|
141
|
+
for (let i = 0; i < NUM_POINTS; i++) {
|
|
142
|
+
const curr = points[i];
|
|
143
|
+
const next = points[(i + 1) % NUM_POINTS];
|
|
144
|
+
const prev = points[(i - 1 + NUM_POINTS) % NUM_POINTS];
|
|
145
|
+
const next2 = points[(i + 2) % NUM_POINTS];
|
|
146
|
+
const cp1x = curr[0] + (next[0] - prev[0]) / 6;
|
|
147
|
+
const cp1y = curr[1] + (next[1] - prev[1]) / 6;
|
|
148
|
+
const cp2x = next[0] - (next2[0] - curr[0]) / 6;
|
|
149
|
+
const cp2y = next[1] - (next2[1] - curr[1]) / 6;
|
|
150
|
+
d += `C ${cp1x},${cp1y} ${cp2x},${cp2y} ${next[0]},${next[1]} `;
|
|
151
|
+
}
|
|
152
|
+
d += 'Z';
|
|
153
|
+
return d;
|
|
154
|
+
}, [size]);
|
|
155
|
+
useEffect(() => {
|
|
156
|
+
let startTime = null;
|
|
157
|
+
const tick = (timestamp) => {
|
|
158
|
+
if (startTime === null)
|
|
159
|
+
startTime = timestamp;
|
|
160
|
+
const elapsed = (timestamp - startTime) / 1000;
|
|
161
|
+
const target = stateConfigRef.current[stateRef.current];
|
|
162
|
+
const a = animRef.current;
|
|
163
|
+
// When prefers-reduced-motion is active, dampen animations significantly
|
|
164
|
+
const rd = reducedRef.current ? 0.15 : 1;
|
|
165
|
+
// Lerp all animated values toward target
|
|
166
|
+
a.noiseSpeed = lerp(a.noiseSpeed, target.noiseSpeed * rd, LERP_SPEED);
|
|
167
|
+
a.noiseMag = lerp(a.noiseMag, target.noiseMag * rd, LERP_SPEED);
|
|
168
|
+
a.baseScale = lerp(a.baseScale, target.baseScale, LERP_SPEED);
|
|
169
|
+
a.breathAmp = lerp(a.breathAmp, target.breathAmp * rd, LERP_SPEED);
|
|
170
|
+
a.breathSpeed = lerp(a.breathSpeed, target.breathSpeed * rd, LERP_SPEED);
|
|
171
|
+
a.rotation = lerp(a.rotation, target.rotation * rd, LERP_SPEED);
|
|
172
|
+
a.shimmer = lerp(a.shimmer, target.shimmer ? (reducedRef.current ? 0 : 1) : 0, LERP_SPEED);
|
|
173
|
+
a.color0 = lerpColor(a.color0, target.colors[0], LERP_SPEED);
|
|
174
|
+
a.color1 = lerpColor(a.color1, target.colors[1], LERP_SPEED);
|
|
175
|
+
// Error shake decays
|
|
176
|
+
if (stateRef.current === 'error') {
|
|
177
|
+
a.errorShake = lerp(a.errorShake, 1, 0.1);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
a.errorShake = lerp(a.errorShake, 0, 0.08);
|
|
181
|
+
}
|
|
182
|
+
const svg = svgRef.current;
|
|
183
|
+
if (!svg) {
|
|
184
|
+
rafRef.current = requestAnimationFrame(tick);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
// Breathing scale
|
|
188
|
+
const breath = a.baseScale + Math.sin(elapsed * Math.PI * 2 * a.breathSpeed) * a.breathAmp;
|
|
189
|
+
// Error shake offset
|
|
190
|
+
const shakeX = a.errorShake * Math.sin(elapsed * 30) * 3 * (1 - Math.min(elapsed * 0.3, 1));
|
|
191
|
+
// Rotation
|
|
192
|
+
const rot = elapsed * a.rotation * 360;
|
|
193
|
+
// Update transform
|
|
194
|
+
const group = svg.querySelector('[data-orb-group]');
|
|
195
|
+
if (group) {
|
|
196
|
+
group.setAttribute('transform', `translate(${size / 2 + shakeX}, ${size / 2}) scale(${breath}) rotate(${rot}) translate(${-size / 2}, ${-size / 2})`);
|
|
197
|
+
}
|
|
198
|
+
// Update blob path
|
|
199
|
+
const path = svg.querySelector('[data-orb-path]');
|
|
200
|
+
if (path) {
|
|
201
|
+
path.setAttribute('d', buildPath(elapsed, a));
|
|
202
|
+
}
|
|
203
|
+
// Update gradient colors
|
|
204
|
+
const stop0 = svg.querySelector('[data-stop-0]');
|
|
205
|
+
const stop1 = svg.querySelector('[data-stop-1]');
|
|
206
|
+
if (stop0)
|
|
207
|
+
stop0.setAttribute('stop-color', a.color0);
|
|
208
|
+
if (stop1)
|
|
209
|
+
stop1.setAttribute('stop-color', a.color1);
|
|
210
|
+
// Shimmer opacity
|
|
211
|
+
const shimmerEl = svg.querySelector('[data-shimmer]');
|
|
212
|
+
if (shimmerEl) {
|
|
213
|
+
const shimmerOpacity = a.shimmer * (0.15 + Math.sin(elapsed * 6) * 0.1);
|
|
214
|
+
shimmerEl.setAttribute('opacity', String(shimmerOpacity));
|
|
215
|
+
}
|
|
216
|
+
// Ambient glow — color follows state, opacity pulses with breath
|
|
217
|
+
const glowEl = svg.querySelector('[data-orb-glow]');
|
|
218
|
+
if (glowEl) {
|
|
219
|
+
const amp = getAmplitudeRef.current();
|
|
220
|
+
const glowPulse = 0.35 + Math.sin(elapsed * Math.PI * 2 * a.breathSpeed) * 0.15 + amp * 0.3;
|
|
221
|
+
glowEl.setAttribute('opacity', String(Math.min(glowPulse, 1)));
|
|
222
|
+
glowEl.setAttribute('fill', STATE_GLOW[stateRef.current]);
|
|
223
|
+
}
|
|
224
|
+
rafRef.current = requestAnimationFrame(tick);
|
|
225
|
+
};
|
|
226
|
+
rafRef.current = requestAnimationFrame(tick);
|
|
227
|
+
return () => cancelAnimationFrame(rafRef.current);
|
|
228
|
+
}, [size, buildPath]);
|
|
229
|
+
const idRef = useRef(null);
|
|
230
|
+
idRef.current ??= Math.random().toString(36).slice(2, 8);
|
|
231
|
+
const gradientId = `orb-gradient-${idRef.current}`;
|
|
232
|
+
const shimmerId = `orb-shimmer-${idRef.current}`;
|
|
233
|
+
const glowFilterId = `orb-glow-${idRef.current}`;
|
|
234
|
+
return (_jsxs("svg", { ref: svgRef, width: size, height: size, viewBox: `0 0 ${size} ${size}`, className: "select-none", style: { overflow: 'visible' }, "aria-hidden": "true", children: [_jsxs("defs", { children: [_jsxs("radialGradient", { id: gradientId, cx: "40%", cy: "35%", r: "60%", children: [_jsx("stop", { "data-stop-0": true, offset: "0%", stopColor: STATE_CONFIG.idle.colors[0] }), _jsx("stop", { "data-stop-1": true, offset: "100%", stopColor: STATE_CONFIG.idle.colors[1] })] }), _jsxs("radialGradient", { id: shimmerId, cx: "30%", cy: "30%", r: "50%", children: [_jsx("stop", { offset: "0%", stopColor: "white", stopOpacity: "0.6" }), _jsx("stop", { offset: "100%", stopColor: "white", stopOpacity: "0" })] }), _jsx("filter", { id: glowFilterId, x: "-50%", y: "-50%", width: "200%", height: "200%", children: _jsx("feGaussianBlur", { in: "SourceGraphic", stdDeviation: "18" }) })] }), _jsx("circle", { "data-orb-glow": true, cx: size / 2, cy: size / 2, r: size * 0.38, fill: STATE_GLOW.idle, opacity: "0.5", filter: `url(#${glowFilterId})` }), _jsxs("g", { "data-orb-group": true, children: [_jsx("path", { "data-orb-path": true, fill: `url(#${gradientId})` }), _jsx("circle", { "data-shimmer": true, cx: size / 2, cy: size / 2, r: size * 0.3, fill: `url(#${shimmerId})`, opacity: "0" })] })] }));
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=VoiceOrb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VoiceOrb.js","sourceRoot":"","sources":["../../src/components/VoiceOrb.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAuB5F,sDAAsD;AACtD,MAAM,UAAU,GAA6B;IAC3C,IAAI,EAAE,0BAA0B;IAChC,SAAS,EAAE,yBAAyB;IACpC,UAAU,EAAE,yBAAyB;IACrC,QAAQ,EAAE,yBAAyB;IACnC,KAAK,EAAE,wBAAwB;CAChC,CAAC;AAEF,SAAS,gBAAgB,CAAC,YAAoB;IAC5C,OAAO;QACL,IAAI,EAAE;YACJ,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;YAC9B,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,CAAC;YACX,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,KAAK;YAChB,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,KAAK;SACf;QACD,SAAS,EAAE;YACT,MAAM,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC;YACjC,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,GAAG;YAChB,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,KAAK;SACf;QACD,UAAU,EAAE;YACV,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;YAC9B,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,GAAG;YAChB,QAAQ,EAAE,GAAG;YACb,OAAO,EAAE,IAAI;SACd;QACD,QAAQ,EAAE;YACR,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;YAC9B,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,GAAG;YAChB,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,KAAK;SACf;QACD,KAAK,EAAE;YACL,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;YAC9B,UAAU,EAAE,GAAG;YACf,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,IAAI;YACf,WAAW,EAAE,GAAG;YAChB,QAAQ,EAAE,CAAC;YACX,OAAO,EAAE,KAAK;SACf;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAG,cAAc,CAAC;AAClC,MAAM,UAAU,GAAG,cAAc,CAAC;AAElC,SAAS,gBAAgB;IACvB,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CACpC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAC,OAAO,CACpE,CAAC;IACF,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,CAAC,CAAsB,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAClE,GAAG,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACxC,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,IAAI,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IAC3C,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,SAAS,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IAChD,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC;QAC9B,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QAC3B,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;QAC3B,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;KAC5B,CAAC;IACF,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,GAAG,GAAG,EAAiB;IACjF,MAAM,MAAM,GAAG,aAAa,EAAE,CAAC;IAC/B,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE7D,MAAM,MAAM,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,MAAM,CAAS,CAAC,CAAC,CAAC;IACjC,MAAM,OAAO,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;IACxC,MAAM,cAAc,GAAG,gBAAgB,EAAE,CAAC;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;IAC1C,UAAU,CAAC,OAAO,GAAG,cAAc,CAAC;IAEpC,0EAA0E;IAC1E,MAAM,OAAO,GAAG,MAAM,CAAC;QACrB,UAAU,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU;QACxC,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,QAAQ;QACpC,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,SAAS;QACtC,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,SAAS;QACtC,WAAW,EAAE,YAAY,CAAC,IAAI,CAAC,WAAW;QAC1C,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,QAAQ;QACpC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACnC,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACnC,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,CAAC;KACd,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,CAAW,KAAK,CAAC,CAAC;IACzC,QAAQ,CAAC,OAAO,GAAG,KAAK,CAAC;IAEzB,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IAC7C,eAAe,CAAC,OAAO,GAAG,YAAY,CAAC;IAEvC,MAAM,cAAc,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IAC5C,cAAc,CAAC,OAAO,GAAG,YAAY,CAAC;IAEtC,MAAM,SAAS,GAAG,WAAW,CAC3B,CAAC,IAAY,EAAE,CAAyB,EAAU,EAAE;QAClD,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC;QACpB,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC;QACpB,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;QAC1B,MAAM,GAAG,GAAG,eAAe,CAAC,OAAO,EAAE,CAAC;QAEtC,uCAAuC;QACvC,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,GAAG,GAAG,GAAG,EAAE,CAAC;QAElC,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC3B,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;YAC1E,MAAM,CAAC,GAAG,KAAK,GAAG,QAAQ,GAAG,GAAG,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACpE,CAAC;QAED,8CAA8C;QAC9C,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACvB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;YAE3C,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAChD,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAEhD,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QAClE,CAAC;QACD,CAAC,IAAI,GAAG,CAAC;QACT,OAAO,CAAC,CAAC;IACX,CAAC,EACD,CAAC,IAAI,CAAC,CACP,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAkB,IAAI,CAAC;QAEpC,MAAM,IAAI,GAAG,CAAC,SAAiB,EAAE,EAAE;YACjC,IAAI,SAAS,KAAK,IAAI;gBAAE,SAAS,GAAG,SAAS,CAAC;YAC9C,MAAM,OAAO,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;YAE/C,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACxD,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC;YAE1B,yEAAyE;YACzE,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAEzC,yCAAyC;YACzC,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;YACtE,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;YAChE,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YAC9D,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;YACnE,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,CAAC,WAAW,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;YACzE,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,GAAG,EAAE,EAAE,UAAU,CAAC,CAAC;YAChE,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YAC3F,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YAC7D,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;YAE7D,qBAAqB;YACrB,IAAI,QAAQ,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBACjC,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YAC5C,CAAC;iBAAM,CAAC;gBACN,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;YAC7C,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC;YAC3B,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,CAAC,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;gBAC7C,OAAO;YACT,CAAC;YAED,kBAAkB;YAClB,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC;YAE3F,qBAAqB;YACrB,MAAM,MAAM,GAAG,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAE5F,WAAW;YACX,MAAM,GAAG,GAAG,OAAO,GAAG,CAAC,CAAC,QAAQ,GAAG,GAAG,CAAC;YAEvC,mBAAmB;YACnB,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAc,kBAAkB,CAAC,CAAC;YACjE,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,CAAC,YAAY,CAChB,WAAW,EACX,aAAa,IAAI,GAAG,CAAC,GAAG,MAAM,KAAK,IAAI,GAAG,CAAC,WAAW,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,GAAG,CACrH,CAAC;YACJ,CAAC;YAED,mBAAmB;YACnB,MAAM,IAAI,GAAG,GAAG,CAAC,aAAa,CAAiB,iBAAiB,CAAC,CAAC;YAClE,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,yBAAyB;YACzB,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAiB,eAAe,CAAC,CAAC;YACjE,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAiB,eAAe,CAAC,CAAC;YACjE,IAAI,KAAK;gBAAE,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YACtD,IAAI,KAAK;gBAAE,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;YAEtD,kBAAkB;YAClB,MAAM,SAAS,GAAG,GAAG,CAAC,aAAa,CAAmB,gBAAgB,CAAC,CAAC;YACxE,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,cAAc,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;gBACxE,SAAS,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC;YAC5D,CAAC;YAED,iEAAiE;YACjE,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAmB,iBAAiB,CAAC,CAAC;YACtE,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,GAAG,GAAG,eAAe,CAAC,OAAO,EAAE,CAAC;gBACtC,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC;gBAC5F,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/D,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5D,CAAC;YAED,MAAM,CAAC,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC/C,CAAC,CAAC;QAEF,MAAM,CAAC,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAC7C,OAAO,GAAG,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;IAEtB,MAAM,KAAK,GAAG,MAAM,CAAS,IAAI,CAAC,CAAC;IACnC,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,gBAAgB,KAAK,CAAC,OAAO,EAAE,CAAC;IACnD,MAAM,SAAS,GAAG,eAAe,KAAK,CAAC,OAAO,EAAE,CAAC;IACjD,MAAM,YAAY,GAAG,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC;IAEjD,OAAO,CACL,eACE,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,OAAO,EAAE,OAAO,IAAI,IAAI,IAAI,EAAE,EAC9B,SAAS,EAAC,aAAa,EACvB,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,iBAClB,MAAM,aAElB,2BACE,0BAAgB,EAAE,EAAE,UAAU,EAAE,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,EAAC,KAAK,aACvD,oCAAkB,MAAM,EAAC,IAAI,EAAC,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAI,EACxE,oCAAkB,MAAM,EAAC,MAAM,EAAC,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAI,IAC3D,EACjB,0BAAgB,EAAE,EAAE,SAAS,EAAE,EAAE,EAAC,KAAK,EAAC,EAAE,EAAC,KAAK,EAAC,CAAC,EAAC,KAAK,aACtD,eAAM,MAAM,EAAC,IAAI,EAAC,SAAS,EAAC,OAAO,EAAC,WAAW,EAAC,KAAK,GAAG,EACxD,eAAM,MAAM,EAAC,MAAM,EAAC,SAAS,EAAC,OAAO,EAAC,WAAW,EAAC,GAAG,GAAG,IACzC,EACjB,iBAAQ,EAAE,EAAE,YAAY,EAAE,CAAC,EAAC,MAAM,EAAC,CAAC,EAAC,MAAM,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,YACpE,yBAAgB,EAAE,EAAC,eAAe,EAAC,YAAY,EAAC,IAAI,GAAG,GAChD,IACJ,EAEP,wCAEE,EAAE,EAAE,IAAI,GAAG,CAAC,EACZ,EAAE,EAAE,IAAI,GAAG,CAAC,EACZ,CAAC,EAAE,IAAI,GAAG,IAAI,EACd,IAAI,EAAE,UAAU,CAAC,IAAI,EACrB,OAAO,EAAC,KAAK,EACb,MAAM,EAAE,QAAQ,YAAY,GAAG,GAC/B,EACF,gDACE,sCAAoB,IAAI,EAAE,QAAQ,UAAU,GAAG,GAAI,EACnD,uCAEE,EAAE,EAAE,IAAI,GAAG,CAAC,EACZ,EAAE,EAAE,IAAI,GAAG,CAAC,EACZ,CAAC,EAAE,IAAI,GAAG,GAAG,EACb,IAAI,EAAE,QAAQ,SAAS,GAAG,EAC1B,OAAO,EAAC,GAAG,GACX,IACA,IACA,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { OrbState } from '@unctad-ai/voice-agent-core';
|
|
2
|
+
interface VoiceOverlayProps {
|
|
3
|
+
isOpen: boolean;
|
|
4
|
+
onClose: () => void;
|
|
5
|
+
onStateChange?: (orbState: OrbState) => void;
|
|
6
|
+
}
|
|
7
|
+
export default function VoiceOverlay({ isOpen, onClose, onStateChange }: VoiceOverlayProps): import("react/jsx-runtime").JSX.Element | null;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=VoiceOverlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VoiceOverlay.d.ts","sourceRoot":"","sources":["../../src/components/VoiceOverlay.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,6BAA6B,CAAC;AAoB7E,UAAU,iBAAiB;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;CAC9C;AAiWD,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,iBAAiB,kDAiCzF"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
3
|
+
import { createPortal } from 'react-dom';
|
|
4
|
+
import { motion } from 'motion/react';
|
|
5
|
+
import { X } from 'lucide-react';
|
|
6
|
+
import { useVoiceAgent, voiceStateToOrbState } from '@unctad-ai/voice-agent-core';
|
|
7
|
+
import { IDLE_TIMEOUT_MS, WIND_DOWN_MS, EXIT_ANIMATION_MS } from '@unctad-ai/voice-agent-core';
|
|
8
|
+
import { useVoiceSettings } from '../contexts/VoiceSettingsContext';
|
|
9
|
+
import VoiceOrb from './VoiceOrb';
|
|
10
|
+
import VoiceWaveformCanvas from './VoiceWaveformCanvas';
|
|
11
|
+
import VoiceTranscript from './VoiceTranscript';
|
|
12
|
+
import VoiceToolCard from './VoiceToolCard';
|
|
13
|
+
import VoiceControls from './VoiceControls';
|
|
14
|
+
import VoiceErrorBoundary from './VoiceErrorBoundary';
|
|
15
|
+
import VoiceErrorDisplay from './VoiceErrorDisplay';
|
|
16
|
+
/** Inline z-index guarantees stacking above all page elements */
|
|
17
|
+
const OVERLAY_Z = 2147483647;
|
|
18
|
+
/** Liquid spring configs for entrance choreography */
|
|
19
|
+
const SPRING_BOUNCY = { type: 'spring', damping: 20, stiffness: 180 };
|
|
20
|
+
const SPRING_SMOOTH = { type: 'spring', damping: 28, stiffness: 160 };
|
|
21
|
+
/** Exit easing — smooth start, accelerating pull */
|
|
22
|
+
const EXIT_EASE = [0.4, 0, 0.7, 0.2];
|
|
23
|
+
function WiredOverlayContent({ isMobile, onClose, onStateChange, isClosing, }) {
|
|
24
|
+
const orbSize = isMobile ? 120 : 200;
|
|
25
|
+
const { settings, volumeRef, speedRef } = useVoiceSettings();
|
|
26
|
+
const { state, start, stop, messages, isLLMLoading, getAmplitude, analyser, sendTextMessage, voiceError, dismissError, } = useVoiceAgent({ settings, volumeRef, speedRef });
|
|
27
|
+
const [toolResult, setToolResult] = useState(null);
|
|
28
|
+
const orbState = voiceStateToOrbState(state);
|
|
29
|
+
// Notify parent of state changes for a11y announcer
|
|
30
|
+
const onStateChangeRef = useRef(onStateChange);
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
onStateChangeRef.current = onStateChange;
|
|
33
|
+
});
|
|
34
|
+
useEffect(() => {
|
|
35
|
+
onStateChangeRef.current?.(orbState);
|
|
36
|
+
}, [orbState]);
|
|
37
|
+
// Start VAD when overlay mounts, force-stop on unmount (bypass debounce)
|
|
38
|
+
const startRef = useRef(start);
|
|
39
|
+
const stopRef = useRef(stop);
|
|
40
|
+
useEffect(() => {
|
|
41
|
+
startRef.current = start;
|
|
42
|
+
}, [start]);
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
stopRef.current = stop;
|
|
45
|
+
}, [stop]);
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
startRef.current();
|
|
48
|
+
return () => stopRef.current(true);
|
|
49
|
+
}, []);
|
|
50
|
+
// Stop VAD immediately when exit starts
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
if (isClosing)
|
|
53
|
+
stop();
|
|
54
|
+
}, [isClosing, stop]);
|
|
55
|
+
// --- Idle timeout: auto-close after 30s of no user activity ---
|
|
56
|
+
const [isWindingDown, setIsWindingDown] = useState(false);
|
|
57
|
+
const idleTimerRef = useRef(null);
|
|
58
|
+
const windDownTimerRef = useRef(null);
|
|
59
|
+
const onCloseRef = useRef(onClose);
|
|
60
|
+
useEffect(() => {
|
|
61
|
+
onCloseRef.current = onClose;
|
|
62
|
+
});
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
const clear = () => {
|
|
65
|
+
if (idleTimerRef.current)
|
|
66
|
+
clearTimeout(idleTimerRef.current);
|
|
67
|
+
if (windDownTimerRef.current)
|
|
68
|
+
clearTimeout(windDownTimerRef.current);
|
|
69
|
+
idleTimerRef.current = null;
|
|
70
|
+
windDownTimerRef.current = null;
|
|
71
|
+
};
|
|
72
|
+
if (isClosing || state === 'PROCESSING' || state === 'AI_SPEAKING') {
|
|
73
|
+
clear();
|
|
74
|
+
setIsWindingDown(false);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
clear();
|
|
78
|
+
setIsWindingDown(false);
|
|
79
|
+
windDownTimerRef.current = setTimeout(() => {
|
|
80
|
+
setIsWindingDown(true);
|
|
81
|
+
}, IDLE_TIMEOUT_MS - WIND_DOWN_MS);
|
|
82
|
+
idleTimerRef.current = setTimeout(() => {
|
|
83
|
+
onCloseRef.current();
|
|
84
|
+
}, IDLE_TIMEOUT_MS);
|
|
85
|
+
return clear;
|
|
86
|
+
}, [state, isClosing]);
|
|
87
|
+
const handleTextSubmit = useCallback((text) => {
|
|
88
|
+
sendTextMessage(text);
|
|
89
|
+
}, [sendTextMessage]);
|
|
90
|
+
const isListening = state === 'LISTENING' || state === 'USER_SPEAKING';
|
|
91
|
+
return (_jsxs("div", { className: "flex flex-col items-center justify-center gap-6 h-full px-6", style: { pointerEvents: 'none' }, children: [_jsxs(motion.div, { initial: { opacity: 0, scale: 0.15 }, animate: isClosing
|
|
92
|
+
? { opacity: 0, scale: 0 }
|
|
93
|
+
: { opacity: isWindingDown ? 0.3 : 1, scale: isWindingDown ? 0.92 : 1 }, transition: isClosing
|
|
94
|
+
? { duration: 0.3, ease: EXIT_EASE, delay: 0.15 }
|
|
95
|
+
: isWindingDown
|
|
96
|
+
? { duration: WIND_DOWN_MS / 1000, ease: 'easeOut' }
|
|
97
|
+
: { ...SPRING_BOUNCY, delay: 0.1 }, className: "relative flex items-center justify-center", style: { width: orbSize + 100, height: orbSize + 100, pointerEvents: 'auto' }, children: [_jsx("div", { className: "absolute rounded-full", style: {
|
|
98
|
+
width: orbSize + 100,
|
|
99
|
+
height: orbSize + 100,
|
|
100
|
+
backdropFilter: 'blur(2px)',
|
|
101
|
+
WebkitBackdropFilter: 'blur(2px)',
|
|
102
|
+
filter: 'url(#liquid-glass-orb)',
|
|
103
|
+
isolation: 'isolate',
|
|
104
|
+
} }), _jsx("div", { className: "absolute rounded-full pointer-events-none", style: {
|
|
105
|
+
width: orbSize + 100,
|
|
106
|
+
height: orbSize + 100,
|
|
107
|
+
backgroundColor: 'rgba(255, 255, 255, 0.02)',
|
|
108
|
+
border: '1px solid rgba(255, 255, 255, 0.15)',
|
|
109
|
+
boxShadow: '0 6px 24px rgba(0, 0, 0, 0.08), inset 0 0 20px -5px rgba(255, 255, 255, 0.3)',
|
|
110
|
+
} }), _jsx("div", { className: "absolute rounded-full pointer-events-none", style: {
|
|
111
|
+
width: orbSize + 100,
|
|
112
|
+
height: orbSize + 100,
|
|
113
|
+
background: 'radial-gradient(ellipse 70% 40% at 50% 12%, rgba(255,255,255,0.2) 0%, transparent 55%)',
|
|
114
|
+
} }), _jsx(VoiceWaveformCanvas, { analyserNode: analyser, state: orbState, size: orbSize + 100 }), _jsx("div", { className: "absolute rounded-full", style: { width: orbSize, height: orbSize }, children: _jsx(VoiceOrb, { state: orbState, getAmplitude: getAmplitude, size: orbSize }) })] }), _jsx(motion.div, { initial: { opacity: 0, y: 24 }, animate: isClosing ? { opacity: 0, y: 16 } : { opacity: 1, y: 0 }, transition: isClosing
|
|
115
|
+
? { duration: 0.25, ease: EXIT_EASE, delay: 0.08 }
|
|
116
|
+
: { ...SPRING_SMOOTH, delay: 0.3 }, children: _jsx(VoiceTranscript, { messages: messages, isTyping: state === 'AI_SPEAKING' || isLLMLoading }) }), _jsx("div", { style: { pointerEvents: 'auto' }, children: _jsx(VoiceErrorDisplay, { error: voiceError, onDismiss: dismissError }) }), _jsx("div", { style: { pointerEvents: 'auto' }, children: _jsx(VoiceToolCard, { result: toolResult, onDismiss: () => setToolResult(null) }) }), _jsx(motion.div, { initial: { opacity: 0, y: 48 }, animate: isClosing ? { opacity: 0, y: 30 } : { opacity: 1, y: 0 }, transition: isClosing
|
|
117
|
+
? { duration: 0.25, ease: EXIT_EASE, delay: 0 }
|
|
118
|
+
: { ...SPRING_SMOOTH, delay: 0.4 }, className: "w-full", style: { pointerEvents: 'auto' }, children: _jsx(VoiceControls, { state: state, onTextSubmit: handleTextSubmit, isListening: isListening }) })] }));
|
|
119
|
+
}
|
|
120
|
+
function OverlayPortal({ isOpen, isClosing, onClose, onStateChange, isMobile, }) {
|
|
121
|
+
if (!isOpen)
|
|
122
|
+
return null;
|
|
123
|
+
return createPortal(_jsxs(_Fragment, { children: [_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", width: "0", height: "0", style: { position: 'absolute', overflow: 'hidden' }, "aria-hidden": "true", children: _jsx("defs", { children: _jsxs("filter", { id: "liquid-glass-orb", x: "0%", y: "0%", width: "100%", height: "100%", children: [_jsx("feTurbulence", { type: "fractalNoise", baseFrequency: "0.008 0.008", numOctaves: "2", seed: "92", result: "noise" }), _jsx("feGaussianBlur", { in: "noise", stdDeviation: "2", result: "blurred_noise" }), _jsx("feDisplacementMap", { in: "SourceGraphic", in2: "blurred_noise", scale: "50", xChannelSelector: "R", yChannelSelector: "G" })] }) }) }), _jsx(motion.div, { initial: { opacity: 0 }, animate: isClosing ? { opacity: 0 } : { opacity: 1 }, transition: {
|
|
124
|
+
duration: isClosing ? 0.35 : 0.4,
|
|
125
|
+
ease: 'easeOut',
|
|
126
|
+
delay: isClosing ? 0.2 : 0,
|
|
127
|
+
}, "aria-hidden": "true", style: {
|
|
128
|
+
position: 'fixed',
|
|
129
|
+
inset: 0,
|
|
130
|
+
zIndex: OVERLAY_Z,
|
|
131
|
+
pointerEvents: 'none',
|
|
132
|
+
backgroundColor: 'rgba(0, 0, 0, 0.15)',
|
|
133
|
+
} }, "voice-overlay-bg"), _jsx(motion.div, { initial: { opacity: 0, y: 80 }, animate: isClosing ? { opacity: 0, y: 60 } : { opacity: 1, y: 0 }, transition: isClosing
|
|
134
|
+
? { duration: 0.3, ease: EXIT_EASE, delay: 0.2 }
|
|
135
|
+
: { duration: 0.6, ease: [0.22, 1, 0.36, 1], delay: 0.05 }, "aria-hidden": "true", style: {
|
|
136
|
+
position: 'fixed',
|
|
137
|
+
bottom: 0,
|
|
138
|
+
left: 0,
|
|
139
|
+
right: 0,
|
|
140
|
+
height: '28rem',
|
|
141
|
+
zIndex: OVERLAY_Z,
|
|
142
|
+
pointerEvents: 'none',
|
|
143
|
+
background: 'linear-gradient(to top, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0.15) 40%, transparent 100%)',
|
|
144
|
+
} }, "voice-overlay-gradient"), _jsxs("div", { role: "dialog", "aria-label": "Voice Assistant", "aria-modal": "false", style: {
|
|
145
|
+
position: 'fixed',
|
|
146
|
+
inset: 0,
|
|
147
|
+
zIndex: OVERLAY_Z,
|
|
148
|
+
pointerEvents: 'none',
|
|
149
|
+
display: 'flex',
|
|
150
|
+
alignItems: 'center',
|
|
151
|
+
justifyContent: 'center',
|
|
152
|
+
}, children: [_jsx(motion.button, { initial: { opacity: 0, scale: 0.7 }, animate: isClosing ? { opacity: 0, scale: 0.7 } : { opacity: 1, scale: 1 }, transition: isClosing
|
|
153
|
+
? { duration: 0.2, ease: EXIT_EASE, delay: 0.06 }
|
|
154
|
+
: { ...SPRING_SMOOTH, delay: 0.35 }, onClick: onClose, className: "absolute top-6 right-6 flex items-center justify-center rounded-full transition-all duration-200 cursor-pointer hover:scale-110", style: {
|
|
155
|
+
pointerEvents: 'auto',
|
|
156
|
+
zIndex: OVERLAY_Z,
|
|
157
|
+
width: 44,
|
|
158
|
+
height: 44,
|
|
159
|
+
backgroundColor: 'rgba(255, 255, 255, 0.12)',
|
|
160
|
+
border: '1px solid rgba(255, 255, 255, 0.25)',
|
|
161
|
+
backdropFilter: 'blur(12px)',
|
|
162
|
+
WebkitBackdropFilter: 'blur(12px)',
|
|
163
|
+
color: 'rgba(255, 255, 255, 0.85)',
|
|
164
|
+
}, "aria-label": "Close voice assistant", children: _jsx(X, { className: "h-5 w-5" }) }), _jsx("div", { className: "w-full h-full", style: { pointerEvents: 'none' }, children: _jsx(WiredOverlayContent, { isMobile: isMobile, onClose: onClose, onStateChange: onStateChange, isClosing: isClosing }) })] })] }), document.body);
|
|
165
|
+
}
|
|
166
|
+
function useIsMobile(breakpoint = 768) {
|
|
167
|
+
const [isMobile, setIsMobile] = useState(() => window.matchMedia(`(max-width: ${breakpoint - 1}px)`).matches);
|
|
168
|
+
useEffect(() => {
|
|
169
|
+
const mql = window.matchMedia(`(max-width: ${breakpoint - 1}px)`);
|
|
170
|
+
const handler = (e) => setIsMobile(e.matches);
|
|
171
|
+
mql.addEventListener('change', handler);
|
|
172
|
+
return () => mql.removeEventListener('change', handler);
|
|
173
|
+
}, [breakpoint]);
|
|
174
|
+
return isMobile;
|
|
175
|
+
}
|
|
176
|
+
export default function VoiceOverlay({ isOpen, onClose, onStateChange }) {
|
|
177
|
+
const isMobile = useIsMobile();
|
|
178
|
+
const [isClosing, setIsClosing] = useState(false);
|
|
179
|
+
const closeTimerRef = useRef(null);
|
|
180
|
+
const handleClose = useCallback(() => {
|
|
181
|
+
if (isClosing)
|
|
182
|
+
return;
|
|
183
|
+
setIsClosing(true);
|
|
184
|
+
closeTimerRef.current = setTimeout(() => {
|
|
185
|
+
setIsClosing(false);
|
|
186
|
+
onClose();
|
|
187
|
+
}, EXIT_ANIMATION_MS);
|
|
188
|
+
}, [isClosing, onClose]);
|
|
189
|
+
useEffect(() => {
|
|
190
|
+
return () => {
|
|
191
|
+
if (closeTimerRef.current != null)
|
|
192
|
+
clearTimeout(closeTimerRef.current);
|
|
193
|
+
};
|
|
194
|
+
}, []);
|
|
195
|
+
if (!isOpen)
|
|
196
|
+
return null;
|
|
197
|
+
return (_jsx(VoiceErrorBoundary, { onReset: onClose, children: _jsx(OverlayPortal, { isOpen: isOpen, isClosing: isClosing, onClose: handleClose, onStateChange: onStateChange, isMobile: isMobile }) }));
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=VoiceOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VoiceOverlay.js","sourceRoot":"","sources":["../../src/components/VoiceOverlay.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
interface VoiceSettingsViewProps {
|
|
2
|
+
onBack: () => void;
|
|
3
|
+
onVolumeChange?: (v: number) => void;
|
|
4
|
+
}
|
|
5
|
+
export default function VoiceSettingsView({ onBack, onVolumeChange }: VoiceSettingsViewProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export {};
|
|
7
|
+
//# sourceMappingURL=VoiceSettingsView.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VoiceSettingsView.d.ts","sourceRoot":"","sources":["../../src/components/VoiceSettingsView.tsx"],"names":[],"mappings":"AAuBA,UAAU,sBAAsB;IAC9B,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAwID,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,sBAAsB,2CAoR3F"}
|