@connectycube/react-ui-kit 0.0.14 → 0.0.16

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 (73) hide show
  1. package/configs/dependencies.json +8 -3
  2. package/configs/imports.json +3 -0
  3. package/dist/index.cjs +27 -1
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.js +27 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/tsconfig.tsbuildinfo +1 -1
  8. package/dist/types/components/alert-dialog.d.ts +28 -0
  9. package/dist/types/components/alert-dialog.d.ts.map +1 -0
  10. package/dist/types/components/animated-loader.d.ts +10 -0
  11. package/dist/types/components/animated-loader.d.ts.map +1 -0
  12. package/dist/types/components/avatar.d.ts +16 -0
  13. package/dist/types/components/avatar.d.ts.map +1 -0
  14. package/dist/types/components/button.d.ts +14 -0
  15. package/dist/types/components/button.d.ts.map +1 -0
  16. package/dist/types/components/dismiss-layer.d.ts +11 -0
  17. package/dist/types/components/dismiss-layer.d.ts.map +1 -0
  18. package/dist/types/components/placeholder-text.d.ts +9 -0
  19. package/dist/types/components/placeholder-text.d.ts.map +1 -0
  20. package/dist/types/components/presence.d.ts +22 -0
  21. package/dist/types/components/presence.d.ts.map +1 -0
  22. package/dist/types/components/status-indicator.d.ts +20 -0
  23. package/dist/types/components/status-indicator.d.ts.map +1 -0
  24. package/dist/types/components/stream-view.d.ts +28 -23
  25. package/dist/types/components/stream-view.d.ts.map +1 -1
  26. package/dist/types/components/utils.d.ts +2 -0
  27. package/dist/types/components/utils.d.ts.map +1 -1
  28. package/dist/types/index.d.ts +4 -2
  29. package/dist/types/index.d.ts.map +1 -1
  30. package/gen/components/alert-dialog.jsx +92 -0
  31. package/gen/components/avatar.jsx +8 -8
  32. package/gen/components/button.jsx +60 -0
  33. package/gen/components/dismiss-layer.jsx +3 -3
  34. package/gen/components/placeholder-text.jsx +3 -2
  35. package/gen/components/presence.jsx +49 -14
  36. package/gen/components/status-indicator.jsx +14 -21
  37. package/package.json +21 -16
  38. package/src/components/alert-dialog.tsx +116 -0
  39. package/src/components/animated-loader.tsx +1 -2
  40. package/src/components/avatar.tsx +12 -15
  41. package/src/components/button.tsx +60 -0
  42. package/src/components/dismiss-layer.tsx +4 -4
  43. package/src/components/placeholder-text.tsx +3 -3
  44. package/src/components/presence.tsx +50 -16
  45. package/src/components/status-indicator.tsx +22 -37
  46. package/src/components/stream-view.tsx +1 -2
  47. package/dist/types/components/connectycube-ui/stream-view.d.ts +0 -26
  48. package/dist/types/components/connectycube-ui/stream-view.d.ts.map +0 -1
  49. package/dist/types/components/connectycube-ui/utils.d.ts +0 -4
  50. package/dist/types/components/connectycube-ui/utils.d.ts.map +0 -1
  51. package/dist/types/lib/constants.d.ts +0 -5
  52. package/dist/types/lib/constants.d.ts.map +0 -1
  53. package/dist/types/lib/utils.d.ts +0 -4
  54. package/dist/types/lib/utils.d.ts.map +0 -1
  55. package/dist/types/templates/local-stream.d.ts +0 -22
  56. package/dist/types/templates/local-stream.d.ts.map +0 -1
  57. package/dist/types/templates/remote-stream.d.ts +0 -18
  58. package/dist/types/templates/remote-stream.d.ts.map +0 -1
  59. package/src/components/connectycube-ui/animated-loader.jsx +0 -10
  60. package/src/components/connectycube-ui/animated-loader.tsx +0 -15
  61. package/src/components/connectycube-ui/avatar.jsx +0 -34
  62. package/src/components/connectycube-ui/avatar.tsx +0 -45
  63. package/src/components/connectycube-ui/dismiss-layer.jsx +0 -57
  64. package/src/components/connectycube-ui/dismiss-layer.tsx +0 -74
  65. package/src/components/connectycube-ui/placeholder-text.jsx +0 -22
  66. package/src/components/connectycube-ui/placeholder-text.tsx +0 -28
  67. package/src/components/connectycube-ui/presence.jsx +0 -41
  68. package/src/components/connectycube-ui/presence.tsx +0 -55
  69. package/src/components/connectycube-ui/status-indicator.tsx +0 -100
  70. package/src/components/connectycube-ui/stream-view.jsx +0 -201
  71. package/src/components/connectycube-ui/stream-view.tsx +0 -246
  72. package/src/components/connectycube-ui/utils.js +0 -30
  73. package/src/components/connectycube-ui/utils.ts +0 -28
