@signalwire/web-components 4.0.0-beta.10 → 4.0.0-beta.12

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 (352) hide show
  1. package/README.md +48 -55
  2. package/dist/_virtual/_commonjsHelpers.js +9 -0
  3. package/dist/_virtual/_commonjsHelpers.js.map +1 -0
  4. package/dist/_virtual/prism-python.js +28 -0
  5. package/dist/_virtual/prism-python.js.map +1 -0
  6. package/dist/_virtual/prism-python2.js +5 -0
  7. package/dist/_virtual/prism-python2.js.map +1 -0
  8. package/dist/_virtual/prism-typescript.js +28 -0
  9. package/dist/_virtual/prism-typescript.js.map +1 -0
  10. package/dist/_virtual/prism-typescript2.js +5 -0
  11. package/dist/_virtual/prism-typescript2.js.map +1 -0
  12. package/dist/_virtual/prism.js +28 -0
  13. package/dist/_virtual/prism.js.map +1 -0
  14. package/dist/_virtual/prism2.js +5 -0
  15. package/dist/_virtual/prism2.js.map +1 -0
  16. package/dist/assets/sw_background.webp.js +5 -0
  17. package/dist/assets/sw_background.webp.js.map +1 -0
  18. package/dist/components/UI/DEFAULT_BACKGROUND.d.ts +4 -0
  19. package/dist/components/UI/DEFAULT_BACKGROUND.d.ts.map +1 -0
  20. package/dist/components/UI/DEFAULT_BACKGROUND.js +5 -0
  21. package/dist/components/UI/DEFAULT_BACKGROUND.js.map +1 -0
  22. package/dist/components/UI/controls/sw-ui-control-bar.d.ts +114 -0
  23. package/dist/components/UI/controls/sw-ui-control-bar.d.ts.map +1 -0
  24. package/dist/components/UI/controls/sw-ui-control-bar.js +324 -0
  25. package/dist/components/UI/controls/sw-ui-control-bar.js.map +1 -0
  26. package/dist/components/UI/controls/sw-ui-dialpad.d.ts +67 -0
  27. package/dist/components/UI/controls/sw-ui-dialpad.d.ts.map +1 -0
  28. package/dist/components/UI/controls/sw-ui-dialpad.js +359 -0
  29. package/dist/components/UI/controls/sw-ui-dialpad.js.map +1 -0
  30. package/dist/components/UI/controls/sw-ui-dropup.d.ts +42 -0
  31. package/dist/components/UI/controls/sw-ui-dropup.d.ts.map +1 -0
  32. package/dist/components/UI/controls/sw-ui-dropup.js +137 -0
  33. package/dist/components/UI/controls/sw-ui-dropup.js.map +1 -0
  34. package/dist/components/UI/controls/sw-ui-split-button.d.ts +44 -0
  35. package/dist/components/UI/controls/sw-ui-split-button.d.ts.map +1 -0
  36. package/dist/components/UI/controls/sw-ui-split-button.js +177 -0
  37. package/dist/components/UI/controls/sw-ui-split-button.js.map +1 -0
  38. package/dist/components/UI/icons/backspace.svg.js +10 -0
  39. package/dist/components/UI/icons/backspace.svg.js.map +1 -0
  40. package/dist/components/UI/icons/camera-off.svg.js +8 -0
  41. package/dist/components/UI/icons/camera-off.svg.js.map +1 -0
  42. package/dist/components/UI/icons/camera-on.svg.js +8 -0
  43. package/dist/components/UI/icons/camera-on.svg.js.map +1 -0
  44. package/dist/components/UI/icons/check-circle.svg.js +6 -0
  45. package/dist/components/UI/icons/check-circle.svg.js.map +1 -0
  46. package/dist/components/UI/icons/chevron-up.svg.js +8 -0
  47. package/dist/components/UI/icons/chevron-up.svg.js.map +1 -0
  48. package/dist/components/UI/icons/close.svg.js +6 -0
  49. package/dist/components/UI/icons/close.svg.js.map +1 -0
  50. package/dist/components/UI/icons/copy.svg.js +6 -0
  51. package/dist/components/UI/icons/copy.svg.js.map +1 -0
  52. package/dist/components/UI/icons/download.svg.js +6 -0
  53. package/dist/components/UI/icons/download.svg.js.map +1 -0
  54. package/dist/components/UI/icons/fullscreen-exit.svg.js +8 -0
  55. package/dist/components/UI/icons/fullscreen-exit.svg.js.map +1 -0
  56. package/dist/components/UI/icons/fullscreen.svg.js +8 -0
  57. package/dist/components/UI/icons/fullscreen.svg.js.map +1 -0
  58. package/dist/components/UI/icons/hand-raise.svg.js +6 -0
  59. package/dist/components/UI/icons/hand-raise.svg.js.map +1 -0
  60. package/dist/components/UI/icons/icons.d.ts +31 -0
  61. package/dist/components/UI/icons/icons.d.ts.map +1 -0
  62. package/dist/components/UI/icons/icons.js +60 -0
  63. package/dist/components/UI/icons/icons.js.map +1 -0
  64. package/dist/components/UI/icons/index.d.ts +4 -0
  65. package/dist/components/UI/icons/index.d.ts.map +1 -0
  66. package/dist/components/UI/icons/info-circle.svg.js +6 -0
  67. package/dist/components/UI/icons/info-circle.svg.js.map +1 -0
  68. package/dist/components/UI/icons/mic-off.svg.js +8 -0
  69. package/dist/components/UI/icons/mic-off.svg.js.map +1 -0
  70. package/dist/components/UI/icons/mic-on.svg.js +8 -0
  71. package/dist/components/UI/icons/mic-on.svg.js.map +1 -0
  72. package/dist/components/UI/icons/person.svg.js +8 -0
  73. package/dist/components/UI/icons/person.svg.js.map +1 -0
  74. package/dist/components/UI/icons/phone-call.svg.js +8 -0
  75. package/dist/components/UI/icons/phone-call.svg.js.map +1 -0
  76. package/dist/components/UI/icons/phone-end.svg.js +8 -0
  77. package/dist/components/UI/icons/phone-end.svg.js.map +1 -0
  78. package/dist/components/UI/icons/room.svg.js +8 -0
  79. package/dist/components/UI/icons/room.svg.js.map +1 -0
  80. package/dist/components/UI/icons/screen-share-off.svg.js +9 -0
  81. package/dist/components/UI/icons/screen-share-off.svg.js.map +1 -0
  82. package/dist/components/UI/icons/screen-share.svg.js +9 -0
  83. package/dist/components/UI/icons/screen-share.svg.js.map +1 -0
  84. package/dist/components/UI/icons/sendIcon.svg.js +9 -0
  85. package/dist/components/UI/icons/sendIcon.svg.js.map +1 -0
  86. package/dist/components/UI/icons/settings.svg.js +8 -0
  87. package/dist/components/UI/icons/settings.svg.js.map +1 -0
  88. package/dist/components/UI/icons/speaker-off.svg.js +8 -0
  89. package/dist/components/UI/icons/speaker-off.svg.js.map +1 -0
  90. package/dist/components/UI/icons/speaker-on.svg.js +8 -0
  91. package/dist/components/UI/icons/speaker-on.svg.js.map +1 -0
  92. package/dist/components/UI/icons/spinner.svg.js +9 -0
  93. package/dist/components/UI/icons/spinner.svg.js.map +1 -0
  94. package/dist/components/UI/icons/sw-logo.svg.js +11 -0
  95. package/dist/components/UI/icons/sw-logo.svg.js.map +1 -0
  96. package/dist/components/UI/icons/sw-ui-icon.d.ts +28 -0
  97. package/dist/components/UI/icons/sw-ui-icon.d.ts.map +1 -0
  98. package/dist/components/UI/icons/sw-ui-icon.js +47 -0
  99. package/dist/components/UI/icons/sw-ui-icon.js.map +1 -0
  100. package/dist/components/UI/icons/transcript.svg.js +10 -0
  101. package/dist/components/UI/icons/transcript.svg.js.map +1 -0
  102. package/dist/components/UI/index.d.ts +18 -0
  103. package/dist/components/UI/index.d.ts.map +1 -0
  104. package/dist/components/UI/layout/sw-ui-background.d.ts +33 -0
  105. package/dist/components/UI/layout/sw-ui-background.d.ts.map +1 -0
  106. package/dist/components/UI/layout/sw-ui-background.js +106 -0
  107. package/dist/components/UI/layout/sw-ui-background.js.map +1 -0
  108. package/dist/components/UI/layout/sw-ui-call-layout.d.ts +69 -0
  109. package/dist/components/UI/layout/sw-ui-call-layout.d.ts.map +1 -0
  110. package/dist/components/UI/layout/sw-ui-call-layout.js +278 -0
  111. package/dist/components/UI/layout/sw-ui-call-layout.js.map +1 -0
  112. package/dist/components/UI/layout/sw-ui-content-drawer.d.ts +50 -0
  113. package/dist/components/UI/layout/sw-ui-content-drawer.d.ts.map +1 -0
  114. package/dist/components/UI/layout/sw-ui-content-drawer.js +413 -0
  115. package/dist/components/UI/layout/sw-ui-content-drawer.js.map +1 -0
  116. package/dist/components/UI/layout/sw-ui-modal.d.ts +31 -0
  117. package/dist/components/UI/layout/sw-ui-modal.d.ts.map +1 -0
  118. package/dist/components/UI/layout/sw-ui-modal.js +150 -0
  119. package/dist/components/UI/layout/sw-ui-modal.js.map +1 -0
  120. package/dist/components/UI/layout/sw-ui-responsive-container.d.ts +15 -0
  121. package/dist/components/UI/layout/sw-ui-responsive-container.d.ts.map +1 -0
  122. package/dist/components/UI/layout/sw-ui-responsive-container.js +78 -0
  123. package/dist/components/UI/layout/sw-ui-responsive-container.js.map +1 -0
  124. package/dist/components/UI/sw-ui-alert.d.ts +37 -0
  125. package/dist/components/UI/sw-ui-alert.d.ts.map +1 -0
  126. package/dist/components/UI/sw-ui-alert.js +126 -0
  127. package/dist/components/UI/sw-ui-alert.js.map +1 -0
  128. package/dist/components/UI/sw-ui-transcript-view.d.ts +56 -0
  129. package/dist/components/UI/sw-ui-transcript-view.d.ts.map +1 -0
  130. package/dist/components/UI/sw-ui-transcript-view.js +341 -0
  131. package/dist/components/UI/sw-ui-transcript-view.js.map +1 -0
  132. package/dist/components/{audio-level.d.ts → sw-audio-level.d.ts} +44 -4
  133. package/dist/components/sw-audio-level.d.ts.map +1 -0
  134. package/dist/components/sw-audio-level.js +252 -0
  135. package/dist/components/sw-audio-level.js.map +1 -0
  136. package/dist/components/sw-call-controls.d.ts +58 -0
  137. package/dist/components/sw-call-controls.d.ts.map +1 -0
  138. package/dist/components/sw-call-controls.js +186 -0
  139. package/dist/components/sw-call-controls.js.map +1 -0
  140. package/dist/components/sw-call-dialpad.d.ts +52 -0
  141. package/dist/components/sw-call-dialpad.d.ts.map +1 -0
  142. package/dist/components/sw-call-dialpad.js +70 -0
  143. package/dist/components/sw-call-dialpad.js.map +1 -0
  144. package/dist/components/sw-call-media.d.ts +68 -0
  145. package/dist/components/sw-call-media.d.ts.map +1 -0
  146. package/dist/components/sw-call-media.js +220 -0
  147. package/dist/components/sw-call-media.js.map +1 -0
  148. package/dist/components/sw-call-provider.d.ts +41 -0
  149. package/dist/components/sw-call-provider.d.ts.map +1 -0
  150. package/dist/components/sw-call-provider.js +37 -0
  151. package/dist/components/sw-call-provider.js.map +1 -0
  152. package/dist/components/sw-call-status.d.ts +50 -0
  153. package/dist/components/sw-call-status.d.ts.map +1 -0
  154. package/dist/components/sw-call-status.js +203 -0
  155. package/dist/components/sw-call-status.js.map +1 -0
  156. package/dist/components/sw-call-widget/client-factory.d.ts +6 -0
  157. package/dist/components/sw-call-widget/client-factory.d.ts.map +1 -0
  158. package/dist/components/sw-call-widget/client-factory.js +25 -0
  159. package/dist/components/sw-call-widget/client-factory.js.map +1 -0
  160. package/dist/components/sw-call-widget/sw-call-widget.d.ts +110 -0
  161. package/dist/components/sw-call-widget/sw-call-widget.d.ts.map +1 -0
  162. package/dist/components/sw-call-widget/sw-call-widget.js +250 -0
  163. package/dist/components/sw-call-widget/sw-call-widget.js.map +1 -0
  164. package/dist/components/sw-call-widget/sw-call-widget.templates.d.ts +17 -0
  165. package/dist/components/sw-call-widget/sw-call-widget.templates.d.ts.map +1 -0
  166. package/dist/components/sw-call-widget/sw-call-widget.templates.js +80 -0
  167. package/dist/components/sw-call-widget/sw-call-widget.templates.js.map +1 -0
  168. package/dist/components/sw-click-to-call.d.ts +39 -0
  169. package/dist/components/sw-click-to-call.d.ts.map +1 -0
  170. package/dist/components/sw-click-to-call.js +87 -0
  171. package/dist/components/sw-click-to-call.js.map +1 -0
  172. package/dist/components/sw-device-selector/index.d.ts +2 -0
  173. package/dist/components/sw-device-selector/index.d.ts.map +1 -0
  174. package/dist/components/sw-device-selector/sw-device-selector.d.ts +69 -0
  175. package/dist/components/sw-device-selector/sw-device-selector.d.ts.map +1 -0
  176. package/dist/components/sw-device-selector/sw-device-selector.js +277 -0
  177. package/dist/components/sw-device-selector/sw-device-selector.js.map +1 -0
  178. package/dist/components/sw-device-selector/sw-device-selector.styles.d.ts +2 -0
  179. package/dist/components/sw-device-selector/sw-device-selector.styles.d.ts.map +1 -0
  180. package/dist/components/sw-device-selector/sw-device-selector.styles.js +238 -0
  181. package/dist/components/sw-device-selector/sw-device-selector.styles.js.map +1 -0
  182. package/dist/components/{directory.d.ts → sw-directory.d.ts} +17 -3
  183. package/dist/components/sw-directory.d.ts.map +1 -0
  184. package/dist/components/sw-directory.js +434 -0
  185. package/dist/components/sw-directory.js.map +1 -0
  186. package/dist/components/sw-local-camera.d.ts +53 -0
  187. package/dist/components/sw-local-camera.d.ts.map +1 -0
  188. package/dist/components/sw-local-camera.js +147 -0
  189. package/dist/components/sw-local-camera.js.map +1 -0
  190. package/dist/components/sw-participant-controls.d.ts +58 -0
  191. package/dist/components/sw-participant-controls.d.ts.map +1 -0
  192. package/dist/components/sw-participant-controls.js +305 -0
  193. package/dist/components/sw-participant-controls.js.map +1 -0
  194. package/dist/components/sw-participants.d.ts +55 -0
  195. package/dist/components/sw-participants.d.ts.map +1 -0
  196. package/dist/components/sw-participants.js +319 -0
  197. package/dist/components/sw-participants.js.map +1 -0
  198. package/dist/components/sw-self-media.d.ts +46 -0
  199. package/dist/components/sw-self-media.d.ts.map +1 -0
  200. package/dist/components/sw-self-media.js +106 -0
  201. package/dist/components/sw-self-media.js.map +1 -0
  202. package/dist/context/CallStateContextController.d.ts +31 -0
  203. package/dist/context/CallStateContextController.d.ts.map +1 -0
  204. package/dist/context/CallStateContextController.js +125 -0
  205. package/dist/context/CallStateContextController.js.map +1 -0
  206. package/dist/context/DevicesContextController.d.ts +38 -0
  207. package/dist/context/DevicesContextController.d.ts.map +1 -0
  208. package/dist/context/DevicesContextController.js +124 -0
  209. package/dist/context/DevicesContextController.js.map +1 -0
  210. package/dist/context/TranscriptController.d.ts +32 -0
  211. package/dist/context/TranscriptController.d.ts.map +1 -0
  212. package/dist/context/TranscriptController.js +113 -0
  213. package/dist/context/TranscriptController.js.map +1 -0
  214. package/dist/context/UserEventController.d.ts +26 -0
  215. package/dist/context/UserEventController.d.ts.map +1 -0
  216. package/dist/context/UserEventController.js +55 -0
  217. package/dist/context/UserEventController.js.map +1 -0
  218. package/dist/context/call-state-context.d.ts +75 -0
  219. package/dist/context/call-state-context.d.ts.map +1 -0
  220. package/dist/context/call-state-context.js +39 -0
  221. package/dist/context/call-state-context.js.map +1 -0
  222. package/dist/context/chat-state.d.ts +41 -0
  223. package/dist/context/chat-state.d.ts.map +1 -0
  224. package/dist/context/chat-state.js +61 -0
  225. package/dist/context/chat-state.js.map +1 -0
  226. package/dist/context/devices-context.d.ts +28 -0
  227. package/dist/context/devices-context.d.ts.map +1 -0
  228. package/dist/context/devices-context.js +6 -0
  229. package/dist/context/devices-context.js.map +1 -0
  230. package/dist/context/index.d.ts +9 -1
  231. package/dist/context/index.d.ts.map +1 -1
  232. package/dist/context/transcript-context.d.ts +9 -0
  233. package/dist/context/transcript-context.d.ts.map +1 -0
  234. package/dist/context/transcript-context.js +6 -0
  235. package/dist/context/transcript-context.js.map +1 -0
  236. package/dist/context/types.d.ts +9 -0
  237. package/dist/context/types.d.ts.map +1 -0
  238. package/dist/embed/signalwire-web-components-embed.iife.js +3225 -0
  239. package/dist/embed/signalwire-web-components-embed.iife.js.map +1 -0
  240. package/dist/embed/signalwire-web-components-embed.umd.cjs +3225 -0
  241. package/dist/embed/signalwire-web-components-embed.umd.cjs.map +1 -0
  242. package/dist/embed.d.ts +20 -0
  243. package/dist/embed.d.ts.map +1 -0
  244. package/dist/index.d.ts +19 -13
  245. package/dist/index.d.ts.map +1 -1
  246. package/dist/index.js +83 -34
  247. package/dist/index.js.map +1 -1
  248. package/dist/node_modules/dompurify/dist/purify.es.js +597 -0
  249. package/dist/node_modules/dompurify/dist/purify.es.js.map +1 -0
  250. package/dist/node_modules/marked/lib/marked.esm.js +1475 -0
  251. package/dist/node_modules/marked/lib/marked.esm.js.map +1 -0
  252. package/dist/node_modules/prismjs/components/prism-bash.js +220 -0
  253. package/dist/node_modules/prismjs/components/prism-bash.js.map +1 -0
  254. package/dist/node_modules/prismjs/components/prism-css.js +56 -0
  255. package/dist/node_modules/prismjs/components/prism-css.js.map +1 -0
  256. package/dist/node_modules/prismjs/components/prism-javascript.js +138 -0
  257. package/dist/node_modules/prismjs/components/prism-javascript.js.map +1 -0
  258. package/dist/node_modules/prismjs/components/prism-json.js +26 -0
  259. package/dist/node_modules/prismjs/components/prism-json.js.map +1 -0
  260. package/dist/node_modules/prismjs/components/prism-markdown.js +301 -0
  261. package/dist/node_modules/prismjs/components/prism-markdown.js.map +1 -0
  262. package/dist/node_modules/prismjs/components/prism-python.js +69 -0
  263. package/dist/node_modules/prismjs/components/prism-python.js.map +1 -0
  264. package/dist/node_modules/prismjs/components/prism-sql.js +34 -0
  265. package/dist/node_modules/prismjs/components/prism-sql.js.map +1 -0
  266. package/dist/node_modules/prismjs/components/prism-typescript.js +53 -0
  267. package/dist/node_modules/prismjs/components/prism-typescript.js.map +1 -0
  268. package/dist/node_modules/prismjs/components/prism-yaml.js +67 -0
  269. package/dist/node_modules/prismjs/components/prism-yaml.js.map +1 -0
  270. package/dist/node_modules/prismjs/prism.js +1165 -0
  271. package/dist/node_modules/prismjs/prism.js.map +1 -0
  272. package/dist/react.d.ts +96 -46
  273. package/dist/theme.css +451 -0
  274. package/dist/theme.css.js +5 -0
  275. package/dist/theme.css.js.map +1 -0
  276. package/dist/types/index.d.ts +9 -33
  277. package/dist/types/index.d.ts.map +1 -1
  278. package/dist/utils/index.d.ts +2 -0
  279. package/dist/utils/index.d.ts.map +1 -1
  280. package/dist/utils/prism.d.ts +4 -0
  281. package/dist/utils/prism.d.ts.map +1 -0
  282. package/dist/utils/prism.js +34 -0
  283. package/dist/utils/prism.js.map +1 -0
  284. package/dist/utils/theme-loader.d.ts +11 -0
  285. package/dist/utils/theme-loader.d.ts.map +1 -0
  286. package/dist/utils/theme-loader.js +17 -0
  287. package/dist/utils/theme-loader.js.map +1 -0
  288. package/dist/utils/transcriptToMarkdown.d.ts +14 -0
  289. package/dist/utils/transcriptToMarkdown.d.ts.map +1 -0
  290. package/dist/utils/transcriptToMarkdown.js +59 -0
  291. package/dist/utils/transcriptToMarkdown.js.map +1 -0
  292. package/dist/utils/use-google-font.d.ts +18 -0
  293. package/dist/utils/use-google-font.d.ts.map +1 -0
  294. package/dist/utils/use-google-font.js +12 -0
  295. package/dist/utils/use-google-font.js.map +1 -0
  296. package/dist/utils/user-variables.d.ts +20 -0
  297. package/dist/utils/user-variables.d.ts.map +1 -0
  298. package/dist/utils/user-variables.js +37 -0
  299. package/dist/utils/user-variables.js.map +1 -0
  300. package/package.json +104 -41
  301. package/dist/components/audio-level.d.ts.map +0 -1
  302. package/dist/components/audio-level.js +0 -203
  303. package/dist/components/audio-level.js.map +0 -1
  304. package/dist/components/call-controls.d.ts +0 -163
  305. package/dist/components/call-controls.d.ts.map +0 -1
  306. package/dist/components/call-controls.js +0 -606
  307. package/dist/components/call-controls.js.map +0 -1
  308. package/dist/components/call-media.d.ts +0 -114
  309. package/dist/components/call-media.d.ts.map +0 -1
  310. package/dist/components/call-media.js +0 -219
  311. package/dist/components/call-media.js.map +0 -1
  312. package/dist/components/call-status.d.ts +0 -68
  313. package/dist/components/call-status.d.ts.map +0 -1
  314. package/dist/components/call-status.js +0 -254
  315. package/dist/components/call-status.js.map +0 -1
  316. package/dist/components/click-to-call.d.ts +0 -123
  317. package/dist/components/click-to-call.d.ts.map +0 -1
  318. package/dist/components/click-to-call.js +0 -428
  319. package/dist/components/click-to-call.js.map +0 -1
  320. package/dist/components/device-selector.d.ts +0 -224
  321. package/dist/components/device-selector.d.ts.map +0 -1
  322. package/dist/components/device-selector.js +0 -685
  323. package/dist/components/device-selector.js.map +0 -1
  324. package/dist/components/dialpad.d.ts +0 -60
  325. package/dist/components/dialpad.d.ts.map +0 -1
  326. package/dist/components/dialpad.js +0 -372
  327. package/dist/components/dialpad.js.map +0 -1
  328. package/dist/components/directory.d.ts.map +0 -1
  329. package/dist/components/directory.js +0 -503
  330. package/dist/components/directory.js.map +0 -1
  331. package/dist/components/example-button.d.ts +0 -20
  332. package/dist/components/example-button.d.ts.map +0 -1
  333. package/dist/components/example-button.js +0 -74
  334. package/dist/components/example-button.js.map +0 -1
  335. package/dist/components/participant-controls.d.ts +0 -94
  336. package/dist/components/participant-controls.d.ts.map +0 -1
  337. package/dist/components/participant-controls.js +0 -468
  338. package/dist/components/participant-controls.js.map +0 -1
  339. package/dist/components/participants.d.ts +0 -116
  340. package/dist/components/participants.d.ts.map +0 -1
  341. package/dist/components/participants.js +0 -394
  342. package/dist/components/participants.js.map +0 -1
  343. package/dist/components/self-media.d.ts +0 -78
  344. package/dist/components/self-media.d.ts.map +0 -1
  345. package/dist/components/self-media.js +0 -129
  346. package/dist/components/self-media.js.map +0 -1
  347. package/dist/context/call-context.d.ts +0 -13
  348. package/dist/context/call-context.d.ts.map +0 -1
  349. package/dist/context/call-context.js +0 -6
  350. package/dist/context/call-context.js.map +0 -1
  351. package/dist/types/index.js +0 -12
  352. package/dist/types/index.js.map +0 -1
