@signalwire/web-components 4.0.0-beta.9 → 4.0.0-dev-20260515133934

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 (362) 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 +360 -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 +138 -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 +178 -0
  37. package/dist/components/UI/controls/sw-ui-split-button.js.map +1 -0
  38. package/dist/components/UI/host-reset.d.ts +16 -0
  39. package/dist/components/UI/host-reset.d.ts.map +1 -0
  40. package/dist/components/UI/host-reset.js +20 -0
  41. package/dist/components/UI/host-reset.js.map +1 -0
  42. package/dist/components/UI/icons/backspace.svg.js +10 -0
  43. package/dist/components/UI/icons/backspace.svg.js.map +1 -0
  44. package/dist/components/UI/icons/camera-off.svg.js +8 -0
  45. package/dist/components/UI/icons/camera-off.svg.js.map +1 -0
  46. package/dist/components/UI/icons/camera-on.svg.js +8 -0
  47. package/dist/components/UI/icons/camera-on.svg.js.map +1 -0
  48. package/dist/components/UI/icons/check-circle.svg.js +6 -0
  49. package/dist/components/UI/icons/check-circle.svg.js.map +1 -0
  50. package/dist/components/UI/icons/chevron-up.svg.js +8 -0
  51. package/dist/components/UI/icons/chevron-up.svg.js.map +1 -0
  52. package/dist/components/UI/icons/close.svg.js +6 -0
  53. package/dist/components/UI/icons/close.svg.js.map +1 -0
  54. package/dist/components/UI/icons/copy.svg.js +6 -0
  55. package/dist/components/UI/icons/copy.svg.js.map +1 -0
  56. package/dist/components/UI/icons/download.svg.js +6 -0
  57. package/dist/components/UI/icons/download.svg.js.map +1 -0
  58. package/dist/components/UI/icons/fullscreen-exit.svg.js +8 -0
  59. package/dist/components/UI/icons/fullscreen-exit.svg.js.map +1 -0
  60. package/dist/components/UI/icons/fullscreen.svg.js +8 -0
  61. package/dist/components/UI/icons/fullscreen.svg.js.map +1 -0
  62. package/dist/components/UI/icons/hand-raise.svg.js +6 -0
  63. package/dist/components/UI/icons/hand-raise.svg.js.map +1 -0
  64. package/dist/components/UI/icons/icons.d.ts +31 -0
  65. package/dist/components/UI/icons/icons.d.ts.map +1 -0
  66. package/dist/components/UI/icons/icons.js +60 -0
  67. package/dist/components/UI/icons/icons.js.map +1 -0
  68. package/dist/components/UI/icons/index.d.ts +4 -0
  69. package/dist/components/UI/icons/index.d.ts.map +1 -0
  70. package/dist/components/UI/icons/info-circle.svg.js +6 -0
  71. package/dist/components/UI/icons/info-circle.svg.js.map +1 -0
  72. package/dist/components/UI/icons/mic-off.svg.js +8 -0
  73. package/dist/components/UI/icons/mic-off.svg.js.map +1 -0
  74. package/dist/components/UI/icons/mic-on.svg.js +8 -0
  75. package/dist/components/UI/icons/mic-on.svg.js.map +1 -0
  76. package/dist/components/UI/icons/person.svg.js +8 -0
  77. package/dist/components/UI/icons/person.svg.js.map +1 -0
  78. package/dist/components/UI/icons/phone-call.svg.js +8 -0
  79. package/dist/components/UI/icons/phone-call.svg.js.map +1 -0
  80. package/dist/components/UI/icons/phone-end.svg.js +8 -0
  81. package/dist/components/UI/icons/phone-end.svg.js.map +1 -0
  82. package/dist/components/UI/icons/room.svg.js +8 -0
  83. package/dist/components/UI/icons/room.svg.js.map +1 -0
  84. package/dist/components/UI/icons/screen-share-off.svg.js +9 -0
  85. package/dist/components/UI/icons/screen-share-off.svg.js.map +1 -0
  86. package/dist/components/UI/icons/screen-share.svg.js +9 -0
  87. package/dist/components/UI/icons/screen-share.svg.js.map +1 -0
  88. package/dist/components/UI/icons/sendIcon.svg.js +9 -0
  89. package/dist/components/UI/icons/sendIcon.svg.js.map +1 -0
  90. package/dist/components/UI/icons/settings.svg.js +8 -0
  91. package/dist/components/UI/icons/settings.svg.js.map +1 -0
  92. package/dist/components/UI/icons/speaker-off.svg.js +8 -0
  93. package/dist/components/UI/icons/speaker-off.svg.js.map +1 -0
  94. package/dist/components/UI/icons/speaker-on.svg.js +8 -0
  95. package/dist/components/UI/icons/speaker-on.svg.js.map +1 -0
  96. package/dist/components/UI/icons/spinner.svg.js +9 -0
  97. package/dist/components/UI/icons/spinner.svg.js.map +1 -0
  98. package/dist/components/UI/icons/sw-logo.svg.js +11 -0
  99. package/dist/components/UI/icons/sw-logo.svg.js.map +1 -0
  100. package/dist/components/UI/icons/sw-ui-icon.d.ts +28 -0
  101. package/dist/components/UI/icons/sw-ui-icon.d.ts.map +1 -0
  102. package/dist/components/UI/icons/sw-ui-icon.js +47 -0
  103. package/dist/components/UI/icons/sw-ui-icon.js.map +1 -0
  104. package/dist/components/UI/icons/transcript.svg.js +10 -0
  105. package/dist/components/UI/icons/transcript.svg.js.map +1 -0
  106. package/dist/components/UI/index.d.ts +18 -0
  107. package/dist/components/UI/index.d.ts.map +1 -0
  108. package/dist/components/UI/layout/sw-ui-background.d.ts +33 -0
  109. package/dist/components/UI/layout/sw-ui-background.d.ts.map +1 -0
  110. package/dist/components/UI/layout/sw-ui-background.js +106 -0
  111. package/dist/components/UI/layout/sw-ui-background.js.map +1 -0
  112. package/dist/components/UI/layout/sw-ui-call-layout.d.ts +69 -0
  113. package/dist/components/UI/layout/sw-ui-call-layout.d.ts.map +1 -0
  114. package/dist/components/UI/layout/sw-ui-call-layout.js +278 -0
  115. package/dist/components/UI/layout/sw-ui-call-layout.js.map +1 -0
  116. package/dist/components/UI/layout/sw-ui-content-drawer.d.ts +50 -0
  117. package/dist/components/UI/layout/sw-ui-content-drawer.d.ts.map +1 -0
  118. package/dist/components/UI/layout/sw-ui-content-drawer.js +413 -0
  119. package/dist/components/UI/layout/sw-ui-content-drawer.js.map +1 -0
  120. package/dist/components/UI/layout/sw-ui-modal.d.ts +31 -0
  121. package/dist/components/UI/layout/sw-ui-modal.d.ts.map +1 -0
  122. package/dist/components/UI/layout/sw-ui-modal.js +150 -0
  123. package/dist/components/UI/layout/sw-ui-modal.js.map +1 -0
  124. package/dist/components/UI/layout/sw-ui-responsive-container.d.ts +15 -0
  125. package/dist/components/UI/layout/sw-ui-responsive-container.d.ts.map +1 -0
  126. package/dist/components/UI/layout/sw-ui-responsive-container.js +78 -0
  127. package/dist/components/UI/layout/sw-ui-responsive-container.js.map +1 -0
  128. package/dist/components/UI/sw-ui-alert.d.ts +37 -0
  129. package/dist/components/UI/sw-ui-alert.d.ts.map +1 -0
  130. package/dist/components/UI/sw-ui-alert.js +127 -0
  131. package/dist/components/UI/sw-ui-alert.js.map +1 -0
  132. package/dist/components/UI/sw-ui-transcript-view.d.ts +56 -0
  133. package/dist/components/UI/sw-ui-transcript-view.d.ts.map +1 -0
  134. package/dist/components/UI/sw-ui-transcript-view.js +342 -0
  135. package/dist/components/UI/sw-ui-transcript-view.js.map +1 -0
  136. package/dist/components/{audio-level.d.ts → sw-audio-level.d.ts} +44 -4
  137. package/dist/components/sw-audio-level.d.ts.map +1 -0
  138. package/dist/components/sw-audio-level.js +252 -0
  139. package/dist/components/sw-audio-level.js.map +1 -0
  140. package/dist/components/sw-call-controls.d.ts +58 -0
  141. package/dist/components/sw-call-controls.d.ts.map +1 -0
  142. package/dist/components/sw-call-controls.js +186 -0
  143. package/dist/components/sw-call-controls.js.map +1 -0
  144. package/dist/components/sw-call-dialpad.d.ts +52 -0
  145. package/dist/components/sw-call-dialpad.d.ts.map +1 -0
  146. package/dist/components/sw-call-dialpad.js +70 -0
  147. package/dist/components/sw-call-dialpad.js.map +1 -0
  148. package/dist/components/sw-call-media.d.ts +59 -0
  149. package/dist/components/sw-call-media.d.ts.map +1 -0
  150. package/dist/components/sw-call-media.js +178 -0
  151. package/dist/components/sw-call-media.js.map +1 -0
  152. package/dist/components/sw-call-provider.d.ts +41 -0
  153. package/dist/components/sw-call-provider.d.ts.map +1 -0
  154. package/dist/components/sw-call-provider.js +37 -0
  155. package/dist/components/sw-call-provider.js.map +1 -0
  156. package/dist/components/sw-call-status.d.ts +50 -0
  157. package/dist/components/sw-call-status.d.ts.map +1 -0
  158. package/dist/components/sw-call-status.js +204 -0
  159. package/dist/components/sw-call-status.js.map +1 -0
  160. package/dist/components/sw-call-widget/client-factory.d.ts +6 -0
  161. package/dist/components/sw-call-widget/client-factory.d.ts.map +1 -0
  162. package/dist/components/sw-call-widget/client-factory.js +25 -0
  163. package/dist/components/sw-call-widget/client-factory.js.map +1 -0
  164. package/dist/components/sw-call-widget/sw-call-widget.d.ts +110 -0
  165. package/dist/components/sw-call-widget/sw-call-widget.d.ts.map +1 -0
  166. package/dist/components/sw-call-widget/sw-call-widget.js +251 -0
  167. package/dist/components/sw-call-widget/sw-call-widget.js.map +1 -0
  168. package/dist/components/sw-call-widget/sw-call-widget.templates.d.ts +17 -0
  169. package/dist/components/sw-call-widget/sw-call-widget.templates.d.ts.map +1 -0
  170. package/dist/components/sw-call-widget/sw-call-widget.templates.js +80 -0
  171. package/dist/components/sw-call-widget/sw-call-widget.templates.js.map +1 -0
  172. package/dist/components/sw-click-to-call.d.ts +39 -0
  173. package/dist/components/sw-click-to-call.d.ts.map +1 -0
  174. package/dist/components/sw-click-to-call.js +88 -0
  175. package/dist/components/sw-click-to-call.js.map +1 -0
  176. package/dist/components/sw-device-selector/index.d.ts +2 -0
  177. package/dist/components/sw-device-selector/index.d.ts.map +1 -0
  178. package/dist/components/sw-device-selector/sw-device-selector.d.ts +69 -0
  179. package/dist/components/sw-device-selector/sw-device-selector.d.ts.map +1 -0
  180. package/dist/components/sw-device-selector/sw-device-selector.js +278 -0
  181. package/dist/components/sw-device-selector/sw-device-selector.js.map +1 -0
  182. package/dist/components/sw-device-selector/sw-device-selector.styles.d.ts +2 -0
  183. package/dist/components/sw-device-selector/sw-device-selector.styles.d.ts.map +1 -0
  184. package/dist/components/sw-device-selector/sw-device-selector.styles.js +238 -0
  185. package/dist/components/sw-device-selector/sw-device-selector.styles.js.map +1 -0
  186. package/dist/components/{directory.d.ts → sw-directory.d.ts} +18 -4
  187. package/dist/components/sw-directory.d.ts.map +1 -0
  188. package/dist/components/sw-directory.js +435 -0
  189. package/dist/components/sw-directory.js.map +1 -0
  190. package/dist/components/sw-local-camera.d.ts +53 -0
  191. package/dist/components/sw-local-camera.d.ts.map +1 -0
  192. package/dist/components/sw-local-camera.js +147 -0
  193. package/dist/components/sw-local-camera.js.map +1 -0
  194. package/dist/components/sw-participant-controls.d.ts +58 -0
  195. package/dist/components/sw-participant-controls.d.ts.map +1 -0
  196. package/dist/components/sw-participant-controls.js +306 -0
  197. package/dist/components/sw-participant-controls.js.map +1 -0
  198. package/dist/components/sw-participants.d.ts +55 -0
  199. package/dist/components/sw-participants.d.ts.map +1 -0
  200. package/dist/components/sw-participants.js +320 -0
  201. package/dist/components/sw-participants.js.map +1 -0
  202. package/dist/components/sw-self-media.d.ts +46 -0
  203. package/dist/components/sw-self-media.d.ts.map +1 -0
  204. package/dist/components/sw-self-media.js +106 -0
  205. package/dist/components/sw-self-media.js.map +1 -0
  206. package/dist/context/CallStateContextController.d.ts +31 -0
  207. package/dist/context/CallStateContextController.d.ts.map +1 -0
  208. package/dist/context/CallStateContextController.js +125 -0
  209. package/dist/context/CallStateContextController.js.map +1 -0
  210. package/dist/context/DevicesContextController.d.ts +38 -0
  211. package/dist/context/DevicesContextController.d.ts.map +1 -0
  212. package/dist/context/DevicesContextController.js +124 -0
  213. package/dist/context/DevicesContextController.js.map +1 -0
  214. package/dist/context/TranscriptController.d.ts +32 -0
  215. package/dist/context/TranscriptController.d.ts.map +1 -0
  216. package/dist/context/TranscriptController.js +113 -0
  217. package/dist/context/TranscriptController.js.map +1 -0
  218. package/dist/context/UserEventController.d.ts +26 -0
  219. package/dist/context/UserEventController.d.ts.map +1 -0
  220. package/dist/context/UserEventController.js +55 -0
  221. package/dist/context/UserEventController.js.map +1 -0
  222. package/dist/context/call-state-context.d.ts +75 -0
  223. package/dist/context/call-state-context.d.ts.map +1 -0
  224. package/dist/context/call-state-context.js +39 -0
  225. package/dist/context/call-state-context.js.map +1 -0
  226. package/dist/context/chat-state.d.ts +41 -0
  227. package/dist/context/chat-state.d.ts.map +1 -0
  228. package/dist/context/chat-state.js +61 -0
  229. package/dist/context/chat-state.js.map +1 -0
  230. package/dist/context/devices-context.d.ts +28 -0
  231. package/dist/context/devices-context.d.ts.map +1 -0
  232. package/dist/context/devices-context.js +6 -0
  233. package/dist/context/devices-context.js.map +1 -0
  234. package/dist/context/index.d.ts +9 -1
  235. package/dist/context/index.d.ts.map +1 -1
  236. package/dist/context/transcript-context.d.ts +9 -0
  237. package/dist/context/transcript-context.d.ts.map +1 -0
  238. package/dist/context/transcript-context.js +6 -0
  239. package/dist/context/transcript-context.js.map +1 -0
  240. package/dist/context/types.d.ts +9 -0
  241. package/dist/context/types.d.ts.map +1 -0
  242. package/dist/embed/signalwire-web-components-embed.iife.js +3237 -0
  243. package/dist/embed/signalwire-web-components-embed.iife.js.map +1 -0
  244. package/dist/embed/signalwire-web-components-embed.umd.cjs +3237 -0
  245. package/dist/embed/signalwire-web-components-embed.umd.cjs.map +1 -0
  246. package/dist/embed.d.ts +20 -0
  247. package/dist/embed.d.ts.map +1 -0
  248. package/dist/index.d.ts +19 -13
  249. package/dist/index.d.ts.map +1 -1
  250. package/dist/index.js +84 -35
  251. package/dist/index.js.map +1 -1
  252. package/dist/node_modules/dompurify/dist/purify.es.js +597 -0
  253. package/dist/node_modules/dompurify/dist/purify.es.js.map +1 -0
  254. package/dist/node_modules/marked/lib/marked.esm.js +1475 -0
  255. package/dist/node_modules/marked/lib/marked.esm.js.map +1 -0
  256. package/dist/node_modules/prismjs/components/prism-bash.js +220 -0
  257. package/dist/node_modules/prismjs/components/prism-bash.js.map +1 -0
  258. package/dist/node_modules/prismjs/components/prism-css.js +56 -0
  259. package/dist/node_modules/prismjs/components/prism-css.js.map +1 -0
  260. package/dist/node_modules/prismjs/components/prism-javascript.js +138 -0
  261. package/dist/node_modules/prismjs/components/prism-javascript.js.map +1 -0
  262. package/dist/node_modules/prismjs/components/prism-json.js +26 -0
  263. package/dist/node_modules/prismjs/components/prism-json.js.map +1 -0
  264. package/dist/node_modules/prismjs/components/prism-markdown.js +301 -0
  265. package/dist/node_modules/prismjs/components/prism-markdown.js.map +1 -0
  266. package/dist/node_modules/prismjs/components/prism-python.js +69 -0
  267. package/dist/node_modules/prismjs/components/prism-python.js.map +1 -0
  268. package/dist/node_modules/prismjs/components/prism-sql.js +34 -0
  269. package/dist/node_modules/prismjs/components/prism-sql.js.map +1 -0
  270. package/dist/node_modules/prismjs/components/prism-typescript.js +53 -0
  271. package/dist/node_modules/prismjs/components/prism-typescript.js.map +1 -0
  272. package/dist/node_modules/prismjs/components/prism-yaml.js +67 -0
  273. package/dist/node_modules/prismjs/components/prism-yaml.js.map +1 -0
  274. package/dist/node_modules/prismjs/prism.js +1165 -0
  275. package/dist/node_modules/prismjs/prism.js.map +1 -0
  276. package/dist/react.d.ts +96 -46
  277. package/dist/theme.css +451 -0
  278. package/dist/theme.css.js +5 -0
  279. package/dist/theme.css.js.map +1 -0
  280. package/dist/types/index.d.ts +9 -33
  281. package/dist/types/index.d.ts.map +1 -1
  282. package/dist/utils/index.d.ts +2 -0
  283. package/dist/utils/index.d.ts.map +1 -1
  284. package/dist/utils/prism.d.ts +4 -0
  285. package/dist/utils/prism.d.ts.map +1 -0
  286. package/dist/utils/prism.js +34 -0
  287. package/dist/utils/prism.js.map +1 -0
  288. package/dist/utils/theme-loader.d.ts +11 -0
  289. package/dist/utils/theme-loader.d.ts.map +1 -0
  290. package/dist/utils/theme-loader.js +17 -0
  291. package/dist/utils/theme-loader.js.map +1 -0
  292. package/dist/utils/transcriptToMarkdown.d.ts +14 -0
  293. package/dist/utils/transcriptToMarkdown.d.ts.map +1 -0
  294. package/dist/utils/transcriptToMarkdown.js +59 -0
  295. package/dist/utils/transcriptToMarkdown.js.map +1 -0
  296. package/dist/utils/use-google-font.d.ts +18 -0
  297. package/dist/utils/use-google-font.d.ts.map +1 -0
  298. package/dist/utils/use-google-font.js +12 -0
  299. package/dist/utils/use-google-font.js.map +1 -0
  300. package/dist/utils/user-variables.d.ts +20 -0
  301. package/dist/utils/user-variables.d.ts.map +1 -0
  302. package/dist/utils/user-variables.js +37 -0
  303. package/dist/utils/user-variables.js.map +1 -0
  304. package/dist/utils/video.js +6 -21
  305. package/dist/utils/video.js.map +1 -1
  306. package/package.json +105 -42
  307. package/dist/components/audio-level.d.ts.map +0 -1
  308. package/dist/components/audio-level.js +0 -203
  309. package/dist/components/audio-level.js.map +0 -1
  310. package/dist/components/call-controls.d.ts +0 -163
  311. package/dist/components/call-controls.d.ts.map +0 -1
  312. package/dist/components/call-controls.js +0 -606
  313. package/dist/components/call-controls.js.map +0 -1
  314. package/dist/components/call-media.d.ts +0 -114
  315. package/dist/components/call-media.d.ts.map +0 -1
  316. package/dist/components/call-media.js +0 -219
  317. package/dist/components/call-media.js.map +0 -1
  318. package/dist/components/call-status.d.ts +0 -68
  319. package/dist/components/call-status.d.ts.map +0 -1
  320. package/dist/components/call-status.js +0 -254
  321. package/dist/components/call-status.js.map +0 -1
  322. package/dist/components/click-to-call.d.ts +0 -123
  323. package/dist/components/click-to-call.d.ts.map +0 -1
  324. package/dist/components/click-to-call.js +0 -428
  325. package/dist/components/click-to-call.js.map +0 -1
  326. package/dist/components/device-selector.d.ts +0 -224
  327. package/dist/components/device-selector.d.ts.map +0 -1
  328. package/dist/components/device-selector.js +0 -685
  329. package/dist/components/device-selector.js.map +0 -1
  330. package/dist/components/dialpad.d.ts +0 -60
  331. package/dist/components/dialpad.d.ts.map +0 -1
  332. package/dist/components/dialpad.js +0 -372
  333. package/dist/components/dialpad.js.map +0 -1
  334. package/dist/components/directory.d.ts.map +0 -1
  335. package/dist/components/directory.js +0 -503
  336. package/dist/components/directory.js.map +0 -1
  337. package/dist/components/example-button.d.ts +0 -20
  338. package/dist/components/example-button.d.ts.map +0 -1
  339. package/dist/components/example-button.js +0 -74
  340. package/dist/components/example-button.js.map +0 -1
  341. package/dist/components/participant-controls.d.ts +0 -94
  342. package/dist/components/participant-controls.d.ts.map +0 -1
  343. package/dist/components/participant-controls.js +0 -468
  344. package/dist/components/participant-controls.js.map +0 -1
  345. package/dist/components/participants.d.ts +0 -116
  346. package/dist/components/participants.d.ts.map +0 -1
  347. package/dist/components/participants.js +0 -394
  348. package/dist/components/participants.js.map +0 -1
  349. package/dist/components/self-media.d.ts +0 -78
  350. package/dist/components/self-media.d.ts.map +0 -1
  351. package/dist/components/self-media.js +0 -129
  352. package/dist/components/self-media.js.map +0 -1
  353. package/dist/constants.js +0 -5
  354. package/dist/constants.js.map +0 -1
  355. package/dist/context/call-context.d.ts +0 -13
  356. package/dist/context/call-context.d.ts.map +0 -1
  357. package/dist/context/call-context.js +0 -6
  358. package/dist/context/call-context.js.map +0 -1
  359. package/dist/types/index.js +0 -12
  360. package/dist/types/index.js.map +0 -1
  361. package/dist/utils/debounce.js +0 -13
  362. package/dist/utils/debounce.js.map +0 -1
