@100mslive/roomkit-react 0.1.4-alpha.1 → 0.1.4

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 (152) hide show
  1. package/dist/{HLSView-F2K5VSTS.js → HLSView-CTAJQUU4.js} +7 -11
  2. package/dist/{HLSView-F2K5VSTS.js.map → HLSView-CTAJQUU4.js.map} +1 -1
  3. package/dist/PinnedTrackView-CQKONH4O.js +102 -0
  4. package/dist/PinnedTrackView-CQKONH4O.js.map +7 -0
  5. package/dist/Popover/index.d.ts +1 -0
  6. package/dist/Prebuilt/App.d.ts +25 -0
  7. package/dist/Prebuilt/index.d.ts +1 -0
  8. package/dist/Prebuilt/provider/roomLayoutProvider/index.d.ts +1 -1
  9. package/dist/Sheet/Sheet.d.ts +3093 -0
  10. package/dist/Sheet/index.d.ts +1 -0
  11. package/dist/Theme/ThemeProvider.d.ts +4 -286
  12. package/dist/Theme/stitches.config.d.ts +1 -1
  13. package/dist/{VirtualBackground-S3XEPZ2T.js → VirtualBackground-GGGBJYVY.js} +31 -7
  14. package/dist/VirtualBackground-GGGBJYVY.js.map +7 -0
  15. package/dist/chunk-I2FJWE74.js +827 -0
  16. package/dist/chunk-I2FJWE74.js.map +7 -0
  17. package/dist/{chunk-42SWPN2C.js → chunk-L2SX7GBO.js} +3020 -2189
  18. package/dist/chunk-L2SX7GBO.js.map +7 -0
  19. package/dist/chunk-NOKIGB6Y.js +1100 -0
  20. package/dist/chunk-NOKIGB6Y.js.map +7 -0
  21. package/dist/chunk-TJNDX446.js +67 -0
  22. package/dist/chunk-TJNDX446.js.map +7 -0
  23. package/dist/{chunk-ESUJK7AT.js → conference-OEO7VOJD.js} +3136 -653
  24. package/dist/conference-OEO7VOJD.js.map +7 -0
  25. package/dist/index.cjs.js +15733 -15498
  26. package/dist/index.cjs.js.map +4 -4
  27. package/dist/index.js +4 -8
  28. package/dist/meta.cjs.json +3355 -3017
  29. package/dist/meta.esbuild.json +3534 -3329
  30. package/dist/utils/animations.d.ts +16 -0
  31. package/package.json +8 -10
  32. package/src/Button/Button.tsx +4 -4
  33. package/src/Dropdown/Dropdown.tsx +2 -2
  34. package/src/IconButton/IconButton.tsx +4 -2
  35. package/src/Pagination/StyledPagination.tsx +1 -0
  36. package/src/Popover/index.tsx +2 -1
  37. package/src/Prebuilt/{App.jsx → App.tsx} +95 -48
  38. package/src/Prebuilt/Prebuilt.stories.tsx +22 -8
  39. package/src/Prebuilt/common/constants.js +1 -2
  40. package/src/Prebuilt/common/hooks.js +8 -0
  41. package/src/Prebuilt/common/utils.js +15 -0
  42. package/src/Prebuilt/components/AppData/AppData.jsx +1 -2
  43. package/src/Prebuilt/components/AppData/useUISettings.js +0 -5
  44. package/src/Prebuilt/components/AudioVideoToggle.jsx +69 -26
  45. package/src/Prebuilt/components/AuthToken.jsx +3 -2
  46. package/src/Prebuilt/components/Chat/ChatSelector.jsx +1 -1
  47. package/src/Prebuilt/components/Connection/TileConnection.jsx +0 -1
  48. package/src/Prebuilt/components/EmojiReaction.jsx +23 -73
  49. package/src/Prebuilt/components/EndSessionContent.jsx +57 -0
  50. package/src/Prebuilt/components/EqualProminence.jsx +180 -0
  51. package/src/Prebuilt/components/ErrorBoundary.jsx +4 -10
  52. package/src/Prebuilt/components/Footer/EmojiCard.jsx +34 -0
  53. package/src/Prebuilt/components/Footer/Footer.jsx +73 -0
  54. package/src/Prebuilt/components/{Header → Footer}/ParticipantList.jsx +5 -5
  55. package/src/Prebuilt/components/Header/ConferencingHeader.jsx +27 -7
  56. package/src/Prebuilt/components/Header/HeaderComponents.jsx +16 -14
  57. package/src/Prebuilt/components/Header/StreamActions.jsx +101 -36
  58. package/src/Prebuilt/components/Header/StreamingHeader.jsx +1 -1
  59. package/src/Prebuilt/components/Header/common.jsx +164 -0
  60. package/src/Prebuilt/components/IconButtonWithOptions/IconButtonWithOptions.jsx +1 -2
  61. package/src/Prebuilt/components/LeaveCard.jsx +19 -0
  62. package/src/Prebuilt/components/LeaveRoom.jsx +35 -143
  63. package/src/Prebuilt/components/LeaveSessionContent.jsx +45 -0
  64. package/src/Prebuilt/components/MoreSettings/ActionTile.jsx +55 -0
  65. package/src/Prebuilt/components/MoreSettings/ChangeNameContent.jsx +96 -0
  66. package/src/Prebuilt/components/MoreSettings/ChangeNameModal.jsx +31 -54
  67. package/src/Prebuilt/components/MoreSettings/EmbedUrl.jsx +48 -73
  68. package/src/Prebuilt/components/MoreSettings/MoreSettings.jsx +5 -221
  69. package/src/Prebuilt/components/MoreSettings/MuteAllContent.jsx +61 -0
  70. package/src/Prebuilt/components/MoreSettings/MuteAllModal.jsx +32 -49
  71. package/src/Prebuilt/components/MoreSettings/SplitComponents/DesktopLeaveRoom.jsx +129 -0
  72. package/src/Prebuilt/components/MoreSettings/SplitComponents/DesktopOptions.jsx +219 -0
  73. package/src/Prebuilt/components/MoreSettings/SplitComponents/MwebLeaveRoom.jsx +100 -0
  74. package/src/Prebuilt/components/MoreSettings/SplitComponents/MwebOptions.jsx +259 -0
  75. package/src/Prebuilt/components/Notifications/Notifications.jsx +0 -2
  76. package/src/Prebuilt/components/Notifications/ReconnectNotifications.jsx +0 -4
  77. package/src/Prebuilt/components/PIP/PIPComponent.jsx +30 -26
  78. package/src/Prebuilt/components/PIP/PIPManager.js +13 -0
  79. package/src/Prebuilt/components/PIP/index.jsx +2 -7
  80. package/src/Prebuilt/components/Pagination.jsx +4 -4
  81. package/src/Prebuilt/components/Preview/PreviewContainer.jsx +5 -13
  82. package/src/Prebuilt/components/Preview/PreviewForm.jsx +9 -5
  83. package/src/Prebuilt/components/Preview/PreviewJoin.jsx +20 -27
  84. package/src/Prebuilt/components/RaiseHand.jsx +27 -0
  85. package/src/Prebuilt/components/ScreenShare.jsx +1 -1
  86. package/src/Prebuilt/components/ScreenshareDisplay.jsx +2 -2
  87. package/src/Prebuilt/components/ScreenshareTile.jsx +2 -2
  88. package/src/Prebuilt/components/Settings/DeviceSettings.jsx +2 -1
  89. package/src/Prebuilt/components/Settings/LayoutSettings.jsx +1 -24
  90. package/src/Prebuilt/components/Settings/SettingsModal.jsx +152 -17
  91. package/src/Prebuilt/components/ShareMenuIcon.jsx +1 -0
  92. package/src/Prebuilt/components/TileMenu/TileMenu.jsx +133 -0
  93. package/src/Prebuilt/components/TileMenu/TileMenuContent.jsx +313 -0
  94. package/src/Prebuilt/components/VideoList.jsx +5 -33
  95. package/src/Prebuilt/components/VideoTile.jsx +30 -8
  96. package/src/Prebuilt/components/conference.jsx +14 -1
  97. package/src/Prebuilt/components/init/Init.jsx +0 -27
  98. package/src/Prebuilt/components/init/initUtils.js +0 -23
  99. package/src/Prebuilt/components/pdfAnnotator/pdfFileOptions.jsx +2 -1
  100. package/src/Prebuilt/components/pdfAnnotator/pdfInfo.jsx +1 -1
  101. package/src/Prebuilt/components/pdfAnnotator/shareScreenOptions.jsx +19 -8
  102. package/src/Prebuilt/components/pdfAnnotator/uploadedFile.jsx +1 -0
  103. package/src/Prebuilt/images/pdf-share.png +0 -0
  104. package/src/Prebuilt/images/screen-share.png +0 -0
  105. package/src/Prebuilt/index.ts +1 -0
  106. package/src/Prebuilt/layouts/EmbedView.jsx +0 -1
  107. package/src/Prebuilt/layouts/InsetView.jsx +65 -24
  108. package/src/Prebuilt/layouts/PDFView.jsx +0 -1
  109. package/src/Prebuilt/layouts/SidePane.jsx +8 -7
  110. package/src/Prebuilt/layouts/mainView.jsx +22 -31
  111. package/src/Prebuilt/layouts/screenShareView.jsx +0 -2
  112. package/src/Prebuilt/plugins/VirtualBackground/VirtualBackground.jsx +25 -1
  113. package/src/Prebuilt/primitives/DialogContent.jsx +1 -1
  114. package/src/Prebuilt/provider/roomLayoutProvider/index.tsx +1 -1
  115. package/src/Sheet/Sheet.mdx +19 -0
  116. package/src/Sheet/Sheet.stories.tsx +103 -0
  117. package/src/Sheet/Sheet.tsx +118 -0
  118. package/src/Sheet/index.ts +1 -0
  119. package/src/Theme/ThemeProvider.tsx +10 -13
  120. package/src/Theme/base.config.ts +1 -1
  121. package/src/Theme/stitches.config.ts +1 -1
  122. package/src/TileMenu/StyledMenuTile.tsx +2 -2
  123. package/src/TileMenu/TileMenu.tsx +2 -0
  124. package/src/VideoTile/StyledVideoTile.tsx +5 -0
  125. package/src/utils/animations.ts +18 -0
  126. package/dist/ActiveSpeakerView-V6O4K3BV.js +0 -39
  127. package/dist/ActiveSpeakerView-V6O4K3BV.js.map +0 -7
  128. package/dist/PinnedTrackView-7YQG4QKC.js +0 -70
  129. package/dist/PinnedTrackView-7YQG4QKC.js.map +0 -7
  130. package/dist/VirtualBackground-S3XEPZ2T.js.map +0 -7
  131. package/dist/chunk-42SWPN2C.js.map +0 -7
  132. package/dist/chunk-4NEZLVVH.js +0 -811
  133. package/dist/chunk-4NEZLVVH.js.map +0 -7
  134. package/dist/chunk-4ZBEFSRC.js +0 -58
  135. package/dist/chunk-4ZBEFSRC.js.map +0 -7
  136. package/dist/chunk-ESUJK7AT.js.map +0 -7
  137. package/dist/chunk-R6PDR5WZ.js +0 -243
  138. package/dist/chunk-R6PDR5WZ.js.map +0 -7
  139. package/dist/conference-7QKOMJPP.js +0 -3697
  140. package/dist/conference-7QKOMJPP.js.map +0 -7
  141. package/dist/transcription-RJA4V6PC.js +0 -356
  142. package/dist/transcription-RJA4V6PC.js.map +0 -7
  143. package/src/Prebuilt/common/useSortedPeers.js +0 -28
  144. package/src/Prebuilt/components/BottomActionSheet/BottomActionSheet.jsx +0 -96
  145. package/src/Prebuilt/components/BottomActionSheet/BottomActionSheet.stories.tsx +0 -46
  146. package/src/Prebuilt/components/Footer/ConferencingFooter.jsx +0 -101
  147. package/src/Prebuilt/components/Footer/StreamingFooter.jsx +0 -71
  148. package/src/Prebuilt/components/Footer.jsx +0 -8
  149. package/src/Prebuilt/components/MoreSettings/ChangeSelfRole.jsx +0 -67
  150. package/src/Prebuilt/components/TileMenu.jsx +0 -268
  151. package/src/Prebuilt/index.d.ts +0 -20
  152. package/src/Prebuilt/index.js +0 -2
