mediasfu-angular 2.2.1 → 2.2.3

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 (215) hide show
  1. package/README.md +970 -40
  2. package/USAGE_COOKBOOK.md +202 -0
  3. package/dist/LICENSE +21 -0
  4. package/dist/README.md +970 -40
  5. package/dist/fesm2022/mediasfu-angular.mjs +30595 -16317
  6. package/dist/fesm2022/mediasfu-angular.mjs.map +1 -1
  7. package/dist/lib/@types/types.d.ts +28 -2
  8. package/dist/lib/@types/ui-overrides.types.d.ts +314 -0
  9. package/dist/lib/components/background-components/background-modal/background-modal.component.d.ts +1053 -5
  10. package/dist/lib/components/breakout-components/breakout-rooms-modal.component.d.ts +2126 -51
  11. package/dist/lib/components/breakout-components/edit-room-modal/edit-room-modal.component.d.ts +1587 -45
  12. package/dist/lib/components/breakout-components/room-list/room-list.component.d.ts +5 -1
  13. package/dist/lib/components/co-host-components/co-host-modal/co-host-modal.component.d.ts +1067 -56
  14. package/dist/lib/components/display-components/alert-component/alert.component.component.d.ts +98 -28
  15. package/dist/lib/components/display-components/audio-card/audio-card.component.d.ts +17 -7
  16. package/dist/lib/components/display-components/audio-grid/audio-grid.component.d.ts +591 -11
  17. package/dist/lib/components/display-components/card-video-display/card-video-display.component.d.ts +3 -0
  18. package/dist/lib/components/display-components/control-buttons-alt-component/control-buttons-alt-component.component.d.ts +1 -1
  19. package/dist/lib/components/display-components/control-buttons-component/control-buttons-component.component.d.ts +34 -2
  20. package/dist/lib/components/display-components/control-buttons-component-touch/control-buttons-component-touch.component.d.ts +19 -0
  21. package/dist/lib/components/display-components/control-widgets/control-icon-badge-widget.component.d.ts +13 -0
  22. package/dist/lib/components/display-components/control-widgets/menu-participants-widget.component.d.ts +1 -0
  23. package/dist/lib/components/display-components/control-widgets/menu-widget.component.d.ts +2 -2
  24. package/dist/lib/components/display-components/control-widgets/message-widget.component.d.ts +2 -2
  25. package/dist/lib/components/display-components/control-widgets/record-timer-widget.component.d.ts +2 -0
  26. package/dist/lib/components/display-components/control-widgets/screenshare-widget.component.d.ts +5 -3
  27. package/dist/lib/components/display-components/flexible-grid/flexible-grid.component.d.ts +617 -26
  28. package/dist/lib/components/display-components/flexible-video/flexible-video.component.d.ts +41 -1
  29. package/dist/lib/components/display-components/loading-modal/loading-modal.component.d.ts +2024 -10
  30. package/dist/lib/components/display-components/main-aspect-component/main-aspect-component.component.d.ts +6 -2
  31. package/dist/lib/components/display-components/main-container-component/main-container-component.component.d.ts +6 -2
  32. package/dist/lib/components/display-components/main-grid-component/main-grid-component.component.d.ts +507 -8
  33. package/dist/lib/components/display-components/main-screen-component/main-screen-component.component.d.ts +508 -7
  34. package/dist/lib/components/display-components/meeting-progress-timer/meeting-progress-timer.component.d.ts +18 -11
  35. package/dist/lib/components/display-components/mini-audio/mini-audio.component.d.ts +11 -3
  36. package/dist/lib/components/display-components/mini-card/mini-card.component.d.ts +1026 -999
  37. package/dist/lib/components/display-components/mini-card-audio/mini-card-audio.component.d.ts +9 -3
  38. package/dist/lib/components/display-components/other-grid-component/other-grid-component.component.d.ts +517 -1
  39. package/dist/lib/components/display-components/pagination/pagination.component.d.ts +34 -1
  40. package/dist/lib/components/display-components/sub-aspect-component/sub-aspect-component.component.d.ts +513 -2
  41. package/dist/lib/components/display-components/subtitle-overlay/subtitle-overlay.component.d.ts +6 -0
  42. package/dist/lib/components/display-components/video-card/video-card.component.d.ts +10 -6
  43. package/dist/lib/components/display-settings-components/display-settings-modal.component.d.ts +1108 -27
  44. package/dist/lib/components/event-settings-components/event-settings-modal/event-settings-modal.component.d.ts +1134 -49
  45. package/dist/lib/components/exit-components/confirm-exit-modal/confirm-exit-modal.component.d.ts +94 -32
  46. package/dist/lib/components/media-settings-components/media-settings-modal/media-settings-modal.component.d.ts +1123 -47
  47. package/dist/lib/components/mediasfu-components/mediasfu-broadcast.component.d.ts +2622 -4793
  48. package/dist/lib/components/mediasfu-components/mediasfu-chat.component.d.ts +602 -4140
  49. package/dist/lib/components/mediasfu-components/mediasfu-conference.component.d.ts +864 -5707
  50. package/dist/lib/components/mediasfu-components/mediasfu-generic.component.d.ts +2087 -6304
  51. package/dist/lib/components/mediasfu-components/mediasfu-webinar.component.d.ts +650 -5707
  52. package/dist/lib/components/menu-components/custom-buttons/custom-buttons.component.d.ts +26 -4
  53. package/dist/lib/components/menu-components/meeting-id-component/meeting-id-component.component.d.ts +80 -1
  54. package/dist/lib/components/menu-components/meeting-passcode-component/meeting-passcode-component.component.d.ts +46 -1
  55. package/dist/lib/components/menu-components/menu-modal/menu-modal.component.d.ts +706 -15
  56. package/dist/lib/components/menu-components/share-buttons-component/share-buttons-component.component.d.ts +49 -2
  57. package/dist/lib/components/message-components/messages-modal/messages-modal.component.d.ts +79 -16
  58. package/dist/lib/components/misc-components/confirm-here-modal/confirm-here-modal.component.d.ts +1113 -17
  59. package/dist/lib/components/misc-components/pre-join-page/pre-join-page.component.d.ts +4 -0
  60. package/dist/lib/components/misc-components/share-event-modal/share-event-modal.component.d.ts +1114 -29
  61. package/dist/lib/components/panelists-components/panelists-modal/panelists-modal.component.d.ts +73 -0
  62. package/dist/lib/components/participants-components/participants-modal/participants-modal.component.d.ts +1084 -6
  63. package/dist/lib/components/permissions-components/permissions-modal/permissions-modal.component.d.ts +89 -0
  64. package/dist/lib/components/polls-components/poll-modal/poll-modal.component.d.ts +1060 -21
  65. package/dist/lib/components/recording-components/recording-modal/recording-modal.component.d.ts +1055 -35
  66. package/dist/lib/components/requests-components/requests-modal/requests-modal.component.d.ts +1117 -45
  67. package/dist/lib/components/screenboard-components/screenboard-modal/screenboard-modal.component.d.ts +1059 -47
  68. package/dist/lib/components/translation-components/translation-settings-modal/translation-settings-modal.component.d.ts +124 -0
  69. package/dist/lib/components/waiting-components/waiting-room-modal.component.d.ts +1119 -46
  70. package/dist/lib/components/whiteboard-components/configure-whiteboard-modal/configure-whiteboard-modal.component.d.ts +2117 -22
  71. package/dist/lib/components/whiteboard-components/whiteboard/whiteboard.component.d.ts +3 -15
  72. package/dist/lib/consumers/add-videos-grid.service.d.ts +3 -0
  73. package/dist/lib/consumers/auto-adjust.service.d.ts +0 -11
  74. package/dist/lib/consumers/calculate-rows-and-columns.service.d.ts +0 -7
  75. package/dist/lib/consumers/change-vids.service.d.ts +1 -1
  76. package/dist/lib/consumers/check-permission.service.d.ts +4 -1
  77. package/dist/lib/consumers/check-screen-share.service.d.ts +0 -18
  78. package/dist/lib/consumers/compare-active-names.service.d.ts +0 -16
  79. package/dist/lib/consumers/compare-screen-states.service.d.ts +0 -18
  80. package/dist/lib/consumers/connect-ips.service.d.ts +5 -26
  81. package/dist/lib/consumers/connect-local-ips.service.d.ts +1 -28
  82. package/dist/lib/consumers/connect-recv-transport.service.d.ts +4 -1
  83. package/dist/lib/consumers/connect-send-transport-audio.service.d.ts +5 -1
  84. package/dist/lib/consumers/connect-send-transport-screen.service.d.ts +6 -1
  85. package/dist/lib/consumers/connect-send-transport-video.service.d.ts +6 -1
  86. package/dist/lib/consumers/connect-send-transport.service.d.ts +3 -1
  87. package/dist/lib/consumers/consumer-resume.service.d.ts +2 -1
  88. package/dist/lib/consumers/create-send-transport.service.d.ts +4 -1
  89. package/dist/lib/consumers/disconnect-send-transport-audio.service.d.ts +3 -1
  90. package/dist/lib/consumers/disconnect-send-transport-screen.service.d.ts +3 -1
  91. package/dist/lib/consumers/disconnect-send-transport-video.service.d.ts +3 -1
  92. package/dist/lib/consumers/disp-streams.service.d.ts +1 -110
  93. package/dist/lib/consumers/generate-page-content.service.d.ts +0 -17
  94. package/dist/lib/consumers/get-estimate.service.d.ts +0 -21
  95. package/dist/lib/consumers/mix-streams.service.d.ts +0 -19
  96. package/dist/lib/consumers/on-screen-changes.service.d.ts +1 -21
  97. package/dist/lib/consumers/prepopulate-user-media.service.d.ts +3 -0
  98. package/dist/lib/consumers/process-consumer-transports-audio.service.d.ts +1 -14
  99. package/dist/lib/consumers/process-consumer-transports.service.d.ts +3 -57
  100. package/dist/lib/consumers/re-update-inter.service.d.ts +1 -39
  101. package/dist/lib/consumers/reorder-streams.service.d.ts +1 -35
  102. package/dist/lib/consumers/resume-send-transport-audio.service.d.ts +3 -1
  103. package/dist/lib/consumers/signal-new-consumer-transport.service.d.ts +3 -1
  104. package/dist/lib/consumers/socket-receive-methods/join-consume-room.service.d.ts +5 -14
  105. package/dist/lib/consumers/socket-receive-methods/new-pipe-producer.service.d.ts +4 -14
  106. package/dist/lib/consumers/socket-receive-methods/producer-closed.service.d.ts +1 -8
  107. package/dist/lib/consumers/stream-success-audio-switch.service.d.ts +5 -1
  108. package/dist/lib/consumers/stream-success-audio.service.d.ts +3 -1
  109. package/dist/lib/consumers/stream-success-video.service.d.ts +5 -1
  110. package/dist/lib/consumers/translation-consumer-switch.service.d.ts +68 -0
  111. package/dist/lib/consumers/trigger.service.d.ts +0 -79
  112. package/dist/lib/consumers/update-mini-cards-grid.service.d.ts +0 -24
  113. package/dist/lib/directives/with-override.directive.d.ts +76 -0
  114. package/dist/lib/methods/background-methods/launch-background.service.d.ts +2 -5
  115. package/dist/lib/methods/breakout-room-methods/launch-breakout-rooms.service.d.ts +2 -5
  116. package/dist/lib/methods/co-host-methods/launch-co-host.service.d.ts +2 -5
  117. package/dist/lib/methods/co-host-methods/modify-co-host-settings.service.d.ts +1 -1
  118. package/dist/lib/methods/display-settings-methods/launch-display-settings.service.d.ts +2 -5
  119. package/dist/lib/methods/display-settings-methods/modify-display-settings.service.d.ts +2 -0
  120. package/dist/lib/methods/exit-methods/launch-confirm-exit.service.d.ts +2 -5
  121. package/dist/lib/methods/menu-methods/launch-menu-modal.service.d.ts +2 -5
  122. package/dist/lib/methods/message-methods/launch-messages.service.d.ts +2 -5
  123. package/dist/lib/methods/panelists-methods/add-panelist.service.d.ts +19 -0
  124. package/dist/lib/methods/panelists-methods/focus-panelists.service.d.ts +19 -0
  125. package/dist/lib/methods/panelists-methods/remove-panelist.service.d.ts +17 -0
  126. package/dist/lib/methods/participants-methods/launch-participants.service.d.ts +2 -5
  127. package/dist/lib/methods/permissions-methods/bulk-update-participant-permissions.service.d.ts +20 -0
  128. package/dist/lib/methods/permissions-methods/update-participant-permission.service.d.ts +19 -0
  129. package/dist/lib/methods/permissions-methods/update-permission-config.service.d.ts +29 -0
  130. package/dist/lib/methods/polls-methods/handle-create-poll.service.d.ts +1 -1
  131. package/dist/lib/methods/polls-methods/handle-end-poll.service.d.ts +1 -1
  132. package/dist/lib/methods/polls-methods/handle-vote-poll.service.d.ts +1 -1
  133. package/dist/lib/methods/polls-methods/poll-updated.service.d.ts +1 -1
  134. package/dist/lib/methods/recording-methods/check-pause-state.service.d.ts +1 -12
  135. package/dist/lib/methods/recording-methods/check-resume-state.service.d.ts +1 -11
  136. package/dist/lib/methods/recording-methods/confirm-recording.service.d.ts +0 -94
  137. package/dist/lib/methods/recording-methods/launch-recording.service.d.ts +1 -20
  138. package/dist/lib/methods/recording-methods/record-pause-timer.service.d.ts +1 -12
  139. package/dist/lib/methods/recording-methods/record-resume-timer.service.d.ts +0 -66
  140. package/dist/lib/methods/recording-methods/record-start-timer.service.d.ts +1 -33
  141. package/dist/lib/methods/recording-methods/record-update-timer.service.d.ts +1 -17
  142. package/dist/lib/methods/recording-methods/start-recording.service.d.ts +1 -92
  143. package/dist/lib/methods/recording-methods/stop-recording.service.d.ts +1 -42
  144. package/dist/lib/methods/recording-methods/update-recording.service.d.ts +1 -94
  145. package/dist/lib/methods/requests-methods/launch-requests.service.d.ts +2 -5
  146. package/dist/lib/methods/settings-methods/launch-settings.service.d.ts +2 -5
  147. package/dist/lib/methods/settings-methods/modify-settings.service.d.ts +1 -1
  148. package/dist/lib/methods/stream-methods/click-chat.service.d.ts +1 -1
  149. package/dist/lib/methods/utils/get-modal-position.util.d.ts +0 -3
  150. package/dist/lib/methods/utils/initial-values.util.d.ts +25 -3
  151. package/dist/lib/methods/utils/mini-audio-player/mini-audio-player.component.d.ts +11 -1
  152. package/dist/lib/methods/utils/producer/a-params.service.d.ts +2 -5
  153. package/dist/lib/methods/utils/producer/h-params.service.d.ts +2 -5
  154. package/dist/lib/methods/utils/producer/screen-params.service.d.ts +2 -5
  155. package/dist/lib/methods/utils/producer/v-params.service.d.ts +2 -5
  156. package/dist/lib/methods/utils/sound-player.service.d.ts +1 -1
  157. package/dist/lib/methods/utils/translation-languages.util.d.ts +341 -0
  158. package/dist/lib/methods/waiting-methods/launch-waiting.service.d.ts +2 -5
  159. package/dist/lib/methods/whiteboard-methods/capture-canvas-stream.service.d.ts +3 -1
  160. package/dist/lib/modern/display-components/modern-alert.component.d.ts +40 -0
  161. package/dist/lib/modern/display-components/modern-loading-modal.component.d.ts +37 -0
  162. package/dist/lib/modern/display-components/modern-meeting-progress-timer.component.d.ts +40 -0
  163. package/dist/lib/modern/display-components/modern-mini-card.component.d.ts +1064 -0
  164. package/dist/lib/modern/display-components/modern-pagination.component.d.ts +91 -0
  165. package/dist/lib/modern/display-components/modern-participants-counter-badge.component.d.ts +16 -0
  166. package/dist/lib/modern/modal-components/modern-co-host-modal.component.d.ts +63 -0
  167. package/dist/lib/modern/modal-components/modern-confirm-exit-modal.component.d.ts +42 -0
  168. package/dist/lib/modern/modal-components/modern-confirm-here-modal.component.d.ts +39 -0
  169. package/dist/lib/modern/modal-components/modern-display-settings-modal.component.d.ts +59 -0
  170. package/dist/lib/modern/modal-components/modern-event-settings-modal.component.d.ts +80 -0
  171. package/dist/lib/modern/modal-components/modern-media-settings-modal.component.d.ts +72 -0
  172. package/dist/lib/modern/modal-components/modern-menu-modal.component.d.ts +48 -0
  173. package/dist/lib/modern/modal-components/modern-messages-modal.component.d.ts +58 -0
  174. package/dist/lib/modern/modal-components/modern-participants-modal.component.d.ts +49 -0
  175. package/dist/lib/modern/modal-components/modern-poll-modal.component.d.ts +54 -0
  176. package/dist/lib/modern/modal-components/modern-recording-modal.component.d.ts +39 -0
  177. package/dist/lib/modern/modal-components/modern-requests-modal.component.d.ts +61 -0
  178. package/dist/lib/modern/modal-components/modern-share-event-modal.component.d.ts +39 -0
  179. package/dist/lib/modern/modal-components/modern-waiting-room-modal.component.d.ts +55 -0
  180. package/dist/lib/modern/primitives/modern-button.component.d.ts +10 -0
  181. package/dist/lib/modern/primitives/modern-entry-shell.component.d.ts +6 -0
  182. package/dist/lib/modern/primitives/modern-field.component.d.ts +32 -0
  183. package/dist/lib/modern/primitives/modern-sidebar-panel.component.d.ts +24 -0
  184. package/dist/lib/modern/primitives/modern-surface.component.d.ts +7 -0
  185. package/dist/lib/modern/utils/render-mode.utils.d.ts +3 -0
  186. package/dist/lib/producer-client/producer-client-emits/create-device-client.service.d.ts +4 -10
  187. package/dist/lib/producer-client/producer-client-emits/join-room-client.service.d.ts +0 -19
  188. package/dist/lib/producer-client/producer-client-emits/update-room-parameters-client.service.d.ts +8 -63
  189. package/dist/lib/producers/producer-emits/join-con-room.service.d.ts +3 -19
  190. package/dist/lib/producers/producer-emits/join-local-room.service.d.ts +3 -106
  191. package/dist/lib/producers/producer-emits/join-room.service.d.ts +0 -18
  192. package/dist/lib/producers/socket-receive-methods/added-as-panelist.service.d.ts +15 -0
  193. package/dist/lib/producers/socket-receive-methods/all-members-rest.service.d.ts +1 -90
  194. package/dist/lib/producers/socket-receive-methods/all-members.service.d.ts +1 -88
  195. package/dist/lib/producers/socket-receive-methods/control-media-host.service.d.ts +1 -66
  196. package/dist/lib/producers/socket-receive-methods/get-domains.service.d.ts +3 -1
  197. package/dist/lib/producers/socket-receive-methods/meeting-still-there.service.d.ts +1 -1
  198. package/dist/lib/producers/socket-receive-methods/panelist-focus-changed.service.d.ts +25 -0
  199. package/dist/lib/producers/socket-receive-methods/panelists-updated.service.d.ts +19 -0
  200. package/dist/lib/producers/socket-receive-methods/permission-config-updated.service.d.ts +15 -0
  201. package/dist/lib/producers/socket-receive-methods/permission-updated.service.d.ts +17 -0
  202. package/dist/lib/producers/socket-receive-methods/person-joined.service.d.ts +1 -1
  203. package/dist/lib/producers/socket-receive-methods/producer-media-paused.service.d.ts +0 -80
  204. package/dist/lib/producers/socket-receive-methods/producer-media-resumed.service.d.ts +1 -1
  205. package/dist/lib/producers/socket-receive-methods/receive-control-media.service.d.ts +21 -0
  206. package/dist/lib/producers/socket-receive-methods/recording-notice.service.d.ts +1 -5
  207. package/dist/lib/producers/socket-receive-methods/removed-from-panelists.service.d.ts +15 -0
  208. package/dist/lib/producers/socket-receive-methods/room-record-params.service.d.ts +1 -1
  209. package/dist/lib/producers/socket-receive-methods/translation-receive-methods.service.d.ts +20 -0
  210. package/dist/lib/services/live-subtitle.service.d.ts +15 -0
  211. package/dist/lib/services/ui-override-resolver.service.d.ts +91 -0
  212. package/dist/lib/sockets/socket-manager.service.d.ts +1 -2
  213. package/dist/public-api.d.ts +46 -1
  214. package/package.json +106 -95
  215. package/dist/lib/methods/utils/producer/video-capture-constraints.service.d.ts +0 -177
