@avatarfirst/react 0.1.0
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/README.md +75 -0
- package/dist/index.cjs +1731 -0
- package/dist/index.d.cts +430 -0
- package/dist/index.d.ts +430 -0
- package/dist/index.js +1674 -0
- package/package.json +42 -0
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,430 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import React__default, { ReactNode } from 'react';
|
|
4
|
+
import * as _avatarfirst_core from '@avatarfirst/core';
|
|
5
|
+
import { AvatarAgent as AvatarAgent$1, AvatarState, OverlayInstance, OverlayConfig, AvatarEngineEvents, AvatarFirstClientConfig, MessageResponse, SessionResponse, OverlayAnimation } from '@avatarfirst/core';
|
|
6
|
+
import { Variants } from 'framer-motion';
|
|
7
|
+
import { ClassValue } from 'clsx';
|
|
8
|
+
|
|
9
|
+
interface AvatarProviderProps {
|
|
10
|
+
/** AvatarAgent instance (from createAvatarAgent) */
|
|
11
|
+
agent: AvatarAgent$1;
|
|
12
|
+
/** Whether to auto-start the session on mount */
|
|
13
|
+
autoStart?: boolean;
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
}
|
|
16
|
+
/** Provider that syncs AvatarAgent state to React context */
|
|
17
|
+
declare function AvatarProvider({ agent, autoStart, children }: AvatarProviderProps): react_jsx_runtime.JSX.Element;
|
|
18
|
+
|
|
19
|
+
/** Context value provided by AvatarProvider */
|
|
20
|
+
interface AvatarContextValue {
|
|
21
|
+
/** The underlying AvatarAgent instance */
|
|
22
|
+
agent: AvatarAgent$1 | null;
|
|
23
|
+
/** Current avatar state */
|
|
24
|
+
state: AvatarState;
|
|
25
|
+
/** Whether the avatar is in an active state (connected, speaking, listening, thinking) */
|
|
26
|
+
isConnected: boolean;
|
|
27
|
+
/** Currently visible overlays */
|
|
28
|
+
overlays: OverlayInstance[];
|
|
29
|
+
}
|
|
30
|
+
declare const AvatarContext: React.Context<AvatarContextValue | null>;
|
|
31
|
+
|
|
32
|
+
/** Hook to access avatar state and controls */
|
|
33
|
+
declare function useAvatar(): {
|
|
34
|
+
agent: _avatarfirst_core.AvatarAgent | null;
|
|
35
|
+
state: _avatarfirst_core.AvatarState;
|
|
36
|
+
isConnected: boolean;
|
|
37
|
+
start: () => Promise<void>;
|
|
38
|
+
stop: () => Promise<void>;
|
|
39
|
+
speak: (text: string) => Promise<void>;
|
|
40
|
+
message: (text: string) => Promise<void>;
|
|
41
|
+
interrupt: () => Promise<void>;
|
|
42
|
+
startListening: () => void;
|
|
43
|
+
stopListening: () => void;
|
|
44
|
+
attachVideoElement: (el: HTMLVideoElement) => void;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/** Hook to manage overlays */
|
|
48
|
+
declare function useOverlay(overlayId?: string): {
|
|
49
|
+
overlays: _avatarfirst_core.OverlayInstance[];
|
|
50
|
+
isVisible: boolean;
|
|
51
|
+
overlayData: _avatarfirst_core.OverlayInstance | undefined;
|
|
52
|
+
show: (config: OverlayConfig) => void;
|
|
53
|
+
hide: (id?: string) => void;
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
/** Hook to subscribe to engine events */
|
|
57
|
+
declare function useAvatarEvent<K extends keyof AvatarEngineEvents>(event: K, handler: (data: AvatarEngineEvents[K]) => void): void;
|
|
58
|
+
|
|
59
|
+
/** Hook to trigger and toggle actions */
|
|
60
|
+
declare function useAction(): {
|
|
61
|
+
trigger: (actionId: string) => void;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
interface UseAvatarFirstOptions extends AvatarFirstClientConfig {
|
|
65
|
+
onOverlay?: (overlay: MessageResponse['overlay']) => void;
|
|
66
|
+
onAction?: (action: {
|
|
67
|
+
type: string;
|
|
68
|
+
payload: Record<string, unknown>;
|
|
69
|
+
}) => void;
|
|
70
|
+
onStateChange?: (state: AvatarFirstState) => void;
|
|
71
|
+
}
|
|
72
|
+
type AvatarFirstState = 'idle' | 'connecting' | 'connected' | 'error';
|
|
73
|
+
interface UseAvatarFirstReturn {
|
|
74
|
+
state: AvatarFirstState;
|
|
75
|
+
sessionId: string | null;
|
|
76
|
+
greeting: string | null;
|
|
77
|
+
avatarToken: SessionResponse['avatar'] | null;
|
|
78
|
+
overlays: MessageResponse['overlay'][];
|
|
79
|
+
isProcessing: boolean;
|
|
80
|
+
error: string | null;
|
|
81
|
+
connect: () => Promise<SessionResponse | null>;
|
|
82
|
+
sendMessage: (text: string) => Promise<MessageResponse | null>;
|
|
83
|
+
disconnect: () => void;
|
|
84
|
+
}
|
|
85
|
+
declare function useAvatarFirst(options: UseAvatarFirstOptions): UseAvatarFirstReturn;
|
|
86
|
+
|
|
87
|
+
interface AvatarAgentProps {
|
|
88
|
+
/** AvatarAgent instance (from createAvatarAgent) */
|
|
89
|
+
config: AvatarAgent$1;
|
|
90
|
+
/** Map of overlay component names to React components */
|
|
91
|
+
overlayComponents?: Record<string, React__default.ComponentType<any>>;
|
|
92
|
+
/** Whether to auto-start the session */
|
|
93
|
+
autoStart?: boolean;
|
|
94
|
+
children: ReactNode;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Top-level convenience component that wraps AvatarProvider + OverlayContainer.
|
|
98
|
+
*
|
|
99
|
+
* Usage:
|
|
100
|
+
* ```tsx
|
|
101
|
+
* <AvatarAgent config={agent} overlayComponents={{ card: CardOverlay }}>
|
|
102
|
+
* <AvatarView size="fullscreen" />
|
|
103
|
+
* </AvatarAgent>
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
declare function AvatarAgent({ config, overlayComponents, autoStart, children, }: AvatarAgentProps): react_jsx_runtime.JSX.Element;
|
|
107
|
+
|
|
108
|
+
interface AvatarFirstProps {
|
|
109
|
+
apiKey: string;
|
|
110
|
+
baseUrl?: string;
|
|
111
|
+
onOverlay?: (overlay: MessageResponse['overlay']) => void;
|
|
112
|
+
onAction?: (action: {
|
|
113
|
+
type: string;
|
|
114
|
+
payload: Record<string, unknown>;
|
|
115
|
+
}) => void;
|
|
116
|
+
onStateChange?: (state: string) => void;
|
|
117
|
+
className?: string;
|
|
118
|
+
overlayComponents?: Record<string, React__default.ComponentType<any>>;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* All-in-one AvatarFirst component.
|
|
122
|
+
*
|
|
123
|
+
* Usage:
|
|
124
|
+
* ```tsx
|
|
125
|
+
* import { AvatarFirst } from '@avatarfirst/react'
|
|
126
|
+
*
|
|
127
|
+
* function App() {
|
|
128
|
+
* return <AvatarFirst apiKey="af_live_abc123" />
|
|
129
|
+
* }
|
|
130
|
+
* ```
|
|
131
|
+
*/
|
|
132
|
+
declare function AvatarFirst({ apiKey, baseUrl, onOverlay, onAction, onStateChange, className, overlayComponents, }: AvatarFirstProps): react_jsx_runtime.JSX.Element;
|
|
133
|
+
|
|
134
|
+
interface AvatarViewProps {
|
|
135
|
+
/** Display size */
|
|
136
|
+
size?: 'small' | 'medium' | 'large' | 'fullscreen' | 'hero';
|
|
137
|
+
/** Whether to show the state indicator badge */
|
|
138
|
+
showStatus?: boolean;
|
|
139
|
+
/** Additional CSS class */
|
|
140
|
+
className?: string;
|
|
141
|
+
}
|
|
142
|
+
/** Streaming avatar display component */
|
|
143
|
+
declare function AvatarView({ size, showStatus, className }: AvatarViewProps): react_jsx_runtime.JSX.Element;
|
|
144
|
+
|
|
145
|
+
interface AvatarFallbackProps {
|
|
146
|
+
state: AvatarState;
|
|
147
|
+
size: string;
|
|
148
|
+
}
|
|
149
|
+
/** Animated face component -- fallback when HeyGen is not connected */
|
|
150
|
+
declare function AvatarFallback({ size, state }: AvatarFallbackProps): react_jsx_runtime.JSX.Element;
|
|
151
|
+
|
|
152
|
+
interface OverlayContainerProps {
|
|
153
|
+
/** Map of component names to React components */
|
|
154
|
+
components: Record<string, React__default.ComponentType<any>>;
|
|
155
|
+
}
|
|
156
|
+
/** Renders all visible overlays with AnimatePresence */
|
|
157
|
+
declare function OverlayContainer({ components }: OverlayContainerProps): react_jsx_runtime.JSX.Element;
|
|
158
|
+
|
|
159
|
+
interface CardOverlayData {
|
|
160
|
+
title?: string;
|
|
161
|
+
description?: string;
|
|
162
|
+
items?: Array<{
|
|
163
|
+
label: string;
|
|
164
|
+
value?: string;
|
|
165
|
+
icon?: string;
|
|
166
|
+
}>;
|
|
167
|
+
actions?: Array<{
|
|
168
|
+
label: string;
|
|
169
|
+
onClick?: () => void;
|
|
170
|
+
}>;
|
|
171
|
+
}
|
|
172
|
+
interface CardOverlayProps {
|
|
173
|
+
data?: CardOverlayData;
|
|
174
|
+
overlayId: string;
|
|
175
|
+
onDismiss: () => void;
|
|
176
|
+
}
|
|
177
|
+
/** Data card overlay with title, items, and action buttons */
|
|
178
|
+
declare function CardOverlay({ data, onDismiss }: CardOverlayProps): react_jsx_runtime.JSX.Element;
|
|
179
|
+
|
|
180
|
+
interface FormField {
|
|
181
|
+
name: string;
|
|
182
|
+
label: string;
|
|
183
|
+
type?: 'text' | 'email' | 'textarea' | 'select';
|
|
184
|
+
placeholder?: string;
|
|
185
|
+
options?: string[];
|
|
186
|
+
required?: boolean;
|
|
187
|
+
}
|
|
188
|
+
interface FormOverlayData {
|
|
189
|
+
title?: string;
|
|
190
|
+
fields?: FormField[];
|
|
191
|
+
submitLabel?: string;
|
|
192
|
+
onSubmit?: (values: Record<string, string>) => void;
|
|
193
|
+
}
|
|
194
|
+
interface FormOverlayProps {
|
|
195
|
+
data?: FormOverlayData;
|
|
196
|
+
overlayId: string;
|
|
197
|
+
onDismiss: () => void;
|
|
198
|
+
}
|
|
199
|
+
/** Dynamic form overlay */
|
|
200
|
+
declare function FormOverlay({ data, onDismiss }: FormOverlayProps): react_jsx_runtime.JSX.Element;
|
|
201
|
+
|
|
202
|
+
interface TableOverlayData {
|
|
203
|
+
title?: string;
|
|
204
|
+
columns?: string[];
|
|
205
|
+
rows?: string[][];
|
|
206
|
+
}
|
|
207
|
+
interface TableOverlayProps {
|
|
208
|
+
data?: TableOverlayData;
|
|
209
|
+
overlayId: string;
|
|
210
|
+
onDismiss: () => void;
|
|
211
|
+
}
|
|
212
|
+
/** Tabular data overlay */
|
|
213
|
+
declare function TableOverlay({ data, onDismiss }: TableOverlayProps): react_jsx_runtime.JSX.Element;
|
|
214
|
+
|
|
215
|
+
interface ProgressStep {
|
|
216
|
+
label: string;
|
|
217
|
+
completed: boolean;
|
|
218
|
+
active?: boolean;
|
|
219
|
+
}
|
|
220
|
+
interface ProgressOverlayData {
|
|
221
|
+
title?: string;
|
|
222
|
+
steps?: ProgressStep[];
|
|
223
|
+
}
|
|
224
|
+
interface ProgressOverlayProps {
|
|
225
|
+
data?: ProgressOverlayData;
|
|
226
|
+
overlayId: string;
|
|
227
|
+
onDismiss: () => void;
|
|
228
|
+
}
|
|
229
|
+
/** Step-by-step progress overlay */
|
|
230
|
+
declare function ProgressOverlay({ data, onDismiss }: ProgressOverlayProps): react_jsx_runtime.JSX.Element;
|
|
231
|
+
|
|
232
|
+
interface ConfirmOverlayData {
|
|
233
|
+
title?: string;
|
|
234
|
+
message?: string;
|
|
235
|
+
confirmLabel?: string;
|
|
236
|
+
cancelLabel?: string;
|
|
237
|
+
onConfirm?: () => void;
|
|
238
|
+
onCancel?: () => void;
|
|
239
|
+
}
|
|
240
|
+
interface ConfirmOverlayProps {
|
|
241
|
+
data?: ConfirmOverlayData;
|
|
242
|
+
overlayId: string;
|
|
243
|
+
onDismiss: () => void;
|
|
244
|
+
}
|
|
245
|
+
/** Yes/No confirmation overlay */
|
|
246
|
+
declare function ConfirmOverlay({ data, onDismiss }: ConfirmOverlayProps): react_jsx_runtime.JSX.Element;
|
|
247
|
+
|
|
248
|
+
interface ChatMessage {
|
|
249
|
+
id: string;
|
|
250
|
+
role: 'user' | 'assistant';
|
|
251
|
+
content: string;
|
|
252
|
+
timestamp?: string;
|
|
253
|
+
}
|
|
254
|
+
interface ChatOverlayData {
|
|
255
|
+
title?: string;
|
|
256
|
+
messages?: ChatMessage[];
|
|
257
|
+
suggestions?: string[];
|
|
258
|
+
}
|
|
259
|
+
interface ChatOverlayProps {
|
|
260
|
+
data?: ChatOverlayData;
|
|
261
|
+
overlayId: string;
|
|
262
|
+
onDismiss: () => void;
|
|
263
|
+
}
|
|
264
|
+
/** Chat messages overlay (from CopilotWidget pattern) */
|
|
265
|
+
declare function ChatOverlay({ data, onDismiss }: ChatOverlayProps): react_jsx_runtime.JSX.Element;
|
|
266
|
+
|
|
267
|
+
interface Insight {
|
|
268
|
+
type: 'recommendation' | 'comparison' | 'warning';
|
|
269
|
+
text: string;
|
|
270
|
+
confidence?: number;
|
|
271
|
+
}
|
|
272
|
+
interface InsightOverlayData {
|
|
273
|
+
title?: string;
|
|
274
|
+
subtitle?: string;
|
|
275
|
+
insights?: Insight[];
|
|
276
|
+
actions?: string[];
|
|
277
|
+
onAction?: (action: string) => void;
|
|
278
|
+
}
|
|
279
|
+
interface InsightOverlayProps {
|
|
280
|
+
data?: InsightOverlayData;
|
|
281
|
+
overlayId: string;
|
|
282
|
+
onDismiss: () => void;
|
|
283
|
+
}
|
|
284
|
+
/** AI insights overlay (from ShortlisterAgent pattern) */
|
|
285
|
+
declare function InsightOverlay({ data, onDismiss }: InsightOverlayProps): react_jsx_runtime.JSX.Element;
|
|
286
|
+
|
|
287
|
+
interface DetailCardOverlayData {
|
|
288
|
+
title?: string;
|
|
289
|
+
body?: string;
|
|
290
|
+
image?: string;
|
|
291
|
+
metadata?: Record<string, string>;
|
|
292
|
+
actions?: Array<{
|
|
293
|
+
label: string;
|
|
294
|
+
onClick?: () => void;
|
|
295
|
+
}>;
|
|
296
|
+
}
|
|
297
|
+
interface DetailCardOverlayProps {
|
|
298
|
+
data?: DetailCardOverlayData;
|
|
299
|
+
overlayId: string;
|
|
300
|
+
onDismiss: () => void;
|
|
301
|
+
}
|
|
302
|
+
/** Detailed single-entity view with image, body text, metadata, and actions */
|
|
303
|
+
declare function DetailCardOverlay({ data, onDismiss }: DetailCardOverlayProps): react_jsx_runtime.JSX.Element;
|
|
304
|
+
|
|
305
|
+
interface ComparisonItem {
|
|
306
|
+
name: string;
|
|
307
|
+
attributes: Record<string, string | number>;
|
|
308
|
+
}
|
|
309
|
+
interface ComparisonOverlayData {
|
|
310
|
+
title?: string;
|
|
311
|
+
items?: ComparisonItem[];
|
|
312
|
+
}
|
|
313
|
+
interface ComparisonOverlayProps {
|
|
314
|
+
data?: ComparisonOverlayData;
|
|
315
|
+
overlayId: string;
|
|
316
|
+
onDismiss: () => void;
|
|
317
|
+
}
|
|
318
|
+
/** Side-by-side comparison table for 2-4 items */
|
|
319
|
+
declare function ComparisonOverlay({ data, onDismiss }: ComparisonOverlayProps): react_jsx_runtime.JSX.Element;
|
|
320
|
+
|
|
321
|
+
interface TimeSlot {
|
|
322
|
+
date: string;
|
|
323
|
+
time: string;
|
|
324
|
+
available?: boolean;
|
|
325
|
+
}
|
|
326
|
+
interface CalendarOverlayData {
|
|
327
|
+
title?: string;
|
|
328
|
+
available_slots?: TimeSlot[];
|
|
329
|
+
onSelect?: (slot: TimeSlot) => void;
|
|
330
|
+
}
|
|
331
|
+
interface CalendarOverlayProps {
|
|
332
|
+
data?: CalendarOverlayData;
|
|
333
|
+
overlayId: string;
|
|
334
|
+
onDismiss: () => void;
|
|
335
|
+
}
|
|
336
|
+
/** Date/time picker with available slots grouped by date */
|
|
337
|
+
declare function CalendarOverlay({ data, onDismiss }: CalendarOverlayProps): react_jsx_runtime.JSX.Element;
|
|
338
|
+
|
|
339
|
+
interface MediaOverlayData {
|
|
340
|
+
title?: string;
|
|
341
|
+
url?: string;
|
|
342
|
+
type?: 'video' | 'audio' | 'image';
|
|
343
|
+
alt?: string;
|
|
344
|
+
autoplay?: boolean;
|
|
345
|
+
}
|
|
346
|
+
interface MediaOverlayProps {
|
|
347
|
+
data?: MediaOverlayData;
|
|
348
|
+
overlayId: string;
|
|
349
|
+
onDismiss: () => void;
|
|
350
|
+
}
|
|
351
|
+
/** Media player overlay for video, audio, or image content */
|
|
352
|
+
declare function MediaOverlay({ data, onDismiss }: MediaOverlayProps): react_jsx_runtime.JSX.Element;
|
|
353
|
+
|
|
354
|
+
interface MapLocation {
|
|
355
|
+
lat: number;
|
|
356
|
+
lng: number;
|
|
357
|
+
label?: string;
|
|
358
|
+
}
|
|
359
|
+
interface MapOverlayData {
|
|
360
|
+
title?: string;
|
|
361
|
+
locations?: MapLocation[];
|
|
362
|
+
}
|
|
363
|
+
interface MapOverlayProps {
|
|
364
|
+
data?: MapOverlayData;
|
|
365
|
+
overlayId: string;
|
|
366
|
+
onDismiss: () => void;
|
|
367
|
+
}
|
|
368
|
+
/** Location display with map links */
|
|
369
|
+
declare function MapOverlay({ data, onDismiss }: MapOverlayProps): react_jsx_runtime.JSX.Element;
|
|
370
|
+
|
|
371
|
+
interface RichTextOverlayData {
|
|
372
|
+
title?: string;
|
|
373
|
+
content?: string;
|
|
374
|
+
}
|
|
375
|
+
interface RichTextOverlayProps {
|
|
376
|
+
data?: RichTextOverlayData;
|
|
377
|
+
overlayId: string;
|
|
378
|
+
onDismiss: () => void;
|
|
379
|
+
}
|
|
380
|
+
/** Rich text / markdown display overlay */
|
|
381
|
+
declare function RichTextOverlay({ data, onDismiss }: RichTextOverlayProps): react_jsx_runtime.JSX.Element;
|
|
382
|
+
|
|
383
|
+
interface ChartSeries {
|
|
384
|
+
label: string;
|
|
385
|
+
value: number;
|
|
386
|
+
color?: string;
|
|
387
|
+
}
|
|
388
|
+
interface ChartOverlayData {
|
|
389
|
+
title?: string;
|
|
390
|
+
type?: 'bar' | 'line' | 'pie';
|
|
391
|
+
series?: ChartSeries[];
|
|
392
|
+
}
|
|
393
|
+
interface ChartOverlayProps {
|
|
394
|
+
data?: ChartOverlayData;
|
|
395
|
+
overlayId: string;
|
|
396
|
+
onDismiss: () => void;
|
|
397
|
+
}
|
|
398
|
+
/** Chart overlay with bar, line, or pie visualization using pure SVG */
|
|
399
|
+
declare function ChartOverlay({ data, onDismiss }: ChartOverlayProps): react_jsx_runtime.JSX.Element;
|
|
400
|
+
|
|
401
|
+
interface FileUploadOverlayData {
|
|
402
|
+
title?: string;
|
|
403
|
+
accept?: string[];
|
|
404
|
+
max_size?: number;
|
|
405
|
+
multiple?: boolean;
|
|
406
|
+
onUpload?: (files: File[]) => void;
|
|
407
|
+
}
|
|
408
|
+
interface FileUploadOverlayProps {
|
|
409
|
+
data?: FileUploadOverlayData;
|
|
410
|
+
overlayId: string;
|
|
411
|
+
onDismiss: () => void;
|
|
412
|
+
}
|
|
413
|
+
/** File upload overlay with drag-and-drop zone */
|
|
414
|
+
declare function FileUploadOverlay({ data, onDismiss }: FileUploadOverlayProps): react_jsx_runtime.JSX.Element;
|
|
415
|
+
|
|
416
|
+
declare const pageTransition: Variants;
|
|
417
|
+
declare const fadeIn: Variants;
|
|
418
|
+
declare const fadeInUp: Variants;
|
|
419
|
+
declare const cardHover: Variants;
|
|
420
|
+
declare const avatarPulse: Variants;
|
|
421
|
+
declare const staggerContainer: Variants;
|
|
422
|
+
declare const slideIn: Variants;
|
|
423
|
+
declare const scaleIn: Variants;
|
|
424
|
+
|
|
425
|
+
/** Map overlay animation names to framer-motion variants */
|
|
426
|
+
declare function getOverlayVariants(animation?: OverlayAnimation): Variants;
|
|
427
|
+
|
|
428
|
+
declare function cn(...inputs: ClassValue[]): string;
|
|
429
|
+
|
|
430
|
+
export { AvatarAgent, AvatarContext, type AvatarContextValue, AvatarFallback, AvatarFirst, type AvatarFirstProps, type AvatarFirstState, AvatarProvider, AvatarView, CalendarOverlay, CardOverlay, ChartOverlay, ChatOverlay, ComparisonOverlay, ConfirmOverlay, DetailCardOverlay, FileUploadOverlay, FormOverlay, InsightOverlay, MapOverlay, MediaOverlay, OverlayContainer, ProgressOverlay, RichTextOverlay, TableOverlay, type UseAvatarFirstOptions, type UseAvatarFirstReturn, avatarPulse, cardHover, cn, fadeIn, fadeInUp, getOverlayVariants, pageTransition, scaleIn, slideIn, staggerContainer, useAction, useAvatar, useAvatarEvent, useAvatarFirst, useOverlay };
|