@@ -0,0 +1,186 @@
1
+ import { LitElement as g, html as d, css as _ } from "lit";
2
+ import { state as h, property as l, customElement as f } from "lit/decorators.js";
3
+ import { consume as p } from "@lit/context";
4
+ import { devicesContext as v } from "../context/devices-context.js";
5
+ import { callStateContext as S } from "../context/call-state-context.js";
6
+ import { getLogger as w } from "@signalwire/js";
7
+ var b = Object.defineProperty, m = Object.getOwnPropertyDescriptor, n = (e, s, i, t) => {
8
+ for (var o = t > 1 ? void 0 : t ? m(s, i) : s, c = e.length - 1, u; c >= 0; c--)
9
+ (u = e[c]) && (o = (t ? u(s, i, o) : u(o)) || o);
10
+ return t && o && b(s, i, o), o;
11
+ };
12
+ const a = w();
13
+ let r = class extends g {
14
+ constructor() {
15
+ super(...arguments), this._directSelf = null, this._directSubscriptions = [], this._fullscreen = !1, this.showScreenShare = !0, this.showHandRaise = !0, this.showTranscript = !1, this.transcriptActive = !1, this.showSettings = !0, this.showFullscreen = !0;
16
+ }
17
+ // ── Lifecycle ─────────────────────────────────────────────────────────────
18
+ updated(e) {
19
+ super.updated(e), e.has("call") && (this._teardownDirect(), this.call && this._directSubscriptions.push(
20
+ this.call.self$.subscribe((s) => this._directSelf = s)
21
+ ));
22
+ }
23
+ disconnectedCallback() {
24
+ super.disconnectedCallback(), this._teardownDirect();
25
+ }
26
+ _teardownDirect() {
27
+ this._directSubscriptions.forEach((e) => e.unsubscribe()), this._directSubscriptions = [], this._directSelf = null;
28
+ }
29
+ get _effectiveSelf() {
30
+ var e;
31
+ return this.call ? this._directSelf : ((e = this._callState) == null ? void 0 : e.self) ?? null;
32
+ }
33
+ // ── Helpers ───────────────────────────────────────────────────────────────
34
+ _toDropupOptions(e, s) {
35
+ const i = /* @__PURE__ */ new Set(), t = [];
36
+ for (const o of e) {
37
+ const c = o.deviceId || `__default_${o.kind}`;
38
+ i.has(c) || (i.add(c), t.push({
39
+ id: c,
40
+ label: o.label || (o.deviceId ? o.deviceId.slice(0, 12) : "Default"),
41
+ selected: o.deviceId === (s == null ? void 0 : s.deviceId)
42
+ }));
43
+ }
44
+ return t;
45
+ }
46
+ // ── Handlers ─────────────────────────────────────────────────────────────
47
+ _onMicToggle() {
48
+ var e;
49
+ (e = this._devices) == null || e.toggleAudioMute();
50
+ }
51
+ _onCameraToggle() {
52
+ var e;
53
+ (e = this._devices) == null || e.toggleVideoMute();
54
+ }
55
+ _onSpeakerToggle() {
56
+ var e;
57
+ (e = this._devices) == null || e.toggleSpeakerMute();
58
+ }
59
+ _onFullscreenToggle(e) {
60
+ this._fullscreen = e.detail.fullscreen;
61
+ }
62
+ _onScreenShareToggle(e) {
63
+ const s = this._effectiveSelf;
64
+ s && (e.detail.active ? s.startScreenShare().catch((i) => {
65
+ a.error("[CallControls] Screen share failed:", i);
66
+ }) : s.stopScreenShare().catch((i) => {
67
+ a.error("[CallControls] Stop screen share failed:", i);
68
+ }));
69
+ }
70
+ _onHandRaiseToggle(e) {
71
+ const s = this._effectiveSelf;
72
+ s && s.toggleHandraise().catch((i) => {
73
+ a.error("[CallControls] Hand raise failed:", i);
74
+ });
75
+ }
76
+ _onHangUp() {
77
+ var s;
78
+ const e = this.call ? () => this.call.hangup() : (s = this._callState) == null ? void 0 : s.hangup;
79
+ e == null || e().catch((i) => {
80
+ a.error("[CallControls] Hangup failed:", i);
81
+ }), this.dispatchEvent(new CustomEvent("sw-call-hangup", { bubbles: !0, composed: !0 }));
82
+ }
83
+ _onDeviceChange(e) {
84
+ if (!this._devices) return;
85
+ const { kind: s, deviceId: i } = e.detail, t = (o) => o.find((c) => c.deviceId === i) ?? null;
86
+ s === "mic" && this._devices.selectAudioInput(t(this._devices.audioInputDevices)), s === "camera" && this._devices.selectVideoInput(t(this._devices.videoInputDevices)), s === "speaker" && this._devices.selectAudioOutput(t(this._devices.audioOutputDevices));
87
+ }
88
+ _onSettingsChange(e) {
89
+ if (!this._devices) return;
90
+ const { settingId: s } = e.detail, t = {
91
+ "echo-cancellation": () => this._devices.toggleEchoCancellation(),
92
+ "auto-gain": () => this._devices.toggleAutoGain(),
93
+ "noise-suppression": () => this._devices.toggleNoiseSuppression()
94
+ }[s];
95
+ t && t().catch((o) => a.error("[CallControls] Settings toggle failed:", o));
96
+ }
97
+ _buildSettingsItems() {
98
+ return [
99
+ { id: "echo-cancellation", label: "Echo Cancellation", selected: this._devices.echoCancellation },
100
+ { id: "auto-gain", label: "Auto Gain", selected: this._devices.autoGain },
101
+ { id: "noise-suppression", label: "Noise Suppression", selected: this._devices.noiseSuppression }
102
+ ];
103
+ }
104
+ // ── Render ────────────────────────────────────────────────────────────────
105
+ render() {
106
+ if (!this._devices && !this.call) return d``;
107
+ const e = this._effectiveSelf, s = (e == null ? void 0 : e.screenShareStatus) === "started", i = (e == null ? void 0 : e.handraised) ?? !1, t = this._devices;
108
+ return d`
109
+ <sw-ui-control-bar
110
+ exportparts="bar,logo,button,chevron"
111
+ .micMuted=${(t == null ? void 0 : t.audioMuted) ?? !1}
112
+ .cameraMuted=${(t == null ? void 0 : t.videoMuted) ?? !1}
113
+ .speakerMuted=${(t == null ? void 0 : t.speakerMuted) ?? !1}
114
+ .fullscreen=${this._fullscreen}
115
+ .screenSharing=${s}
116
+ .handRaised=${i}
117
+ .transcriptActive=${this.transcriptActive}
118
+ .showScreenShare=${this.showScreenShare}
119
+ .showHandRaise=${this.showHandRaise}
120
+ .showTranscript=${this.showTranscript}
121
+ .showSettings=${this.showSettings && !!t}
122
+ .showFullscreen=${this.showFullscreen}
123
+ .micDevices=${t ? this._toDropupOptions(t.audioInputDevices, t.selectedAudioInput) : []}
124
+ .cameraDevices=${t ? this._toDropupOptions(t.videoInputDevices, t.selectedVideoInput) : []}
125
+ .speakerDevices=${t ? this._toDropupOptions(t.audioOutputDevices, t.selectedAudioOutput) : []}
126
+ .settingsItems=${t ? this._buildSettingsItems() : []}
127
+ @sw-mic-toggle=${this._onMicToggle}
128
+ @sw-camera-toggle=${this._onCameraToggle}
129
+ @sw-speaker-toggle=${this._onSpeakerToggle}
130
+ @sw-fullscreen-toggle=${this._onFullscreenToggle}
131
+ @sw-screen-share-toggle=${this._onScreenShareToggle}
132
+ @sw-hand-raise-toggle=${this._onHandRaiseToggle}
133
+ @sw-call-hangup=${this._onHangUp}
134
+ @sw-device-change=${this._onDeviceChange}
135
+ @sw-settings-change=${this._onSettingsChange}
136
+ ></sw-ui-control-bar>
137
+ `;
138
+ }
139
+ };
140
+ r.styles = _`
141
+ :host {
142
+ display: block;
143
+ }
144
+ `;
145
+ n([
146
+ p({ context: v, subscribe: !0 }),
147
+ h()
148
+ ], r.prototype, "_devices", 2);
149
+ n([
150
+ p({ context: S, subscribe: !0 }),
151
+ h()
152
+ ], r.prototype, "_callState", 2);
153
+ n([
154
+ l({ type: Object })
155
+ ], r.prototype, "call", 2);
156
+ n([
157
+ h()
158
+ ], r.prototype, "_directSelf", 2);
159
+ n([
160
+ h()
161
+ ], r.prototype, "_fullscreen", 2);
162
+ n([
163
+ l({ type: Boolean, reflect: !0, attribute: "show-screen-share" })
164
+ ], r.prototype, "showScreenShare", 2);
165
+ n([
166
+ l({ type: Boolean, reflect: !0, attribute: "show-hand-raise" })
167
+ ], r.prototype, "showHandRaise", 2);
168
+ n([
169
+ l({ type: Boolean, reflect: !0, attribute: "show-transcript" })
170
+ ], r.prototype, "showTranscript", 2);
171
+ n([
172
+ l({ type: Boolean, reflect: !0, attribute: "transcript-active" })
173
+ ], r.prototype, "transcriptActive", 2);
174
+ n([
175
+ l({ type: Boolean, reflect: !0, attribute: "show-settings" })
176
+ ], r.prototype, "showSettings", 2);
177
+ n([
178
+ l({ type: Boolean, reflect: !0, attribute: "show-fullscreen" })
179
+ ], r.prototype, "showFullscreen", 2);
180
+ r = n([
181
+ f("sw-call-controls")
182
+ ], r);
183
+ export {
184
+ r as SwCallControls
185
+ };
186
+ //# sourceMappingURL=sw-call-controls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sw-call-controls.js","sources":["../../src/components/sw-call-controls.ts"],"sourcesContent":["import { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\nimport { Subscription } from 'rxjs';\nimport { devicesContext, type DevicesState } from '../context/devices-context.js';\nimport { callStateContext, type CallState } from '../context/call-state-context.js';\nimport type { DropUpItem } from './UI/controls/sw-ui-dropup.js';\nimport type {\n FullscreenToggleDetail,\n ScreenShareToggleDetail,\n HandRaiseToggleDetail,\n SettingsChangeDetail,\n} from './UI/controls/sw-ui-control-bar.js';\nimport { getLogger } from '@signalwire/js';\nimport type { CallSelfParticipant } from '@signalwire/js';\nimport type { Call } from '../types/index.js';\n\nconst logger = getLogger();\n\n/**\n * Connected control bar that bridges `devicesContext` and `callStateContext`\n * to the pure `sw-ui-control-bar` UI component.\n *\n * Input precedence (most specific wins): `.call` > context.\n * When `.call` is set, the control bar drives screen-share / hand-raise /\n * hang-up directly from the Call. Mic/camera/speaker toggles still require\n * `devicesContext` — without it those buttons render in their default state.\n *\n * @prop {Call} call - explicit Call object (overrides context)\n * @prop {boolean} showScreenShare - show the screen-share button\n * @prop {boolean} showHandRaise - show the hand-raise button\n * @prop {boolean} showTranscript - show the transcript toggle button\n * @prop {boolean} transcriptActive - current transcript panel visibility\n *\n * @fires sw-call-hangup - Re-dispatched when the user clicks hang-up so external\n * consumers (e.g. React parents) can react. No detail.\n */\n@customElement('sw-call-controls')\nexport class SwCallControls extends LitElement {\n static styles = css`\n :host {\n display: block;\n }\n `;\n\n @consume({ context: devicesContext, subscribe: true })\n @state()\n private _devices!: DevicesState;\n\n @consume({ context: callStateContext, subscribe: true })\n @state()\n private _callState?: CallState;\n\n /** Explicit Call — when set, drives call-state actions directly. */\n @property({ type: Object }) call?: Call;\n\n @state() private _directSelf: CallSelfParticipant | null = null;\n\n private _directSubscriptions: Subscription[] = [];\n\n @state() private _fullscreen = false;\n\n @property({ type: Boolean, reflect: true, attribute: 'show-screen-share' })\n showScreenShare = true;\n\n @property({ type: Boolean, reflect: true, attribute: 'show-hand-raise' })\n showHandRaise = true;\n\n @property({ type: Boolean, reflect: true, attribute: 'show-transcript' })\n showTranscript = false;\n\n @property({ type: Boolean, reflect: true, attribute: 'transcript-active' })\n transcriptActive = false;\n\n @property({ type: Boolean, reflect: true, attribute: 'show-settings' })\n showSettings = true;\n\n @property({ type: Boolean, reflect: true, attribute: 'show-fullscreen' })\n showFullscreen = true;\n\n // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n protected updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('call')) {\n this._teardownDirect();\n if (this.call) {\n this._directSubscriptions.push(\n this.call.self$.subscribe((s) => (this._directSelf = s))\n );\n }\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._teardownDirect();\n }\n\n private _teardownDirect(): void {\n this._directSubscriptions.forEach((s) => s.unsubscribe());\n this._directSubscriptions = [];\n this._directSelf = null;\n }\n\n private get _effectiveSelf(): CallSelfParticipant | null {\n return this.call ? this._directSelf : this._callState?.self ?? null;\n }\n\n // ── Helpers ───────────────────────────────────────────────────────────────\n\n private _toDropupOptions(\n devices: MediaDeviceInfo[],\n selected: MediaDeviceInfo | null\n ): DropUpItem[] {\n // Before getUserMedia permission, browsers may return devices with\n // empty deviceId/label. Deduplicate empty-ID entries into one\n // placeholder so the chevron doesn't show multiple blank rows.\n const seen = new Set<string>();\n const result: DropUpItem[] = [];\n for (const d of devices) {\n const id = d.deviceId || `__default_${d.kind}`;\n if (seen.has(id)) continue;\n seen.add(id);\n result.push({\n id,\n label: d.label || (d.deviceId ? d.deviceId.slice(0, 12) : 'Default'),\n selected: d.deviceId === selected?.deviceId,\n });\n }\n return result;\n }\n\n // ── Handlers ─────────────────────────────────────────────────────────────\n\n private _onMicToggle() {\n this._devices?.toggleAudioMute();\n }\n\n private _onCameraToggle() {\n this._devices?.toggleVideoMute();\n }\n\n private _onSpeakerToggle() {\n this._devices?.toggleSpeakerMute();\n }\n\n private _onFullscreenToggle(e: CustomEvent<FullscreenToggleDetail>) {\n this._fullscreen = e.detail.fullscreen;\n }\n\n private _onScreenShareToggle(e: CustomEvent<ScreenShareToggleDetail>) {\n const self = this._effectiveSelf;\n if (!self) return;\n\n if (e.detail.active) {\n self.startScreenShare().catch((err) => {\n logger.error('[CallControls] Screen share failed:', err);\n });\n } else {\n self.stopScreenShare().catch((err) => {\n logger.error('[CallControls] Stop screen share failed:', err);\n });\n }\n }\n\n private _onHandRaiseToggle(_e: CustomEvent<HandRaiseToggleDetail>) {\n const self = this._effectiveSelf;\n if (!self) return;\n\n self.toggleHandraise().catch((err) => {\n logger.error('[CallControls] Hand raise failed:', err);\n });\n }\n\n private _onHangUp() {\n const hangup = this.call ? () => this.call!.hangup() : this._callState?.hangup;\n hangup?.().catch((err) => {\n logger.error('[CallControls] Hangup failed:', err);\n });\n // Re-dispatch as sw-call-hangup so external consumers (e.g. React) can react.\n this.dispatchEvent(new CustomEvent('sw-call-hangup', { bubbles: true, composed: true }));\n }\n\n private _onDeviceChange(e: CustomEvent<{ kind: 'mic' | 'camera' | 'speaker'; deviceId: string }>) {\n if (!this._devices) return;\n const { kind, deviceId } = e.detail;\n const find = (list: MediaDeviceInfo[]) => list.find((d) => d.deviceId === deviceId) ?? null;\n\n if (kind === 'mic') this._devices.selectAudioInput(find(this._devices.audioInputDevices));\n if (kind === 'camera') this._devices.selectVideoInput(find(this._devices.videoInputDevices));\n if (kind === 'speaker') this._devices.selectAudioOutput(find(this._devices.audioOutputDevices));\n }\n\n private _onSettingsChange(e: CustomEvent<SettingsChangeDetail>) {\n if (!this._devices) return;\n const { settingId } = e.detail;\n const toggles: Record<string, () => Promise<void>> = {\n 'echo-cancellation': () => this._devices.toggleEchoCancellation(),\n 'auto-gain': () => this._devices.toggleAutoGain(),\n 'noise-suppression': () => this._devices.toggleNoiseSuppression(),\n };\n const toggle = toggles[settingId];\n if (toggle) {\n toggle().catch((err) => logger.error('[CallControls] Settings toggle failed:', err));\n }\n }\n\n private _buildSettingsItems(): DropUpItem[] {\n return [\n { id: 'echo-cancellation', label: 'Echo Cancellation', selected: this._devices.echoCancellation },\n { id: 'auto-gain', label: 'Auto Gain', selected: this._devices.autoGain },\n { id: 'noise-suppression', label: 'Noise Suppression', selected: this._devices.noiseSuppression },\n ];\n }\n\n // ── Render ────────────────────────────────────────────────────────────────\n\n render() {\n if (!this._devices && !this.call) return html``;\n\n const self = this._effectiveSelf;\n const isScreenSharing = self?.screenShareStatus === 'started';\n const isHandRaised = self?.handraised ?? false;\n\n const d = this._devices;\n return html`\n <sw-ui-control-bar\n exportparts=\"bar,logo,button,chevron\"\n .micMuted=${d?.audioMuted ?? false}\n .cameraMuted=${d?.videoMuted ?? false}\n .speakerMuted=${d?.speakerMuted ?? false}\n .fullscreen=${this._fullscreen}\n .screenSharing=${isScreenSharing}\n .handRaised=${isHandRaised}\n .transcriptActive=${this.transcriptActive}\n .showScreenShare=${this.showScreenShare}\n .showHandRaise=${this.showHandRaise}\n .showTranscript=${this.showTranscript}\n .showSettings=${this.showSettings && !!d}\n .showFullscreen=${this.showFullscreen}\n .micDevices=${d ? this._toDropupOptions(d.audioInputDevices, d.selectedAudioInput) : []}\n .cameraDevices=${d ? this._toDropupOptions(d.videoInputDevices, d.selectedVideoInput) : []}\n .speakerDevices=${d ? this._toDropupOptions(d.audioOutputDevices, d.selectedAudioOutput) : []}\n .settingsItems=${d ? this._buildSettingsItems() : []}\n @sw-mic-toggle=${this._onMicToggle}\n @sw-camera-toggle=${this._onCameraToggle}\n @sw-speaker-toggle=${this._onSpeakerToggle}\n @sw-fullscreen-toggle=${this._onFullscreenToggle}\n @sw-screen-share-toggle=${this._onScreenShareToggle}\n @sw-hand-raise-toggle=${this._onHandRaiseToggle}\n @sw-call-hangup=${this._onHangUp}\n @sw-device-change=${this._onDeviceChange}\n @sw-settings-change=${this._onSettingsChange}\n ></sw-ui-control-bar>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-call-controls': SwCallControls;\n }\n}\n"],"names":["logger","getLogger","SwCallControls","LitElement","changed","s","_a","devices","selected","seen","result","d","id","self","err","_e","hangup","kind","deviceId","find","list","settingId","toggle","html","isScreenSharing","isHandRaised","css","__decorateClass","consume","devicesContext","state","callStateContext","property","customElement"],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Call Dialpad Component
3
+ *
4
+ * Wrapper around `sw-dialpad` that integrates with a Call.
5
+ * When a call is connected, digit presses send DTMF tones.
6
+ * When no call is active, the dial event bubbles up for the parent to handle.
7
+ *
8
+ * Input precedence (most specific wins): `.call` > context.
9
+ *
10
+ * @example
11
+ * ```html
12
+ * <sw-call-dialpad></sw-call-dialpad>
13
+ * <sw-call-dialpad .call=${call}></sw-call-dialpad>
14
+ * <sw-call-dialpad show-call-button @sw-dial=${onDial}></sw-call-dialpad>
15
+ * ```
16
+ *
17
+ * @csspart container - Outer dialpad container.
18
+ * @csspart display - Number / text display field.
19
+ * @csspart keypad - Grid of digit keys.
20
+ * @csspart key - Individual digit button.
21
+ * @csspart key-pressed - Digit button while pressed.
22
+ * @csspart call-button - The call button (when `show-call-button`).
23
+ *
24
+ * @fires sw-digit-press - A digit was pressed. Detail: `{ digit: string, digits: string }`.
25
+ * @fires sw-dial - User pressed the call button. Detail: `{ digits: string }`.
26
+ */
27
+ import { LitElement } from 'lit';
28
+ import type { Call } from '../types/index.js';
29
+ import './UI/controls/sw-ui-dialpad.js';
30
+ export declare class SwCallDialpad extends LitElement {
31
+ private _callState?;
32
+ /** Explicit Call — when set, drives DTMF directly and bypasses context. */
33
+ call?: Call;
34
+ private _directStatus;
35
+ private _directSubscriptions;
36
+ /** Whether to display the call button below the keypad. */
37
+ showCallButton: boolean;
38
+ /** Allow free-text input in the display field (e.g., SIP URIs, vanity letters). */
39
+ allowText: boolean;
40
+ /** Placeholder text shown in the digit display input. */
41
+ placeholder: string;
42
+ protected updated(changed: Map<string, unknown>): void;
43
+ disconnectedCallback(): void;
44
+ private _onDigitPress;
45
+ render(): import("lit-html").TemplateResult<1>;
46
+ }
47
+ declare global {
48
+ interface HTMLElementTagNameMap {
49
+ 'sw-call-dialpad': SwCallDialpad;
50
+ }
51
+ }
52
+ //# sourceMappingURL=sw-call-dialpad.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sw-call-dialpad.d.ts","sourceRoot":"","sources":["../../src/components/sw-call-dialpad.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,UAAU,EAAQ,MAAM,KAAK,CAAC;AAMvC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,gCAAgC,CAAC;AAIxC,qBACa,aAAc,SAAQ,UAAU;IAG3C,OAAO,CAAC,UAAU,CAAC,CAAY;IAE/B,2EAA2E;IAC/C,IAAI,CAAC,EAAE,IAAI,CAAC;IAE/B,OAAO,CAAC,aAAa,CAA2B;IAEzD,OAAO,CAAC,oBAAoB,CAAsB;IAElD,2DAA2D;IAE3D,cAAc,UAAS;IAEvB,mFAAmF;IAEnF,SAAS,UAAS;IAElB,yDAAyD;IAEzD,WAAW,SAAkB;IAE7B,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IActD,oBAAoB;IAMpB,OAAO,CAAC,aAAa;IAarB,MAAM;CAWP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iBAAiB,EAAE,aAAa,CAAC;KAClC;CACF"}
@@ -0,0 +1,70 @@
1
+ import { LitElement as n, html as d } from "lit";
2
+ import { state as u, property as p, customElement as h } from "lit/decorators.js";
3
+ import { consume as b } from "@lit/context";
4
+ import { callStateContext as _ } from "../context/call-state-context.js";
5
+ import { getLogger as f } from "@signalwire/js";
6
+ var m = Object.defineProperty, w = Object.getOwnPropertyDescriptor, o = (s, t, c, r) => {
7
+ for (var e = r > 1 ? void 0 : r ? w(t, c) : t, a = s.length - 1, l; a >= 0; a--)
8
+ (l = s[a]) && (e = (r ? l(t, c, e) : l(e)) || e);
9
+ return r && e && m(t, c, e), e;
10
+ };
11
+ const S = f();
12
+ let i = class extends n {
13
+ constructor() {
14
+ super(...arguments), this._directStatus = null, this._directSubscriptions = [], this.showCallButton = !1, this.allowText = !1, this.placeholder = "Enter number";
15
+ }
16
+ updated(s) {
17
+ super.updated(s), s.has("call") && (this._directSubscriptions.forEach((t) => t.unsubscribe()), this._directSubscriptions = [], this._directStatus = null, this.call && this._directSubscriptions.push(
18
+ this.call.status$.subscribe((t) => this._directStatus = t)
19
+ ));
20
+ }
21
+ disconnectedCallback() {
22
+ super.disconnectedCallback(), this._directSubscriptions.forEach((s) => s.unsubscribe()), this._directSubscriptions = [];
23
+ }
24
+ _onDigitPress(s) {
25
+ var e, a;
26
+ const { digit: t } = s.detail;
27
+ if ((this.call ? this._directStatus : (e = this._callState) == null ? void 0 : e.status) !== "connected") return;
28
+ const r = this.call ? (l) => this.call.sendDigits(l) : (a = this._callState) == null ? void 0 : a.sendDigits;
29
+ r == null || r(t).catch((l) => {
30
+ S.error("Failed to send DTMF:", l);
31
+ });
32
+ }
33
+ render() {
34
+ return d`
35
+ <sw-ui-dialpad
36
+ exportparts="container,display,keypad,key,key-pressed,call-button"
37
+ ?show-call-button=${this.showCallButton}
38
+ ?allow-text=${this.allowText}
39
+ placeholder=${this.placeholder}
40
+ @sw-digit-press=${this._onDigitPress}
41
+ ></sw-ui-dialpad>
42
+ `;
43
+ }
44
+ };
45
+ o([
46
+ b({ context: _, subscribe: !0 }),
47
+ u()
48
+ ], i.prototype, "_callState", 2);
49
+ o([
50
+ p({ type: Object })
51
+ ], i.prototype, "call", 2);
52
+ o([
53
+ u()
54
+ ], i.prototype, "_directStatus", 2);
55
+ o([
56
+ p({ type: Boolean, reflect: !0, attribute: "show-call-button" })
57
+ ], i.prototype, "showCallButton", 2);
58
+ o([
59
+ p({ type: Boolean, reflect: !0, attribute: "allow-text" })
60
+ ], i.prototype, "allowText", 2);
61
+ o([
62
+ p({ type: String })
63
+ ], i.prototype, "placeholder", 2);
64
+ i = o([
65
+ h("sw-call-dialpad")
66
+ ], i);
67
+ export {
68
+ i as SwCallDialpad
69
+ };
70
+ //# sourceMappingURL=sw-call-dialpad.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sw-call-dialpad.js","sources":["../../src/components/sw-call-dialpad.ts"],"sourcesContent":["/**\n * Call Dialpad Component\n *\n * Wrapper around `sw-dialpad` that integrates with a Call.\n * When a call is connected, digit presses send DTMF tones.\n * When no call is active, the dial event bubbles up for the parent to handle.\n *\n * Input precedence (most specific wins): `.call` > context.\n *\n * @example\n * ```html\n * <sw-call-dialpad></sw-call-dialpad>\n * <sw-call-dialpad .call=${call}></sw-call-dialpad>\n * <sw-call-dialpad show-call-button @sw-dial=${onDial}></sw-call-dialpad>\n * ```\n *\n * @csspart container - Outer dialpad container.\n * @csspart display - Number / text display field.\n * @csspart keypad - Grid of digit keys.\n * @csspart key - Individual digit button.\n * @csspart key-pressed - Digit button while pressed.\n * @csspart call-button - The call button (when `show-call-button`).\n *\n * @fires sw-digit-press - A digit was pressed. Detail: `{ digit: string, digits: string }`.\n * @fires sw-dial - User pressed the call button. Detail: `{ digits: string }`.\n */\n\nimport { LitElement, html } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\nimport { Subscription } from 'rxjs';\nimport type { CallStatus } from '@signalwire/js';\nimport { callStateContext, type CallState } from '../context/call-state-context.js';\nimport type { Call } from '../types/index.js';\nimport { getLogger } from '@signalwire/js';\nimport './UI/controls/sw-ui-dialpad.js';\n\nconst logger = getLogger();\n\n@customElement('sw-call-dialpad')\nexport class SwCallDialpad extends LitElement {\n @consume({ context: callStateContext, subscribe: true })\n @state()\n private _callState?: CallState;\n\n /** Explicit Call — when set, drives DTMF directly and bypasses context. */\n @property({ type: Object }) call?: Call;\n\n @state() private _directStatus: CallStatus | null = null;\n\n private _directSubscriptions: Subscription[] = [];\n\n /** Whether to display the call button below the keypad. */\n @property({ type: Boolean, reflect: true, attribute: 'show-call-button' })\n showCallButton = false;\n\n /** Allow free-text input in the display field (e.g., SIP URIs, vanity letters). */\n @property({ type: Boolean, reflect: true, attribute: 'allow-text' })\n allowText = false;\n\n /** Placeholder text shown in the digit display input. */\n @property({ type: String })\n placeholder = 'Enter number';\n\n protected updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('call')) {\n this._directSubscriptions.forEach((s) => s.unsubscribe());\n this._directSubscriptions = [];\n this._directStatus = null;\n if (this.call) {\n this._directSubscriptions.push(\n this.call.status$.subscribe((s) => (this._directStatus = s))\n );\n }\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._directSubscriptions.forEach((s) => s.unsubscribe());\n this._directSubscriptions = [];\n }\n\n private _onDigitPress(e: CustomEvent<{ digit: string; digits: string }>) {\n const { digit } = e.detail;\n const status = this.call ? this._directStatus : this._callState?.status;\n if (status !== 'connected') return;\n\n const send = this.call\n ? (d: string) => this.call!.sendDigits(d)\n : this._callState?.sendDigits;\n send?.(digit).catch((err: unknown) => {\n logger.error('Failed to send DTMF:', err);\n });\n }\n\n render() {\n return html`\n <sw-ui-dialpad\n exportparts=\"container,display,keypad,key,key-pressed,call-button\"\n ?show-call-button=${this.showCallButton}\n ?allow-text=${this.allowText}\n placeholder=${this.placeholder}\n @sw-digit-press=${this._onDigitPress}\n ></sw-ui-dialpad>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-call-dialpad': SwCallDialpad;\n }\n}\n"],"names":["logger","getLogger","SwCallDialpad","LitElement","changed","s","e","digit","_a","send","d","_b","err","html","__decorateClass","consume","callStateContext","state","property","customElement"],"mappings":";;;;;;;;;;AAqCA,MAAMA,IAASC,EAAA;AAGR,IAAMC,IAAN,cAA4BC,EAAW;AAAA,EAAvC,cAAA;AAAA,UAAA,GAAA,SAAA,GAQI,KAAQ,gBAAmC,MAEpD,KAAQ,uBAAuC,CAAA,GAI/C,KAAA,iBAAiB,IAIjB,KAAA,YAAY,IAIZ,KAAA,cAAc;AAAA,EAAA;AAAA,EAEJ,QAAQC,GAAqC;AACrD,UAAM,QAAQA,CAAO,GACjBA,EAAQ,IAAI,MAAM,MACpB,KAAK,qBAAqB,QAAQ,CAACC,MAAMA,EAAE,aAAa,GACxD,KAAK,uBAAuB,CAAA,GAC5B,KAAK,gBAAgB,MACjB,KAAK,QACP,KAAK,qBAAqB;AAAA,MACxB,KAAK,KAAK,QAAQ,UAAU,CAACA,MAAO,KAAK,gBAAgBA,CAAE;AAAA,IAAA;AAAA,EAInE;AAAA,EAEA,uBAAuB;AACrB,UAAM,qBAAA,GACN,KAAK,qBAAqB,QAAQ,CAAC,MAAM,EAAE,aAAa,GACxD,KAAK,uBAAuB,CAAA;AAAA,EAC9B;AAAA,EAEQ,cAAcC,GAAmD;;AACvE,UAAM,EAAE,OAAAC,MAAUD,EAAE;AAEpB,SADe,KAAK,OAAO,KAAK,iBAAgBE,IAAA,KAAK,eAAL,gBAAAA,EAAiB,YAClD,YAAa;AAE5B,UAAMC,IAAO,KAAK,OACd,CAACC,MAAc,KAAK,KAAM,WAAWA,CAAC,KACtCC,IAAA,KAAK,eAAL,gBAAAA,EAAiB;AACrB,IAAAF,KAAA,QAAAA,EAAOF,GAAO,MAAM,CAACK,MAAiB;AACpC,MAAAZ,EAAO,MAAM,wBAAwBY,CAAG;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,SAAS;AACP,WAAOC;AAAA;AAAA;AAAA,4BAGiB,KAAK,cAAc;AAAA,sBACzB,KAAK,SAAS;AAAA,sBACd,KAAK,WAAW;AAAA,0BACZ,KAAK,aAAa;AAAA;AAAA;AAAA,EAG1C;AACF;AAjEUC,EAAA;AAAA,EAFPC,EAAQ,EAAE,SAASC,GAAkB,WAAW,IAAM;AAAA,EACtDC,EAAA;AAAM,GAFIf,EAGH,WAAA,cAAA,CAAA;AAGoBY,EAAA;AAAA,EAA3BI,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GANfhB,EAMiB,WAAA,QAAA,CAAA;AAEXY,EAAA;AAAA,EAAhBG,EAAA;AAAM,GARIf,EAQM,WAAA,iBAAA,CAAA;AAMjBY,EAAA;AAAA,EADCI,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,oBAAoB;AAAA,GAb9DhB,EAcX,WAAA,kBAAA,CAAA;AAIAY,EAAA;AAAA,EADCI,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,cAAc;AAAA,GAjBxDhB,EAkBX,WAAA,aAAA,CAAA;AAIAY,EAAA;AAAA,EADCI,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GArBfhB,EAsBX,WAAA,eAAA,CAAA;AAtBWA,IAANY,EAAA;AAAA,EADNK,EAAc,iBAAiB;AAAA,GACnBjB,CAAA;"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Call Media Component
3
+ *
4
+ * Renders the remote video stream with aspect-ratio-aware sizing.
5
+ *
6
+ * Input precedence (most specific wins): `.stream` > `.call` > context.
7
+ *
8
+ * @example
9
+ * ```html
10
+ * <!-- Inside a context provider (sw-call-widget): -->
11
+ * <sw-call-media></sw-call-media>
12
+ *
13
+ * <!-- With an explicit Call: -->
14
+ * <sw-call-media .call=${call}></sw-call-media>
15
+ *
16
+ * <!-- With a raw remote stream: -->
17
+ * <sw-call-media .stream=${remoteStream}></sw-call-media>
18
+ * ```
19
+ *
20
+ * @csspart container - Outer container that holds the video and overlay layers.
21
+ * @csspart video - The `<video>` element rendering the remote stream.
22
+ *
23
+ * @slot - Default slot for overlay layers (e.g. `<sw-self-media>`, `<sw-participants>`).
24
+ */
25
+ import { LitElement } from 'lit';
26
+ import type { Call } from '../types/index.js';
27
+ export declare class SwCallMedia extends LitElement {
28
+ static styles: import("lit").CSSResult;
29
+ /**
30
+ * Explicit Call — when set, subscribes directly to its observables instead
31
+ * of relying on context. Overridden by `.stream` if both are set.
32
+ */
33
+ call?: Call;
34
+ /**
35
+ * Explicit remote MediaStream — highest precedence. Bypasses both `.call`
36
+ * and context. Useful for raw rendering with no SDK at all.
37
+ */
38
+ stream: MediaStream | null;
39
+ private _callState?;
40
+ private _devicesState?;
41
+ private _remoteStreamValue;
42
+ private _lastTrackSignature;
43
+ private _subscriptions;
44
+ private _resizeObserver?;
45
+ private _videoResizeHandler?;
46
+ private _windowResizeHandler?;
47
+ private _videoElement?;
48
+ private _paddingWrapper?;
49
+ connectedCallback(): void;
50
+ protected updated(changedProperties: Map<string, unknown>): void;
51
+ disconnectedCallback(): void;
52
+ protected firstUpdated(): void;
53
+ private _setupDirectSubscriptions;
54
+ private _computeTrackSignature;
55
+ private _cleanupDirectSubscriptions;
56
+ private _applySinkId;
57
+ private _setupResizeObserver;
58
+ private _recalculateDimensions;
59
+ private _cleanupResizeObserver;
60
+ private _cleanupVideoElement;
61
+ render(): import("lit-html").TemplateResult<1>;
62
+ }
63
+ declare global {
64
+ interface HTMLElementTagNameMap {
65
+ 'sw-call-media': SwCallMedia;
66
+ }
67
+ }
68
+ //# sourceMappingURL=sw-call-media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sw-call-media.d.ts","sourceRoot":"","sources":["../../src/components/sw-call-media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAI5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAS9C,qBACa,WAAY,SAAQ,UAAU;IACzC,MAAM,CAAC,MAAM,0BAyDX;IAEF;;;OAGG;IACyB,IAAI,CAAC,EAAE,IAAI,CAAC;IAExC;;;OAGG;IAC6B,MAAM,EAAE,WAAW,GAAG,IAAI,CAAQ;IAIlE,OAAO,CAAC,UAAU,CAAC,CAAY;IAI/B,OAAO,CAAC,aAAa,CAAC,CAAe;IAErC,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,mBAAmB,CAAM;IACjC,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,eAAe,CAAC,CAAiB;IACzC,OAAO,CAAC,mBAAmB,CAAC,CAAa;IACzC,OAAO,CAAC,oBAAoB,CAAC,CAAa;IAC1C,OAAO,CAAC,aAAa,CAAC,CAAmB;IACzC,OAAO,CAAC,eAAe,CAAC,CAAiB;IAIzC,iBAAiB;IASjB,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IA4ChE,oBAAoB;IAOpB,SAAS,CAAC,YAAY,IAAI,IAAI;IAW9B,OAAO,CAAC,yBAAyB;IAiBjC,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,2BAA2B;IAOnC,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,oBAAoB;IAwB5B,OAAO,CAAC,sBAAsB;IA6D9B,OAAO,CAAC,sBAAsB;IAgB9B,OAAO,CAAC,oBAAoB;IAO5B,MAAM;CAoBP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,eAAe,EAAE,WAAW,CAAC;KAC9B;CACF"}
@@ -0,0 +1,220 @@
1
+ import { LitElement as V, html as q, css as E } from "lit";
2
+ import { property as b, state as g, customElement as M } from "lit/decorators.js";
3
+ import { consume as w } from "@lit/context";
4
+ import { callStateContext as W } from "../context/call-state-context.js";
5
+ import { devicesContext as $ } from "../context/devices-context.js";
6
+ import { debounce as j } from "../utils/debounce.js";
7
+ import { attachMediaStream as _, waitForVideoReady as L, detachMediaStream as I } from "../utils/video.js";
8
+ import { getLogger as A } from "@signalwire/js";
9
+ var B = Object.defineProperty, X = Object.getOwnPropertyDescriptor, d = (t, e, s, o) => {
10
+ for (var i = o > 1 ? void 0 : o ? X(e, s) : e, a = t.length - 1, r; a >= 0; a--)
11
+ (r = t[a]) && (i = (o ? r(e, s, i) : r(i)) || i);
12
+ return o && i && B(e, s, i), i;
13
+ };
14
+ const Y = A();
15
+ let l = class extends V {
16
+ constructor() {
17
+ super(...arguments), this.stream = null, this._remoteStreamValue = null, this._lastTrackSignature = "", this._subscriptions = [];
18
+ }
19
+ // ── Lifecycle ──────────────────────────────────────────────────────
20
+ connectedCallback() {
21
+ super.connectedCallback(), !this.stream && this.call && this._setupDirectSubscriptions(), this.stream && (this._remoteStreamValue = this.stream, this._lastTrackSignature = this._computeTrackSignature(this.stream));
22
+ }
23
+ updated(t) {
24
+ var e, s, o, i, a;
25
+ if (super.updated(t), t.has("call") && (this._cleanupDirectSubscriptions(), !this.stream && this.call && this._setupDirectSubscriptions()), t.has("stream")) {
26
+ this._cleanupDirectSubscriptions();
27
+ const r = this.stream, n = this._computeTrackSignature(r);
28
+ if (r !== this._remoteStreamValue || n !== this._lastTrackSignature) {
29
+ this._remoteStreamValue = r, this._lastTrackSignature = n;
30
+ const c = (e = this.shadowRoot) == null ? void 0 : e.querySelector("video.mcu-video");
31
+ c && _(c, r);
32
+ }
33
+ }
34
+ if (!this.stream && !this.call && t.has("_callState")) {
35
+ const r = ((s = this._callState) == null ? void 0 : s.remoteStream) ?? null, n = this._computeTrackSignature(r);
36
+ if (r !== this._remoteStreamValue || n !== this._lastTrackSignature) {
37
+ this._remoteStreamValue = r, this._lastTrackSignature = n;
38
+ const c = (o = this.shadowRoot) == null ? void 0 : o.querySelector("video.mcu-video");
39
+ c && _(c, r);
40
+ }
41
+ }
42
+ t.has("_devicesState") && this._applySinkId(((a = (i = this._devicesState) == null ? void 0 : i.selectedAudioOutput) == null ? void 0 : a.deviceId) ?? "");
43
+ }
44
+ disconnectedCallback() {
45
+ super.disconnectedCallback(), this._cleanupDirectSubscriptions(), this._cleanupResizeObserver(), this._cleanupVideoElement();
46
+ }
47
+ firstUpdated() {
48
+ var e;
49
+ const t = (e = this.shadowRoot) == null ? void 0 : e.querySelector("video.mcu-video");
50
+ t && L(t).then(() => {
51
+ this.isConnected && this._setupResizeObserver();
52
+ });
53
+ }
54
+ // ── Direct call subscriptions (legacy / standalone) ────────────────
55
+ _setupDirectSubscriptions() {
56
+ this.call && this._subscriptions.push(
57
+ this.call.remoteStream$.subscribe((t) => {
58
+ var o;
59
+ const e = this._computeTrackSignature(t);
60
+ if (t === this._remoteStreamValue && e === this._lastTrackSignature)
61
+ return;
62
+ this._remoteStreamValue = t, this._lastTrackSignature = e, this.requestUpdate();
63
+ const s = (o = this.shadowRoot) == null ? void 0 : o.querySelector("video.mcu-video");
64
+ s && _(s, t);
65
+ })
66
+ );
67
+ }
68
+ _computeTrackSignature(t) {
69
+ return t ? t.getTracks().map((e) => `${e.kind}:${e.id}`).sort().join("|") : "";
70
+ }
71
+ _cleanupDirectSubscriptions() {
72
+ this._subscriptions.forEach((t) => t.unsubscribe()), this._subscriptions = [];
73
+ }
74
+ // ── Audio output ───────────────────────────────────────────────────
75
+ _applySinkId(t) {
76
+ var s;
77
+ const e = (s = this.shadowRoot) == null ? void 0 : s.querySelector("video.mcu-video");
78
+ e != null && e.setSinkId && e.setSinkId(t).catch((o) => {
79
+ Y.error("[SwCallMedia] Failed to set audio output device:", o);
80
+ });
81
+ }
82
+ // ── Resize / dimension management ──────────────────────────────────
83
+ _setupResizeObserver() {
84
+ var s, o;
85
+ const t = (s = this.shadowRoot) == null ? void 0 : s.querySelector("video.mcu-video"), e = (o = this.shadowRoot) == null ? void 0 : o.querySelector(".padding-wrapper");
86
+ !t || !e || (this._videoElement = t, this._paddingWrapper = e, this._resizeObserver = new ResizeObserver(
87
+ j(() => this._recalculateDimensions(), 50)
88
+ ), this._resizeObserver.observe(this), this._videoResizeHandler = () => this._recalculateDimensions(), t.addEventListener("resize", this._videoResizeHandler), this._windowResizeHandler = () => {
89
+ requestAnimationFrame(() => this._recalculateDimensions());
90
+ }, window.addEventListener("resize", this._windowResizeHandler), this._recalculateDimensions());
91
+ }
92
+ _recalculateDimensions() {
93
+ const t = this._videoElement, e = this._paddingWrapper;
94
+ if (!t || !e) return;
95
+ if (!t.videoWidth || !t.videoHeight) {
96
+ e.style.width = "100%", e.style.height = "100%", e.style.paddingBottom = "0", e.style.transform = "none";
97
+ return;
98
+ }
99
+ const s = window.innerWidth, o = window.innerHeight, i = this.getBoundingClientRect(), a = i.width, r = i.height;
100
+ if (a <= 0 || r <= 0) return;
101
+ const n = Math.min(1, (s - i.left) / a), c = Math.min(1, (o - i.top) / r), f = Math.min(n, c), p = a * f, m = r * f;
102
+ if (p <= 0 || m <= 0) return;
103
+ const v = t.videoWidth / t.videoHeight, S = p / m;
104
+ let h, u;
105
+ v > S ? (h = p, u = h / v) : (u = m, h = u * v);
106
+ const y = Math.max(0, i.left), R = Math.max(0, i.top), z = Math.min(s, i.right), k = Math.min(o, i.bottom), x = (y + z) / 2, O = (R + k) / 2, H = i.left + a / 2, C = i.top + r / 2, T = x - H, D = O - C;
107
+ e.style.width = `${h}px`, e.style.height = `${u}px`, e.style.paddingBottom = "0", e.style.transform = `translate(${T}px, ${D}px)`;
108
+ }
109
+ _cleanupResizeObserver() {
110
+ var e;
111
+ this._resizeObserver && (this._resizeObserver.disconnect(), this._resizeObserver = void 0);
112
+ const t = (e = this.shadowRoot) == null ? void 0 : e.querySelector("video.mcu-video");
113
+ t && this._videoResizeHandler && (t.removeEventListener("resize", this._videoResizeHandler), this._videoResizeHandler = void 0), this._windowResizeHandler && (window.removeEventListener("resize", this._windowResizeHandler), this._windowResizeHandler = void 0);
114
+ }
115
+ _cleanupVideoElement() {
116
+ var e;
117
+ const t = (e = this.shadowRoot) == null ? void 0 : e.querySelector("video.mcu-video");
118
+ t && I(t);
119
+ }
120
+ // ── Render ─────────────────────────────────────────────────────────
121
+ render() {
122
+ return q`
123
+ <div class="mcu-content" part="container">
124
+ <div class="padding-wrapper">
125
+ <div class="mcu-wrapper">
126
+ <video
127
+ class="mcu-video"
128
+ part="video"
129
+ autoplay
130
+ playsinline
131
+ .srcObject=${this._remoteStreamValue}
132
+ ></video>
133
+ </div>
134
+ <div class="mcu-layers">
135
+ <slot></slot>
136
+ </div>
137
+ </div>
138
+ </div>
139
+ `;
140
+ }
141
+ };
142
+ l.styles = E`
143
+ :host {
144
+ display: block;
145
+ width: 100%;
146
+ height: 100%;
147
+ overflow: hidden;
148
+ }
149
+
150
+ .mcu-content {
151
+ position: relative;
152
+ width: 100%;
153
+ height: 100%;
154
+ margin: 0 auto;
155
+ display: flex;
156
+ align-items: center;
157
+ justify-content: center;
158
+ background-color: var(--bg-page, #0e0e18);
159
+ overflow: hidden;
160
+ }
161
+
162
+ .padding-wrapper {
163
+ position: relative;
164
+ max-width: 100%;
165
+ max-height: 100%;
166
+ transition:
167
+ width 0.3s ease,
168
+ height 0.3s ease;
169
+ }
170
+
171
+ /* Outer rounding is owned by sw-ui-call-layout's :host border-radius +
172
+ overflow:hidden. Rounding here too carves a notch out of the right
173
+ edge of the video cell that exposes whatever sits behind the widget
174
+ (page / modal backdrop) as a black sliver in light mode. */
175
+ .mcu-wrapper {
176
+ position: absolute;
177
+ top: 0;
178
+ left: 0;
179
+ right: 0;
180
+ bottom: 0;
181
+ overflow: hidden;
182
+ }
183
+
184
+ .mcu-video {
185
+ width: 100%;
186
+ height: 100%;
187
+ display: block;
188
+ object-fit: contain;
189
+ }
190
+
191
+ .mcu-layers {
192
+ position: absolute;
193
+ top: 0;
194
+ left: 0;
195
+ width: 100%;
196
+ height: 100%;
197
+ pointer-events: none;
198
+ }
199
+ `;
200
+ d([
201
+ b({ type: Object })
202
+ ], l.prototype, "call", 2);
203
+ d([
204
+ b({ attribute: !1 })
205
+ ], l.prototype, "stream", 2);
206
+ d([
207
+ w({ context: W, subscribe: !0 }),
208
+ g()
209
+ ], l.prototype, "_callState", 2);
210
+ d([
211
+ w({ context: $, subscribe: !0 }),
212
+ g()
213
+ ], l.prototype, "_devicesState", 2);
214
+ l = d([
215
+ M("sw-call-media")
216
+ ], l);
217
+ export {
218
+ l as SwCallMedia
219
+ };
220
+ //# sourceMappingURL=sw-call-media.js.map