package/README.md CHANGED
@@ -1,3 +1,9 @@
1
+ # MediaSFU Angular SDK · [mediasfu-angular on npm](https://www.npmjs.com/package/mediasfu-angular)
2
+
3
+ **mediasfu-angular** is the Angular 17/18/19 WebRTC SDK for video conferencing, webinars, live streaming, broadcast, screen sharing, whiteboard, chat, recording, live subtitles, translation, and AI agent rooms — powered by MediaSFU Cloud or your self-hosted MediaSFU Open server. Install with `npm install mediasfu-angular`.
4
+
5
+ ---
6
+
1
7
  <p align="center">
2
8
  <img src="https://www.mediasfu.com/logo192.png" width="100" alt="MediaSFU Logo">
3
9
  </p>
@@ -37,50 +43,123 @@
37
43
 
38
44
  ---
39
45
 
40
- ## 🚨 **BREAKING: AI Phone Agents at $0.10 per 1,000 minutes**
46
+ # MediaSFU Angular SDK
41
47
 
42
- 📞 **Call our live AI demos right now:**
43
- - 🇺🇸 **+1 (785) 369-1724** - Mixed Support Demo
44
- - 🇬🇧 **+44 7445 146575** - AI Conversation Demo
45
- - 🇨🇦 **+1 (587) 407-1990** - Technical Support Demo
46
- - 🇨🇦 **+1 (647) 558-6650** - Friendly AI Chat Demo
48
+ **Prebuilt Angular SDK for WebRTC video conferencing, webinars, livestreams, chat, screen sharing, recording, breakout rooms, whiteboards, polls, live subtitles, and translation.**
47
49
 
