@stream-io/video-react-sdk 2.0.0-beta.0 → 2.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/css/embedded.css +2592 -1498
  3. package/dist/css/embedded.css.map +1 -1
  4. package/dist/css/styles.css +2388 -1222
  5. package/dist/css/styles.css.map +1 -1
  6. package/dist/embedded.cjs.js +535 -476
  7. package/dist/embedded.cjs.js.map +1 -1
  8. package/dist/esm/index.js +10 -7
  9. package/dist/esm/index.js.map +1 -1
  10. package/dist/esm/src/components/Avatar/Avatar.js +13 -5
  11. package/dist/esm/src/components/Avatar/Avatar.js.map +1 -1
  12. package/dist/esm/src/components/Badge/Badge.js +21 -0
  13. package/dist/esm/src/components/Badge/Badge.js.map +1 -0
  14. package/dist/esm/src/components/Button/Button.js +10 -0
  15. package/dist/esm/src/components/Button/Button.js.map +1 -0
  16. package/dist/esm/src/components/Button/CompositeButton.js +10 -17
  17. package/dist/esm/src/components/Button/CompositeButton.js.map +1 -1
  18. package/dist/esm/src/components/Button/IconButton.js +3 -9
  19. package/dist/esm/src/components/Button/IconButton.js.map +1 -1
  20. package/dist/esm/src/components/CallControls/AcceptCallButton.js +3 -2
  21. package/dist/esm/src/components/CallControls/AcceptCallButton.js.map +1 -1
  22. package/dist/esm/src/components/CallControls/CallControls.js +3 -0
  23. package/dist/esm/src/components/CallControls/CallControls.js.map +1 -1
  24. package/dist/esm/src/components/CallControls/CancelCallButton.js +11 -6
  25. package/dist/esm/src/components/CallControls/CancelCallButton.js.map +1 -1
  26. package/dist/esm/src/components/CallControls/ReactionsButton.js +7 -3
  27. package/dist/esm/src/components/CallControls/ReactionsButton.js.map +1 -1
  28. package/dist/esm/src/components/CallControls/RecordCallButton.js +17 -11
  29. package/dist/esm/src/components/CallControls/RecordCallButton.js.map +1 -1
  30. package/dist/esm/src/components/CallControls/ScreenShareButton.js +11 -4
  31. package/dist/esm/src/components/CallControls/ScreenShareButton.js.map +1 -1
  32. package/dist/esm/src/components/CallControls/ToggleAudioButton.js +28 -17
  33. package/dist/esm/src/components/CallControls/ToggleAudioButton.js.map +1 -1
  34. package/dist/esm/src/components/CallControls/ToggleAudioOutputButton.js +9 -4
  35. package/dist/esm/src/components/CallControls/ToggleAudioOutputButton.js.map +1 -1
  36. package/dist/esm/src/components/CallControls/ToggleVideoButton.js +32 -23
  37. package/dist/esm/src/components/CallControls/ToggleVideoButton.js.map +1 -1
  38. package/dist/esm/src/components/CallParticipantsList/BlockedUserListing.js +3 -3
  39. package/dist/esm/src/components/CallParticipantsList/BlockedUserListing.js.map +1 -1
  40. package/dist/esm/src/components/CallParticipantsList/CallParticipantListHeader.js +8 -3
  41. package/dist/esm/src/components/CallParticipantsList/CallParticipantListHeader.js.map +1 -1
  42. package/dist/esm/src/components/CallParticipantsList/CallParticipantListingItem.js +20 -7
  43. package/dist/esm/src/components/CallParticipantsList/CallParticipantListingItem.js.map +1 -1
  44. package/dist/esm/src/components/CallParticipantsList/CallParticipantsList.js +8 -5
  45. package/dist/esm/src/components/CallParticipantsList/CallParticipantsList.js.map +1 -1
  46. package/dist/esm/src/components/CallParticipantsList/EmptyParticipantSearchList.js +5 -2
  47. package/dist/esm/src/components/CallParticipantsList/EmptyParticipantSearchList.js.map +1 -1
  48. package/dist/esm/src/components/CallRecordingList/CallRecordingListHeader.js +7 -3
  49. package/dist/esm/src/components/CallRecordingList/CallRecordingListHeader.js.map +1 -1
  50. package/dist/esm/src/components/DeviceSettings/DeviceAudioPreviewItem.js +1 -1
  51. package/dist/esm/src/components/DeviceSettings/DeviceAudioPreviewItem.js.map +1 -1
  52. package/dist/esm/src/components/DeviceSettings/DeviceSelector.js +1 -1
  53. package/dist/esm/src/components/DeviceSettings/DeviceSelector.js.map +1 -1
  54. package/dist/esm/src/components/DeviceSettings/DeviceSelectorAudio.js +2 -2
  55. package/dist/esm/src/components/DeviceSettings/DeviceSelectorAudio.js.map +1 -1
  56. package/dist/esm/src/components/DeviceSettings/DeviceSettings.js +8 -5
  57. package/dist/esm/src/components/DeviceSettings/DeviceSettings.js.map +1 -1
  58. package/dist/esm/src/components/DeviceSettings/SpeakerTest.js +10 -4
  59. package/dist/esm/src/components/DeviceSettings/SpeakerTest.js.map +1 -1
  60. package/dist/esm/src/components/DropdownSelect/DropdownSelect.js +1 -1
  61. package/dist/esm/src/components/DropdownSelect/DropdownSelect.js.map +1 -1
  62. package/dist/esm/src/components/Menu/GenericMenu.js +2 -1
  63. package/dist/esm/src/components/Menu/GenericMenu.js.map +1 -1
  64. package/dist/esm/src/components/Menu/MenuToggle.js +3 -0
  65. package/dist/esm/src/components/Menu/MenuToggle.js.map +1 -1
  66. package/dist/esm/src/components/Notification/MicCaptureErrorNotification.js +6 -3
  67. package/dist/esm/src/components/Notification/MicCaptureErrorNotification.js.map +1 -1
  68. package/dist/esm/src/components/Notification/Notification.js +12 -3
  69. package/dist/esm/src/components/Notification/Notification.js.map +1 -1
  70. package/dist/esm/src/components/Notification/PermissionNotification.js +2 -2
  71. package/dist/esm/src/components/Notification/PermissionNotification.js.map +1 -1
  72. package/dist/esm/src/components/Notification/RecordingInProgressNotification.js +7 -3
  73. package/dist/esm/src/components/Notification/RecordingInProgressNotification.js.map +1 -1
  74. package/dist/esm/src/components/Notification/SpeakingWhileMutedNotification.js +7 -2
  75. package/dist/esm/src/components/Notification/SpeakingWhileMutedNotification.js.map +1 -1
  76. package/dist/esm/src/components/Permissions/PermissionRequests.js +13 -12
  77. package/dist/esm/src/components/Permissions/PermissionRequests.js.map +1 -1
  78. package/dist/esm/src/components/RingingCall/RingingCall.js +38 -14
  79. package/dist/esm/src/components/RingingCall/RingingCall.js.map +1 -1
  80. package/dist/esm/src/components/RingingCall/RingingCallControls.js +7 -3
  81. package/dist/esm/src/components/RingingCall/RingingCallControls.js.map +1 -1
  82. package/dist/esm/src/components/Search/SearchInput.js +1 -1
  83. package/dist/esm/src/components/Search/SearchInput.js.map +1 -1
  84. package/dist/esm/src/components/StreamTheme/StreamTheme.js +2 -2
  85. package/dist/esm/src/components/StreamTheme/StreamTheme.js.map +1 -1
  86. package/dist/esm/src/components/Tooltip/Tooltip.js +8 -8
  87. package/dist/esm/src/components/Tooltip/Tooltip.js.map +1 -1
  88. package/dist/esm/src/components/VideoPreview/VideoPreview.js +36 -5
  89. package/dist/esm/src/components/VideoPreview/VideoPreview.js.map +1 -1
  90. package/dist/esm/src/core/components/CallLayout/LivestreamLayout.js +38 -12
  91. package/dist/esm/src/core/components/CallLayout/LivestreamLayout.js.map +1 -1
  92. package/dist/esm/src/core/components/CallLayout/PaginatedGridLayout.js +9 -5
  93. package/dist/esm/src/core/components/CallLayout/PaginatedGridLayout.js.map +1 -1
  94. package/dist/esm/src/core/components/CallLayout/PipLayout/Grid.js +9 -6
  95. package/dist/esm/src/core/components/CallLayout/PipLayout/Grid.js.map +1 -1
  96. package/dist/esm/src/core/components/CallLayout/PipLayout/Pip.js +9 -6
  97. package/dist/esm/src/core/components/CallLayout/PipLayout/Pip.js.map +1 -1
  98. package/dist/esm/src/core/components/CallLayout/SpeakerLayout.js +11 -6
  99. package/dist/esm/src/core/components/CallLayout/SpeakerLayout.js.map +1 -1
  100. package/dist/esm/src/core/components/ParticipantView/ConnectionQualityIndicator.js +25 -0
  101. package/dist/esm/src/core/components/ParticipantView/ConnectionQualityIndicator.js.map +1 -0
  102. package/dist/esm/src/core/components/ParticipantView/DefaultParticipantViewUI.js +17 -13
  103. package/dist/esm/src/core/components/ParticipantView/DefaultParticipantViewUI.js.map +1 -1
  104. package/dist/esm/src/core/components/ParticipantView/ParticipantActionsContextMenu.js +13 -8
  105. package/dist/esm/src/core/components/ParticipantView/ParticipantActionsContextMenu.js.map +1 -1
  106. package/dist/esm/src/core/components/StreamVideo/StreamVideo.js +24 -3
  107. package/dist/esm/src/core/components/StreamVideo/StreamVideo.js.map +1 -1
  108. package/dist/esm/src/core/components/Video/BaseVideoPlaceholder.js +3 -13
  109. package/dist/esm/src/core/components/Video/BaseVideoPlaceholder.js.map +1 -1
  110. package/dist/esm/src/core/components/Video/DefaultPictureInPicturePlaceholder.js +4 -2
  111. package/dist/esm/src/core/components/Video/DefaultPictureInPicturePlaceholder.js.map +1 -1
  112. package/dist/esm/src/core/components/Video/DefaultVideoPlaceholder.js +4 -2
  113. package/dist/esm/src/core/components/Video/DefaultVideoPlaceholder.js.map +1 -1
  114. package/dist/esm/src/embedded/EmbeddedClientProvider.js +7 -4
  115. package/dist/esm/src/embedded/EmbeddedClientProvider.js.map +1 -1
  116. package/dist/esm/src/embedded/call/CallControls.js +10 -6
  117. package/dist/esm/src/embedded/call/CallControls.js.map +1 -1
  118. package/dist/esm/src/embedded/call/CallHeader.js +10 -7
  119. package/dist/esm/src/embedded/call/CallHeader.js.map +1 -1
  120. package/dist/esm/src/embedded/call/CallLayout.js +8 -5
  121. package/dist/esm/src/embedded/call/CallLayout.js.map +1 -1
  122. package/dist/esm/src/embedded/call/CallStateRouter.js +7 -4
  123. package/dist/esm/src/embedded/call/CallStateRouter.js.map +1 -1
  124. package/dist/esm/src/embedded/hooks/useLayout.js +7 -4
  125. package/dist/esm/src/embedded/hooks/useLayout.js.map +1 -1
  126. package/dist/esm/src/embedded/livestream/host/HostLayout.js +12 -7
  127. package/dist/esm/src/embedded/livestream/host/HostLayout.js.map +1 -1
  128. package/dist/esm/src/embedded/livestream/host/HostStateRouter.js +12 -7
  129. package/dist/esm/src/embedded/livestream/host/HostStateRouter.js.map +1 -1
  130. package/dist/esm/src/embedded/livestream/viewer/ViewerLayout.js +9 -6
  131. package/dist/esm/src/embedded/livestream/viewer/ViewerLayout.js.map +1 -1
  132. package/dist/esm/src/embedded/livestream/viewer/ViewerLobby.js +12 -9
  133. package/dist/esm/src/embedded/livestream/viewer/ViewerLobby.js.map +1 -1
  134. package/dist/esm/src/embedded/livestream/viewer/ViewerStateRouter.js +7 -4
  135. package/dist/esm/src/embedded/livestream/viewer/ViewerStateRouter.js.map +1 -1
  136. package/dist/esm/src/embedded/shared/BlurToggleButton/BlurToggleButton.js +13 -9
  137. package/dist/esm/src/embedded/shared/BlurToggleButton/BlurToggleButton.js.map +1 -1
  138. package/dist/esm/src/embedded/shared/CallDuration/CallDuration.js +40 -0
  139. package/dist/esm/src/embedded/shared/CallDuration/CallDuration.js.map +1 -0
  140. package/dist/esm/src/embedded/shared/CallFeedback/CallEndedScreen.js +8 -6
  141. package/dist/esm/src/embedded/shared/CallFeedback/CallEndedScreen.js.map +1 -1
  142. package/dist/esm/src/embedded/shared/CallFeedback/RatingScreen.js +26 -2
  143. package/dist/esm/src/embedded/shared/CallFeedback/RatingScreen.js.map +1 -1
  144. package/dist/esm/src/embedded/shared/CallFeedback/StarRating.js +12 -6
  145. package/dist/esm/src/embedded/shared/CallFeedback/StarRating.js.map +1 -1
  146. package/dist/esm/src/embedded/shared/CallFeedback/ThankYouScreen.js +8 -6
  147. package/dist/esm/src/embedded/shared/CallFeedback/ThankYouScreen.js.map +1 -1
  148. package/dist/esm/src/embedded/shared/ConnectionNotification/ConnectionNotification.js +15 -14
  149. package/dist/esm/src/embedded/shared/ConnectionNotification/ConnectionNotification.js.map +1 -1
  150. package/dist/esm/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.js +4 -0
  151. package/dist/esm/src/embedded/shared/EmbeddedParticipantViewUI/EmbeddedParticipantViewUI.js.map +1 -1
  152. package/dist/esm/src/embedded/shared/JoinError/JoinError.js +8 -6
  153. package/dist/esm/src/embedded/shared/JoinError/JoinError.js.map +1 -1
  154. package/dist/esm/src/embedded/shared/Lobby/DeviceControls.js +11 -7
  155. package/dist/esm/src/embedded/shared/Lobby/DeviceControls.js.map +1 -1
  156. package/dist/esm/src/embedded/shared/Lobby/DisabledDeviceButton.js +6 -4
  157. package/dist/esm/src/embedded/shared/Lobby/DisabledDeviceButton.js.map +1 -1
  158. package/dist/esm/src/embedded/shared/Lobby/Lobby.js +10 -9
  159. package/dist/esm/src/embedded/shared/Lobby/Lobby.js.map +1 -1
  160. package/dist/esm/src/embedded/shared/Lobby/ToggleCameraButton.js +6 -4
  161. package/dist/esm/src/embedded/shared/Lobby/ToggleCameraButton.js.map +1 -1
  162. package/dist/esm/src/embedded/shared/Lobby/ToggleMicButton.js +8 -6
  163. package/dist/esm/src/embedded/shared/Lobby/ToggleMicButton.js.map +1 -1
  164. package/dist/esm/src/embedded/shared/Lobby/VideoPreviewFallbacks.js +11 -9
  165. package/dist/esm/src/embedded/shared/Lobby/VideoPreviewFallbacks.js.map +1 -1
  166. package/dist/esm/src/embedded/shared/ViewersCount/ViewersCount.js +6 -4
  167. package/dist/esm/src/embedded/shared/ViewersCount/ViewersCount.js.map +1 -1
  168. package/dist/esm/src/hooks/useDeviceList.js +4 -2
  169. package/dist/esm/src/hooks/useDeviceList.js.map +1 -1
  170. package/dist/esm/src/i18n/Streami18n.js +58 -0
  171. package/dist/esm/src/i18n/Streami18n.js.map +1 -0
  172. package/dist/esm/src/i18n/TranslationContext.js +42 -0
  173. package/dist/esm/src/i18n/TranslationContext.js.map +1 -0
  174. package/dist/esm/src/i18n/runtimeDefaults.js +20 -0
  175. package/dist/esm/src/i18n/runtimeDefaults.js.map +1 -0
  176. package/dist/esm/src/i18n/useStreami18n.js +49 -0
  177. package/dist/esm/src/i18n/useStreami18n.js.map +1 -0
  178. package/dist/esm/src/wrappers/LivestreamPlayer/LivestreamPlayer.js +4 -0
  179. package/dist/esm/src/wrappers/LivestreamPlayer/LivestreamPlayer.js.map +1 -1
  180. package/dist/index.cjs.js +559 -623
  181. package/dist/index.cjs.js.map +1 -1
  182. package/dist/index.d.ts +1 -1
  183. package/dist/src/components/Avatar/Avatar.d.ts +9 -4
  184. package/dist/src/components/Badge/Badge.d.ts +23 -0
  185. package/dist/src/components/Badge/index.d.ts +1 -0
  186. package/dist/src/components/Button/Button.d.ts +16 -0
  187. package/dist/src/components/Button/CompositeButton.d.ts +6 -3
  188. package/dist/src/components/Button/IconButton.d.ts +7 -7
  189. package/dist/src/components/Button/index.d.ts +2 -2
  190. package/dist/src/components/CallControls/CancelCallButton.d.ts +3 -1
  191. package/dist/src/components/CallControls/ToggleAudioButton.d.ts +3 -3
  192. package/dist/src/components/CallControls/ToggleAudioOutputButton.d.ts +2 -2
  193. package/dist/src/components/CallControls/ToggleVideoButton.d.ts +3 -3
  194. package/dist/src/components/CallControls/index.d.ts +0 -1
  195. package/dist/src/components/Menu/GenericMenu.d.ts +1 -0
  196. package/dist/src/components/Notification/Notification.d.ts +2 -1
  197. package/dist/src/components/StreamTheme/StreamTheme.d.ts +2 -1
  198. package/dist/src/components/VideoPreview/VideoPreview.d.ts +6 -1
  199. package/dist/src/components/index.d.ts +1 -1
  200. package/dist/src/core/components/ParticipantView/ConnectionQualityIndicator.d.ts +10 -0
  201. package/dist/src/core/components/ParticipantView/index.d.ts +1 -0
  202. package/dist/src/core/components/StreamVideo/StreamVideo.d.ts +18 -2
  203. package/dist/src/embedded/shared/CallDuration/CallDuration.d.ts +9 -0
  204. package/dist/src/embedded/shared/index.d.ts +1 -0
  205. package/dist/src/i18n/Streami18n.d.ts +56 -0
  206. package/dist/src/i18n/TranslationContext.d.ts +30 -0
  207. package/dist/src/i18n/index.d.ts +16 -0
  208. package/dist/src/i18n/keys.d.ts +164 -0
  209. package/dist/src/i18n/runtimeDefaults.d.ts +17 -0
  210. package/dist/src/i18n/types.d.ts +45 -0
  211. package/dist/src/i18n/useStreami18n.d.ts +19 -0
  212. package/index.ts +1 -1
  213. package/package.json +18 -13
  214. package/src/components/Avatar/Avatar.tsx +53 -19
  215. package/src/components/Badge/Badge.tsx +48 -0
  216. package/src/components/Badge/index.ts +1 -0
  217. package/src/components/Button/Button.tsx +49 -0
  218. package/src/components/Button/CompositeButton.tsx +82 -73
  219. package/src/components/Button/IconButton.tsx +19 -29
  220. package/src/components/Button/index.ts +2 -2
  221. package/src/components/CallControls/AcceptCallButton.tsx +3 -1
  222. package/src/components/CallControls/CancelCallButton.tsx +32 -24
  223. package/src/components/CallControls/ReactionsButton.tsx +7 -3
  224. package/src/components/CallControls/RecordCallButton.tsx +50 -23
  225. package/src/components/CallControls/ScreenShareButton.tsx +27 -6
  226. package/src/components/CallControls/ToggleAudioButton.tsx +62 -61
  227. package/src/components/CallControls/ToggleAudioOutputButton.tsx +7 -4
  228. package/src/components/CallControls/ToggleVideoButton.tsx +66 -66
  229. package/src/components/CallControls/index.ts +0 -1
  230. package/src/components/CallParticipantsList/BlockedUserListing.tsx +9 -2
  231. package/src/components/CallParticipantsList/CallParticipantListHeader.tsx +10 -3
  232. package/src/components/CallParticipantsList/CallParticipantListingItem.tsx +33 -8
  233. package/src/components/CallParticipantsList/CallParticipantsList.tsx +21 -5
  234. package/src/components/CallParticipantsList/EmptyParticipantSearchList.tsx +2 -2
  235. package/src/components/CallRecordingList/CallRecordingListHeader.tsx +11 -3
  236. package/src/components/DeviceSettings/DeviceAudioPreviewItem.tsx +3 -1
  237. package/src/components/DeviceSettings/DeviceSelector.tsx +1 -1
  238. package/src/components/DeviceSettings/DeviceSelectorAudio.tsx +2 -7
  239. package/src/components/DeviceSettings/DeviceSettings.tsx +14 -5
  240. package/src/components/DeviceSettings/SpeakerTest.tsx +7 -2
  241. package/src/components/DropdownSelect/DropdownSelect.tsx +3 -1
  242. package/src/components/Menu/GenericMenu.tsx +4 -0
  243. package/src/components/Notification/MicCaptureErrorNotification.tsx +7 -2
  244. package/src/components/Notification/Notification.tsx +20 -4
  245. package/src/components/Notification/PermissionNotification.tsx +2 -0
  246. package/src/components/Notification/RecordingInProgressNotification.tsx +5 -6
  247. package/src/components/Notification/SpeakingWhileMutedNotification.tsx +8 -2
  248. package/src/components/Permissions/PermissionRequests.tsx +50 -43
  249. package/src/components/RingingCall/RingingCall.tsx +40 -14
  250. package/src/components/RingingCall/RingingCallControls.tsx +2 -1
  251. package/src/components/Search/SearchInput.tsx +2 -3
  252. package/src/components/StreamTheme/StreamTheme.tsx +3 -1
  253. package/src/components/Tooltip/Tooltip.tsx +3 -10
  254. package/src/components/VideoPreview/VideoPreview.tsx +50 -5
  255. package/src/components/index.ts +1 -1
  256. package/src/core/components/CallLayout/LivestreamLayout.tsx +48 -18
  257. package/src/core/components/CallLayout/PaginatedGridLayout.tsx +14 -0
  258. package/src/core/components/CallLayout/PipLayout/Grid.tsx +10 -2
  259. package/src/core/components/CallLayout/PipLayout/Pip.tsx +6 -2
  260. package/src/core/components/CallLayout/SpeakerLayout.tsx +27 -0
  261. package/src/core/components/CallLayout/partcipantFilter.test.ts +38 -31
  262. package/src/core/components/ParticipantView/ConnectionQualityIndicator.tsx +54 -0
  263. package/src/core/components/ParticipantView/DefaultParticipantViewUI.tsx +60 -27
  264. package/src/core/components/ParticipantView/ParticipantActionsContextMenu.tsx +63 -22
  265. package/src/core/components/ParticipantView/index.ts +1 -0
  266. package/src/core/components/StreamVideo/StreamVideo.tsx +39 -4
  267. package/src/core/components/Video/BaseVideoPlaceholder.tsx +13 -30
  268. package/src/core/components/Video/DefaultPictureInPicturePlaceholder.tsx +5 -2
  269. package/src/core/components/Video/DefaultVideoPlaceholder.tsx +2 -2
  270. package/src/embedded/call/CallControls.tsx +9 -18
  271. package/src/embedded/call/CallHeader.tsx +3 -12
  272. package/src/embedded/call/CallLayout.tsx +1 -1
  273. package/src/embedded/livestream/host/HostLayout.tsx +26 -20
  274. package/src/embedded/livestream/host/HostStateRouter.tsx +12 -8
  275. package/src/embedded/livestream/viewer/ViewerLayout.tsx +8 -11
  276. package/src/embedded/livestream/viewer/ViewerLobby.tsx +31 -15
  277. package/src/embedded/shared/BlurToggleButton/BlurToggleButton.tsx +18 -12
  278. package/src/embedded/shared/CallDuration/CallDuration.tsx +32 -0
  279. package/src/embedded/shared/CallFeedback/CallEndedScreen.tsx +27 -13
  280. package/src/embedded/shared/CallFeedback/RatingScreen.tsx +20 -12
  281. package/src/embedded/shared/CallFeedback/StarRating.tsx +10 -3
  282. package/src/embedded/shared/CallFeedback/ThankYouScreen.tsx +6 -3
  283. package/src/embedded/shared/ConnectionNotification/ConnectionNotification.tsx +21 -14
  284. package/src/embedded/shared/JoinError/JoinError.tsx +7 -6
  285. package/src/embedded/shared/Lobby/DeviceControls.tsx +25 -3
  286. package/src/embedded/shared/Lobby/Lobby.tsx +19 -22
  287. package/src/embedded/shared/Lobby/ToggleMicButton.tsx +10 -3
  288. package/src/embedded/shared/Lobby/VideoPreviewFallbacks.tsx +4 -2
  289. package/src/embedded/shared/index.ts +1 -0
  290. package/src/hooks/useDeviceList.tsx +2 -2
  291. package/src/i18n/Streami18n.ts +67 -0
  292. package/src/i18n/TranslationContext.tsx +55 -0
  293. package/src/i18n/index.ts +22 -0
  294. package/src/i18n/keys.ts +169 -0
  295. package/src/i18n/runtimeDefaults.ts +17 -0
  296. package/src/i18n/types.ts +78 -0
  297. package/src/i18n/useStreami18n.ts +66 -0
  298. package/src/utilities/filter.test.ts +132 -124
  299. package/src/utilities/normalizeString.test.ts +50 -48
  300. package/dist/embedded-CallStatsLatencyChart-CpL1M_s0.cjs.js +0 -59
  301. package/dist/embedded-CallStatsLatencyChart-CpL1M_s0.cjs.js.map +0 -1
  302. package/dist/esm/src/components/Button/TextButton.js +0 -8
  303. package/dist/esm/src/components/Button/TextButton.js.map +0 -1
  304. package/dist/esm/src/components/CallControls/CallStatsButton.js +0 -18
  305. package/dist/esm/src/components/CallControls/CallStatsButton.js.map +0 -1
  306. package/dist/esm/src/components/CallStats/CallStats.js +0 -180
  307. package/dist/esm/src/components/CallStats/CallStats.js.map +0 -1
  308. package/dist/esm/src/components/CallStats/CallStatsLatencyChart.js +0 -57
  309. package/dist/esm/src/components/CallStats/CallStatsLatencyChart.js.map +0 -1
  310. package/dist/esm/src/translations/en.json.js +0 -177
  311. package/dist/esm/src/translations/en.json.js.map +0 -1
  312. package/dist/esm/src/translations/index.js +0 -6
  313. package/dist/esm/src/translations/index.js.map +0 -1
  314. package/dist/latency-chart-CpL1M_s0.cjs.js +0 -59
  315. package/dist/latency-chart-CpL1M_s0.cjs.js.map +0 -1
  316. package/dist/src/components/Button/TextButton.d.ts +0 -2
  317. package/dist/src/components/CallControls/CallStatsButton.d.ts +0 -4
  318. package/dist/src/components/CallStats/CallStats.d.ts +0 -22
  319. package/dist/src/components/CallStats/CallStatsLatencyChart.d.ts +0 -7
  320. package/dist/src/components/CallStats/index.d.ts +0 -1
  321. package/dist/src/translations/index.d.ts +0 -146
  322. package/src/components/Button/TextButton.tsx +0 -12
  323. package/src/components/CallControls/CallStatsButton.tsx +0 -37
  324. package/src/components/CallStats/CallStats.tsx +0 -439
  325. package/src/components/CallStats/CallStatsLatencyChart.tsx +0 -76
  326. package/src/components/CallStats/index.ts +0 -1
  327. package/src/translations/en.json +0 -154
  328. package/src/translations/index.ts +0 -3