@@ -1,74 +0,0 @@
1
- import type React from 'react';
2
- import { useCallback, useEffect, useRef, useImperativeHandle, memo, forwardRef } from 'react';
3
- import { cn } from './utils';
4
-
5
- interface DismissLayerProps extends React.ComponentProps<'div'> {
6
- active: boolean;
7
- onDismiss: () => void;
8
- disableClickOutside?: boolean;
9
- disableEscKeyPress?: boolean;
10
- disabled?: boolean;
11
- }
12
-
13
- function DismissLayerBase(
14
- {
15
- active,
16
- onDismiss,
17
- disableClickOutside = false,
18
- disableEscKeyPress = false,
19
- disabled,
20
- className,
21
- ...props
22
- }: DismissLayerProps,
23
- ref: React.Ref<HTMLDivElement>
24
- ) {
25
- const innerRef = useRef<HTMLDivElement>(null);
26
-
27
- useImperativeHandle(ref, () => innerRef.current!);
28
-
29
- const handleClickOrTouch = useCallback(
30
- (e: React.MouseEvent | React.TouchEvent) => {
31
- if (!disableClickOutside && active && e.target === innerRef.current) {
32
- onDismiss();
33
- }
34
- },
35
- [disableClickOutside, active, onDismiss]
36
- );
37
- const handleKeyEvent = useCallback(
38
- (ev: KeyboardEvent) => {
39
- if (!disableEscKeyPress && active && ev.key === 'Escape') {
40
- onDismiss();
41
- }
42
- },
43
- [disableEscKeyPress, active, onDismiss]
44
- );
45
-
46
- useEffect(() => {
47
- if (!disableEscKeyPress && active) {
48
- document.addEventListener('keydown', handleKeyEvent);
49
-
50
- return () => document.removeEventListener('keydown', handleKeyEvent);
51
- }
52
-
53
- return;
54
- }, [disableEscKeyPress, active, handleKeyEvent]);
55
-
56
- if (disabled || !active) return null;
57
-
58
- return (
59
- <div
60
- ref={innerRef}
61
- onClick={handleClickOrTouch}
62
- onTouchStart={handleClickOrTouch}
63
- className={cn('fixed top-0 left-0 z-40 size-full bg-black/20', className)}
64
- aria-hidden
65
- {...props}
66
- />
67
- );
68
- }
69
-
70
- const DismissLayer = memo(forwardRef<HTMLDivElement, DismissLayerProps>(DismissLayerBase));
71
-
72
- DismissLayer.displayName = 'DismissLayer';
73
-
74
- export { DismissLayer, type DismissLayerProps };
@@ -1,22 +0,0 @@
1
- import { forwardRef, memo } from 'react';
2
- import { cn } from './utils';
3
-
4
- function PlaceholderTextBase({ title, titles = [], className }, ref) {
5
- const rows = typeof title === 'string' ? [title, ...titles] : titles;
6
-
7
- return (
8
- <div ref={ref} className={cn('absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2', className)}>
9
- {rows.map((row, index) => (
10
- <div key={`placeholder-text-${index}`} className="text-center">
11
- {row}
12
- </div>
13
- ))}
14
- </div>
15
- );
16
- }
17
-
18
- const PlaceholderText = memo(forwardRef(PlaceholderTextBase));
19
-
20
- PlaceholderText.displayName = 'PlaceholderText';
21
-
22
- export { PlaceholderText };
@@ -1,28 +0,0 @@
1
- import type React from 'react';
2
- import { forwardRef, memo } from 'react';
3
- import { cn } from './utils';
4
-
5
- interface PlaceholderTextProps extends React.ComponentProps<'div'> {
6
- title?: string;
7
- titles?: string[];
8
- }
9
-
10
- function PlaceholderTextBase({ title, titles = [], className }: PlaceholderTextProps, ref: React.Ref<HTMLDivElement>) {
11
- const rows = typeof title === 'string' ? [title, ...titles] : titles;
12
-
13
- return (
14
- <div ref={ref} className={cn('absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2', className)}>
15
- {rows.map((row, index) => (
16
- <div key={`placeholder-text-${index}`} className="text-center">
17
- {row}
18
- </div>
19
- ))}
20
- </div>
21
- );
22
- }
23
-
24
- const PlaceholderText = memo(forwardRef(PlaceholderTextBase));
25
-
26
- PlaceholderText.displayName = 'PlaceholderText';
27
-
28
- export { PlaceholderText, type PlaceholderTextProps };
@@ -1,41 +0,0 @@
1
- import { memo } from 'react';
2
- import { CircleCheck, CircleMinus, CircleQuestionMark, Clock } from 'lucide-react';
3
- import { capitalize, cn, UserPresence } from './utils';
4
-
5
- function PresenceBadgeBase({ presence, className, ...props }) {
6
- switch (presence) {
7
- case UserPresence.AVAILABLE || 'available':
8
- return <CircleCheck className={cn('rounded-full text-white bg-green-600 size-4.5', className)} {...props} />;
9
- case UserPresence.BUSY || 'busy':
10
- return <CircleMinus className={cn('rounded-full text-white bg-red-600 size-4.5', className)} {...props} />;
11
- case UserPresence.AWAY || 'away':
12
- return <Clock className={cn('rounded-full text-white bg-yellow-500 size-4.5', className)} {...props} />;
13
- case UserPresence.UNKNOWN || 'unknown':
14
- return (
15
- <CircleQuestionMark className={cn('rounded-full text-white bg-gray-500 size-4.5', className)} {...props} />
16
- );
17
- default:
18
- return null;
19
- }
20
- }
21
-
22
- const PresenceBadge = memo(PresenceBadgeBase);
23
-
24
- PresenceBadge.displayName = 'PresenceBadge';
25
-
26
- function PresenceBase({ badge = true, className, presence, label, ...props }) {
27
- const status = capitalize(label || presence);
28
-
29
- return (
30
- <div className={cn('flex items-center gap-2', className)} {...props}>
31
- {badge && <PresenceBadge presence={presence} />}
32
- <span>{status}</span>
33
- </div>
34
- );
35
- }
36
-
37
- const Presence = memo(PresenceBase);
38
-
39
- Presence.displayName = 'Presence';
40
-
41
- export { Presence, PresenceBadge };
@@ -1,55 +0,0 @@
1
- import type React from 'react';
2
- import type { LucideProps } from 'lucide-react';
3
- import { memo } from 'react';
4
- import { CircleCheck, CircleMinus, CircleQuestionMark, Clock } from 'lucide-react';
5
- import { capitalize, cn, UserPresence } from './utils';
6
-
7
- type PresenceStatus = UserPresence | 'available' | 'busy' | 'away' | 'unknown' | undefined;
8
-
9
- interface PresenceBadgeProps extends LucideProps {
10
- presence: PresenceStatus;
11
- }
12
-
13
- interface PresenceProps extends React.ComponentProps<'div'> {
14
- badge?: boolean;
15
- presence: PresenceStatus;
16
- label: string;
17
- }
18
-
19
- function PresenceBadgeBase({ presence, className, ...props }: PresenceBadgeProps) {
20
- switch (presence) {
21
- case UserPresence.AVAILABLE || 'available':
22
- return <CircleCheck className={cn('rounded-full text-white bg-green-600 size-4.5', className)} {...props} />;
23
- case UserPresence.BUSY || 'busy':
24
- return <CircleMinus className={cn('rounded-full text-white bg-red-600 size-4.5', className)} {...props} />;
25
- case UserPresence.AWAY || 'away':
26
- return <Clock className={cn('rounded-full text-white bg-yellow-500 size-4.5', className)} {...props} />;
27
- case UserPresence.UNKNOWN || 'unknown':
28
- return (
29
- <CircleQuestionMark className={cn('rounded-full text-white bg-gray-500 size-4.5', className)} {...props} />
30
- );
31
- default:
32
- return null;
33
- }
34
- }
35
-
36
- const PresenceBadge = memo(PresenceBadgeBase);
37
-
38
- PresenceBadge.displayName = 'PresenceBadge';
39
-
40
- function PresenceBase({ badge = true, className, presence, label, ...props }: PresenceProps) {
41
- const status = capitalize(label || presence);
42
-
43
- return (
44
- <div className={cn('flex items-center gap-2', className)} {...props}>
45
- {badge && <PresenceBadge presence={presence} />}
46
- <span>{status}</span>
47
- </div>
48
- );
49
- }
50
-
51
- const Presence = memo(PresenceBase);
52
-
53
- Presence.displayName = 'Presence';
54
-
55
- export { Presence, PresenceBadge, type PresenceStatus, type PresenceProps, type PresenceBadgeProps };
@@ -1,100 +0,0 @@
1
- import type React from 'react';
2
- import type {
3
- TooltipProviderProps,
4
- TooltipProps,
5
- TooltipTriggerProps,
6
- TooltipPortalProps,
7
- TooltipContentProps,
8
- TooltipArrowProps,
9
- } from '@radix-ui/react-tooltip';
10
- import { forwardRef, memo } from 'react';
11
- import {
12
- Provider as TooltipProvider,
13
- Root as TooltipRoot,
14
- Trigger as TooltipTrigger,
15
- Portal as TooltipPortal,
16
- Content as TooltipContent,
17
- Arrow as TooltipArrow,
18
- } from '@radix-ui/react-tooltip';
19
- import { cn } from './utils';
20
-
21
- type StatusName = string | 'unknown';
22
-
23
- interface StatusIndicatorProps extends React.ComponentProps<'div'> {
24
- status?: StatusName;
25
- statusColorConfig?: Record<StatusName, string>;
26
- statusProps?: React.ComponentProps<'div'>;
27
- tooltipProviderProps?: TooltipProviderProps;
28
- tooltipProps?: TooltipProps;
29
- tooltipTriggerProps?: TooltipTriggerProps;
30
- tooltipPortalProps?: TooltipPortalProps;
31
- tooltipContentProps?: TooltipContentProps;
32
- tooltipArrowProps?: TooltipArrowProps;
33
- tooltip?: string;
34
- disabled?: boolean;
35
- className?: string;
36
- }
37
-
38
- function StatusIndicatorBase(
39
- {
40
- status = 'unknown',
41
- statusColorConfig = { unknown: 'bg-gray-500 border-gray-600' },
42
- statusProps,
43
- tooltipProviderProps,
44
- tooltipProps,
45
- tooltipTriggerProps,
46
- tooltipPortalProps,
47
- tooltipContentProps,
48
- tooltipArrowProps,
49
- tooltip,
50
- disabled,
51
- className,
52
- ...props
53
- }: StatusIndicatorProps,
54
- ref: React.Ref<HTMLDivElement>
55
- ) {
56
- if (disabled) return null;
57
-
58
- return (
59
- <div ref={ref} {...props} className={cn('absolute top-0 left-0', className)}>
60
- <TooltipProvider {...tooltipProviderProps}>
61
- <TooltipRoot {...tooltipProps}>
62
- <TooltipTrigger asChild {...tooltipTriggerProps}>
63
- <div
64
- {...statusProps}
65
- className={cn(
66
- 'rounded-full size-4 border border-primary-foreground',
67
- statusColorConfig[status],
68
- statusProps?.className
69
- )}
70
- />
71
- </TooltipTrigger>
72
- <TooltipPortal {...tooltipPortalProps}>
73
- <TooltipContent
74
- {...tooltipContentProps}
75
- className={cn(
76
- 'bg-primary text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance',
77
- tooltipContentProps?.className
78
- )}
79
- >
80
- <span>{tooltip || status || 'unknown'}</span>
81
- <TooltipArrow
82
- {...tooltipArrowProps}
83
- className={cn(
84
- 'bg-primary fill-primary z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px]',
85
- tooltipArrowProps?.className
86
- )}
87
- />
88
- </TooltipContent>
89
- </TooltipPortal>
90
- </TooltipRoot>
91
- </TooltipProvider>
92
- </div>
93
- );
94
- }
95
-
96
- const StatusIndicator = memo(forwardRef(StatusIndicatorBase));
97
-
98
- StatusIndicator.displayName = 'StatusIndicator';
99
-
100
- export { StatusIndicator };
@@ -1,201 +0,0 @@
1
- import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
2
- import { Maximize, Minimize, PictureInPicture2 } from 'lucide-react';
3
- import { cn, getRandomString } from './utils';
4
-
5
- function StreamViewBase({ id, stream, mirror, className, muted, ...props }, ref) {
6
- const innerRef = useRef(null);
7
- const elementId = useMemo(() => id ?? `stream-${getRandomString()}`, [id]);
8
- const isMuted = typeof muted === 'boolean' ? muted : false;
9
- const defaultClassName = 'size-full object-contain';
10
- const mirrorClassName = mirror ? 'scale-x-[-1]' : '';
11
-
12
- useImperativeHandle(ref, () => innerRef.current);
13
-
14
- useEffect(() => {
15
- if (innerRef.current && stream) {
16
- innerRef.current.srcObject = stream;
17
-
18
- const playVideo = () => {
19
- try {
20
- innerRef.current?.play();
21
- } catch (error) {
22
- console.error('Error playing video:', error);
23
- }
24
- };
25
-
26
- innerRef.current.onloadedmetadata = () => {
27
- queueMicrotask(playVideo);
28
- };
29
- }
30
- }, [stream]);
31
-
32
- if (!stream) return null;
33
-
34
- return (
35
- <video
36
- ref={innerRef}
37
- id={elementId}
38
- autoPlay
39
- playsInline
40
- muted={isMuted}
41
- className={cn(defaultClassName, mirrorClassName, className)}
42
- {...props}
43
- />
44
- );
45
- }
46
-
47
- const StreamView = forwardRef(StreamViewBase);
48
-
49
- StreamView.displayName = 'StreamView';
50
-
51
- function LocalStreamViewBase({ muted, mirror, ...props }, ref) {
52
- const isMuted = typeof muted === 'boolean' ? muted : true;
53
- const isMirror = typeof mirror === 'boolean' ? mirror : true;
54
-
55
- return <StreamView ref={ref} muted={isMuted} mirror={isMirror} {...props} />;
56
- }
57
-
58
- const LocalStreamView = forwardRef(LocalStreamViewBase);
59
-
60
- LocalStreamView.displayName = 'LocalStreamView';
61
-
62
- function RemoteStreamViewBase({ muted, mirror, ...props }, ref) {
63
- const isMuted = typeof muted === 'boolean' ? muted : false;
64
- const isMirror = typeof mirror === 'boolean' ? mirror : false;
65
-
66
- return <StreamView ref={ref} muted={isMuted} mirror={isMirror} {...props} />;
67
- }
68
-
69
- const RemoteStreamView = forwardRef(RemoteStreamViewBase);
70
-
71
- RemoteStreamView.displayName = 'RemoteStreamView';
72
-
73
- function FullscreenStreamViewBase(
74
- {
75
- element,
76
- pipElement,
77
- navElement,
78
- hideIconElement,
79
- showIconElement,
80
- containerClassName,
81
- fullscreenButtonClassName,
82
- fullscreenButtonIconClassName,
83
- pipContainerClassName,
84
- pipButtonClassName,
85
- pipButtonIconClassName,
86
- containerProps,
87
- fullscreenButtonProps,
88
- fullscreenButtonIconProps,
89
- pipContainerProps,
90
- pipButtonProps,
91
- pipButtonIconProps,
92
- },
93
- ref
94
- ) {
95
- const innerRef = useRef(null);
96
- const [isFullscreen, setIsFullscreen] = useState(false);
97
- const [isPictureInPicture, setIsPictureInPicture] = useState(false);
98
- const toggleFullscreen = useCallback(async () => {
99
- const container = innerRef.current;
100
-
101
- if (!container) return;
102
-
103
- try {
104
- if (!document.fullscreenElement) {
105
- await container.requestFullscreen();
106
- setIsFullscreen(true);
107
- setIsPictureInPicture(true);
108
- } else {
109
- await document.exitFullscreen();
110
- setIsFullscreen(false);
111
- setIsPictureInPicture(false);
112
- }
113
- } catch (err) {
114
- console.error('Fullscreen error:', err);
115
- }
116
- }, []);
117
- const togglePictureInPicture = useCallback(() => {
118
- if (pipElement) {
119
- setIsPictureInPicture((prevState) => !prevState);
120
- }
121
- }, [pipElement]);
122
-
123
- useImperativeHandle(
124
- ref,
125
- () =>
126
- Object.assign(innerRef.current, {
127
- isFullscreen,
128
- isPictureInPicture,
129
- toggleFullscreen,
130
- togglePictureInPicture,
131
- }),
132
- [isFullscreen, isPictureInPicture, toggleFullscreen, togglePictureInPicture]
133
- );
134
-
135
- useEffect(() => {
136
- const onFullscreenChange = () => {
137
- setIsFullscreen(!!document.fullscreenElement);
138
- setIsPictureInPicture(!!document.fullscreenElement);
139
- };
140
-
141
- document.addEventListener('fullscreenchange', onFullscreenChange);
142
-
143
- return () => document.removeEventListener('fullscreenchange', onFullscreenChange);
144
- }, []);
145
-
146
- return (
147
- <div
148
- ref={innerRef}
149
- className={cn('relative flex items-center justify-center size-full', containerClassName)}
150
- {...containerProps}
151
- >
152
- {element}
153
- <button
154
- onClick={toggleFullscreen}
155
- className={cn(
156
- 'absolute top-2 right-2 p-1 rounded-md bg-black/50 text-white hover:bg-black/80 z-10 shadow-xs shadow-white/25',
157
- fullscreenButtonClassName
158
- )}
159
- {...fullscreenButtonProps}
160
- >
161
- {isFullscreen
162
- ? hideIconElement || <Minimize className={fullscreenButtonIconClassName} {...fullscreenButtonIconProps} />
163
- : showIconElement || <Maximize className={fullscreenButtonIconClassName} {...fullscreenButtonIconProps} />}
164
- </button>
165
- <div className="absolute size-full p-2 flex flex-col justify-end items-center">
166
- {isFullscreen && pipElement && (
167
- <div className="relative size-full flex items-end justify-end">
168
- {isPictureInPicture && (
169
- <div
170
- className={cn(
171
- 'max-w-1/4 max-h-1/4 aspect-4/3 overflow-hidden rounded-md shadow-md shadow-white/25',
172
- pipContainerClassName
173
- )}
174
- {...pipContainerProps}
175
- >
176
- {pipElement}
177
- </div>
178
- )}
179
- <button
180
- onClick={togglePictureInPicture}
181
- className={cn(
182
- 'absolute bottom-2 right-2 p-1 rounded-md bg-black/50 text-white hover:bg-black/80 z-10 shadow-xs shadow-white/25',
183
- pipButtonClassName
184
- )}
185
- {...pipButtonProps}
186
- >
187
- <PictureInPicture2 className={pipButtonIconClassName} {...pipButtonIconProps} />
188
- </button>
189
- </div>
190
- )}
191
- {isFullscreen && navElement}
192
- </div>
193
- </div>
194
- );
195
- }
196
-
197
- const FullscreenStreamView = forwardRef(FullscreenStreamViewBase);
198
-
199
- FullscreenStreamView.displayName = 'FullscreenStreamView';
200
-
201
- export { StreamView, LocalStreamView, RemoteStreamView, FullscreenStreamView };