@signalwire/web-components 1.0.0-dev-20260428141127 → 1.0.0-dev-20260428212324

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 (349) 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} +39 -7
  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} +13 -21
  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 +2409 -1659
  239. package/dist/embed/signalwire-web-components-embed.iife.js.map +1 -1
  240. package/dist/embed/signalwire-web-components-embed.umd.cjs +2409 -1659
  241. package/dist/embed/signalwire-web-components-embed.umd.cjs.map +1 -1
  242. package/dist/embed.d.ts +1 -1
  243. package/dist/embed.d.ts.map +1 -1
  244. package/dist/index.d.ts +18 -12
  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 +55 -26
  273. package/dist/theme.css.js +5 -0
  274. package/dist/theme.css.js.map +1 -0
  275. package/dist/utils/index.d.ts +2 -0
  276. package/dist/utils/index.d.ts.map +1 -1
  277. package/dist/utils/prism.d.ts +4 -0
  278. package/dist/utils/prism.d.ts.map +1 -0
  279. package/dist/utils/prism.js +34 -0
  280. package/dist/utils/prism.js.map +1 -0
  281. package/dist/utils/theme-loader.d.ts +11 -0
  282. package/dist/utils/theme-loader.d.ts.map +1 -0
  283. package/dist/utils/theme-loader.js +17 -0
  284. package/dist/utils/theme-loader.js.map +1 -0
  285. package/dist/utils/transcriptToMarkdown.d.ts +14 -0
  286. package/dist/utils/transcriptToMarkdown.d.ts.map +1 -0
  287. package/dist/utils/transcriptToMarkdown.js +59 -0
  288. package/dist/utils/transcriptToMarkdown.js.map +1 -0
  289. package/dist/utils/use-google-font.d.ts +18 -0
  290. package/dist/utils/use-google-font.d.ts.map +1 -0
  291. package/dist/utils/use-google-font.js +12 -0
  292. package/dist/utils/use-google-font.js.map +1 -0
  293. package/dist/utils/user-variables.d.ts +20 -0
  294. package/dist/utils/user-variables.d.ts.map +1 -0
  295. package/dist/utils/user-variables.js +37 -0
  296. package/dist/utils/user-variables.js.map +1 -0
  297. package/package.json +99 -39
  298. package/dist/components/audio-level.d.ts.map +0 -1
  299. package/dist/components/audio-level.js +0 -203
  300. package/dist/components/audio-level.js.map +0 -1
  301. package/dist/components/call-controls.d.ts +0 -183
  302. package/dist/components/call-controls.d.ts.map +0 -1
  303. package/dist/components/call-controls.js +0 -606
  304. package/dist/components/call-controls.js.map +0 -1
  305. package/dist/components/call-media.d.ts +0 -118
  306. package/dist/components/call-media.d.ts.map +0 -1
  307. package/dist/components/call-media.js +0 -219
  308. package/dist/components/call-media.js.map +0 -1
  309. package/dist/components/call-status.d.ts +0 -83
  310. package/dist/components/call-status.d.ts.map +0 -1
  311. package/dist/components/call-status.js +0 -255
  312. package/dist/components/call-status.js.map +0 -1
  313. package/dist/components/click-to-call.d.ts +0 -151
  314. package/dist/components/click-to-call.d.ts.map +0 -1
  315. package/dist/components/click-to-call.js +0 -428
  316. package/dist/components/click-to-call.js.map +0 -1
  317. package/dist/components/device-selector.d.ts +0 -238
  318. package/dist/components/device-selector.d.ts.map +0 -1
  319. package/dist/components/device-selector.js +0 -685
  320. package/dist/components/device-selector.js.map +0 -1
  321. package/dist/components/dialpad.d.ts +0 -74
  322. package/dist/components/dialpad.d.ts.map +0 -1
  323. package/dist/components/dialpad.js +0 -372
  324. package/dist/components/dialpad.js.map +0 -1
  325. package/dist/components/directory.d.ts.map +0 -1
  326. package/dist/components/directory.js +0 -503
  327. package/dist/components/directory.js.map +0 -1
  328. package/dist/components/example-button.d.ts +0 -21
  329. package/dist/components/example-button.d.ts.map +0 -1
  330. package/dist/components/example-button.js +0 -74
  331. package/dist/components/example-button.js.map +0 -1
  332. package/dist/components/participant-controls.d.ts +0 -123
  333. package/dist/components/participant-controls.d.ts.map +0 -1
  334. package/dist/components/participant-controls.js +0 -468
  335. package/dist/components/participant-controls.js.map +0 -1
  336. package/dist/components/participants.d.ts +0 -120
  337. package/dist/components/participants.d.ts.map +0 -1
  338. package/dist/components/participants.js +0 -394
  339. package/dist/components/participants.js.map +0 -1
  340. package/dist/components/self-media.d.ts +0 -78
  341. package/dist/components/self-media.d.ts.map +0 -1
  342. package/dist/components/self-media.js +0 -129
  343. package/dist/components/self-media.js.map +0 -1
  344. package/dist/context/call-context.d.ts +0 -13
  345. package/dist/context/call-context.d.ts.map +0 -1
  346. package/dist/context/call-context.js +0 -6
  347. package/dist/context/call-context.js.map +0 -1
  348. package/dist/types/index.js +0 -12
  349. package/dist/types/index.js.map +0 -1
