@100mslive/roomkit-react 0.1.5 → 0.1.6-alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (232) hide show
  1. package/dist/{HLSView-P57IRMAR.js → HLSView-HNVYG5VE.js} +309 -151
  2. package/dist/HLSView-HNVYG5VE.js.map +7 -0
  3. package/dist/Prebuilt/App.d.ts +3 -0
  4. package/dist/Prebuilt/AppContext.d.ts +13 -0
  5. package/dist/Prebuilt/common/PeersSorter.d.ts +21 -0
  6. package/dist/Prebuilt/components/Chat/ChatFooter.d.ts +7 -0
  7. package/dist/Prebuilt/components/Connection/ConnectionIndicator.d.ts +6 -0
  8. package/dist/Prebuilt/components/Connection/TileConnection.d.ts +10 -0
  9. package/dist/Prebuilt/components/Footer/ChatToggle.d.ts +4 -0
  10. package/dist/Prebuilt/components/Footer/Footer.d.ts +6 -0
  11. package/dist/Prebuilt/components/Footer/RoleAccordion.d.ts +14 -0
  12. package/dist/Prebuilt/components/Footer/RoleOptions.d.ts +6 -0
  13. package/dist/Prebuilt/components/Header/Header.d.ts +2 -0
  14. package/dist/Prebuilt/components/Header/StreamActions.d.ts +11 -0
  15. package/dist/Prebuilt/components/InsetTile.d.ts +2 -0
  16. package/dist/Prebuilt/components/Leave/DesktopLeaveRoom.d.ts +8 -0
  17. package/dist/Prebuilt/components/Leave/EndSessionContent.d.ts +9 -0
  18. package/dist/Prebuilt/components/Leave/LeaveAtoms.d.ts +2196 -0
  19. package/dist/Prebuilt/components/Leave/LeaveCard.d.ts +11 -0
  20. package/dist/Prebuilt/components/Leave/LeaveRoom.d.ts +5 -0
  21. package/dist/Prebuilt/components/Leave/LeaveSessionContent.d.ts +8 -0
  22. package/dist/Prebuilt/components/Leave/MwebLeaveRoom.d.ts +8 -0
  23. package/dist/Prebuilt/components/MoreSettings/MoreSettings.d.ts +6 -0
  24. package/dist/Prebuilt/components/MoreSettings/SplitComponents/DesktopOptions.d.ts +6 -0
  25. package/dist/Prebuilt/components/MoreSettings/SplitComponents/MwebOptions.d.ts +6 -0
  26. package/dist/Prebuilt/components/Pagination.d.ts +6 -0
  27. package/dist/Prebuilt/components/Preview/PreviewContainer.d.ts +3 -0
  28. package/dist/Prebuilt/components/Preview/PreviewForm.d.ts +10 -0
  29. package/dist/Prebuilt/components/Preview/PreviewJoin.d.ts +16 -0
  30. package/dist/Prebuilt/components/RoleChangeRequestModal.d.ts +2 -0
  31. package/dist/Prebuilt/components/SecondaryTiles.d.ts +3 -0
  32. package/dist/Prebuilt/components/VideoLayouts/EqualProminence.d.ts +3 -0
  33. package/dist/Prebuilt/components/VideoLayouts/Grid.d.ts +6 -0
  34. package/dist/Prebuilt/components/VideoLayouts/GridLayout.d.ts +12 -0
  35. package/dist/Prebuilt/components/VideoLayouts/ProminenceLayout.d.ts +15 -0
  36. package/dist/Prebuilt/components/VideoLayouts/RoleProminence.d.ts +3 -0
  37. package/dist/Prebuilt/components/VideoLayouts/ScreenshareLayout.d.ts +3 -0
  38. package/dist/Prebuilt/components/VideoLayouts/interface.d.ts +9 -0
  39. package/dist/Prebuilt/components/hooks/useAutoStartStreaming.d.ts +1 -0
  40. package/dist/Prebuilt/components/hooks/useRedirectToLeave.d.ts +3 -0
  41. package/dist/Prebuilt/components/hooks/useRoleProminencePeers.d.ts +5 -0
  42. package/dist/Prebuilt/components/hooks/useTileLayout.d.ts +13 -0
  43. package/dist/Prebuilt/components/hooks/useVideoTileLayout.d.ts +13 -0
  44. package/dist/Prebuilt/layouts/SidePane.d.ts +9 -0
  45. package/dist/Prebuilt/layouts/VideoStreamingSection.d.ts +7 -0
  46. package/dist/Prebuilt/plugins/whiteboard/ToggleWhiteboard.d.ts +5 -0
  47. package/dist/Prebuilt/provider/roomLayoutProvider/hooks/useFetchRoomLayout.d.ts +1 -0
  48. package/dist/Prebuilt/provider/roomLayoutProvider/hooks/useInsetEnabled.d.ts +1 -0
  49. package/dist/Prebuilt/provider/roomLayoutProvider/hooks/useRoomLayoutScreen.d.ts +17 -0
  50. package/dist/Prebuilt/provider/roomLayoutProvider/index.d.ts +6 -1
  51. package/dist/{VirtualBackground-GGCQJ5JM.js → VirtualBackground-UM2FOUHQ.js} +5 -11
  52. package/dist/VirtualBackground-UM2FOUHQ.js.map +7 -0
  53. package/dist/{chunk-P5X32KOD.js → chunk-364HP22I.js} +8 -5
  54. package/dist/chunk-364HP22I.js.map +7 -0
  55. package/dist/{chunk-OSM4QEQG.js → chunk-LYSAET4G.js} +3742 -5462
  56. package/dist/chunk-LYSAET4G.js.map +7 -0
  57. package/dist/chunk-POE7H4IE.js +898 -0
  58. package/dist/chunk-POE7H4IE.js.map +7 -0
  59. package/dist/conference-UWLJHMB2.js +5727 -0
  60. package/dist/conference-UWLJHMB2.js.map +7 -0
  61. package/dist/index.cjs.js +9655 -15326
  62. package/dist/index.cjs.js.map +4 -4
  63. package/dist/index.js +2 -2
  64. package/dist/meta.cjs.json +2513 -3456
  65. package/dist/meta.esbuild.json +2807 -3838
  66. package/package.json +8 -7
  67. package/src/Button/Button.tsx +2 -2
  68. package/src/Prebuilt/App.tsx +58 -53
  69. package/src/Prebuilt/{AppContext.jsx → AppContext.tsx} +11 -3
  70. package/src/Prebuilt/IconButton.jsx +11 -0
  71. package/src/Prebuilt/Prebuilt.stories.tsx +1 -0
  72. package/src/Prebuilt/common/{PeersSorter.js → PeersSorter.ts} +16 -11
  73. package/src/Prebuilt/common/constants.js +4 -114
  74. package/src/Prebuilt/common/hooks.js +34 -1
  75. package/src/Prebuilt/common/utils.js +1 -9
  76. package/src/Prebuilt/components/AppData/AppData.jsx +11 -15
  77. package/src/Prebuilt/components/AppData/useUISettings.js +6 -10
  78. package/src/Prebuilt/components/AudioVideoToggle.jsx +10 -2
  79. package/src/Prebuilt/components/AuthToken.jsx +11 -42
  80. package/src/Prebuilt/components/Chat/Chat.jsx +75 -27
  81. package/src/Prebuilt/components/Chat/ChatBody.jsx +95 -36
  82. package/src/Prebuilt/components/Chat/ChatFooter.tsx +199 -0
  83. package/src/Prebuilt/components/Chat/ChatParticipantHeader.jsx +84 -0
  84. package/src/Prebuilt/components/Chat/ChatSelector.jsx +16 -17
  85. package/src/Prebuilt/components/Chat/ChatSelectorContainer.jsx +81 -0
  86. package/src/Prebuilt/components/Chat/useEmojiPickerStyles.js +5 -4
  87. package/src/Prebuilt/components/Connection/{ConnectionIndicator.jsx → ConnectionIndicator.tsx} +12 -4
  88. package/src/Prebuilt/components/Connection/TileConnection.tsx +71 -0
  89. package/src/Prebuilt/components/EmojiReaction.jsx +19 -22
  90. package/src/Prebuilt/components/Footer/{ChatToggle.jsx → ChatToggle.tsx} +13 -9
  91. package/src/Prebuilt/components/Footer/Footer.tsx +98 -0
  92. package/src/Prebuilt/components/Footer/ParticipantList.jsx +187 -179
  93. package/src/Prebuilt/components/Footer/RoleAccordion.tsx +94 -0
  94. package/src/Prebuilt/components/Footer/RoleOptions.tsx +155 -0
  95. package/src/Prebuilt/components/FullPageProgress.jsx +3 -3
  96. package/src/Prebuilt/components/HMSVideo/Controls.jsx +3 -2
  97. package/src/Prebuilt/components/HMSVideo/HLSQualitySelector.jsx +63 -18
  98. package/src/Prebuilt/components/HMSVideo/HMSVideo.jsx +2 -2
  99. package/src/Prebuilt/components/HMSVideo/PlayButton.jsx +1 -1
  100. package/src/Prebuilt/components/HMSVideo/VideoProgress.jsx +5 -6
  101. package/src/Prebuilt/components/HMSVideo/VideoTime.jsx +3 -3
  102. package/src/Prebuilt/components/HMSVideo/VolumeControl.jsx +38 -9
  103. package/src/Prebuilt/components/Header/{ConferencingHeader.jsx → Header.tsx} +9 -7
  104. package/src/Prebuilt/components/Header/HeaderComponents.jsx +13 -4
  105. package/src/Prebuilt/components/Header/{StreamActions.jsx → StreamActions.tsx} +54 -67
  106. package/src/Prebuilt/components/Header/common.jsx +5 -2
  107. package/src/Prebuilt/components/Header/index.tsx +1 -0
  108. package/src/Prebuilt/components/IconButtonWithOptions/IconButtonWithOptions.jsx +23 -4
  109. package/src/Prebuilt/components/InsetTile.tsx +128 -0
  110. package/src/Prebuilt/components/{MoreSettings/SplitComponents/DesktopLeaveRoom.jsx → Leave/DesktopLeaveRoom.tsx} +67 -25
  111. package/src/Prebuilt/components/{EndSessionContent.jsx → Leave/EndSessionContent.tsx} +18 -11
  112. package/src/Prebuilt/components/Leave/LeaveAtoms.tsx +26 -0
  113. package/src/Prebuilt/components/Leave/LeaveCard.tsx +36 -0
  114. package/src/Prebuilt/components/Leave/LeaveRoom.tsx +66 -0
  115. package/src/Prebuilt/components/{LeaveSessionContent.jsx → Leave/LeaveSessionContent.tsx} +20 -6
  116. package/src/Prebuilt/components/{MoreSettings/SplitComponents/MwebLeaveRoom.jsx → Leave/MwebLeaveRoom.tsx} +43 -18
  117. package/src/Prebuilt/components/MetaActions.jsx +15 -23
  118. package/src/Prebuilt/components/MoreSettings/ActionTile.jsx +5 -0
  119. package/src/Prebuilt/components/MoreSettings/ChangeNameContent.jsx +16 -7
  120. package/src/Prebuilt/components/MoreSettings/ChangeNameModal.jsx +1 -1
  121. package/src/Prebuilt/components/MoreSettings/FullScreenItem.jsx +1 -4
  122. package/src/Prebuilt/components/MoreSettings/MoreSettings.tsx +27 -0
  123. package/src/Prebuilt/components/MoreSettings/SplitComponents/DesktopOptions.tsx +216 -0
  124. package/src/Prebuilt/components/MoreSettings/SplitComponents/{MwebOptions.jsx → MwebOptions.tsx} +107 -45
  125. package/src/Prebuilt/components/Notifications/HLSFailureModal.jsx +3 -1
  126. package/src/Prebuilt/components/Notifications/Notifications.jsx +46 -30
  127. package/src/Prebuilt/components/Notifications/PeerNotifications.jsx +14 -2
  128. package/src/Prebuilt/components/Notifications/PermissionErrorModal.jsx +10 -4
  129. package/src/Prebuilt/components/Notifications/ReconnectNotifications.jsx +5 -11
  130. package/src/Prebuilt/components/PIP/PIPComponent.jsx +7 -16
  131. package/src/Prebuilt/components/PIP/PIPManager.js +1 -0
  132. package/src/Prebuilt/components/Pagination.tsx +60 -0
  133. package/src/Prebuilt/components/Playlist/Playlist.jsx +1 -6
  134. package/src/Prebuilt/components/PostLeave.jsx +7 -7
  135. package/src/Prebuilt/components/Preview/{PreviewContainer.jsx → PreviewContainer.tsx} +16 -15
  136. package/src/Prebuilt/components/Preview/{PreviewForm.jsx → PreviewForm.tsx} +16 -8
  137. package/src/Prebuilt/components/Preview/{PreviewJoin.jsx → PreviewJoin.tsx} +48 -22
  138. package/src/Prebuilt/components/RaiseHand.jsx +0 -7
  139. package/src/Prebuilt/components/RoleChangeRequestModal.tsx +119 -0
  140. package/src/Prebuilt/components/ScreenshareDisplay.jsx +4 -10
  141. package/src/Prebuilt/components/ScreenshareTile.jsx +43 -36
  142. package/src/Prebuilt/components/SecondaryTiles.tsx +36 -0
  143. package/src/Prebuilt/components/Settings/LayoutSettings.jsx +2 -12
  144. package/src/Prebuilt/components/Settings/NotificationSettings.jsx +3 -9
  145. package/src/Prebuilt/components/Settings/SettingsModal.jsx +3 -9
  146. package/src/Prebuilt/components/StatsForNerds.jsx +3 -1
  147. package/src/Prebuilt/components/TileMenu/TileMenu.jsx +16 -17
  148. package/src/Prebuilt/components/TileMenu/TileMenuContent.jsx +33 -27
  149. package/src/Prebuilt/components/Toast/ToastConfig.jsx +58 -15
  150. package/src/Prebuilt/components/VideoLayouts/EqualProminence.tsx +65 -0
  151. package/src/Prebuilt/components/VideoLayouts/Grid.tsx +43 -0
  152. package/src/Prebuilt/components/VideoLayouts/GridLayout.tsx +110 -0
  153. package/src/Prebuilt/components/VideoLayouts/ProminenceLayout.tsx +74 -0
  154. package/src/Prebuilt/components/VideoLayouts/RoleProminence.tsx +59 -0
  155. package/src/Prebuilt/components/VideoLayouts/ScreenshareLayout.tsx +52 -0
  156. package/src/Prebuilt/components/VideoLayouts/interface.ts +10 -0
  157. package/src/Prebuilt/components/VideoTile.jsx +116 -74
  158. package/src/Prebuilt/components/conference.jsx +86 -85
  159. package/src/Prebuilt/components/hooks/useAutoStartStreaming.tsx +57 -0
  160. package/src/Prebuilt/components/hooks/useMetadata.jsx +19 -3
  161. package/src/Prebuilt/components/hooks/useRedirectToLeave.tsx +34 -0
  162. package/src/Prebuilt/components/hooks/useRoleProminencePeers.tsx +38 -0
  163. package/src/Prebuilt/components/hooks/useTileLayout.tsx +127 -0
  164. package/src/Prebuilt/components/hooks/useVideoTileLayout.ts +26 -0
  165. package/src/Prebuilt/components/pdfAnnotator/pdfFileOptions.jsx +5 -72
  166. package/src/Prebuilt/components/pdfAnnotator/submitPdf.jsx +4 -45
  167. package/src/Prebuilt/components/pdfAnnotator/uploadedFile.jsx +2 -17
  168. package/src/Prebuilt/components/peerTileUtils.jsx +1 -1
  169. package/src/Prebuilt/images/empty-chat.svg +12 -0
  170. package/src/Prebuilt/layouts/EmbedView.jsx +17 -50
  171. package/src/Prebuilt/layouts/HLSView.jsx +138 -51
  172. package/src/Prebuilt/layouts/PDFView.jsx +1 -11
  173. package/src/Prebuilt/layouts/SidePane.tsx +108 -0
  174. package/src/Prebuilt/layouts/VideoStreamingSection.tsx +96 -0
  175. package/src/Prebuilt/layouts/WhiteboardView.jsx +10 -34
  176. package/src/Prebuilt/plugins/FlyingEmoji.jsx +14 -2
  177. package/src/Prebuilt/plugins/VirtualBackground/VirtualBackground.jsx +1 -4
  178. package/src/Prebuilt/plugins/whiteboard/{ToggleWhiteboard.jsx → ToggleWhiteboard.tsx} +5 -9
  179. package/src/Prebuilt/primitives/DialogContent.jsx +15 -11
  180. package/src/Prebuilt/provider/roomLayoutProvider/constants/index.ts +17 -2
  181. package/src/Prebuilt/provider/roomLayoutProvider/hooks/useFetchRoomLayout.ts +36 -13
  182. package/src/Prebuilt/provider/roomLayoutProvider/hooks/useInsetEnabled.ts +10 -0
  183. package/src/Prebuilt/provider/roomLayoutProvider/hooks/useRoomLayoutScreen.ts +65 -0
  184. package/src/Prebuilt/provider/roomLayoutProvider/index.tsx +17 -6
  185. package/src/Prebuilt/services/FeatureFlags.jsx +0 -1
  186. package/src/VideoTile/StyledVideoTile.tsx +1 -0
  187. package/dist/HLSView-P57IRMAR.js.map +0 -7
  188. package/dist/PinnedTrackView-4FYJEBTB.js +0 -102
  189. package/dist/PinnedTrackView-4FYJEBTB.js.map +0 -7
  190. package/dist/VirtualBackground-GGCQJ5JM.js.map +0 -7
  191. package/dist/chunk-IVTWKQI3.js +0 -827
  192. package/dist/chunk-IVTWKQI3.js.map +0 -7
  193. package/dist/chunk-OSM4QEQG.js.map +0 -7
  194. package/dist/chunk-P5X32KOD.js.map +0 -7
  195. package/dist/chunk-RVCZPPTL.js +0 -1100
  196. package/dist/chunk-RVCZPPTL.js.map +0 -7
  197. package/dist/conference-P6I6ESVF.js +0 -8995
  198. package/dist/conference-P6I6ESVF.js.map +0 -7
  199. package/src/Prebuilt/components/AudioLevel/BeamSpeakerLabelsLogging.jsx +0 -16
  200. package/src/Prebuilt/components/Chat/ChatFooter.jsx +0 -150
  201. package/src/Prebuilt/components/Chat/ChatHeader.jsx +0 -67
  202. package/src/Prebuilt/components/Connection/TileConnection.jsx +0 -39
  203. package/src/Prebuilt/components/EqualProminence.jsx +0 -180
  204. package/src/Prebuilt/components/FirstPersonDisplay.jsx +0 -50
  205. package/src/Prebuilt/components/Footer/Footer.jsx +0 -73
  206. package/src/Prebuilt/components/Header/Header.jsx +0 -8
  207. package/src/Prebuilt/components/Header/StreamingHeader.jsx +0 -54
  208. package/src/Prebuilt/components/LeaveCard.jsx +0 -19
  209. package/src/Prebuilt/components/LeaveRoom.jsx +0 -94
  210. package/src/Prebuilt/components/MoreSettings/MoreSettings.jsx +0 -10
  211. package/src/Prebuilt/components/MoreSettings/SplitComponents/DesktopOptions.jsx +0 -219
  212. package/src/Prebuilt/components/Notifications/MessageNotifications.jsx +0 -25
  213. package/src/Prebuilt/components/Pagination.jsx +0 -29
  214. package/src/Prebuilt/components/RoleChangeRequestModal.jsx +0 -26
  215. package/src/Prebuilt/components/VideoList.jsx +0 -73
  216. package/src/Prebuilt/components/gridView.jsx +0 -85
  217. package/src/Prebuilt/components/hooks/useFeatures.js +0 -22
  218. package/src/Prebuilt/components/hooks/useNavigation.js +0 -19
  219. package/src/Prebuilt/components/hooks/useSkipPreview.jsx +0 -20
  220. package/src/Prebuilt/components/pdfAnnotator/pdfErrorView.jsx +0 -29
  221. package/src/Prebuilt/images/Logo.svg +0 -8
  222. package/src/Prebuilt/layouts/ActiveSpeakerView.jsx +0 -34
  223. package/src/Prebuilt/layouts/InsetView.jsx +0 -260
  224. package/src/Prebuilt/layouts/PinnedTrackView.jsx +0 -59
  225. package/src/Prebuilt/layouts/SidePane.jsx +0 -52
  226. package/src/Prebuilt/layouts/mainGridView.jsx +0 -98
  227. package/src/Prebuilt/layouts/mainView.jsx +0 -141
  228. package/src/Prebuilt/layouts/screenShareView.jsx +0 -183
  229. /package/{src/Prebuilt/components/Header/index.jsx → dist/Prebuilt/components/Header/index.d.ts} +0 -0
  230. /package/src/Prebuilt/components/{ScreenShare.jsx → ScreenShareToggle.jsx} +0 -0
  231. /package/src/{assets → Prebuilt/images}/android-perm-1.png +0 -0
  232. /package/src/{assets → Prebuilt/images}/ios-perm-0.png +0 -0
