@werxt/livekit-components-react 2.9.20

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 (488) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +36 -0
  3. package/dist/assets/icons/CameraDisabledIcon.d.ts +11 -0
  4. package/dist/assets/icons/CameraDisabledIcon.d.ts.map +1 -0
  5. package/dist/assets/icons/CameraIcon.d.ts +11 -0
  6. package/dist/assets/icons/CameraIcon.d.ts.map +1 -0
  7. package/dist/assets/icons/ChatCloseIcon.d.ts +11 -0
  8. package/dist/assets/icons/ChatCloseIcon.d.ts.map +1 -0
  9. package/dist/assets/icons/ChatIcon.d.ts +11 -0
  10. package/dist/assets/icons/ChatIcon.d.ts.map +1 -0
  11. package/dist/assets/icons/Chevron.d.ts +11 -0
  12. package/dist/assets/icons/Chevron.d.ts.map +1 -0
  13. package/dist/assets/icons/FocusToggleIcon.d.ts +11 -0
  14. package/dist/assets/icons/FocusToggleIcon.d.ts.map +1 -0
  15. package/dist/assets/icons/GearIcon.d.ts +11 -0
  16. package/dist/assets/icons/GearIcon.d.ts.map +1 -0
  17. package/dist/assets/icons/LeaveIcon.d.ts +11 -0
  18. package/dist/assets/icons/LeaveIcon.d.ts.map +1 -0
  19. package/dist/assets/icons/LockLockedIcon.d.ts +11 -0
  20. package/dist/assets/icons/LockLockedIcon.d.ts.map +1 -0
  21. package/dist/assets/icons/MicDisabledIcon.d.ts +11 -0
  22. package/dist/assets/icons/MicDisabledIcon.d.ts.map +1 -0
  23. package/dist/assets/icons/MicIcon.d.ts +11 -0
  24. package/dist/assets/icons/MicIcon.d.ts.map +1 -0
  25. package/dist/assets/icons/QualityExcellentIcon.d.ts +11 -0
  26. package/dist/assets/icons/QualityExcellentIcon.d.ts.map +1 -0
  27. package/dist/assets/icons/QualityGoodIcon.d.ts +11 -0
  28. package/dist/assets/icons/QualityGoodIcon.d.ts.map +1 -0
  29. package/dist/assets/icons/QualityPoorIcon.d.ts +11 -0
  30. package/dist/assets/icons/QualityPoorIcon.d.ts.map +1 -0
  31. package/dist/assets/icons/QualityUnknownIcon.d.ts +11 -0
  32. package/dist/assets/icons/QualityUnknownIcon.d.ts.map +1 -0
  33. package/dist/assets/icons/ScreenShareIcon.d.ts +11 -0
  34. package/dist/assets/icons/ScreenShareIcon.d.ts.map +1 -0
  35. package/dist/assets/icons/ScreenShareStopIcon.d.ts +11 -0
  36. package/dist/assets/icons/ScreenShareStopIcon.d.ts.map +1 -0
  37. package/dist/assets/icons/SpinnerIcon.d.ts +11 -0
  38. package/dist/assets/icons/SpinnerIcon.d.ts.map +1 -0
  39. package/dist/assets/icons/UnfocusToggleIcon.d.ts +11 -0
  40. package/dist/assets/icons/UnfocusToggleIcon.d.ts.map +1 -0
  41. package/dist/assets/icons/index.d.ts +20 -0
  42. package/dist/assets/icons/index.d.ts.map +1 -0
  43. package/dist/assets/icons/util.d.ts +11 -0
  44. package/dist/assets/icons/util.d.ts.map +1 -0
  45. package/dist/assets/images/ParticipantPlaceholder.d.ts +11 -0
  46. package/dist/assets/images/ParticipantPlaceholder.d.ts.map +1 -0
  47. package/dist/assets/images/index.d.ts +2 -0
  48. package/dist/assets/images/index.d.ts.map +1 -0
  49. package/dist/components/ChatEntry.d.ts +35 -0
  50. package/dist/components/ChatEntry.d.ts.map +1 -0
  51. package/dist/components/ConnectionState.d.ts +23 -0
  52. package/dist/components/ConnectionState.d.ts.map +1 -0
  53. package/dist/components/ConnectionStateToast.d.ts +13 -0
  54. package/dist/components/ConnectionStateToast.d.ts.map +1 -0
  55. package/dist/components/LiveKitRoom.d.ts +92 -0
  56. package/dist/components/LiveKitRoom.d.ts.map +1 -0
  57. package/dist/components/ParticipantLoop.d.ts +28 -0
  58. package/dist/components/ParticipantLoop.d.ts.map +1 -0
  59. package/dist/components/RoomAudioRenderer.d.ts +29 -0
  60. package/dist/components/RoomAudioRenderer.d.ts.map +1 -0
  61. package/dist/components/RoomName.d.ts +20 -0
  62. package/dist/components/RoomName.d.ts.map +1 -0
  63. package/dist/components/SessionProvider.d.ts +13 -0
  64. package/dist/components/SessionProvider.d.ts.map +1 -0
  65. package/dist/components/Toast.d.ts +14 -0
  66. package/dist/components/Toast.d.ts.map +1 -0
  67. package/dist/components/TrackLoop.d.ts +26 -0
  68. package/dist/components/TrackLoop.d.ts.map +1 -0
  69. package/dist/components/controls/ChatToggle.d.ts +19 -0
  70. package/dist/components/controls/ChatToggle.d.ts.map +1 -0
  71. package/dist/components/controls/ClearPinButton.d.ts +20 -0
  72. package/dist/components/controls/ClearPinButton.d.ts.map +1 -0
  73. package/dist/components/controls/DisconnectButton.d.ts +19 -0
  74. package/dist/components/controls/DisconnectButton.d.ts.map +1 -0
  75. package/dist/components/controls/FocusToggle.d.ts +21 -0
  76. package/dist/components/controls/FocusToggle.d.ts.map +1 -0
  77. package/dist/components/controls/MediaDeviceSelect.d.ts +40 -0
  78. package/dist/components/controls/MediaDeviceSelect.d.ts.map +1 -0
  79. package/dist/components/controls/PaginationControl.d.ts +9 -0
  80. package/dist/components/controls/PaginationControl.d.ts.map +1 -0
  81. package/dist/components/controls/PaginationIndicator.d.ts +7 -0
  82. package/dist/components/controls/PaginationIndicator.d.ts.map +1 -0
  83. package/dist/components/controls/SettingsMenuToggle.d.ts +13 -0
  84. package/dist/components/controls/SettingsMenuToggle.d.ts.map +1 -0
  85. package/dist/components/controls/StartAudio.d.ts +24 -0
  86. package/dist/components/controls/StartAudio.d.ts.map +1 -0
  87. package/dist/components/controls/StartMediaButton.d.ts +22 -0
  88. package/dist/components/controls/StartMediaButton.d.ts.map +1 -0
  89. package/dist/components/controls/TrackToggle.d.ts +32 -0
  90. package/dist/components/controls/TrackToggle.d.ts.map +1 -0
  91. package/dist/components/index.d.ts +30 -0
  92. package/dist/components/index.d.ts.map +1 -0
  93. package/dist/components/layout/CarouselLayout.d.ts +27 -0
  94. package/dist/components/layout/CarouselLayout.d.ts.map +1 -0
  95. package/dist/components/layout/FocusLayout.d.ts +25 -0
  96. package/dist/components/layout/FocusLayout.d.ts.map +1 -0
  97. package/dist/components/layout/GridLayout.d.ts +26 -0
  98. package/dist/components/layout/GridLayout.d.ts.map +1 -0
  99. package/dist/components/layout/LayoutContextProvider.d.ts +12 -0
  100. package/dist/components/layout/LayoutContextProvider.d.ts.map +1 -0
  101. package/dist/components/layout/index.d.ts +4 -0
  102. package/dist/components/layout/index.d.ts.map +1 -0
  103. package/dist/components/participant/AudioTrack.d.ts +33 -0
  104. package/dist/components/participant/AudioTrack.d.ts.map +1 -0
  105. package/dist/components/participant/AudioVisualizer.d.ts +22 -0
  106. package/dist/components/participant/AudioVisualizer.d.ts.map +1 -0
  107. package/dist/components/participant/BarVisualizer.d.ts +77 -0
  108. package/dist/components/participant/BarVisualizer.d.ts.map +1 -0
  109. package/dist/components/participant/ConnectionQualityIndicator.d.ts +16 -0
  110. package/dist/components/participant/ConnectionQualityIndicator.d.ts.map +1 -0
  111. package/dist/components/participant/ParticipantAudioTile.d.ts +14 -0
  112. package/dist/components/participant/ParticipantAudioTile.d.ts.map +1 -0
  113. package/dist/components/participant/ParticipantName.d.ts +17 -0
  114. package/dist/components/participant/ParticipantName.d.ts.map +1 -0
  115. package/dist/components/participant/ParticipantTile.d.ts +49 -0
  116. package/dist/components/participant/ParticipantTile.d.ts.map +1 -0
  117. package/dist/components/participant/TrackMutedIndicator.d.ts +19 -0
  118. package/dist/components/participant/TrackMutedIndicator.d.ts.map +1 -0
  119. package/dist/components/participant/VideoTrack.d.ts +23 -0
  120. package/dist/components/participant/VideoTrack.d.ts.map +1 -0
  121. package/dist/components/participant/animationSequences/connectingSequence.d.ts +2 -0
  122. package/dist/components/participant/animationSequences/connectingSequence.d.ts.map +1 -0
  123. package/dist/components/participant/animationSequences/listeningSequence.d.ts +2 -0
  124. package/dist/components/participant/animationSequences/listeningSequence.d.ts.map +1 -0
  125. package/dist/components/participant/animationSequences/thinkingSequence.d.ts +2 -0
  126. package/dist/components/participant/animationSequences/thinkingSequence.d.ts.map +1 -0
  127. package/dist/components/participant/animators/useBarAnimator.d.ts +3 -0
  128. package/dist/components/participant/animators/useBarAnimator.d.ts.map +1 -0
  129. package/dist/components-lNrIMTWQ.mjs +1051 -0
  130. package/dist/components-lNrIMTWQ.mjs.map +1 -0
  131. package/dist/context/chat-context.d.ts +23 -0
  132. package/dist/context/chat-context.d.ts.map +1 -0
  133. package/dist/context/feature-context.d.ts +14 -0
  134. package/dist/context/feature-context.d.ts.map +1 -0
  135. package/dist/context/index.d.ts +10 -0
  136. package/dist/context/index.d.ts.map +1 -0
  137. package/dist/context/layout-context.d.ts +32 -0
  138. package/dist/context/layout-context.d.ts.map +1 -0
  139. package/dist/context/participant-context.d.ts +22 -0
  140. package/dist/context/participant-context.d.ts.map +1 -0
  141. package/dist/context/pin-context.d.ts +17 -0
  142. package/dist/context/pin-context.d.ts.map +1 -0
  143. package/dist/context/room-context.d.ts +22 -0
  144. package/dist/context/room-context.d.ts.map +1 -0
  145. package/dist/context/session-context.d.ts +22 -0
  146. package/dist/context/session-context.d.ts.map +1 -0
  147. package/dist/context/track-reference-context.d.ts +25 -0
  148. package/dist/context/track-reference-context.d.ts.map +1 -0
  149. package/dist/contexts-D4V9wQRc.mjs +4026 -0
  150. package/dist/contexts-D4V9wQRc.mjs.map +1 -0
  151. package/dist/hooks/cloud/krisp/useKrispNoiseFilter.d.ts +42 -0
  152. package/dist/hooks/cloud/krisp/useKrispNoiseFilter.d.ts.map +1 -0
  153. package/dist/hooks/index.d.ts +54 -0
  154. package/dist/hooks/index.d.ts.map +1 -0
  155. package/dist/hooks/internal/index.d.ts +10 -0
  156. package/dist/hooks/internal/index.d.ts.map +1 -0
  157. package/dist/hooks/internal/useMediaQuery.d.ts +7 -0
  158. package/dist/hooks/internal/useMediaQuery.d.ts.map +1 -0
  159. package/dist/hooks/internal/useObservableState.d.ts +6 -0
  160. package/dist/hooks/internal/useObservableState.d.ts.map +1 -0
  161. package/dist/hooks/internal/useResizeObserver.d.ts +14 -0
  162. package/dist/hooks/internal/useResizeObserver.d.ts.map +1 -0
  163. package/dist/hooks/useAgent.d.ts +219 -0
  164. package/dist/hooks/useAgent.d.ts.map +1 -0
  165. package/dist/hooks/useAudioPlayback.d.ts +15 -0
  166. package/dist/hooks/useAudioPlayback.d.ts.map +1 -0
  167. package/dist/hooks/useChat.d.ts +43 -0
  168. package/dist/hooks/useChat.d.ts.map +1 -0
  169. package/dist/hooks/useChatToggle.d.ts +21 -0
  170. package/dist/hooks/useChatToggle.d.ts.map +1 -0
  171. package/dist/hooks/useClearPinButton.d.ts +15 -0
  172. package/dist/hooks/useClearPinButton.d.ts.map +1 -0
  173. package/dist/hooks/useConnectionQualityIndicator.d.ts +20 -0
  174. package/dist/hooks/useConnectionQualityIndicator.d.ts.map +1 -0
  175. package/dist/hooks/useConnectionStatus.d.ts +12 -0
  176. package/dist/hooks/useConnectionStatus.d.ts.map +1 -0
  177. package/dist/hooks/useDataChannel.d.ts +38 -0
  178. package/dist/hooks/useDataChannel.d.ts.map +1 -0
  179. package/dist/hooks/useDisconnectButton.d.ts +21 -0
  180. package/dist/hooks/useDisconnectButton.d.ts.map +1 -0
  181. package/dist/hooks/useEvents.d.ts +9 -0
  182. package/dist/hooks/useEvents.d.ts.map +1 -0
  183. package/dist/hooks/useFacingMode.d.ts +10 -0
  184. package/dist/hooks/useFacingMode.d.ts.map +1 -0
  185. package/dist/hooks/useFocusToggle.d.ts +26 -0
  186. package/dist/hooks/useFocusToggle.d.ts.map +1 -0
  187. package/dist/hooks/useGridLayout.d.ts +27 -0
  188. package/dist/hooks/useGridLayout.d.ts.map +1 -0
  189. package/dist/hooks/useIsEncrypted.d.ts +12 -0
  190. package/dist/hooks/useIsEncrypted.d.ts.map +1 -0
  191. package/dist/hooks/useIsMuted.d.ts +22 -0
  192. package/dist/hooks/useIsMuted.d.ts.map +1 -0
  193. package/dist/hooks/useIsRecording.d.ts +11 -0
  194. package/dist/hooks/useIsRecording.d.ts.map +1 -0
  195. package/dist/hooks/useIsSpeaking.d.ts +11 -0
  196. package/dist/hooks/useIsSpeaking.d.ts.map +1 -0
  197. package/dist/hooks/useLiveKitRoom.d.ts +19 -0
  198. package/dist/hooks/useLiveKitRoom.d.ts.map +1 -0
  199. package/dist/hooks/useLocalParticipant.d.ts +29 -0
  200. package/dist/hooks/useLocalParticipant.d.ts.map +1 -0
  201. package/dist/hooks/useLocalParticipantPermissions.d.ts +12 -0
  202. package/dist/hooks/useLocalParticipantPermissions.d.ts.map +1 -0
  203. package/dist/hooks/useMediaDeviceSelect.d.ts +41 -0
  204. package/dist/hooks/useMediaDeviceSelect.d.ts.map +1 -0
  205. package/dist/hooks/useMediaDevices.d.ts +15 -0
  206. package/dist/hooks/useMediaDevices.d.ts.map +1 -0
  207. package/dist/hooks/useMediaTrackBySourceOrName.d.ts +18 -0
  208. package/dist/hooks/useMediaTrackBySourceOrName.d.ts.map +1 -0
  209. package/dist/hooks/usePagination.d.ts +24 -0
  210. package/dist/hooks/usePagination.d.ts.map +1 -0
  211. package/dist/hooks/useParticipantAttributes.d.ts +30 -0
  212. package/dist/hooks/useParticipantAttributes.d.ts.map +1 -0
  213. package/dist/hooks/useParticipantInfo.d.ts +21 -0
  214. package/dist/hooks/useParticipantInfo.d.ts.map +1 -0
  215. package/dist/hooks/useParticipantPermissions.d.ts +17 -0
  216. package/dist/hooks/useParticipantPermissions.d.ts.map +1 -0
  217. package/dist/hooks/useParticipantTile.d.ts +22 -0
  218. package/dist/hooks/useParticipantTile.d.ts.map +1 -0
  219. package/dist/hooks/useParticipantTracks.d.ts +14 -0
  220. package/dist/hooks/useParticipantTracks.d.ts.map +1 -0
  221. package/dist/hooks/useParticipants.d.ts +30 -0
  222. package/dist/hooks/useParticipants.d.ts.map +1 -0
  223. package/dist/hooks/usePersistentUserChoices.d.ts +35 -0
  224. package/dist/hooks/usePersistentUserChoices.d.ts.map +1 -0
  225. package/dist/hooks/usePinnedTracks.d.ts +14 -0
  226. package/dist/hooks/usePinnedTracks.d.ts.map +1 -0
  227. package/dist/hooks/useRemoteParticipant.d.ts +35 -0
  228. package/dist/hooks/useRemoteParticipant.d.ts.map +1 -0
  229. package/dist/hooks/useRemoteParticipants.d.ts +30 -0
  230. package/dist/hooks/useRemoteParticipants.d.ts.map +1 -0
  231. package/dist/hooks/useRoomInfo.d.ts +21 -0
  232. package/dist/hooks/useRoomInfo.d.ts.map +1 -0
  233. package/dist/hooks/useSequentialRoomConnectDisconnect.d.ts +27 -0
  234. package/dist/hooks/useSequentialRoomConnectDisconnect.d.ts.map +1 -0
  235. package/dist/hooks/useSession.d.ts +130 -0
  236. package/dist/hooks/useSession.d.ts.map +1 -0
  237. package/dist/hooks/useSessionMessages.d.ts +29 -0
  238. package/dist/hooks/useSessionMessages.d.ts.map +1 -0
  239. package/dist/hooks/useSettingsToggle.d.ts +20 -0
  240. package/dist/hooks/useSettingsToggle.d.ts.map +1 -0
  241. package/dist/hooks/useSortedParticipants.d.ts +7 -0
  242. package/dist/hooks/useSortedParticipants.d.ts.map +1 -0
  243. package/dist/hooks/useSpeakingParticipants.d.ts +16 -0
  244. package/dist/hooks/useSpeakingParticipants.d.ts.map +1 -0
  245. package/dist/hooks/useStartAudio.d.ts +27 -0
  246. package/dist/hooks/useStartAudio.d.ts.map +1 -0
  247. package/dist/hooks/useStartVideo.d.ts +26 -0
  248. package/dist/hooks/useStartVideo.d.ts.map +1 -0
  249. package/dist/hooks/useSwipe.d.ts +24 -0
  250. package/dist/hooks/useSwipe.d.ts.map +1 -0
  251. package/dist/hooks/useTextStream.d.ts +20 -0
  252. package/dist/hooks/useTextStream.d.ts.map +1 -0
  253. package/dist/hooks/useToken.d.ts +20 -0
  254. package/dist/hooks/useToken.d.ts.map +1 -0
  255. package/dist/hooks/useTrack.d.ts +4 -0
  256. package/dist/hooks/useTrack.d.ts.map +1 -0
  257. package/dist/hooks/useTrackByName.d.ts +10 -0
  258. package/dist/hooks/useTrackByName.d.ts.map +1 -0
  259. package/dist/hooks/useTrackMutedIndicator.d.ts +18 -0
  260. package/dist/hooks/useTrackMutedIndicator.d.ts.map +1 -0
  261. package/dist/hooks/useTrackRefBySourceOrName.d.ts +7 -0
  262. package/dist/hooks/useTrackRefBySourceOrName.d.ts.map +1 -0
  263. package/dist/hooks/useTrackSyncTime.d.ts +10 -0
  264. package/dist/hooks/useTrackSyncTime.d.ts.map +1 -0
  265. package/dist/hooks/useTrackToggle.d.ts +27 -0
  266. package/dist/hooks/useTrackToggle.d.ts.map +1 -0
  267. package/dist/hooks/useTrackTranscription.d.ts +26 -0
  268. package/dist/hooks/useTrackTranscription.d.ts.map +1 -0
  269. package/dist/hooks/useTrackVolume.d.ts +49 -0
  270. package/dist/hooks/useTrackVolume.d.ts.map +1 -0
  271. package/dist/hooks/useTracks.d.ts +29 -0
  272. package/dist/hooks/useTracks.d.ts.map +1 -0
  273. package/dist/hooks/useTranscriptions.d.ts +21 -0
  274. package/dist/hooks/useTranscriptions.d.ts.map +1 -0
  275. package/dist/hooks/useVisualStableUpdate.d.ts +27 -0
  276. package/dist/hooks/useVisualStableUpdate.d.ts.map +1 -0
  277. package/dist/hooks/useVoiceAssistant.d.ts +43 -0
  278. package/dist/hooks/useVoiceAssistant.d.ts.map +1 -0
  279. package/dist/hooks/useWarnAboutMissingStyles.d.ts +5 -0
  280. package/dist/hooks/useWarnAboutMissingStyles.d.ts.map +1 -0
  281. package/dist/hooks-hQJmeINB.mjs +1992 -0
  282. package/dist/hooks-hQJmeINB.mjs.map +1 -0
  283. package/dist/hooks.d.ts +2 -0
  284. package/dist/hooks.js +2 -0
  285. package/dist/hooks.js.map +1 -0
  286. package/dist/hooks.mjs +64 -0
  287. package/dist/hooks.mjs.map +1 -0
  288. package/dist/index.d.ts +9 -0
  289. package/dist/index.d.ts.map +1 -0
  290. package/dist/index.docs.d.ts +6 -0
  291. package/dist/index.docs.d.ts.map +1 -0
  292. package/dist/index.js +2 -0
  293. package/dist/index.js.map +1 -0
  294. package/dist/index.mjs +157 -0
  295. package/dist/index.mjs.map +1 -0
  296. package/dist/krisp.d.ts +2 -0
  297. package/dist/krisp.js +2 -0
  298. package/dist/krisp.js.map +1 -0
  299. package/dist/krisp.mjs +45 -0
  300. package/dist/krisp.mjs.map +1 -0
  301. package/dist/mergeProps.d.ts +25 -0
  302. package/dist/mergeProps.d.ts.map +1 -0
  303. package/dist/prefabs/AudioConference.d.ts +22 -0
  304. package/dist/prefabs/AudioConference.d.ts.map +1 -0
  305. package/dist/prefabs/Chat.d.ts +35 -0
  306. package/dist/prefabs/Chat.d.ts.map +1 -0
  307. package/dist/prefabs/ControlBar.d.ts +45 -0
  308. package/dist/prefabs/ControlBar.d.ts.map +1 -0
  309. package/dist/prefabs/MediaDeviceMenu.d.ts +36 -0
  310. package/dist/prefabs/MediaDeviceMenu.d.ts.map +1 -0
  311. package/dist/prefabs/PreJoin.d.ts +59 -0
  312. package/dist/prefabs/PreJoin.d.ts.map +1 -0
  313. package/dist/prefabs/VideoConference.d.ts +35 -0
  314. package/dist/prefabs/VideoConference.d.ts.map +1 -0
  315. package/dist/prefabs/VoiceAssistantControlBar.d.ts +32 -0
  316. package/dist/prefabs/VoiceAssistantControlBar.d.ts.map +1 -0
  317. package/dist/prefabs/index.d.ts +8 -0
  318. package/dist/prefabs/index.d.ts.map +1 -0
  319. package/dist/prefabs.d.ts +2 -0
  320. package/dist/prefabs.js +2 -0
  321. package/dist/prefabs.js.map +1 -0
  322. package/dist/prefabs.mjs +579 -0
  323. package/dist/prefabs.mjs.map +1 -0
  324. package/dist/room-BP3SCCCd.mjs +191 -0
  325. package/dist/room-BP3SCCCd.mjs.map +1 -0
  326. package/dist/shared-88J2fzv7.js +2 -0
  327. package/dist/shared-88J2fzv7.js.map +1 -0
  328. package/dist/shared-BDr0qLg4.js +4 -0
  329. package/dist/shared-BDr0qLg4.js.map +1 -0
  330. package/dist/shared-CjI_UuOX.js +2 -0
  331. package/dist/shared-CjI_UuOX.js.map +1 -0
  332. package/dist/shared-DTHOl3uJ.js +2 -0
  333. package/dist/shared-DTHOl3uJ.js.map +1 -0
  334. package/dist/utils.d.ts +19 -0
  335. package/dist/utils.d.ts.map +1 -0
  336. package/package.json +104 -0
  337. package/src/assets/icons/CameraDisabledIcon.tsx +15 -0
  338. package/src/assets/icons/CameraIcon.tsx +14 -0
  339. package/src/assets/icons/ChatCloseIcon.tsx +17 -0
  340. package/src/assets/icons/ChatIcon.tsx +25 -0
  341. package/src/assets/icons/Chevron.tsx +19 -0
  342. package/src/assets/icons/FocusToggleIcon.tsx +16 -0
  343. package/src/assets/icons/GearIcon.tsx +19 -0
  344. package/src/assets/icons/LeaveIcon.tsx +25 -0
  345. package/src/assets/icons/LockLockedIcon.tsx +19 -0
  346. package/src/assets/icons/MicDisabledIcon.tsx +15 -0
  347. package/src/assets/icons/MicIcon.tsx +19 -0
  348. package/src/assets/icons/QualityExcellentIcon.tsx +15 -0
  349. package/src/assets/icons/QualityGoodIcon.tsx +19 -0
  350. package/src/assets/icons/QualityPoorIcon.tsx +20 -0
  351. package/src/assets/icons/QualityUnknownIcon.tsx +17 -0
  352. package/src/assets/icons/ScreenShareIcon.tsx +25 -0
  353. package/src/assets/icons/ScreenShareStopIcon.tsx +21 -0
  354. package/src/assets/icons/SpinnerIcon.tsx +93 -0
  355. package/src/assets/icons/UnfocusToggleIcon.tsx +16 -0
  356. package/src/assets/icons/index.ts +19 -0
  357. package/src/assets/icons/util.tsx +47 -0
  358. package/src/assets/images/ParticipantPlaceholder.tsx +31 -0
  359. package/src/assets/images/index.ts +1 -0
  360. package/src/assets/template.js +21 -0
  361. package/src/components/ChatEntry.tsx +112 -0
  362. package/src/components/ConnectionState.tsx +36 -0
  363. package/src/components/ConnectionStateToast.tsx +47 -0
  364. package/src/components/LiveKitRoom.tsx +122 -0
  365. package/src/components/ParticipantLoop.tsx +41 -0
  366. package/src/components/RoomAudioRenderer.tsx +57 -0
  367. package/src/components/RoomName.tsx +36 -0
  368. package/src/components/SessionProvider.tsx +22 -0
  369. package/src/components/Toast.tsx +18 -0
  370. package/src/components/TrackLoop.tsx +45 -0
  371. package/src/components/controls/ChatToggle.tsx +32 -0
  372. package/src/components/controls/ClearPinButton.tsx +32 -0
  373. package/src/components/controls/DisconnectButton.tsx +32 -0
  374. package/src/components/controls/FocusToggle.tsx +54 -0
  375. package/src/components/controls/MediaDeviceSelect.tsx +144 -0
  376. package/src/components/controls/PaginationControl.tsx +51 -0
  377. package/src/components/controls/PaginationIndicator.tsx +26 -0
  378. package/src/components/controls/SettingsMenuToggle.tsx +26 -0
  379. package/src/components/controls/StartAudio.tsx +40 -0
  380. package/src/components/controls/StartMediaButton.tsx +41 -0
  381. package/src/components/controls/TrackToggle.tsx +54 -0
  382. package/src/components/index.ts +34 -0
  383. package/src/components/layout/CarouselLayout.tsx +80 -0
  384. package/src/components/layout/FocusLayout.tsx +37 -0
  385. package/src/components/layout/GridLayout.tsx +63 -0
  386. package/src/components/layout/LayoutContextProvider.tsx +36 -0
  387. package/src/components/layout/index.ts +3 -0
  388. package/src/components/participant/AudioTrack.tsx +89 -0
  389. package/src/components/participant/AudioVisualizer.tsx +67 -0
  390. package/src/components/participant/BarVisualizer.tsx +164 -0
  391. package/src/components/participant/ConnectionQualityIndicator.tsx +36 -0
  392. package/src/components/participant/ParticipantAudioTile.tsx +67 -0
  393. package/src/components/participant/ParticipantName.tsx +50 -0
  394. package/src/components/participant/ParticipantTile.tsx +192 -0
  395. package/src/components/participant/TrackMutedIndicator.tsx +53 -0
  396. package/src/components/participant/VideoTrack.tsx +92 -0
  397. package/src/components/participant/animationSequences/connectingSequence.ts +9 -0
  398. package/src/components/participant/animationSequences/listeningSequence.ts +6 -0
  399. package/src/components/participant/animationSequences/thinkingSequence.ts +12 -0
  400. package/src/components/participant/animators/useBarAnimator.ts +55 -0
  401. package/src/context/chat-context.ts +37 -0
  402. package/src/context/feature-context.ts +28 -0
  403. package/src/context/index.ts +27 -0
  404. package/src/context/layout-context.ts +72 -0
  405. package/src/context/participant-context.ts +44 -0
  406. package/src/context/pin-context.ts +27 -0
  407. package/src/context/room-context.ts +42 -0
  408. package/src/context/session-context.ts +43 -0
  409. package/src/context/track-reference-context.ts +47 -0
  410. package/src/hooks/cloud/krisp/useKrispNoiseFilter.ts +110 -0
  411. package/src/hooks/index.ts +72 -0
  412. package/src/hooks/internal/index.ts +10 -0
  413. package/src/hooks/internal/useMediaQuery.ts +46 -0
  414. package/src/hooks/internal/useObservableState.ts +24 -0
  415. package/src/hooks/internal/useResizeObserver.ts +124 -0
  416. package/src/hooks/useAgent.ts +945 -0
  417. package/src/hooks/useAudioPlayback.ts +34 -0
  418. package/src/hooks/useChat.ts +57 -0
  419. package/src/hooks/useChatToggle.ts +38 -0
  420. package/src/hooks/useClearPinButton.ts +29 -0
  421. package/src/hooks/useConnectionQualityIndicator.ts +33 -0
  422. package/src/hooks/useConnectionStatus.ts +22 -0
  423. package/src/hooks/useDataChannel.ts +73 -0
  424. package/src/hooks/useDisconnectButton.ts +36 -0
  425. package/src/hooks/useEvents.ts +39 -0
  426. package/src/hooks/useFacingMode.ts +22 -0
  427. package/src/hooks/useFocusToggle.ts +59 -0
  428. package/src/hooks/useGridLayout.ts +44 -0
  429. package/src/hooks/useIsEncrypted.ts +29 -0
  430. package/src/hooks/useIsMuted.ts +51 -0
  431. package/src/hooks/useIsRecording.ts +23 -0
  432. package/src/hooks/useIsSpeaking.ts +21 -0
  433. package/src/hooks/useLiveKitRoom.ts +186 -0
  434. package/src/hooks/useLocalParticipant.ts +73 -0
  435. package/src/hooks/useLocalParticipantPermissions.ts +24 -0
  436. package/src/hooks/useMediaDeviceSelect.ts +81 -0
  437. package/src/hooks/useMediaDevices.ts +28 -0
  438. package/src/hooks/useMediaTrackBySourceOrName.ts +97 -0
  439. package/src/hooks/usePagination.test.ts +77 -0
  440. package/src/hooks/usePagination.ts +67 -0
  441. package/src/hooks/useParticipantAttributes.ts +69 -0
  442. package/src/hooks/useParticipantInfo.ts +35 -0
  443. package/src/hooks/useParticipantPermissions.ts +29 -0
  444. package/src/hooks/useParticipantTile.ts +81 -0
  445. package/src/hooks/useParticipantTracks.ts +54 -0
  446. package/src/hooks/useParticipants.ts +42 -0
  447. package/src/hooks/usePersistentUserChoices.ts +64 -0
  448. package/src/hooks/usePinnedTracks.ts +24 -0
  449. package/src/hooks/useRemoteParticipant.ts +79 -0
  450. package/src/hooks/useRemoteParticipants.ts +45 -0
  451. package/src/hooks/useRoomInfo.ts +32 -0
  452. package/src/hooks/useSequentialRoomConnectDisconnect.ts +171 -0
  453. package/src/hooks/useSession.ts +642 -0
  454. package/src/hooks/useSessionMessages.ts +158 -0
  455. package/src/hooks/useSettingsToggle.ts +32 -0
  456. package/src/hooks/useSortedParticipants.ts +20 -0
  457. package/src/hooks/useSpeakingParticipants.ts +27 -0
  458. package/src/hooks/useStartAudio.ts +50 -0
  459. package/src/hooks/useStartVideo.ts +49 -0
  460. package/src/hooks/useSwipe.ts +68 -0
  461. package/src/hooks/useTextStream.ts +35 -0
  462. package/src/hooks/useToken.ts +54 -0
  463. package/src/hooks/useTrack.ts +11 -0
  464. package/src/hooks/useTrackByName.ts +15 -0
  465. package/src/hooks/useTrackMutedIndicator.ts +44 -0
  466. package/src/hooks/useTrackRefBySourceOrName.ts +30 -0
  467. package/src/hooks/useTrackSyncTime.ts +18 -0
  468. package/src/hooks/useTrackToggle.ts +93 -0
  469. package/src/hooks/useTrackTranscription.ts +75 -0
  470. package/src/hooks/useTrackVolume.ts +283 -0
  471. package/src/hooks/useTracks.test.ts +60 -0
  472. package/src/hooks/useTracks.ts +154 -0
  473. package/src/hooks/useTranscriptions.ts +48 -0
  474. package/src/hooks/useVisualStableUpdate.ts +63 -0
  475. package/src/hooks/useVoiceAssistant.ts +109 -0
  476. package/src/hooks/useWarnAboutMissingStyles.ts +11 -0
  477. package/src/index.docs.ts +12 -0
  478. package/src/index.ts +32 -0
  479. package/src/mergeProps.ts +87 -0
  480. package/src/prefabs/AudioConference.tsx +57 -0
  481. package/src/prefabs/Chat.tsx +153 -0
  482. package/src/prefabs/ControlBar.tsx +227 -0
  483. package/src/prefabs/MediaDeviceMenu.tsx +159 -0
  484. package/src/prefabs/PreJoin.tsx +439 -0
  485. package/src/prefabs/VideoConference.tsx +184 -0
  486. package/src/prefabs/VoiceAssistantControlBar.tsx +109 -0
  487. package/src/prefabs/index.ts +11 -0
  488. package/src/utils.ts +78 -0