@@ -0,0 +1,125 @@
1
+ import { ContextProvider as a } from "@lit/context";
2
+ import { callStateContext as c } from "./call-state-context.js";
3
+ const e = () => Promise.resolve(), i = () => {
4
+ }, r = Object.freeze({
5
+ id: "",
6
+ direction: "outbound",
7
+ to: void 0,
8
+ status: "new",
9
+ recording: !1,
10
+ streaming: !1,
11
+ locked: !1,
12
+ raiseHandPriority: !1,
13
+ meta: Object.freeze({}),
14
+ participants: Object.freeze([]),
15
+ self: null,
16
+ remoteStream: null,
17
+ localStream: null,
18
+ mediaDirections: Object.freeze({ audio: "inactive", video: "inactive" }),
19
+ layout: void 0,
20
+ layouts: Object.freeze([]),
21
+ layoutLayers: Object.freeze([]),
22
+ address: void 0,
23
+ capabilities: Object.freeze([]),
24
+ hangup: e,
25
+ toggleLock: e,
26
+ toggleHold: e,
27
+ setLayout: e,
28
+ startRecording: e,
29
+ startStreaming: e,
30
+ sendDigits: e,
31
+ answer: i,
32
+ reject: i
33
+ });
34
+ class u {
35
+ constructor(t) {
36
+ this._subscriptions = [], this._state = { ...r }, this._batching = !1, this._provider = new a(t, {
37
+ context: c,
38
+ initialValue: this._state
39
+ }), t.addController(this);
40
+ }
41
+ hostConnected() {
42
+ }
43
+ hostDisconnected() {
44
+ this.disconnect();
45
+ }
46
+ connect(t) {
47
+ this.disconnect(), this._batching = !0, this._patch({
48
+ id: t.id,
49
+ direction: t.direction,
50
+ to: t.to
51
+ }), this._patch({
52
+ hangup: () => t.hangup(),
53
+ toggleLock: () => t.toggleLock(),
54
+ toggleHold: () => t.toggleHold(),
55
+ setLayout: (s, o = {}) => t.setLayout(s, o),
56
+ startRecording: () => t.startRecording(),
57
+ startStreaming: () => t.startStreaming(),
58
+ sendDigits: (s) => t.sendDigits(s),
59
+ answer: () => t.answer(),
60
+ reject: () => t.reject()
61
+ }), this._subscriptions = [
62
+ t.status$.subscribe(
63
+ (s) => this._patch({ status: s })
64
+ ),
65
+ t.recording$.subscribe(
66
+ (s) => this._patch({ recording: s })
67
+ ),
68
+ t.streaming$.subscribe(
69
+ (s) => this._patch({ streaming: s })
70
+ ),
71
+ t.locked$.subscribe(
72
+ (s) => this._patch({ locked: s })
73
+ ),
74
+ t.raiseHandPriority$.subscribe(
75
+ (s) => this._patch({ raiseHandPriority: s })
76
+ ),
77
+ t.meta$.subscribe(
78
+ (s) => this._patch({ meta: s })
79
+ ),
80
+ t.participants$.subscribe(
81
+ (s) => this._patch({ participants: s })
82
+ ),
83
+ t.self$.subscribe(
84
+ (s) => this._patch({ self: s })
85
+ ),
86
+ t.remoteStream$.subscribe(
87
+ (s) => this._patch({ remoteStream: s })
88
+ ),
89
+ t.localStream$.subscribe(
90
+ (s) => this._patch({ localStream: s })
91
+ ),
92
+ t.mediaDirections$.subscribe(
93
+ (s) => this._patch({ mediaDirections: s })
94
+ ),
95
+ t.layout$.subscribe(
96
+ (s) => this._patch({ layout: s })
97
+ ),
98
+ t.layouts$.subscribe(
99
+ (s) => this._patch({ layouts: s })
100
+ ),
101
+ t.layoutLayers$.subscribe(
102
+ (s) => this._patch({ layoutLayers: s })
103
+ ),
104
+ t.address$.subscribe(
105
+ (s) => this._patch({ address: s })
106
+ ),
107
+ t.capabilities$.subscribe(
108
+ (s) => this._patch({ capabilities: s })
109
+ )
110
+ ], this._batching = !1, this._publish();
111
+ }
112
+ disconnect() {
113
+ this._subscriptions.forEach((t) => t.unsubscribe()), this._subscriptions = [], this._patch({ ...r });
114
+ }
115
+ _patch(t) {
116
+ this._state = { ...this._state, ...t }, this._batching || this._publish();
117
+ }
118
+ _publish() {
119
+ this._provider.setValue(this._state);
120
+ }
121
+ }
122
+ export {
123
+ u as CallStateContextController
124
+ };
125
+ //# sourceMappingURL=CallStateContextController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CallStateContextController.js","sources":["../../src/context/CallStateContextController.ts"],"sourcesContent":["import { ContextProvider } from '@lit/context';\nimport type { Subscription } from 'rxjs';\nimport type { Call } from '../types/index.js';\nimport { callStateContext } from './call-state-context.js';\nimport type { CallState } from './call-state-context.js';\nimport type { ContextHost } from './types.js';\n\nconst noop = () => Promise.resolve();\nconst noopVoid = () => {};\n\n// Frozen so accidental mutation of the shared empty arrays/objects\n// (`meta`, `participants`, `layouts`, `layoutLayers`, `capabilities`) throws\n// instead of silently corrupting every consumer that read the empty state.\nconst EMPTY_CALL_STATE: CallState = Object.freeze({\n id: '',\n direction: 'outbound',\n to: undefined,\n status: 'new',\n recording: false,\n streaming: false,\n locked: false,\n raiseHandPriority: false,\n meta: Object.freeze({}) as Record<string, unknown>,\n participants: Object.freeze([]) as unknown as CallState['participants'],\n self: null,\n remoteStream: null,\n localStream: null,\n mediaDirections: Object.freeze({ audio: 'inactive', video: 'inactive' }) as CallState['mediaDirections'],\n layout: undefined,\n layouts: Object.freeze([]) as unknown as string[],\n layoutLayers: Object.freeze([]) as unknown as CallState['layoutLayers'],\n address: undefined,\n capabilities: Object.freeze([]) as unknown as string[],\n hangup: noop,\n toggleLock: noop,\n toggleHold: noop,\n setLayout: noop,\n startRecording: noop,\n startStreaming: noop,\n sendDigits: noop,\n answer: noopVoid,\n reject: noopVoid,\n}) as CallState;\n\n/**\n * ReactiveController that flattens all Call observables into a plain CallState\n * object provided via Lit context. Consumer components get automatic re-renders\n * on any change. \n *\n * Usage in a provider component:\n *\n * private _callState = new CallStateContextController(this);\n *\n * // When a call arrives:\n * this._callState.connect(call);\n *\n * // When the call ends:\n * this._callState.disconnect();\n */\nexport class CallStateContextController {\n private _provider: ContextProvider<typeof callStateContext>;\n private _subscriptions: Subscription[] = [];\n private _state: CallState = { ...EMPTY_CALL_STATE };\n private _batching = false;\n\n constructor(host: ContextHost) {\n this._provider = new ContextProvider(host, {\n context: callStateContext,\n initialValue: this._state,\n });\n host.addController(this);\n }\n\n hostConnected() {}\n hostDisconnected() {\n this.disconnect();\n }\n\n connect(call: Call) {\n this.disconnect();\n\n // Batch the synchronous initial-replay storm: each BehaviorSubject below\n // emits its current value on subscribe, which would otherwise trigger\n // ~16 consecutive setValue() calls (and consumer re-renders) within a\n // single microtask. Collect them and publish once at the end.\n this._batching = true;\n\n // Static identity — set once, never changes for the lifetime of this call\n this._patch({\n id: call.id,\n direction: call.direction,\n to: call.to,\n });\n\n // Wire up actions — bound to this call instance\n this._patch({\n hangup: () => call.hangup(),\n toggleLock: () => call.toggleLock(),\n toggleHold: () => call.toggleHold(),\n setLayout: (layout, positions = {}) => call.setLayout(layout, positions),\n startRecording: () => call.startRecording(),\n startStreaming: () => call.startStreaming(),\n sendDigits: (digits) => call.sendDigits(digits),\n answer: () => call.answer(),\n reject: () => call.reject(),\n });\n\n this._subscriptions = [\n call.status$.subscribe((status) =>\n this._patch({ status })\n ),\n call.recording$.subscribe((recording) =>\n this._patch({ recording })\n ),\n call.streaming$.subscribe((streaming) =>\n this._patch({ streaming })\n ),\n call.locked$.subscribe((locked) =>\n this._patch({ locked })\n ),\n call.raiseHandPriority$.subscribe((raiseHandPriority) =>\n this._patch({ raiseHandPriority })\n ),\n call.meta$.subscribe((meta) =>\n this._patch({ meta })\n ),\n call.participants$.subscribe((participants) =>\n this._patch({ participants })\n ),\n call.self$.subscribe((self) =>\n this._patch({ self })\n ),\n call.remoteStream$.subscribe((remoteStream) =>\n this._patch({ remoteStream })\n ),\n call.localStream$.subscribe((localStream) =>\n this._patch({ localStream })\n ),\n call.mediaDirections$.subscribe((mediaDirections) =>\n this._patch({ mediaDirections })\n ),\n call.layout$.subscribe((layout) =>\n this._patch({ layout })\n ),\n call.layouts$.subscribe((layouts) =>\n this._patch({ layouts })\n ),\n call.layoutLayers$.subscribe((layoutLayers) =>\n this._patch({ layoutLayers })\n ),\n call.address$.subscribe((address) =>\n this._patch({ address })\n ),\n call.capabilities$.subscribe((capabilities) =>\n this._patch({ capabilities })\n ),\n ];\n\n this._batching = false;\n this._publish();\n }\n\n disconnect() {\n this._subscriptions.forEach((s) => s.unsubscribe());\n this._subscriptions = [];\n this._patch({ ...EMPTY_CALL_STATE });\n }\n\n private _patch(partial: Partial<CallState>) {\n this._state = { ...this._state, ...partial };\n if (!this._batching) this._publish();\n }\n\n private _publish() {\n this._provider.setValue(this._state);\n }\n}\n"],"names":["noop","noopVoid","EMPTY_CALL_STATE","CallStateContextController","host","ContextProvider","callStateContext","call","layout","positions","digits","status","recording","streaming","locked","raiseHandPriority","meta","participants","self","remoteStream","localStream","mediaDirections","layouts","layoutLayers","address","capabilities","s","partial"],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { DeviceController, Call } from '../types/index.js';
2
+ import type { ContextHost } from './types.js';
3
+ /**
4
+ * ReactiveController that bridges DeviceController + Call into a clean
5
+ * DevicesState provided via Lit context. Consumers need zero RxJS.
6
+ *
7
+ * Usage in a provider component:
8
+ *
9
+ * private _devices = new DevicesContextController(this);
10
+ *
11
+ * // Wire up devices (can be done before a call exists):
12
+ * this._devices.connectDevices(deviceController);
13
+ *
14
+ * // Wire up call (mute state, server-driven changes):
15
+ * this._devices.connectCall(call);
16
+ *
17
+ * // Tear down individually or all at once:
18
+ * this._devices.disconnectCall();
19
+ * this._devices.disconnect();
20
+ */
21
+ export declare class DevicesContextController {
22
+ private _provider;
23
+ private _dc;
24
+ private _deviceSubs;
25
+ private _callSubs;
26
+ private _state;
27
+ constructor(host: ContextHost);
28
+ hostConnected(): void;
29
+ hostDisconnected(): void;
30
+ connectDevices(dc: DeviceController): void;
31
+ /** Force device re-enumeration (call after getUserMedia grants permission). */
32
+ refreshDevices(): void;
33
+ connectCall(call: Call): void;
34
+ disconnectCall(): void;
35
+ disconnect(): void;
36
+ private _patch;
37
+ }
38
+ //# sourceMappingURL=DevicesContextController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevicesContextController.d.ts","sourceRoot":"","sources":["../../src/context/DevicesContextController.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAGhE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA8B9C;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,wBAAwB;IACnC,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,GAAG,CAAiC;IAC5C,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,MAAM,CAAoC;gBAEtC,IAAI,EAAE,WAAW;IAQ7B,aAAa;IACb,gBAAgB;IAMhB,cAAc,CAAC,EAAE,EAAE,gBAAgB;IAkCnC,+EAA+E;IAC/E,cAAc,IAAI,IAAI;IAQtB,WAAW,CAAC,IAAI,EAAE,IAAI;IAgDtB,cAAc;IAqBd,UAAU;IASV,OAAO,CAAC,MAAM;CAIf"}
@@ -0,0 +1,124 @@
1
+ import { ContextProvider as h } from "@lit/context";
2
+ import { switchMap as o, of as u } from "rxjs";
3
+ import { devicesContext as b } from "./devices-context.js";
4
+ const s = () => Promise.resolve(), c = Object.freeze({
5
+ audioInputDevices: Object.freeze([]),
6
+ audioOutputDevices: Object.freeze([]),
7
+ videoInputDevices: Object.freeze([]),
8
+ selectedAudioInput: null,
9
+ selectedAudioOutput: null,
10
+ selectedVideoInput: null,
11
+ audioMuted: !1,
12
+ videoMuted: !1,
13
+ speakerMuted: !1,
14
+ selectAudioInput: () => {
15
+ },
16
+ selectAudioOutput: () => {
17
+ },
18
+ selectVideoInput: () => {
19
+ },
20
+ toggleAudioMute: s,
21
+ toggleVideoMute: s,
22
+ toggleSpeakerMute: s,
23
+ echoCancellation: !0,
24
+ autoGain: !0,
25
+ noiseSuppression: !0,
26
+ toggleEchoCancellation: s,
27
+ toggleAutoGain: s,
28
+ toggleNoiseSuppression: s
29
+ });
30
+ class S {
31
+ constructor(t) {
32
+ this._dc = null, this._deviceSubs = [], this._callSubs = [], this._state = { ...c }, this._provider = new h(t, {
33
+ context: b,
34
+ initialValue: this._state
35
+ }), t.addController(this);
36
+ }
37
+ hostConnected() {
38
+ }
39
+ hostDisconnected() {
40
+ this.disconnect();
41
+ }
42
+ // ── Device controller ───────────────────────────────────────────────────
43
+ connectDevices(t) {
44
+ this._dc = t, this._deviceSubs.forEach((i) => i.unsubscribe()), this._patch({
45
+ selectAudioInput: (i) => t.selectAudioInputDevice(i),
46
+ selectAudioOutput: (i) => t.selectAudioOutputDevice(i),
47
+ selectVideoInput: (i) => t.selectVideoInputDevice(i)
48
+ }), this._deviceSubs = [
49
+ t.audioInputDevices$.subscribe(
50
+ (i) => this._patch({ audioInputDevices: i })
51
+ ),
52
+ t.audioOutputDevices$.subscribe(
53
+ (i) => this._patch({ audioOutputDevices: i })
54
+ ),
55
+ t.videoInputDevices$.subscribe(
56
+ (i) => this._patch({ videoInputDevices: i })
57
+ ),
58
+ t.selectedAudioInputDevice$.subscribe(
59
+ (i) => this._patch({ selectedAudioInput: i })
60
+ ),
61
+ t.selectedAudioOutputDevice$.subscribe(
62
+ (i) => this._patch({ selectedAudioOutput: i })
63
+ ),
64
+ t.selectedVideoInputDevice$.subscribe(
65
+ (i) => this._patch({ selectedVideoInput: i })
66
+ )
67
+ ], t.enableDeviceMonitoring();
68
+ }
69
+ /** Force device re-enumeration (call after getUserMedia grants permission). */
70
+ refreshDevices() {
71
+ this._dc && this._dc.enableDeviceMonitoring();
72
+ }
73
+ // ── Call / mute state ───────────────────────────────────────────────────
74
+ connectCall(t) {
75
+ this.disconnectCall();
76
+ const i = t.self$.subscribe((e) => {
77
+ this._patch({
78
+ toggleAudioMute: e ? () => e.toggleMute() : s,
79
+ toggleVideoMute: e ? () => e.toggleMuteVideo() : s,
80
+ toggleSpeakerMute: e ? () => e.toggleDeaf() : s,
81
+ toggleEchoCancellation: e ? () => e.toggleEchoCancellation() : s,
82
+ toggleAutoGain: e ? () => e.toggleAudioInputAutoGain() : s,
83
+ toggleNoiseSuppression: e ? () => e.toggleNoiseSuppression() : s
84
+ });
85
+ }), n = t.self$.pipe(o((e) => e ? e.audioMuted$ : u(!1))).subscribe((e) => this._patch({ audioMuted: e })), a = t.self$.pipe(o((e) => e ? e.videoMuted$ : u(!1))).subscribe((e) => this._patch({ videoMuted: e })), p = t.self$.pipe(o((e) => e ? e.deaf$ : u(!1))).subscribe((e) => this._patch({ speakerMuted: e })), l = t.self$.pipe(o((e) => e ? e.echoCancellation$ : u(!0))).subscribe((e) => this._patch({ echoCancellation: e })), d = t.self$.pipe(o((e) => e ? e.autoGain$ : u(!0))).subscribe((e) => this._patch({ autoGain: e })), r = t.self$.pipe(o((e) => e ? e.noiseSuppression$ : u(!0))).subscribe((e) => this._patch({ noiseSuppression: e }));
86
+ this._callSubs = [
87
+ i,
88
+ n,
89
+ a,
90
+ p,
91
+ l,
92
+ d,
93
+ r
94
+ ];
95
+ }
96
+ disconnectCall() {
97
+ this._callSubs.forEach((t) => t.unsubscribe()), this._callSubs = [], this._patch({
98
+ audioMuted: !1,
99
+ videoMuted: !1,
100
+ speakerMuted: !1,
101
+ toggleAudioMute: s,
102
+ toggleVideoMute: s,
103
+ toggleSpeakerMute: s,
104
+ echoCancellation: !0,
105
+ autoGain: !0,
106
+ noiseSuppression: !0,
107
+ toggleEchoCancellation: s,
108
+ toggleAutoGain: s,
109
+ toggleNoiseSuppression: s
110
+ });
111
+ }
112
+ // ── Full teardown ───────────────────────────────────────────────────────
113
+ disconnect() {
114
+ this._deviceSubs.forEach((t) => t.unsubscribe()), this._deviceSubs = [], this.disconnectCall(), this._patch({ ...c });
115
+ }
116
+ // ── Internal ────────────────────────────────────────────────────────────
117
+ _patch(t) {
118
+ this._state = { ...this._state, ...t }, this._provider.setValue(this._state);
119
+ }
120
+ }
121
+ export {
122
+ S as DevicesContextController
123
+ };
124
+ //# sourceMappingURL=DevicesContextController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevicesContextController.js","sources":["../../src/context/DevicesContextController.ts"],"sourcesContent":["import { ContextProvider } from '@lit/context';\nimport { type Subscription, switchMap, of } from 'rxjs';\nimport type { DeviceController, Call } from '../types/index.js';\nimport { devicesContext } from './devices-context.js';\nimport type { DevicesState } from './devices-context.js';\nimport type { ContextHost } from './types.js';\n\nconst noop = () => Promise.resolve();\n\n// Frozen so the shared empty-array references can't be mutated by a\n// consumer who reads the empty state.\nconst EMPTY_STATE: DevicesState = Object.freeze({\n audioInputDevices: Object.freeze([]) as unknown as DevicesState['audioInputDevices'],\n audioOutputDevices: Object.freeze([]) as unknown as DevicesState['audioOutputDevices'],\n videoInputDevices: Object.freeze([]) as unknown as DevicesState['videoInputDevices'],\n selectedAudioInput: null,\n selectedAudioOutput: null,\n selectedVideoInput: null,\n audioMuted: false,\n videoMuted: false,\n speakerMuted: false,\n selectAudioInput: () => {},\n selectAudioOutput: () => {},\n selectVideoInput: () => {},\n toggleAudioMute: noop,\n toggleVideoMute: noop,\n toggleSpeakerMute: noop,\n echoCancellation: true,\n autoGain: true,\n noiseSuppression: true,\n toggleEchoCancellation: noop,\n toggleAutoGain: noop,\n toggleNoiseSuppression: noop,\n}) as DevicesState;\n\n/**\n * ReactiveController that bridges DeviceController + Call into a clean\n * DevicesState provided via Lit context. Consumers need zero RxJS.\n *\n * Usage in a provider component:\n *\n * private _devices = new DevicesContextController(this);\n *\n * // Wire up devices (can be done before a call exists):\n * this._devices.connectDevices(deviceController);\n *\n * // Wire up call (mute state, server-driven changes):\n * this._devices.connectCall(call);\n *\n * // Tear down individually or all at once:\n * this._devices.disconnectCall();\n * this._devices.disconnect();\n */\nexport class DevicesContextController {\n private _provider: ContextProvider<typeof devicesContext>;\n private _dc: DeviceController | null = null;\n private _deviceSubs: Subscription[] = [];\n private _callSubs: Subscription[] = [];\n private _state: DevicesState = { ...EMPTY_STATE };\n\n constructor(host: ContextHost) {\n this._provider = new ContextProvider(host, {\n context: devicesContext,\n initialValue: this._state,\n });\n host.addController(this);\n }\n\n hostConnected() {}\n hostDisconnected() {\n this.disconnect();\n }\n\n // ── Device controller ───────────────────────────────────────────────────\n\n connectDevices(dc: DeviceController) {\n this._dc = dc;\n this._deviceSubs.forEach((s) => s.unsubscribe());\n\n this._patch({\n selectAudioInput: (d) => dc.selectAudioInputDevice(d),\n selectAudioOutput: (d) => dc.selectAudioOutputDevice(d),\n selectVideoInput: (d) => dc.selectVideoInputDevice(d),\n });\n\n this._deviceSubs = [\n dc.audioInputDevices$.subscribe((devices) =>\n this._patch({ audioInputDevices: devices })\n ),\n dc.audioOutputDevices$.subscribe((devices) =>\n this._patch({ audioOutputDevices: devices })\n ),\n dc.videoInputDevices$.subscribe((devices) =>\n this._patch({ videoInputDevices: devices })\n ),\n dc.selectedAudioInputDevice$.subscribe((device) =>\n this._patch({ selectedAudioInput: device })\n ),\n dc.selectedAudioOutputDevice$.subscribe((device) =>\n this._patch({ selectedAudioOutput: device })\n ),\n dc.selectedVideoInputDevice$.subscribe((device) =>\n this._patch({ selectedVideoInput: device })\n ),\n ];\n\n dc.enableDeviceMonitoring();\n }\n\n /** Force device re-enumeration (call after getUserMedia grants permission). */\n refreshDevices(): void {\n if (this._dc) {\n this._dc.enableDeviceMonitoring();\n }\n }\n\n // ── Call / mute state ───────────────────────────────────────────────────\n\n connectCall(call: Call) {\n this.disconnectCall();\n\n // Track the current self participant so actions always call the live instance\n const selfSub = call.self$.subscribe((self) => {\n this._patch({\n toggleAudioMute: self ? () => self.toggleMute() : noop,\n toggleVideoMute: self ? () => self.toggleMuteVideo() : noop,\n toggleSpeakerMute: self ? () => self.toggleDeaf() : noop,\n toggleEchoCancellation: self ? () => self.toggleEchoCancellation() : noop,\n toggleAutoGain: self ? () => self.toggleAudioInputAutoGain() : noop,\n toggleNoiseSuppression: self ? () => self.toggleNoiseSuppression() : noop,\n });\n });\n\n // switchMap: re-subscribes to the new self's observables whenever self changes.\n // Falls back to `false` while self is null (e.g. before join, after leave).\n const audioMutedSub = call.self$\n .pipe(switchMap((self) => (self ? self.audioMuted$ : of(false))))\n .subscribe((muted) => this._patch({ audioMuted: muted }));\n\n const videoMutedSub = call.self$\n .pipe(switchMap((self) => (self ? self.videoMuted$ : of(false))))\n .subscribe((muted) => this._patch({ videoMuted: muted }));\n\n const speakerMutedSub = call.self$\n .pipe(switchMap((self) => (self ? self.deaf$ : of(false))))\n .subscribe((deaf) => this._patch({ speakerMuted: deaf }));\n\n const echoCancellationSub = call.self$\n .pipe(switchMap((self) => (self ? self.echoCancellation$ : of(true))))\n .subscribe((enabled) => this._patch({ echoCancellation: enabled }));\n\n const autoGainSub = call.self$\n .pipe(switchMap((self) => (self ? self.autoGain$ : of(true))))\n .subscribe((enabled) => this._patch({ autoGain: enabled }));\n\n const noiseSuppressionSub = call.self$\n .pipe(switchMap((self) => (self ? self.noiseSuppression$ : of(true))))\n .subscribe((enabled) => this._patch({ noiseSuppression: enabled }));\n\n this._callSubs = [\n selfSub,\n audioMutedSub, videoMutedSub, speakerMutedSub,\n echoCancellationSub, autoGainSub, noiseSuppressionSub,\n ];\n }\n\n disconnectCall() {\n this._callSubs.forEach((s) => s.unsubscribe());\n this._callSubs = [];\n this._patch({\n audioMuted: false,\n videoMuted: false,\n speakerMuted: false,\n toggleAudioMute: noop,\n toggleVideoMute: noop,\n toggleSpeakerMute: noop,\n echoCancellation: true,\n autoGain: true,\n noiseSuppression: true,\n toggleEchoCancellation: noop,\n toggleAutoGain: noop,\n toggleNoiseSuppression: noop,\n });\n }\n\n // ── Full teardown ───────────────────────────────────────────────────────\n\n disconnect() {\n this._deviceSubs.forEach((s) => s.unsubscribe());\n this._deviceSubs = [];\n this.disconnectCall();\n this._patch({ ...EMPTY_STATE });\n }\n\n // ── Internal ────────────────────────────────────────────────────────────\n\n private _patch(partial: Partial<DevicesState>) {\n this._state = { ...this._state, ...partial };\n this._provider.setValue(this._state);\n }\n}\n"],"names":["noop","EMPTY_STATE","DevicesContextController","host","ContextProvider","devicesContext","dc","s","d","devices","device","call","selfSub","self","audioMutedSub","switchMap","of","muted","videoMutedSub","speakerMutedSub","deaf","echoCancellationSub","enabled","autoGainSub","noiseSuppressionSub","partial"],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { ReactiveController, LitElement } from 'lit';
2
+ import type { Call } from '../types/index.js';
3
+ import type { TranscriptEntry, TranscriptState } from './transcript-context.js';
4
+ /**
5
+ * Reactive controller that turns AI signaling events from a Call into
6
+ * rendered transcript entries via `transcriptContext`.
7
+ *
8
+ * - `setCall(call)` binds/unbinds the FSM to a call's event streams.
9
+ * - `injectEntry(entry)` appends an externally-sourced entry (e.g. a
10
+ * `display_content` system bubble pushed by `UserEventController`).
11
+ */
12
+ export declare class TranscriptController implements ReactiveController {
13
+ private _host;
14
+ private _provider;
15
+ private _chat;
16
+ private _injected;
17
+ private _subscriptions;
18
+ constructor(host: LitElement);
19
+ hostConnected(): void;
20
+ hostDisconnected(): void;
21
+ setCall(call: Call | undefined): void;
22
+ get state(): TranscriptState;
23
+ /** Append an externally-sourced entry (used by UserEventController for display_content). */
24
+ injectEntry(entry: TranscriptEntry): void;
25
+ private _extractParams;
26
+ private _route;
27
+ private _teardownSubscriptions;
28
+ private static _stripVoiceDirectives;
29
+ private _toTranscriptEntry;
30
+ private _publish;
31
+ }
32
+ //# sourceMappingURL=TranscriptController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TranscriptController.d.ts","sourceRoot":"","sources":["../../src/context/TranscriptController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAG1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAG9C,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AA4BhF;;;;;;;GAOG;AACH,qBAAa,oBAAqB,YAAW,kBAAkB;IAC7D,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,SAAS,CAA4C;IAC7D,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,SAAS,CAAyB;IAC1C,OAAO,CAAC,cAAc,CAAsB;gBAEhC,IAAI,EAAE,UAAU;IAW5B,aAAa,IAAI,IAAI;IAErB,gBAAgB,IAAI,IAAI;IAIxB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI;IAyBrC,IAAI,KAAK,IAAI,eAAe,CAE3B;IAED,4FAA4F;IAC5F,WAAW,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAKzC,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,MAAM;IA0Bd,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAWpC,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,QAAQ;CAQjB"}
@@ -0,0 +1,113 @@
1
+ import { ContextProvider as h } from "@lit/context";
2
+ import { getLogger as p } from "@signalwire/js";
3
+ import { transcriptContext as _ } from "./transcript-context.js";
4
+ import { ChatState as u } from "./chat-state.js";
5
+ const o = p(), b = [
6
+ "ai.partial_result",
7
+ "ai.speech_detect",
8
+ "ai.response_utterance",
9
+ "ai.completion"
10
+ ];
11
+ function d(r) {
12
+ return r.replace(/\s*\{confidence=[\d.]+\}\s*/g, "").trim();
13
+ }
14
+ function n(r) {
15
+ return typeof r == "string" ? r : "";
16
+ }
17
+ class c {
18
+ constructor(t) {
19
+ this._chat = new u(), this._injected = [], this._subscriptions = [], this._host = t, this._provider = new h(t, {
20
+ context: _,
21
+ initialValue: { entries: [] }
22
+ }), this._chat.onUpdate = () => this._publish(), t.addController(this);
23
+ }
24
+ hostConnected() {
25
+ }
26
+ hostDisconnected() {
27
+ this._teardownSubscriptions();
28
+ }
29
+ setCall(t) {
30
+ if (this._teardownSubscriptions(), this._chat.reset(), this._injected = [], this._publish(), !!t)
31
+ for (const e of b) {
32
+ const s = t.subscribe(e).subscribe({
33
+ next: (i) => {
34
+ try {
35
+ this._route(e, this._extractParams(i));
36
+ } catch (a) {
37
+ o.warn(`[TranscriptController] handler for ${e} threw`, a);
38
+ }
39
+ },
40
+ error: (i) => {
41
+ o.warn(`[TranscriptController] subscription error on ${e}`, i);
42
+ }
43
+ });
44
+ this._subscriptions = [...this._subscriptions, s];
45
+ }
46
+ }
47
+ get state() {
48
+ return this._provider.value;
49
+ }
50
+ /** Append an externally-sourced entry (used by UserEventController for display_content). */
51
+ injectEntry(t) {
52
+ this._injected = [...this._injected, t], this._publish();
53
+ }
54
+ _extractParams(t) {
55
+ const e = t.params;
56
+ return e && typeof e == "object" ? e : t;
57
+ }
58
+ _route(t, e) {
59
+ switch (t) {
60
+ case "ai.partial_result":
61
+ this._chat.onUserPartial(n(e.text));
62
+ break;
63
+ case "ai.speech_detect": {
64
+ const s = d(n(e.text));
65
+ this._chat.onUserComplete(s);
66
+ break;
67
+ }
68
+ case "ai.response_utterance": {
69
+ const s = n(e.utterance ?? e.text);
70
+ this._chat.onAiChunk(c._stripVoiceDirectives(s));
71
+ break;
72
+ }
73
+ case "ai.completion": {
74
+ const s = n(e.text);
75
+ this._chat.onAiComplete(
76
+ c._stripVoiceDirectives(s),
77
+ e.type === "barged"
78
+ );
79
+ break;
80
+ }
81
+ }
82
+ }
83
+ _teardownSubscriptions() {
84
+ for (const t of this._subscriptions)
85
+ try {
86
+ t.unsubscribe();
87
+ } catch {
88
+ }
89
+ this._subscriptions = [];
90
+ }
91
+ static _stripVoiceDirectives(t) {
92
+ const e = /\s*~[A-Z]+\(.*?\)-;\s*/i.exec(t);
93
+ if (!e) return t.trim();
94
+ const s = t.slice(0, e.index).trim(), i = t.slice(e.index + e[0].length).trim();
95
+ return (s || i).trim();
96
+ }
97
+ _toTranscriptEntry(t, e) {
98
+ return {
99
+ id: `chat-${e}-${t.speaker}-${t.state}`,
100
+ type: t.speaker === "ai" ? "agent" : "user",
101
+ state: t.state,
102
+ text: t.text
103
+ };
104
+ }
105
+ _publish() {
106
+ const e = [...this._chat.getHistory().map((s, i) => this._toTranscriptEntry(s, i)), ...this._injected];
107
+ this._provider.setValue({ entries: e }), this._host.requestUpdate();
108
+ }
109
+ }
110
+ export {
111
+ c as TranscriptController
112
+ };
113
+ //# sourceMappingURL=TranscriptController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TranscriptController.js","sources":["../../src/context/TranscriptController.ts"],"sourcesContent":["import type { ReactiveController, LitElement } from 'lit';\nimport { ContextProvider } from '@lit/context';\nimport type { Subscription } from 'rxjs';\nimport type { Call } from '../types/index.js';\nimport { getLogger } from '@signalwire/js';\nimport { transcriptContext } from './transcript-context.js';\nimport type { TranscriptEntry, TranscriptState } from './transcript-context.js';\nimport { ChatState } from './chat-state.js';\nimport type { ChatEntry } from './chat-state.js';\n\nconst logger = getLogger();\n\n/**\n * AI signaling events the transcript FSM consumes. `user_event` is\n * intentionally excluded — it's owned by `UserEventController`.\n */\nconst AI_EVENT_TYPES = [\n 'ai.partial_result',\n 'ai.speech_detect',\n 'ai.response_utterance',\n 'ai.completion',\n] as const;\n\ntype AiEventType = (typeof AI_EVENT_TYPES)[number];\n\n/** Strip `{confidence=0.95}` markers the backend sometimes appends to ASR text. */\nfunction stripConfidence(text: string): string {\n return text.replace(/\\s*\\{confidence=[\\d.]+\\}\\s*/g, '').trim();\n}\n\nfunction asString(v: unknown): string {\n return typeof v === 'string' ? v : '';\n}\n\n/**\n * Reactive controller that turns AI signaling events from a Call into\n * rendered transcript entries via `transcriptContext`.\n *\n * - `setCall(call)` binds/unbinds the FSM to a call's event streams.\n * - `injectEntry(entry)` appends an externally-sourced entry (e.g. a\n * `display_content` system bubble pushed by `UserEventController`).\n */\nexport class TranscriptController implements ReactiveController {\n private _host: LitElement;\n private _provider: ContextProvider<typeof transcriptContext>;\n private _chat = new ChatState();\n private _injected: TranscriptEntry[] = [];\n private _subscriptions: Subscription[] = [];\n\n constructor(host: LitElement) {\n this._host = host;\n this._provider = new ContextProvider(host, {\n context: transcriptContext,\n initialValue: { entries: [] },\n });\n\n this._chat.onUpdate = () => this._publish();\n host.addController(this);\n }\n\n hostConnected(): void {}\n\n hostDisconnected(): void {\n this._teardownSubscriptions();\n }\n\n setCall(call: Call | undefined): void {\n this._teardownSubscriptions();\n this._chat.reset();\n this._injected = [];\n this._publish();\n\n if (!call) return;\n\n for (const eventType of AI_EVENT_TYPES) {\n const sub = call.subscribe(eventType).subscribe({\n next: (event) => {\n try {\n this._route(eventType, this._extractParams(event));\n } catch (err) {\n logger.warn(`[TranscriptController] handler for ${eventType} threw`, err);\n }\n },\n error: (err) => {\n logger.warn(`[TranscriptController] subscription error on ${eventType}`, err);\n },\n });\n this._subscriptions = [...this._subscriptions, sub];\n }\n }\n\n get state(): TranscriptState {\n return this._provider.value;\n }\n\n /** Append an externally-sourced entry (used by UserEventController for display_content). */\n injectEntry(entry: TranscriptEntry): void {\n this._injected = [...this._injected, entry];\n this._publish();\n }\n\n private _extractParams(event: Record<string, unknown>): Record<string, unknown> {\n const params = event['params'];\n if (params && typeof params === 'object') {\n return params as Record<string, unknown>;\n }\n return event;\n }\n\n private _route(eventType: AiEventType, params: Record<string, unknown>): void {\n switch (eventType) {\n case 'ai.partial_result':\n this._chat.onUserPartial(asString(params['text']));\n break;\n case 'ai.speech_detect': {\n const text = stripConfidence(asString(params['text']));\n this._chat.onUserComplete(text);\n break;\n }\n case 'ai.response_utterance': {\n const text = asString(params['utterance'] ?? params['text']);\n this._chat.onAiChunk(TranscriptController._stripVoiceDirectives(text));\n break;\n }\n case 'ai.completion': {\n const text = asString(params['text']);\n this._chat.onAiComplete(\n TranscriptController._stripVoiceDirectives(text),\n params['type'] === 'barged'\n );\n break;\n }\n }\n }\n\n private _teardownSubscriptions(): void {\n for (const sub of this._subscriptions) {\n try {\n sub.unsubscribe();\n } catch {\n /* noop */\n }\n }\n this._subscriptions = [];\n }\n\n private static _stripVoiceDirectives(text: string): string {\n // TTS directives look like ~LN(English (United States))-; and can appear either\n // at the start (\"~LN(...)-; actual text\") or in the middle when the server appends\n // the same text again for the TTS engine (\"actual text ~LN(...)-; repeated text\").\n const match = /\\s*~[A-Z]+\\(.*?\\)-;\\s*/i.exec(text);\n if (!match) return text.trim();\n const before = text.slice(0, match.index).trim();\n const after = text.slice(match.index + match[0].length).trim();\n return (before || after).trim();\n }\n\n private _toTranscriptEntry(entry: ChatEntry, index: number): TranscriptEntry {\n return {\n id: `chat-${index}-${entry.speaker}-${entry.state}`,\n type: entry.speaker === 'ai' ? 'agent' : 'user',\n state: entry.state,\n text: entry.text,\n };\n }\n\n private _publish(): void {\n const chatEntries = this._chat\n .getHistory()\n .map((e, i) => this._toTranscriptEntry(e, i));\n const entries = [...chatEntries, ...this._injected];\n this._provider.setValue({ entries });\n this._host.requestUpdate();\n }\n}\n"],"names":["logger","getLogger","AI_EVENT_TYPES","stripConfidence","text","asString","v","TranscriptController","host","ChatState","ContextProvider","transcriptContext","call","eventType","sub","event","err","entry","params","match","before","after","index","entries","e"],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { ReactiveController, LitElement } from 'lit';
2
+ import type { Call } from '../types/index.js';
3
+ /**
4
+ * Reactive controller that subscribes to `user_event` on a Call and routes
5
+ * each event by its `type` field:
6
+ *
7
+ * - `display_content` → dispatches `sw-display-content` on the host so the
8
+ * call-widget can open the content drawer.
9
+ *
10
+ * - everything else → dispatches `signalwire-address:event` on the host
11
+ * so the embedding page can handle custom agent events.
12
+ *
13
+ * Always active once `setCall()` is called — no opt-in required.
14
+ */
15
+ export declare class UserEventController implements ReactiveController {
16
+ private _host;
17
+ private _subscription?;
18
+ constructor(host: LitElement);
19
+ hostConnected(): void;
20
+ hostDisconnected(): void;
21
+ setCall(call: Call | undefined): void;
22
+ private _route;
23
+ private _handleDisplayContent;
24
+ private _handlePassThrough;
25
+ }
26
+ //# sourceMappingURL=UserEventController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserEventController.d.ts","sourceRoot":"","sources":["../../src/context/UserEventController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAG1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAsB9C;;;;;;;;;;;GAWG;AACH,qBAAa,mBAAoB,YAAW,kBAAkB;IAC5D,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,aAAa,CAAC,CAAe;gBAEzB,IAAI,EAAE,UAAU;IAK5B,aAAa,IAAI,IAAI;IAErB,gBAAgB,IAAI,IAAI;IAKxB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI;IAcrC,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,qBAAqB;IAiB7B,OAAO,CAAC,kBAAkB;CAS3B"}
@@ -0,0 +1,55 @@
1
+ import { getLogger as i } from "@signalwire/js";
2
+ const r = i(), u = "user_event", c = ["text", "markdown", "code", "html"];
3
+ function l(s) {
4
+ return c.includes(s) ? s : "text";
5
+ }
6
+ class d {
7
+ constructor(t) {
8
+ this._host = t, t.addController(this);
9
+ }
10
+ hostConnected() {
11
+ }
12
+ hostDisconnected() {
13
+ var t;
14
+ (t = this._subscription) == null || t.unsubscribe(), this._subscription = void 0;
15
+ }
16
+ setCall(t) {
17
+ var e;
18
+ (e = this._subscription) == null || e.unsubscribe(), this._subscription = void 0, t && (this._subscription = t.subscribe(u).subscribe((n) => {
19
+ r.debug("[UserEventController] user_event arrived", n);
20
+ const o = n.params;
21
+ o && this._route(o);
22
+ }));
23
+ }
24
+ _route(t) {
25
+ t.type === "display_content" ? this._handleDisplayContent(t) : this._handlePassThrough(t);
26
+ }
27
+ _handleDisplayContent(t) {
28
+ const e = {
29
+ content: t.content ?? "",
30
+ format: l(t.format),
31
+ title: t.title,
32
+ language: t.language
33
+ };
34
+ this._host.dispatchEvent(
35
+ new CustomEvent("sw-display-content", {
36
+ detail: e,
37
+ bubbles: !0,
38
+ composed: !0
39
+ })
40
+ );
41
+ }
42
+ _handlePassThrough(t) {
43
+ this._host.dispatchEvent(
44
+ new CustomEvent("signalwire-address:event", {
45
+ detail: t,
46
+ bubbles: !0,
47
+ composed: !0
48
+ })
49
+ );
50
+ }
51
+ }
52
+ export {
53
+ d as UserEventController
54
+ };
55
+ //# sourceMappingURL=UserEventController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserEventController.js","sources":["../../src/context/UserEventController.ts"],"sourcesContent":["import type { ReactiveController, LitElement } from 'lit';\nimport type { Subscription } from 'rxjs';\nimport { getLogger } from '@signalwire/js';\nimport type { Call } from '../types/index.js';\nimport type { DisplayContentPayload } from '../components/UI/layout/sw-ui-content-drawer.js';\n\nconst logger = getLogger();\nconst USER_EVENT_TYPE = 'user_event';\nconst ALLOWED_FORMATS = ['text', 'markdown', 'code', 'html'] as const;\ntype AllowedFormat = (typeof ALLOWED_FORMATS)[number];\n\nfunction asFormat(v: unknown): AllowedFormat {\n return (ALLOWED_FORMATS as readonly string[]).includes(v as string)\n ? (v as AllowedFormat)\n : 'text';\n}\n\n/**\n * Raw shape of the params object inside a `user_event` signaling event.\n * The `type` field routes to either the content drawer or the pass-through.\n */\ninterface UserEventParams extends Record<string, unknown> {\n type?: string;\n}\n\n/**\n * Reactive controller that subscribes to `user_event` on a Call and routes\n * each event by its `type` field:\n *\n * - `display_content` → dispatches `sw-display-content` on the host so the\n * call-widget can open the content drawer.\n *\n * - everything else → dispatches `signalwire-address:event` on the host\n * so the embedding page can handle custom agent events.\n *\n * Always active once `setCall()` is called — no opt-in required.\n */\nexport class UserEventController implements ReactiveController {\n private _host: LitElement;\n private _subscription?: Subscription;\n\n constructor(host: LitElement) {\n this._host = host;\n host.addController(this);\n }\n\n hostConnected(): void {}\n\n hostDisconnected(): void {\n this._subscription?.unsubscribe();\n this._subscription = undefined;\n }\n\n setCall(call: Call | undefined): void {\n this._subscription?.unsubscribe();\n this._subscription = undefined;\n\n if (!call) return;\n\n this._subscription = call.subscribe(USER_EVENT_TYPE).subscribe((event) => {\n logger.debug('[UserEventController] user_event arrived', event);\n const params = event['params'] as UserEventParams | undefined;\n if (!params) return;\n this._route(params);\n });\n }\n\n private _route(params: UserEventParams): void {\n if (params.type === 'display_content') {\n this._handleDisplayContent(params);\n } else {\n this._handlePassThrough(params);\n }\n }\n\n private _handleDisplayContent(params: UserEventParams): void {\n const payload: DisplayContentPayload = {\n content: (params['content'] as string | undefined) ?? '',\n format: asFormat(params['format']),\n title: params['title'] as string | undefined,\n language: params['language'] as string | undefined,\n };\n\n this._host.dispatchEvent(\n new CustomEvent<DisplayContentPayload>('sw-display-content', {\n detail: payload,\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private _handlePassThrough(params: UserEventParams): void {\n this._host.dispatchEvent(\n new CustomEvent('signalwire-address:event', {\n detail: params,\n bubbles: true,\n composed: true,\n })\n );\n }\n}\n"],"names":["logger","getLogger","USER_EVENT_TYPE","ALLOWED_FORMATS","asFormat","v","UserEventController","host","_a","call","event","params","payload"],"mappings":";AAMA,MAAMA,IAASC,EAAA,GACTC,IAAkB,cAClBC,IAAkB,CAAC,QAAQ,YAAY,QAAQ,MAAM;AAG3D,SAASC,EAASC,GAA2B;AAC3C,SAAQF,EAAsC,SAASE,CAAW,IAC7DA,IACD;AACN;AAsBO,MAAMC,EAAkD;AAAA,EAI7D,YAAYC,GAAkB;AAC5B,SAAK,QAAQA,GACbA,EAAK,cAAc,IAAI;AAAA,EACzB;AAAA,EAEA,gBAAsB;AAAA,EAAC;AAAA,EAEvB,mBAAyB;;AACvB,KAAAC,IAAA,KAAK,kBAAL,QAAAA,EAAoB,eACpB,KAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,QAAQC,GAA8B;;AAIpC,KAHAD,IAAA,KAAK,kBAAL,QAAAA,EAAoB,eACpB,KAAK,gBAAgB,QAEhBC,MAEL,KAAK,gBAAgBA,EAAK,UAAUP,CAAe,EAAE,UAAU,CAACQ,MAAU;AACxE,MAAAV,EAAO,MAAM,4CAA4CU,CAAK;AAC9D,YAAMC,IAASD,EAAM;AACrB,MAAKC,KACL,KAAK,OAAOA,CAAM;AAAA,IACpB,CAAC;AAAA,EACH;AAAA,EAEQ,OAAOA,GAA+B;AAC5C,IAAIA,EAAO,SAAS,oBAClB,KAAK,sBAAsBA,CAAM,IAEjC,KAAK,mBAAmBA,CAAM;AAAA,EAElC;AAAA,EAEQ,sBAAsBA,GAA+B;AAC3D,UAAMC,IAAiC;AAAA,MACrC,SAAUD,EAAO,WAAqC;AAAA,MACtD,QAAQP,EAASO,EAAO,MAAS;AAAA,MACjC,OAAOA,EAAO;AAAA,MACd,UAAUA,EAAO;AAAA,IAAU;AAG7B,SAAK,MAAM;AAAA,MACT,IAAI,YAAmC,sBAAsB;AAAA,QAC3D,QAAQC;AAAA,QACR,SAAS;AAAA,QACT,UAAU;AAAA,MAAA,CACX;AAAA,IAAA;AAAA,EAEL;AAAA,EAEQ,mBAAmBD,GAA+B;AACxD,SAAK,MAAM;AAAA,MACT,IAAI,YAAY,4BAA4B;AAAA,QAC1C,QAAQA;AAAA,QACR,SAAS;AAAA,QACT,UAAU;AAAA,MAAA,CACX;AAAA,IAAA;AAAA,EAEL;AACF;"}