@@ -11,28 +11,31 @@ import {
11
11
  useRecordingStreaming,
12
12
  } from '@100mslive/react-sdk';
13
13
  import { AlertTriangleIcon, CrossIcon, RecordIcon } from '@100mslive/react-icons';
14
- import { Box, Button, config as cssConfig, Flex, HorizontalDivider, Loading, Popover, Text, Tooltip } from '../../../';
14
+ import { Box, Button, config as cssConfig, Flex, HorizontalDivider, Loading, Popover, Text, Tooltip } from '../../..';
15
15
  import { Sheet } from '../../../Sheet';
16
- import { ResolutionInput } from '../Streaming/ResolutionInput';
17
- import { getResolution } from '../Streaming/RTMPStreaming';
16
+ // @ts-ignore
18
17
  import { ToastManager } from '../Toast/ToastManager';
18
+ // @ts-ignore
19
19
  import { AdditionalRoomState, getRecordingText } from './AdditionalRoomState';
20
+ // @ts-ignore
20
21
  import { useSetAppDataByKey } from '../AppData/useUISettings';
22
+ // @ts-ignore
21
23
  import { formatTime } from '../../common/utils';
22
- import { APP_DATA, RTMP_RECORD_DEFAULT_RESOLUTION } from '../../common/constants';
24
+ // @ts-ignore
25
+ import { APP_DATA } from '../../common/constants';
23
26
 