48
- **Traditional providers charge $0.05 per minute. We charge $0.10 per 1,000 minutes. That's 500x cheaper.**
50
+ MediaSFU Angular is an Angular video conferencing SDK with prebuilt room components for meetings, webinars, livestream-style broadcasts, and chat-first rooms. It gives you production-ready room UI plus the lower-level helpers needed to move from a full prebuilt experience to a deeply customized Angular app without rewriting the media stack.
49
51
 
50
- **Deploy AI phone agents in 30 minutes**
51
- ✅ **Works with ANY SIP provider** (Twilio, Telnyx, Zadarma, etc.)
52
- ✅ **Seamless AI-to-human handoffs**
53
- ✅ **Real-time call analytics & transcription**
52
+ ## Quick Start: First Working Room
54
53
 
55
- 📖 **[Complete SIP/PSTN Documentation →](https://mediasfu.com/telephony)**
54
+ ```bash
55
+ npm install mediasfu-angular
56
+ ```
56
57
 
57
- ---
58
+ ```typescript
59
+ credentials = {
60
+ apiUserName: 'your-user',
61
+ apiKey: 'your-key',
62
+ };
63
+ ```
58
64
 
59
- MediaSFU offers a cutting-edge streaming experience that empowers users to customize their recordings and engage their audience with high-quality streams. Whether you're a content creator, educator, or business professional, MediaSFU provides the tools you need to elevate your streaming game.
65
+ ```html
66
+ <app-mediasfu-generic
67
+ [credentials]="credentials"
68
+ [connectMediaSFU]="true"
69
+ ></app-mediasfu-generic>
70
+ ```
60
71
 
61
- <div style="text-align: center;">
72
+ That is the fastest path to a working Angular video conferencing room. Once the secure create/join path works, layer in branding, overrides, or a fully custom shell.
62
73
 
63
- <img src="https://mediasfu.com/images/header_1.jpg" alt="Preview Page" title="Preview Page" style="max-height: 600px;">
74
+ ## Pick the Right Angular Room Component
64
75
 
65
- </div>
76
+ Use this table to match each Angular room component to the product shape you are building.
66
77
 
67
- ---
78
+ | Component | Best for | What users get | When to choose it |
79
+ | --- | --- | --- | --- |
80
+ | `app-mediasfu-generic` | General meetings, team calls, product defaults | Balanced room layout with the broadest starter path | Start here if you are unsure which room type fits best. |
81
+ | `app-mediasfu-webinar` | Host-led presentations, audience participation, stage-centric events | Webinar-style room flow with participant management and moderation surfaces | Choose this when one or a few presenters lead a larger audience. |
82
+ | `app-mediasfu-broadcast` | Livestream-style shows, creator dashboards, host-first production flows | Broadcast-oriented shell with invite/share and host control emphasis | Choose this when the host workflow matters more than equal participant presence. |
83
+ | `app-mediasfu-chat` | Text-first support rooms, low-bandwidth collaboration, chat-centric experiences | Message-forward room UI with the same create/join/runtime foundation | Choose this when conversation is the product and audio/video are secondary. |
84
+ | `app-mediasfu-conference` | Collaborative multi-speaker events, panels, classes, workshops | Multi-participant conference layout with richer shared-presence expectations | Choose this when many participants are expected to be visibly active. |
85
+
86
+ ## Least Confusing Start Path
87
+
88
+ 1. Start with `app-mediasfu-generic` and validate one successful create/join flow.
89
+ 2. Decide backend mode early: MediaSFU Cloud or self-hosted MediaSFU Open.
90
+ 3. Move to `app-mediasfu-webinar`, `app-mediasfu-broadcast`, or `app-mediasfu-chat` only after the base room flow is working.
91
+ 4. Use `uiOverrides`, custom cards, and `customMainComponent` before going fully headless.
92
+ 5. Switch to `returnUI="false"` only when you already know which MediaSFU runtime helpers your product needs.
93
+
94
+ ## Common Angular Product Shapes
95
+
96
+ Use MediaSFU Angular when you need one of these product patterns:
97
+
98
+ - Angular video meeting UI with secure create/join flow.
99
+ - Angular webinar UI with host, audience, and moderation surfaces.
100
+ - Angular broadcast UI for livestream or creator-style host workflows.
101
+ - Angular chat room UI with MediaSFU room orchestration behind it.
102
+ - Angular collaboration rooms with recording, screen share, whiteboard, polls, captions, and translation in one SDK.
103
+
104
+ ## Why teams use MediaSFU Angular
68
105
 
69
- # MediaSFU Angular Module Documentation
106
+ - **Start fast** with prebuilt room components such as `MediasfuGeneric`, `MediasfuConference`, `MediasfuWebinar`, `MediasfuBroadcast`, and `MediasfuChat`.
107
+ - **Customize progressively** with `uiOverrides`, custom cards, custom layouts, and shared room helper state.
108
+ - **Go headless when needed** by setting `returnUI="false"` and wiring MediaSFU runtime helpers into your own Angular workspace.
109
+ - **Ship collaboration features together**: voice, video, screen share, recording, whiteboard, breakout rooms, chat, polls, and translation in one SDK.
70
110
 
71
- ## Unlock the Power of MediaSFU Community Edition
111
+ ## Choose Your Path
72
112
 
73
- **MediaSFU Community Edition is free and open-source**—perfect for developers who want to run their own media server without upfront costs. With robust features and simple setup, you can launch your media solution in minutes. **Ready to scale?** Upgrade seamlessly to **MediaSFU Cloud** for enterprise-grade performance and global scalability.
113
+ - **Beginner**: install the package, render a prebuilt room, and connect to MediaSFU Cloud or your self-hosted server.
114
+ - **Intermediate**: override cards, modals, and layout surfaces while keeping MediaSFU's room orchestration and transports.
115
+ - **Advanced**: run the runtime headless, consume `sourceParameters`, and build a fully custom Angular UI on top of the same media/session core.
74
116
 
75
- **[Get started now on GitHub!](https://github.com/MediaSFU/MediaSFUOpen)**
117
+ ## Important: Backend Required
76
118
 
77
- ### Angular SDK Setup Guide
78
- Coming soon! Watch this space for our comprehensive video tutorial on setting up the Angular SDK.
119
+ MediaSFU Angular is a frontend SDK. You still need a MediaSFU-compatible backend for signaling, media routing, and room lifecycle.
120
+
121
+ | Option | Best for | Link |
122
+ | --- | --- | --- |
123
+ | **MediaSFU Cloud** | Managed production deployments, faster onboarding, less infrastructure work | [MediaSFU Cloud docs](https://www.mediasfu.com/documentation#rooms) |
124
+ | **MediaSFU Open** | Self-hosting, local control, private infrastructure | [MediaSFU Open](https://github.com/MediaSFU/MediaSFUOpen) |
125
+
126
+ ## Start Here
127
+
128
+ - Want the fastest path to a running room? Jump to [Quick Start](#quick-start-5-minutes).
129
+ - Want copy-paste recipes for different integration levels? Use the [Usage Cookbook](#usage-cookbook) section just below.
130
+ - Want to understand the Angular surface area first? Read [Quick Reference: Component Props & UI Overrides](#quick-reference-component-props--ui-overrides).
131
+ - Want architecture and customization depth? Continue with the [Angular SDK Guide](#angular-sdk-guide).
132
+ - Want self-hosted deployment context? Review [MediaSFU Open](https://github.com/MediaSFU/MediaSFUOpen) alongside this SDK guide.
133
+
134
+ ## Usage Cookbook
135
+
136
+ Need recipe-style Angular guidance instead of reading the full guide front to back? Use this quick picker:
137
+
138
+ | Goal | Recommended setup |
139
+ | --- | --- |
140
+ | Ship the bundled room fast | Render `app-mediasfu-generic` with `credentials` and `connectMediaSFU="true"`. |
141
+ | Use MediaSFU Open | Keep the same component and pass `localLink` to your self-hosted server. |
142
+ | Run the runtime headless | Set `returnUI="false"`, pass `noUIPreJoinOptions`, and capture helpers through `updateSourceParameters`. |
143
+ | Replace the main room shell | Keep MediaSFU's transports and room lifecycle, but pass `customMainComponent`. |
144
+ | Override selected surfaces | Keep the default shell and layer `uiOverrides`, `customVideoCard`, `customAudioCard`, `customMiniCard`, and `containerStyle`. |
145
+
146
+ Source-repo readers can also use the standalone `USAGE_COOKBOOK.md` file for copy-paste examples.
79
147
 
80
148
  ---
81
149
 
82
- ## Table of Contents
150
+ # Angular SDK Guide
151
+
152
+ MediaSFU Community Edition remains available if you want to self-host the backend and keep full infrastructure control. If you want managed infrastructure, use MediaSFU Cloud with the same Angular SDK surface.
153
+
154
+ ---
83
155
 
156
+ ## Table of Contents
157
+ - [Why teams use MediaSFU Angular](#why-teams-use-mediasfu-angular)
158
+ - [Choose Your Path](#choose-your-path)
159
+ - [Important: Backend Required](#important-backend-required)
160
+ - [Start Here](#start-here)
161
+ - [Usage Cookbook](#usage-cookbook)
162
+ - [Quick Reference: Component Props & UI Overrides](#quick-reference-component-props--ui-overrides)
84
163
  - [Features](#features)
85
164
  - [Getting Started](#getting-started)
86
165
  - [📘 Angular SDK Guide](#angular-sdk-guide)
@@ -94,6 +173,341 @@ Coming soon! Watch this space for our comprehensive video tutorial on setting up
94
173
  - [Troubleshooting](#troubleshooting)
95
174
  - [Contributing](#contributing)
96
175
 
176
+
177
+ ---
178
+
179
+ ## Quick Reference: Component Props & UI Overrides
180
+
181
+ > **New:** UI override parity now extends across Webinar and Chat layouts, unifying customization for every MediaSFU interface.
182
+
183
+ Every primary MediaSFU UI export—`MediasfuGeneric`, `MediasfuBroadcast`, `MediasfuConference`, `MediasfuWebinar`, and `MediasfuChat`—now ships with a consistent prop surface and a powerful `uiOverrides` input, so you can bend the bundled experience to match your product without losing MediaSFU's hardened real-time logic.
184
+
185
+ ### Shared component inputs (applies to every MediaSFU UI component)
186
+
187
+ | Input | Type | Default | What it does |
188
+ | --- | --- | --- | --- |
189
+ | `PrejoinPage` | `ComponentType` | `WelcomePage` | Swap in a custom pre-join experience. Receives unified pre-join options so you can add branding, legal copy, or warm-up flows. |
190
+ | `localLink` | `string` | `""` | Point the SDK at your self-hosted MediaSFU server. Leave empty when using MediaSFU Cloud. |
191
+ | `connectMediaSFU` | `boolean` | `true` | Toggle automatic socket/WebRTC connections. Set to `false` when you only need the UI shell. |
192
+ | `credentials` | `{ apiUserName: string; apiKey: string }` | `{ apiUserName: "", apiKey: "" }` | Supply cloud credentials without hard-coding them elsewhere. |
193
+ | `useLocalUIMode` | `boolean` | `false` | Run the interface in local/demo mode with no remote signaling. |
194
+ | `seedData`, `useSeed` | `SeedData`, `boolean` | `{}`, `false` | Pre-populate the UI for demos, snapshot tests, or onboarding tours. |
195
+ | `imgSrc` | `string` | `https://mediasfu.com/images/logo192.png` | Default artwork used across pre-join and modal flows. |
196
+ | `sourceParameters` | `Record<string, unknown>` | `{}` | Shared helper bag (media devices, participant helpers, layout handlers). Pair with `updateSourceParameters` to mirror the SDK's internal utilities. |
197
+ | `updateSourceParameters` | `(data: Record<string, unknown>) => void` | `() => {}` | Receive the latest helper bundle so you can bridge MediaSFU logic into your own components. |
198
+ | `returnUI` | `boolean` | `true` | When `false`, mount the logic only—a perfect stepping stone to a fully bespoke interface. |
199
+ | `noUIPreJoinOptions` | `CreateMediaSFURoomOptions \| JoinMediaSFURoomOptions` | `undefined` | Feed pre-join data when `returnUI` is `false` and you want to bypass the on-screen wizard. |
200
+ | `joinMediaSFURoom`, `createMediaSFURoom` | `Function` | `undefined` | Inject your own networking layers for joining or creating rooms. |
201
+ | `canUsePersonalTranslation`, `personalTranslationUsername` | `boolean`, `string` | `false`, `undefined` | Seed translation-aware entry flows when you want personal translation defaults available at startup. |
202
+ | `customMainComponent` | `ComponentType` | `undefined` | Replace the main UI shell while retaining MediaSFU transports, sockets, and room helpers. |
203
+ | `customVideoCard`, `customAudioCard`, `customMiniCard` | `ComponentType` | `undefined` | Override participant card renders to add metadata, CTAs, or badges. |
204
+ | `[containerStyle]` | `Record<string, any>` | `undefined` | Apply inline styles to the root wrapper (dashboards, split views, etc.). |
205
+ | `[uiOverrides]` | `MediasfuUICustomOverrides` | `undefined` | Targeted component/function overrides described below. |
206
+
207
+ > **Power combo:** Set `returnUI="false"` to run MediaSFU logic headless, capture helpers via `updateSourceParameters` output, and selectively bring UI pieces back with `uiOverrides`. That gives you progressive migration with minimal code churn.
208
+
209
+ ```typescript
210
+ import type { MediasfuUICustomOverrides } from 'mediasfu-angular';
211
+
212
+ const overrides: MediasfuUICustomOverrides = { /* ... */ };
213
+ ```
214
+
215
+ Bring the types into your project to unlock full IntelliSense for every override slot.
216
+
217
+ ### Custom UI Playbook
218
+
219
+ Use a toggle-driven "playbook" component to experiment with MediaSFU's customization layers. Flip a couple of booleans and you can watch the SDK jump between prebuilt layouts, headless logic, or a fully bespoke workspace driven by `customMainComponent`.
220
+
221
+ #### What the playbook demonstrates
222
+
223
+ - **Connection presets**: toggle `connectionScenario` between `cloud`, `hybrid`, or `ce` to swap credentials, local links, and connection modes in one place.
224
+ - **Experience selector**: the `selectedExperience` switch renders `MediasfuGeneric`, `MediasfuBroadcast`, `MediasfuWebinar`, `MediasfuConference`, or `MediasfuChat` without touching the rest of your stack.
225
+ - **UI strategy flags**: booleans like `showPrebuiltUI`, `enableFullCustomUI`, and `enableNoUIPreJoin` demonstrate how to run the MediaSFU logic with or without the bundled UI.
226
+ - **Layered overrides**: toggles enable the custom video/audio/mini cards, drop-in `uiOverrides` for layout and modal surfaces, container styling, and backend proxy helpers.
227
+ - **Custom workspace demo**: a `customMainComponent` receives live MediaSFU helpers so you can build dashboards, CRM surfaces, or any bespoke host interface.
228
+ - **Debug panel & helpers**: optional JSON panel exposes the `updateSourceParameters` payload so you can see exactly what to wire into your own components.
229
+
230
+ #### Try it quickly
231
+
232
+ ```typescript
233
+ @Component({
234
+ selector: 'app-custom-ui-playbook',
235
+ template: `
236
+ <ng-container [ngSwitch]="selectedExperience">
237
+ <app-mediasfu-generic *ngSwitchCase="'generic'"
238
+ [credentials]="currentPreset.credentials"
239
+ [localLink]="currentPreset.localLink"
240
+ [connectMediaSFU]="currentPreset.connectMediaSFU"
241
+ [returnUI]="showPrebuiltUI"
242
+ [uiOverrides]="overrides"
243
+ [containerStyle]="containerStyle">
244
+ </app-mediasfu-generic>
245
+
246
+ <app-mediasfu-broadcast *ngSwitchCase="'broadcast'"
247
+ [credentials]="currentPreset.credentials"
248
+ [localLink]="currentPreset.localLink"
249
+ [connectMediaSFU]="currentPreset.connectMediaSFU"
250
+ [returnUI]="showPrebuiltUI"
251
+ [uiOverrides]="overrides">
252
+ </app-mediasfu-broadcast>
253
+
254
+ <!-- Similar for webinar, conference, chat -->
255
+ </ng-container>
256
+ `
257
+ })
258
+ export class CustomUIPlaybookComponent {
259
+ connectionScenario: 'cloud' | 'hybrid' | 'ce' = 'cloud';
260
+ selectedExperience: 'generic' | 'broadcast' | 'webinar' | 'conference' | 'chat' = 'generic';
261
+ showPrebuiltUI = true;
262
+ enableFullCustomUI = false;
263
+
264
+ connectionPresets = {
265
+ cloud: {
266
+ credentials: { apiUserName: 'demo', apiKey: 'demo' },
267
+ localLink: '',
268
+ connectMediaSFU: true
269
+ },
270
+ hybrid: {
271
+ credentials: { apiUserName: 'demo', apiKey: 'demo' },
272
+ localLink: 'http://localhost:3000',
273
+ connectMediaSFU: true
274
+ },
275
+ ce: {
276
+ credentials: undefined,
277
+ localLink: 'http://localhost:3000',
278
+ connectMediaSFU: false
279
+ },
280
+ };
281
+
282
+ get currentPreset() {
283
+ return this.connectionPresets[this.connectionScenario];
284
+ }
285
+
286
+ overrides: MediasfuUICustomOverrides = {
287
+ mainContainer: this.enableFullCustomUI ? {
288
+ component: CustomMainContainerComponent
289
+ } : undefined,
290
+ };
291
+
292
+ containerStyle = {
293
+ background: 'linear-gradient(135deg, #0f172a, #1e3a8a)',
294
+ minHeight: '100vh'
295
+ };
296
+ }
297
+ ```
298
+
299
+ Toggle the configuration values at the top of the playbook and watch the UI reconfigure instantly. It's the fastest path to understand MediaSFU's override surface before you fold the patterns into your production entrypoint.
300
+
301
+ #### Passing custom props and UI overrides
302
+
303
+ Use the same playbook to validate bespoke cards, override bundles, and fully custom workspaces before you move them into production code:
304
+
305
+ ```typescript
306
+ @Component({
307
+ selector: 'app-advanced-playbook',
308
+ template: `
309
+ <app-mediasfu-generic
310
+ [credentials]="credentials"
311
+ [customVideoCard]="videoCard"
312
+ [customAudioCard]="audioCard"
313
+ [customMiniCard]="miniCard"
314
+ [customMainComponent]="enableFullCustomUI ? customWorkspace : undefined"
315
+ [containerStyle]="containerStyle"
316
+ [uiOverrides]="uiOverrides">
317
+ </app-mediasfu-generic>
318
+ `
319
+ })
320
+ export class AdvancedPlaybookComponent {
321
+ credentials = { apiUserName: 'demo', apiKey: 'demo' };
322
+ enableFullCustomUI = false;
323
+
324
+ // Custom card components with themed styling
325
+ videoCard = VideoCardComponent; // Pass component class
326
+ audioCard = AudioCardComponent;
327
+ miniCard = MiniCardComponent;
328
+ customWorkspace = CustomWorkspaceComponent;
329
+
330
+ containerStyle = {
331
+ background: '#0f172a',
332
+ borderRadius: '32px',
333
+ overflow: 'hidden'
334
+ };
335
+
336
+ uiOverrides: MediasfuUICustomOverrides = {
337
+ mainContainer: {
338
+ component: CustomMainContainerComponent
339
+ },
340
+ menuModal: {
341
+ component: CustomMenuModalComponent
342
+ },
343
+ consumerResume: {
344
+ wrap: (original) => async (params) => {
345
+ const startedAt = performance.now();
346
+ const result = await original(params);
347
+ console.log('consumer_resume', {
348
+ durationMs: performance.now() - startedAt,
349
+ consumerId: params?.consumer?.id,
350
+ });
351
+ return result;
352
+ },
353
+ },
354
+ };
355
+ }
356
+ ```
357
+
358
+ Because the playbook surfaces `updateSourceParameters`, you can also log or snapshot the helper bundle (`getParticipantMedia`, `toggleMenuModal`, `showAlert`, and more) to ensure your custom UI always receives the hooks it expects.
359
+
360
+ ### `uiOverrides` input — override keys at a glance
361
+
362
+ Each key accepts a `CustomComponentOverride<Props>` or `CustomFunctionOverride<Fn>` object with optional `component` and `wrap` fields. You can fully replace the default implementation or wrap it while forwarding props.
363
+
364
+ #### Layout & control surfaces
365
+
366
+ | Key | Default component | Typical use |
367
+ | --- | --- | --- |
368
+ | `mainContainer` | `MainContainerComponent` | Inject theming providers or dashboard layouts. |
369
+ | `mainAspect` | `MainAspectComponent` | Tune how the main region splits space. |
370
+ | `mainScreen` | `MainScreenComponent` | Orchestrate hero video + gallery interplay. |
371
+ | `mainGrid` | `MainGridComponent` | Modify layout or layering of primary participants. |
372
+ | `subAspect` | `SubAspectComponent` | Restyle fixed control strips in webinar/conference modes. |
373
+ | `otherGrid` | `OtherGridComponent` | Change presentation of off-stage attendees. |
374
+ | `flexibleGrid`, `flexibleGridAlt` | `FlexibleGrid` | Implement AI-driven or branded array layouts. |
375
+ | `flexibleVideo` | `FlexibleVideo` | Add captions, watermarks, or overlays to highlighted speakers. |
376
+ | `audioGrid` | `AudioGrid` | Customise audio-only attendee presentation. |
377
+ | `pagination` | `Pagination` | Introduce infinite scroll or auto-cycling carousels. |
378
+ | `controlButtons` | `ControlButtonsComponent` | Rebrand the primary action bar. |
379
+ | `controlButtonsAlt` | `ControlButtonsAltComponent` | Control secondary button clusters. |
380
+ | `controlButtonsTouch` | `ControlButtonsComponentTouch` | Deliver mobile-first controls (used heavily by `MediasfuChat`). |
381
+
382
+ #### Participant cards & widgets
383
+
384
+ | Key | Default component | Typical use |
385
+ | --- | --- | --- |
386
+ | `videoCard` | `VideoCard` | Add host badges, reactions, or CRM overlays. |
387
+ | `audioCard` | `AudioCard` | Swap avatars or expose spoken-language info. |
388
+ | `miniCard` | `MiniCard` | Customize thumbnails in picture-in-picture modes. |
389
+ | `miniAudio` | `MiniAudio` | Re-style the audio-only mini indicators. |
390
+ | `meetingProgressTimer` | `MeetingProgressTimer` | Replace the elapsed-time widget with countdowns or milestones. |
391
+ | `miniAudioPlayer` | `MiniAudioPlayer` | Provide alternative UI for recorded clip playback. |
392
+
393
+ #### Modals, dialogs, and collaboration surfaces
394
+
395
+ | Key | Default component | Typical use |
396
+ | --- | --- | --- |
397
+ | `loadingModal` | `LoadingModal` | Show branded skeletons while connecting. |
398
+ | `alert` | `AlertComponent` | Route alerts through your notification system. |
399
+ | `menuModal` | `MenuModal` | Redesign quick-action trays. |
400
+ | `eventSettingsModal` | `EventSettingsModal` | Extend host tools with your own settings. |
401
+ | `translationSettingsModal` | `TranslationSettingsModal` | Customize spoken-language, subtitle, and listening-preference controls. |
402
+ | `requestsModal` | `RequestsModal` | Build moderation queues tailored to your workflows. |
403
+ | `waitingRoomModal` | `WaitingRoomModal` | Deliver custom waiting-room experiences. |
404
+ | `coHostModal` | `CoHostModal` | Manage co-hosts with bespoke UX. |
405
+ | `mediaSettingsModal` | `MediaSettingsModal` | Embed device tests or instructions. |
406
+ | `participantsModal` | `ParticipantsModal` | Introduce advanced filters, search, or notes. |
407
+ | `messagesModal` | `MessagesModal` | Drop in your full-featured chat module. |
408
+ | `displaySettingsModal` | `DisplaySettingsModal` | Let users pick layouts, themes, or captions. |
409
+ | `confirmExitModal` | `ConfirmExitModal` | Meet compliance wording requirements. |
410
+ | `confirmHereModal` | `ConfirmHereModal` | Customize attendance confirmations for webinars. |
411
+ | `shareEventModal` | `ShareEventModal` | Add referral codes or QR sharing. |
412
+ | `recordingModal` | `RecordingModal` | Tailor recording confirmation flows. |
413
+ | `pollModal` | `PollModal` | Integrate your polling/quiz engine. |
414
+ | `backgroundModal` | `BackgroundModal` | Hook AI background replacement or brand presets. |
415
+ | `breakoutRoomsModal` | `BreakoutRoomsModal` | Implement drag-and-drop or AI room suggestions. |
416
+ | `configureWhiteboardModal` | `ConfigureWhiteboardModal` | Adjust collaboration permissions before launch. |
417
+ | `whiteboard` | `Whiteboard` | Replace with your whiteboard provider. |
418
+ | `screenboard` | `Screenboard` | Modify shared-screen annotation layers. |
419
+ | `screenboardModal` | `ScreenboardModal` | Reimagine how users enable shared annotations. |
420
+
421
+ #### Entry flows & custom renderers
422
+
423
+ | Key | Default component | Typical use |
424
+ | --- | --- | --- |
425
+ | `welcomePage` | `WelcomePage` | Provide a fully branded welcome/marketing splash. |
426
+ | `preJoinPage` | `PreJoinPage` | Override the wizard used before joining live sessions. |
427
+ | `customMenuButtonsRenderer` | `Menu button group renderer` | Supply a bespoke renderer for grouped menu actions without overriding each button one by one. |
428
+
429
+ #### Function overrides
430
+
431
+ | Key | Default function | Typical use |
432
+ | --- | --- | --- |
433
+ | `consumerResume` | `consumerResume` | Wrap errors, capture analytics, or rate-limit consumer resume behavior. |
434
+ | `addVideosGrid` | `addVideosGrid` | Replace participant ordering or layout heuristics on the fly. |
435
+ | `prepopulateUserMedia` | `prepopulateUserMedia` | Customize initial media setup with custom video/audio/mini cards. |
436
+
437
+ > Function overrides support `{ implementation, wrap }`. Provide `implementation` for a full replacement, or `wrap` to intercept the default behavior before/after it runs.
438
+
439
+ ### Example: swap the chat modal and theme the controls
440
+
441
+ ```typescript
442
+ import { Component } from '@angular/core';
443
+ import { MediasfuGeneric } from 'mediasfu-angular';
444
+ import { MyChatModalComponent } from './ui/my-chat-modal.component';
445
+ import { MyControlsComponent } from './ui/my-controls.component';
446
+
447
+ @Component({
448
+ selector: 'app-my-meeting',
449
+ template: `
450
+ <app-mediasfu-generic
451
+ [credentials]="credentials"
452
+ [uiOverrides]="uiOverrides">
453
+ </app-mediasfu-generic>
454
+ `
455
+ })
456
+ export class MyMeetingComponent {
457
+ credentials = { apiUserName: 'your-api-user', apiKey: 'your-api-key' };
458
+
459
+ uiOverrides = {
460
+ messagesModal: {
461
+ component: MyChatModalComponent,
462
+ },
463
+ controlButtons: {
464
+ component: MyControlsComponent,
465
+ },
466
+ };
467
+ }
468
+ ```
469
+
470
+ ### Example: wrap a MediaSFU helper instead of replacing it
471
+
472
+ ```typescript
473
+ import { Component } from '@angular/core';
474
+ import { MediasfuConference } from 'mediasfu-angular';
475
+
476
+ @Component({
477
+ selector: 'app-analytics-meeting',
478
+ template: `
479
+ <app-mediasfu-conference
480
+ [credentials]="credentials"
481
+ [uiOverrides]="uiOverrides">
482
+ </app-mediasfu-conference>
483
+ `
484
+ })
485
+ export class AnalyticsMeetingComponent {
486
+ credentials = { apiUserName: 'your-api-user', apiKey: 'your-api-key' };
487
+
488
+ uiOverrides = {
489
+ consumerResume: {
490
+ wrap: (original) => async (params) => {
491
+ const startedAt = performance.now();
492
+ const result = await original(params);
493
+
494
+ // Send analytics
495
+ this.analytics.track('consumer_resume', {
496
+ durationMs: performance.now() - startedAt,
497
+ consumerId: params?.consumer?.id,
498
+ });
499
+
500
+ return result;
501
+ },
502
+ },
503
+ };
504
+
505
+ constructor(private analytics: AnalyticsService) {}
506
+ }
507
+ ```
508
+
509
+ ---
510
+
97
511
  # Features <a name="features"></a>
98
512
 
99
513
  MediaSFU's Angular SDK comes with a host of powerful features out of the box:
@@ -193,12 +607,15 @@ Instructions on how to install the module using npm.
193
607
  ### 1. **Add the package to your project**
194
608
 
195
609
  ```bash
196
- npm install mediasfu-angular
610
+ npm install mediasfu-angular bootstrap ngx-cookie-service socket.io-client mediasoup-client @fortawesome/angular-fontawesome @fortawesome/fontawesome-svg-core @fortawesome/free-solid-svg-icons @fortawesome/free-brands-svg-icons
611
+
612
+ # Optional but recommended for virtual backgrounds and scanner-based flows
613
+ npm install @mediapipe/selfie_segmentation @zxing/ngx-scanner
197
614
  ```
198
615
 
199
616
  ### 2. **Bootstrap Integration**
200
617
 
201
- The `mediasfu-angular` package requires Bootstrap for styling. Bootstrap is included by default with the package, so you do not need to install it separately. Ensure that Bootstrap's CSS is correctly added to your project's styles.
618
+ The `mediasfu-angular` package expects Bootstrap as a peer dependency. If your Angular app does not already ship with Bootstrap, install it and ensure Bootstrap's CSS is added to your project's styles.
202
619
 
203
620
  1. **Check `angular.json`:**
204
621
 
@@ -224,12 +641,12 @@ Instructions on how to install the module using npm.
224
641
  }
225
642
  ```
226
643
 
227
- **Note:** The `mediasfu-angular` package should handle the Bootstrap's package installation automatically. If it's not present, you may need to add it manually install Bootstrap.
644
+ **Note:** `mediasfu-angular` does not bundle Bootstrap for you. Keep the CSS import explicit so your app and the SDK agree on styling.
228
645
 
229
646
 
230
647
  ### 3. **Configure MediaSFU's PreJoinPage Requirements**
231
648
 
232
- If you intend to use MediaSFU's `PreJoinPage` component, additional configuration is required. You need to provide the `HttpClient` and `CookieService` providers in your application's configuration. These packages should have been installed by default as well else add manually.
649
+ If you intend to use MediaSFU's `PreJoinPage` component, additional configuration is required. Provide `HttpClient` and `CookieService` in your application's configuration, and make sure `ngx-cookie-service` is installed in your Angular app.
233
650
 
234
651
  #### Update `app.config.ts`
235
652
 
@@ -412,7 +829,7 @@ import {
412
829
 
413
830
  MediaSFU offers three progressive levels of customization:
414
831
 
415
- ##### Mode 1: Default UI (Simplest)
832
+ ##### Mode 1: Default UI (Beginner / Fastest Path)
416
833
  Use MediaSFU's complete pre-built interface - perfect for rapid development.
417
834
 
418
835
  ```typescript
@@ -435,7 +852,7 @@ export class AppComponent {
435
852
  - ✅ Need a production-ready UI quickly
436
853
  - ✅ Standard video conferencing features are sufficient
437
854
 
438
- ##### Mode 2: Custom UI with MediaSFU Backend (Most Flexible)
855
+ ##### Mode 2: Headless Runtime + Custom UI (Intermediate)
439
856
  Build your own UI while using MediaSFU's powerful backend infrastructure.
440
857
 
441
858
  ```typescript
@@ -505,13 +922,14 @@ export class AppComponent implements OnInit {
505
922
  - ✅ Building a custom branded experience
506
923
  - ✅ Integrating into existing app design
507
924
 
508
- ##### Mode 3: Component Replacement (Balanced)
925
+ ##### Mode 3: Custom Main Shell (Advanced)
509
926
  Replace specific MediaSFU components while keeping the rest of the infrastructure.
510
927
 
511
928
  ```typescript
512
929
  import { Component } from '@angular/core';
513
930
  import {
514
931
  MediasfuGeneric,
932
+ PreJoinPage,
515
933
  FlexibleVideo,
516
934
  FlexibleGrid
517
935
  } from 'mediasfu-angular';
@@ -579,7 +997,7 @@ export class CustomMainComponent {
579
997
  <app-mediasfu-generic
580
998
  [credentials]="credentials"
581
999
  [PrejoinPage]="PreJoinPage"
582
- [customComponent]="CustomMainComponent">
1000
+ [customMainComponent]="CustomMainComponent">
583
1001
  </app-mediasfu-generic>
584
1002
  `,
585
1003
  })
@@ -635,11 +1053,11 @@ The `sourceParameters` object (or `parameters` in custom components) is your gat
635
1053
  // In Mode 2 (Custom UI): Access via sourceParameters
636
1054
  sourceParameters?.clickVideo({ parameters: sourceParameters });
637
1055
 
638
- // In Mode 3 (Component Replacement): Passed to your custom component
1056
+ // In Mode 3 (Custom Main Shell): Passed to your custom main component
639
1057
  @Component({
640
1058
  template: `<button (click)="toggleVideo()">Toggle</button>`
641
1059
  })
642
- export class CustomComponent {
1060
+ export class CustomRoomShellComponent {
643
1061
  @Input() parameters: any;
644
1062
 
645
1063
  toggleVideo() {
@@ -1986,7 +2404,7 @@ export type PreJoinPageType = (options: PreJoinPageOptions) => HTMLElement;
1986
2404
  })
1987
2405
  export class PreJoinPage implements OnInit {
1988
2406
  @Input() parameters: PreJoinPageParameters = {} as PreJoinPageParameters;
1989
- @Input() credentials: Credentials = { apiUserName: 'yourAPIUSERNAME', apiKey: 'yourAPIKEY' };
2407
+ @Input() credentials: Credentials = { apiUserName: '', apiKey: '' };
1990
2408
  @Input() localLink: string | undefined = "";
1991
2409
  @Input() connectMediaSFU: boolean | undefined = true;
1992
2410
  @Input() returnUI?: boolean;
@@ -2940,7 +3358,7 @@ export default AppComponent;
2940
3358
  * return res.status(401).json({ error: "Invalid or expired credentials" });
2941
3359
  * }
2942
3360
  *
2943
- * const response = await fetch("https://mediasfu.com/v1/rooms", {
3361
+ * const response = await fetch("https://mediasfu.com/v1/rooms/", {
2944
3362
  * method: "POST",
2945
3363
  * headers: {
2946
3364
  * "Content-Type": "application/json",
@@ -3029,7 +3447,7 @@ export default AppComponent;
3029
3447
  * localLink = '',
3030
3448
  * }) => {
3031
3449
  * try {
3032
- * let finalLink = 'https://mediasfu.com/v1/rooms/join';
3450
+ * let finalLink = 'https://mediasfu.com/v1/rooms/';
3033
3451
  *
3034
3452
  * // Update finalLink if using a local server
3035
3453
  * if (localLink) {
@@ -4002,6 +4420,504 @@ Once your custom components are built, modify the imports of `prepopulateUserMed
4002
4420
  This allows for full flexibility in how media is displayed in both the main and mini grids, giving you the ability to tailor the user experience to your specific needs.
4003
4421
 
4004
4422
 
4423
+
4424
+ ---
4425
+
4426
+ ## UI Component Customization & Override System
4427
+
4428
+ MediaSFU provides comprehensive customization capabilities for all UI components through a powerful override system. You can customize styling, inject custom templates, or completely replace components with your own implementations.
4429
+
4430
+ ### Overview
4431
+
4432
+ The customization system operates at three levels:
4433
+
4434
+ 1. **Style Overrides**: Apply custom CSS styles to containers, overlays, and content areas
4435
+ 2. **Template Injection**: Replace default component templates with custom Angular templates
4436
+ 3. **Component Replacement**: Completely replace MediaSFU components with your own using the `WithOverrideDirective`
4437
+
4438
+ ### 1. Style Customization
4439
+
4440
+ All display and modal components support style customization through Input properties:
4441
+
4442
+ #### Display Components (MainContainer, MainAspect, MainScreen, MainGrid, OtherGrid, SubAspect, FlexibleGrid, AudioGrid)
4443
+
4444
+ ```typescript
4445
+ @Component({
4446
+ selector: 'app-my-meeting',
4447
+ template: `
4448
+ <app-main-container
4449
+ [containerStyle]="{
4450
+ backgroundColor: '#1a1a1a',
4451
+ border: '2px solid #333',
4452
+ borderRadius: '12px',
4453
+ padding: '20px'
4454
+ }"
4455
+ [backgroundColor]="'transparent'">
4456
+ </app-main-container>
4457
+
4458
+ <app-flexible-grid
4459
+ [containerStyle]="{
4460
+ display: 'grid',
4461
+ gridTemplateColumns: 'repeat(3, 1fr)',
4462
+ gap: '16px'
4463
+ }">
4464
+ </app-flexible-grid>
4465
+ `
4466
+ })
4467
+ export class MyMeetingComponent {
4468
+ // Custom styles can also be dynamic
4469
+ mainGridStyle: Partial<CSSStyleDeclaration> = {
4470
+ backgroundColor: '#2a2a2a',
4471
+ maxWidth: '1400px',
4472
+ margin: '0 auto'
4473
+ };
4474
+ }
4475
+ ```
4476
+
4477
+ #### Modal Components (All modals support overlayStyle, contentStyle)
4478
+
4479
+ ```typescript
4480
+ @Component({
4481
+ selector: 'app-custom-modal-example',
4482
+ template: `
4483
+ <!-- Participants Modal with custom styling -->
4484
+ <app-participants-modal
4485
+ [isParticipantsModalVisible]="true"
4486
+ [overlayStyle]="{
4487
+ backgroundColor: 'rgba(0, 0, 0, 0.85)',
4488
+ backdropFilter: 'blur(8px)'
4489
+ }"
4490
+ [contentStyle]="{
4491
+ backgroundColor: '#ffffff',
4492
+ borderRadius: '16px',
4493
+ boxShadow: '0 8px 32px rgba(0, 0, 0, 0.3)',
4494
+ maxWidth: '600px',
4495
+ padding: '24px'
4496
+ }">
4497
+ </app-participants-modal>
4498
+
4499
+ <!-- Recording Modal with custom theme -->
4500
+ <app-recording-modal
4501
+ [isRecordingModalVisible]="true"
4502
+ [contentStyle]="{
4503
+ backgroundColor: '#f5f5f5',
4504
+ border: '3px solid #007bff',
4505
+ fontFamily: 'Inter, sans-serif'
4506
+ }">
4507
+ </app-recording-modal>
4508
+ `
4509
+ })
4510
+ export class CustomModalExample {
4511
+ // Styles can be computed or conditional
4512
+ get modalOverlay(): Partial<CSSStyleDeclaration> {
4513
+ return {
4514
+ backgroundColor: this.isDarkMode ? 'rgba(0,0,0,0.9)' : 'rgba(0,0,0,0.5)'
4515
+ };
4516
+ }
4517
+ }
4518
+ ```
4519
+
4520
+ ### 2. Template Injection
4521
+
4522
+ Replace default component templates with custom Angular templates using `TemplateRef`:
4523
+
4524
+ ```typescript
4525
+ import { Component, TemplateRef, ViewChild } from '@angular/core';
4526
+
4527
+ @Component({
4528
+ selector: 'app-custom-template-demo',
4529
+ template: `
4530
+ <!-- Define custom template -->
4531
+ <ng-template #customMainGridTemplate let-components="components">
4532
+ <div class="my-custom-grid">
4533
+ <div class="grid-header">
4534
+ <h3>Active Participants</h3>
4535
+ <span class="count">{{ components?.length || 0 }}</span>
4536
+ </div>
4537
+ <div class="grid-content">
4538
+ <!-- Custom rendering logic -->
4539
+ <div *ngFor="let component of components" class="participant-tile">
4540
+ <ng-container *ngComponentOutlet="component"></ng-container>
4541
+ </div>
4542
+ </div>
4543
+ </div>
4544
+ </ng-template>
4545
+
4546
+ <!-- Use custom template -->
4547
+ <app-main-grid
4548
+ [customTemplate]="customMainGridTemplate"
4549
+ [mainGridStream]="streams">
4550
+ </app-main-grid>
4551
+
4552
+ <!-- Custom modal template -->
4553
+ <ng-template #customAlertTemplate let-message="message" let-type="type">
4554
+ <div class="custom-alert" [class.error]="type === 'error'">
4555
+ <i class="alert-icon"></i>
4556
+ <p>{{ message }}</p>
4557
+ <button (click)="closeAlert()">Dismiss</button>
4558
+ </div>
4559
+ </ng-template>
4560
+
4561
+ <app-alert-component
4562
+ [customTemplate]="customAlertTemplate"
4563
+ [visible]="showAlert"
4564
+ [message]="alertMessage">
4565
+ </app-alert-component>
4566
+ `,
4567
+ styles: [`
4568
+ .my-custom-grid {
4569
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
4570
+ border-radius: 12px;
4571
+ padding: 20px;
4572
+ }
4573
+
4574
+ .grid-header {
4575
+ display: flex;
4576
+ justify-content: space-between;
4577
+ color: white;
4578
+ margin-bottom: 16px;
4579
+ }
4580
+
4581
+ .participant-tile {
4582
+ background: rgba(255, 255, 255, 0.1);
4583
+ border-radius: 8px;
4584
+ padding: 12px;
4585
+ margin: 8px 0;
4586
+ }
4587
+ `]
4588
+ })
4589
+ export class CustomTemplateDemo {
4590
+ @ViewChild('customMainGridTemplate') customMainGridTemplate!: TemplateRef<any>;
4591
+ @ViewChild('customAlertTemplate') customAlertTemplate!: TemplateRef<any>;
4592
+
4593
+ streams: any[] = [];
4594
+ showAlert = false;
4595
+ alertMessage = '';
4596
+
4597
+ closeAlert() {
4598
+ this.showAlert = false;
4599
+ }
4600
+ }
4601
+ ```
4602
+
4603
+ ### 3. Component Replacement with UI Overrides
4604
+
4605
+ Use the `uiOverrides` system to completely replace MediaSFU components with your own:
4606
+
4607
+ ```typescript
4608
+ import { Component, Type } from '@angular/core';
4609
+ import { MediasfuUICustomOverrides } from 'mediasfu-angular';
4610
+
4611
+ // Your custom replacement components
4612
+ @Component({
4613
+ selector: 'app-my-custom-video-card',
4614
+ template: `
4615
+ <div class="premium-video-card">
4616
+ <video [srcObject]="videoStream" autoplay></video>
4617
+ <div class="overlay">
4618
+ <span class="name">{{ participant.name }}</span>
4619
+ <button class="pin-btn" (click)="togglePin()">📌</button>
4620
+ </div>
4621
+ </div>
4622
+ `,
4623
+ styles: [`
4624
+ .premium-video-card {
4625
+ position: relative;
4626
+ border-radius: 16px;
4627
+ overflow: hidden;
4628
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
4629
+ }
4630
+ .overlay {
4631
+ position: absolute;
4632
+ bottom: 0;
4633
+ left: 0;
4634
+ right: 0;
4635
+ background: linear-gradient(transparent, rgba(0,0,0,0.8));
4636
+ padding: 12px;
4637
+ display: flex;
4638
+ justify-content: space-between;
4639
+ align-items: center;
4640
+ }
4641
+ `]
4642
+ })
4643
+ export class MyCustomVideoCard {
4644
+ // Your custom implementation
4645
+ }
4646
+
4647
+ @Component({
4648
+ selector: 'app-my-custom-control-buttons',
4649
+ template: `
4650
+ <div class="modern-controls">
4651
+ <button class="control-btn mic" [class.active]="!isMuted" (click)="toggleMic()">
4652
+ <i class="icon-mic"></i>
4653
+ </button>
4654
+ <button class="control-btn camera" [class.active]="!isVideoOff" (click)="toggleVideo()">
4655
+ <i class="icon-camera"></i>
4656
+ </button>
4657
+ <button class="control-btn screen" (click)="toggleScreen()">
4658
+ <i class="icon-screen"></i>
4659
+ </button>
4660
+ <button class="control-btn leave danger" (click)="leaveMeeting()">
4661
+ <i class="icon-leave"></i>
4662
+ </button>
4663
+ </div>
4664
+ `,
4665
+ styles: [`
4666
+ .modern-controls {
4667
+ display: flex;
4668
+ gap: 12px;
4669
+ padding: 16px;
4670
+ background: rgba(0, 0, 0, 0.8);
4671
+ border-radius: 24px;
4672
+ }
4673
+ .control-btn {
4674
+ width: 48px;
4675
+ height: 48px;
4676
+ border-radius: 50%;
4677
+ border: none;
4678
+ cursor: pointer;
4679
+ transition: all 0.2s;
4680
+ }
4681
+ .control-btn.active {
4682
+ background: #4CAF50;
4683
+ color: white;
4684
+ }
4685
+ .control-btn.danger {
4686
+ background: #f44336;
4687
+ color: white;
4688
+ }
4689
+ `]
4690
+ })
4691
+ export class MyCustomControlButtons {
4692
+ // Your custom implementation
4693
+ }
4694
+
4695
+ @Component({
4696
+ selector: 'app-meeting-room',
4697
+ template: `
4698
+ <app-mediasfu-generic
4699
+ [credentials]="credentials"
4700
+ [uiOverrides]="customUIOverrides"
4701
+ [returnUI]="false">
4702
+ </app-mediasfu-generic>
4703
+ `
4704
+ })
4705
+ export class MeetingRoomComponent {
4706
+ credentials = { apiUserName: 'user', apiKey: 'key' };
4707
+
4708
+ // Define your UI overrides
4709
+ customUIOverrides: Partial<MediasfuUICustomOverrides> = {
4710
+ // Replace video cards
4711
+ VideoCard: MyCustomVideoCard as Type<any>,
4712
+
4713
+ // Replace control buttons
4714
+ ControlButtonsComponent: MyCustomControlButtons as Type<any>,
4715
+
4716
+ // Replace modals
4717
+ ParticipantsModal: MyCustomParticipantsModal as Type<any>,
4718
+
4719
+ // Replace other display components
4720
+ MainGrid: MyCustomMainGrid as Type<any>,
4721
+ FlexibleGrid: MyCustomFlexibleGrid as Type<any>,
4722
+
4723
+ // ... any other components you want to replace
4724
+ };
4725
+ }
4726
+ ```
4727
+
4728
+ ### 4. Using WithOverrideDirective
4729
+
4730
+ The `*appWithOverride` directive enables conditional component replacement:
4731
+
4732
+ ```typescript
4733
+ import { Component } from '@angular/core';
4734
+ import { WithOverrideDirective } from 'mediasfu-angular';
4735
+
4736
+ @Component({
4737
+ selector: 'app-conditional-override',
4738
+ imports: [WithOverrideDirective, /* other imports */],
4739
+ template: `
4740
+ <!-- Use default or custom component based on condition -->
4741
+ <app-video-card
4742
+ *appWithOverride="useCustomCard ? MyCustomVideoCard : null"
4743
+ [participant]="currentParticipant">
4744
+ </app-video-card>
4745
+
4746
+ <!-- Override with custom component when premium feature enabled -->
4747
+ <app-control-buttons
4748
+ *appWithOverride="isPremiumUser ? PremiumControlButtons : null">
4749
+ </app-control-buttons>
4750
+ `
4751
+ })
4752
+ export class ConditionalOverrideComponent {
4753
+ useCustomCard = false;
4754
+ isPremiumUser = false;
4755
+
4756
+ MyCustomVideoCard = MyCustomVideoCard;
4757
+ PremiumControlButtons = PremiumControlButtons;
4758
+ }
4759
+ ```
4760
+
4761
+ ### 5. Complete Example: Themed Meeting Room
4762
+
4763
+ Here's a comprehensive example combining all customization approaches:
4764
+
4765
+ ```typescript
4766
+ import { Component, TemplateRef, ViewChild, Type } from '@angular/core';
4767
+ import { MediasfuUICustomOverrides } from 'mediasfu-angular';
4768
+
4769
+ @Component({
4770
+ selector: 'app-themed-meeting-room',
4771
+ template: `
4772
+ <!-- Custom alert template -->
4773
+ <ng-template #brandedAlertTemplate let-message="message">
4774
+ <div class="branded-alert">
4775
+ <img src="/assets/logo.png" alt="Logo" class="alert-logo">
4776
+ <p>{{ message }}</p>
4777
+ </div>
4778
+ </ng-template>
4779
+
4780
+ <app-mediasfu-conference
4781
+ [credentials]="credentials"
4782
+ [returnUI]="true"
4783
+ [uiOverrides]="themeOverrides"
4784
+ [containerStyle]="meetingContainerStyle">
4785
+
4786
+ <!-- Customize individual components -->
4787
+ <app-main-grid
4788
+ [containerStyle]="gridStyle"
4789
+ [customTemplate]="customGridTemplate">
4790
+ </app-main-grid>
4791
+
4792
+ <app-control-buttons-component
4793
+ [containerStyle]="controlsStyle">
4794
+ </app-control-buttons-component>
4795
+
4796
+ <app-participants-modal
4797
+ [overlayStyle]="modalOverlayStyle"
4798
+ [contentStyle]="modalContentStyle">
4799
+ </app-participants-modal>
4800
+
4801
+ <app-alert-component
4802
+ [customTemplate]="brandedAlertTemplate">
4803
+ </app-alert-component>
4804
+ </app-mediasfu-conference>
4805
+ `,
4806
+ styles: [`
4807
+ .branded-alert {
4808
+ display: flex;
4809
+ align-items: center;
4810
+ gap: 12px;
4811
+ padding: 16px;
4812
+ background: white;
4813
+ border-left: 4px solid #007bff;
4814
+ }
4815
+ `]
4816
+ })
4817
+ export class ThemedMeetingRoomComponent {
4818
+ @ViewChild('brandedAlertTemplate') brandedAlertTemplate!: TemplateRef<any>;
4819
+
4820
+ credentials = {
4821
+ apiUserName: 'your-api-username',
4822
+ apiKey: 'your-api-key'
4823
+ };
4824
+
4825
+ // Container styling
4826
+ meetingContainerStyle: Partial<CSSStyleDeclaration> = {
4827
+ backgroundColor: '#0f0f0f',
4828
+ fontFamily: 'Inter, system-ui, sans-serif'
4829
+ };
4830
+
4831
+ // Grid styling
4832
+ gridStyle: Partial<CSSStyleDeclaration> = {
4833
+ display: 'grid',
4834
+ gridTemplateColumns: 'repeat(auto-fit, minmax(300px, 1fr))',
4835
+ gap: '16px',
4836
+ padding: '20px'
4837
+ };
4838
+
4839
+ // Controls styling
4840
+ controlsStyle: Partial<CSSStyleDeclaration> = {
4841
+ position: 'fixed',
4842
+ bottom: '24px',
4843
+ left: '50%',
4844
+ transform: 'translateX(-50%)',
4845
+ backgroundColor: 'rgba(0, 0, 0, 0.9)',
4846
+ borderRadius: '32px',
4847
+ padding: '12px 24px'
4848
+ };
4849
+
4850
+ // Modal styling
4851
+ modalOverlayStyle: Partial<CSSStyleDeclaration> = {
4852
+ backgroundColor: 'rgba(0, 0, 0, 0.85)',
4853
+ backdropFilter: 'blur(10px)'
4854
+ };
4855
+
4856
+ modalContentStyle: Partial<CSSStyleDeclaration> = {
4857
+ backgroundColor: '#1a1a1a',
4858
+ color: '#ffffff',
4859
+ borderRadius: '16px',
4860
+ border: '1px solid #333'
4861
+ };
4862
+
4863
+ // Component overrides
4864
+ themeOverrides: Partial<MediasfuUICustomOverrides> = {
4865
+ VideoCard: BrandedVideoCard as Type<any>,
4866
+ ControlButtonsComponent: ModernControls as Type<any>
4867
+ };
4868
+ }
4869
+ ```
4870
+
4871
+ ### Customizable Components Reference
4872
+
4873
+ #### Display Components
4874
+ - `MainContainer` - Main viewport container
4875
+ - `MainAspect` - Aspect ratio container
4876
+ - `MainScreen` - Screen share display
4877
+ - `MainGrid` - Primary participant grid
4878
+ - `OtherGrid` - Secondary participant grid
4879
+ - `SubAspect` - Sub-aspect ratio container
4880
+ - `FlexibleGrid` - Flexible layout grid
4881
+ - `AudioGrid` - Audio-only participants grid
4882
+
4883
+ Each accepts: `containerStyle?: Partial<CSSStyleDeclaration>`, `customTemplate?: TemplateRef<any>`
4884
+
4885
+ #### Modal Components
4886
+ - `LoadingModal` - Loading indicator
4887
+ - `ConfirmExitModal` - Exit confirmation
4888
+ - `ConfirmHereModal` - Presence confirmation
4889
+ - `ShareEventModal` - Event sharing
4890
+ - `AlertComponent` - Alert notifications
4891
+ - `MenuModal` - Main menu
4892
+ - `ParticipantsModal` - Participants list
4893
+ - `RecordingModal` - Recording controls
4894
+ - `RequestsModal` - Media requests
4895
+ - `WaitingRoomModal` - Waiting room management
4896
+ - `CoHostModal` - Co-host management
4897
+ - `DisplaySettingsModal` - Display settings
4898
+ - `EventSettingsModal` - Event settings
4899
+ - `MediaSettingsModal` - Media device settings
4900
+ - `MessagesModal` - Chat messages
4901
+ - `PollModal` - Polls interface
4902
+ - `BackgroundModal` - Background effects
4903
+ - `BreakoutRoomsModal` - Breakout rooms
4904
+ - `ConfigureWhiteboardModal` - Whiteboard settings
4905
+ - `ScreenboardModal` - Screen annotation
4906
+
4907
+ Each accepts: `overlayStyle?: Partial<CSSStyleDeclaration>`, `contentStyle?: Partial<CSSStyleDeclaration>`, `customTemplate?: TemplateRef<any>`
4908
+
4909
+ ### Best Practices
4910
+
4911
+ 1. **Type Safety**: Always use `Partial<CSSStyleDeclaration>` for style properties
4912
+ 2. **Template Context**: Ensure your custom templates accept the correct context variables
4913
+ 3. **Component Lifecycle**: Custom replacement components should implement the same interface as the original
4914
+ 4. **Performance**: Avoid inline style objects in templates; define them in the component class
4915
+ 5. **Responsive Design**: Use CSS Grid and Flexbox for responsive layouts
4916
+ 6. **Accessibility**: Maintain ARIA attributes and keyboard navigation in custom components
4917
+ 7. **Testing**: Test custom components in isolation before integration
4918
+
4919
+ ---
4920
+
4005
4921
  # API Reference <a name="api-reference"></a>
4006
4922
 
4007
4923
  For detailed information on the API methods and usage, please refer to the [MediaSFU API Documentation](https://mediasfu.com/developers).
@@ -4059,14 +4975,28 @@ https://github.com/MediaSFU/MediaSFU-ReactJS/assets/157974639/a6396722-5b2f-4e93
4059
4975
 
4060
4976
  # Contributing <a name="contributing"></a>
4061
4977
 
4062
- We welcome contributions from the community to improve the project! If you'd like to contribute, please check out our [GitHub repository](https://github.com/MediaSFU-Angular) and follow the guidelines outlined in the README.
4978
+ We welcome contributions from the community to improve the project! If you'd like to contribute, please check out our [GitHub repository](https://github.com/MediaSFU/MediaSFU-Angular) and follow the guidelines outlined in the README.
4063
4979
 
4064
4980
  If you encounter any issues or have suggestions for improvement, please feel free to open an issue on GitHub.
4065
4981
 
4066
4982
  We appreciate your interest in contributing to the project!
4067
4983
 
4068
4984
  If you need further assistance or have any questions, feel free to ask!
4069
- ```
4985
+
4986
+ ---
4987
+
4988
+ ## Related SDKs
4989
+
4990
+ | Package | Framework | npm |
4991
+ |---------|-----------|-----|
4992
+ | [mediasfu-reactjs](https://github.com/MediaSFU/MediaSFU-ReactJS) | React 18/19 | [`npm install mediasfu-reactjs`](https://www.npmjs.com/package/mediasfu-reactjs) |
4993
+ | [mediasfu-vue](https://github.com/MediaSFU/MediaSFU-Vue) | Vue 3 | [`npm install mediasfu-vue`](https://www.npmjs.com/package/mediasfu-vue) |
4994
+ | **[mediasfu-angular](https://github.com/MediaSFU/MediaSFU-Angular)** | **Angular 17+** | **this package** |
4995
+ | [mediasfu-shared](https://github.com/MediaSFU/MediaSFU-Shared) | Framework-agnostic | [`npm install mediasfu-shared`](https://www.npmjs.com/package/mediasfu-shared) |
4996
+
4997
+ ## License
4998
+
4999
+ MIT © [MediaSFU](https://www.mediasfu.com)
4070
5000
 
4071
5001
 
4072
5002