@@ -0,0 +1,45 @@
1
+ import type { Streami18nState as CoreStreami18nState, LooseTranslationDictionaryOf, RelativeTimeCatalog, StreamTFunctionFor, TranslationDictionaryOf, TranslationKeyOf } from '@stream-io/i18n';
2
+ import type { TranslationCatalog as GeneratedCatalog } from './keys';
3
+ /**
4
+ * The SDK's i18n types, instantiated from the generic helpers in `@stream-io/i18n`.
5
+ *
6
+ * The derivations live in core so both video SDKs (and Chat) share one implementation; the *catalog*
7
+ * stays here, because it is generated from this package's own `t()` call sites. That split is why
8
+ * core's helpers are generic over the catalog rather than driven by module augmentation — two
9
+ * catalogs have to be able to coexist in one TypeScript program, which a monorepo typechecking the
10
+ * web and React Native SDKs in one pass does.
11
+ *
12
+ * `relativeTime.*` is intersected in because it is core's copy, not ours: `timestampFormatter`
13
+ * renders "Today" / "3d ago" through `t()`, and without these keys in the catalog an integrator
14
+ * could not type a dictionary that translates them.
15
+ */
16
+ export type TranslationCatalog = GeneratedCatalog & RelativeTimeCatalog;
17
+ /**
18
+ * Keys resolved from bundled data rather than from an inline `defaultValue`.
19
+ *
20
+ * `never`, because `runtimeDefaults.ts` is empty — every key this SDK uses is written literally
21
+ * with its English copy at the call site. `timestamp.*` / `duration.*` are matched by prefix inside
22
+ * core and need no entry here.
23
+ *
24
+ * **It must never become `string`.** `string` collapses the prose overload in `StreamTFunctionFor`,
25
+ * which silently disables all key checking: every `t('typo.key', 'copy')` would compile. Widen it
26
+ * only to a literal prefix template (`` `foo.${string}` ``) when a real bundled key appears.
27
+ */
28
+ export type BundledKey = never;
29
+ export type TranslationKey = TranslationKeyOf<TranslationCatalog>;
30
+ export type TranslationDictionary = TranslationDictionaryOf<TranslationCatalog>;
31
+ export type LooseTranslationDictionary = LooseTranslationDictionaryOf<TranslationCatalog>;
32
+ export type StreamTFunction = StreamTFunctionFor<TranslationCatalog, BundledKey>;
33
+ /**
34
+ * The value held by `Streami18n.state`, parameterized for this SDK's catalog.
35
+ *
36
+ * Exported because `state` is public: a consumer subscribing to it needs to name the type for a
37
+ * module-scope selector. Core's default-parameterized `Streami18nState` is not a substitute — `t` is
38
+ * contravariant in its key parameter, so that one is not assignable to this.
39
+ */
40
+ export type Streami18nState = CoreStreami18nState<TranslationCatalog, BundledKey>;
41
+ /**
42
+ * Re-exported so an integrator can type a formatter, a locale config or a date parser without
43
+ * taking a direct dependency on `@stream-io/i18n`.
44
+ */
45
+ export type { CustomFormatters, DateTimeParserModule, DayjsLocaleConfig, DurationFormatterOptions, DynamicTranslationKey, FormatterFactory, LooseTranslateFunction, PredefinedFormatters, TDateTimeParser, TDateTimeParserInput, TDateTimeParserOutput, TimestampFormatterOptions, } from '@stream-io/i18n';
@@ -0,0 +1,19 @@
1
+ import { Streami18n } from './Streami18n';
2
+ import type { TranslationContextValue } from './TranslationContext';
3
+ import type { LooseTranslationDictionary } from './types';
4
+ export type UseStreami18nParams = {
5
+ /** An instance the integrator configured. One is created when absent. */
6
+ i18nInstance?: Streami18n;
7
+ /** The language the SDK's copy renders in. Changing it switches languages in place. */
8
+ language?: string;
9
+ /** Dictionaries to register, keyed by language code. Partial dictionaries are safe. */
10
+ translations?: Record<string, LooseTranslationDictionary>;
11
+ };
12
+ /**
13
+ * Resolves the translation context value: creates or adopts a {@link Streami18n} instance,
14
+ * registers the supplied dictionaries, initializes it and keeps `t` fresh across language changes.
15
+ *
16
+ * `init()` and the store subscription belong to `useStreami18nState` in `@stream-io/i18n/react`,
17
+ * shared with the React Native SDK.
18
+ */
19
+ export declare const useStreami18n: ({ i18nInstance, language, translations, }: UseStreami18nParams) => TranslationContextValue;
package/index.ts CHANGED
@@ -7,7 +7,7 @@ export * from './src/core';
7
7
 