24
27
  export const LiveStatus = () => {
25
28
  const { isHLSRunning, isRTMPRunning } = useRecordingStreaming();
26
29
  const hlsState = useHMSStore(selectHLSState);
27
30
  const isMobile = useMedia(cssConfig.media.md);
28
- const intervalRef = useRef(null);
31
+ const intervalRef = useRef<NodeJS.Timeout | null>(null);
29
32
 
30
33
  const [liveTime, setLiveTime] = useState(0);
31
34
 
32
35
  const startTimer = useCallback(() => {
33
36
  intervalRef.current = setInterval(() => {
34
- if (hlsState?.running) {
35
- setLiveTime(Date.now() - hlsState?.variants[0]?.startedAt.getTime());
37
+ if (hlsState?.running && hlsState?.variants[0]?.startedAt) {
38
+ setLiveTime(Date.now() - hlsState.variants[0].startedAt.getTime());
36
39
  }
37
40
  }, 1000);
38
41
  }, [hlsState?.running, hlsState?.variants]);
@@ -92,6 +95,7 @@ export const RecordingStatus = () => {
92
95
 
93
96
  return (
94
97
  <Tooltip
98
+ boxCss={{ zIndex: 1 }}
95
99
  title={getRecordingText({
96
100
  isBrowserRecordingOn,
97
101
  isServerRecordingOn,
@@ -112,7 +116,6 @@ export const RecordingStatus = () => {
112
116
 
113
117
  const StartRecording = () => {
114
118
  const permissions = useHMSStore(selectPermissions);
115
- const [resolution, setResolution] = useState(RTMP_RECORD_DEFAULT_RESOLUTION);
116
119
  const [open, setOpen] = useState(false);
117
120
  const [recordingStarted, setRecordingState] = useSetAppDataByKey(APP_DATA.recordingStarted);
118
121
  const { isBrowserRecordingOn, isStreamingOn, isHLSRunning } = useRecordingStreaming();
@@ -133,7 +136,7 @@ const StartRecording = () => {
133
136
  </Popover.Trigger>
134
137
  <Popover.Portal>
135
138
  <Popover.Content align="end" sideOffset={8} css={{ w: '$64' }}>
136
- <Text variant="body" css={{ color: '$on_surface_medium' }}>
139
+ <Text variant="body1" css={{ color: '$on_surface_medium' }}>
137
140
  Are you sure you want to end the recording?
138
141
  </Text>
139
142
  <Button
@@ -145,8 +148,9 @@ const StartRecording = () => {
145
148
  try {
146
149
  await hmsActions.stopRTMPAndRecording();
147
150
  } catch (error) {
151
+ const err = error as Error;
148
152
  ToastManager.addToast({
149
- title: error.message,
153
+ title: err.message,
150
154
  variant: 'error',
151
155
  });
152
156
  }
@@ -161,62 +165,39 @@ const StartRecording = () => {
161
165
  );
162
166
  }
163
167
  return (
164
- <Popover.Root open={open} onOpenChange={setOpen}>
165
- <Popover.Trigger asChild>
166
- <Button
167
- data-testid="start_recording"
168
- variant="standard"
169
- icon
170
- disabled={recordingStarted || isStreamingOn}
171
- onClick={() => setOpen(true)}
172
- >
173
- {recordingStarted ? <Loading size={24} color="currentColor" /> : <RecordIcon />}
174
- <Text as="span" css={{ '@md': { display: 'none' }, color: 'currentColor' }}>
175
- {recordingStarted ? 'Starting' : 'Start'} Recording
176
- </Text>
177
- </Button>
178
- </Popover.Trigger>
179
- <Popover.Content align="end" sideOffset={8} css={{ w: '$64' }}>
180
- <ResolutionInput
181
- testId="recording_resolution"
182
- css={{ flexDirection: 'column', alignItems: 'start' }}
183
- onResolutionChange={setResolution}
184
- />
185
- <Button
186
- data-testid="start_recording_confirm"
187
- variant="primary"
188
- icon
189
- css={{ ml: 'auto' }}
190
- type="submit"
191
- disabled={recordingStarted || isStreamingOn}
192
- onClick={async () => {
193
- try {
194
- setRecordingState(true);
195
- await hmsActions.startRTMPOrRecording({
196
- resolution: getResolution(resolution),
197
- record: true,
198
- });
199
- } catch (error) {
200
- if (error.message.includes('stream already running')) {
201
- ToastManager.addToast({
202
- title: 'Recording already running',
203
- variant: 'error',
204
- });
205
- } else {
206
- ToastManager.addToast({
207
- title: error.message,
208
- variant: 'error',
209
- });
210
- }
211
- setRecordingState(false);
212
- }
213
- setOpen(false);
214
- }}
215
- >
216
- Start
217
- </Button>
218
- </Popover.Content>
219
- </Popover.Root>
168
+ <Button
169
+ data-testid="start_recording"
170
+ variant="standard"
171
+ icon
172
+ disabled={recordingStarted || isStreamingOn}
173
+ onClick={async () => {
174
+ try {
175
+ setRecordingState(true);
176
+ await hmsActions.startRTMPOrRecording({
177
+ record: true,
178
+ });
179
+ } catch (error) {
180
+ const err = error as Error;
181
+ if (err.message.includes('stream already running')) {
182
+ ToastManager.addToast({
183
+ title: 'Recording already running',
184
+ variant: 'error',
185
+ });
186
+ } else {
187
+ ToastManager.addToast({
188
+ title: err.message,
189
+ variant: 'error',
190
+ });
191
+ }
192
+ setRecordingState(false);
193
+ }
194
+ }}
195
+ >
196
+ {recordingStarted ? <Loading size={24} color="currentColor" /> : <RecordIcon />}
197
+ <Text as="span" css={{ '@md': { display: 'none' }, color: 'currentColor' }}>
198
+ {recordingStarted ? 'Starting' : 'Start'} Recording
199
+ </Text>
200
+ </Button>
220
201
  );
221
202
  };
222
203
 
@@ -242,7 +223,13 @@ export const StreamActions = () => {
242
223
  );
243
224
  };
244
225
 
245
- export const StopRecordingInSheet = ({ onStopRecording, onClose }) => {
226
+ export const StopRecordingInSheet = ({
227
+ onStopRecording,
228
+ onClose,
229
+ }: {
230
+ onStopRecording: () => void;
231
+ onClose: () => void;
232
+ }) => {
246
233
  return (
247
234
  <Sheet.Root open={true}>
248
235
  <Sheet.Content>
@@ -25,11 +25,13 @@ export const CamaraFlipActions = () => {
25
25
 
26
26
  const videoTrackId = useHMSStore(selectLocalVideoTrackID);
27
27
  const localVideoTrack = useHMSStore(selectVideoTrackByID(videoTrackId));
28
-
28
+ if (!videoInput || !videoInput?.length || !localVideoTrack?.facingMode) {
29
+ return null;
30
+ }
29
31
  return (
30
32
  <Box>
31
33
  <IconButton
32
- disabled={!videoInput?.length || !isVideoOn || !localVideoTrack?.facingMode}
34
+ disabled={!isVideoOn}
33
35
  onClick={async () => {
34
36
  try {
35
37
  await actions.switchCamera();
@@ -117,6 +119,7 @@ const AudioOutputSelectionSheet = ({ outputDevices, outputSelected, onChange, ch
117
119
  {outputDevices.map(audioDevice => {
118
120
  return (
119
121
  <SelectWithLabel
122
+ key={audioDevice.deviceId}
120
123
  label={audioDevice.label}
121
124
  id={audioDevice.deviceId}
122
125
  checked={audioDevice.deviceId === outputSelected}
@@ -0,0 +1 @@
1
+ export { Header } from './Header';
@@ -14,6 +14,10 @@ const IconSection = styled(IconButton, {
14
14
  borderTopRightRadius: 0,
15
15
  borderColor: '$border_default',
16
16
  borderBottomRightRadius: 0,
17
+ position: 'relative',
18
+ '&:not([disabled]):focus-visible': {
19
+ zIndex: 1,
20
+ },
17
21
  '@md': {
18
22
  mx: 0,
19
23
  borderTopRightRadius: '$1',
@@ -30,8 +34,9 @@ const OptionsSection = styled(IconButton, {
30
34
  borderColor: '$border_default',
31
35
  borderBottomLeftRadius: 0,
32
36
  borderLeftWidth: 0,
37
+ position: 'relative',
33
38
  '&:not([disabled]):focus-visible': {
34
- boxShadow: 'none',
39
+ zIndex: 1,
35
40
  },
36
41
  '@md': {
37
42
  display: 'none',
@@ -39,6 +44,10 @@ const OptionsSection = styled(IconButton, {
39
44
  });
40
45
 
41
46
  export const IconButtonWithOptions = ({
47
+ disabled = false,
48
+ onDisabledClick = () => {
49
+ return;
50
+ },
42
51
  tooltipMessage = '',
43
52
  icon,
44
53
  options = [],
@@ -47,8 +56,9 @@ export const IconButtonWithOptions = ({
47
56
  return;
48
57
  },
49
58
  }) => {
50
- const bgCss = { backgroundColor: active ? '$transparent' : '$secondary_dim' };
51
- const iconCss = { color: active ? '$on_surface_high' : '$on_primary_high' };
59
+ const bgCss = { backgroundColor: disabled ? '$surface_brighter' : active ? '$transparent' : '$secondary_dim' };
60
+ const iconCss = { color: disabled ? '$on_surface_low' : active ? '$on_surface_high' : '$on_primary_high' };
61
+
52
62
  return (
53
63
  <Flex>
54
64
  <IconSection css={bgCss} onClick={onClick}>
@@ -59,7 +69,16 @@ export const IconButtonWithOptions = ({
59
69
  </Tooltip>
60
70
  </IconSection>
61
71
  <Dropdown.Root>
62
- <Dropdown.Trigger asChild>
72
+ <Dropdown.Trigger
73
+ asChild
74
+ // onClick does not work
75
+ onPointerDown={e => {
76
+ if (disabled) {
77
+ e.preventDefault();
78
+ onDisabledClick();
79
+ }
80
+ }}
81
+ >
63
82
  <OptionsSection css={bgCss}>
64
83
  <Tooltip title="View Options">
65
84
  <Box css={iconCss}>
@@ -0,0 +1,128 @@
1
+ import React, { useEffect, useRef } from 'react';
2
+ import Draggable from 'react-draggable';
3
+ import { useMedia } from 'react-use';
4
+ import { selectIsAllowedToPublish, selectLocalPeer, selectVideoTrackByID, useHMSStore } from '@100mslive/react-sdk';
5
+ import { ExpandIcon } from '@100mslive/react-icons';
6
+ import { Box, Flex } from '../../Layout';
7
+ import { Text } from '../../Text';
8
+ import { config as cssConfig } from '../../Theme';
9
+ // @ts-ignore: No implicit Any
10
+ import IconButton from '../IconButton';
11
+ // @ts-ignore: No implicit Any
12
+ import { AudioVideoToggle } from './AudioVideoToggle';
13
+ // @ts-ignore: No implicit Any
14
+ import VideoTile from './VideoTile';
15
+ // @ts-ignore: No implicit Any
16
+ import { useSetAppDataByKey } from './AppData/useUISettings';
17
+ import { useVideoTileContext } from './hooks/useVideoTileLayout';
18
+ // @ts-ignore: No implicit Any
19
+ import { APP_DATA } from '../common/constants';
20
+
21
+ const MinimisedTile = ({ setMinimised }: { setMinimised: (value: boolean) => void }) => {
22
+ return (
23
+ <Flex align="center" css={{ gap: '$6', r: '$1', bg: '$surface_default', p: '$4', color: '$on_surface_high' }}>
24
+ <AudioVideoToggle hideOptions={true} />
25
+ <Text>You</Text>
26
+ <IconButton
27
+ className="__cancel-drag-event"
28
+ onClick={() => setMinimised(false)}
29
+ css={{ bg: 'transparent', border: 'transparent' }}
30
+ >
31
+ <ExpandIcon />
32
+ </IconButton>
33
+ </Flex>
34
+ );
35
+ };
36
+
37
+ const insetHeightPx = 180;
38
+ const insetMaxWidthPx = 240;
39
+ const defaultMobileAspectRatio = 9 / 16;
40
+ const desktopAspectRatio = 1 / defaultMobileAspectRatio;
41
+
42
+ export const InsetTile = () => {
43
+ const isMobile = useMedia(cssConfig.media.md);
44
+ const isLandscape = useMedia(cssConfig.media.ls);
45
+ const localPeer = useHMSStore(selectLocalPeer);
46
+ const [minimised, setMinimised] = useSetAppDataByKey(APP_DATA.minimiseInset);
47
+ const videoTrack = useHMSStore(selectVideoTrackByID(localPeer?.videoTrack));
48
+ const isAllowedToPublish = useHMSStore(selectIsAllowedToPublish);
49
+ const videoTileProps = useVideoTileContext();
50
+ let aspectRatio = isMobile ? defaultMobileAspectRatio : desktopAspectRatio;
51
+ if (videoTrack?.width && videoTrack?.height && !isMobile) {
52
+ aspectRatio = videoTrack.width / videoTrack.height;
53
+ }
54
+ let height = insetHeightPx;
55
+ let width = height * aspectRatio;
56
+ // Convert to 16/9 in landscape mode with a max width of 240
57
+ if (isLandscape && width > insetMaxWidthPx) {
58
+ width = 240;
59
+ height = width / aspectRatio;
60
+ }
61
+
62
+ const nodeRef = useRef<HTMLDivElement>(null);
63
+
64
+ useEffect(() => {
65
+ const node = nodeRef.current;
66
+ if (!node || !window.ResizeObserver) {
67
+ return;
68
+ }
69
+ const resizeObserver = new ResizeObserver(entries => {
70
+ entries.forEach(entry => {
71
+ if (entry.target === node.parentElement) {
72
+ // reset to original position on resize
73
+ node.style.transform = `translate(0,0)`;
74
+ }
75
+ });
76
+ });
77
+ node.parentElement && resizeObserver.observe(node.parentElement);
78
+ return () => {
79
+ node?.parentElement && resizeObserver?.unobserve(node.parentElement);
80
+ resizeObserver?.disconnect();
81
+ };
82
+ }, []);
83
+
84
+ if (!isAllowedToPublish.video && !isAllowedToPublish.audio) {
85
+ return null;
86
+ }
87
+
88
+ return (
89
+ <Draggable bounds="parent" nodeRef={nodeRef} cancel=".__cancel-drag-event">
90
+ <Box
91
+ ref={nodeRef}
92
+ css={{
93
+ position: 'absolute',
94
+ bottom: 0,
95
+ right: 0,
96
+ zIndex: 11,
97
+ boxShadow: '0 0 8px 0 rgba(0,0,0,0.3)',
98
+ r: '$2',
99
+ ...(!minimised
100
+ ? {
101
+ aspectRatio: aspectRatio,
102
+ h: height,
103
+ }
104
+ : {}),
105
+ }}
106
+ >
107
+ {minimised ? (
108
+ <MinimisedTile setMinimised={setMinimised} />
109
+ ) : (
110
+ <VideoTile
111
+ peerId={localPeer?.id}
112
+ trackid={localPeer?.videoTrack}
113
+ rootCSS={{
114
+ size: '100%',
115
+ padding: 0,
116
+ }}
117
+ width={width}
118
+ height={height}
119
+ containerCSS={{ background: '$surface_default' }}
120
+ canMinimise
121
+ isDragabble
122
+ {...videoTileProps}
123
+ />
124
+ )}
125
+ </Box>
126
+ </Draggable>
127
+ );
128
+ };
@@ -1,31 +1,34 @@
1
1
  import React, { Fragment, useState } from 'react';
2
+ import { ConferencingScreen } from '@100mslive/types-prebuilt';
2
3
  import { selectIsConnectedToRoom, selectPermissions, useHMSStore, useRecordingStreaming } from '@100mslive/react-sdk';
3
4
  import { ExitIcon, StopIcon, VerticalMenuIcon } from '@100mslive/react-icons';
4
- import { Dropdown } from '../../../../Dropdown';
5
- import { Box, Flex } from '../../../../Layout';
6
- import { Dialog } from '../../../../Modal';
7
- import { Tooltip } from '../../../../Tooltip';
8
- import { EndSessionContent } from '../../EndSessionContent';
9
- import { LeaveCard } from '../../LeaveCard';
10
- import { useDropdownList } from '../../hooks/useDropdownList';
11
- import { useShowStreamingUI } from '../../../common/hooks';
5
+ import { Dropdown } from '../../../Dropdown';
6
+ import { Box, Flex } from '../../../Layout';
7
+ import { Dialog } from '../../../Modal';
8
+ import { Tooltip } from '../../../Tooltip';
9
+ import { EndSessionContent } from './EndSessionContent';
10
+ import { LeaveIconButton, MenuTriggerButton } from './LeaveAtoms';
11
+ import { LeaveCard } from './LeaveCard';
12
+ import { LeaveSessionContent } from './LeaveSessionContent';
13
+ // @ts-ignore: No implicit Any
14
+ import { useDropdownList } from '../hooks/useDropdownList';
12
15
 
13
16
  export const DesktopLeaveRoom = ({
14
- menuTriggerButton: MenuTriggerButton,
15
- leaveIconButton: LeaveIconButton,
16
17
  leaveRoom,
17
- stopStream,
18
+ screenType,
19
+ }: {
20
+ leaveRoom: (args: { endstream: boolean }) => void;
21
+ screenType: keyof ConferencingScreen;
18
22
  }) => {
19
23
  const [open, setOpen] = useState(false);
24
+ const [showLeaveRoomAlert, setShowLeaveRoomAlert] = useState(false);
20
25
  const [showEndStreamAlert, setShowEndStreamAlert] = useState(false);
21
26
  const isConnected = useHMSStore(selectIsConnectedToRoom);
22
27
  const permissions = useHMSStore(selectPermissions);
23
28
  const { isStreamingOn } = useRecordingStreaming();
24
- const showStreamingUI = useShowStreamingUI();
29
+ const showStream = permissions?.hlsStreaming && isStreamingOn;
25
30
 
26
- const showStream = showStreamingUI && isStreamingOn;
27
-
28
- useDropdownList({ open, name: 'LeaveRoom' });
31
+ useDropdownList({ open: open || showEndStreamAlert || showLeaveRoomAlert, name: 'LeaveRoom' });
29
32
 
30
33
  if (!permissions || !isConnected) {
31
34
  return null;
@@ -36,14 +39,19 @@ export const DesktopLeaveRoom = ({
36
39
  {permissions.hlsStreaming ? (
37
40
  <Flex>
38
41
  <LeaveIconButton
39
- variant="danger"
40
42
  key="LeaveRoom"
41
43
  data-testid="leave_room_btn"
42
44
  css={{
43
45
  borderTopRightRadius: 0,
44
46
  borderBottomRightRadius: 0,
45
47
  }}
46
- onClick={leaveRoom}
48
+ onClick={() => {
49
+ if (screenType === 'hls_live_streaming') {
50
+ setShowLeaveRoomAlert(true);
51
+ } else {
52
+ leaveRoom({ endstream: false });
53
+ }
54
+ }}
47
55
  >
48
56
  <Tooltip title="Leave Room">
49
57
  <Box>
@@ -60,12 +68,20 @@ export const DesktopLeaveRoom = ({
60
68
  },
61
69
  }}
62
70
  >
63
- <MenuTriggerButton variant="danger" data-testid="leave_end_dropdown_trigger">
71
+ <MenuTriggerButton data-testid="leave_end_dropdown_trigger">
64
72
  <VerticalMenuIcon />
65
73
  </MenuTriggerButton>
66
74
  </Dropdown.Trigger>
67
75
  <Dropdown.Content css={{ p: 0, w: '$100' }} alignOffset={-50} sideOffset={10}>
68
- <Dropdown.Item css={{ bg: '$surface_default' }} onClick={leaveRoom} data-testid="just_leave_btn">
76
+ <Dropdown.Item
77
+ css={{
78
+ bg: '$surface_dim',
79
+ color: '$on_surface_low',
80
+ '&:hover': { bg: '$surface_default', color: '$on_surface_high' },
81
+ }}
82
+ onClick={() => leaveRoom({ endstream: false })}
83
+ data-testid="just_leave_btn"
84
+ >
69
85
  <LeaveCard
70
86
  title={showStream ? 'Leave Stream' : 'Leave Session'}
71
87
  subtitle={`Others will continue after you leave. You can join the ${
@@ -73,14 +89,20 @@ export const DesktopLeaveRoom = ({
73
89
  } again.`}
74
90
  bg=""
75
91
  titleColor="$on_surface_high"
76
- subtitleColor="$on_surface_low"
77
92
  icon={<ExitIcon height={24} width={24} style={{ transform: 'rotate(180deg)' }} />}
78
- onClick={leaveRoom}
93
+ onClick={() => leaveRoom({ endstream: false })}
79
94
  css={{ p: 0 }}
80
95
  />
81
96
  </Dropdown.Item>
82
97
  {isStreamingOn && permissions?.hlsStreaming ? (
83
- <Dropdown.Item css={{ bg: '$alert_error_dim' }} data-testid="end_room_btn">
98
+ <Dropdown.Item
99
+ css={{
100
+ bg: '$alert_error_dim',
101
+ color: '$alert_error_bright',
102
+ '&:hover': { bg: '$alert_error_dim', color: '$alert_error_brighter' },
103
+ }}
104
+ data-testid="end_room_btn"
105
+ >
84
106
  <LeaveCard
85
107
  title={showStream ? 'End Stream' : 'End Session'}
86
108
  subtitle={`The ${
@@ -88,7 +110,6 @@ export const DesktopLeaveRoom = ({
88
110
  } will end for everyone. You can't undo this action.`}
89
111
  bg=""
90
112
  titleColor="$alert_error_brighter"
91
- subtitleColor="$alert_error_bright"
92
113
  icon={<StopIcon height={24} width={24} />}
93
114
  onClick={() => {
94
115
  setOpen(false);
@@ -102,7 +123,17 @@ export const DesktopLeaveRoom = ({
102
123
  </Dropdown.Root>
103
124
  </Flex>
104
125
  ) : (
105
- <LeaveIconButton onClick={leaveRoom} variant="danger" key="LeaveRoom" data-testid="leave_room_btn">
126
+ <LeaveIconButton
127
+ onClick={() => {
128
+ if (screenType === 'hls_live_streaming') {
129
+ setShowLeaveRoomAlert(true);
130
+ } else {
131
+ leaveRoom({ endstream: false });
132
+ }
133
+ }}
134
+ key="LeaveRoom"
135
+ data-testid="leave_room_btn"
136
+ >
106
137
  <Tooltip title="Leave Room">
107
138
  <Box>
108
139
  <ExitIcon style={{ transform: 'rotate(180deg)' }} />
@@ -117,13 +148,24 @@ export const DesktopLeaveRoom = ({
117
148
  <Dialog.Content css={{ w: 'min(420px, 90%)', p: '$8', bg: '$surface_dim' }}>
118
149
  <EndSessionContent
119
150
  setShowEndStreamAlert={setShowEndStreamAlert}
120
- stopStream={stopStream}
121
151
  leaveRoom={leaveRoom}
152
+ isStreamingOn={isStreamingOn}
122
153
  isModal
123
154
  />
124
155
  </Dialog.Content>
125
156
  </Dialog.Portal>
126
157
  </Dialog.Root>
158
+
159
+ {screenType === 'hls_live_streaming' ? (
160
+ <Dialog.Root open={showLeaveRoomAlert} modal={false}>
161
+ <Dialog.Portal>
162
+ <Dialog.Overlay />
163
+ <Dialog.Content css={{ w: 'min(420px, 90%)', p: '$8', bg: '$surface_dim' }}>
164
+ <LeaveSessionContent setShowLeaveRoomAlert={setShowLeaveRoomAlert} leaveRoom={leaveRoom} isModal />
165
+ </Dialog.Content>
166
+ </Dialog.Portal>
167
+ </Dialog.Root>
168
+ ) : null}
127
169
  </Fragment>
128
170
  );
129
171
  };
@@ -1,12 +1,20 @@
1
1
  import React from 'react';
2
2
  import { AlertTriangleIcon, CrossIcon } from '@100mslive/react-icons';
3
- import { Button } from '../../Button';
4
- import { Box, Flex } from '../../Layout';
5
- import { Text } from '../../Text';
6
- import { useShowStreamingUI } from '../common/hooks';
3
+ import { Button } from '../../../Button';
4
+ import { Box, Flex } from '../../../Layout';
5
+ import { Text } from '../../../Text';
7
6
 
8
- export const EndSessionContent = ({ setShowEndStreamAlert, stopStream, leaveRoom, isModal = false }) => {
9
- const showStreamingUI = useShowStreamingUI();
7
+ export const EndSessionContent = ({
8
+ setShowEndStreamAlert,
9
+ leaveRoom,
10
+ isModal = false,
11
+ isStreamingOn = false,
12
+ }: {
13
+ setShowEndStreamAlert: (value: boolean) => void;
14
+ leaveRoom: (args: { endstream: boolean }) => void;
15
+ isModal?: boolean;
16
+ isStreamingOn: boolean;
17
+ }) => {
10
18
  return (
11
19
  <Box>
12
20
  <Flex
@@ -18,7 +26,7 @@ export const EndSessionContent = ({ setShowEndStreamAlert, stopStream, leaveRoom
18
26
  >
19
27
  <AlertTriangleIcon style={{ marginRight: '0.5rem' }} />
20
28
  <Text variant="lg" css={{ color: 'inherit', fontWeight: '$semiBold' }}>
21
- End {showStreamingUI ? 'Stream' : 'Session'}
29
+ End {isStreamingOn ? 'Stream' : 'Session'}
22
30
  </Text>
23
31
  {isModal ? null : (
24
32
  <Box css={{ color: '$on_surface_high', ml: 'auto' }} onClick={() => setShowEndStreamAlert(false)}>
@@ -27,7 +35,7 @@ export const EndSessionContent = ({ setShowEndStreamAlert, stopStream, leaveRoom
27
35
  )}
28
36
  </Flex>
29
37
  <Text variant="sm" css={{ color: '$on_surface_medium', mb: '$8', mt: '$4' }}>
30
- The {showStreamingUI ? 'stream' : 'session'} will end for everyone. You can't undo this action.
38
+ The {isStreamingOn ? 'stream' : 'session'} will end for everyone. You can't undo this action.
31
39
  </Text>
32
40
  <Flex align="center" justify="between" css={{ w: '100%', gap: '$8' }}>
33
41
  <Button
@@ -42,14 +50,13 @@ export const EndSessionContent = ({ setShowEndStreamAlert, stopStream, leaveRoom
42
50
  variant="danger"
43
51
  css={{ w: '100%' }}
44
52
  onClick={async () => {
45
- await stopStream();
46
- leaveRoom();
53
+ await leaveRoom({ endstream: true });
47
54
  setShowEndStreamAlert(false);
48
55
  }}
49
56
  id="stopStream"
50
57
  data-testid="stop_stream_btn"
51
58
  >
52
- End {showStreamingUI ? 'Stream' : 'Session'}
59
+ End {isStreamingOn ? 'Stream' : 'Session'}
53
60
  </Button>
54
61
  </Flex>
55
62
  </Box>
@@ -0,0 +1,26 @@
1
+ import { IconButton } from '../../../IconButton';
2
+ import { styled } from '../../../Theme';
3
+
4
+ export const LeaveIconButton = styled(IconButton, {
5
+ color: '$on_primary_high',
6
+ h: '$14',
7
+ px: '$4',
8
+ r: '$1',
9
+ bg: '$alert_error_default',
10
+ '&:not([disabled]):hover': {
11
+ bg: '$alert_error_bright',
12
+ },
13
+ '&:not([disabled]):active': {
14
+ bg: '$alert_error_default',
15
+ },
16
+ '@md': {
17
+ mx: 0,
18
+ },
19
+ });
20
+
21
+ export const MenuTriggerButton = styled(LeaveIconButton, {
22
+ borderLeft: '1px solid $alert_error_dim',
23
+ borderTopLeftRadius: 0,
24
+ borderBottomLeftRadius: 0,
25
+ px: '$2',
26
+ });