@@ -1,5 +1,4 @@
1
1
  import React, { Suspense, useCallback, useEffect } from 'react';
2
- import { JoinForm_JoinBtnType } from '@100mslive/types-prebuilt/elements/join_form';
3
2
  import {
4
3
  selectIsConnectedToRoom,
5
4
  selectLocalPeerRoleName,
@@ -7,26 +6,21 @@ import {
7
6
  selectPeerSharingAudio,
8
7
  selectPeerSharingVideoPlaylist,
9
8
  selectPermissions,
10
- selectTemplateAppData,
11
9
  useHMSActions,
12
10
  useHMSStore,
13
11
  useRecordingStreaming,
14
12
  } from '@100mslive/react-sdk';
13
+ import { EqualProminence } from '../components/EqualProminence';
15
14
  import FullPageProgress from '../components/FullPageProgress';
16
15
  import { Flex } from '../../Layout';
17
- import { useRoomLayout } from '../provider/roomLayoutProvider';
18
16
  import { EmbedView } from './EmbedView';
19
- import { InsetView } from './InsetView';
20
- import { MainGridView } from './mainGridView';
21
17
  import { PDFView } from './PDFView';
22
18
  import ScreenShareView from './screenShareView';
23
19
  import SidePane from './SidePane';
24
20
  import { WaitingView } from './WaitingView';
25
21
  import { useWhiteboardMetadata } from '../plugins/whiteboard';
26
- import { useAppConfig } from '../components/AppData/useAppConfig';
27
22
  import {
28
23
  useHLSViewerRole,
29
- useIsHeadless,
30
24
  usePDFAnnotator,
31
25
  usePinnedTrack,
32
26
  useSetAppDataByKey,
@@ -34,11 +28,11 @@ import {
34
28
  useUrlToEmbed,
35
29
  useWaitingViewerRole,
36
30
  } from '../components/AppData/useUISettings';
37
- import { APP_DATA, SESSION_STORE_KEY, UI_MODE_ACTIVE_SPEAKER } from '../common/constants';
31
+ import { useShowStreamingUI } from '../common/hooks';
32
+ import { APP_DATA, SESSION_STORE_KEY } from '../common/constants';
38
33
 
39
34
  // const WhiteboardView = React.lazy(() => import("./WhiteboardView"));
40
35
  const HLSView = React.lazy(() => import('./HLSView'));
41
- const ActiveSpeakerView = React.lazy(() => import('./ActiveSpeakerView'));
42
36
  const PinnedTrackView = React.lazy(() => import('./PinnedTrackView'));
43
37
 
44
38
  export const ConferenceMainView = () => {
@@ -49,21 +43,16 @@ export const ConferenceMainView = () => {
49
43
  const peerSharingPlaylist = useHMSStore(selectPeerSharingVideoPlaylist);
50
44
  const { whiteboardOwner: whiteboardShared } = useWhiteboardMetadata();
51
45
  const isConnected = useHMSStore(selectIsConnectedToRoom);
52
- const uiMode = useHMSStore(selectTemplateAppData).uiMode;
53
46
  const hmsActions = useHMSActions();
54
- const isHeadless = useIsHeadless();
55
- const headlessUIMode = useAppConfig('headlessConfig', 'uiMode');
56
- const { uiViewMode, isAudioOnly } = useUISettings();
47
+ const { isAudioOnly } = useUISettings();
57
48
  const hlsViewerRole = useHLSViewerRole();
58
49
  const waitingViewerRole = useWaitingViewerRole();
59
50
  const urlToIframe = useUrlToEmbed();
60
51
  const pdfAnnotatorActive = usePDFAnnotator();
61
-
62
52
  const { isHLSRunning } = useRecordingStreaming();
63
53
  const [isHLSStarted, setHLSStarted] = useSetAppDataByKey(APP_DATA.hlsStarted);
64
54
  const permissions = useHMSStore(selectPermissions);
65
- const roomLayout = useRoomLayout();
66
- const { join_form: joinForm = {} } = roomLayout?.screens?.preview?.default?.elements || {};
55
+ const showStreamingUI = useShowStreamingUI();
67
56
 
68
57
  const startHLS = useCallback(async () => {
69
58
  try {
@@ -73,6 +62,9 @@ export const ConferenceMainView = () => {
73
62
  setHLSStarted(true);
74
63
  await hmsActions.startHLSStreaming({});
75
64
  } catch (error) {
65
+ if (error.message === 'beam already started') {
66
+ return;
67
+ }
76
68
  if (error.message.includes('invalid input')) {
77
69
  await startHLS();
78
70
  return;
@@ -81,6 +73,17 @@ export const ConferenceMainView = () => {
81
73
  }
82
74
  }, [hmsActions, isHLSStarted, setHLSStarted]);
83
75
 
76
+ useEffect(() => {
77
+ if (!isConnected) {
78
+ return;
79
+ }
80
+ // Is a streaming kit and broadcaster joins
81
+ if (permissions?.hlsStreaming && !isHLSRunning && showStreamingUI) {
82
+ startHLS();
83
+ }
84
+ // eslint-disable-next-line react-hooks/exhaustive-deps
85
+ }, [isConnected]);
86
+
84
87
  useEffect(() => {
85
88
  if (!isConnected) {
86
89
  return;
@@ -94,17 +97,9 @@ export const ConferenceMainView = () => {
94
97
  hmsActions.audioPlaylist.setList(audioPlaylist);
95
98
  }
96
99
 
97
- // Is a streaming kit and broadcaster joins
98
- if (
99
- permissions?.hlsStreaming &&
100
- !isHLSRunning &&
101
- joinForm.join_btn_type === JoinForm_JoinBtnType.JOIN_BTN_TYPE_JOIN_AND_GO_LIVE
102
- ) {
103
- startHLS();
104
- }
105
-
106
100
  hmsActions.sessionStore.observe([SESSION_STORE_KEY.PINNED_MESSAGE, SESSION_STORE_KEY.SPOTLIGHT]);
107
- }, [isConnected, hmsActions, permissions, joinForm]);
101
+ // eslint-disable-next-line react-hooks/exhaustive-deps
102
+ }, [isConnected, hmsActions]);
108
103
 
109
104
  if (!localPeerRole) {
110
105
  // we don't know the role yet to decide how to render UI
@@ -122,16 +117,12 @@ export const ConferenceMainView = () => {
122
117
  ViewComponent = EmbedView;
123
118
  } else if (whiteboardShared) {
124
119
  // ViewComponent = WhiteboardView;
125
- } else if (uiMode === 'inset') {
126
- ViewComponent = InsetView;
127
120
  } else if (((peerSharing && peerSharing.id !== peerSharingAudio?.id) || peerSharingPlaylist) && !isAudioOnly) {
128
121
  ViewComponent = ScreenShareView;
129
122
  } else if (pinnedTrack) {
130
123
  ViewComponent = PinnedTrackView;
131
- } else if (uiViewMode === UI_MODE_ACTIVE_SPEAKER || (isHeadless && headlessUIMode === UI_MODE_ACTIVE_SPEAKER)) {
132
- ViewComponent = ActiveSpeakerView;
133
124
  } else {
134
- ViewComponent = MainGridView;
125
+ ViewComponent = EqualProminence;
135
126
  }
136
127
 
137
128
  return (
@@ -105,7 +105,6 @@ const ScreenShareComponent = ({ amIPresenting, peerPresenting, peerSharingPlayli
105
105
  return (
106
106
  <Box
107
107
  css={{
108
- mx: '$8',
109
108
  flex: '3 1 0',
110
109
  '@xl': {
111
110
  flex: '2 1 0',
@@ -123,7 +122,6 @@ const ScreenShareComponent = ({ amIPresenting, peerPresenting, peerSharingPlayli
123
122
  <Box
124
123
  css={{
125
124
  flex: '3 1 0',
126
- mx: '$8',
127
125
  '@xl': { ml: '$4', maxHeight: '80%', minHeight: 0 },
128
126
  }}
129
127
  >
@@ -9,6 +9,7 @@ import {
9
9
  useHMSStore,
10
10
  } from '@100mslive/react-sdk';
11
11
  import { VirtualBackgroundIcon } from '@100mslive/react-icons';
12
+ import { ActionTile } from '../../components/MoreSettings/ActionTile';
12
13
  import { Loading } from '../../../Loading';
13
14
  import { Tooltip } from '../../../Tooltip';
14
15
  import IconButton from '../../IconButton';
@@ -16,13 +17,19 @@ import { useIsFeatureEnabled } from '../../components/hooks/useFeatures';
16
17
  import { getRandomVirtualBackground } from './vbutils';
17
18
  import { FEATURE_LIST } from '../../common/constants';
18
19
 
19
- export const VirtualBackground = () => {
20
+ export const VirtualBackground = ({
21
+ asActionTile = false,
22
+ onVBClick = () => {
23
+ return;
24
+ },
25
+ }) => {
20
26
  const pluginRef = useRef(null);
21
27
  const hmsActions = useHMSActions();
22
28
  const isAllowedToPublish = useHMSStore(selectIsAllowedToPublish);
23
29
  const role = useHMSStore(selectLocalPeerRole);
24
30
  const [isVBLoading, setIsVBLoading] = useState(false);
25
31
  const [isVBSupported, setIsVBSupported] = useState(false);
32
+ const [isVBOn, setIsVBOn] = useState(false);
26
33
  const localPeerVideoTrackID = useHMSStore(selectLocalVideoTrackID);
27
34
  const isVBPresent = useHMSStore(selectIsLocalVideoPluginPresent('HMSVB'));
28
35
  const isFeatureEnabled = useIsFeatureEnabled(FEATURE_LIST.VIDEO_PLUGINS);
@@ -68,6 +75,23 @@ export const VirtualBackground = () => {
68
75
  if (!isAllowedToPublish.video || !isVBSupported || !isFeatureEnabled) {
69
76
  return null;
70
77
  }
78
+ if (asActionTile) {
79
+ return (
80
+ <ActionTile.Root
81
+ data-testid="virtual_bg_btn"
82
+ active={isVBPresent}
83
+ disabled={isVBLoading}
84
+ onClick={() => {
85
+ setIsVBOn(!isVBOn);
86
+ !isVBPresent ? addPlugin() : removePlugin();
87
+ onVBClick();
88
+ }}
89
+ >
90
+ <VirtualBackgroundIcon />
91
+ <ActionTile.Title>Virtual Background</ActionTile.Title>
92
+ </ActionTile.Root>
93
+ );
94
+ }
71
95
 
72
96
  return (
73
97
  <Tooltip
@@ -172,7 +172,7 @@ export const DialogInput = ({ title, value, onChange, placeholder, disabled, typ
172
172
  <DialogRow breakSm>
173
173
  <Label>{title}</Label>
174
174
  <Input
175
- css={{ width: '70%', '@sm': { width: '100%' } }}
175
+ css={{ width: '70%', '@sm': { width: '100%' }, bg: '$surface_bright' }}
176
176
  value={value}
177
177
  onChange={e => onChange(e.target.value)}
178
178
  placeholder={placeholder}
@@ -7,7 +7,7 @@ import { useFetchRoomLayout } from './hooks/useFetchRoomLayout';
7
7
 
8
8
  export type RoomLayoutProviderProps = {
9
9
  roomLayoutEndpoint?: string;
10
- overrideLayout?: Layout;
10
+ overrideLayout?: Partial<Layout>;
11
11
  };
12
12
 
13
13
  export const RoomLayoutContext = React.createContext<Layout | undefined>(undefined);
@@ -0,0 +1,19 @@
1
+ # Replacing DocsPage with custom `MDX` content
2
+
3
+ This file is a documentation-only `MDX`file to customize Storybook's [DocsPage](https://storybook.js.org/docs/react/writing-docs/docs-page#replacing-docspage).
4
+
5
+ It can be further expanded with your own code snippets and include specific information related to your stories.
6
+
7
+ For example:
8
+
9
+ import { Story } from '@storybook/addon-docs';
10
+
11
+ ## Sheet
12
+
13
+ Sheet is an hover component used to have a focus-mode like UI for users.
14
+
15
+ - [Example](#example)
16
+
17
+ ### Example
18
+
19
+ <Story id="sheet--example" />
@@ -0,0 +1,103 @@
1
+ import React from 'react';
2
+ import { ComponentMeta, ComponentStory } from '@storybook/react';
3
+ import { CrossIcon, InfoIcon } from '@100mslive/react-icons';
4
+ import { Button } from '../Button';
5
+ import { HorizontalDivider } from '../Divider';
6
+ import { Fieldset } from '../Fieldset';
7
+ import { Input } from '../Input';
8
+ import { Label } from '../Label';
9
+ import { Box, Flex } from '../Layout';
10
+ import { Text } from '../Text';
11
+ import { Sheet } from './Sheet';
12
+ import SheetDocs from './Sheet.mdx';
13
+
14
+ export default {
15
+ title: 'UI Components/Sheet',
16
+ component: Sheet.Root,
17
+ argTypes: { onClick: { action: 'clicked' } },
18
+ parameters: {
19
+ docs: {
20
+ page: SheetDocs,
21
+ },
22
+ },
23
+ } as ComponentMeta<typeof Sheet.Root>;
24
+
25
+ //👇 We create a “template” of how args map to rendering
26
+ const Template: ComponentStory<typeof Sheet.Root> = () => (
27
+ <Sheet.Root>
28
+ <Sheet.Trigger asChild>
29
+ <Button variant="standard">Open Sheet</Button>
30
+ </Sheet.Trigger>
31
+ <Sheet.Content>
32
+ <Sheet.Title css={{ p: '$10' }}>
33
+ <Flex direction="row" justify="between" css={{ w: '100%' }}>
34
+ <Flex justify="start" align="center" gap="3">
35
+ <InfoIcon />
36
+ <Text variant="h5">Sheet Heading</Text>
37
+ </Flex>
38
+ <Sheet.Close css={{ color: 'white' }}>
39
+ <CrossIcon />
40
+ </Sheet.Close>
41
+ </Flex>
42
+ </Sheet.Title>
43
+ <HorizontalDivider />
44
+ <Box as="div" css={{ p: '$10', overflowY: 'scroll', maxHeight: '70vh' }}>
45
+ <Text variant="body1" css={{ c: '$on_surface_medium' }}>
46
+ Body 2: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et
47
+ dolore magna aliqua. Ut enim ad minim veniam,im venitetur adipiscing elit, sed do eiusmod tempor incididunt ut
48
+ labore et dolore magna aliqua. Ut enim ad minim veniam,im veni
49
+ </Text>
50
+ <Fieldset>
51
+ <Label htmlFor="name">Name</Label>
52
+ <Input id="name" defaultValue="Amar" css={{ w: '50%' }} />
53
+ </Fieldset>
54
+ <Fieldset>
55
+ <Label htmlFor="username">Username</Label>
56
+ <Input id="username" defaultValue="@amar1995" css={{ w: '50%' }} />
57
+ </Fieldset>
58
+ <Text variant="body1" css={{ c: '$on_surface_medium' }}>
59
+ Body 2: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et
60
+ dolore magna aliqua. Ut enim ad minim veniam,im venitetur adipiscing elit, sed do eiusmod tempor incididunt ut
61
+ labore et dolore magna aliqua. Ut enim ad minim veniam,im veni
62
+ </Text>
63
+ <Fieldset>
64
+ <Label htmlFor="name">Name</Label>
65
+ <Input id="name" defaultValue="Amar" css={{ w: '50%' }} />
66
+ </Fieldset>
67
+ <Fieldset>
68
+ <Label htmlFor="username">Username</Label>
69
+ <Input id="username" defaultValue="@amar1995" css={{ w: '50%' }} />
70
+ </Fieldset>
71
+ <Text variant="body1" css={{ c: '$on_surface_medium' }}>
72
+ Body 2: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et
73
+ dolore magna aliqua. Ut enim ad minim veniam,im venitetur adipiscing elit, sed do eiusmod tempor incididunt ut
74
+ labore et dolore magna aliqua. Ut enim ad minim veniam,im veni
75
+ </Text>
76
+ <Fieldset>
77
+ <Label htmlFor="name">Name</Label>
78
+ <Input id="name" defaultValue="Amar" css={{ w: '50%' }} />
79
+ </Fieldset>
80
+ <Fieldset>
81
+ <Label htmlFor="username">Username</Label>
82
+ <Input id="username" defaultValue="@amar1995" css={{ w: '50%' }} />
83
+ </Fieldset>
84
+ <Text variant="body1" css={{ c: '$on_surface_medium' }}>
85
+ Body 2: Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et
86
+ dolore magna aliqua. Ut enim ad minim veniam,im venitetur adipiscing elit, sed do eiusmod tempor incididunt ut
87
+ labore et dolore magna aliqua. Ut enim ad minim veniam,im veni
88
+ </Text>
89
+ <Fieldset>
90
+ <Label htmlFor="name">Name</Label>
91
+ <Input id="name" defaultValue="Amar" css={{ w: '50%' }} />
92
+ </Fieldset>
93
+ <Fieldset>
94
+ <Label htmlFor="username">Username</Label>
95
+ <Input id="username" defaultValue="@amar1995" css={{ w: '50%' }} />
96
+ </Fieldset>
97
+ </Box>
98
+ </Sheet.Content>
99
+ </Sheet.Root>
100
+ );
101
+
102
+ export const Example = Template.bind({});
103
+ Example.storyName = 'Sheet';
@@ -0,0 +1,118 @@
1
+ import React from 'react';
2
+ import * as DialogPrimitive from '@radix-ui/react-dialog';
3
+ import { CSS, VariantProps } from '@stitches/react';
4
+ import { Dialog } from '../Modal';
5
+ import { styled } from '../Theme';
6
+ import { sheetFadeIn, sheetFadeOut, sheetSlideIn, sheetSlideOut } from '../utils';
7
+
8
+ const SheetRoot = styled(DialogPrimitive.Root, {
9
+ minHeight: '240px',
10
+ maxWidth: '100%',
11
+ });
12
+ const SheetTrigger = styled(DialogPrimitive.Trigger, {
13
+ appearance: 'none !important', // Needed for safari it shows white overlay
14
+ });
15
+
16
+ const StyledOverlay = styled(Dialog.Overlay, {
17
+ top: 0,
18
+ right: 0,
19
+ bottom: 0,
20
+ left: 0,
21
+
22
+ '&[data-state="open"]': {
23
+ animation: `${sheetFadeIn} 150ms cubic-bezier(0.22, 1, 0.36, 1)`,
24
+ },
25
+
26
+ '&[data-state="closed"]': {
27
+ animation: `${sheetFadeOut} 150ms cubic-bezier(0.22, 1, 0.36, 1)`,
28
+ },
29
+ });
30
+
31
+ const StyledContent = styled(DialogPrimitive.Content, {
32
+ color: '$on_surface_medium',
33
+ backgroundColor: '$surface_default',
34
+ borderTopLeftRadius: '$3',
35
+ borderTopRightRadius: '$3',
36
+ boxShadow: '0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23)',
37
+ position: 'fixed',
38
+ zIndex: 1001,
39
+ top: 0,
40
+ right: 0,
41
+ left: 0,
42
+ bottom: 0,
43
+ maxHeight: '96%',
44
+
45
+ // Among other things, prevents text alignment inconsistencies when dialog can't be centered in the viewport evenly.
46
+ // Affects animated and non-animated dialogs alike.
47
+ willChange: 'transform',
48
+
49
+ '&:focus': {
50
+ outline: 'none',
51
+ },
52
+ '@allowMotion': {
53
+ '&[data-state="open"]': {
54
+ animation: `${sheetSlideIn} 150ms cubic-bezier(0.22, 1, 0.36, 1)`,
55
+ },
56
+
57
+ '&[data-state="closed"]': {
58
+ animation: `${sheetSlideOut} 150ms cubic-bezier(0.22, 1, 0.36, 1)`,
59
+ },
60
+ },
61
+
62
+ variants: {
63
+ side: {
64
+ top: {
65
+ $$transformValue: 'translate3d(0,-100%,0)',
66
+ bottom: 'auto',
67
+ },
68
+ right: {
69
+ $$transformValue: 'translate3d(100%,0,0)',
70
+ right: 0,
71
+ },
72
+ bottom: {
73
+ $$transformValue: 'translate3d(0,100%,0)',
74
+ bottom: 0,
75
+ top: 'auto',
76
+ },
77
+ left: {
78
+ $$transformValue: 'translate3d(-100%,0,0)',
79
+ left: 0,
80
+ },
81
+ },
82
+ },
83
+
84
+ defaultVariants: {
85
+ side: 'bottom',
86
+ },
87
+ });
88
+
89
+ type SheetContentVariants = VariantProps<typeof StyledContent>;
90
+ type DialogContentPrimitiveProps = React.ComponentProps<typeof DialogPrimitive.Content>;
91
+ type SheetContentProps = DialogContentPrimitiveProps & SheetContentVariants & { css?: CSS };
92
+
93
+ const SheetContent = React.forwardRef<React.ElementRef<typeof StyledContent>, SheetContentProps>(
94
+ ({ children, ...props }, forwardedRef) => (
95
+ <Dialog.Portal>
96
+ <StyledOverlay />
97
+ <StyledContent {...props} ref={forwardedRef}>
98
+ {children}
99
+ </StyledContent>
100
+ </Dialog.Portal>
101
+ ),
102
+ );
103
+ const SheetClose = Dialog.Close;
104
+ const SheetTitle = styled(DialogPrimitive.Title, {
105
+ margin: 0,
106
+ });
107
+ const SheetDescription = Dialog.Description;
108
+ const SheetDefaultCloseIcon = Dialog.DefaultClose;
109
+
110
+ export const Sheet = {
111
+ Root: SheetRoot,
112
+ Trigger: SheetTrigger,
113
+ Content: SheetContent,
114
+ Description: SheetDescription,
115
+ Title: SheetTitle,
116
+ Close: SheetClose,
117
+ DefaultClose: SheetDefaultCloseIcon,
118
+ };
@@ -0,0 +1 @@
1
+ export { Sheet } from './Sheet';
@@ -14,7 +14,7 @@ export enum ThemeTypes {
14
14
  }
15
15
 
16
16
  export type ThemeContextValue = {
17
- themeType: ThemeTypes;
17
+ themeType: string;
18
18
  theme: Theme;
19
19
  aspectRatio: { width: number; height: number };
20
20
  /**
@@ -27,7 +27,7 @@ export type ThemeContextValue = {
27
27
  };
28
28
 
29
29
  export type ThemeProviderProps = {
30
- themeType?: ThemeTypes;
30
+ themeType?: string;
31
31
  theme?: Theme;
32
32
  aspectRatio?: { width: number; height: number };
33
33
  };
@@ -40,7 +40,7 @@ const defaultContext = {
40
40
  return;
41
41
  },
42
42
  };
43
- export const ThemeContext = React.createContext(defaultContext);
43
+ export const ThemeContext = React.createContext<ThemeContextValue>(defaultContext);
44
44
 
45
45
  /**
46
46
  * Wrap this around your root component to get access to theme
@@ -72,16 +72,13 @@ export const HMSThemeProvider: React.FC<React.PropsWithChildren<ThemeProviderPro
72
72
  return updatedTheme;
73
73
  }, [userTheme, currentTheme, isBrowser]);
74
74
 
75
- const toggleTheme = useCallback(
76
- (themeToUpdateTo?: ThemeTypes) => {
77
- if (themeToUpdateTo) {
78
- setCurrentTheme(themeToUpdateTo);
79
- return;
80
- }
81
- setCurrentTheme(ThemeTypes.default);
82
- },
83
- [currentTheme],
84
- );
75
+ const toggleTheme = useCallback((themeToUpdateTo?: ThemeTypes) => {
76
+ if (themeToUpdateTo) {
77
+ setCurrentTheme(themeToUpdateTo);
78
+ return;
79
+ }
80
+ setCurrentTheme(ThemeTypes.default);
81
+ }, []);
85
82
 
86
83
  useEffect(() => {
87
84
  if (themeType) {
@@ -123,7 +123,7 @@ export const baseConfig = {
123
123
  72: '18rem',
124
124
  80: '20rem',
125
125
  96: '24rem',
126
- 100: '27rem',
126
+ 100: '25rem',
127
127
  },
128
128
  borderWidths: {
129
129
  light: '1px',
@@ -82,7 +82,7 @@ export const createTheme = ({
82
82
  theme,
83
83
  className,
84
84
  }: {
85
- themeType: ThemeType;
85
+ themeType: string;
86
86
  className?: string;
87
87
  theme?: Partial<Theme>;
88
88
  }) => {
@@ -13,7 +13,7 @@ const StyledTrigger = styled(Popover.Trigger, {
13
13
  width: '$13',
14
14
  height: '$13',
15
15
  color: '$on_surface_high',
16
- borderRadius: '$round',
16
+ borderRadius: '$2',
17
17
  backgroundColor: '$surface_bright',
18
18
  cursor: 'pointer',
19
19
  border: 'none',
@@ -26,7 +26,7 @@ const StyledTrigger = styled(Popover.Trigger, {
26
26
 
27
27
  const StyledContent = styled(Popover.Content, {
28
28
  fontFamily: '$sans',
29
- backgroundColor: '$surface_bright',
29
+ backgroundColor: '$surface_dim',
30
30
  padding: '$5 0',
31
31
  display: 'flex',
32
32
  flexDirection: 'column',
@@ -33,6 +33,7 @@ export const TileMenu: React.FC<TileMenuProps> = ({ peerId }) => {
33
33
  const audioTrack = useHMSStore(selectAudioTrackByPeerID(peerId));
34
34
  const canMuteVideo = videoTrack?.enabled ? permissions?.mute : permissions?.unmute;
35
35
  const canMuteAudio = audioTrack?.enabled ? permissions?.mute : permissions?.unmute;
36
+
36
37
  const toggleTrackEnabled = async (track?: HMSTrack | null) => {
37
38
  if (track) {
38
39
  try {
@@ -55,6 +56,7 @@ export const TileMenu: React.FC<TileMenuProps> = ({ peerId }) => {
55
56
  <span>{`${videoTrack?.enabled ? 'Mute' : 'Unmute'} Video`}</span>
56
57
  </StyledMenuTile.ItemButton>
57
58
  ) : null}
59
+
58
60
  {canMuteAudio ? (
59
61
  <StyledMenuTile.ItemButton onClick={() => toggleTrackEnabled(audioTrack)}>
60
62
  {audioTrack?.enabled ? <MicOnIcon /> : <MicOffIcon />}
@@ -57,6 +57,11 @@ const Info = styled('div', {
57
57
  const AttributeBox = styled('div', {
58
58
  position: 'absolute',
59
59
  color: '$on_primary_high',
60
+ w: '$12',
61
+ h: '$12',
62
+ bg: '$secondary_dim',
63
+ r: '$round',
64
+ ...flexCenter,
60
65
  });
61
66
 
62
67
  const AudioIndicator = styled('div', {
@@ -34,6 +34,24 @@ export const slideRightAndFade = (start = '-2px') =>
34
34
  '100%': { opacity: 1, transform: 'translateX(0)' },
35
35
  });
36
36
 
37
+ export const sheetSlideIn = keyframes({
38
+ from: { transform: '$$transformValue' },
39
+ to: { transform: 'translate3d(0,0,0)' },
40
+ });
41
+
42
+ export const sheetSlideOut = keyframes({
43
+ from: { transform: 'translate3d(0,0,0)' },
44
+ to: { transform: '$$transformValue' },
45
+ });
46
+ export const sheetFadeIn = keyframes({
47
+ from: { opacity: '0' },
48
+ to: { opacity: '1' },
49
+ });
50
+
51
+ export const sheetFadeOut = keyframes({
52
+ from: { opacity: '1' },
53
+ to: { opacity: '0' },
54
+ });
37
55
  export const slideDownAndFade = (start = '-2px') =>
38
56
  keyframes({
39
57
  '0%': { opacity: 0, transform: `translateY(${start})` },
@@ -1,39 +0,0 @@
1
- import {
2
- GridSidePaneView,
3
- VideoTile_default
4
- } from "./chunk-ESUJK7AT.js";
5
- import "./chunk-42SWPN2C.js";
6
- import "./chunk-4ZBEFSRC.js";
7
- import {
8
- Box,
9
- Flex
10
- } from "./chunk-R6PDR5WZ.js";
11
- import {
12
- init_define_process_env
13
- } from "./chunk-4NEZLVVH.js";
14
-
15
- // src/Prebuilt/layouts/ActiveSpeakerView.jsx
16
- init_define_process_env();
17
- import React, { useRef } from "react";
18
- import { selectDominantSpeaker, selectPeers, useHMSStore } from "@100mslive/react-sdk";
19
- var ActiveSpeakerView = () => {
20
- const dominantSpeaker = useHMSStore(selectDominantSpeaker);
21
- const latestDominantSpeakerRef = useRef(dominantSpeaker);
22
- const peers = (useHMSStore(selectPeers) || []).filter(
23
- (peer) => peer.videoTrack || peer.audioTrack || peer.auxiliaryTracks.length > 0
24
- );
25
- if (dominantSpeaker) {
26
- latestDominantSpeakerRef.current = dominantSpeaker;
27
- }
28
- if (peers.length === 0) {
29
- return null;
30
- }
31
- const activeSpeaker = latestDominantSpeakerRef.current || peers[0];
32
- const showSidePane = activeSpeaker && peers.length > 1;
33
- return /* @__PURE__ */ React.createElement(Flex, { css: { size: "100%", "@lg": { flexDirection: "column" } } }, /* @__PURE__ */ React.createElement(Box, { css: { flex: "1 1 0 " } }, /* @__PURE__ */ React.createElement(VideoTile_default, { peerId: activeSpeaker.id, width: "100%", height: "100%" })), showSidePane && /* @__PURE__ */ React.createElement(GridSidePaneView, { peers: peers.filter((peer) => peer.id !== activeSpeaker.id) }));
34
- };
35
- var ActiveSpeakerView_default = ActiveSpeakerView;
36
- export {
37
- ActiveSpeakerView_default as default
38
- };
39
- //# sourceMappingURL=ActiveSpeakerView-V6O4K3BV.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/Prebuilt/layouts/ActiveSpeakerView.jsx"],
4
- "sourcesContent": ["import React, { useRef } from 'react';\nimport { selectDominantSpeaker, selectPeers, useHMSStore } from '@100mslive/react-sdk';\nimport { GridSidePaneView } from '../components/gridView';\nimport VideoTile from '../components/VideoTile';\nimport { Box, Flex } from '../../Layout';\n\nconst ActiveSpeakerView = () => {\n const dominantSpeaker = useHMSStore(selectDominantSpeaker);\n const latestDominantSpeakerRef = useRef(dominantSpeaker);\n const peers = (useHMSStore(selectPeers) || []).filter(\n peer => peer.videoTrack || peer.audioTrack || peer.auxiliaryTracks.length > 0,\n );\n // if there is no current dominant speaker latest keeps pointing to last\n if (dominantSpeaker) {\n latestDominantSpeakerRef.current = dominantSpeaker;\n }\n if (peers.length === 0) {\n return null;\n }\n // show local peer if there hasn't been any dominant speaker\n const activeSpeaker = latestDominantSpeakerRef.current || peers[0];\n const showSidePane = activeSpeaker && peers.length > 1;\n\n return (\n <Flex css={{ size: '100%', '@lg': { flexDirection: 'column' } }}>\n <Box css={{ flex: '1 1 0 ' }}>\n <VideoTile peerId={activeSpeaker.id} width=\"100%\" height=\"100%\" />\n </Box>\n {showSidePane && <GridSidePaneView peers={peers.filter(peer => peer.id !== activeSpeaker.id)} />}\n </Flex>\n );\n};\n\nexport default ActiveSpeakerView;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;AAAA;AAAA,OAAO,SAAS,cAAc;AAC9B,SAAS,uBAAuB,aAAa,mBAAmB;AAKhE,IAAM,oBAAoB,MAAM;AAC9B,QAAM,kBAAkB,YAAY,qBAAqB;AACzD,QAAM,2BAA2B,OAAO,eAAe;AACvD,QAAM,SAAS,YAAY,WAAW,KAAK,CAAC,GAAG;AAAA,IAC7C,UAAQ,KAAK,cAAc,KAAK,cAAc,KAAK,gBAAgB,SAAS;AAAA,EAC9E;AAEA,MAAI,iBAAiB;AACnB,6BAAyB,UAAU;AAAA,EACrC;AACA,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,yBAAyB,WAAW,MAAM,CAAC;AACjE,QAAM,eAAe,iBAAiB,MAAM,SAAS;AAErD,SACE,oCAAC,QAAK,KAAK,EAAE,MAAM,QAAQ,OAAO,EAAE,eAAe,SAAS,EAAE,KAC5D,oCAAC,OAAI,KAAK,EAAE,MAAM,SAAS,KACzB,oCAAC,qBAAU,QAAQ,cAAc,IAAI,OAAM,QAAO,QAAO,QAAO,CAClE,GACC,gBAAgB,oCAAC,oBAAiB,OAAO,MAAM,OAAO,UAAQ,KAAK,OAAO,cAAc,EAAE,GAAG,CAChG;AAEJ;AAEA,IAAO,4BAAQ;",
6
- "names": []
7
- }