@@ -0,0 +1,2 @@
1
+ "use strict";const l=require("./shared-BDr0qLg4.js"),K=require("react"),y=require("livekit-client");function Z(e){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const s=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(n,t,s.get?s:{enumerable:!0,get:()=>e[t]})}}return n.default=e,Object.freeze(n)}const o=Z(K),ee=e=>{const n=o.useRef(e);return o.useEffect(()=>{n.current=e}),n};function te(e,n){const t=se(),s=ee(n);return o.useLayoutEffect(()=>{let r=!1;const i=e.current;if(!i)return;function c(a,u){r||s.current(a,u)}return t==null||t.subscribe(i,c),()=>{r=!0,t==null||t.unsubscribe(i,c)}},[e.current,t,s]),t==null?void 0:t.observer}function ne(){let e=!1,n=[];const t=new Map;if(typeof window>"u")return;const s=new ResizeObserver((r,i)=>{n=n.concat(r),e||window.requestAnimationFrame(()=>{const c=new Set;for(let a=0;a<n.length;a++){if(c.has(n[a].target))continue;c.add(n[a].target);const u=t.get(n[a].target);u==null||u.forEach(d=>d(n[a],i))}n=[],e=!1}),e=!0});return{observer:s,subscribe(r,i){s.observe(r);const c=t.get(r)??[];c.push(i),t.set(r,c)},unsubscribe(r,i){const c=t.get(r)??[];if(c.length===1){s.unobserve(r),t.delete(r);return}const a=c.indexOf(i);a!==-1&&c.splice(a,1),t.set(r,c)}}}let D;const se=()=>D||(D=ne()),q=e=>{const[n,t]=o.useState({width:0,height:0});o.useLayoutEffect(()=>{if(e.current){const{width:r,height:i}=e.current.getBoundingClientRect();t({width:r,height:i})}},[e.current]);const s=o.useCallback(r=>t(r.contentRect),[]);return te(e,s),n};function v(e,n,t=!0){const[s,r]=o.useState(n);return o.useEffect(()=>{if(t&&r(n),typeof window>"u"||!e)return;const i=e.subscribe(r);return()=>i.unsubscribe()},[e,t]),s}function U(e,n){if(n.msg==="show_chat")return{...e,showChat:!0,unreadMessages:0};if(n.msg==="hide_chat")return{...e,showChat:!1};if(n.msg==="toggle_chat"){const t={...e,showChat:!e.showChat};return t.showChat===!0&&(t.unreadMessages=0),t}else return n.msg==="unread_msg"?{...e,unreadMessages:n.count}:n.msg==="toggle_settings"?{...e,showSettings:!e.showSettings}:{...e}}function z(e,n){return n.msg==="set_pin"?[n.trackReference]:n.msg==="clear_pin"?[]:{...e}}const I=o.createContext(void 0);function B(){const e=o.useContext(I);if(!e)throw Error("Tried to access LayoutContext context outside a LayoutContextProvider provider.");return e}function W(e){const n=x();if(e??(e=n),!e)throw Error("Tried to access LayoutContext context outside a LayoutContextProvider provider.");return e}function re(){const[e,n]=o.useReducer(z,l.PIN_DEFAULT_STATE),[t,s]=o.useReducer(U,l.WIDGET_DEFAULT_STATE);return{pin:{dispatch:n,state:e},widget:{dispatch:s,state:t}}}function oe(e){const[n,t]=o.useReducer(z,l.PIN_DEFAULT_STATE),[s,r]=o.useReducer(U,l.WIDGET_DEFAULT_STATE);return e??{pin:{dispatch:t,state:n},widget:{dispatch:r,state:s}}}function x(){return o.useContext(I)}const N=o.createContext(void 0);function ce(){const e=o.useContext(N);if(!e)throw Error("tried to access track context outside of track context provider");return e}function F(){return o.useContext(N)}function A(e){const n=F(),t=e??n;if(!t)throw new Error("No TrackRef, make sure you are inside a TrackRefContext or pass the TrackRef explicitly");return t}const O=o.createContext(void 0);function ie(){const e=o.useContext(O);if(!e)throw Error("tried to access participant context outside of participant context provider");return e}function J(){return o.useContext(O)}function P(e){const n=J(),t=F(),s=e??n??(t==null?void 0:t.participant);if(!s)throw new Error("No participant provided, make sure you are inside a participant context or pass the participant explicitly");return s}function j(e){var n,t,s="";if(typeof e=="string"||typeof e=="number")s+=e;else if(typeof e=="object")if(Array.isArray(e)){var r=e.length;for(n=0;n<r;n++)e[n]&&(t=j(e[n]))&&(s&&(s+=" "),s+=t)}else for(t in e)e[t]&&(s&&(s+=" "),s+=t);return s}function G(){for(var e,n,t=0,s="",r=arguments.length;t<r;t++)(e=arguments[t])&&(n=j(e))&&(s&&(s+=" "),s+=n);return s}function ae(...e){return(...n)=>{for(const t of e)if(typeof t=="function")try{t(...n)}catch(s){console.error(s)}}}function k(...e){const n={...e[0]};for(let t=1;t<e.length;t++){const s=e[t];for(const r in s){const i=n[r],c=s[r];typeof i=="function"&&typeof c=="function"&&r[0]==="o"&&r[1]==="n"&&r.charCodeAt(2)>=65&&r.charCodeAt(2)<=90?n[r]=ae(i,c):(r==="className"||r==="UNSAFE_className")&&typeof i=="string"&&typeof c=="string"?n[r]=G(i,c):n[r]=c!==void 0?c:i}}return n}function ue(e={}){const n=P(e.participant),{className:t,connectionQualityObserver:s}=o.useMemo(()=>l.setupConnectionQualityIndicator(n),[n]),r=v(s,n.connectionQuality);return{className:t,quality:r}}function V(e){const n=l.useEnsureRoom(e),t=o.useMemo(()=>l.connectionStateObserver(n),[n]);return v(t,n.state)}function le(e){const n=l.useRoomContext(),t=V(n);return{buttonProps:o.useMemo(()=>{const{className:r,disconnect:i}=l.setupDisconnectButton(n);return k(e,{className:r,onClick:()=>i(e.stopTracks??!0),disabled:t===y.ConnectionState.Disconnected})},[n,e,t])}}function Q(e){if(e.publication instanceof y.LocalTrackPublication){const n=e.publication.track;if(n){const{facingMode:t}=y.facingModeFromLocalTrack(n);return t}}return"undefined"}function de({trackRef:e,props:n}){const t=A(e),s=x(),{className:r}=o.useMemo(()=>l.setupFocusToggle(),[]),i=o.useMemo(()=>l.isTrackReferencePinned(t,s==null?void 0:s.pin.state),[t,s==null?void 0:s.pin.state]);return{mergedProps:o.useMemo(()=>k(n,{className:r,onClick:a=>{var u,d,p,f,m;(u=n.onClick)==null||u.call(n,a),i?(p=s==null?void 0:(d=s.pin).dispatch)==null||p.call(d,{msg:"clear_pin"}):(m=s==null?void 0:(f=s.pin).dispatch)==null||m.call(f,{msg:"set_pin",trackReference:t})}}),[n,r,t,i,s==null?void 0:s.pin]),inFocus:i}}function fe(e,n,t={}){const s=t.gridLayouts??l.GRID_LAYOUTS,{width:r,height:i}=q(e),c=l.selectGridLayout(s,n,r,i);return o.useEffect(()=>{e.current&&c&&(e.current.style.setProperty("--lk-col-count",c==null?void 0:c.columns.toString()),e.current.style.setProperty("--lk-row-count",c==null?void 0:c.rows.toString()))},[e,c]),{layout:c,containerWidth:r,containerHeight:i}}function L(e,n={}){var a,u;const t=typeof e=="string"?n.participant:e.participant,s=P(t),r=typeof e=="string"?{participant:s,source:e}:e,[i,c]=o.useState(!!((a=r.publication)!=null&&a.isMuted||(u=s.getTrackPublication(r.source))!=null&&u.isMuted));return o.useEffect(()=>{const d=l.mutedObserver(r).subscribe(c);return()=>d.unsubscribe()},[l.getTrackReferenceId(r)]),i}function $(e){const n=P(e),t=o.useMemo(()=>l.createIsSpeakingObserver(n),[n]);return v(t,n.isSpeaking)}function pe(e){return e!==void 0}function me(...e){return k(...e.filter(pe))}function ge(e,n,t){return o.Children.map(e,s=>o.isValidElement(s)&&o.Children.only(e)?(s.props.className&&(n??(n={}),n.className=G(s.props.className,n.className),n.style={...s.props.style,...n.style}),o.cloneElement(s,{...n,key:t})):s)}function be(e){var n,t;if(typeof window<"u"&&typeof process<"u"&&(((n=process==null?void 0:process.env)==null?void 0:n.NODE_ENV)==="dev"||((t=process==null?void 0:process.env)==null?void 0:t.NODE_ENV)==="development")){const s=document.querySelector(".lk-room-container");s&&!getComputedStyle(s).getPropertyValue("--lk-has-imported-styles")&&l.log.warn("It looks like you're not using the `@livekit/components-styles package`. To render the UI with the default styling, please import it in your layout or page.")}}function he(e,n){return e==="processor"&&n&&typeof n=="object"&&"name"in n?n.name:e==="e2ee"&&n?"e2ee-enabled":n}function ye(){const e=l.useRoomContext(),n=o.useMemo(()=>l.participantPermissionObserver(e.localParticipant),[e]);return v(n,e.localParticipant.permissions)}function Se({kind:e,room:n,track:t,requestPermissions:s,onError:r}){const i=l.useMaybeRoomContext(),c=o.useMemo(()=>n??i??new y.Room,[n,i]),a=o.useMemo(()=>l.createMediaDeviceObserver(e,r,s),[e,s,r]),u=v(a,[]),[d,p]=o.useState((c==null?void 0:c.getActiveDevice(e))??"default"),{className:f,activeDeviceObservable:m,setActiveMediaDevice:g}=o.useMemo(()=>l.setupDeviceSelector(e,c),[e,c,t]);return o.useEffect(()=>{const h=m.subscribe(S=>{S&&(l.log.info("setCurrentDeviceId",S),p(S))});return()=>{h==null||h.unsubscribe()}},[m]),{devices:u,className:f,activeDeviceId:d,setActiveMediaDevice:g}}function ve({kind:e,onError:n}){const t=o.useMemo(()=>l.createMediaDeviceObserver(e,n),[e,n]);return v(t,[])}function H(e,n,t={}){const s=o.useRef([]),r=o.useRef(-1),i=n!==r.current,c=typeof t.customSortFunction=="function"?t.customSortFunction(e):l.sortTrackReferences(e);let a=[...c];if(i===!1)try{a=l.updatePages(s.current,c,n)}catch(u){l.log.error("Error while running updatePages(): ",u)}return i?s.current=c:s.current=a,r.current=n,a}function Me(e,n){const[t,s]=o.useState(1),r=Math.max(Math.ceil(n.length/e),1);t>r&&s(r);const i=t*e,c=i-e,a=f=>{s(m=>f==="next"?m===r?m:m+1:m===1?m:m-1)},u=f=>{f>r?s(r):f<1?s(1):s(f)},p=H(n,e).slice(c,i);return{totalPageCount:r,nextPage:()=>a("next"),prevPage:()=>a("previous"),setPage:u,firstItemIndex:c,lastItemIndex:i,tracks:p,currentPage:t}}function ke({trackRef:e,onParticipantClick:n,disableSpeakingIndicator:t,htmlProps:s}){const r=A(e),i=o.useMemo(()=>{const{className:m}=l.setupParticipantTile();return k(s,{className:m,onClick:g=>{var h;if((h=s.onClick)==null||h.call(s,g),typeof n=="function"){const S=r.publication??r.participant.getTrackPublication(r.source);n({participant:r.participant,track:S})}}})},[s,n,r.publication,r.source,r.participant]),c=r.participant.getTrackPublication(y.Track.Source.Microphone),a=o.useMemo(()=>({participant:r.participant,source:y.Track.Source.Microphone,publication:c}),[c,r.participant]),u=L(r),d=L(a),p=$(r.participant),f=Q(r);return{elementProps:{"data-lk-audio-muted":d,"data-lk-video-muted":u,"data-lk-speaking":t===!0?!1:p,"data-lk-local-participant":r.participant.isLocal,"data-lk-source":r.source,"data-lk-facing-mode":f,...i}}}function Ce(e){return e=W(e),o.useMemo(()=>(e==null?void 0:e.pin.state)!==void 0&&e.pin.state.length>=1?e.pin.state:[],[e.pin.state])}function Te({room:e,props:n}){const t=l.useEnsureRoom(e),{className:s,roomAudioPlaybackAllowedObservable:r,handleStartAudioPlayback:i}=o.useMemo(()=>l.setupStartAudio(),[]),c=o.useMemo(()=>r(t),[t,r]),{canPlayAudio:a}=v(c,{canPlayAudio:t.canPlaybackAudio});return{mergedProps:o.useMemo(()=>k(n,{className:s,onClick:()=>{i(t)},style:{display:a?"none":"block"}}),[n,s,a,i,t]),canPlayAudio:a}}function Pe({room:e,props:n}){const t=l.useEnsureRoom(e),{className:s,roomVideoPlaybackAllowedObservable:r,handleStartVideoPlayback:i}=o.useMemo(()=>l.setupStartVideo(),[]),c=o.useMemo(()=>r(t),[t,r]),{canPlayVideo:a}=v(c,{canPlayVideo:t.canPlaybackVideo});return{mergedProps:o.useMemo(()=>k(n,{className:s,onClick:()=>{i(t)},style:{display:a?"none":"block"}}),[n,s,a,i,t]),canPlayVideo:a}}function we(e,n={}){const t=o.useRef(null),s=o.useRef(null),r=n.minSwipeDistance??50,i=u=>{s.current=null,t.current=u.targetTouches[0].clientX},c=u=>{s.current=u.targetTouches[0].clientX},a=o.useCallback(()=>{if(!t.current||!s.current)return;const u=t.current-s.current,d=u>r,p=u<-r;d&&n.onLeftSwipe&&n.onLeftSwipe(),p&&n.onRightSwipe&&n.onRightSwipe()},[r,n]);o.useEffect(()=>{const u=e.current;return u&&(u.addEventListener("touchstart",i,{passive:!0}),u.addEventListener("touchmove",c,{passive:!0}),u.addEventListener("touchend",a,{passive:!0})),()=>{u&&(u.removeEventListener("touchstart",i),u.removeEventListener("touchmove",c),u.removeEventListener("touchend",a))}},[e,a])}function Ee({props:e}){const{dispatch:n,state:t}=B().widget,{className:s}=o.useMemo(()=>l.setupChatToggle(),[]);return{mergedProps:o.useMemo(()=>k(e,{className:s,onClick:()=>{n&&n({msg:"toggle_chat"})},"aria-pressed":t!=null&&t.showChat?"true":"false","data-lk-unread-msgs":t?t.unreadMessages<10?t.unreadMessages.toFixed(0):"9+":"0"}),[e,s,n,t])}}function Ae(e){var i,c;const n=A(e),{className:t,mediaMutedObserver:s}=o.useMemo(()=>l.setupTrackMutedIndicator(n),[l.getTrackReferenceId(n)]);return{isMuted:v(s,!!((i=n.publication)!=null&&i.isMuted||(c=n.participant.getTrackPublication(n.source))!=null&&c.isMuted)),className:t}}function Re({source:e,onChange:n,initialState:t,captureOptions:s,publishOptions:r,onDeviceError:i,room:c,...a}){var T;const u=l.useMaybeRoomContext(),d=o.useMemo(()=>c??u,[c,u]),p=(T=d==null?void 0:d.localParticipant)==null?void 0:T.getTrackPublication(e),f=o.useRef(!1),{toggle:m,className:g,pendingObserver:h,enabledObserver:S}=o.useMemo(()=>d?l.setupMediaToggle(e,d,s,r,i):l.setupManualToggle(),[d,e,JSON.stringify(s),r]),M=v(h,!1),b=v(S,t??!!(p!=null&&p.isEnabled));o.useEffect(()=>{n==null||n(b,f.current),f.current=!1},[b,n]),o.useEffect(()=>{t!==void 0&&(l.log.debug("forcing initial toggle state",e,t),m(t))},[]);const C=o.useMemo(()=>k(a,{className:g}),[a,g]),R=o.useCallback(w=>{var E;f.current=!0,m().catch(()=>f.current=!1),(E=a.onClick)==null||E.call(a,w)},[a,m]);return{toggle:m,enabled:b,pending:M,track:p,buttonProps:{...C,"aria-pressed":b,"data-lk-source":e,"data-lk-enabled":b,disabled:M,onClick:R}}}function De(e=[y.Track.Source.Camera,y.Track.Source.Microphone,y.Track.Source.ScreenShare,y.Track.Source.ScreenShareAudio,y.Track.Source.Unknown],n={}){const t=l.useEnsureRoom(n.room),[s,r]=o.useState([]),[i,c]=o.useState([]),a=o.useMemo(()=>e.map(d=>l.isSourceWitOptions(d)?d.source:d),[JSON.stringify(e)]);return o.useEffect(()=>{const d=l.trackReferencesObservable(t,a,{additionalRoomEvents:n.updateOnlyOn,onlySubscribed:n.onlySubscribed}).subscribe(({trackReferences:p,participants:f})=>{l.log.debug("setting track bundles",p,f),r(p),c(f)});return()=>d.unsubscribe()},[t,JSON.stringify(n.onlySubscribed),JSON.stringify(n.updateOnlyOn),JSON.stringify(e)]),o.useMemo(()=>{if(l.isSourcesWithOptions(e)){const d=Ie(e,i),p=Array.from(s);return i.forEach(f=>{d.has(f.identity)&&(d.get(f.identity)??[]).forEach(g=>{if(s.find(({participant:S,publication:M})=>f.identity===S.identity&&M.source===g))return;l.log.debug(`Add ${g} placeholder for participant ${f.identity}.`);const h={participant:f,source:g};p.push(h)})}),p}else return s},[s,i,e])}function Le(e,n){const t=new Set(e);for(const s of n)t.delete(s);return t}function Ie(e,n){const t=new Map;if(l.isSourcesWithOptions(e)){const s=e.filter(r=>r.withPlaceholder).map(r=>r.source);n.forEach(r=>{const i=r.getTrackPublications().map(a=>{var u;return(u=a.track)==null?void 0:u.source}).filter(a=>a!==void 0),c=Array.from(Le(new Set(s),new Set(i)));c.length>0&&t.set(r.identity,c)})}return t}function xe(e){const n=l.useEnsureRoom(e==null?void 0:e.room),t=V(n),s=o.useMemo(()=>t===y.ConnectionState.Disconnected,[t]),r=o.useMemo(()=>l.setupChat(n,e),[n,e,s]),i=v(r.isSendingObservable,!1),c=v(r.messageObservable,[]);return{send:r.send,chatMessages:c,isSending:i}}function Ne(e={}){const[n,t]=o.useState(l.loadUserChoices(e.defaults,e.preventLoad??!1)),s=o.useCallback(u=>{t(d=>({...d,audioEnabled:u}))},[]),r=o.useCallback(u=>{t(d=>({...d,videoEnabled:u}))},[]),i=o.useCallback(u=>{t(d=>({...d,audioDeviceId:u}))},[]),c=o.useCallback(u=>{t(d=>({...d,videoDeviceId:u}))},[]),a=o.useCallback(u=>{t(d=>({...d,username:u}))},[]);return o.useEffect(()=>{l.saveUserChoices(n,e.preventSave??!1)},[n,e.preventSave]),{userChoices:n,saveAudioInputEnabled:s,saveVideoInputEnabled:r,saveAudioInputDeviceId:i,saveVideoInputDeviceId:c,saveUsername:a}}function Fe(e,n={}){const t=P(e),s=l.useEnsureRoom(n.room),r=o.useMemo(()=>l.encryptionStatusObservable(s,t),[s,t]);return v(r,t.isLocal?t.isE2EEEnabled:!!(t!=null&&t.isEncrypted))}function Oe(e,n={fftSize:32,smoothingTimeConstant:0}){const t=l.isTrackReference(e)?e.publication.track:e,[s,r]=o.useState(0);return o.useEffect(()=>{if(!t||!t.mediaStream)return;const{cleanup:i,analyser:c}=y.createAudioAnalyser(t,n),a=c.frequencyBinCount,u=new Uint8Array(a),p=setInterval(()=>{c.getByteFrequencyData(u);let f=0;for(let m=0;m<u.length;m++){const g=u[m];f+=g*g}r(Math.sqrt(f/u.length)/255)},1e3/30);return()=>{i(),clearInterval(p)}},[t,t==null?void 0:t.mediaStream,JSON.stringify(n)]),s}const Ve=e=>{const n=t=>{let i=1-Math.max(-100,Math.min(-10,t))*-1/100;return i=Math.sqrt(i),i};return e.map(t=>t===-1/0?0:n(t))},_e={bands:5,loPass:100,hiPass:600,updateInterval:32,analyserOptions:{fftSize:2048}};function qe(e,n={}){var c;const t=e instanceof y.Track?e:(c=e==null?void 0:e.publication)==null?void 0:c.track,s={..._e,...n},[r,i]=o.useState(new Array(s.bands).fill(0));return o.useEffect(()=>{if(!t||!(t!=null&&t.mediaStream)){i(g=>g.slice().fill(0));return}const{analyser:a,cleanup:u}=y.createAudioAnalyser(t,s.analyserOptions),d=a.frequencyBinCount,p=new Float32Array(d),m=setInterval(()=>{a.getFloatFrequencyData(p);let g=new Float32Array(p.length);for(let b=0;b<p.length;b++)g[b]=p[b];g=g.slice(s.loPass,s.hiPass);const h=Ve(g),S=h.length,M=[];for(let b=0;b<s.bands;b++){const C=Math.floor(b*S/s.bands),R=Math.floor((b+1)*S/s.bands),T=h.slice(C,R),w=T.length;if(w===0)M.push(0);else{const E=T.reduce((X,Y)=>X+=Y,0);M.push(E/w)}}i(M)},s.updateInterval);return()=>{u(),clearInterval(m)}},[t,t==null?void 0:t.mediaStream,JSON.stringify(n)]),r}const Ue={barCount:120,volMultiplier:5,updateInterval:20};function ze(e,n={}){var p;const t=e instanceof y.Track?e:(p=e==null?void 0:e.publication)==null?void 0:p.track,s={...Ue,...n},r=o.useRef(new Float32Array),i=o.useRef(performance.now()),c=o.useRef(0),[a,u]=o.useState([]),d=o.useCallback(f=>{u(Array.from(We(f,s.barCount).map(m=>Math.sqrt(m)*s.volMultiplier)))},[]);return o.useEffect(()=>{if(!t||!(t!=null&&t.mediaStream))return;const{analyser:f,cleanup:m}=y.createAudioAnalyser(t,{fftSize:_(s.barCount)}),g=_(s.barCount),h=new Float32Array(g),S=()=>{if(M=requestAnimationFrame(S),f.getFloatTimeDomainData(h),r.current.map((b,C)=>b+h[C]),c.current+=1,performance.now()-i.current>=s.updateInterval){const b=h.map(C=>C/c.current);d(b),i.current=performance.now(),c.current=0}};let M=requestAnimationFrame(S);return()=>{m(),cancelAnimationFrame(M)}},[t,t==null?void 0:t.mediaStream,JSON.stringify(n),d]),{bars:a}}function _(e){return e<32?32:Be(e)}function Be(e){let n=2;for(;e>>=1;)n<<=1;return n}function We(e,n){const t=Math.floor(e.length/n),s=new Float32Array(n);for(let r=0;r<n;r++){const i=t*r;let c=0;for(let a=0;a<t;a++)c=c+Math.abs(e[i+a]);s[r]=c/t}return s}exports.LayoutContext=I;exports.ParticipantContext=O;exports.TrackRefContext=N;exports.cloneSingleChild=ge;exports.mergeProps=k;exports.mergeProps$1=me;exports.roomOptionsStringifyReplacer=he;exports.useAudioWaveform=ze;exports.useChat=xe;exports.useChatToggle=Ee;exports.useConnectionQualityIndicator=ue;exports.useConnectionState=V;exports.useCreateLayoutContext=re;exports.useDisconnectButton=le;exports.useEnsureCreateLayoutContext=oe;exports.useEnsureLayoutContext=W;exports.useEnsureParticipant=P;exports.useEnsureTrackRef=A;exports.useFacingMode=Q;exports.useFocusToggle=de;exports.useGridLayout=fe;exports.useIsEncrypted=Fe;exports.useIsMuted=L;exports.useIsSpeaking=$;exports.useLayoutContext=B;exports.useLocalParticipantPermissions=ye;exports.useMaybeLayoutContext=x;exports.useMaybeParticipantContext=J;exports.useMaybeTrackRefContext=F;exports.useMediaDeviceSelect=Se;exports.useMediaDevices=ve;exports.useMultibandTrackVolume=qe;exports.useObservableState=v;exports.usePagination=Me;exports.useParticipantContext=ie;exports.useParticipantTile=ke;exports.usePersistentUserChoices=Ne;exports.usePinnedTracks=Ce;exports.useSize=q;exports.useStartAudio=Te;exports.useStartVideo=Pe;exports.useSwipe=we;exports.useTrackMutedIndicator=Ae;exports.useTrackRefContext=ce;exports.useTrackToggle=Re;exports.useTrackVolume=Oe;exports.useTracks=De;exports.useVisualStableUpdate=H;exports.warnAboutMissingStyles=be;
2
+ //# sourceMappingURL=shared-CjI_UuOX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-CjI_UuOX.js","sources":["../src/hooks/internal/useResizeObserver.ts","../src/hooks/internal/useObservableState.ts","../src/context/chat-context.ts","../src/context/pin-context.ts","../src/context/layout-context.ts","../src/context/track-reference-context.ts","../src/context/participant-context.ts","../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../src/mergeProps.ts","../src/hooks/useConnectionQualityIndicator.ts","../src/hooks/useConnectionStatus.ts","../src/hooks/useDisconnectButton.ts","../src/hooks/useFacingMode.ts","../src/hooks/useFocusToggle.ts","../src/hooks/useGridLayout.ts","../src/hooks/useIsMuted.ts","../src/hooks/useIsSpeaking.ts","../src/utils.ts","../src/hooks/useLocalParticipantPermissions.ts","../src/hooks/useMediaDeviceSelect.ts","../src/hooks/useMediaDevices.ts","../src/hooks/useVisualStableUpdate.ts","../src/hooks/usePagination.ts","../src/hooks/useParticipantTile.ts","../src/hooks/usePinnedTracks.ts","../src/hooks/useStartAudio.ts","../src/hooks/useStartVideo.ts","../src/hooks/useSwipe.ts","../src/hooks/useChatToggle.ts","../src/hooks/useTrackMutedIndicator.ts","../src/hooks/useTrackToggle.ts","../src/hooks/useTracks.ts","../src/hooks/useChat.ts","../src/hooks/usePersistentUserChoices.ts","../src/hooks/useIsEncrypted.ts","../src/hooks/useTrackVolume.ts"],"sourcesContent":["/* eslint-disable no-return-assign */\n/* eslint-disable no-underscore-dangle */\nimport * as React from 'react';\n\nconst useLatest = <T>(current: T) => {\n const storedValue = React.useRef(current);\n React.useEffect(() => {\n storedValue.current = current;\n });\n return storedValue;\n};\n\n/**\n * A React hook that fires a callback whenever ResizeObserver detects a change to its size\n * code extracted from https://github.com/jaredLunde/react-hook/blob/master/packages/resize-observer/src/index.tsx in order to not include the polyfill for resize-observer\n *\n * @internal\n */\nexport function useResizeObserver<T extends HTMLElement>(\n target: React.RefObject<T>,\n callback: UseResizeObserverCallback,\n) {\n const resizeObserver = getResizeObserver();\n const storedCallback = useLatest(callback);\n\n React.useLayoutEffect(() => {\n let didUnsubscribe = false;\n\n const targetEl = target.current;\n if (!targetEl) return;\n\n function cb(entry: ResizeObserverEntry, observer: ResizeObserver) {\n if (didUnsubscribe) return;\n storedCallback.current(entry, observer);\n }\n\n resizeObserver?.subscribe(targetEl as HTMLElement, cb);\n\n return () => {\n didUnsubscribe = true;\n resizeObserver?.unsubscribe(targetEl as HTMLElement, cb);\n };\n }, [target.current, resizeObserver, storedCallback]);\n\n return resizeObserver?.observer;\n}\n\nfunction createResizeObserver() {\n let ticking = false;\n let allEntries: ResizeObserverEntry[] = [];\n\n const callbacks: Map<unknown, Array<UseResizeObserverCallback>> = new Map();\n\n if (typeof window === 'undefined') {\n return;\n }\n\n const observer = new ResizeObserver((entries: ResizeObserverEntry[], obs: ResizeObserver) => {\n allEntries = allEntries.concat(entries);\n if (!ticking) {\n window.requestAnimationFrame(() => {\n const triggered = new Set<Element>();\n for (let i = 0; i < allEntries.length; i++) {\n if (triggered.has(allEntries[i].target)) continue;\n triggered.add(allEntries[i].target);\n const cbs = callbacks.get(allEntries[i].target);\n cbs?.forEach((cb) => cb(allEntries[i], obs));\n }\n allEntries = [];\n ticking = false;\n });\n }\n ticking = true;\n });\n\n return {\n observer,\n subscribe(target: HTMLElement, callback: UseResizeObserverCallback) {\n observer.observe(target);\n const cbs = callbacks.get(target) ?? [];\n cbs.push(callback);\n callbacks.set(target, cbs);\n },\n unsubscribe(target: HTMLElement, callback: UseResizeObserverCallback) {\n const cbs = callbacks.get(target) ?? [];\n if (cbs.length === 1) {\n observer.unobserve(target);\n callbacks.delete(target);\n return;\n }\n const cbIndex = cbs.indexOf(callback);\n if (cbIndex !== -1) cbs.splice(cbIndex, 1);\n callbacks.set(target, cbs);\n },\n };\n}\n\nlet _resizeObserver: ReturnType<typeof createResizeObserver>;\n\nconst getResizeObserver = () =>\n !_resizeObserver ? (_resizeObserver = createResizeObserver()) : _resizeObserver;\n\nexport type UseResizeObserverCallback = (\n entry: ResizeObserverEntry,\n observer: ResizeObserver,\n) => unknown;\n\nexport const useSize = (target: React.RefObject<HTMLDivElement>) => {\n const [size, setSize] = React.useState({ width: 0, height: 0 });\n React.useLayoutEffect(() => {\n if (target.current) {\n const { width, height } = target.current.getBoundingClientRect();\n setSize({ width, height });\n }\n }, [target.current]);\n\n const resizeCallback = React.useCallback(\n (entry: ResizeObserverEntry) => setSize(entry.contentRect),\n [],\n );\n // Where the magic happens\n useResizeObserver(target, resizeCallback);\n return size;\n};\n","import * as React from 'react';\n// @ts-ignore\nimport type { Observable } from 'rxjs';\n\n/**\n * @internal\n */\nexport function useObservableState<T>(\n observable: Observable<T> | undefined,\n startWith: T,\n resetWhenObservableChanges = true,\n) {\n const [state, setState] = React.useState<T>(startWith);\n React.useEffect(() => {\n if (resetWhenObservableChanges) {\n setState(startWith);\n }\n // observable state doesn't run in SSR\n if (typeof window === 'undefined' || !observable) return;\n const subscription = observable.subscribe(setState);\n return () => subscription.unsubscribe();\n }, [observable, resetWhenObservableChanges]);\n return state;\n}\n","import type { WidgetState } from '@livekit/components-core';\nimport type * as React from 'react';\n\n/** @internal */\nexport type ChatContextAction =\n | { msg: 'show_chat' }\n | { msg: 'hide_chat' }\n | { msg: 'toggle_chat' }\n | { msg: 'unread_msg'; count: number }\n | { msg: 'toggle_settings' };\n\n/** @internal */\nexport type WidgetContextType = {\n dispatch?: React.Dispatch<ChatContextAction>;\n state?: WidgetState;\n};\n\n/** @internal */\nexport function chatReducer(state: WidgetState, action: ChatContextAction): WidgetState {\n if (action.msg === 'show_chat') {\n return { ...state, showChat: true, unreadMessages: 0 };\n } else if (action.msg === 'hide_chat') {\n return { ...state, showChat: false };\n } else if (action.msg === 'toggle_chat') {\n const newState = { ...state, showChat: !state.showChat };\n if (newState.showChat === true) {\n newState.unreadMessages = 0;\n }\n return newState;\n } else if (action.msg === 'unread_msg') {\n return { ...state, unreadMessages: action.count };\n } else if (action.msg === 'toggle_settings') {\n return { ...state, showSettings: !state.showSettings };\n } else {\n return { ...state };\n }\n}\n","import type { PinState, TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport type * as React from 'react';\n\n/** @internal */\nexport type PinAction =\n | {\n msg: 'set_pin';\n trackReference: TrackReferenceOrPlaceholder;\n }\n | { msg: 'clear_pin' };\n\n/** @internal */\nexport type PinContextType = {\n dispatch?: React.Dispatch<PinAction>;\n state?: PinState;\n};\n\n/** @internal */\nexport function pinReducer(state: PinState, action: PinAction): PinState {\n if (action.msg === 'set_pin') {\n return [action.trackReference];\n } else if (action.msg === 'clear_pin') {\n return [];\n } else {\n return { ...state };\n }\n}\n","import { PIN_DEFAULT_STATE, WIDGET_DEFAULT_STATE } from '@livekit/components-core';\nimport * as React from 'react';\nimport type { PinContextType } from './pin-context';\nimport type { WidgetContextType } from './chat-context';\nimport { chatReducer } from './chat-context';\nimport { pinReducer } from './pin-context';\n\n/** @public */\nexport type LayoutContextType = {\n pin: PinContextType;\n widget: WidgetContextType;\n};\n\n/** @public */\nexport const LayoutContext = React.createContext<LayoutContextType | undefined>(undefined);\n\n/**\n * Ensures that a layout context is provided via context.\n * If no layout context is provided, an error is thrown.\n * @public\n */\nexport function useLayoutContext(): LayoutContextType {\n const layoutContext = React.useContext(LayoutContext);\n if (!layoutContext) {\n throw Error('Tried to access LayoutContext context outside a LayoutContextProvider provider.');\n }\n return layoutContext;\n}\n\n/**\n * Ensures that a layout context is provided, either via context or explicitly as a parameter.\n * If not inside a `LayoutContext` and no layout context is provided, an error is thrown.\n * @public\n */\nexport function useEnsureLayoutContext(layoutContext?: LayoutContextType) {\n const layout = useMaybeLayoutContext();\n layoutContext ??= layout;\n if (!layoutContext) {\n throw Error('Tried to access LayoutContext context outside a LayoutContextProvider provider.');\n }\n return layoutContext;\n}\n\n/** @public */\nexport function useCreateLayoutContext(): LayoutContextType {\n const [pinState, pinDispatch] = React.useReducer(pinReducer, PIN_DEFAULT_STATE);\n const [widgetState, widgetDispatch] = React.useReducer(chatReducer, WIDGET_DEFAULT_STATE);\n return {\n pin: { dispatch: pinDispatch, state: pinState },\n widget: { dispatch: widgetDispatch, state: widgetState },\n };\n}\n\n/** @public */\nexport function useEnsureCreateLayoutContext(layoutContext?: LayoutContextType): LayoutContextType {\n const [pinState, pinDispatch] = React.useReducer(pinReducer, PIN_DEFAULT_STATE);\n const [widgetState, widgetDispatch] = React.useReducer(chatReducer, WIDGET_DEFAULT_STATE);\n return (\n layoutContext ?? {\n pin: { dispatch: pinDispatch, state: pinState },\n widget: { dispatch: widgetDispatch, state: widgetState },\n }\n );\n}\n\n/**\n * Returns a layout context from the `LayoutContext` if it exists, otherwise `undefined`.\n * @public\n */\nexport function useMaybeLayoutContext(): LayoutContextType | undefined {\n return React.useContext(LayoutContext);\n}\n","import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport * as React from 'react';\n\n/**\n * This context provides a `TrackReferenceOrPlaceholder` to all child components.\n * @public\n */\nexport const TrackRefContext = React.createContext<TrackReferenceOrPlaceholder | undefined>(\n undefined,\n);\n\n/**\n * Ensures that a track reference is provided via context.\n * If not inside a `TrackRefContext`, an error is thrown.\n * @public\n */\nexport function useTrackRefContext() {\n const trackReference = React.useContext(TrackRefContext);\n if (!trackReference) {\n throw Error('tried to access track context outside of track context provider');\n }\n return trackReference;\n}\n\n/**\n * Returns a track reference from the `TrackRefContext` if it exists, otherwise `undefined`.\n * @public\n */\nexport function useMaybeTrackRefContext() {\n return React.useContext(TrackRefContext);\n}\n\n/**\n * Ensures that a track reference is provided, either via context or explicitly as a parameter.\n * If not inside a `TrackRefContext` and no track reference is provided, an error is thrown.\n * @public\n */\nexport function useEnsureTrackRef(trackRef?: TrackReferenceOrPlaceholder) {\n const context = useMaybeTrackRefContext();\n const ref = trackRef ?? context;\n if (!ref) {\n throw new Error(\n 'No TrackRef, make sure you are inside a TrackRefContext or pass the TrackRef explicitly',\n );\n }\n return ref;\n}\n","import type { Participant } from 'livekit-client';\nimport * as React from 'react';\nimport { useMaybeTrackRefContext } from './track-reference-context';\n\n/** @public */\nexport const ParticipantContext = React.createContext<Participant | undefined>(undefined);\n\n/**\n * Ensures that a participant is provided via context.\n * If not inside a `ParticipantContext`, an error is thrown.\n * @public\n */\nexport function useParticipantContext() {\n const participant = React.useContext(ParticipantContext);\n if (!participant) {\n throw Error('tried to access participant context outside of participant context provider');\n }\n return participant;\n}\n\n/**\n * Returns a participant from the `ParticipantContext` if it exists, otherwise `undefined`.\n * @public\n */\nexport function useMaybeParticipantContext() {\n return React.useContext(ParticipantContext);\n}\n\n/**\n * Ensures that a participant is provided, either via context or explicitly as a parameter.\n * If not inside a `ParticipantContext` and no participant is provided, an error is thrown.\n * @public\n */\nexport function useEnsureParticipant(participant?: Participant) {\n const context = useMaybeParticipantContext();\n const trackContext = useMaybeTrackRefContext();\n const p = participant ?? context ?? trackContext?.participant;\n if (!p) {\n throw new Error(\n 'No participant provided, make sure you are inside a participant context or pass the participant explicitly',\n );\n }\n return p;\n}\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","/*\n * Copyright 2020 Adobe. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport clsx from 'clsx';\n\n/**\n * Calls all functions in the order they were chained with the same arguments.\n * @internal\n */\nexport function chain(...callbacks: any[]): (...args: any[]) => void {\n return (...args: any[]) => {\n for (const callback of callbacks) {\n if (typeof callback === 'function') {\n try {\n callback(...args);\n } catch (e) {\n console.error(e);\n }\n }\n }\n };\n}\n\ninterface Props {\n [key: string]: any;\n}\n\n// taken from: https://stackoverflow.com/questions/51603250/typescript-3-parameter-list-intersection-type/51604379#51604379\ntype TupleTypes<T> = { [P in keyof T]: T[P] } extends { [key: number]: infer V } ? V : never;\ntype UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void\n ? I\n : never;\n\n/**\n * Merges multiple props objects together. Event handlers are chained,\n * classNames are combined, and ids are deduplicated - different ids\n * will trigger a side-effect and re-render components hooked up with `useId`.\n * For all other props, the last prop object overrides all previous ones.\n * @param args - Multiple sets of props to merge together.\n * @internal\n */\nexport function mergeProps<T extends Props[]>(...args: T): UnionToIntersection<TupleTypes<T>> {\n // Start with a base clone of the first argument. This is a lot faster than starting\n // with an empty object and adding properties as we go.\n const result: Props = { ...args[0] };\n for (let i = 1; i < args.length; i++) {\n const props = args[i];\n for (const key in props) {\n const a = result[key];\n const b = props[key];\n\n // Chain events\n if (\n typeof a === 'function' &&\n typeof b === 'function' &&\n // This is a lot faster than a regex.\n key[0] === 'o' &&\n key[1] === 'n' &&\n key.charCodeAt(2) >= /* 'A' */ 65 &&\n key.charCodeAt(2) <= /* 'Z' */ 90\n ) {\n result[key] = chain(a, b);\n\n // Merge classnames, sometimes classNames are empty string which eval to false, so we just need to do a type check\n } else if (\n (key === 'className' || key === 'UNSAFE_className') &&\n typeof a === 'string' &&\n typeof b === 'string'\n ) {\n result[key] = clsx(a, b);\n } else {\n result[key] = b !== undefined ? b : a;\n }\n }\n }\n\n return result as UnionToIntersection<TupleTypes<T>>;\n}\n","import { setupConnectionQualityIndicator } from '@livekit/components-core';\nimport type { Participant } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureParticipant } from '../context';\nimport { useObservableState } from './internal';\n\n/** @public */\nexport interface ConnectionQualityIndicatorOptions {\n participant?: Participant;\n}\n\n/**\n * The `useConnectionQualityIndicator` hook provides props for the `ConnectionQualityIndicator` or your custom implementation of it component.\n * @example\n * ```tsx\n * const { quality } = useConnectionQualityIndicator();\n * // or\n * const { quality } = useConnectionQualityIndicator({ participant });\n * ```\n * @public\n */\nexport function useConnectionQualityIndicator(options: ConnectionQualityIndicatorOptions = {}) {\n const p = useEnsureParticipant(options.participant);\n\n const { className, connectionQualityObserver } = React.useMemo(\n () => setupConnectionQualityIndicator(p),\n [p],\n );\n\n const quality = useObservableState(connectionQualityObserver, p.connectionQuality);\n\n return { className, quality };\n}\n","import { connectionStateObserver } from '@livekit/components-core';\nimport type { Room } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\nimport { useObservableState } from './internal';\n\n/**\n * The `useConnectionState` hook allows you to simply implement your own `ConnectionState` component.\n *\n * @example\n * ```tsx\n * const connectionState = useConnectionState(room);\n * ```\n * @public\n */\nexport function useConnectionState(room?: Room) {\n // passed room takes precedence, if not supplied get current room context\n const r = useEnsureRoom(room);\n const observable = React.useMemo(() => connectionStateObserver(r), [r]);\n const connectionState = useObservableState(observable, r.state);\n return connectionState;\n}\n","import { setupDisconnectButton } from '@livekit/components-core';\nimport { ConnectionState } from 'livekit-client';\nimport * as React from 'react';\nimport type { DisconnectButtonProps } from '../components';\nimport { useRoomContext } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport { useConnectionState } from './useConnectionStatus';\n\n/**\n * The `useDisconnectButton` hook is used to implement the `DisconnectButton` or your\n * custom implementation of it. It adds onClick handler to the button to disconnect\n * from the room.\n *\n * @example\n * ```tsx\n * const { buttonProps } = useDisconnectButton(buttonProps);\n * return <button {...buttonProps}>Disconnect</button>;\n * ```\n * @public\n */\nexport function useDisconnectButton(props: DisconnectButtonProps) {\n const room = useRoomContext();\n const connectionState = useConnectionState(room);\n\n const buttonProps = React.useMemo(() => {\n const { className, disconnect } = setupDisconnectButton(room);\n const mergedProps = mergeProps(props, {\n className,\n onClick: () => disconnect(props.stopTracks ?? true),\n disabled: connectionState === ConnectionState.Disconnected,\n });\n return mergedProps;\n }, [room, props, connectionState]);\n\n return { buttonProps };\n}\n","import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { LocalTrackPublication, facingModeFromLocalTrack } from 'livekit-client';\n\n/**\n * Try to determine the `facingMode` of a local participant video track.\n * @remarks\n * Works only on local video tracks.\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/facingMode | MDN docs on facingMode}\n * @alpha\n */\nexport function useFacingMode(\n trackReference: TrackReferenceOrPlaceholder,\n): 'user' | 'environment' | 'left' | 'right' | 'undefined' {\n if (trackReference.publication instanceof LocalTrackPublication) {\n const localTrack = trackReference.publication.track;\n if (localTrack) {\n const { facingMode } = facingModeFromLocalTrack(localTrack);\n return facingMode;\n }\n }\n return 'undefined';\n}\n","import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { setupFocusToggle, isTrackReferencePinned } from '@livekit/components-core';\nimport { useEnsureTrackRef, useMaybeLayoutContext } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport * as React from 'react';\n\n/** @public */\nexport interface UseFocusToggleProps {\n trackRef?: TrackReferenceOrPlaceholder;\n props: React.ButtonHTMLAttributes<HTMLButtonElement>;\n}\n\n/**\n * The `useFocusToggle` hook is used to implement the `FocusToggle` or your custom implementation of it.\n * The `TrackReferenceOrPlaceholder` is used to register a onClick handler and to identify the track to focus on.\n *\n * @example\n * ```tsx\n * const { mergedProps, inFocus } = useFocusToggle({ trackRef, props: yourButtonProps });\n * return <button {...mergedProps}>{inFocus ? 'Unfocus' : 'Focus'}</button>;\n * ```\n * @public\n */\nexport function useFocusToggle({ trackRef, props }: UseFocusToggleProps) {\n const trackReference = useEnsureTrackRef(trackRef);\n\n const layoutContext = useMaybeLayoutContext();\n const { className } = React.useMemo(() => setupFocusToggle(), []);\n\n const inFocus: boolean = React.useMemo(() => {\n return isTrackReferencePinned(trackReference, layoutContext?.pin.state);\n }, [trackReference, layoutContext?.pin.state]);\n\n const mergedProps = React.useMemo(\n () =>\n mergeProps(props, {\n className,\n onClick: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n // Call user defined on click callbacks.\n props.onClick?.(event);\n\n // Set or clear focus based on current focus state.\n if (inFocus) {\n layoutContext?.pin.dispatch?.({\n msg: 'clear_pin',\n });\n } else {\n layoutContext?.pin.dispatch?.({\n msg: 'set_pin',\n trackReference,\n });\n }\n },\n }),\n [props, className, trackReference, inFocus, layoutContext?.pin],\n );\n\n return { mergedProps, inFocus };\n}\n","import { GRID_LAYOUTS, selectGridLayout } from '@livekit/components-core';\nimport type { GridLayoutDefinition, GridLayoutInfo } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useSize } from './internal';\n\n/**\n * The `useGridLayout` hook tries to select the best layout to fit all tiles.\n * If the available screen space is not enough, it will reduce the number of maximum visible\n * tiles and select a layout that still works visually within the given limitations.\n * As the order of tiles changes over time, the hook tries to keep visual updates to a minimum\n * while trying to display important tiles such as speaking participants or screen shares.\n *\n * @example\n * ```tsx\n * const { layout } = useGridLayout(gridElement, trackCount);\n * ```\n * @public\n */\nexport function useGridLayout(\n /** HTML element that contains the grid. */\n gridElement: React.RefObject<HTMLDivElement>,\n /** Count of tracks that should get layed out */\n trackCount: number,\n options: {\n gridLayouts?: GridLayoutDefinition[];\n } = {},\n): { layout: GridLayoutInfo; containerWidth: number; containerHeight: number } {\n const gridLayouts = options.gridLayouts ?? GRID_LAYOUTS;\n const { width, height } = useSize(gridElement);\n const layout = selectGridLayout(gridLayouts, trackCount, width, height);\n\n React.useEffect(() => {\n if (gridElement.current && layout) {\n gridElement.current.style.setProperty('--lk-col-count', layout?.columns.toString());\n gridElement.current.style.setProperty('--lk-row-count', layout?.rows.toString());\n }\n }, [gridElement, layout]);\n\n return {\n layout,\n containerWidth: width,\n containerHeight: height,\n };\n}\n","import {\n type TrackReferenceOrPlaceholder,\n getTrackReferenceId,\n mutedObserver,\n} from '@livekit/components-core';\nimport type { Participant, Track } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureParticipant } from '../context';\n\n/** @public */\nexport interface UseIsMutedOptions {\n participant?: Participant;\n}\n\n/**\n * The `useIsMuted` hook is used to implement the `TrackMutedIndicator` or your custom implementation of it.\n * It returns a `boolean` that indicates if the track is muted or not.\n *\n * @example With a track reference\n * ```tsx\n * const isMuted = useIsMuted(track);\n * ```\n *\n * @param trackRef - A `TrackReference` indicating the track to monitor.\n * @returns boolean indicating if the track is muted\n *\n * @public\n */\nexport function useIsMuted(trackRef: TrackReferenceOrPlaceholder): boolean;\nexport function useIsMuted(\n sourceOrTrackRef: TrackReferenceOrPlaceholder | Track.Source,\n options: UseIsMutedOptions = {},\n) {\n const passedParticipant =\n typeof sourceOrTrackRef === 'string' ? options.participant : sourceOrTrackRef.participant;\n const p = useEnsureParticipant(passedParticipant);\n const ref =\n typeof sourceOrTrackRef === 'string'\n ? { participant: p, source: sourceOrTrackRef }\n : sourceOrTrackRef;\n const [isMuted, setIsMuted] = React.useState(\n !!(ref.publication?.isMuted || p.getTrackPublication(ref.source)?.isMuted),\n );\n\n React.useEffect(() => {\n const listener = mutedObserver(ref).subscribe(setIsMuted);\n return () => listener.unsubscribe();\n }, [getTrackReferenceId(ref)]);\n\n return isMuted;\n}\n","import { createIsSpeakingObserver } from '@livekit/components-core';\nimport type { Participant } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureParticipant } from '../context';\nimport { useObservableState } from './internal';\n\n/**\n * The `useIsSpeaking` hook returns a `boolean` that indicates if the participant is speaking or not.\n * @example\n * ```tsx\n * const isSpeaking = useIsSpeaking(participant);\n * ```\n * @public\n */\nexport function useIsSpeaking(participant?: Participant) {\n const p = useEnsureParticipant(participant);\n const observable = React.useMemo(() => createIsSpeakingObserver(p), [p]);\n const isSpeaking = useObservableState(observable, p.isSpeaking);\n\n return isSpeaking;\n}\n","import * as React from 'react';\nimport { mergeProps as mergePropsReactAria } from './mergeProps';\nimport { log } from '@livekit/components-core';\nimport clsx from 'clsx';\n\n/** @internal */\nexport function isProp<U extends HTMLElement, T extends React.HTMLAttributes<U>>(\n prop: T | undefined,\n): prop is T {\n return prop !== undefined;\n}\n\n/** @internal */\nexport function mergeProps<\n U extends HTMLElement,\n T extends Array<React.HTMLAttributes<U> | undefined>,\n>(...props: T) {\n return mergePropsReactAria(...props.filter(isProp));\n}\n\n/** @internal */\nexport function cloneSingleChild(\n children: React.ReactNode | React.ReactNode[],\n props?: Record<string, any>,\n key?: any,\n) {\n return React.Children.map(children, (child) => {\n // Checking isValidElement is the safe way and avoids a typescript\n // error too.\n if (React.isValidElement(child) && React.Children.only(children)) {\n if (child.props.className) {\n // make sure we retain classnames of both passed props and child\n props ??= {};\n props.className = clsx(child.props.className, props.className);\n props.style = { ...child.props.style, ...props.style };\n }\n return React.cloneElement(child, { ...props, key });\n }\n return child;\n });\n}\n\n/**\n * @internal\n */\nexport function warnAboutMissingStyles(el?: HTMLElement) {\n if (\n typeof window !== 'undefined' &&\n typeof process !== 'undefined' &&\n // eslint-disable-next-line turbo/no-undeclared-env-vars\n (process?.env?.NODE_ENV === 'dev' ||\n // eslint-disable-next-line turbo/no-undeclared-env-vars\n process?.env?.NODE_ENV === 'development')\n ) {\n const target = el ?? document.querySelector('.lk-room-container');\n if (target && !getComputedStyle(target).getPropertyValue('--lk-has-imported-styles')) {\n log.warn(\n \"It looks like you're not using the `@livekit/components-styles package`. To render the UI with the default styling, please import it in your layout or page.\",\n );\n }\n }\n}\n\n/**\n *\n * @internal\n * used to stringify room options to detect dependency changes for react hooks.\n * Replaces processors and e2ee options with strings.\n */\nexport function roomOptionsStringifyReplacer(key: string, val: unknown) {\n if (key === 'processor' && val && typeof val === 'object' && 'name' in val) {\n return val.name;\n }\n if (key === 'e2ee' && val) {\n return 'e2ee-enabled';\n }\n return val;\n}\n","import { participantPermissionObserver } from '@livekit/components-core';\nimport type { ParticipantPermission } from '@livekit/protocol';\nimport * as React from 'react';\nimport { useRoomContext } from '../context';\nimport { useObservableState } from './internal';\n\n/**\n * The `useLocalParticipantPermissions` hook returns the local participant's permissions.\n *\n * @example\n * ```tsx\n * const { canPublish, canPublishData } = useLocalParticipantPermissions();\n * ```\n * @public\n */\nexport function useLocalParticipantPermissions(): ParticipantPermission | undefined {\n const room = useRoomContext();\n const permissionObserver = React.useMemo(\n () => participantPermissionObserver(room.localParticipant),\n [room],\n );\n const permissions = useObservableState(permissionObserver, room.localParticipant.permissions);\n return permissions;\n}\n","import { createMediaDeviceObserver, setupDeviceSelector, log } from '@livekit/components-core';\nimport { Room, type LocalAudioTrack, type LocalVideoTrack } from 'livekit-client';\nimport * as React from 'react';\nimport { useMaybeRoomContext } from '../context';\nimport { useObservableState } from './internal';\n\n/** @public */\nexport interface UseMediaDeviceSelectProps {\n kind: MediaDeviceKind;\n room?: Room;\n track?: LocalAudioTrack | LocalVideoTrack;\n /**\n * this will call getUserMedia if the permissions are not yet given to enumerate the devices with device labels.\n * in some browsers multiple calls to getUserMedia result in multiple permission prompts.\n * It's generally advised only flip this to true, once a (preview) track has been acquired successfully with the\n * appropriate permissions.\n *\n * @see {@link MediaDeviceMenu}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/enumerateDevices | MDN enumerateDevices}\n */\n requestPermissions?: boolean;\n /**\n * this callback gets called if an error is thrown when failing to select a device and also if a user\n * denied permissions, eventhough the `requestPermissions` option is set to `true`.\n * Most commonly this will emit a MediaDeviceError\n */\n onError?: (e: Error) => void;\n}\n\n/**\n * The `useMediaDeviceSelect` hook is used to implement the `MediaDeviceSelect` component and\n * returns o.a. the list of devices of a given kind (audioinput or videoinput), the currently active device\n * and a function to set the the active device.\n *\n * @example\n * ```tsx\n * const { devices, activeDeviceId, setActiveMediaDevice } = useMediaDeviceSelect({kind: 'audioinput'});\n * ```\n * @public\n */\nexport function useMediaDeviceSelect({\n kind,\n room,\n track,\n requestPermissions,\n onError,\n}: UseMediaDeviceSelectProps) {\n const roomContext = useMaybeRoomContext();\n\n const roomFallback = React.useMemo(() => room ?? roomContext ?? new Room(), [room, roomContext]);\n\n // List of all devices.\n const deviceObserver = React.useMemo(\n () => createMediaDeviceObserver(kind, onError, requestPermissions),\n [kind, requestPermissions, onError],\n );\n const devices = useObservableState(deviceObserver, [] as MediaDeviceInfo[]);\n // Active device management.\n const [currentDeviceId, setCurrentDeviceId] = React.useState<string>(\n roomFallback?.getActiveDevice(kind) ?? 'default',\n );\n const { className, activeDeviceObservable, setActiveMediaDevice } = React.useMemo(\n () => setupDeviceSelector(kind, roomFallback),\n [kind, roomFallback, track],\n );\n\n React.useEffect(() => {\n const listener = activeDeviceObservable.subscribe((deviceId) => {\n if (!deviceId) {\n return;\n }\n log.info('setCurrentDeviceId', deviceId);\n setCurrentDeviceId(deviceId);\n });\n return () => {\n listener?.unsubscribe();\n };\n }, [activeDeviceObservable]);\n\n return { devices, className, activeDeviceId: currentDeviceId, setActiveMediaDevice };\n}\n","import * as React from 'react';\nimport { useObservableState } from './internal';\nimport { createMediaDeviceObserver } from '@livekit/components-core';\n\n/**\n * The `useMediaDevices` hook returns the list of media devices of a given kind.\n *\n * @example\n * ```tsx\n * const videoDevices = useMediaDevices({ kind: 'videoinput' });\n * const audioDevices = useMediaDevices({ kind: 'audioinput' });\n * ```\n * @public\n */\nexport function useMediaDevices({\n kind,\n onError,\n}: {\n kind: MediaDeviceKind;\n onError?: (e: Error) => void;\n}) {\n const deviceObserver = React.useMemo(\n () => createMediaDeviceObserver(kind, onError),\n [kind, onError],\n );\n const devices = useObservableState(deviceObserver, [] as MediaDeviceInfo[]);\n return devices;\n}\n","import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { log, sortTrackReferences, updatePages } from '@livekit/components-core';\nimport * as React from 'react';\n\n/** @public */\nexport interface UseVisualStableUpdateOptions {\n /** Overwrites the default sort function. */\n customSortFunction?: (\n trackReferences: TrackReferenceOrPlaceholder[],\n ) => TrackReferenceOrPlaceholder[];\n}\n\n/**\n * The `useVisualStableUpdate` hook is used to prevent visually jarring jumps and shifts of elements\n * in an array. The algorithm only starts to update when there are more items than visually fit\n * on a page. If this is the case, it will make sure that speaking participants move to the first\n * page and are always visible.\n * @remarks\n * Updating the array can occur because attendees leave or join a room, or because they mute/unmute\n * or start speaking.\n * The hook is used for the `GridLayout` and `CarouselLayout` components.\n *\n * @example\n * ```tsx\n * const trackRefs = useTracks();\n * const updatedTrackRefs = useVisualStableUpdate(trackRefs, itemPerPage);\n * ```\n * @public\n */\nexport function useVisualStableUpdate(\n /** `TrackReference`s to display in the grid. */\n trackReferences: TrackReferenceOrPlaceholder[],\n maxItemsOnPage: number,\n options: UseVisualStableUpdateOptions = {},\n): TrackReferenceOrPlaceholder[] {\n const lastTrackRefs = React.useRef<TrackReferenceOrPlaceholder[]>([]);\n const lastMaxItemsOnPage = React.useRef<number>(-1);\n const layoutChanged = maxItemsOnPage !== lastMaxItemsOnPage.current;\n\n const sortedTrackRefs =\n typeof options.customSortFunction === 'function'\n ? options.customSortFunction(trackReferences)\n : sortTrackReferences(trackReferences);\n\n let updatedTrackRefs: TrackReferenceOrPlaceholder[] = [...sortedTrackRefs];\n if (layoutChanged === false) {\n try {\n updatedTrackRefs = updatePages(lastTrackRefs.current, sortedTrackRefs, maxItemsOnPage);\n } catch (error) {\n log.error('Error while running updatePages(): ', error);\n }\n }\n\n // Save info for to compare against in the next update cycle.\n if (layoutChanged) {\n lastTrackRefs.current = sortedTrackRefs;\n } else {\n lastTrackRefs.current = updatedTrackRefs;\n }\n lastMaxItemsOnPage.current = maxItemsOnPage;\n\n return updatedTrackRefs;\n}\n","import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useVisualStableUpdate } from './useVisualStableUpdate';\n\n/**\n * The `usePagination` hook implements simple pagination logic for use with arrays.\n * @example\n * ```tsx\n * const tracks = useTracks();\n * const pagination = usePagination(4, tracks);\n *\n * <TrackLoop tracks={pagination.tracks} />\n * ```\n * @alpha\n */\nexport function usePagination(itemPerPage: number, trackReferences: TrackReferenceOrPlaceholder[]) {\n const [currentPage, setCurrentPage] = React.useState(1);\n const totalPageCount = Math.max(Math.ceil(trackReferences.length / itemPerPage), 1);\n if (currentPage > totalPageCount) {\n setCurrentPage(totalPageCount);\n }\n const lastItemIndex = currentPage * itemPerPage;\n const firstItemIndex = lastItemIndex - itemPerPage;\n\n const changePage = (direction: 'next' | 'previous') => {\n setCurrentPage((state) => {\n if (direction === 'next') {\n if (state === totalPageCount) {\n return state;\n }\n return state + 1;\n } else {\n if (state === 1) {\n return state;\n }\n return state - 1;\n }\n });\n };\n\n const goToPage = (num: number) => {\n if (num > totalPageCount) {\n setCurrentPage(totalPageCount);\n } else if (num < 1) {\n setCurrentPage(1);\n } else {\n setCurrentPage(num);\n }\n };\n\n const updatedTrackReferences = useVisualStableUpdate(trackReferences, itemPerPage);\n\n const tracksOnPage = updatedTrackReferences.slice(firstItemIndex, lastItemIndex);\n\n return {\n totalPageCount,\n nextPage: () => changePage('next'),\n prevPage: () => changePage('previous'),\n setPage: goToPage,\n firstItemIndex,\n lastItemIndex,\n tracks: tracksOnPage,\n currentPage,\n };\n}\n\nexport default usePagination;\n","import type { ParticipantClickEvent, TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { setupParticipantTile } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useEnsureTrackRef } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport { useFacingMode } from './useFacingMode';\nimport { useIsMuted } from './useIsMuted';\nimport { useIsSpeaking } from './useIsSpeaking';\nimport { Track } from 'livekit-client';\n\n/** @public */\nexport interface UseParticipantTileProps<T extends HTMLElement> extends React.HTMLAttributes<T> {\n /** The track reference to display. */\n trackRef?: TrackReferenceOrPlaceholder;\n disableSpeakingIndicator?: boolean;\n onParticipantClick?: (event: ParticipantClickEvent) => void;\n htmlProps: React.HTMLAttributes<T>;\n}\n\n/**\n * The `useParticipantTile` hook is used to implement the `ParticipantTile` and returns the props needed to render the tile.\n * @remarks\n * The returned props include many data attributes that are useful for CSS styling purposes because they\n * indicate the state of the participant and the track.\n * For example: `data-lk-audio-muted`, `data-lk-video-muted`, `data-lk-speaking`, `data-lk-local-participant`, `data-lk-source`, `data-lk-facing-mode`.\n * @public\n */\nexport function useParticipantTile<T extends HTMLElement>({\n trackRef,\n onParticipantClick,\n disableSpeakingIndicator,\n htmlProps,\n}: UseParticipantTileProps<T>) {\n const trackReference = useEnsureTrackRef(trackRef);\n\n const mergedProps = React.useMemo(() => {\n const { className } = setupParticipantTile();\n return mergeProps(htmlProps, {\n className,\n onClick: (event: React.MouseEvent<T, MouseEvent>) => {\n htmlProps.onClick?.(event);\n if (typeof onParticipantClick === 'function') {\n const track =\n trackReference.publication ??\n trackReference.participant.getTrackPublication(trackReference.source);\n onParticipantClick({ participant: trackReference.participant, track });\n }\n },\n });\n }, [\n htmlProps,\n onParticipantClick,\n trackReference.publication,\n trackReference.source,\n trackReference.participant,\n ]);\n\n const micTrack = trackReference.participant.getTrackPublication(Track.Source.Microphone);\n const micRef = React.useMemo(() => {\n return {\n participant: trackReference.participant,\n source: Track.Source.Microphone,\n publication: micTrack,\n };\n }, [micTrack, trackReference.participant]);\n const isVideoMuted = useIsMuted(trackReference);\n const isAudioMuted = useIsMuted(micRef);\n const isSpeaking = useIsSpeaking(trackReference.participant);\n const facingMode = useFacingMode(trackReference);\n return {\n elementProps: {\n 'data-lk-audio-muted': isAudioMuted,\n 'data-lk-video-muted': isVideoMuted,\n 'data-lk-speaking': disableSpeakingIndicator === true ? false : isSpeaking,\n 'data-lk-local-participant': trackReference.participant.isLocal,\n 'data-lk-source': trackReference.source,\n 'data-lk-facing-mode': facingMode,\n ...mergedProps,\n } as React.HTMLAttributes<T>,\n };\n}\n","import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport * as React from 'react';\nimport type { LayoutContextType } from '../context';\nimport { useEnsureLayoutContext } from '../context';\n\n/**\n * The `usePinnedTracks` hook returns a array of the pinned tracks of the current room.\n * @remarks\n * To function properly, this hook must be called within a `LayoutContext`.\n * @example\n * ```tsx\n * const pinnedTracks = usePinnedTracks();\n * ```\n * @public\n */\nexport function usePinnedTracks(layoutContext?: LayoutContextType): TrackReferenceOrPlaceholder[] {\n layoutContext = useEnsureLayoutContext(layoutContext);\n return React.useMemo(() => {\n if (layoutContext?.pin.state !== undefined && layoutContext.pin.state.length >= 1) {\n return layoutContext.pin.state;\n }\n return [];\n }, [layoutContext.pin.state]);\n}\n","import { setupStartAudio } from '@livekit/components-core';\nimport type { Room } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport { useObservableState } from './internal';\n\n/** @alpha */\nexport interface UseStartAudioProps {\n room?: Room;\n props: React.ButtonHTMLAttributes<HTMLButtonElement>;\n}\n\n/**\n * In many browsers to start audio playback, the user must perform a user-initiated event such as clicking a button.\n * The `useStatAudio` hook returns an object with a boolean `canPlayAudio` flag\n * that indicates whether audio playback is allowed in the current context,\n * as well as a `startAudio` function that can be called in a button `onClick` callback to start audio playback in the current context.\n *\n * @see Autoplay policy on MDN web docs for more info: {@link https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Best_practices#autoplay_policy}\n * @alpha\n */\nexport function useStartAudio({ room, props }: UseStartAudioProps) {\n const roomEnsured = useEnsureRoom(room);\n const { className, roomAudioPlaybackAllowedObservable, handleStartAudioPlayback } = React.useMemo(\n () => setupStartAudio(),\n [],\n );\n const observable = React.useMemo(\n () => roomAudioPlaybackAllowedObservable(roomEnsured),\n [roomEnsured, roomAudioPlaybackAllowedObservable],\n );\n const { canPlayAudio } = useObservableState(observable, {\n canPlayAudio: roomEnsured.canPlaybackAudio,\n });\n\n const mergedProps = React.useMemo(\n () =>\n mergeProps(props, {\n className,\n onClick: () => {\n handleStartAudioPlayback(roomEnsured);\n },\n style: { display: canPlayAudio ? 'none' : 'block' },\n }),\n [props, className, canPlayAudio, handleStartAudioPlayback, roomEnsured],\n );\n\n return { mergedProps, canPlayAudio };\n}\n","import { setupStartVideo } from '@livekit/components-core';\nimport type { Room } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport { useObservableState } from './internal';\n\n/** @alpha */\nexport interface UseStartVideoProps {\n room?: Room;\n props: React.ButtonHTMLAttributes<HTMLButtonElement>;\n}\n\n/**\n * In some browsers to start video playback in low power mode, the user must perform a user-initiated event such as clicking a button.\n * The `useStartVideo` hook returns an object with a boolean `canPlayVideo` flag\n * that indicates whether video playback is allowed in the current context,\n * as well as a `startVideo` function that can be called in a button `onClick` callback to start video playback in the current context.\n *\n * @alpha\n */\nexport function useStartVideo({ room, props }: UseStartVideoProps) {\n const roomEnsured = useEnsureRoom(room);\n const { className, roomVideoPlaybackAllowedObservable, handleStartVideoPlayback } = React.useMemo(\n () => setupStartVideo(),\n [],\n );\n const observable = React.useMemo(\n () => roomVideoPlaybackAllowedObservable(roomEnsured),\n [roomEnsured, roomVideoPlaybackAllowedObservable],\n );\n const { canPlayVideo } = useObservableState(observable, {\n canPlayVideo: roomEnsured.canPlaybackVideo,\n });\n\n const mergedProps = React.useMemo(\n () =>\n mergeProps(props, {\n className,\n onClick: () => {\n handleStartVideoPlayback(roomEnsured);\n },\n style: { display: canPlayVideo ? 'none' : 'block' },\n }),\n [props, className, canPlayVideo, handleStartVideoPlayback, roomEnsured],\n );\n\n return { mergedProps, canPlayVideo };\n}\n","import * as React from 'react';\n\n/**\n * @alpha\n */\nexport type UseSwipeOptions = {\n minSwipeDistance?: number;\n onLeftSwipe?: () => void;\n onRightSwipe?: () => void;\n};\n\n/**\n * Simple implementation to detect horizontal swipe actions.\n * Accepts callbacks for on right and left swipes.\n * @example\n * ```tsx\n * <div\n onTouchStart={onTouchStart}\n onTouchMove={onTouchMove}\n onTouchEnd={onTouchEnd}\n >\n * ```\n * @alpha\n */\nexport function useSwipe(element: React.RefObject<HTMLElement>, options: UseSwipeOptions = {}) {\n const touchStart = React.useRef<number | null>(null);\n const touchEnd = React.useRef<number | null>(null);\n\n // The required distance between touchStart and touchEnd to be detected as a swipe.\n const minSwipeDistance = options.minSwipeDistance ?? 50;\n\n const onTouchStart = (event: TouchEvent) => {\n touchEnd.current = null; // Otherwise the swipe is fired even with usual touch events.\n touchStart.current = event.targetTouches[0].clientX;\n };\n\n const onTouchMove = (event: TouchEvent) => {\n touchEnd.current = event.targetTouches[0].clientX;\n };\n\n const onTouchEnd = React.useCallback(() => {\n if (!touchStart.current || !touchEnd.current) {\n return;\n }\n const distance = touchStart.current - touchEnd.current;\n const isLeftSwipe = distance > minSwipeDistance;\n const isRightSwipe = distance < -minSwipeDistance;\n\n if (isLeftSwipe && options.onLeftSwipe) options.onLeftSwipe();\n if (isRightSwipe && options.onRightSwipe) options.onRightSwipe();\n }, [minSwipeDistance, options]);\n\n React.useEffect(() => {\n const elementCopy = element.current;\n if (elementCopy) {\n elementCopy.addEventListener('touchstart', onTouchStart, { passive: true });\n elementCopy.addEventListener('touchmove', onTouchMove, { passive: true });\n elementCopy.addEventListener('touchend', onTouchEnd, { passive: true });\n }\n return () => {\n if (elementCopy) {\n elementCopy.removeEventListener('touchstart', onTouchStart);\n elementCopy.removeEventListener('touchmove', onTouchMove);\n elementCopy.removeEventListener('touchend', onTouchEnd);\n }\n };\n }, [element, onTouchEnd]);\n}\n","import { setupChatToggle } from '@livekit/components-core';\nimport { useLayoutContext } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport * as React from 'react';\n\n/** @public */\nexport interface UseChatToggleProps {\n props: React.ButtonHTMLAttributes<HTMLButtonElement>;\n}\n\n/**\n * The `useChatToggle` hook provides state and functions for toggling the chat window.\n * @remarks\n * Depends on the `LayoutContext` to work properly.\n * @see {@link ChatToggle}, {@link Chat}\n * @public\n */\nexport function useChatToggle({ props }: UseChatToggleProps) {\n const { dispatch, state } = useLayoutContext().widget;\n const { className } = React.useMemo(() => setupChatToggle(), []);\n\n const mergedProps = React.useMemo(() => {\n return mergeProps(props, {\n className,\n onClick: () => {\n if (dispatch) dispatch({ msg: 'toggle_chat' });\n },\n 'aria-pressed': state?.showChat ? 'true' : 'false',\n 'data-lk-unread-msgs': state\n ? state.unreadMessages < 10\n ? state.unreadMessages.toFixed(0)\n : '9+'\n : '0',\n });\n }, [props, className, dispatch, state]);\n\n return { mergedProps };\n}\n","import {\n type TrackReferenceOrPlaceholder,\n setupTrackMutedIndicator,\n getTrackReferenceId,\n} from '@livekit/components-core';\nimport * as React from 'react';\nimport { useEnsureTrackRef } from '../context';\nimport { useObservableState } from './internal';\n\ninterface TrackMutedIndicatorReturnType {\n isMuted: boolean;\n className: string;\n}\n\n/**\n * The `useTrackMutedIndicator` hook is used to implement the `TrackMutedIndicator` component\n * and returns the muted state of the given track.\n *\n * @example\n * ```tsx\n * const { isMuted } = useTrackMutedIndicator(trackRef);\n * ```\n * @public\n */\nexport function useTrackMutedIndicator(\n trackRef?: TrackReferenceOrPlaceholder,\n): TrackMutedIndicatorReturnType {\n const trackReference = useEnsureTrackRef(trackRef);\n\n const { className, mediaMutedObserver } = React.useMemo(\n () => setupTrackMutedIndicator(trackReference),\n [getTrackReferenceId(trackReference)],\n );\n\n const isMuted = useObservableState(\n mediaMutedObserver,\n !!(\n trackReference.publication?.isMuted ||\n trackReference.participant.getTrackPublication(trackReference.source)?.isMuted\n ),\n );\n\n return { isMuted, className };\n}\n","import type { ToggleSource } from '@livekit/components-core';\nimport { setupMediaToggle, setupManualToggle, log } from '@livekit/components-core';\nimport * as React from 'react';\nimport { type Room } from 'livekit-client';\nimport type { TrackToggleProps } from '../components';\nimport { useMaybeRoomContext } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport { useObservableState } from './internal';\n\n/** @public */\nexport interface UseTrackToggleProps<T extends ToggleSource>\n extends Omit<TrackToggleProps<T>, 'showIcon'> {\n room?: Room;\n}\n\n/**\n * The `useTrackToggle` hook is used to implement the `TrackToggle` component and returns state\n * and functionality of the given track.\n *\n * @example\n * ```tsx\n * const { buttonProps, enabled } = useTrackToggle(trackRef);\n * return <button {...buttonProps}>{enabled ? 'disable' : 'enable'}</button>;\n * ```\n * @public\n */\nexport function useTrackToggle<T extends ToggleSource>({\n source,\n onChange,\n initialState,\n captureOptions,\n publishOptions,\n onDeviceError,\n room,\n ...rest\n}: UseTrackToggleProps<T>) {\n const roomFromContext = useMaybeRoomContext();\n const roomFallback = React.useMemo(() => room ?? roomFromContext, [room, roomFromContext]);\n const track = roomFallback?.localParticipant?.getTrackPublication(source);\n /** `true` if a user interaction such as a click on the TrackToggle button has occurred. */\n const userInteractionRef = React.useRef(false);\n\n const { toggle, className, pendingObserver, enabledObserver } = React.useMemo(\n () =>\n roomFallback\n ? setupMediaToggle<T>(source, roomFallback, captureOptions, publishOptions, onDeviceError)\n : setupManualToggle(),\n [roomFallback, source, JSON.stringify(captureOptions), publishOptions],\n );\n\n const pending = useObservableState(pendingObserver, false);\n const enabled = useObservableState(enabledObserver, initialState ?? !!track?.isEnabled);\n\n React.useEffect(() => {\n onChange?.(enabled, userInteractionRef.current);\n userInteractionRef.current = false;\n }, [enabled, onChange]);\n\n React.useEffect(() => {\n if (initialState !== undefined) {\n log.debug('forcing initial toggle state', source, initialState);\n toggle(initialState);\n }\n // only execute once at the beginning\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const newProps = React.useMemo(() => mergeProps(rest, { className }), [rest, className]);\n\n const clickHandler: React.MouseEventHandler<HTMLButtonElement> = React.useCallback(\n (evt) => {\n userInteractionRef.current = true;\n toggle().catch(() => (userInteractionRef.current = false));\n rest.onClick?.(evt);\n },\n [rest, toggle],\n );\n\n return {\n toggle,\n enabled,\n pending,\n track,\n buttonProps: {\n ...newProps,\n 'aria-pressed': enabled,\n 'data-lk-source': source,\n 'data-lk-enabled': enabled,\n disabled: pending,\n onClick: clickHandler,\n } as React.ButtonHTMLAttributes<HTMLButtonElement>,\n };\n}\n","import type {\n SourcesArray,\n TrackReference,\n TrackReferenceOrPlaceholder,\n TrackSourceWithOptions,\n TrackReferencePlaceholder,\n} from '@livekit/components-core';\nimport {\n isSourcesWithOptions,\n isSourceWitOptions,\n log,\n trackReferencesObservable,\n} from '@livekit/components-core';\nimport type { Participant, Room, RoomEvent } from 'livekit-client';\nimport { Track } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\n\n/** @public */\nexport type UseTracksOptions = {\n updateOnlyOn?: RoomEvent[];\n onlySubscribed?: boolean;\n room?: Room;\n};\n\n/** @public */\nexport type UseTracksHookReturnType<T> = T extends Track.Source[]\n ? TrackReference[]\n : T extends TrackSourceWithOptions[]\n ? TrackReferenceOrPlaceholder[]\n : never;\n\n/**\n * The `useTracks` hook returns an array of `TrackReference` or `TrackReferenceOrPlaceholder` depending on the provided `sources` property.\n * If only subscribed tracks are desired, set the `onlySubscribed` property to `true`.\n * @example\n * ```ts\n * // Return all camera track publications.\n * const trackReferences: TrackReference[] = useTracks([Track.Source.Camera])\n * ```\n * @example\n * ```ts\n * // Return all subscribed camera tracks as well as placeholders for\n * // participants without a camera subscription.\n * const trackReferencesWithPlaceholders: TrackReferenceOrPlaceholder[] = useTracks([{source: Track.Source.Camera, withPlaceholder: true}])\n * ```\n * @public\n */\nexport function useTracks<T extends SourcesArray = Track.Source[]>(\n sources: T = [\n Track.Source.Camera,\n Track.Source.Microphone,\n Track.Source.ScreenShare,\n Track.Source.ScreenShareAudio,\n Track.Source.Unknown,\n ] as T,\n options: UseTracksOptions = {},\n): UseTracksHookReturnType<T> {\n const room = useEnsureRoom(options.room);\n const [trackReferences, setTrackReferences] = React.useState<TrackReference[]>([]);\n const [participants, setParticipants] = React.useState<Participant[]>([]);\n\n const sources_ = React.useMemo(() => {\n return sources.map((s) => (isSourceWitOptions(s) ? s.source : s));\n }, [JSON.stringify(sources)]);\n\n React.useEffect(() => {\n const subscription = trackReferencesObservable(room, sources_, {\n additionalRoomEvents: options.updateOnlyOn,\n onlySubscribed: options.onlySubscribed,\n }).subscribe(({ trackReferences, participants }) => {\n log.debug('setting track bundles', trackReferences, participants);\n setTrackReferences(trackReferences);\n setParticipants(participants);\n });\n return () => subscription.unsubscribe();\n }, [\n room,\n JSON.stringify(options.onlySubscribed),\n JSON.stringify(options.updateOnlyOn),\n JSON.stringify(sources),\n ]);\n\n const maybeTrackReferences = React.useMemo(() => {\n if (isSourcesWithOptions(sources)) {\n const requirePlaceholder = requiredPlaceholders(sources, participants);\n const trackReferencesWithPlaceholders: TrackReferenceOrPlaceholder[] =\n Array.from(trackReferences);\n participants.forEach((participant) => {\n if (requirePlaceholder.has(participant.identity)) {\n const sourcesToAddPlaceholder = requirePlaceholder.get(participant.identity) ?? [];\n sourcesToAddPlaceholder.forEach((placeholderSource) => {\n if (\n trackReferences.find(\n ({ participant: p, publication }) =>\n participant.identity === p.identity && publication.source === placeholderSource,\n )\n ) {\n return;\n }\n log.debug(\n `Add ${placeholderSource} placeholder for participant ${participant.identity}.`,\n );\n const placeholder: TrackReferencePlaceholder = {\n participant,\n source: placeholderSource,\n };\n trackReferencesWithPlaceholders.push(placeholder);\n });\n }\n });\n return trackReferencesWithPlaceholders;\n } else {\n return trackReferences;\n }\n }, [trackReferences, participants, sources]);\n\n return maybeTrackReferences as UseTracksHookReturnType<T>;\n}\n\nfunction difference<T>(setA: Set<T>, setB: Set<T>): Set<T> {\n const _difference = new Set(setA);\n for (const elem of setB) {\n _difference.delete(elem);\n }\n return _difference;\n}\n\nexport function requiredPlaceholders<T extends SourcesArray>(\n sources: T,\n participants: Participant[],\n): Map<Participant['identity'], Track.Source[]> {\n const placeholderMap = new Map<Participant['identity'], Track.Source[]>();\n if (isSourcesWithOptions(sources)) {\n const sourcesThatNeedPlaceholder = sources\n .filter((sourceWithOption) => sourceWithOption.withPlaceholder)\n .map((sourceWithOption) => sourceWithOption.source);\n\n participants.forEach((participant) => {\n const sourcesOfSubscribedTracks = participant\n .getTrackPublications()\n .map((pub) => pub.track?.source)\n .filter((trackSource): trackSource is Track.Source => trackSource !== undefined);\n const placeholderNeededForThisParticipant = Array.from(\n difference(new Set(sourcesThatNeedPlaceholder), new Set(sourcesOfSubscribedTracks)),\n );\n // If the participant needs placeholder add it to the placeholder map.\n if (placeholderNeededForThisParticipant.length > 0) {\n placeholderMap.set(participant.identity, placeholderNeededForThisParticipant);\n }\n });\n }\n return placeholderMap;\n}\n","import * as React from 'react';\nimport type { ChatOptions, ReceivedChatMessage } from '@livekit/components-core';\nimport { setupChat } from '@livekit/components-core';\nimport { ConnectionState, Room } from 'livekit-client';\nimport { useEnsureRoom } from '../context';\nimport { useObservableState } from './internal/useObservableState';\nimport { useConnectionState } from './useConnectionStatus';\n\n/**\n * The `useChat` hook provides chat functionality for a LiveKit room.\n *\n * @remarks\n * Message history is not persisted and will be lost if the component is refreshed.\n * You may want to persist message history in the browser, a cache or a database.\n *\n * @returns An object containing:\n * - `chatMessages` - Array of received chat messages\n * - `send` - Function to send a new message\n * - `isSending` - Boolean indicating if a message is currently being sent\n *\n * @example\n * ```tsx\n * function ChatComponent() {\n * const { chatMessages, send, isSending } = useChat();\n *\n * return (\n * <div>\n * {chatMessages.map((msg) => (\n * <div key={msg.timestamp}>\n * {msg.from?.identity}: {msg.message}\n * </div>\n * ))}\n * <button disabled={isSending} onClick={() => send(\"Hello!\")}>\n * Send Message\n * </button>\n * </div>\n * );\n * }\n * ```\n * @public\n */\nexport function useChat(options?: ChatOptions & { room?: Room }) {\n const room = useEnsureRoom(options?.room);\n const connectionState = useConnectionState(room);\n const isDisconnected = React.useMemo(\n () => connectionState === ConnectionState.Disconnected,\n [connectionState],\n ); // used to reset the messages on room disconnect\n const setup = React.useMemo<ReturnType<typeof setupChat>>(\n () => setupChat(room, options),\n [room, options, isDisconnected],\n );\n const isSending = useObservableState(setup.isSendingObservable, false);\n const chatMessages = useObservableState<ReceivedChatMessage[]>(setup.messageObservable, []);\n\n return { send: setup.send, chatMessages, isSending };\n}\n","import type { LocalUserChoices } from '@livekit/components-core';\nimport { loadUserChoices, saveUserChoices } from '@livekit/components-core';\nimport * as React from 'react';\n\n/**\n * Options for the `usePersistentDeviceSettings` hook.\n * @alpha\n */\nexport interface UsePersistentUserChoicesOptions {\n /**\n * The default value to use if reading from local storage returns no results or fails.\n */\n defaults?: Partial<LocalUserChoices>;\n /**\n * Whether to prevent saving to persistent storage.\n * @defaultValue false\n */\n preventSave?: boolean;\n /**\n * Whether to prevent loading user choices from persistent storage and use `defaults` instead.\n * @defaultValue false\n */\n preventLoad?: boolean;\n}\n\n/**\n * A hook that provides access to user choices stored in local storage, such as\n * selected media devices and their current state (on or off), as well as the user name.\n * @alpha\n */\nexport function usePersistentUserChoices(options: UsePersistentUserChoicesOptions = {}) {\n const [userChoices, setSettings] = React.useState<LocalUserChoices>(\n loadUserChoices(options.defaults, options.preventLoad ?? false),\n );\n\n const saveAudioInputEnabled = React.useCallback((isEnabled: boolean) => {\n setSettings((prev) => ({ ...prev, audioEnabled: isEnabled }));\n }, []);\n const saveVideoInputEnabled = React.useCallback((isEnabled: boolean) => {\n setSettings((prev) => ({ ...prev, videoEnabled: isEnabled }));\n }, []);\n const saveAudioInputDeviceId = React.useCallback((deviceId: string) => {\n setSettings((prev) => ({ ...prev, audioDeviceId: deviceId }));\n }, []);\n const saveVideoInputDeviceId = React.useCallback((deviceId: string) => {\n setSettings((prev) => ({ ...prev, videoDeviceId: deviceId }));\n }, []);\n const saveUsername = React.useCallback((username: string) => {\n setSettings((prev) => ({ ...prev, username: username }));\n }, []);\n\n React.useEffect(() => {\n saveUserChoices(userChoices, options.preventSave ?? false);\n }, [userChoices, options.preventSave]);\n\n return {\n userChoices,\n saveAudioInputEnabled,\n saveVideoInputEnabled,\n saveAudioInputDeviceId,\n saveVideoInputDeviceId,\n saveUsername,\n };\n}\n","import * as React from 'react';\nimport { LocalParticipant } from 'livekit-client';\nimport type { Participant, Room } from 'livekit-client';\nimport { encryptionStatusObservable } from '@livekit/components-core';\nimport { useEnsureParticipant, useEnsureRoom } from '../context';\nimport { useObservableState } from './internal';\n\n/**\n * @alpha\n */\nexport interface UseIsEncryptedOptions {\n room?: Room;\n}\n\n/**\n * @alpha\n */\nexport function useIsEncrypted(participant?: Participant, options: UseIsEncryptedOptions = {}) {\n const p = useEnsureParticipant(participant);\n\n const room = useEnsureRoom(options.room);\n\n const observer = React.useMemo(() => encryptionStatusObservable(room, p), [room, p]);\n const isEncrypted = useObservableState(\n observer,\n p.isLocal ? (p as LocalParticipant).isE2EEEnabled : !!p?.isEncrypted,\n );\n return isEncrypted;\n}\n","import * as React from 'react';\nimport type { LocalAudioTrack, RemoteAudioTrack, AudioAnalyserOptions } from 'livekit-client';\nimport { Track, createAudioAnalyser } from 'livekit-client';\nimport {\n type TrackReference,\n isTrackReference,\n type TrackReferenceOrPlaceholder,\n} from '@livekit/components-core';\n\n/**\n * @alpha\n * Hook for tracking the volume of an audio track using the Web Audio API.\n */\nexport function useTrackVolume(\n trackOrTrackReference?: LocalAudioTrack | RemoteAudioTrack | TrackReference,\n options: AudioAnalyserOptions = { fftSize: 32, smoothingTimeConstant: 0 },\n) {\n const track = isTrackReference(trackOrTrackReference)\n ? <LocalAudioTrack | RemoteAudioTrack | undefined>trackOrTrackReference.publication.track\n : trackOrTrackReference;\n const [volume, setVolume] = React.useState(0);\n React.useEffect(() => {\n if (!track || !track.mediaStream) {\n return;\n }\n\n const { cleanup, analyser } = createAudioAnalyser(track, options);\n\n const bufferLength = analyser.frequencyBinCount;\n const dataArray = new Uint8Array(bufferLength);\n\n const updateVolume = () => {\n analyser.getByteFrequencyData(dataArray);\n let sum = 0;\n for (let i = 0; i < dataArray.length; i++) {\n const a = dataArray[i];\n sum += a * a;\n }\n setVolume(Math.sqrt(sum / dataArray.length) / 255);\n };\n\n const interval = setInterval(updateVolume, 1000 / 30);\n\n return () => {\n cleanup();\n clearInterval(interval);\n };\n }, [track, track?.mediaStream, JSON.stringify(options)]);\n\n return volume;\n}\n\nconst normalizeFrequencies = (frequencies: Float32Array) => {\n const normalizeDb = (value: number) => {\n const minDb = -100;\n const maxDb = -10;\n let db = 1 - (Math.max(minDb, Math.min(maxDb, value)) * -1) / 100;\n db = Math.sqrt(db);\n\n return db;\n };\n\n // Normalize all frequency values\n return frequencies.map((value) => {\n if (value === -Infinity) {\n return 0;\n }\n return normalizeDb(value);\n });\n};\n\n/**\n * Interface for configuring options for the useMultibandTrackVolume hook.\n * @alpha\n */\nexport interface MultiBandTrackVolumeOptions {\n bands?: number;\n /**\n * cut off of frequency bins on the lower end\n * Note: this is not a frequency measure, but in relation to analyserOptions.fftSize,\n */\n loPass?: number;\n /**\n * cut off of frequency bins on the higher end\n * Note: this is not a frequency measure, but in relation to analyserOptions.fftSize,\n */\n hiPass?: number;\n /**\n * update should run every x ms\n */\n updateInterval?: number;\n analyserOptions?: AnalyserOptions;\n}\n\nconst multibandDefaults = {\n bands: 5,\n loPass: 100,\n hiPass: 600,\n updateInterval: 32,\n analyserOptions: { fftSize: 2048 },\n} as const satisfies MultiBandTrackVolumeOptions;\n\n/**\n * Hook for tracking the volume of an audio track across multiple frequency bands using the Web Audio API.\n * @alpha\n */\nexport function useMultibandTrackVolume(\n trackOrTrackReference?: LocalAudioTrack | RemoteAudioTrack | TrackReferenceOrPlaceholder,\n options: MultiBandTrackVolumeOptions = {},\n) {\n const track =\n trackOrTrackReference instanceof Track\n ? trackOrTrackReference\n : <LocalAudioTrack | RemoteAudioTrack | undefined>trackOrTrackReference?.publication?.track;\n const opts = { ...multibandDefaults, ...options };\n const [frequencyBands, setFrequencyBands] = React.useState<Array<number>>(\n new Array(opts.bands).fill(0),\n );\n\n React.useEffect(() => {\n if (!track || !track?.mediaStream) {\n setFrequencyBands((val) => val.slice().fill(0));\n return;\n }\n const { analyser, cleanup } = createAudioAnalyser(track, opts.analyserOptions);\n\n const bufferLength = analyser.frequencyBinCount;\n const dataArray = new Float32Array(bufferLength);\n\n const updateVolume = () => {\n analyser.getFloatFrequencyData(dataArray);\n let frequencies: Float32Array = new Float32Array(dataArray.length);\n for (let i = 0; i < dataArray.length; i++) {\n frequencies[i] = dataArray[i];\n }\n frequencies = frequencies.slice(opts.loPass, opts.hiPass);\n\n const normalizedFrequencies = normalizeFrequencies(frequencies); // is this needed ?\n const totalBins = normalizedFrequencies.length;\n const chunks: Array<number> = [];\n for (let i = 0; i < opts.bands; i++) {\n // Use proportional distribution to evenly divide bins across bands\n const startIndex = Math.floor((i * totalBins) / opts.bands);\n const endIndex = Math.floor(((i + 1) * totalBins) / opts.bands);\n const chunk = normalizedFrequencies.slice(startIndex, endIndex);\n const chunkLength = chunk.length;\n if (chunkLength === 0) {\n chunks.push(0);\n } else {\n const summedVolumes = chunk.reduce((acc, val) => (acc += val), 0);\n chunks.push(summedVolumes / chunkLength);\n }\n }\n\n setFrequencyBands(chunks);\n };\n\n const interval = setInterval(updateVolume, opts.updateInterval);\n\n return () => {\n cleanup();\n clearInterval(interval);\n };\n }, [track, track?.mediaStream, JSON.stringify(options)]);\n\n return frequencyBands;\n}\n\n/**\n * @alpha\n */\nexport interface AudioWaveformOptions {\n barCount?: number;\n volMultiplier?: number;\n updateInterval?: number;\n}\n\nconst waveformDefaults = {\n barCount: 120,\n volMultiplier: 5,\n updateInterval: 20,\n} as const satisfies AudioWaveformOptions;\n\n/**\n * @alpha\n */\nexport function useAudioWaveform(\n trackOrTrackReference?: LocalAudioTrack | RemoteAudioTrack | TrackReferenceOrPlaceholder,\n options: AudioWaveformOptions = {},\n) {\n const track =\n trackOrTrackReference instanceof Track\n ? trackOrTrackReference\n : <LocalAudioTrack | RemoteAudioTrack | undefined>trackOrTrackReference?.publication?.track;\n const opts = { ...waveformDefaults, ...options };\n\n const aggregateWave = React.useRef(new Float32Array());\n const timeRef = React.useRef(performance.now());\n const updates = React.useRef(0);\n const [bars, setBars] = React.useState<number[]>([]);\n\n const onUpdate = React.useCallback((wave: Float32Array) => {\n setBars(\n Array.from(\n filterData(wave, opts.barCount).map((v) => Math.sqrt(v) * opts.volMultiplier),\n // wave.slice(0, opts.barCount).map((v) => sigmoid(v * opts.volMultiplier, 0.08, 0.2)),\n ),\n );\n }, []);\n\n React.useEffect(() => {\n if (!track || !track?.mediaStream) {\n return;\n }\n const { analyser, cleanup } = createAudioAnalyser(track, {\n fftSize: getFFTSizeValue(opts.barCount),\n });\n\n const bufferLength = getFFTSizeValue(opts.barCount);\n const dataArray = new Float32Array(bufferLength);\n\n const update = () => {\n updateWaveform = requestAnimationFrame(update);\n analyser.getFloatTimeDomainData(dataArray);\n aggregateWave.current.map((v, i) => v + dataArray[i]);\n updates.current += 1;\n\n if (performance.now() - timeRef.current >= opts.updateInterval) {\n const newData = dataArray.map((v) => v / updates.current);\n onUpdate(newData);\n timeRef.current = performance.now();\n updates.current = 0;\n }\n };\n\n let updateWaveform = requestAnimationFrame(update);\n\n return () => {\n cleanup();\n cancelAnimationFrame(updateWaveform);\n };\n }, [track, track?.mediaStream, JSON.stringify(options), onUpdate]);\n\n return {\n bars,\n };\n}\n\nfunction getFFTSizeValue(x: number) {\n if (x < 32) return 32;\n else return pow2ceil(x);\n}\n\n// function sigmoid(x: number, k = 2, s = 0) {\n// return 1 / (1 + Math.exp(-(x - s) / k));\n// }\n\nfunction pow2ceil(v: number) {\n let p = 2;\n while ((v >>= 1)) {\n p <<= 1;\n }\n return p;\n}\n\nfunction filterData(audioData: Float32Array, numSamples: number) {\n const blockSize = Math.floor(audioData.length / numSamples); // the number of samples in each subdivision\n const filteredData = new Float32Array(numSamples);\n for (let i = 0; i < numSamples; i++) {\n const blockStart = blockSize * i; // the location of the first sample in the block\n let sum = 0;\n for (let j = 0; j < blockSize; j++) {\n sum = sum + Math.abs(audioData[blockStart + j]); // find the sum of all the samples in the block\n }\n filteredData[i] = sum / blockSize; // divide the sum by the block size to get the average\n }\n return filteredData;\n}\n\n// function normalizeData(audioData: Float32Array) {\n// const multiplier = Math.pow(Math.max(...audioData), -1);\n// return audioData.map((n) => n * multiplier);\n// }\n"],"names":["useLatest","current","storedValue","React","useResizeObserver","target","callback","resizeObserver","getResizeObserver","storedCallback","didUnsubscribe","targetEl","cb","entry","observer","createResizeObserver","ticking","allEntries","callbacks","entries","obs","triggered","i","cbs","cbIndex","_resizeObserver","useSize","size","setSize","width","height","resizeCallback","useObservableState","observable","startWith","resetWhenObservableChanges","state","setState","subscription","chatReducer","action","newState","pinReducer","LayoutContext","useLayoutContext","layoutContext","useEnsureLayoutContext","layout","useMaybeLayoutContext","useCreateLayoutContext","pinState","pinDispatch","PIN_DEFAULT_STATE","widgetState","widgetDispatch","WIDGET_DEFAULT_STATE","useEnsureCreateLayoutContext","TrackRefContext","useTrackRefContext","trackReference","useMaybeTrackRefContext","useEnsureTrackRef","trackRef","context","ref","ParticipantContext","useParticipantContext","participant","useMaybeParticipantContext","useEnsureParticipant","trackContext","p","r","t","f","n","o","clsx","chain","args","e","mergeProps","result","props","key","a","b","useConnectionQualityIndicator","options","className","connectionQualityObserver","setupConnectionQualityIndicator","quality","useConnectionState","room","useEnsureRoom","connectionStateObserver","useDisconnectButton","useRoomContext","connectionState","disconnect","setupDisconnectButton","ConnectionState","useFacingMode","LocalTrackPublication","localTrack","facingMode","facingModeFromLocalTrack","useFocusToggle","setupFocusToggle","inFocus","isTrackReferencePinned","event","_a","_c","_b","_e","_d","useGridLayout","gridElement","trackCount","gridLayouts","GRID_LAYOUTS","selectGridLayout","useIsMuted","sourceOrTrackRef","passedParticipant","isMuted","setIsMuted","listener","mutedObserver","getTrackReferenceId","useIsSpeaking","createIsSpeakingObserver","isProp","prop","mergePropsReactAria","cloneSingleChild","children","child","warnAboutMissingStyles","el","log","roomOptionsStringifyReplacer","val","useLocalParticipantPermissions","permissionObserver","participantPermissionObserver","useMediaDeviceSelect","kind","track","requestPermissions","onError","roomContext","useMaybeRoomContext","roomFallback","Room","deviceObserver","createMediaDeviceObserver","devices","currentDeviceId","setCurrentDeviceId","activeDeviceObservable","setActiveMediaDevice","setupDeviceSelector","deviceId","useMediaDevices","useVisualStableUpdate","trackReferences","maxItemsOnPage","lastTrackRefs","lastMaxItemsOnPage","layoutChanged","sortedTrackRefs","sortTrackReferences","updatedTrackRefs","updatePages","error","usePagination","itemPerPage","currentPage","setCurrentPage","totalPageCount","lastItemIndex","firstItemIndex","changePage","direction","goToPage","num","tracksOnPage","useParticipantTile","onParticipantClick","disableSpeakingIndicator","htmlProps","mergedProps","setupParticipantTile","micTrack","Track","micRef","isVideoMuted","isAudioMuted","isSpeaking","usePinnedTracks","useStartAudio","roomEnsured","roomAudioPlaybackAllowedObservable","handleStartAudioPlayback","setupStartAudio","canPlayAudio","useStartVideo","roomVideoPlaybackAllowedObservable","handleStartVideoPlayback","setupStartVideo","canPlayVideo","useSwipe","element","touchStart","touchEnd","minSwipeDistance","onTouchStart","onTouchMove","onTouchEnd","distance","isLeftSwipe","isRightSwipe","elementCopy","useChatToggle","dispatch","setupChatToggle","useTrackMutedIndicator","mediaMutedObserver","setupTrackMutedIndicator","useTrackToggle","source","onChange","initialState","captureOptions","publishOptions","onDeviceError","rest","roomFromContext","userInteractionRef","toggle","pendingObserver","enabledObserver","setupMediaToggle","setupManualToggle","pending","enabled","newProps","clickHandler","evt","useTracks","sources","setTrackReferences","participants","setParticipants","sources_","s","isSourceWitOptions","trackReferencesObservable","isSourcesWithOptions","requirePlaceholder","requiredPlaceholders","trackReferencesWithPlaceholders","placeholderSource","publication","placeholder","difference","setA","setB","_difference","elem","placeholderMap","sourcesThatNeedPlaceholder","sourceWithOption","sourcesOfSubscribedTracks","pub","trackSource","placeholderNeededForThisParticipant","useChat","isDisconnected","setup","setupChat","isSending","chatMessages","usePersistentUserChoices","userChoices","setSettings","loadUserChoices","saveAudioInputEnabled","isEnabled","prev","saveVideoInputEnabled","saveAudioInputDeviceId","saveVideoInputDeviceId","saveUsername","username","saveUserChoices","useIsEncrypted","encryptionStatusObservable","useTrackVolume","trackOrTrackReference","isTrackReference","volume","setVolume","cleanup","analyser","createAudioAnalyser","bufferLength","dataArray","interval","sum","normalizeFrequencies","frequencies","normalizeDb","value","db","multibandDefaults","useMultibandTrackVolume","opts","frequencyBands","setFrequencyBands","normalizedFrequencies","totalBins","chunks","startIndex","endIndex","chunk","chunkLength","summedVolumes","acc","waveformDefaults","useAudioWaveform","aggregateWave","timeRef","updates","bars","setBars","onUpdate","wave","filterData","v","getFFTSizeValue","update","updateWaveform","newData","x","pow2ceil","audioData","numSamples","blockSize","filteredData","blockStart","j"],"mappings":"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","x_google_ignoreList":[7]}
@@ -0,0 +1,2 @@
1
+ "use strict";const S=require("livekit-client"),V=require("react"),b=require("./shared-BDr0qLg4.js"),f=require("./shared-CjI_UuOX.js");function ct(t){const a=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const n in t)if(n!=="default"){const r=Object.getOwnPropertyDescriptor(t,n);Object.defineProperty(a,n,r.get?r:{enumerable:!0,get:()=>t[n]})}}return a.default=t,Object.freeze(a)}const e=ct(V);function lt(t){const a=o=>typeof window<"u"?window.matchMedia(o).matches:!1,[n,r]=e.useState(a(t));function c(){r(a(t))}return e.useEffect(()=>{const o=window.matchMedia(t);return c(),o.addListener?o.addListener(c):o.addEventListener("change",c),()=>{o.removeListener?o.removeListener(c):o.removeEventListener("change",c)}},[t]),n}const Ce=e.createContext(void 0);function Me(t){const a=e.useContext(Ce);if(t===!0){if(a)return a;throw Error("tried to access feature context, but none is present")}return a}const le=e.forwardRef(function(a,n){const{mergedProps:r}=f.useChatToggle({props:a});return e.createElement("button",{ref:n,...r},a.children)}),ie=e.forwardRef(function(a,n){const{buttonProps:r}=f.useDisconnectButton(a);return e.createElement("button",{ref:n,...r},a.children)}),Te=t=>e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"currentColor",...t},e.createElement("path",{d:"M1.354.646a.5.5 0 1 0-.708.708l14 14a.5.5 0 0 0 .708-.708L11 10.293V4.5A1.5 1.5 0 0 0 9.5 3H3.707zM0 4.5a1.5 1.5 0 0 1 .943-1.393l9.532 9.533c-.262.224-.603.36-.975.36h-8A1.5 1.5 0 0 1 0 11.5z"}),e.createElement("path",{d:"m15.2 3.6-2.8 2.1a1 1 0 0 0-.4.8v3a1 1 0 0 0 .4.8l2.8 2.1a.5.5 0 0 0 .8-.4V4a.5.5 0 0 0-.8-.4z"})),ye=t=>e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"currentColor",...t},e.createElement("path",{d:"M0 4.5A1.5 1.5 0 0 1 1.5 3h8A1.5 1.5 0 0 1 11 4.5v7A1.5 1.5 0 0 1 9.5 13h-8A1.5 1.5 0 0 1 0 11.5zM15.2 3.6l-2.8 2.1a1 1 0 0 0-.4.8v3a1 1 0 0 0 .4.8l2.8 2.1a.5.5 0 0 0 .8-.4V4a.5.5 0 0 0-.8-.4z"})),Re=t=>e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:16,viewBox:"0 0 24 24",...t},e.createElement("path",{fill:"#FFF",d:"M4.99 3.99a1 1 0 0 0-.697 1.717L10.586 12l-6.293 6.293a1 1 0 1 0 1.414 1.414L12 13.414l6.293 6.293a1 1 0 1 0 1.414-1.414L13.414 12l6.293-6.293a1 1 0 0 0-.727-1.717 1 1 0 0 0-.687.303L12 10.586 5.707 4.293a1 1 0 0 0-.717-.303z"})),Ie=t=>e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:18,fill:"none",...t},e.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M0 2.75A2.75 2.75 0 0 1 2.75 0h10.5A2.75 2.75 0 0 1 16 2.75v13.594a.75.75 0 0 1-1.234.572l-3.691-3.12a1.25 1.25 0 0 0-.807-.296H2.75A2.75 2.75 0 0 1 0 10.75v-8ZM2.75 1.5c-.69 0-1.25.56-1.25 1.25v8c0 .69.56 1.25 1.25 1.25h7.518c.65 0 1.279.23 1.775.65l2.457 2.077V2.75c0-.69-.56-1.25-1.25-1.25H2.75Z",clipRule:"evenodd"}),e.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M3 4.5a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5Zm0 2a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5Zm0 2a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5Z",clipRule:"evenodd"})),re=t=>e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"none",...t},e.createElement("path",{fill:"currentcolor",fillRule:"evenodd",d:"M5.293 2.293a1 1 0 0 1 1.414 0l4.823 4.823a1.25 1.25 0 0 1 0 1.768l-4.823 4.823a1 1 0 0 1-1.414-1.414L9.586 8 5.293 3.707a1 1 0 0 1 0-1.414z",clipRule:"evenodd"})),Pe=t=>e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"none",...t},e.createElement("g",{stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.5},e.createElement("path",{d:"M10 1.75h4.25m0 0V6m0-4.25L9 7M6 14.25H1.75m0 0V10m0 4.25L7 9"}))),Ae=t=>e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"none",...t},e.createElement("path",{fill:"currentcolor",fillRule:"evenodd",d:"M8.961.894C8.875-.298 7.125-.298 7.04.894c-.066.912-1.246 1.228-1.76.472-.67-.99-2.186-.115-1.664.96.399.824-.465 1.688-1.288 1.289-1.076-.522-1.95.994-.961 1.665.756.513.44 1.693-.472 1.759-1.192.086-1.192 1.836 0 1.922.912.066 1.228 1.246.472 1.76-.99.67-.115 2.186.96 1.664.824-.399 1.688.465 1.289 1.288-.522 1.076.994 1.95 1.665.961.513-.756 1.693-.44 1.759.472.086 1.192 1.836 1.192 1.922 0 .066-.912 1.246-1.228 1.76-.472.67.99 2.186.115 1.664-.96-.399-.824.465-1.688 1.288-1.289 1.076.522 1.95-.994.961-1.665-.756-.513-.44-1.693.472-1.759 1.192-.086 1.192-1.836 0-1.922-.912-.066-1.228-1.246-.472-1.76.99-.67.115-2.186-.96-1.664-.824.399-1.688-.465-1.289-1.288.522-1.076-.994-1.95-1.665-.961-.513.756-1.693.44-1.759-.472ZM8 13A5 5 0 1 0 8 3a5 5 0 0 0 0 10Z",clipRule:"evenodd"})),Ne=t=>e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"none",...t},e.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M2 2.75A2.75 2.75 0 0 1 4.75 0h6.5A2.75 2.75 0 0 1 14 2.75v10.5A2.75 2.75 0 0 1 11.25 16h-6.5A2.75 2.75 0 0 1 2 13.25v-.5a.75.75 0 0 1 1.5 0v.5c0 .69.56 1.25 1.25 1.25h6.5c.69 0 1.25-.56 1.25-1.25V2.75c0-.69-.56-1.25-1.25-1.25h-6.5c-.69 0-1.25.56-1.25 1.25v.5a.75.75 0 0 1-1.5 0v-.5Z",clipRule:"evenodd"}),e.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M8.78 7.47a.75.75 0 0 1 0 1.06l-2.25 2.25a.75.75 0 1 1-1.06-1.06l.97-.97H1.75a.75.75 0 0 1 0-1.5h4.69l-.97-.97a.75.75 0 0 1 1.06-1.06l2.25 2.25Z",clipRule:"evenodd"})),Le=t=>e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"none",...t},e.createElement("path",{fill:"currentcolor",fillRule:"evenodd",d:"M4 6.104V4a4 4 0 1 1 8 0v2.104c1.154.326 2 1.387 2 2.646v4.5A2.75 2.75 0 0 1 11.25 16h-6.5A2.75 2.75 0 0 1 2 13.25v-4.5c0-1.259.846-2.32 2-2.646ZM5.5 4a2.5 2.5 0 0 1 5 0v2h-5V4Z",clipRule:"evenodd"})),xe=t=>e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"currentColor",...t},e.createElement("path",{d:"M12.227 11.52a5.477 5.477 0 0 0 1.246-2.97.5.5 0 0 0-.995-.1 4.478 4.478 0 0 1-.962 2.359l-1.07-1.07C10.794 9.247 11 8.647 11 8V3a3 3 0 0 0-6 0v1.293L1.354.646a.5.5 0 1 0-.708.708l14 14a.5.5 0 0 0 .708-.708zM8 12.5c.683 0 1.33-.152 1.911-.425l.743.743c-.649.359-1.378.59-2.154.66V15h2a.5.5 0 0 1 0 1h-5a.5.5 0 0 1 0-1h2v-1.522a5.502 5.502 0 0 1-4.973-4.929.5.5 0 0 1 .995-.098A4.5 4.5 0 0 0 8 12.5z"}),e.createElement("path",{d:"M8.743 10.907 5 7.164V8a3 3 0 0 0 3.743 2.907z"})),Ve=t=>e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"currentColor",...t},e.createElement("path",{fillRule:"evenodd",d:"M2.975 8.002a.5.5 0 0 1 .547.449 4.5 4.5 0 0 0 8.956 0 .5.5 0 1 1 .995.098A5.502 5.502 0 0 1 8.5 13.478V15h2a.5.5 0 0 1 0 1h-5a.5.5 0 0 1 0-1h2v-1.522a5.502 5.502 0 0 1-4.973-4.929.5.5 0 0 1 .448-.547z",clipRule:"evenodd"}),e.createElement("path",{d:"M5 3a3 3 0 1 1 6 0v5a3 3 0 0 1-6 0z"})),Fe=t=>e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"currentcolor",...t},e.createElement("path",{d:"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-6a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z"}),e.createElement("path",{d:"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-6a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z"})),De=t=>e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"currentcolor",...t},e.createElement("path",{d:"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z"}),e.createElement("path",{d:"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z"}),e.createElement("g",{opacity:.25},e.createElement("path",{d:"M12 .5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z"}),e.createElement("path",{d:"M12 .5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z"}))),ze=t=>e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"currentcolor",...t},e.createElement("path",{d:"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z"}),e.createElement("path",{d:"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z"}),e.createElement("g",{opacity:.25},e.createElement("path",{d:"M6 6.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z"}),e.createElement("path",{d:"M6 6.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-6a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z"}),e.createElement("path",{d:"M12 .5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z"}))),Oe=t=>e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"currentColor",...t},e.createElement("g",{opacity:.25},e.createElement("path",{d:"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-4Zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-9Zm6-6a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5V.5Z"}),e.createElement("path",{d:"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-4Zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-9Zm6-6a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5V.5Z"}))),oe=t=>e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:20,height:16,fill:"none",...t},e.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M0 2.75A2.75 2.75 0 0 1 2.75 0h14.5A2.75 2.75 0 0 1 20 2.75v10.5A2.75 2.75 0 0 1 17.25 16H2.75A2.75 2.75 0 0 1 0 13.25V2.75ZM2.75 1.5c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h14.5c.69 0 1.25-.56 1.25-1.25V2.75c0-.69-.56-1.25-1.25-1.25H2.75Z",clipRule:"evenodd"}),e.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M9.47 4.22a.75.75 0 0 1 1.06 0l2.25 2.25a.75.75 0 0 1-1.06 1.06l-.97-.97v4.69a.75.75 0 0 1-1.5 0V6.56l-.97.97a.75.75 0 0 1-1.06-1.06l2.25-2.25Z",clipRule:"evenodd"})),$e=t=>e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:20,height:16,fill:"none",...t},e.createElement("g",{fill:"currentColor"},e.createElement("path",{d:"M7.28 4.22a.75.75 0 0 0-1.06 1.06L8.94 8l-2.72 2.72a.75.75 0 1 0 1.06 1.06L10 9.06l2.72 2.72a.75.75 0 1 0 1.06-1.06L11.06 8l2.72-2.72a.75.75 0 0 0-1.06-1.06L10 6.94z"}),e.createElement("path",{fillRule:"evenodd",d:"M2.75 0A2.75 2.75 0 0 0 0 2.75v10.5A2.75 2.75 0 0 0 2.75 16h14.5A2.75 2.75 0 0 0 20 13.25V2.75A2.75 2.75 0 0 0 17.25 0zM1.5 2.75c0-.69.56-1.25 1.25-1.25h14.5c.69 0 1.25.56 1.25 1.25v10.5c0 .69-.56 1.25-1.25 1.25H2.75c-.69 0-1.25-.56-1.25-1.25z",clipRule:"evenodd"}))),ce=t=>e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"none",...t},e.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M8 0a.75.75 0 0 1 .75.75v2.5a.75.75 0 0 1-1.5 0V.75A.75.75 0 0 1 8 0Z",clipRule:"evenodd"}),e.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M8 12a.75.75 0 0 1 .75.75v2.5a.75.75 0 0 1-1.5 0v-2.5A.75.75 0 0 1 8 12Z",clipRule:"evenodd",opacity:.7}),e.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M12 1.072a.75.75 0 0 1 .274 1.024l-1.25 2.165a.75.75 0 0 1-1.299-.75l1.25-2.165A.75.75 0 0 1 12 1.072Z",clipRule:"evenodd"}),e.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M6 11.464a.75.75 0 0 1 .274 1.025l-1.25 2.165a.75.75 0 0 1-1.299-.75l1.25-2.165A.75.75 0 0 1 6 11.464Z",clipRule:"evenodd",opacity:.6}),e.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M14.928 4a.75.75 0 0 1-.274 1.025l-2.165 1.25a.75.75 0 1 1-.75-1.3l2.165-1.25A.75.75 0 0 1 14.928 4Z",clipRule:"evenodd"}),e.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M4.536 10a.75.75 0 0 1-.275 1.024l-2.165 1.25a.75.75 0 0 1-.75-1.298l2.165-1.25A.75.75 0 0 1 4.536 10Z",clipRule:"evenodd",opacity:.5}),e.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M16 8a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h2.5A.75.75 0 0 1 16 8Z",clipRule:"evenodd"}),e.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M4 8a.75.75 0 0 1-.75.75H.75a.75.75 0 0 1 0-1.5h2.5A.75.75 0 0 1 4 8Z",clipRule:"evenodd",opacity:.4}),e.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M14.928 12a.75.75 0 0 1-1.024.274l-2.165-1.25a.75.75 0 0 1 .75-1.299l2.165 1.25A.75.75 0 0 1 14.928 12Z",clipRule:"evenodd",opacity:.9}),e.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M4.536 6a.75.75 0 0 1-1.025.275l-2.165-1.25a.75.75 0 1 1 .75-1.3l2.165 1.25A.75.75 0 0 1 4.536 6Z",clipRule:"evenodd",opacity:.3}),e.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M12 14.928a.75.75 0 0 1-1.024-.274l-1.25-2.165a.75.75 0 0 1 1.298-.75l1.25 2.165A.75.75 0 0 1 12 14.928Z",clipRule:"evenodd",opacity:.8}),e.createElement("path",{fill:"currentColor",fillRule:"evenodd",d:"M6 4.536a.75.75 0 0 1-1.024-.275l-1.25-2.165a.75.75 0 1 1 1.299-.75l1.25 2.165A.75.75 0 0 1 6 4.536Z",clipRule:"evenodd",opacity:.2})),Ze=t=>e.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:16,height:16,fill:"none",...t},e.createElement("g",{stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:1.5},e.createElement("path",{d:"M13.25 7H9m0 0V2.75M9 7l5.25-5.25M2.75 9H7m0 0v4.25M7 9l-5.25 5.25"}))),_e=e.forwardRef(function({trackRef:a,...n},r){const c=f.useMaybeTrackRefContext(),{mergedProps:o,inFocus:u}=f.useFocusToggle({trackRef:a??c,props:n});return e.createElement(f.LayoutContext.Consumer,null,i=>i!==void 0&&e.createElement("button",{ref:r,...o},n.children?n.children:u?e.createElement(Ze,null):e.createElement(Pe,null)))}),G=e.forwardRef(function({kind:a,initialSelection:n,onActiveDeviceChange:r,onDeviceListChange:c,onDeviceSelectError:o,exactMatch:u,track:i,requestPermissions:l,onError:h,...s},p){const m=b.useMaybeRoomContext(),E=e.useRef("default"),g=e.useCallback(M=>{m&&m.emit(S.RoomEvent.MediaDevicesError,M),h==null||h(M)},[m,h]),{devices:v,activeDeviceId:d,setActiveMediaDevice:w,className:k}=f.useMediaDeviceSelect({kind:a,room:m,track:i,requestPermissions:l,onError:g});e.useEffect(()=>{n!==void 0&&w(n)},[w]),e.useEffect(()=>{typeof c=="function"&&c(v)},[c,v]),e.useEffect(()=>{d!==E.current&&(r==null||r(d)),E.current=d},[d]);const P=async M=>{try{await w(M,{exact:u??!0})}catch(R){if(R instanceof Error)o==null||o(R);else throw R}},I=e.useMemo(()=>f.mergeProps$1(s,{className:k},{className:"lk-list"}),[k,s]),C=!!v.find(M=>M.label.toLowerCase().startsWith("default"));function T(M,R,D){return M===R||!C&&D===0&&R==="default"}return e.createElement("ul",{ref:p,...I},v.map((M,R)=>e.createElement("li",{key:M.deviceId,id:M.deviceId,"data-lk-active":T(M.deviceId,d,R),"aria-selected":T(M.deviceId,d,R),role:"option"},e.createElement("button",{className:"lk-button",onClick:()=>P(M.deviceId)},M.label))))}),se=e.forwardRef(function({label:a,...n},r){const c=b.useRoomContext(),{mergedProps:o,canPlayAudio:u}=f.useStartAudio({room:c,props:n}),{mergedProps:i,canPlayVideo:l}=f.useStartVideo({room:c,props:o}),{style:h,...s}=i;return h.display=u&&l?"none":"block",e.createElement("button",{ref:r,style:h,...s},a??`Start ${u?"Video":"Audio"}`)});function je(t,a){switch(t){case S.Track.Source.Microphone:return a?e.createElement(Ve,null):e.createElement(xe,null);case S.Track.Source.Camera:return a?e.createElement(ye,null):e.createElement(Te,null);case S.Track.Source.ScreenShare:return a?e.createElement($e,null):e.createElement(oe,null);default:return}}function it(t){switch(t){case S.ConnectionQuality.Excellent:return e.createElement(Fe,null);case S.ConnectionQuality.Good:return e.createElement(De,null);case S.ConnectionQuality.Poor:return e.createElement(ze,null);default:return e.createElement(Oe,null)}}const Z=e.forwardRef(function({showIcon:a,...n},r){const{buttonProps:c,enabled:o}=f.useTrackToggle(n),[u,i]=e.useState(!1);return e.useEffect(()=>{i(!0)},[]),u&&e.createElement("button",{ref:r,...c},(a??!0)&&je(n.source,o),n.children)}),ue=e.forwardRef(function(a,n){const{className:r,quality:c}=f.useConnectionQualityIndicator(a),o=e.useMemo(()=>({...f.mergeProps$1(a,{className:r}),"data-lk-quality":c}),[c,a,r]);return e.createElement("div",{ref:n,...o},a.children??it(c))}),K=e.forwardRef(function({participant:a,...n},r){const c=f.useEnsureParticipant(a),{className:o,infoObserver:u}=e.useMemo(()=>b.setupParticipantName(c),[c]),{identity:i,name:l}=f.useObservableState(u,{name:c.name,identity:c.identity,metadata:c.metadata}),h=e.useMemo(()=>f.mergeProps$1(n,{className:o,"data-lk-participant-name":l}),[n,o,l]);return e.createElement("span",{ref:r,...h},l!==""?l:i,n.children)}),de=e.forwardRef(function({trackRef:a,show:n="always",...r},c){const{className:o,isMuted:u}=f.useTrackMutedIndicator(a),i=n==="always"||n==="muted"&&u||n==="unmuted"&&!u,l=e.useMemo(()=>f.mergeProps$1(r,{className:o}),[o,r]);return i?e.createElement("div",{ref:c,...l,"data-lk-muted":u},r.children??je(a.source,!u)):null}),me=t=>e.createElement("svg",{width:320,height:320,viewBox:"0 0 320 320",preserveAspectRatio:"xMidYMid meet",fill:"none",xmlns:"http://www.w3.org/2000/svg",...t},e.createElement("path",{d:"M160 180C204.182 180 240 144.183 240 100C240 55.8172 204.182 20 160 20C115.817 20 79.9997 55.8172 79.9997 100C79.9997 144.183 115.817 180 160 180Z",fill:"white",fillOpacity:.25}),e.createElement("path",{d:"M97.6542 194.614C103.267 191.818 109.841 192.481 115.519 195.141C129.025 201.466 144.1 205 159.999 205C175.899 205 190.973 201.466 204.48 195.141C210.158 192.481 216.732 191.818 222.345 194.614C262.703 214.719 291.985 253.736 298.591 300.062C300.15 310.997 291.045 320 280 320H39.9997C28.954 320 19.8495 310.997 21.4087 300.062C28.014 253.736 57.2966 214.72 97.6542 194.614Z",fill:"white",fillOpacity:.25}));function Be(t,a={}){const[n,r]=e.useState(b.getTrackByIdentifier(t)),[c,o]=e.useState(n==null?void 0:n.isMuted),[u,i]=e.useState(n==null?void 0:n.isSubscribed),[l,h]=e.useState(n==null?void 0:n.track),[s,p]=e.useState("landscape"),m=e.useRef(),{className:E,trackObserver:g}=e.useMemo(()=>b.setupMediaTrack(t),[t.participant.sid??t.participant.identity,t.source,b.isTrackReference(t)&&t.publication.trackSid]);return e.useEffect(()=>{const v=g.subscribe(d=>{b.log.debug("update track",d),r(d),o(d==null?void 0:d.isMuted),i(d==null?void 0:d.isSubscribed),h(d==null?void 0:d.track)});return()=>v==null?void 0:v.unsubscribe()},[g]),e.useEffect(()=>{var v,d;return l&&(m.current&&l.detach(m.current),(v=a.element)!=null&&v.current&&!(t.participant.isLocal&&(l==null?void 0:l.kind)==="audio")&&l.attach(a.element.current)),m.current=(d=a.element)==null?void 0:d.current,()=>{m.current&&(l==null||l.detach(m.current))}},[l,a.element]),e.useEffect(()=>{var v,d;if(typeof((v=n==null?void 0:n.dimensions)==null?void 0:v.width)=="number"&&typeof((d=n==null?void 0:n.dimensions)==null?void 0:d.height)=="number"){const w=n.dimensions.width>n.dimensions.height?"landscape":"portrait";p(w)}},[n]),{publication:n,isMuted:c,isSubscribed:u,track:l,elementProps:f.mergeProps$1(a.props,{className:E,"data-lk-local-participant":t.participant.isLocal,"data-lk-source":n==null?void 0:n.source,...(n==null?void 0:n.kind)==="video"&&{"data-lk-orientation":s}})}}var ae,ke;function ot(){if(ke)return ae;ke=1;var t="Expected a function",a=NaN,n="[object Symbol]",r=/^\s+|\s+$/g,c=/^[-+]0x[0-9a-f]+$/i,o=/^0b[01]+$/i,u=/^0o[0-7]+$/i,i=parseInt,l=typeof b.commonjsGlobal=="object"&&b.commonjsGlobal&&b.commonjsGlobal.Object===Object&&b.commonjsGlobal,h=typeof self=="object"&&self&&self.Object===Object&&self,s=l||h||Function("return this")(),p=Object.prototype,m=p.toString,E=Math.max,g=Math.min,v=function(){return s.Date.now()};function d(C,T,M){var R,D,y,N,F,O,z=0,_=!1,L=!1,q=!0;if(typeof C!="function")throw new TypeError(t);T=I(T)||0,w(M)&&(_=!!M.leading,L="maxWait"in M,y=L?E(I(M.maxWait)||0,T):y,q="trailing"in M?!!M.trailing:q);function j(x){var $=R,Q=D;return R=D=void 0,z=x,N=C.apply(Q,$),N}function ee(x){return z=x,F=setTimeout(H,T),_?j(x):N}function te(x){var $=x-O,Q=x-z,Ee=T-$;return L?g(Ee,y-Q):Ee}function B(x){var $=x-O,Q=x-z;return O===void 0||$>=T||$<0||L&&Q>=y}function H(){var x=v();if(B(x))return A(x);F=setTimeout(H,te(x))}function A(x){return F=void 0,q&&R?j(x):(R=D=void 0,N)}function W(){F!==void 0&&clearTimeout(F),z=0,R=O=D=F=void 0}function rt(){return F===void 0?N:A(v())}function ne(){var x=v(),$=B(x);if(R=arguments,D=this,O=x,$){if(F===void 0)return ee(O);if(L)return F=setTimeout(H,T),j(O)}return F===void 0&&(F=setTimeout(H,T)),N}return ne.cancel=W,ne.flush=rt,ne}function w(C){var T=typeof C;return!!C&&(T=="object"||T=="function")}function k(C){return!!C&&typeof C=="object"}function P(C){return typeof C=="symbol"||k(C)&&m.call(C)==n}function I(C){if(typeof C=="number")return C;if(P(C))return a;if(w(C)){var T=typeof C.valueOf=="function"?C.valueOf():C;C=w(T)?T+"":T}if(typeof C!="string")return C===0?C:+C;C=C.replace(r,"");var M=o.test(C);return M||u.test(C)?i(C.slice(2),M?2:8):c.test(C)?a:+C}return ae=d,ae}var st=ot();const Se=b.getDefaultExportFromCjs(st);function ut(t){const a=V.useRef(t);a.current=t,V.useEffect(()=>()=>{a.current()},[])}function dt(t,a=500,n){const r=V.useRef();ut(()=>{r.current&&r.current.cancel()});const c=V.useMemo(()=>{const o=Se(t,a,n),u=(...i)=>o(...i);return u.cancel=()=>{o.cancel()},u.isPending=()=>!!r.current,u.flush=()=>o.flush(),u},[t,a,n]);return V.useEffect(()=>{r.current=Se(t,a,n)},[t,a,n]),c}function mt(t,a,n){const r=((h,s)=>h===s),c=t instanceof Function?t():t,[o,u]=V.useState(c),i=V.useRef(c),l=dt(u,a,n);return r(i.current,c)||(l(c),i.current=c),[o,l]}function ft({threshold:t=0,root:a=null,rootMargin:n="0%",freezeOnceVisible:r=!1,initialIsIntersecting:c=!1,onChange:o}={}){var u;const[i,l]=V.useState(null),[h,s]=V.useState(()=>({isIntersecting:c,entry:void 0})),p=V.useRef();p.current=o;const m=((u=h.entry)==null?void 0:u.isIntersecting)&&r;V.useEffect(()=>{if(!i||!("IntersectionObserver"in window)||m)return;const v=new IntersectionObserver(d=>{const w=Array.isArray(v.thresholds)?v.thresholds:[v.thresholds];d.forEach(k=>{const P=k.isIntersecting&&w.some(I=>k.intersectionRatio>=I);s({isIntersecting:P,entry:k}),p.current&&p.current(P,k)})},{threshold:t,root:a,rootMargin:n});return v.observe(i),()=>{v.disconnect()}},[i,JSON.stringify(t),a,n,m,r]);const E=V.useRef(null);V.useEffect(()=>{var v;!i&&((v=h.entry)!=null&&v.target)&&!r&&!m&&E.current!==h.entry.target&&(E.current=h.entry.target,s({isIntersecting:c,entry:void 0}))},[i,h.entry,r,m,c]);const g=[l,!!h.isIntersecting,h.entry];return g.ref=g[0],g.isIntersecting=g[1],g.entry=g[2],g}const He=e.forwardRef(function({onTrackClick:a,onClick:n,onSubscriptionStatusChanged:r,trackRef:c,manageSubscription:o,...u},i){const l=f.useEnsureTrackRef(c),h=e.useRef(null);e.useImperativeHandle(i,()=>h.current);const s=ft({root:h.current}),[p]=mt(s,3e3);e.useEffect(()=>{o&&l.publication instanceof S.RemoteTrackPublication&&(p==null?void 0:p.isIntersecting)===!1&&(s==null?void 0:s.isIntersecting)===!1&&l.publication.setSubscribed(!1)},[p,l,o]),e.useEffect(()=>{o&&l.publication instanceof S.RemoteTrackPublication&&(s==null?void 0:s.isIntersecting)===!0&&l.publication.setSubscribed(!0)},[s,l,o]);const{elementProps:m,publication:E,isSubscribed:g}=Be(l,{element:h,props:u});e.useEffect(()=>{r==null||r(!!g)},[g,r]);const v=d=>{n==null||n(d),a==null||a({participant:l==null?void 0:l.participant,track:E})};return e.createElement("video",{ref:h,...m,muted:!0,onClick:v})}),X=e.forwardRef(function({trackRef:a,onSubscriptionStatusChanged:n,volume:r,...c},o){const u=f.useEnsureTrackRef(a),i=e.useRef(null);e.useImperativeHandle(o,()=>i.current);const{elementProps:l,isSubscribed:h,track:s,publication:p}=Be(u,{element:i,props:c});return e.useEffect(()=>{n==null||n(!!h)},[h,n]),e.useEffect(()=>{s===void 0||r===void 0||(s instanceof S.RemoteAudioTrack?s.setVolume(r):b.log.warn("Volume can only be set on remote audio tracks."))},[r,s]),e.useEffect(()=>{p===void 0||c.muted===void 0||(p instanceof S.RemoteTrackPublication?p.setEnabled(!c.muted):b.log.warn("Can only call setEnabled on remote track publications."))},[c.muted,p,s]),e.createElement("audio",{ref:i,...l})});function Ue(t){const a=!!f.useMaybeParticipantContext();return t.participant&&!a?e.createElement(f.ParticipantContext.Provider,{value:t.participant},t.children):e.createElement(e.Fragment,null,t.children)}function qe(t){const a=!!f.useMaybeTrackRefContext();return t.trackRef&&!a?e.createElement(f.TrackRefContext.Provider,{value:t.trackRef},t.children):e.createElement(e.Fragment,null,t.children)}const J=e.forwardRef(function({trackRef:a,children:n,onParticipantClick:r,disableSpeakingIndicator:c,...o},u){var E,g;const i=f.useEnsureTrackRef(a),{elementProps:l}=f.useParticipantTile({htmlProps:o,disableSpeakingIndicator:c,onParticipantClick:r,trackRef:i}),h=f.useIsEncrypted(i.participant),s=f.useMaybeLayoutContext(),p=(E=Me())==null?void 0:E.autoSubscription,m=e.useCallback(v=>{i.source&&!v&&s&&s.pin.dispatch&&b.isTrackReferencePinned(i,s.pin.state)&&s.pin.dispatch({msg:"clear_pin"})},[i,s]);return e.createElement("div",{ref:u,style:{position:"relative"},...l},e.createElement(qe,{trackRef:i},e.createElement(Ue,{participant:i.participant},n??e.createElement(e.Fragment,null,b.isTrackReference(i)&&(((g=i.publication)==null?void 0:g.kind)==="video"||i.source===S.Track.Source.Camera||i.source===S.Track.Source.ScreenShare)?e.createElement(He,{trackRef:i,onSubscriptionStatusChanged:m,manageSubscription:p}):b.isTrackReference(i)&&e.createElement(X,{trackRef:i,onSubscriptionStatusChanged:m}),e.createElement("div",{className:"lk-participant-placeholder"},e.createElement(me,null)),e.createElement("div",{className:"lk-participant-metadata"},e.createElement("div",{className:"lk-participant-metadata-item"},i.source===S.Track.Source.Camera?e.createElement(e.Fragment,null,h&&e.createElement(Le,{style:{marginRight:"0.25rem"}}),e.createElement(de,{trackRef:{participant:i.participant,source:S.Track.Source.Microphone},show:"muted"}),e.createElement(K,null)):e.createElement(e.Fragment,null,e.createElement(oe,{style:{marginRight:"0.25rem"}}),e.createElement(K,null,"'s screen"))),e.createElement(ue,{className:"lk-participant-metadata-item"}))),e.createElement(_e,{trackRef:i}))))});function We(t){const a=f.mergeProps$1(t,{className:"lk-focus-layout"});return e.createElement("div",{...a},t.children)}function Qe({trackRef:t,...a}){return e.createElement(J,{trackRef:t,...a})}function Y({tracks:t,...a}){return e.createElement(e.Fragment,null,t.map(n=>e.createElement(f.TrackRefContext.Provider,{value:n,key:b.getTrackReferenceId(n)},f.cloneSingleChild(a.children))))}function ht({totalPageCount:t,nextPage:a,prevPage:n,currentPage:r,pagesContainer:c}){const[o,u]=e.useState(!1);return e.useEffect(()=>{let i;return c&&(i=b.createInteractingObservable(c.current,2e3).subscribe(u)),()=>{i&&i.unsubscribe()}},[c]),e.createElement("div",{className:"lk-pagination-control","data-lk-user-interaction":o},e.createElement("button",{className:"lk-button",onClick:n},e.createElement(re,null)),e.createElement("span",{className:"lk-pagination-count"},`${r} of ${t}`),e.createElement("button",{className:"lk-button",onClick:a},e.createElement(re,null)))}const gt=e.forwardRef(function({totalPageCount:a,currentPage:n},r){const c=new Array(a).fill("").map((o,u)=>u+1===n?e.createElement("span",{"data-lk-active":!0,key:u}):e.createElement("span",{key:u}));return e.createElement("div",{ref:r,className:"lk-pagination-indicator"},c)});function Ge({tracks:t,...a}){const n=e.createRef(),r=e.useMemo(()=>f.mergeProps$1(a,{className:"lk-grid-layout"}),[a]),{layout:c}=f.useGridLayout(n,t.length),o=f.usePagination(c.maxTiles,t);return f.useSwipe(n,{onLeftSwipe:o.nextPage,onRightSwipe:o.prevPage}),e.createElement("div",{ref:n,"data-lk-pagination":o.totalPageCount>1,...r},e.createElement(Y,{tracks:o.tracks},a.children),t.length>c.maxTiles&&e.createElement(e.Fragment,null,e.createElement(gt,{totalPageCount:o.totalPageCount,currentPage:o.currentPage}),e.createElement(ht,{pagesContainer:n,...o})))}const vt=130,pt=140,we=1,Ke=16/10,Et=(1-Ke)*-1;function Je({tracks:t,orientation:a,...n}){const r=e.useRef(null),[c,o]=e.useState(0),{width:u,height:i}=f.useSize(r),l=a||(i>=u?"vertical":"horizontal"),h=l==="vertical"?Math.max(u*Et,vt):Math.max(i*Ke,pt),s=b.getScrollBarWidth(),p=Math.max(l==="vertical"?(i-s)/h:(u-s)/h,we);let m=Math.round(p);Math.abs(p-c)<.5?m=Math.round(c):c!==p&&o(p);const E=f.useVisualStableUpdate(t,m);return e.useLayoutEffect(()=>{r.current&&(r.current.dataset.lkOrientation=l,r.current.style.setProperty("--lk-max-visible-tiles",m.toString()))},[m,l]),e.createElement("aside",{key:l,className:"lk-carousel",ref:r,...n},e.createElement(Y,{tracks:E},n.children))}function fe({value:t,onPinChange:a,onWidgetChange:n,children:r}){const c=f.useEnsureCreateLayoutContext(t);return e.useEffect(()=>{b.log.debug("PinState Updated",{state:c.pin.state}),a&&c.pin.state&&a(c.pin.state)},[c.pin.state,a]),e.useEffect(()=>{b.log.debug("Widget Updated",{widgetState:c.widget.state}),n&&c.widget.state&&n(c.widget.state)},[n,c.widget.state]),e.createElement(f.LayoutContext.Provider,{value:c},r)}function Xe({room:t,volume:a,muted:n}){const r=f.useTracks([S.Track.Source.Microphone,S.Track.Source.ScreenShareAudio,S.Track.Source.Unknown],{updateOnlyOn:[],onlySubscribed:!0,room:t}).filter(c=>!c.participant.isLocal&&c.publication.kind===S.Track.Kind.Audio);return e.createElement("div",{style:{display:"none"}},r.map(c=>e.createElement(X,{key:b.getTrackReferenceId(c),trackRef:c,volume:a,muted:n})))}function Ye(t){const a=e.useMemo(()=>f.mergeProps$1(t,{className:"lk-toast"}),[t]);return e.createElement("div",{...a},t.children)}const kt=t=>{const a=[];for(let n=0;n<t;n++)a.push([n,t-1-n]);return a},be=t=>[[Math.floor(t/2)],[-1]],St=(t,a,n)=>{const[r,c]=V.useState(0),[o,u]=V.useState([[]]);V.useEffect(()=>{if(t==="thinking")u(be(a));else if(t==="connecting"||t==="initializing"){const l=[...kt(a)];u(l)}else u(t==="listening"?be(a):t===void 0||t==="speaking"?[new Array(a).fill(0).map((l,h)=>h)]:[[]]);c(0)},[t,a]);const i=V.useRef(null);return V.useEffect(()=>{let l=performance.now();const h=s=>{s-l>=n&&(c(m=>m+1),l=s),i.current=requestAnimationFrame(h)};return i.current=requestAnimationFrame(h),()=>{i.current!==null&&cancelAnimationFrame(i.current)}},[n,a,t,o.length]),o[r%o.length]},wt=new Map([["connecting",2e3],["initializing",2e3],["listening",500],["thinking",150]]),bt=(t,a)=>{if(t===void 0)return 1e3;let n=wt.get(t);if(n)switch(t){case"connecting":n/=a;break}return n},he=e.forwardRef(function({state:a,options:n,barCount:r=15,trackRef:c,track:o,children:u,...i},l){const h=f.mergeProps$1(i,{className:"lk-audio-bar-visualizer"});let s=f.useMaybeTrackRefContext();(c||o)&&(s=c||o);const p=f.useMultibandTrackVolume(s,{bands:r,loPass:100,hiPass:200}),m=(n==null?void 0:n.minHeight)??20,E=(n==null?void 0:n.maxHeight)??100,g=St(a,r,bt(a,r)??100);return e.createElement("div",{ref:l,...h,"data-lk-va-state":a},p.map((v,d)=>u?f.cloneSingleChild(u,{"data-lk-highlighted":g.includes(d),"data-lk-bar-index":d,className:"lk-audio-bar",style:{height:`${Math.min(E,Math.max(m,v*100+5))}%`}}):e.createElement("span",{key:d,"data-lk-highlighted":g.includes(d),"data-lk-bar-index":d,className:`lk-audio-bar ${g.includes(d)&&"lk-highlighted"}`,style:{height:`${Math.min(E,Math.max(m,v*100+5))}%`}})))}),et=e.forwardRef(function({children:a,disableSpeakingIndicator:n,onParticipantClick:r,trackRef:c,...o},u){const i=f.useEnsureTrackRef(c),{elementProps:l}=f.useParticipantTile({trackRef:i,htmlProps:o,disableSpeakingIndicator:n,onParticipantClick:r});return e.createElement("div",{ref:u,style:{position:"relative",minHeight:"160px"},...l},e.createElement(f.TrackRefContext.Provider,{value:i},a??e.createElement(e.Fragment,null,b.isTrackReference(i)&&e.createElement(X,{trackRef:i}),e.createElement(he,{barCount:7,options:{minHeight:8}}),e.createElement("div",{className:"lk-participant-metadata"},e.createElement("div",{className:"lk-participant-metadata-item"},e.createElement(de,{trackRef:i}),e.createElement(K,null)),e.createElement(ue,{className:"lk-participant-metadata-item"})))))});function tt(t){const[a,n]=e.useState(void 0),r=f.useConnectionState(t.room);return e.useEffect(()=>{switch(r){case S.ConnectionState.Reconnecting:n(e.createElement(e.Fragment,null,e.createElement(ce,{className:"lk-spinner"})," Reconnecting"));break;case S.ConnectionState.Connecting:n(e.createElement(e.Fragment,null,e.createElement(ce,{className:"lk-spinner"})," Connecting"));break;case S.ConnectionState.Disconnected:n(e.createElement(e.Fragment,null,"Disconnected"));break;default:n(void 0);break}},[r]),a?e.createElement(Ye,{className:"lk-toast-connection-state"},a):e.createElement(e.Fragment,null)}const nt=e.forwardRef(function({entry:a,hideName:n=!1,hideTimestamp:r=!1,messageFormatter:c,...o},u){var m,E,g,v;const i=e.useMemo(()=>c?c(a.message):a.message,[a.message,c]),l=!!a.editTimestamp,h=new Date(a.timestamp),s=typeof navigator<"u"?navigator.language:"en-US",p=((m=a.from)==null?void 0:m.name)??((E=a.from)==null?void 0:E.identity);return e.createElement("li",{ref:u,className:"lk-chat-entry",title:h.toLocaleTimeString(s,{timeStyle:"full"}),"data-lk-message-origin":(g=a.from)!=null&&g.isLocal?"local":"remote",...o},(!r||!n||l)&&e.createElement("span",{className:"lk-meta-data"},!n&&e.createElement("strong",{className:"lk-participant-name"},p),(!r||l)&&e.createElement("span",{className:"lk-timestamp"},l&&"edited ",h.toLocaleTimeString(s,{timeStyle:"short"}))),e.createElement("span",{className:"lk-message-body"},i),e.createElement("span",{className:"lk-message-attachements"},(v=a.attachedFiles)==null?void 0:v.map(d=>d.type.startsWith("image/")&&e.createElement("img",{style:{maxWidth:"300px",maxHeight:"300px"},key:d.name,src:URL.createObjectURL(d),alt:d.name}))))});function Ct(t){return b.tokenize(t,b.createDefaultGrammar()).map((a,n)=>{if(typeof a=="string")return a;{const r=a.content.toString(),c=a.type==="url"?/^http(s?):\/\//.test(r)?r:`https://${r}`:`mailto:${r}`;return e.createElement("a",{className:"lk-chat-link",key:n,href:c,target:"_blank",rel:"noreferrer"},r)}})}function ge({messageFormatter:t,messageDecoder:a,messageEncoder:n,channelTopic:r,...c}){const o=e.useRef(null),u=e.useRef(null),i=e.useMemo(()=>({messageDecoder:a,messageEncoder:n,channelTopic:r}),[a,n,r]),{chatMessages:l,send:h,isSending:s}=f.useChat(i),p=f.useMaybeLayoutContext(),m=e.useRef(0);async function E(g){g.preventDefault(),u.current&&u.current.value.trim()!==""&&(await h(u.current.value),u.current.value="",u.current.focus())}return e.useEffect(()=>{var g;o&&((g=o.current)==null||g.scrollTo({top:o.current.scrollHeight}))},[o,l]),e.useEffect(()=>{var d,w,k,P,I;if(!p||l.length===0)return;if((d=p.widget.state)!=null&&d.showChat&&l.length>0&&m.current!==((w=l[l.length-1])==null?void 0:w.timestamp)){m.current=(k=l[l.length-1])==null?void 0:k.timestamp;return}const g=l.filter(C=>!m.current||C.timestamp>m.current).length,{widget:v}=p;g>0&&((P=v.state)==null?void 0:P.unreadMessages)!==g&&((I=v.dispatch)==null||I.call(v,{msg:"unread_msg",count:g}))},[l,p==null?void 0:p.widget]),e.createElement("div",{...c,className:"lk-chat"},e.createElement("div",{className:"lk-chat-header"},"Messages",p&&e.createElement(le,{className:"lk-close-button"},e.createElement(Re,null))),e.createElement("ul",{className:"lk-list lk-chat-messages",ref:o},c.children?l.map((g,v)=>f.cloneSingleChild(c.children,{entry:g,key:g.id??v,messageFormatter:t})):l.map((g,v,d)=>{const w=v>=1&&d[v-1].from===g.from,k=v>=1&&g.timestamp-d[v-1].timestamp<6e4;return e.createElement(nt,{key:g.id??v,hideName:w,hideTimestamp:w===!1?!1:k,entry:g,messageFormatter:t})})),e.createElement("form",{className:"lk-chat-form",onSubmit:E},e.createElement("input",{className:"lk-form-control lk-chat-form-input",disabled:s,ref:u,type:"text",placeholder:"Enter a message...",onInput:g=>g.stopPropagation(),onKeyDown:g=>g.stopPropagation(),onKeyUp:g=>g.stopPropagation()}),e.createElement("button",{type:"submit",className:"lk-button lk-chat-form-button",disabled:s},"Send")))}function U({kind:t,initialSelection:a,onActiveDeviceChange:n,tracks:r,requestPermissions:c=!1,...o}){const[u,i]=e.useState(!1),[l,h]=e.useState([]),[s,p]=e.useState(!0),[m,E]=e.useState(c),g=(k,P)=>{b.log.debug("handle device change"),i(!1),n==null||n(k,P)},v=e.useRef(null),d=e.useRef(null);e.useLayoutEffect(()=>{u&&E(!0)},[u]),e.useLayoutEffect(()=>{let k;return v.current&&d.current&&(l||s)&&(k=b.computeMenuPosition(v.current,d.current,(P,I)=>{d.current&&Object.assign(d.current.style,{left:`${P}px`,top:`${I}px`})})),p(!1),()=>{k==null||k()}},[v,d,l,s]);const w=e.useCallback(k=>{d.current&&k.target!==v.current&&u&&b.wasClickOutside(d.current,k)&&i(!1)},[u,d,v]);return e.useEffect(()=>(document.addEventListener("click",w),()=>{document.removeEventListener("click",w)}),[w]),e.createElement(e.Fragment,null,e.createElement("button",{className:"lk-button lk-button-menu","aria-pressed":u,...o,onClick:()=>i(!u),ref:v},o.children),!o.disabled&&e.createElement("div",{className:"lk-device-menu",ref:d,style:{visibility:u?"visible":"hidden"}},t?e.createElement(G,{initialSelection:a,onActiveDeviceChange:k=>g(t,k),onDeviceListChange:h,kind:t,track:r==null?void 0:r[t],requestPermissions:m}):e.createElement(e.Fragment,null,e.createElement("div",{className:"lk-device-menu-heading"},"Audio inputs"),e.createElement(G,{kind:"audioinput",onActiveDeviceChange:k=>g("audioinput",k),onDeviceListChange:h,track:r==null?void 0:r.audioinput,requestPermissions:m}),e.createElement("div",{className:"lk-device-menu-heading"},"Video inputs"),e.createElement(G,{kind:"videoinput",onActiveDeviceChange:k=>g("videoinput",k),onDeviceListChange:h,track:r==null?void 0:r.videoinput,requestPermissions:m}))))}function ve(){e.useEffect(()=>{f.warnAboutMissingStyles()},[])}function at(t,a){const[n,r]=e.useState(),c=e.useMemo(()=>new S.Mutex,[]);return e.useEffect(()=>{let o=!1,u=[];return c.lock().then(async i=>{try{(t.audio||t.video)&&(u=await S.createLocalTracks(t),o?u.forEach(l=>l.stop()):r(u))}catch(l){a&&l instanceof Error?a(l):b.log.error(l)}finally{i()}}),()=>{o=!0,u.forEach(i=>{i.stop()})}},[JSON.stringify(t,f.roomOptionsStringifyReplacer),a,c]),n}function Mt(t,a,n){const[r,c]=e.useState(null),[o,u]=e.useState(!1),i=f.useMediaDevices({kind:n}),[l,h]=e.useState(void 0),[s,p]=e.useState(),[m,E]=e.useState(a);e.useEffect(()=>{E(a)},[a]);const g=async(w,k)=>{try{const P=k==="videoinput"?await S.createLocalVideoTrack({deviceId:w,resolution:S.VideoPresets.h720.resolution}):await S.createLocalAudioTrack({deviceId:w}),I=await P.getDeviceId(!1);I&&w!==I&&(d.current=I,E(I)),p(P)}catch(P){P instanceof Error&&c(P)}},v=async(w,k)=>{await w.setDeviceId(k),d.current=k},d=e.useRef(m);return e.useEffect(()=>{t&&!s&&!r&&!o&&(b.log.debug("creating track",n),u(!0),g(m,n).finally(()=>{u(!1)}))},[t,s,r,o]),e.useEffect(()=>{s&&(t?l!=null&&l.deviceId&&d.current!==(l==null?void 0:l.deviceId)?(b.log.debug(`switching ${n} device from`,d.current,l.deviceId),v(s,l.deviceId)):(b.log.debug(`unmuting local ${n} track`),s.unmute()):(b.log.debug(`muting ${n} track`),s.mute().then(()=>b.log.debug(s.mediaStreamTrack))))},[s,l,t,n]),e.useEffect(()=>()=>{s&&(b.log.debug(`stopping local ${n} track`),s.stop(),s.mute())},[]),e.useEffect(()=>{h(i==null?void 0:i.find(w=>w.deviceId===m))},[m,i]),{selectedDevice:l,localTrack:s,deviceError:r}}function Tt({defaults:t={},onValidate:a,onSubmit:n,onError:r,debug:c,joinLabel:o="Join Room",micLabel:u="Microphone",camLabel:i="Camera",userLabel:l="Username",persistUserChoices:h=!0,videoProcessor:s,...p}){const{userChoices:m,saveAudioInputDeviceId:E,saveAudioInputEnabled:g,saveVideoInputDeviceId:v,saveVideoInputEnabled:d,saveUsername:w}=f.usePersistentUserChoices({defaults:t,preventSave:!h,preventLoad:!h}),[k,P]=e.useState(m),[I,C]=e.useState(k.audioEnabled),[T,M]=e.useState(k.videoEnabled),[R,D]=e.useState(k.audioDeviceId),[y,N]=e.useState(k.videoDeviceId),[F,O]=e.useState(k.username);e.useEffect(()=>{g(I)},[I,g]),e.useEffect(()=>{d(T)},[T,d]),e.useEffect(()=>{E(R)},[R,E]),e.useEffect(()=>{v(y)},[y,v]),e.useEffect(()=>{w(F)},[F,w]);const z=at({audio:I?{deviceId:m.audioDeviceId}:!1,video:T?{deviceId:m.videoDeviceId,processor:s}:!1},r),_=e.useRef(null),L=e.useMemo(()=>z==null?void 0:z.filter(A=>A.kind===S.Track.Kind.Video)[0],[z]),q=e.useMemo(()=>{if(L){const{facingMode:A}=S.facingModeFromLocalTrack(L);return A}else return"undefined"},[L]),j=e.useMemo(()=>z==null?void 0:z.filter(A=>A.kind===S.Track.Kind.Audio)[0],[z]);e.useEffect(()=>(_.current&&L&&(L.unmute(),L.attach(_.current)),()=>{L==null||L.detach()}),[L]);const[ee,te]=e.useState(),B=e.useCallback(A=>typeof a=="function"?a(A):A.username!=="",[a]);e.useEffect(()=>{const A={username:F,videoEnabled:T,videoDeviceId:y,audioEnabled:I,audioDeviceId:R};P(A),te(B(A))},[F,T,B,I,R,y]);function H(A){A.preventDefault(),B(k)?typeof n=="function"&&n(k):b.log.warn("Validation failed with: ",k)}return ve(),e.createElement("div",{className:"lk-prejoin",...p},e.createElement("div",{className:"lk-video-container"},L&&e.createElement("video",{ref:_,width:"1280",height:"720","data-lk-facing-mode":q}),(!L||!T)&&e.createElement("div",{className:"lk-camera-off-note"},e.createElement(me,null))),e.createElement("div",{className:"lk-button-group-container"},e.createElement("div",{className:"lk-button-group audio"},e.createElement(Z,{initialState:I,source:S.Track.Source.Microphone,onChange:A=>C(A)},u),e.createElement("div",{className:"lk-button-group-menu"},e.createElement(U,{initialSelection:R,kind:"audioinput",disabled:!j,tracks:{audioinput:j},onActiveDeviceChange:(A,W)=>D(W)}))),e.createElement("div",{className:"lk-button-group video"},e.createElement(Z,{initialState:T,source:S.Track.Source.Camera,onChange:A=>M(A)},i),e.createElement("div",{className:"lk-button-group-menu"},e.createElement(U,{initialSelection:y,kind:"videoinput",disabled:!L,tracks:{videoinput:L},onActiveDeviceChange:(A,W)=>N(W)})))),e.createElement("form",{className:"lk-username-container"},e.createElement("input",{className:"lk-form-control",id:"username",name:"username",type:"text",defaultValue:F,placeholder:l,onChange:A=>O(A.target.value),autoComplete:"off"}),e.createElement("button",{className:"lk-button lk-join-button",type:"submit",onClick:H,disabled:!ee},o)),c&&e.createElement(e.Fragment,null,e.createElement("strong",null,"User Choices:"),e.createElement("ul",{className:"lk-list",style:{overflow:"hidden",maxWidth:"15rem"}},e.createElement("li",null,"Username: ",`${k.username}`),e.createElement("li",null,"Video Enabled: ",`${k.videoEnabled}`),e.createElement("li",null,"Audio Enabled: ",`${k.audioEnabled}`),e.createElement("li",null,"Video Device: ",`${k.videoDeviceId}`),e.createElement("li",null,"Audio Device: ",`${k.audioDeviceId}`))))}function yt({props:t}){const{dispatch:a,state:n}=f.useLayoutContext().widget,r="lk-button lk-settings-toggle";return{mergedProps:e.useMemo(()=>f.mergeProps(t,{className:r,onClick:()=>{a&&a({msg:"toggle_settings"})},"aria-pressed":n!=null&&n.showSettings?"true":"false"}),[t,r,a,n])}}const Rt=e.forwardRef(function(a,n){const{mergedProps:r}=yt({props:a});return e.createElement("button",{ref:n,...r},a.children)}),It=t=>{switch(t){case S.Track.Source.Camera:return 1;case S.Track.Source.Microphone:return 2;case S.Track.Source.ScreenShare:return 3;default:return 0}};function pe({variation:t,controls:a,saveUserChoices:n=!0,onDeviceError:r,...c}){var D;const[o,u]=e.useState(!1),i=f.useMaybeLayoutContext();e.useEffect(()=>{var y,N;((y=i==null?void 0:i.widget.state)==null?void 0:y.showChat)!==void 0&&u((N=i==null?void 0:i.widget.state)==null?void 0:N.showChat)},[(D=i==null?void 0:i.widget.state)==null?void 0:D.showChat]);const h=lt(`(max-width: ${o?1e3:760}px)`)?"minimal":"verbose";t??(t=h);const s={leave:!0,...a},p=f.useLocalParticipantPermissions();if(!p)s.camera=!1,s.chat=!1,s.microphone=!1,s.screenShare=!1;else{const y=N=>p.canPublish&&(p.canPublishSources.length===0||p.canPublishSources.includes(It(N)));s.camera??(s.camera=y(S.Track.Source.Camera)),s.microphone??(s.microphone=y(S.Track.Source.Microphone)),s.screenShare??(s.screenShare=y(S.Track.Source.ScreenShare)),s.chat??(s.chat=p.canPublishData&&(a==null?void 0:a.chat))}const m=e.useMemo(()=>t==="minimal"||t==="verbose",[t]),E=e.useMemo(()=>t==="textOnly"||t==="verbose",[t]),g=b.supportsScreenSharing(),[v,d]=e.useState(!1),w=e.useCallback(y=>{d(y)},[d]),k=f.mergeProps$1({className:"lk-control-bar"},c),{saveAudioInputEnabled:P,saveVideoInputEnabled:I,saveAudioInputDeviceId:C,saveVideoInputDeviceId:T}=f.usePersistentUserChoices({preventSave:!n}),M=e.useCallback((y,N)=>N?P(y):null,[P]),R=e.useCallback((y,N)=>N?I(y):null,[I]);return e.createElement("div",{...k},s.microphone&&e.createElement("div",{className:"lk-button-group"},e.createElement(Z,{source:S.Track.Source.Microphone,showIcon:m,onChange:M,onDeviceError:y=>r==null?void 0:r({source:S.Track.Source.Microphone,error:y})},E&&"Microphone"),e.createElement("div",{className:"lk-button-group-menu"},e.createElement(U,{kind:"audioinput",onActiveDeviceChange:(y,N)=>C(N??"default")}))),s.camera&&e.createElement("div",{className:"lk-button-group"},e.createElement(Z,{source:S.Track.Source.Camera,showIcon:m,onChange:R,onDeviceError:y=>r==null?void 0:r({source:S.Track.Source.Camera,error:y})},E&&"Camera"),e.createElement("div",{className:"lk-button-group-menu"},e.createElement(U,{kind:"videoinput",onActiveDeviceChange:(y,N)=>T(N??"default")}))),s.screenShare&&g&&e.createElement(Z,{source:S.Track.Source.ScreenShare,captureOptions:{audio:!0,selfBrowserSurface:"include"},showIcon:m,onChange:w,onDeviceError:y=>r==null?void 0:r({source:S.Track.Source.ScreenShare,error:y})},E&&(v?"Stop screen share":"Share screen")),s.chat&&e.createElement(le,null,m&&e.createElement(Ie,null),E&&"Chat"),s.settings&&e.createElement(Rt,null,m&&e.createElement(Ae,null),E&&"Settings"),s.leave&&e.createElement(ie,null,m&&e.createElement(Ne,null),E&&"Leave"),e.createElement(se,null))}function Pt({chatMessageFormatter:t,chatMessageDecoder:a,chatMessageEncoder:n,SettingsComponent:r,controlBarProops:c={},...o}){var v,d;const[u,i]=e.useState({showChat:!1,unreadMessages:0,showSettings:!1}),l=e.useRef(null),h=f.useTracks([{source:S.Track.Source.Camera,withPlaceholder:!0},{source:S.Track.Source.ScreenShare,withPlaceholder:!1}],{updateOnlyOn:[S.RoomEvent.ActiveSpeakersChanged],onlySubscribed:!1}),s=w=>{b.log.debug("updating widget state",w),i(w)},p=f.useCreateLayoutContext(),m=h.filter(b.isTrackReference).filter(w=>w.publication.source===S.Track.Source.ScreenShare),E=(v=f.usePinnedTracks(p))==null?void 0:v[0],g=h.filter(w=>!b.isEqualTrackRef(w,E));return e.useEffect(()=>{var w,k,P,I,C,T;if(m.some(M=>M.publication.isSubscribed)&&l.current===null?(b.log.debug("Auto set screen share focus:",{newScreenShareTrack:m[0]}),(k=(w=p.pin).dispatch)==null||k.call(w,{msg:"set_pin",trackReference:m[0]}),l.current=m[0]):l.current&&!m.some(M=>{var R,D;return M.publication.trackSid===((D=(R=l.current)==null?void 0:R.publication)==null?void 0:D.trackSid)})&&(b.log.debug("Auto clearing screen share focus."),(I=(P=p.pin).dispatch)==null||I.call(P,{msg:"clear_pin"}),l.current=null),E&&!b.isTrackReference(E)){const M=h.find(R=>R.participant.identity===E.participant.identity&&R.source===E.source);M!==E&&b.isTrackReference(M)&&((T=(C=p.pin).dispatch)==null||T.call(C,{msg:"set_pin",trackReference:M}))}},[m.map(w=>`${w.publication.trackSid}_${w.publication.isSubscribed}`).join(),(d=E==null?void 0:E.publication)==null?void 0:d.trackSid,h]),ve(),e.createElement("div",{className:"lk-video-conference",...o},b.isWeb()&&e.createElement(fe,{value:p,onWidgetChange:s},e.createElement("div",{className:"lk-video-conference-inner"},E?e.createElement("div",{className:"lk-focus-layout-wrapper"},e.createElement(We,null,e.createElement(Je,{tracks:g},e.createElement(J,null)),E&&e.createElement(Qe,{trackRef:E}))):e.createElement("div",{className:"lk-grid-layout-wrapper"},e.createElement(Ge,{tracks:h},e.createElement(J,null))),e.createElement(pe,{controls:{chat:!0,settings:!!r,...c}})),e.createElement(ge,{style:{display:u.showChat?"grid":"none"},messageFormatter:t,messageEncoder:n,messageDecoder:a}),r&&e.createElement("div",{className:"lk-settings-menu-modal",style:{display:u.showSettings?"block":"none"}},e.createElement(r,null))),e.createElement(Xe,null),e.createElement(tt,null))}function At({...t}){const[a,n]=e.useState({showChat:!1,unreadMessages:0}),r=f.useTracks([S.Track.Source.Microphone]);return ve(),e.createElement(fe,{onWidgetChange:n},e.createElement("div",{className:"lk-audio-conference",...t},e.createElement("div",{className:"lk-audio-conference-stage"},e.createElement(Y,{tracks:r},e.createElement(et,null))),e.createElement(pe,{controls:{microphone:!0,screenShare:!1,camera:!1,chat:!0}}),a.showChat&&e.createElement(ge,null)))}function Nt({controls:t,saveUserChoices:a=!0,onDeviceError:n,...r}){const c={leave:!0,microphone:!0,...t},o=f.useLocalParticipantPermissions(),{microphoneTrack:u,localParticipant:i}=b.useLocalParticipant(),l=e.useMemo(()=>({participant:i,source:S.Track.Source.Microphone,publication:u}),[i,u]);o?c.microphone??(c.microphone=o.canPublish):c.microphone=!1;const h=f.mergeProps$1({className:"lk-agent-control-bar"},r),{saveAudioInputEnabled:s,saveAudioInputDeviceId:p}=f.usePersistentUserChoices({preventSave:!a}),m=e.useCallback((E,g)=>{g&&s(E)},[s]);return e.createElement("div",{...h},c.microphone&&e.createElement("div",{className:"lk-button-group"},e.createElement(Z,{source:S.Track.Source.Microphone,showIcon:!0,onChange:m,onDeviceError:E=>n==null?void 0:n({source:S.Track.Source.Microphone,error:E})},e.createElement(he,{trackRef:l,barCount:7,options:{minHeight:5}})),e.createElement("div",{className:"lk-button-group-menu"},e.createElement(U,{kind:"audioinput",onActiveDeviceChange:(E,g)=>p(g??"default")}))),c.leave&&e.createElement(ie,null,"Disconnect"),e.createElement(se,null))}exports.AudioConference=At;exports.AudioTrack=X;exports.BarVisualizer=he;exports.CarouselLayout=Je;exports.Chat=ge;exports.ChatEntry=nt;exports.ChatToggle=le;exports.ConnectionQualityIndicator=ue;exports.ConnectionStateToast=tt;exports.ControlBar=pe;exports.DisconnectButton=ie;exports.FocusLayout=Qe;exports.FocusLayoutContainer=We;exports.FocusToggle=_e;exports.GridLayout=Ge;exports.LKFeatureContext=Ce;exports.LayoutContextProvider=fe;exports.MediaDeviceMenu=U;exports.MediaDeviceSelect=G;exports.ParticipantAudioTile=et;exports.ParticipantContextIfNeeded=Ue;exports.ParticipantName=K;exports.ParticipantTile=J;exports.PreJoin=Tt;exports.RoomAudioRenderer=Xe;exports.StartMediaButton=se;exports.SvgCameraDisabledIcon=Te;exports.SvgCameraIcon=ye;exports.SvgChatCloseIcon=Re;exports.SvgChatIcon=Ie;exports.SvgChevron=re;exports.SvgFocusToggleIcon=Pe;exports.SvgGearIcon=Ae;exports.SvgLeaveIcon=Ne;exports.SvgLockLockedIcon=Le;exports.SvgMicDisabledIcon=xe;exports.SvgMicIcon=Ve;exports.SvgParticipantPlaceholder=me;exports.SvgQualityExcellentIcon=Fe;exports.SvgQualityGoodIcon=De;exports.SvgQualityPoorIcon=ze;exports.SvgQualityUnknownIcon=Oe;exports.SvgScreenShareIcon=oe;exports.SvgScreenShareStopIcon=$e;exports.SvgSpinnerIcon=ce;exports.SvgUnfocusToggleIcon=Ze;exports.Toast=Ye;exports.TrackLoop=Y;exports.TrackMutedIndicator=de;exports.TrackRefContextIfNeeded=qe;exports.TrackToggle=Z;exports.VideoConference=Pt;exports.VideoTrack=He;exports.VoiceAssistantControlBar=Nt;exports.formatChatMessageLinks=Ct;exports.useFeatureContext=Me;exports.usePreviewDevice=Mt;exports.usePreviewTracks=at;
2
+ //# sourceMappingURL=shared-DTHOl3uJ.js.map