@@ -0,0 +1,435 @@
1
+ import { LitElement as u, html as a, css as p } from "lit";
2
+ import { property as m, state as l, customElement as b } from "lit/decorators.js";
3
+ import { hostReset as v } from "./UI/host-reset.js";
4
+ var f = Object.defineProperty, g = Object.getOwnPropertyDescriptor, n = (e, i, o, t) => {
5
+ for (var s = t > 1 ? void 0 : t ? g(i, o) : i, c = e.length - 1, d; c >= 0; c--)
6
+ (d = e[c]) && (s = (t ? d(i, o, s) : d(s)) || s);
7
+ return t && s && f(i, o, s), s;
8
+ };
9
+ let r = class extends u {
10
+ constructor() {
11
+ super(...arguments), this.directory = null, this.selectedAddress = null, this.searchQuery = "", this.addresses = [], this.loading = !1, this.hasMore = !1, this.subscriptions = [], this.searchDebounceTimer = null, this.intersectionObserver = null, this.isAutoLoadingForSearch = !1;
12
+ }
13
+ connectedCallback() {
14
+ super.connectedCallback(), this.subscribeToDirectory();
15
+ }
16
+ disconnectedCallback() {
17
+ super.disconnectedCallback(), this.cleanup();
18
+ }
19
+ subscribeToDirectory() {
20
+ if (this.directory) {
21
+ if (this.directory.addresses$) {
22
+ const e = this.directory.addresses$.subscribe((i) => {
23
+ this.addresses = i;
24
+ });
25
+ this.subscriptions.push(e);
26
+ }
27
+ if (this.directory.loading$) {
28
+ const e = this.directory.loading$.subscribe((i) => {
29
+ this.loading = i;
30
+ });
31
+ this.subscriptions.push(e);
32
+ }
33
+ if (this.directory.hasMore$) {
34
+ const e = this.directory.hasMore$.subscribe((i) => {
35
+ this.hasMore = i;
36
+ });
37
+ this.subscriptions.push(e);
38
+ }
39
+ this.directory.loadMore && this.directory.loadMore();
40
+ }
41
+ }
42
+ cleanup() {
43
+ this.subscriptions.forEach((e) => e.unsubscribe()), this.subscriptions = [], this.searchDebounceTimer && clearTimeout(this.searchDebounceTimer), this.intersectionObserver && (this.intersectionObserver.disconnect(), this.intersectionObserver = null);
44
+ }
45
+ firstUpdated() {
46
+ this.setupInfiniteScroll();
47
+ }
48
+ setupInfiniteScroll() {
49
+ var i, o;
50
+ const e = (i = this.shadowRoot) == null ? void 0 : i.querySelector(".scroll-sentinel");
51
+ e && (this.intersectionObserver = new IntersectionObserver(
52
+ (t) => {
53
+ const s = t[0];
54
+ s != null && s.isIntersecting && this.hasMore && !this.loading && this.handleLoadMore();
55
+ },
56
+ {
57
+ root: (o = this.shadowRoot) == null ? void 0 : o.querySelector(".list"),
58
+ rootMargin: "100px",
59
+ threshold: 0
60
+ }
61
+ ), this.intersectionObserver.observe(e));
62
+ }
63
+ updated(e) {
64
+ super.updated(e), e.has("directory") && (this.cleanup(), this.subscribeToDirectory()), this.intersectionObserver || this.setupInfiniteScroll(), (e.has("addresses") || e.has("searchQuery") || e.has("loading")) && this.checkAutoLoadForSearch();
65
+ }
66
+ async checkAutoLoadForSearch() {
67
+ this.searchQuery.trim() && this.filteredAddresses.length === 0 && this.hasMore && !this.loading ? (this.isAutoLoadingForSearch = !0, await this.handleLoadMore()) : (this.filteredAddresses.length > 0 || !this.hasMore) && (this.isAutoLoadingForSearch = !1);
68
+ }
69
+ get filteredAddresses() {
70
+ if (!this.searchQuery.trim())
71
+ return this.addresses;
72
+ const e = this.searchQuery.toLowerCase();
73
+ return this.addresses.filter(
74
+ (i) => i.name.toLowerCase().includes(e) || i.displayName && i.displayName.toLowerCase().includes(e)
75
+ );
76
+ }
77
+ handleSearchInput(e) {
78
+ const i = e.target;
79
+ this.searchDebounceTimer && clearTimeout(this.searchDebounceTimer), this.searchDebounceTimer = window.setTimeout(() => {
80
+ this.searchQuery = i.value;
81
+ }, 200);
82
+ }
83
+ handleItemClick(e) {
84
+ this.selectedAddress = e, this.dispatchEvent(
85
+ new CustomEvent("sw-address-select", {
86
+ detail: { address: e },
87
+ bubbles: !0,
88
+ composed: !0
89
+ })
90
+ );
91
+ }
92
+ handleItemDoubleClick(e) {
93
+ this.handleDial(e);
94
+ }
95
+ handleDial(e) {
96
+ this.dispatchEvent(
97
+ new CustomEvent("sw-dial", {
98
+ detail: { address: e },
99
+ bubbles: !0,
100
+ composed: !0
101
+ })
102
+ );
103
+ }
104
+ async handleLoadMore() {
105
+ var e;
106
+ (e = this.directory) != null && e.loadMore && await this.directory.loadMore();
107
+ }
108
+ renderAddressIcon(e) {
109
+ const i = e.type === "room" ? "room" : "person";
110
+ return a`<sw-ui-icon name=${i} size="20"></sw-ui-icon>`;
111
+ }
112
+ renderChannelIcons(e) {
113
+ const i = e.channels || {};
114
+ return a`
115
+ <div class="item-channels">
116
+ <sw-ui-icon
117
+ name="mic-on"
118
+ size="16"
119
+ class="${i.audio ? "active" : ""}"
120
+ title="Audio"
121
+ ></sw-ui-icon>
122
+ <sw-ui-icon
123
+ name="camera-on"
124
+ size="16"
125
+ class="${i.video ? "active" : ""}"
126
+ title="Video"
127
+ ></sw-ui-icon>
128
+ </div>
129
+ `;
130
+ }
131
+ renderLoadingIndicator() {
132
+ return a`
133
+ <div class="scroll-loading">
134
+ <div class="spinner"></div>
135
+ <span>${this.isAutoLoadingForSearch ? "Searching..." : "Loading more..."}</span>
136
+ </div>
137
+ `;
138
+ }
139
+ render() {
140
+ const e = this.loading && this.addresses.length === 0, i = !this.loading && this.filteredAddresses.length === 0 && !this.hasMore, o = this.isAutoLoadingForSearch && this.filteredAddresses.length === 0;
141
+ return a`
142
+ <div class="container" part="container">
143
+ <div class="search" part="search">
144
+ <input
145
+ type="text"
146
+ class="search-input"
147
+ placeholder="Search addresses..."
148
+ @input=${this.handleSearchInput}
149
+ aria-label="Search addresses"
150
+ />
151
+ </div>
152
+
153
+ <div class="list" part="list" role="listbox">
154
+ ${e ? a`<div class="loading">Loading...</div>` : o ? this.renderLoadingIndicator() : i ? a`<div class="empty">No addresses found</div>` : a`
155
+ ${this.filteredAddresses.map(
156
+ (t) => {
157
+ var s, c, d;
158
+ return a`
159
+ <div
160
+ class="item ${((s = this.selectedAddress) == null ? void 0 : s.id) === t.id ? "selected" : ""}"
161
+ part="item ${((c = this.selectedAddress) == null ? void 0 : c.id) === t.id ? "item-selected" : ""}"
162
+ role="option"
163
+ aria-selected="${((d = this.selectedAddress) == null ? void 0 : d.id) === t.id}"
164
+ @click=${() => this.handleItemClick(t)}
165
+ @dblclick=${() => this.handleItemDoubleClick(t)}
166
+ >
167
+ <div class="item-icon">${this.renderAddressIcon(t)}</div>
168
+ <div class="item-content">
169
+ <div class="item-name" part="item-name">
170
+ ${t.displayName || t.name}
171
+ </div>
172
+ <div class="item-type" part="item-type">
173
+ ${t.type || "address"}
174
+ </div>
175
+ </div>
176
+ ${this.renderChannelIcons(t)}
177
+ <button
178
+ class="dial-button"
179
+ @click=${(h) => {
180
+ h.stopPropagation(), this.handleDial(t);
181
+ }}
182
+ aria-label="Call ${t.displayName || t.name}"
183
+ >
184
+ <sw-ui-icon name="phone-call" size="18"></sw-ui-icon>
185
+ </button>
186
+ </div>
187
+ `;
188
+ }
189
+ )}
190
+ <!-- Scroll sentinel for infinite scroll -->
191
+ <div class="scroll-sentinel">
192
+ ${this.loading && !this.isAutoLoadingForSearch ? this.renderLoadingIndicator() : null}
193
+ </div>
194
+ `}
195
+ </div>
196
+ </div>
197
+ `;
198
+ }
199
+ };
200
+ r.styles = [v, p`
201
+ :host {
202
+ display: block;
203
+ font-family: var(--type-family-body);
204
+ color: var(--fg-default);
205
+ }
206
+
207
+ .container {
208
+ display: flex;
209
+ flex-direction: column;
210
+ background: var(--bg-surface);
211
+ border: 1px solid var(--border-default);
212
+ border-radius: var(--radius-md);
213
+ overflow: hidden;
214
+ }
215
+
216
+ .search {
217
+ display: flex;
218
+ align-items: center;
219
+ gap: var(--sp-2);
220
+ padding: var(--sp-3);
221
+ border-bottom: 1px solid var(--border-default);
222
+ }
223
+
224
+ .search-input {
225
+ flex: 1;
226
+ padding: var(--sp-2) var(--sp-3);
227
+ border: 1px solid var(--border-default);
228
+ border-radius: var(--radius-md);
229
+ background: var(--bg-surface);
230
+ color: var(--fg-default);
231
+ font-family: var(--type-family-body);
232
+ font-size: var(--type-size-small);
233
+ outline: none;
234
+ transition: border-color 0.15s ease;
235
+ }
236
+
237
+ .search-input:focus {
238
+ border-color: var(--interactive-button-primary-bg);
239
+ }
240
+
241
+ .search-input::placeholder {
242
+ color: var(--fg-muted);
243
+ }
244
+
245
+ .list {
246
+ display: flex;
247
+ flex-direction: column;
248
+ max-height: 400px;
249
+ overflow-y: auto;
250
+ }
251
+
252
+ .item {
253
+ display: flex;
254
+ align-items: center;
255
+ gap: var(--sp-3);
256
+ padding: var(--sp-3) var(--sp-4);
257
+ border-bottom: 1px solid var(--border-default);
258
+ cursor: pointer;
259
+ transition: background-color 0.15s ease;
260
+ }
261
+
262
+ .item:last-child {
263
+ border-bottom: none;
264
+ }
265
+
266
+ .item:hover {
267
+ background: var(--bg-surface-raised);
268
+ }
269
+
270
+ .item:active {
271
+ background: var(--interactive-dropdown-hover);
272
+ }
273
+
274
+ .item.selected {
275
+ background: var(--interactive-button-primary-bg);
276
+ color: white;
277
+ }
278
+
279
+ .item.selected .item-type,
280
+ .item.selected .item-channels {
281
+ color: rgba(255, 255, 255, 0.8);
282
+ }
283
+
284
+ .item-icon {
285
+ display: flex;
286
+ align-items: center;
287
+ justify-content: center;
288
+ width: 40px;
289
+ height: 40px;
290
+ border-radius: 50%;
291
+ background: var(--bg-surface-raised);
292
+ color: var(--fg-muted);
293
+ flex-shrink: 0;
294
+ }
295
+
296
+ .item.selected .item-icon {
297
+ background: rgba(255, 255, 255, 0.2);
298
+ color: white;
299
+ }
300
+
301
+ .item-icon svg,
302
+ .item-icon sw-ui-icon {
303
+ width: 20px;
304
+ height: 20px;
305
+ }
306
+
307
+ .item-content {
308
+ flex: 1;
309
+ min-width: 0;
310
+ }
311
+
312
+ .item-name {
313
+ font-size: var(--type-size-small);
314
+ font-weight: 500;
315
+ color: inherit;
316
+ white-space: nowrap;
317
+ overflow: hidden;
318
+ text-overflow: ellipsis;
319
+ }
320
+
321
+ .item-type {
322
+ font-size: var(--type-size-caption);
323
+ color: var(--fg-muted);
324
+ text-transform: capitalize;
325
+ }
326
+
327
+ .item-channels {
328
+ display: flex;
329
+ gap: var(--sp-1);
330
+ color: var(--fg-muted);
331
+ }
332
+
333
+ .item-channels sw-ui-icon {
334
+ width: 16px;
335
+ height: 16px;
336
+ }
337
+
338
+ .item-channels sw-ui-icon.active {
339
+ color: var(--interactive-status-success);
340
+ }
341
+
342
+ .loading,
343
+ .empty {
344
+ display: flex;
345
+ align-items: center;
346
+ justify-content: center;
347
+ padding: var(--sp-4);
348
+ color: var(--fg-muted);
349
+ font-size: var(--type-size-small);
350
+ }
351
+
352
+ .scroll-sentinel {
353
+ display: flex;
354
+ align-items: center;
355
+ justify-content: center;
356
+ padding: var(--sp-3);
357
+ min-height: 1px;
358
+ }
359
+
360
+ .scroll-loading {
361
+ display: flex;
362
+ align-items: center;
363
+ justify-content: center;
364
+ gap: var(--sp-2);
365
+ padding: var(--sp-3);
366
+ color: var(--fg-muted);
367
+ font-size: var(--type-size-caption);
368
+ }
369
+
370
+ .spinner {
371
+ width: 16px;
372
+ height: 16px;
373
+ border: 2px solid var(--border-default);
374
+ border-top-color: var(--interactive-button-primary-bg);
375
+ border-radius: 50%;
376
+ animation: spin 0.8s linear infinite;
377
+ }
378
+
379
+ @keyframes spin {
380
+ to {
381
+ transform: rotate(360deg);
382
+ }
383
+ }
384
+
385
+ .dial-button {
386
+ display: flex;
387
+ align-items: center;
388
+ justify-content: center;
389
+ width: 36px;
390
+ height: 36px;
391
+ background: var(--interactive-status-success);
392
+ border: none;
393
+ border-radius: 50%;
394
+ color: white;
395
+ cursor: pointer;
396
+ flex-shrink: 0;
397
+ transition: background-color 0.15s ease;
398
+ }
399
+
400
+ .dial-button:hover {
401
+ background: #0ea472;
402
+ }
403
+
404
+ .dial-button sw-ui-icon {
405
+ pointer-events: none;
406
+ }
407
+ `];
408
+ n([
409
+ m({ type: Object })
410
+ ], r.prototype, "directory", 2);
411
+ n([
412
+ l()
413
+ ], r.prototype, "selectedAddress", 2);
414
+ n([
415
+ l()
416
+ ], r.prototype, "searchQuery", 2);
417
+ n([
418
+ l()
419
+ ], r.prototype, "addresses", 2);
420
+ n([
421
+ l()
422
+ ], r.prototype, "loading", 2);
423
+ n([
424
+ l()
425
+ ], r.prototype, "hasMore", 2);
426
+ n([
427
+ l()
428
+ ], r.prototype, "isAutoLoadingForSearch", 2);
429
+ r = n([
430
+ b("sw-directory")
431
+ ], r);
432
+ export {
433
+ r as SwDirectory
434
+ };
435
+ //# sourceMappingURL=sw-directory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sw-directory.js","sources":["../../src/components/sw-directory.ts"],"sourcesContent":["/**\n * Directory Component\n *\n * A searchable list of addresses from the directory service.\n * Supports filtering, selection, and pagination.\n *\n * @example\n * ```html\n * <sw-directory .directory=${directory}></sw-directory>\n * ```\n *\n * @fires sw-address-select - Fired when an address is selected. Detail: `{ address: Address }`\n * @fires sw-dial - Fired when the call button on an address is clicked. Detail: `{ address: Address, channel: string }`\n *\n * @cssprop [--interactive-button-primary-bg=#044ef4] - Primary brand color\n * @cssprop [--interactive-button-primary-hover=#0342cf] - Primary color on hover\n * @cssprop [--interactive-status-success=#22c55e] - Success/positive color\n * @cssprop [--fg-default=#f0f0f4] - Primary text color\n * @cssprop [--fg-muted=#a0a0aa] - Secondary/muted text color\n * @cssprop [--bg-surface=#181a28] - Component background color\n * @cssprop [--bg-surface-raised=#222436] - Background color on hover\n * @cssprop [--interactive-dropdown-hover=#333338] - Background color on active/press\n * @cssprop [--border-default=rgba(255,255,255,0.12)] - Border color\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { Subscription } from 'rxjs';\nimport type { Observable } from 'rxjs';\nimport './UI/icons/sw-ui-icon.js';\nimport { hostReset } from './UI/host-reset.js';\n\n/**\n * Address type from SDK\n */\nexport interface Address {\n id: string;\n name: string;\n displayName?: string;\n type?: 'room' | 'person';\n channels?: {\n audio?: boolean;\n video?: boolean;\n messaging?: boolean;\n };\n}\n\n/**\n * Directory interface for component\n */\nexport interface DirectoryService {\n addresses$: Observable<Address[]>;\n loading$?: Observable<boolean>;\n hasMore$?: Observable<boolean>;\n loadMore?(): Promise<void>;\n}\n\n@customElement('sw-directory')\nexport class SwDirectory extends LitElement {\n static styles = [hostReset, css`\n :host {\n display: block;\n font-family: var(--type-family-body);\n color: var(--fg-default);\n }\n\n .container {\n display: flex;\n flex-direction: column;\n background: var(--bg-surface);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-md);\n overflow: hidden;\n }\n\n .search {\n display: flex;\n align-items: center;\n gap: var(--sp-2);\n padding: var(--sp-3);\n border-bottom: 1px solid var(--border-default);\n }\n\n .search-input {\n flex: 1;\n padding: var(--sp-2) var(--sp-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-md);\n background: var(--bg-surface);\n color: var(--fg-default);\n font-family: var(--type-family-body);\n font-size: var(--type-size-small);\n outline: none;\n transition: border-color 0.15s ease;\n }\n\n .search-input:focus {\n border-color: var(--interactive-button-primary-bg);\n }\n\n .search-input::placeholder {\n color: var(--fg-muted);\n }\n\n .list {\n display: flex;\n flex-direction: column;\n max-height: 400px;\n overflow-y: auto;\n }\n\n .item {\n display: flex;\n align-items: center;\n gap: var(--sp-3);\n padding: var(--sp-3) var(--sp-4);\n border-bottom: 1px solid var(--border-default);\n cursor: pointer;\n transition: background-color 0.15s ease;\n }\n\n .item:last-child {\n border-bottom: none;\n }\n\n .item:hover {\n background: var(--bg-surface-raised);\n }\n\n .item:active {\n background: var(--interactive-dropdown-hover);\n }\n\n .item.selected {\n background: var(--interactive-button-primary-bg);\n color: white;\n }\n\n .item.selected .item-type,\n .item.selected .item-channels {\n color: rgba(255, 255, 255, 0.8);\n }\n\n .item-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border-radius: 50%;\n background: var(--bg-surface-raised);\n color: var(--fg-muted);\n flex-shrink: 0;\n }\n\n .item.selected .item-icon {\n background: rgba(255, 255, 255, 0.2);\n color: white;\n }\n\n .item-icon svg,\n .item-icon sw-ui-icon {\n width: 20px;\n height: 20px;\n }\n\n .item-content {\n flex: 1;\n min-width: 0;\n }\n\n .item-name {\n font-size: var(--type-size-small);\n font-weight: 500;\n color: inherit;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .item-type {\n font-size: var(--type-size-caption);\n color: var(--fg-muted);\n text-transform: capitalize;\n }\n\n .item-channels {\n display: flex;\n gap: var(--sp-1);\n color: var(--fg-muted);\n }\n\n .item-channels sw-ui-icon {\n width: 16px;\n height: 16px;\n }\n\n .item-channels sw-ui-icon.active {\n color: var(--interactive-status-success);\n }\n\n .loading,\n .empty {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--sp-4);\n color: var(--fg-muted);\n font-size: var(--type-size-small);\n }\n\n .scroll-sentinel {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--sp-3);\n min-height: 1px;\n }\n\n .scroll-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--sp-2);\n padding: var(--sp-3);\n color: var(--fg-muted);\n font-size: var(--type-size-caption);\n }\n\n .spinner {\n width: 16px;\n height: 16px;\n border: 2px solid var(--border-default);\n border-top-color: var(--interactive-button-primary-bg);\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n }\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n .dial-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n background: var(--interactive-status-success);\n border: none;\n border-radius: 50%;\n color: white;\n cursor: pointer;\n flex-shrink: 0;\n transition: background-color 0.15s ease;\n }\n\n .dial-button:hover {\n background: #0ea472;\n }\n\n .dial-button sw-ui-icon {\n pointer-events: none;\n }\n `];\n\n /**\n * Directory service with addresses$ observable\n */\n @property({ type: Object })\n directory: DirectoryService | null = null;\n\n /**\n * Currently selected address\n */\n @state()\n private selectedAddress: Address | null = null;\n\n /**\n * Search filter query\n */\n @state()\n private searchQuery: string = '';\n\n /**\n * List of addresses from directory\n */\n @state()\n private addresses: Address[] = [];\n\n /**\n * Loading state\n */\n @state()\n private loading: boolean = false;\n\n /**\n * Has more addresses to load\n */\n @state()\n private hasMore: boolean = false;\n\n /**\n * RxJS subscriptions for cleanup\n */\n private subscriptions: Subscription[] = [];\n\n /**\n * Debounce timer for search\n */\n private searchDebounceTimer: number | null = null;\n\n /**\n * IntersectionObserver for infinite scroll\n */\n private intersectionObserver: IntersectionObserver | null = null;\n\n /**\n * Flag to track if we're auto-loading for search\n */\n @state()\n private isAutoLoadingForSearch: boolean = false;\n\n connectedCallback() {\n super.connectedCallback();\n this.subscribeToDirectory();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.cleanup();\n }\n\n private subscribeToDirectory() {\n if (!this.directory) return;\n\n // Subscribe to addresses\n if (this.directory.addresses$) {\n const addressesSub = this.directory.addresses$.subscribe((addresses) => {\n this.addresses = addresses;\n });\n this.subscriptions.push(addressesSub);\n }\n\n // Subscribe to loading state\n if (this.directory.loading$) {\n const loadingSub = this.directory.loading$.subscribe((loading) => {\n this.loading = loading;\n });\n this.subscriptions.push(loadingSub);\n }\n\n // Subscribe to hasMore\n if (this.directory.hasMore$) {\n const hasMoreSub = this.directory.hasMore$.subscribe((hasMore) => {\n this.hasMore = hasMore;\n });\n this.subscriptions.push(hasMoreSub);\n }\n\n // Load initial data\n if (this.directory.loadMore) {\n this.directory.loadMore();\n }\n }\n\n private cleanup() {\n this.subscriptions.forEach((sub) => sub.unsubscribe());\n this.subscriptions = [];\n if (this.searchDebounceTimer) {\n clearTimeout(this.searchDebounceTimer);\n }\n if (this.intersectionObserver) {\n this.intersectionObserver.disconnect();\n this.intersectionObserver = null;\n }\n }\n\n protected firstUpdated() {\n this.setupInfiniteScroll();\n }\n\n private setupInfiniteScroll() {\n const sentinel = this.shadowRoot?.querySelector('.scroll-sentinel');\n if (!sentinel) return;\n\n this.intersectionObserver = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n if (entry?.isIntersecting && this.hasMore && !this.loading) {\n this.handleLoadMore();\n }\n },\n {\n root: this.shadowRoot?.querySelector('.list'),\n rootMargin: '100px',\n threshold: 0\n }\n );\n\n this.intersectionObserver.observe(sentinel);\n }\n\n protected updated(changedProperties: Map<string, unknown>) {\n super.updated(changedProperties);\n\n // Handle directory property changes\n if (changedProperties.has('directory')) {\n this.cleanup();\n this.subscribeToDirectory();\n }\n\n // Re-setup infinite scroll if needed\n if (!this.intersectionObserver) {\n this.setupInfiniteScroll();\n }\n\n // Auto-load more when searching and no results found but more available\n // Also check when loading state changes so we can trigger subsequent loads\n if (\n changedProperties.has('addresses') ||\n changedProperties.has('searchQuery') ||\n changedProperties.has('loading')\n ) {\n this.checkAutoLoadForSearch();\n }\n }\n\n private async checkAutoLoadForSearch() {\n // If we have a search query, no filtered results, but more to load, keep loading\n // Note: !this.loading prevents concurrent loads, isAutoLoadingForSearch is for UI state only\n if (\n this.searchQuery.trim() &&\n this.filteredAddresses.length === 0 &&\n this.hasMore &&\n !this.loading\n ) {\n this.isAutoLoadingForSearch = true;\n await this.handleLoadMore();\n // The updated() will be called again when addresses/loading change, continuing the loop\n } else if (this.filteredAddresses.length > 0 || !this.hasMore) {\n this.isAutoLoadingForSearch = false;\n }\n }\n\n private get filteredAddresses(): Address[] {\n if (!this.searchQuery.trim()) {\n return this.addresses;\n }\n const query = this.searchQuery.toLowerCase();\n return this.addresses.filter(\n (addr) =>\n addr.name.toLowerCase().includes(query) ||\n (addr.displayName && addr.displayName.toLowerCase().includes(query))\n );\n }\n\n private handleSearchInput(e: Event) {\n const input = e.target as HTMLInputElement;\n\n // Debounce search\n if (this.searchDebounceTimer) {\n clearTimeout(this.searchDebounceTimer);\n }\n\n this.searchDebounceTimer = window.setTimeout(() => {\n this.searchQuery = input.value;\n }, 200);\n }\n\n private handleItemClick(address: Address) {\n this.selectedAddress = address;\n\n this.dispatchEvent(\n new CustomEvent('sw-address-select', {\n detail: { address },\n bubbles: true,\n composed: true\n })\n );\n }\n\n private handleItemDoubleClick(address: Address) {\n this.handleDial(address);\n }\n\n private handleDial(address: Address) {\n this.dispatchEvent(\n new CustomEvent('sw-dial', {\n detail: { address },\n bubbles: true,\n composed: true\n })\n );\n }\n\n private async handleLoadMore() {\n if (this.directory?.loadMore) {\n await this.directory.loadMore();\n }\n }\n\n private renderAddressIcon(address: Address) {\n const name = address.type === 'room' ? 'room' : 'person';\n return html`<sw-ui-icon name=${name} size=\"20\"></sw-ui-icon>`;\n }\n\n private renderChannelIcons(address: Address) {\n const channels = address.channels || {};\n return html`\n <div class=\"item-channels\">\n <sw-ui-icon\n name=\"mic-on\"\n size=\"16\"\n class=\"${channels.audio ? 'active' : ''}\"\n title=\"Audio\"\n ></sw-ui-icon>\n <sw-ui-icon\n name=\"camera-on\"\n size=\"16\"\n class=\"${channels.video ? 'active' : ''}\"\n title=\"Video\"\n ></sw-ui-icon>\n </div>\n `;\n }\n\n private renderLoadingIndicator() {\n return html`\n <div class=\"scroll-loading\">\n <div class=\"spinner\"></div>\n <span>${this.isAutoLoadingForSearch ? 'Searching...' : 'Loading more...'}</span>\n </div>\n `;\n }\n\n render() {\n const showInitialLoading = this.loading && this.addresses.length === 0;\n const showEmptyState = !this.loading && this.filteredAddresses.length === 0 && !this.hasMore;\n const showSearchingState = this.isAutoLoadingForSearch && this.filteredAddresses.length === 0;\n\n return html`\n <div class=\"container\" part=\"container\">\n <div class=\"search\" part=\"search\">\n <input\n type=\"text\"\n class=\"search-input\"\n placeholder=\"Search addresses...\"\n @input=${this.handleSearchInput}\n aria-label=\"Search addresses\"\n />\n </div>\n\n <div class=\"list\" part=\"list\" role=\"listbox\">\n ${showInitialLoading\n ? html`<div class=\"loading\">Loading...</div>`\n : showSearchingState\n ? this.renderLoadingIndicator()\n : showEmptyState\n ? html`<div class=\"empty\">No addresses found</div>`\n : html`\n ${this.filteredAddresses.map(\n (address) => html`\n <div\n class=\"item ${this.selectedAddress?.id === address.id ? 'selected' : ''}\"\n part=\"item ${this.selectedAddress?.id === address.id\n ? 'item-selected'\n : ''}\"\n role=\"option\"\n aria-selected=\"${this.selectedAddress?.id === address.id}\"\n @click=${() => this.handleItemClick(address)}\n @dblclick=${() => this.handleItemDoubleClick(address)}\n >\n <div class=\"item-icon\">${this.renderAddressIcon(address)}</div>\n <div class=\"item-content\">\n <div class=\"item-name\" part=\"item-name\">\n ${address.displayName || address.name}\n </div>\n <div class=\"item-type\" part=\"item-type\">\n ${address.type || 'address'}\n </div>\n </div>\n ${this.renderChannelIcons(address)}\n <button\n class=\"dial-button\"\n @click=${(e: Event) => {\n e.stopPropagation();\n this.handleDial(address);\n }}\n aria-label=\"Call ${address.displayName || address.name}\"\n >\n <sw-ui-icon name=\"phone-call\" size=\"18\"></sw-ui-icon>\n </button>\n </div>\n `\n )}\n <!-- Scroll sentinel for infinite scroll -->\n <div class=\"scroll-sentinel\">\n ${this.loading && !this.isAutoLoadingForSearch\n ? this.renderLoadingIndicator()\n : null}\n </div>\n `}\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-directory': SwDirectory;\n }\n}\n"],"names":["SwDirectory","LitElement","addressesSub","addresses","loadingSub","loading","hasMoreSub","hasMore","sub","sentinel","_a","entries","entry","_b","changedProperties","query","addr","input","address","name","html","channels","showInitialLoading","showEmptyState","showSearchingState","_c","e","hostReset","css","__decorateClass","property","state","customElement"],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { LitElement } from 'lit';
2
+ import type { Call } from '../types/index.js';
3
+ import './UI/icons/sw-ui-icon.js';
4
+ /**
5
+ * Local camera preview. Adapts its aspect-ratio to match the actual
6
+ * video track (landscape or portrait).
7
+ *
8
+ * Input precedence : `.stream`/`.videoMuted` > `.call` > context.
9
+ *
10
+ * @prop {MediaStream|null} stream - explicit stream (overrides .call and context)
11
+ * @prop {boolean} videoMuted - explicit muted flag (overrides context)
12
+ * @prop {Call} call - explicit Call object (overrides context)
13
+ * @prop {boolean} mirror - mirror the video horizontally
14
+ *
15
+ * @csspart video - The `<video>` element.
16
+ * @csspart placeholder - Camera-off overlay shown while muted.
17
+ *
18
+ * @cssprop [--sw-local-camera-aspect=16/9] - Aspect ratio; auto-set from track settings when available.
19
+ */
20
+ export declare class SwLocalCamera extends LitElement {
21
+ /** Explicit stream — highest precedence. */
22
+ stream: MediaStream | null;
23
+ /** Explicit muted flag — overrides devicesContext.videoMuted. */
24
+ videoMuted?: boolean;
25
+ /** Explicit Call — used when `.stream` is not set. Bypasses context. */
26
+ call?: Call;
27
+ mirror: boolean;
28
+ private _callState?;
29
+ private _devicesState?;
30
+ private _directLocalStream;
31
+ private _directSubscriptions;
32
+ /** Detected aspect ratio from the video track, e.g. "16 / 9" or "9 / 16". */
33
+ private _aspectRatio;
34
+ /** Last stream reference attached to the video element — used to skip no-op re-attaches. */
35
+ private _attachedStream;
36
+ static styles: import("lit").CSSResult;
37
+ private get _effectiveStream();
38
+ private get _effectiveMuted();
39
+ protected firstUpdated(): void;
40
+ protected updated(changedProperties: Map<string, unknown>): void;
41
+ disconnectedCallback(): void;
42
+ private _setupDirect;
43
+ private _teardownDirect;
44
+ /** Read the video track settings and set the CSS custom property. */
45
+ private _detectAspectRatio;
46
+ render(): import("lit-html").TemplateResult<1>;
47
+ }
48
+ declare global {
49
+ interface HTMLElementTagNameMap {
50
+ 'sw-local-camera': SwLocalCamera;
51
+ }
52
+ }
53
+ //# sourceMappingURL=sw-local-camera.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sw-local-camera.d.ts","sourceRoot":"","sources":["../../src/components/sw-local-camera.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAO5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,0BAA0B,CAAC;AAElC;;;;;;;;;;;;;;;GAeG;AACH,qBACa,aAAc,SAAQ,UAAU;IAC3C,4CAA4C;IACZ,MAAM,EAAE,WAAW,GAAG,IAAI,CAAQ;IAElE,iEAAiE;IACK,UAAU,CAAC,EAAE,OAAO,CAAC;IAE3F,wEAAwE;IAC5C,IAAI,CAAC,EAAE,IAAI,CAAC;IAEI,MAAM,UAAS;IAI3D,OAAO,CAAC,UAAU,CAAC,CAAY;IAI/B,OAAO,CAAC,aAAa,CAAC,CAAe;IAE5B,OAAO,CAAC,kBAAkB,CAA4B;IAE/D,OAAO,CAAC,oBAAoB,CAAsB;IAElD,6EAA6E;IACpE,OAAO,CAAC,YAAY,CAAY;IAEzC,4FAA4F;IAC5F,OAAO,CAAC,eAAe,CAA4B;IAEnD,MAAM,CAAC,MAAM,0BAoCX;IAEF,OAAO,KAAK,gBAAgB,GAI3B;IAED,OAAO,KAAK,eAAe,GAE1B;IAED,SAAS,CAAC,YAAY,IAAI,IAAI;IAa9B,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IA8ChE,oBAAoB,IAAI,IAAI;IAO5B,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,eAAe;IAMvB,qEAAqE;IACrE,OAAO,CAAC,kBAAkB;IAiB1B,MAAM;CAUP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,iBAAiB,EAAE,aAAa,CAAC;KAClC;CACF"}