8
8
  export * from './src/components';
9
9
  export * from './src/wrappers';
10
- export * from './src/translations';
10
+ export * from './src/i18n';
11
11
  export {
12
12
  useHorizontalScrollPosition,
13
13
  useVerticalScrollPosition,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stream-io/video-react-sdk",
3
- "version": "2.0.0-beta.0",
3
+ "version": "2.0.0-beta.1",
4
4
  "main": "./dist/index.cjs.js",
5
5
  "module": "./dist/esm/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -21,8 +21,13 @@
21
21
  "scripts": {
22
22
  "clean": "rimraf dist",
23
23
  "start": "rollup -c -w",
24
- "build": "rimraf dist && NODE_ENV=production rollup -c && yarn copy-css",
25
- "copy-css": "cp -R ../../node_modules/@stream-io/video-styling/dist/* dist/"
24
+ "build": "rimraf dist && yarn build-translations && NODE_ENV=production rollup -c && yarn copy-css",
25
+ "copy-css": "cp -R ../../node_modules/@stream-io/video-styling/dist/* dist/",
26
+ "build-translations": "node scripts/generate-i18n-keys.mts && yarn run -T prettier --write --log-level warn src/i18n/keys.ts",
27
+ "validate-translations": "yarn build-translations && git diff --exit-code -- src/i18n/keys.ts src/i18n/__tests__/catalog.fixture.json",
28
+ "i18n:export": "node scripts/generate-i18n-keys.mts --json en.json",
29
+ "test": "vitest",
30
+ "test-ci": "vitest run"
26
31
  },
27
32
  "repository": {
28
33
  "type": "git",
@@ -32,6 +37,7 @@
32
37
  "files": [
33
38
  "dist",
34
39
  "src",
40
+ "!src/**/__tests__",
35
41
  "assets",
36
42
  "index.ts",
37
43
  "embedded.ts",
@@ -49,24 +55,22 @@
49
55
  ],
50
56
  "dependencies": {
51
57
  "@floating-ui/react": "^0.27.20",
52
- "@stream-io/video-client": "2.0.0-beta.0",
53
- "@stream-io/video-filters-web": "0.9.0",
54
- "@stream-io/video-react-bindings": "2.0.0-beta.0",
55
- "chart.js": "^4.5.1",
56
- "clsx": "^2.1.1",
57
- "react-chartjs-2": "^5.3.1"
58
+ "@stream-io/i18n": "^1.0.2",
59
+ "@stream-io/video-client": "2.0.0-beta.1",
60
+ "@stream-io/video-filters-web": "1.0.0-beta.0",
61
+ "@stream-io/video-react-bindings": "2.0.0-beta.1",
62
+ "clsx": "^2.1.1"
58
63
  },
59
64
  "peerDependencies": {
60
65
  "react": "^17 || ^18 || ^19",
61
66
  "react-dom": "^17 || ^18 || ^19"
62
67
  },
63
68
  "devDependencies": {
64
- "@rollup/plugin-json": "^6.1.0",
65
69
  "@rollup/plugin-replace": "^6.0.3",
66
70
  "@rollup/plugin-typescript": "^12.3.0",
67
- "@stream-io/audio-filters-web": "^0.10.4",
71
+ "@stream-io/audio-filters-web": "^1.0.0-beta.0",
68
72
  "@stream-io/typescript-config": "^0.0.0",
69
- "@stream-io/video-styling": "^2.0.0-beta.0",
73
+ "@stream-io/video-styling": "^2.0.0-beta.1",
70
74
  "@types/node": "^25.9.5",
71
75
  "@types/react": "~19.2.18",
72
76
  "@types/react-dom": "~19.2.4",
@@ -74,6 +78,7 @@
74
78
  "react-dom": "19.2.8",
75
79
  "rimraf": "^6.1.3",
76
80
  "rollup": "^4.62.4",
77
- "typescript": "^6.0.3"
81
+ "typescript": "^6.0.3",
82
+ "vitest": "^4.1.10"
78
83
  }
79
84
  }
@@ -1,39 +1,64 @@
1
1
  import { ComponentProps, CSSProperties, useState } from 'react';
2
2
  import clsx from 'clsx';
3
3
 
4
+ export type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl';
5
+
4
6
  export type AvatarData = {
5
7
  imageSrc?: string;
6
8
  name?: string;
7
9
  style?: CSSProperties & Record<string, string | number>;
8
10
  };
9
11
 
10
- export type AvatarProps = AvatarData & ComponentProps<'img'>;
12
+ export type AvatarVariantProps = {
13
+ size?: AvatarSize;
14
+ showOutline?: boolean;
15
+ };
16
+
17
+ export type AvatarProps = AvatarData &
18
+ ComponentProps<'img'> &
19
+ AvatarVariantProps;
20
+
21
+ const variantClasses = ({ size = 'md', showOutline }: AvatarVariantProps) => [
22
+ `str-video__avatar--size-${size}`,
23
+ showOutline && 'str-video__avatar--outlined',
24
+ ];
11
25
 
12
26
  export const Avatar = ({
13
27
  imageSrc,
14
28
  name,
15
29
  style,
16
30
  className,
31
+ size = 'md',
32
+ showOutline,
17
33
  ...rest
18
34
  }: AvatarProps) => {
19
35
  const [error, setError] = useState(false);
20
36
 
37
+ if (!imageSrc || error) {
38
+ return name ? (
39
+ <AvatarFallback
40
+ className={className}
41
+ style={style}
42
+ names={name.split(/\s+/).filter(Boolean)}
43
+ size={size}
44
+ showOutline={showOutline}
45
+ />
46
+ ) : null;
47
+ }
48
+
21
49
  return (
22
- <>
23
- {(!imageSrc || error) && name && (
24
- <AvatarFallback className={className} style={style} names={[name]} />
25
- )}
26
- {imageSrc && !error && (
27
- <img
28
- onError={() => setError(true)}
29
- alt="avatar"
30
- className={clsx('str-video__avatar', className)}
31
- src={imageSrc}
32
- style={style}
33
- {...rest}
34
- />
50
+ <img
51
+ onError={() => setError(true)}
52
+ alt="avatar"
53
+ className={clsx(
54
+ 'str-video__avatar',
55
+ variantClasses({ size, showOutline }),
56
+ className,
35
57
  )}
36
- </>
58
+ src={imageSrc}
59
+ style={style}
60
+ {...rest}
61
+ />
37
62
  );
38
63
  };
39
64
 
@@ -41,20 +66,29 @@ type AvatarFallbackProps = {
41
66
  names: string[];
42
67
  className?: string;
43
68
  style?: CSSProperties & Record<string, string | number>;
44
- };
69
+ } & AvatarVariantProps;
70
+
45
71
  export const AvatarFallback = ({
46
72
  className,
47
73
  names,
48
74
  style,
75
+ size = 'md',
76
+ showOutline,
49
77
  }: AvatarFallbackProps) => {
78
+ const isCompact = size === 'xs' || size === 'sm';
79
+
50
80
  return (
51
81
  <div
52
- className={clsx('str-video__avatar--initials-fallback', className)}
82
+ className={clsx(
83
+ 'str-video__avatar--initials-fallback',
84
+ variantClasses({ size, showOutline }),
85
+ className,
86
+ )}
53
87
  style={style}
54
88
  >
55
89
  <div>
56
- {names[0][0]}
57
- {names[1]?.[0]}
90
+ {names[0]?.[0]}
91
+ {!isCompact && names[1]?.[0]}
58
92
  </div>
59
93
  </div>
60
94
  );
@@ -0,0 +1,48 @@
1
+ import { ComponentPropsWithoutRef, forwardRef } from 'react';
2
+ import clsx from 'clsx';
3
+
4
+ import { Icon } from '../Icon';
5
+
6
+ export type BadgeVariant =
7
+ 'default' | 'primary' | 'error' | 'neutral' | 'inverse';
8
+
9
+ export type BadgeSize = 'xs' | 'sm' | 'md';
10
+
11
+ export type BadgeProps = ComponentPropsWithoutRef<'span'> & {
12
+ variant?: BadgeVariant;
13
+ size?: BadgeSize;
14
+ icon?: string;
15
+ };
16
+
17
+ /**
18
+ * A compact badge for counts, notifications and error markers.
19
+ *
20
+ * Without `icon` it is a pill that grows with its content; with `icon` it is a
21
+ * circle of the size given by `size`.
22
+ *
23
+ * The badge carries no positioning of its own — whatever it annotates places
24
+ * it. For the call controls, rendering a badge among `CompositeButton`'s
25
+ * children anchors it to the top-right corner of the button.
26
+ */
27
+ export const Badge = forwardRef<HTMLSpanElement, BadgeProps>(
28
+ function BadgeRender(
29
+ { variant = 'default', size = 'sm', icon, className, children, ...rest },
30
+ ref,
31
+ ) {
32
+ return (
33
+ <span
34
+ ref={ref}
35
+ className={clsx(
36
+ 'str-video__badge',
37
+ `str-video__badge--${variant}`,
38
+ `str-video__badge--size-${size}`,
39
+ icon && 'str-video__badge--icon',
40
+ className,
41
+ )}
42
+ {...rest}
43
+ >
44
+ {icon ? <Icon icon={icon} /> : children}
45
+ </span>
46
+ );
47
+ },
48
+ );
@@ -0,0 +1 @@
1
+ export * from './Badge';
@@ -0,0 +1,49 @@
1
+ import { ComponentPropsWithoutRef, forwardRef } from 'react';
2
+ import clsx from 'clsx';
3
+
4
+ export type ButtonVariant = 'primary' | 'secondary' | 'destructive';
5
+
6
+ export type ButtonAppearance = 'solid' | 'outline' | 'ghost';
7
+
8
+ export type ButtonSize = 'xs' | 'sm' | 'md' | 'lg';
9
+
10
+ export type ButtonProps = ComponentPropsWithoutRef<'button'> & {
11
+ variant?: ButtonVariant;
12
+ appearance?: ButtonAppearance;
13
+ size?: ButtonSize;
14
+ active?: boolean;
15
+ };
16
+
17
+ export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
18
+ function ButtonRender(
19
+ {
20
+ variant = 'primary',
21
+ appearance = 'solid',
22
+ size = 'md',
23
+ active,
24
+ className,
25
+ type = 'button',
26
+ children,
27
+ ...rest
28
+ },
29
+ ref,
30
+ ) {
31
+ return (
32
+ <button
33
+ ref={ref}
34
+ type={type}
35
+ className={clsx(
36
+ 'str-video__button',
37
+ `str-video__button--${variant}`,
38
+ `str-video__button--${appearance}`,
39
+ `str-video__button--size-${size}`,
40
+ className,
41
+ )}
42
+ {...rest}
43
+ aria-pressed={active ?? rest['aria-pressed']}
44
+ >
45
+ {children}
46
+ </button>
47
+ );
48
+ },
49
+ );
@@ -8,11 +8,13 @@ import {
8
8
  ReactElement,
9
9
  } from 'react';
10
10
  import { Placement } from '@floating-ui/react';
11
+ import { useI18n } from '../../i18n';
11
12
 
13
+ import { Button, ButtonAppearance, ButtonSize, ButtonVariant } from './Button';
12
14
  import { IconButton } from './IconButton';
13
15
  import { isComponentType } from '../../utilities';
14
16
 
15
- export type IconButtonWithMenuProps<E extends HTMLElement = HTMLButtonElement> =
17
+ export type CompositeButtonProps<E extends HTMLElement = HTMLButtonElement> =
16
18
  PropsWithChildren<{
17
19
  active?: boolean;
18
20
  Menu?: ComponentType | ReactElement | null;
@@ -21,91 +23,98 @@ export type IconButtonWithMenuProps<E extends HTMLElement = HTMLButtonElement> =
21
23
  menuPlacement?: Placement;
22
24
  menuOffset?: number;
23
25
  ToggleMenuButton?: ComponentType<ToggleMenuButtonProps<E>>;
24
- variant?: 'primary' | 'secondary';
26
+ variant?: ButtonVariant;
27
+ appearance?: ButtonAppearance;
28
+ size?: Exclude<ButtonSize, 'xs'>;
25
29
  onMenuToggle?: (menuShown: boolean) => void;
26
30
  }> &
27
31
  ComponentProps<'button'>;
28
32
 
29
- export const CompositeButton = forwardRef<
30
- HTMLDivElement,
31
- IconButtonWithMenuProps
32
- >(function CompositeButtonRender(
33
- {
34
- disabled,
35
- caption,
36
- children,
37
- className,
38
- active,
39
- Menu,
40
- menuPlacement,
41
- menuOffset,
42
- title,
43
- ToggleMenuButton = DefaultToggleMenuButton,
44
- variant,
45
- onClick,
46
- onMenuToggle,
47
- ...restButtonProps
48
- },
49
- ref,
50
- ) {
51
- return (
52
- <div
53
- className={clsx('str-video__composite-button', className, {
54
- 'str-video__composite-button--caption': caption,
55
- 'str-video__composite-button--menu': Menu,
56
- })}
57
- title={title}
58
- ref={ref}
59
- >
33
+ export const CompositeButton = forwardRef<HTMLDivElement, CompositeButtonProps>(
34
+ function CompositeButtonRender(
35
+ {
36
+ appearance,
37
+ caption,
38
+ children,
39
+ className,
40
+ disabled,
41
+ Menu,
42
+ menuOffset,
43
+ menuPlacement,
44
+ onMenuToggle,
45
+ active,
46
+ size = 'md',
47
+ title,
48
+ ToggleMenuButton = CompositeCaret,
49
+ variant = 'secondary',
50
+ ...buttonProps
51
+ },
52
+ ref,
53
+ ) {
54
+ return (
60
55
  <div
61
- className={clsx('str-video__composite-button__button-group', {
62
- 'str-video__composite-button__button-group--active': active,
63
- 'str-video__composite-button__button-group--active-primary':
64
- active && variant === 'primary',
65
- 'str-video__composite-button__button-group--active-secondary':
66
- active && variant === 'secondary',
67
- 'str-video__composite-button__button-group--disabled': disabled,
68
- })}
56
+ ref={ref}
57
+ title={title}
58
+ className={clsx(
59
+ 'str-video__composite-button',
60
+ `str-video__composite-button--${variant}`,
61
+ `str-video__composite-button--size-${size}`,
62
+ `str-video__composite-button--${appearance ?? 'solid'}`,
63
+ Menu && 'str-video__composite-button--menu',
64
+ className,
65
+ )}
69
66
  >
70
- <button
71
- type="button"
72
- className="str-video__composite-button__button"
73
- onClick={(e) => {
74
- e.preventDefault();
75
- onClick?.(e);
76
- }}
77
- disabled={disabled}
78
- {...restButtonProps}
79
- >
80
- {children}
81
- </button>
82
- {Menu && (
83
- <MenuToggle
84
- offset={menuOffset}
85
- placement={menuPlacement}
86
- ToggleButton={ToggleMenuButton}
87
- onToggle={onMenuToggle}
67
+ <div className="str-video__composite-button__group">
68
+ <Button
69
+ variant={variant}
70
+ appearance={appearance}
71
+ size={size}
72
+ disabled={disabled}
73
+ active={active}
74
+ className="str-video__composite-button__action str-video__button--icon-only"
75
+ {...buttonProps}
88
76
  >
89
- {isComponentType(Menu) ? <Menu /> : Menu}
90
- </MenuToggle>
77
+ {children}
78
+ </Button>
79
+ {Menu &&
80
+ (disabled ? (
81
+ <CompositeCaret menuShown={false} disabled />
82
+ ) : (
83
+ <MenuToggle
84
+ offset={menuOffset}
85
+ placement={menuPlacement}
86
+ ToggleButton={ToggleMenuButton}
87
+ onToggle={onMenuToggle}
88
+ >
89
+ {isComponentType(Menu) ? <Menu /> : Menu}
90
+ </MenuToggle>
91
+ ))}
92
+ </div>
93
+ {caption && (
94
+ <span className="str-video__composite-button__caption">
95
+ {caption}
96
+ </span>
91
97
  )}
92
98
  </div>
93
- {caption && (
94
- <div className="str-video__composite-button__caption">{caption}</div>
95
- )}
96
- </div>
97
- );
98
- });
99
+ );
100
+ },
101
+ );
99
102
 
100
- const DefaultToggleMenuButton = forwardRef<
103
+ const CompositeCaret = forwardRef<
101
104
  HTMLButtonElement,
102
- ToggleMenuButtonProps
103
- >(function DefaultToggleMenuButtonRender({ menuShown }, ref) {
105
+ { menuShown: boolean; disabled?: boolean }
106
+ >(function CompositeCaretRender({ menuShown, disabled }, ref) {
107
+ const { t } = useI18n();
108
+
104
109
  return (
105
110
  <IconButton
106
- className={clsx('str-video__menu-toggle-button', {
107
- 'str-video__menu-toggle-button--active': menuShown,
108
- })}
111
+ className="str-video__composite-button__caret"
112
+ size="xs"
113
+ appearance="ghost"
114
+ disabled={disabled}
115
+ aria-label={t('common.toggleMenu.ariaLabel', 'Toggle menu')}
116
+ aria-haspopup="menu"
117
+ aria-expanded={menuShown}
109
118
  icon={menuShown ? 'caret-down' : 'caret-up'}
110
119
  ref={ref}
111
120
  />
@@ -1,33 +1,23 @@
1
- import { ComponentProps, ForwardedRef, forwardRef } from 'react';
1
+ import { forwardRef } from 'react';
2
2
  import clsx from 'clsx';
3
3
 
4
- import { Icon, IconProps } from '../Icon';
4
+ import { Button, ButtonProps } from './Button';
5
+ import { Icon } from '../Icon';
5
6
 
6
- export type ButtonWithIconProps = {
7
- enabled?: boolean;
8
- variant?: string;
9
- } & ComponentProps<'button'> &
10
- IconProps;
7
+ export type IconButtonProps = Omit<ButtonProps, 'children'> & {
8
+ icon: string;
9
+ };
11
10
 
12
- export const IconButton = forwardRef(function IconButtonRender(
13
- props: ButtonWithIconProps,
14
- ref: ForwardedRef<HTMLButtonElement>,
15
- ) {
16
- const { icon, enabled, variant, onClick, className, ...rest } = props;
17
- return (
18
- <button
19
- className={clsx('str-video__call-controls__button', className, {
20
- [`str-video__call-controls__button--variant-${variant}`]: variant,
21
- 'str-video__call-controls__button--enabled': enabled,
22
- })}
23
- onClick={(e) => {
24
- e.preventDefault();
25
- onClick?.(e);
26
- }}
27
- ref={ref}
28
- {...rest}
29
- >
30
- <Icon icon={icon} />
31
- </button>
32
- );
33
- });
11
+ export const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(
12
+ function IconButtonRender({ icon, className, ...props }, ref) {
13
+ return (
14
+ <Button
15
+ ref={ref}
16
+ className={clsx('str-video__button--icon-only', className)}
17
+ {...props}
18
+ >
19
+ <Icon icon={icon} />
20
+ </Button>
21
+ );
22
+ },
23
+ );
@@ -1,3 +1,3 @@
1
- export * from './CompositeButton';
1
+ export * from './Button';
2
2
  export * from './IconButton';
3
- export * from './TextButton';
3
+ export * from './CompositeButton';
@@ -32,9 +32,11 @@ export const AcceptCallButton = ({
32
32
  );
33
33
  return (
34
34
  <IconButton
35
+ className="str-video__accept-call-button"
36
+ size="sm"
35
37
  disabled={disabled}
36
38
  icon="call-accept"
37
- variant="success"
39
+ variant="secondary"
38
40
  data-testid="accept-call-button"
39
41
  onClick={handleClick}
40
42
  />