@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,59 @@
1
+ function r(t) {
2
+ const n = ["# Transcript", "", `*Generated: ${(/* @__PURE__ */ new Date()).toLocaleString(void 0, {
3
+ year: "numeric",
4
+ month: "long",
5
+ day: "numeric",
6
+ hour: "2-digit",
7
+ minute: "2-digit"
8
+ })}*`, ""], a = t.filter((s) => s.state === "complete");
9
+ for (const s of a)
10
+ n.push("---", ""), n.push(...u(s), "");
11
+ return a.length > 0 && n.push("---", ""), n.join(`
12
+ `);
13
+ }
14
+ function u(t) {
15
+ var n, a, s, i;
16
+ const e = [];
17
+ switch (t.type) {
18
+ case "user":
19
+ e.push(`**You:** ${t.text}`);
20
+ break;
21
+ case "agent":
22
+ e.push(`**Agent:** ${t.text}`);
23
+ break;
24
+ case "system":
25
+ e.push(`*${t.text}*`);
26
+ break;
27
+ }
28
+ if ((n = t.meta) != null && n.code) {
29
+ const { language: o = "", content: c } = t.meta.code;
30
+ e.push("", `\`\`\`${o}`, c, "```");
31
+ }
32
+ if ((s = (a = t.meta) == null ? void 0 : a.links) != null && s.length) {
33
+ e.push("");
34
+ for (const o of t.meta.links)
35
+ e.push(`- [${o.label}](${o.url})`);
36
+ }
37
+ return (i = t.meta) != null && i.displayContent && e.push(...l(t.meta.displayContent)), e;
38
+ }
39
+ function l(t) {
40
+ const e = [""];
41
+ switch (t.format) {
42
+ case "code":
43
+ e.push(`\`\`\`${t.language ?? ""}`, t.content, "```");
44
+ break;
45
+ case "markdown":
46
+ e.push(t.content);
47
+ break;
48
+ case "html":
49
+ e.push("<!-- html content -->", t.content, "<!-- /html content -->");
50
+ break;
51
+ default:
52
+ e.push(t.content);
53
+ }
54
+ return e;
55
+ }
56
+ export {
57
+ r as transcriptToMarkdown
58
+ };
59
+ //# sourceMappingURL=transcriptToMarkdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcriptToMarkdown.js","sources":["../../src/utils/transcriptToMarkdown.ts"],"sourcesContent":["import type { TranscriptEntry, TranscriptEntryMeta } from '../components/UI/sw-ui-transcript-view.js';\n\n/**\n * Serializes a transcript entry list to a Markdown string.\n *\n * Format per entry type:\n * user → **You:** text\n * agent → **Agent:** text\n * system → *text*\n *\n * meta.code → fenced code block (with language tag when present)\n * meta.links → markdown link list appended after the message text\n */\nexport function transcriptToMarkdown(entries: TranscriptEntry[]): string {\n const timestamp = new Date().toLocaleString(undefined, {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n\n const lines: string[] = [`# Transcript`, ``, `*Generated: ${timestamp}*`, ``];\n\n const completed = entries.filter((e) => e.state === 'complete');\n\n for (const entry of completed) {\n lines.push('---', '');\n lines.push(...serializeEntry(entry), '');\n }\n\n if (completed.length > 0) {\n lines.push('---', '');\n }\n\n return lines.join('\\n');\n}\n\nfunction serializeEntry(entry: TranscriptEntry): string[] {\n const lines: string[] = [];\n\n switch (entry.type) {\n case 'user':\n lines.push(`**You:** ${entry.text}`);\n break;\n case 'agent':\n lines.push(`**Agent:** ${entry.text}`);\n break;\n case 'system':\n lines.push(`*${entry.text}*`);\n break;\n }\n\n if (entry.meta?.code) {\n const { language = '', content } = entry.meta.code;\n lines.push('', `\\`\\`\\`${language}`, content, '```');\n }\n\n if (entry.meta?.links?.length) {\n lines.push('');\n for (const link of entry.meta.links) {\n lines.push(`- [${link.label}](${link.url})`);\n }\n }\n\n if (entry.meta?.displayContent) {\n lines.push(...serializeDisplayContent(entry.meta.displayContent));\n }\n\n return lines;\n}\n\nfunction serializeDisplayContent(\n dc: NonNullable<TranscriptEntryMeta['displayContent']>\n): string[] {\n const lines: string[] = [''];\n\n switch (dc.format) {\n case 'code':\n lines.push(`\\`\\`\\`${dc.language ?? ''}`, dc.content, '```');\n break;\n case 'markdown':\n lines.push(dc.content);\n break;\n case 'html':\n // Wrap in an HTML comment so the file stays valid markdown while\n // preserving the raw payload for anyone who needs it.\n lines.push('<!-- html content -->', dc.content, '<!-- /html content -->');\n break;\n default:\n lines.push(dc.content);\n }\n\n return lines;\n}\n"],"names":["transcriptToMarkdown","entries","lines","completed","e","entry","serializeEntry","_a","_b","_c","_d","language","content","link","serializeDisplayContent","dc"],"mappings":"AAaO,SAASA,EAAqBC,GAAoC;AASvE,QAAMC,IAAkB,CAAC,gBAAgB,IAAI,gBAR3B,oBAAI,KAAA,GAAO,eAAe,QAAW;AAAA,IACrD,MAAM;AAAA,IACN,OAAO;AAAA,IACP,KAAK;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,EAAA,CACT,CAEoE,KAAK,EAAE,GAEtEC,IAAYF,EAAQ,OAAO,CAACG,MAAMA,EAAE,UAAU,UAAU;AAE9D,aAAWC,KAASF;AAClB,IAAAD,EAAM,KAAK,OAAO,EAAE,GACpBA,EAAM,KAAK,GAAGI,EAAeD,CAAK,GAAG,EAAE;AAGzC,SAAIF,EAAU,SAAS,KACrBD,EAAM,KAAK,OAAO,EAAE,GAGfA,EAAM,KAAK;AAAA,CAAI;AACxB;AAEA,SAASI,EAAeD,GAAkC;AAzBnD,MAAAE,GAAAC,GAAAC,GAAAC;AA0BL,QAAMR,IAAkB,CAAA;AAExB,UAAQG,EAAM,MAAA;AAAA,IACZ,KAAK;AACH,MAAAH,EAAM,KAAK,YAAYG,EAAM,IAAI,EAAE;AACnC;AAAA,IACF,KAAK;AACH,MAAAH,EAAM,KAAK,cAAcG,EAAM,IAAI,EAAE;AACrC;AAAA,IACF,KAAK;AACH,MAAAH,EAAM,KAAK,IAAIG,EAAM,IAAI,GAAG;AAC5B;AAAA,EAAA;AAGJ,OAAIE,IAAAF,EAAM,SAAN,QAAAE,EAAY,MAAM;AACpB,UAAM,EAAE,UAAAI,IAAW,IAAI,SAAAC,EAAA,IAAYP,EAAM,KAAK;AAC9C,IAAAH,EAAM,KAAK,IAAI,SAASS,CAAQ,IAAIC,GAAS,KAAK;AAAA,EACpD;AAEA,OAAIH,KAAAD,IAAAH,EAAM,SAAN,gBAAAG,EAAY,UAAZ,QAAAC,EAAmB,QAAQ;AAC7B,IAAAP,EAAM,KAAK,EAAE;AACb,eAAWW,KAAQR,EAAM,KAAK;AAC5B,MAAAH,EAAM,KAAK,MAAMW,EAAK,KAAK,KAAKA,EAAK,GAAG,GAAG;AAAA,EAE/C;AAEA,UAAIH,IAAAL,EAAM,SAAN,QAAAK,EAAY,kBACdR,EAAM,KAAK,GAAGY,EAAwBT,EAAM,KAAK,cAAc,CAAC,GAG3DH;AACT;AAEA,SAASY,EACPC,GACU;AACV,QAAMb,IAAkB,CAAC,EAAE;AAE3B,UAAQa,EAAG,QAAA;AAAA,IACT,KAAK;AACH,MAAAb,EAAM,KAAK,SAASa,EAAG,YAAY,EAAE,IAAIA,EAAG,SAAS,KAAK;AAC1D;AAAA,IACF,KAAK;AACH,MAAAb,EAAM,KAAKa,EAAG,OAAO;AACrB;AAAA,IACF,KAAK;AAGH,MAAAb,EAAM,KAAK,yBAAyBa,EAAG,SAAS,wBAAwB;AACxE;AAAA,IACF;AACE,MAAAb,EAAM,KAAKa,EAAG,OAAO;AAAA,EAAA;AAGzB,SAAOb;AACT;"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Load a Google Font into the document. Idempotent — calling twice with the
3
+ * same arguments injects only one `<link>`.
4
+ *
5
+ * @example
6
+ * useGoogleFont('Lexend', { weights: [400, 500, 700] });
7
+ * useGoogleFont('JetBrains Mono');
8
+ */
9
+ export interface UseGoogleFontOptions {
10
+ /** Font weights to load. Defaults to `[400]`. */
11
+ weights?: number[];
12
+ /** `font-display` strategy. Defaults to `'swap'`. */
13
+ display?: 'auto' | 'block' | 'swap' | 'fallback' | 'optional';
14
+ /** Whether to load italic variants alongside the upright weights. */
15
+ italic?: boolean;
16
+ }
17
+ export declare function useGoogleFont(name: string, options?: UseGoogleFontOptions): void;
18
+ //# sourceMappingURL=use-google-font.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-google-font.d.ts","sourceRoot":"","sources":["../../src/utils/use-google-font.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,WAAW,oBAAoB;IACnC,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,UAAU,CAAC;IAC9D,qEAAqE;IACrE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAID,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,IAAI,CAmBpF"}
@@ -0,0 +1,12 @@
1
+ const r = "https://fonts.googleapis.com/css2";
2
+ function d(o, e = {}) {
3
+ if (typeof document > "u") return;
4
+ const n = e.weights ?? [400], l = e.display ?? "swap", c = o.replace(/\s+/g, "+"), a = e.italic ? `ital,wght@${n.flatMap((i) => [`0,${i}`, `1,${i}`]).join(";")}` : `wght@${n.join(";")}`, s = `${r}?family=${c}:${a}&display=${l}`;
5
+ if (document.querySelector(`link[href="${s}"]`)) return;
6
+ const t = document.createElement("link");
7
+ t.rel = "stylesheet", t.href = s, document.head.appendChild(t);
8
+ }
9
+ export {
10
+ d as useGoogleFont
11
+ };
12
+ //# sourceMappingURL=use-google-font.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-google-font.js","sources":["../../src/utils/use-google-font.ts"],"sourcesContent":["/**\n * Load a Google Font into the document. Idempotent — calling twice with the\n * same arguments injects only one `<link>`.\n *\n * @example\n * useGoogleFont('Lexend', { weights: [400, 500, 700] });\n * useGoogleFont('JetBrains Mono');\n */\nexport interface UseGoogleFontOptions {\n /** Font weights to load. Defaults to `[400]`. */\n weights?: number[];\n /** `font-display` strategy. Defaults to `'swap'`. */\n display?: 'auto' | 'block' | 'swap' | 'fallback' | 'optional';\n /** Whether to load italic variants alongside the upright weights. */\n italic?: boolean;\n}\n\nconst GOOGLE_FONTS_BASE = 'https://fonts.googleapis.com/css2';\n\nexport function useGoogleFont(name: string, options: UseGoogleFontOptions = {}): void {\n if (typeof document === 'undefined') return;\n\n const weights = options.weights ?? [400];\n const display = options.display ?? 'swap';\n const family = name.replace(/\\s+/g, '+');\n\n const axis = options.italic\n ? `ital,wght@${weights.flatMap((w) => [`0,${w}`, `1,${w}`]).join(';')}`\n : `wght@${weights.join(';')}`;\n\n const href = `${GOOGLE_FONTS_BASE}?family=${family}:${axis}&display=${display}`;\n\n if (document.querySelector(`link[href=\"${href}\"]`)) return;\n\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = href;\n document.head.appendChild(link);\n}\n"],"names":["GOOGLE_FONTS_BASE","useGoogleFont","name","options","weights","display","family","axis","w","href","link"],"mappings":"AAiBA,MAAMA,IAAoB;AAEnB,SAASC,EAAcC,GAAcC,IAAgC,IAAU;AACpF,MAAI,OAAO,WAAa,IAAa;AAErC,QAAMC,IAAUD,EAAQ,WAAW,CAAC,GAAG,GACjCE,IAAUF,EAAQ,WAAW,QAC7BG,IAASJ,EAAK,QAAQ,QAAQ,GAAG,GAEjCK,IAAOJ,EAAQ,SACjB,aAAaC,EAAQ,QAAQ,CAACI,MAAM,CAAC,KAAKA,CAAC,IAAI,KAAKA,CAAC,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC,KACnE,QAAQJ,EAAQ,KAAK,GAAG,CAAC,IAEvBK,IAAO,GAAGT,CAAiB,WAAWM,CAAM,IAAIC,CAAI,YAAYF,CAAO;AAE7E,MAAI,SAAS,cAAc,cAAcI,CAAI,IAAI,EAAG;AAEpD,QAAMC,IAAO,SAAS,cAAc,MAAM;AAC1C,EAAAA,EAAK,MAAM,cACXA,EAAK,OAAOD,GACZ,SAAS,KAAK,YAAYC,CAAI;AAChC;"}
@@ -0,0 +1,20 @@
1
+ /** Formats the widget's content drawer can render. */
2
+ export declare const WIDGET_DISPLAY_FORMATS: readonly ["text", "markdown", "code", "html"];
3
+ /**
4
+ * Parse a user-supplied JSON string into a userVariables object. Returns an
5
+ * empty object on null/undefined/empty input, and on parse failure logs a
6
+ * warning and returns an empty object — never throws.
7
+ */
8
+ export declare function parseUserVariablesAttribute(raw: string | null | undefined): Record<string, unknown>;
9
+ /**
10
+ * Merge widget self-advertisement (display_content capability + opened_at
11
+ * timestamp) into a userVariables object. User-supplied keys win on shallow
12
+ * conflict; capability and metadata sub-objects are deep-merged one level so
13
+ * callers can add their own keys without losing the widget's signal.
14
+ *
15
+ * The shape matches what `Sigmond2Agent._caller_has_display` looks for:
16
+ * - `capabilities.display_content` (signal #1)
17
+ * - `metadata.widget.opened_at` (signal #2)
18
+ */
19
+ export declare function withWidgetCapabilities(base: Record<string, unknown>, now?: () => string): Record<string, unknown>;
20
+ //# sourceMappingURL=user-variables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-variables.d.ts","sourceRoot":"","sources":["../../src/utils/user-variables.ts"],"names":[],"mappings":"AAIA,sDAAsD;AACtD,eAAO,MAAM,sBAAsB,+CAAgD,CAAC;AAMpF;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC7B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAazB;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,GAAE,MAAM,MAAuC,GACjD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmBzB"}
@@ -0,0 +1,37 @@
1
+ import { getLogger as s } from "@signalwire/js";
2
+ const i = s(), c = ["text", "markdown", "code", "html"];
3
+ function a(t) {
4
+ return typeof t == "object" && t !== null && !Array.isArray(t);
5
+ }
6
+ function g(t) {
7
+ if (!t) return {};
8
+ try {
9
+ const e = JSON.parse(t);
10
+ return a(e) ? e : (i.warn("[CallWidget] user-variables must be a JSON object; ignoring"), {});
11
+ } catch (e) {
12
+ return i.warn("[CallWidget] Failed to parse user-variables JSON; ignoring", e), {};
13
+ }
14
+ }
15
+ function d(t, e = () => (/* @__PURE__ */ new Date()).toISOString()) {
16
+ const n = a(t.capabilities) ? t.capabilities : {}, r = a(t.metadata) ? t.metadata : {}, o = a(r.widget) ? r.widget : {};
17
+ return {
18
+ ...t,
19
+ capabilities: {
20
+ display_content: { formats: [...c] },
21
+ ...n
22
+ },
23
+ metadata: {
24
+ ...r,
25
+ widget: {
26
+ opened_at: e(),
27
+ ...o
28
+ }
29
+ }
30
+ };
31
+ }
32
+ export {
33
+ c as WIDGET_DISPLAY_FORMATS,
34
+ g as parseUserVariablesAttribute,
35
+ d as withWidgetCapabilities
36
+ };
37
+ //# sourceMappingURL=user-variables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-variables.js","sources":["../../src/utils/user-variables.ts"],"sourcesContent":["import { getLogger } from '@signalwire/js';\n\nconst logger = getLogger();\n\n/** Formats the widget's content drawer can render. */\nexport const WIDGET_DISPLAY_FORMATS = ['text', 'markdown', 'code', 'html'] as const;\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n}\n\n/**\n * Parse a user-supplied JSON string into a userVariables object. Returns an\n * empty object on null/undefined/empty input, and on parse failure logs a\n * warning and returns an empty object — never throws.\n */\nexport function parseUserVariablesAttribute(\n raw: string | null | undefined\n): Record<string, unknown> {\n if (!raw) return {};\n try {\n const parsed = JSON.parse(raw);\n if (!isPlainObject(parsed)) {\n logger.warn('[CallWidget] user-variables must be a JSON object; ignoring');\n return {};\n }\n return parsed;\n } catch (err) {\n logger.warn('[CallWidget] Failed to parse user-variables JSON; ignoring', err);\n return {};\n }\n}\n\n/**\n * Merge widget self-advertisement (display_content capability + opened_at\n * timestamp) into a userVariables object. User-supplied keys win on shallow\n * conflict; capability and metadata sub-objects are deep-merged one level so\n * callers can add their own keys without losing the widget's signal.\n *\n * The shape matches what `Sigmond2Agent._caller_has_display` looks for:\n * - `capabilities.display_content` (signal #1)\n * - `metadata.widget.opened_at` (signal #2)\n */\nexport function withWidgetCapabilities(\n base: Record<string, unknown>,\n now: () => string = () => new Date().toISOString()\n): Record<string, unknown> {\n const baseCaps = isPlainObject(base['capabilities']) ? base['capabilities'] : {};\n const baseMeta = isPlainObject(base['metadata']) ? base['metadata'] : {};\n const baseWidget = isPlainObject(baseMeta['widget']) ? baseMeta['widget'] : {};\n\n return {\n ...base,\n capabilities: {\n display_content: { formats: [...WIDGET_DISPLAY_FORMATS] },\n ...baseCaps,\n },\n metadata: {\n ...baseMeta,\n widget: {\n opened_at: now(),\n ...baseWidget,\n },\n },\n };\n}\n"],"names":["logger","getLogger","WIDGET_DISPLAY_FORMATS","isPlainObject","v","parseUserVariablesAttribute","raw","parsed","err","withWidgetCapabilities","base","now","baseCaps","baseMeta","baseWidget"],"mappings":";AAEA,MAAMA,IAASC,EAAA,GAGFC,IAAyB,CAAC,QAAQ,YAAY,QAAQ,MAAM;AAEzE,SAASC,EAAcC,GAA0C;AAC/D,SAAO,OAAOA,KAAM,YAAYA,MAAM,QAAQ,CAAC,MAAM,QAAQA,CAAC;AAChE;AAOO,SAASC,EACdC,GACyB;AACzB,MAAI,CAACA,EAAK,QAAO,CAAA;AACjB,MAAI;AACF,UAAMC,IAAS,KAAK,MAAMD,CAAG;AAC7B,WAAKH,EAAcI,CAAM,IAIlBA,KAHLP,EAAO,KAAK,6DAA6D,GAClE,CAAA;AAAA,EAGX,SAASQ,GAAK;AACZ,WAAAR,EAAO,KAAK,8DAA8DQ,CAAG,GACtE,CAAA;AAAA,EACT;AACF;AAYO,SAASC,EACdC,GACAC,IAAoB,2BAAU,KAAA,GAAO,eACZ;AACzB,QAAMC,IAAWT,EAAcO,EAAK,YAAe,IAAIA,EAAK,eAAkB,CAAA,GACxEG,IAAWV,EAAcO,EAAK,QAAW,IAAIA,EAAK,WAAc,CAAA,GAChEI,IAAaX,EAAcU,EAAS,MAAS,IAAIA,EAAS,SAAY,CAAA;AAE5E,SAAO;AAAA,IACL,GAAGH;AAAA,IACH,cAAc;AAAA,MACZ,iBAAiB,EAAE,SAAS,CAAC,GAAGR,CAAsB,EAAA;AAAA,MACtD,GAAGU;AAAA,IAAA;AAAA,IAEL,UAAU;AAAA,MACR,GAAGC;AAAA,MACH,QAAQ;AAAA,QACN,WAAWF,EAAA;AAAA,QACX,GAAGG;AAAA,MAAA;AAAA,IACL;AAAA,EACF;AAEJ;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signalwire/web-components",
3
- "version": "1.0.0-dev-20260428141127",
3
+ "version": "1.0.0-dev-20260428212324",
4
4
  "description": "UI components library built with Lit",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -8,7 +8,7 @@
8
8
  "types": "./dist/index.d.ts",
9
9
  "sideEffects": [
10
10
  "./dist/index.js",
11
- "./dist/components/*.js"
11
+ "./dist/components/**/*.js"
12
12
  ],
13
13
  "exports": {
14
14
  ".": {
@@ -16,53 +16,109 @@
16
16
  "import": "./dist/index.js",
17
17
  "default": "./dist/index.js"
18
18
  },
19
- "./call-media": {
20
- "types": "./dist/components/call-media.d.ts",
21
- "import": "./dist/components/call-media.js"
19
+ "./sw-call-media": {
20
+ "types": "./dist/components/sw-call-media.d.ts",
21
+ "import": "./dist/components/sw-call-media.js"
22
22
  },
23
- "./self-media": {
24
- "types": "./dist/components/self-media.d.ts",
25
- "import": "./dist/components/self-media.js"
23
+ "./sw-self-media": {
24
+ "types": "./dist/components/sw-self-media.d.ts",
25
+ "import": "./dist/components/sw-self-media.js"
26
26
  },
27
- "./participants": {
28
- "types": "./dist/components/participants.d.ts",
29
- "import": "./dist/components/participants.js"
27
+ "./sw-local-camera": {
28
+ "types": "./dist/components/sw-local-camera.d.ts",
29
+ "import": "./dist/components/sw-local-camera.js"
30
30
  },
31
- "./call-controls": {
32
- "types": "./dist/components/call-controls.d.ts",
33
- "import": "./dist/components/call-controls.js"
31
+ "./sw-participants": {
32
+ "types": "./dist/components/sw-participants.d.ts",
33
+ "import": "./dist/components/sw-participants.js"
34
34
  },
35
- "./call-status": {
36
- "types": "./dist/components/call-status.d.ts",
37
- "import": "./dist/components/call-status.js"
35
+ "./sw-participant-controls": {
36
+ "types": "./dist/components/sw-participant-controls.d.ts",
37
+ "import": "./dist/components/sw-participant-controls.js"
38
38
  },
39
- "./audio-level": {
40
- "types": "./dist/components/audio-level.d.ts",
41
- "import": "./dist/components/audio-level.js"
39
+ "./sw-call-controls": {
40
+ "types": "./dist/components/sw-call-controls.d.ts",
41
+ "import": "./dist/components/sw-call-controls.js"
42
42
  },
43
- "./device-selector": {
44
- "types": "./dist/components/device-selector.d.ts",
45
- "import": "./dist/components/device-selector.js"
43
+ "./sw-call-status": {
44
+ "types": "./dist/components/sw-call-status.d.ts",
45
+ "import": "./dist/components/sw-call-status.js"
46
46
  },
47
- "./dialpad": {
48
- "types": "./dist/components/dialpad.d.ts",
49
- "import": "./dist/components/dialpad.js"
47
+ "./sw-call-provider": {
48
+ "types": "./dist/components/sw-call-provider.d.ts",
49
+ "import": "./dist/components/sw-call-provider.js"
50
50
  },
51
- "./click-to-call": {
52
- "types": "./dist/components/click-to-call.d.ts",
53
- "import": "./dist/components/click-to-call.js"
51
+ "./sw-call-dialpad": {
52
+ "types": "./dist/components/sw-call-dialpad.d.ts",
53
+ "import": "./dist/components/sw-call-dialpad.js"
54
54
  },
55
- "./directory": {
56
- "types": "./dist/components/directory.d.ts",
57
- "import": "./dist/components/directory.js"
55
+ "./sw-call-widget": {
56
+ "types": "./dist/components/sw-call-widget/sw-call-widget.d.ts",
57
+ "import": "./dist/components/sw-call-widget/sw-call-widget.js"
58
58
  },
59
- "./participant-controls": {
60
- "types": "./dist/components/participant-controls.d.ts",
61
- "import": "./dist/components/participant-controls.js"
59
+ "./sw-audio-level": {
60
+ "types": "./dist/components/sw-audio-level.d.ts",
61
+ "import": "./dist/components/sw-audio-level.js"
62
62
  },
63
- "./example-button": {
64
- "types": "./dist/components/example-button.d.ts",
65
- "import": "./dist/components/example-button.js"
63
+ "./sw-device-selector": {
64
+ "types": "./dist/components/sw-device-selector/index.d.ts",
65
+ "import": "./dist/components/sw-device-selector/index.js"
66
+ },
67
+ "./sw-click-to-call": {
68
+ "types": "./dist/components/sw-click-to-call.d.ts",
69
+ "import": "./dist/components/sw-click-to-call.js"
70
+ },
71
+ "./sw-directory": {
72
+ "types": "./dist/components/sw-directory.d.ts",
73
+ "import": "./dist/components/sw-directory.js"
74
+ },
75
+ "./sw-ui-icon": {
76
+ "types": "./dist/components/UI/icons/sw-ui-icon.d.ts",
77
+ "import": "./dist/components/UI/icons/sw-ui-icon.js"
78
+ },
79
+ "./sw-ui-dropup": {
80
+ "types": "./dist/components/UI/controls/sw-ui-dropup.d.ts",
81
+ "import": "./dist/components/UI/controls/sw-ui-dropup.js"
82
+ },
83
+ "./sw-ui-split-button": {
84
+ "types": "./dist/components/UI/controls/sw-ui-split-button.d.ts",
85
+ "import": "./dist/components/UI/controls/sw-ui-split-button.js"
86
+ },
87
+ "./sw-ui-control-bar": {
88
+ "types": "./dist/components/UI/controls/sw-ui-control-bar.d.ts",
89
+ "import": "./dist/components/UI/controls/sw-ui-control-bar.js"
90
+ },
91
+ "./sw-ui-dialpad": {
92
+ "types": "./dist/components/UI/controls/sw-ui-dialpad.d.ts",
93
+ "import": "./dist/components/UI/controls/sw-ui-dialpad.js"
94
+ },
95
+ "./sw-ui-call-layout": {
96
+ "types": "./dist/components/UI/layout/sw-ui-call-layout.d.ts",
97
+ "import": "./dist/components/UI/layout/sw-ui-call-layout.js"
98
+ },
99
+ "./sw-ui-background": {
100
+ "types": "./dist/components/UI/layout/sw-ui-background.d.ts",
101
+ "import": "./dist/components/UI/layout/sw-ui-background.js"
102
+ },
103
+ "./sw-ui-modal": {
104
+ "types": "./dist/components/UI/layout/sw-ui-modal.d.ts",
105
+ "import": "./dist/components/UI/layout/sw-ui-modal.js"
106
+ },
107
+ "./sw-ui-content-drawer": {
108
+ "types": "./dist/components/UI/layout/sw-ui-content-drawer.d.ts",
109
+ "import": "./dist/components/UI/layout/sw-ui-content-drawer.js"
110
+ },
111
+ "./sw-ui-responsive-container": {
112
+ "types": "./dist/components/UI/layout/sw-ui-responsive-container.d.ts",
113
+ "import": "./dist/components/UI/layout/sw-ui-responsive-container.js"
114
+ },
115
+ "./sw-ui-alert": {
116
+ "types": "./dist/components/UI/sw-ui-alert.d.ts",
117
+ "import": "./dist/components/UI/sw-ui-alert.js"
118
+ },
119
+ "./sw-ui-transcript-view": {
120
+ "types": "./dist/components/UI/sw-ui-transcript-view.d.ts",
121
+ "import": "./dist/components/UI/sw-ui-transcript-view.js"
66
122
  },
67
123
  "./context": {
68
124
  "types": "./dist/context/index.d.ts",
@@ -113,15 +169,19 @@
113
169
  "license": "MIT",
114
170
  "dependencies": {
115
171
  "@lit/context": "^1.1.0",
172
+ "dompurify": "^3.4.0",
116
173
  "lit": "^3.2.1",
174
+ "marked": "^9.1.6",
175
+ "prismjs": "^1.30.0",
117
176
  "rxjs": "^7.8.2"
118
177
  },
119
178
  "peerDependencies": {
120
- "@signalwire/js": "4.0.0-dev-20260428141127"
179
+ "@signalwire/js": "4.0.0-dev-20260428212324"
121
180
  },
122
181
  "devDependencies": {
123
182
  "@playwright/test": "^1.56.1",
124
183
  "@types/node": "^20.19.24",
184
+ "@types/prismjs": "^1.26.6",
125
185
  "@typescript-eslint/eslint-plugin": "^8.46.3",
126
186
  "@vaadin/router": "^2.0.1",
127
187
  "@vitest/coverage-v8": "^3.2.4",
@@ -1 +0,0 @@
1
- {"version":3,"file":"audio-level.d.ts","sourceRoot":"","sources":["../../src/components/audio-level.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAG5C,qBACa,UAAW,SAAQ,UAAU;IACxC,MAAM,CAAC,MAAM,0BAiEX;IAEF;;OAEG;IACyB,MAAM,CAAC,EAAE,WAAW,CAAC;IAEjD;;OAEG;IACyB,IAAI,SAAK;IAErC;;OAEG;IACwC,WAAW,EAAE,UAAU,GAAG,YAAY,CAAc;IAE/F;;OAEG;IACyB,OAAO,SAAM;IAEzC;;OAEG;IACM,OAAO,CAAC,OAAO,CAAgB;IAExC;;OAEG;IACH,OAAO,CAAC,aAAa,CAAC,CAAe;IAErC;;OAEG;IACH,OAAO,CAAC,SAAS,CAAC,CAAe;IAEjC;;OAEG;IACH,OAAO,CAAC,OAAO,CAAC,CAA6B;IAE7C;;OAEG;IACH,OAAO,CAAC,iBAAiB,CAAC,CAAS;IAEnC;;OAEG;IACH,OAAO,CAAC,UAAU,CAAC,CAA0B;IAE7C;;OAEG;IACH,iBAAiB;IAQjB;;OAEG;IACH,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAehE;;OAEG;IACH,oBAAoB;IAKpB;;;OAGG;IACI,gBAAgB,IAAI,IAAI;IAK/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkC1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgC5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAyC1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAIhB;;OAEG;IACH,MAAM;CA0BP;AAED;;GAEG;AACH,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,gBAAgB,EAAE,UAAU,CAAC;KAC9B;CACF"}
@@ -1,203 +0,0 @@
1
- import { LitElement as b, html as p, css as y } from "lit";
2
- import { property as c, state as f, customElement as _ } from "lit/decorators.js";
3
- var w = Object.defineProperty, g = Object.getOwnPropertyDescriptor, l = (t, e, s, a) => {
4
- for (var i = a > 1 ? void 0 : a ? g(e, s) : e, r = t.length - 1, o; r >= 0; r--)
5
- (o = t[r]) && (i = (a ? o(e, s, i) : o(i)) || i);
6
- return a && i && w(e, s, i), i;
7
- };
8
- let n = class extends b {
9
- constructor() {
10
- super(...arguments), this.bars = 5, this.orientation = "vertical", this.maxSize = 32, this._levels = [];
11
- }
12
- /**
13
- * Lifecycle: Component connected to DOM
14
- */
15
- connectedCallback() {
16
- super.connectedCallback(), this._levels = new Array(this.bars).fill(0), this.stream && this.setupAudioAnalysis();
17
- }
18
- /**
19
- * Lifecycle: React to property changes
20
- */
21
- updated(t) {
22
- super.updated(t), t.has("stream") && (this.cleanupAudioAnalysis(), this.stream && this.setupAudioAnalysis()), t.has("bars") && (this._levels = new Array(this.bars).fill(0));
23
- }
24
- /**
25
- * Lifecycle: Component disconnected from DOM
26
- */
27
- disconnectedCallback() {
28
- super.disconnectedCallback(), this.cleanupAudioAnalysis();
29
- }
30
- /**
31
- * Public method to release all audio resources immediately
32
- * Call this before stopping the MediaStream tracks to ensure proper cleanup
33
- */
34
- releaseResources() {
35
- this.cleanupAudioAnalysis(), this.stream = void 0;
36
- }
37
- /**
38
- * Setup Web Audio API for audio level analysis
39
- */
40
- setupAudioAnalysis() {
41
- if (!this.stream) return;
42
- if (this.stream.getAudioTracks().length === 0) {
43
- console.warn("sw-audio-level: MediaStream has no audio tracks");
44
- return;
45
- }
46
- try {
47
- this._audioContext = new AudioContext(), this._analyser = this._audioContext.createAnalyser(), this._analyser.fftSize = 256, this._analyser.smoothingTimeConstant = 0.8, this._source = this._audioContext.createMediaStreamSource(this.stream), this._source.connect(this._analyser);
48
- const e = this._analyser.frequencyBinCount;
49
- this._dataArray = new Uint8Array(e), this.startAnimationLoop();
50
- } catch (e) {
51
- console.error("sw-audio-level: Failed to setup audio analysis:", e);
52
- }
53
- }
54
- /**
55
- * Cleanup Web Audio API resources
56
- */
57
- cleanupAudioAnalysis() {
58
- this._animationFrameId !== void 0 && (cancelAnimationFrame(this._animationFrameId), this._animationFrameId = void 0), this._source && (this._source.disconnect(), this._source = void 0), this._analyser && (this._analyser.disconnect(), this._analyser = void 0), this._audioContext && this._audioContext.state !== "closed" && (this._audioContext.close().catch(console.error), this._audioContext = void 0), this._dataArray = void 0, this._levels = new Array(this.bars).fill(0);
59
- }
60
- /**
61
- * Start the animation loop for updating levels
62
- */
63
- startAnimationLoop() {
64
- const t = () => {
65
- const e = this._analyser, s = this._dataArray;
66
- if (!e || !s)
67
- return;
68
- e.getByteFrequencyData(s);
69
- const a = [], i = s.length, r = Math.floor(i / this.bars);
70
- for (let o = 0; o < this.bars; o++) {
71
- const h = o * r, u = Math.min(h + r, i);
72
- let m = 0;
73
- for (let d = h; d < u; d++)
74
- m += s[d] ?? 0;
75
- const v = m / (u - h);
76
- a.push(v / 255);
77
- }
78
- this._levels = a, this.requestUpdate(), this._animationFrameId = requestAnimationFrame(t);
79
- };
80
- this._animationFrameId = requestAnimationFrame(t);
81
- }
82
- /**
83
- * Get the color class based on level
84
- */
85
- getLevelClass(t) {
86
- return t > 0.7 ? "level-high" : t > 0.4 ? "level-medium" : t > 0.05 ? "level-low" : "";
87
- }
88
- /**
89
- * Get the active class if level is above threshold
90
- */
91
- isActive(t) {
92
- return t > 0.05;
93
- }
94
- /**
95
- * Render the component
96
- */
97
- render() {
98
- const t = this._levels.length === this.bars ? this._levels : new Array(this.bars).fill(0);
99
- return p`
100
- <div class="container" part="container">
101
- ${t.map((e, s) => {
102
- const a = this.isActive(e), i = this.getLevelClass(e), r = Math.max(4, e * this.maxSize), o = this.orientation === "horizontal" ? `width: ${r}px;` : `height: ${r}px;`;
103
- return p`
104
- <div
105
- class="bar ${a ? "active" : ""} ${i}"
106
- part="bar ${a ? "bar-active" : ""}"
107
- style="${o}"
108
- data-bar-index="${s}"
109
- ></div>
110
- `;
111
- })}
112
- </div>
113
- `;
114
- }
115
- };
116
- n.styles = y`
117
- :host {
118
- /* CSS Custom Properties for theming */
119
- --sw-color-success: #10b981;
120
- --sw-color-warning: #f59e0b;
121
- --sw-color-danger: #ef4444;
122
- --sw-audio-bar-width: 4px;
123
- --sw-audio-bar-gap: 2px;
124
- --sw-audio-bar-radius: 2px;
125
- --sw-audio-bar-background: rgba(255, 255, 255, 0.2);
126
-
127
- display: inline-flex;
128
- }
129
-
130
- .container {
131
- display: flex;
132
- align-items: flex-end;
133
- justify-content: center;
134
- gap: var(--sw-audio-bar-gap);
135
- }
136
-
137
- :host([orientation='horizontal']) .container {
138
- flex-direction: row;
139
- align-items: center;
140
- }
141
-
142
- :host([orientation='vertical']) .container,
143
- .container {
144
- flex-direction: row;
145
- align-items: flex-end;
146
- }
147
-
148
- .bar {
149
- width: var(--sw-audio-bar-width);
150
- background: var(--sw-audio-bar-background);
151
- border-radius: var(--sw-audio-bar-radius);
152
- transition:
153
- height 0.05s ease-out,
154
- width 0.05s ease-out,
155
- background-color 0.1s ease;
156
- min-height: 4px;
157
- }
158
-
159
- :host([orientation='horizontal']) .bar {
160
- height: var(--sw-audio-bar-width);
161
- width: 4px;
162
- min-width: 4px;
163
- min-height: auto;
164
- }
165
-
166
- .bar.active {
167
- /* Color is set dynamically via inline style */
168
- }
169
-
170
- .bar.level-low {
171
- background-color: var(--sw-color-success);
172
- }
173
-
174
- .bar.level-medium {
175
- background-color: var(--sw-color-warning);
176
- }
177
-
178
- .bar.level-high {
179
- background-color: var(--sw-color-danger);
180
- }
181
- `;
182
- l([
183
- c({ type: Object })
184
- ], n.prototype, "stream", 2);
185
- l([
186
- c({ type: Number })
187
- ], n.prototype, "bars", 2);
188
- l([
189
- c({ type: String, reflect: !0 })
190
- ], n.prototype, "orientation", 2);
191
- l([
192
- c({ type: Number })
193
- ], n.prototype, "maxSize", 2);
194
- l([
195
- f()
196
- ], n.prototype, "_levels", 2);
197
- n = l([
198
- _("sw-audio-level")
199
- ], n);
200
- export {
201
- n as AudioLevel
202
- };
203
- //# sourceMappingURL=audio-level.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"audio-level.js","sources":["../../src/components/audio-level.ts"],"sourcesContent":["/**\n * Audio Level Component\n *\n * Visual audio level indicator that renders real-time audio levels from a MediaStream\n * via Web Audio API. Displays configurable number of bars with color transitions\n * based on audio intensity.\n *\n * @example\n * ```html\n * <sw-audio-level .stream=${mediaStream} bars=\"5\" orientation=\"vertical\"></sw-audio-level>\n * ```\n *\n * @cssprop [--sw-color-success=#10b981] - Color for low audio levels.\n * @cssprop [--sw-color-warning=#f59e0b] - Color for medium audio levels.\n * @cssprop [--sw-color-danger=#ef4444] - Color for high audio levels.\n * @cssprop [--sw-audio-bar-width=4px] - Width of each audio level bar.\n * @cssprop [--sw-audio-bar-gap=2px] - Gap between audio level bars.\n * @cssprop [--sw-audio-bar-radius=2px] - Border radius of each bar.\n * @cssprop [--sw-audio-bar-background=#404040] - Background color of inactive bars.\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\n@customElement('sw-audio-level')\nexport class AudioLevel extends LitElement {\n static styles = css`\n :host {\n /* CSS Custom Properties for theming */\n --sw-color-success: #10b981;\n --sw-color-warning: #f59e0b;\n --sw-color-danger: #ef4444;\n --sw-audio-bar-width: 4px;\n --sw-audio-bar-gap: 2px;\n --sw-audio-bar-radius: 2px;\n --sw-audio-bar-background: rgba(255, 255, 255, 0.2);\n\n display: inline-flex;\n }\n\n .container {\n display: flex;\n align-items: flex-end;\n justify-content: center;\n gap: var(--sw-audio-bar-gap);\n }\n\n :host([orientation='horizontal']) .container {\n flex-direction: row;\n align-items: center;\n }\n\n :host([orientation='vertical']) .container,\n .container {\n flex-direction: row;\n align-items: flex-end;\n }\n\n .bar {\n width: var(--sw-audio-bar-width);\n background: var(--sw-audio-bar-background);\n border-radius: var(--sw-audio-bar-radius);\n transition:\n height 0.05s ease-out,\n width 0.05s ease-out,\n background-color 0.1s ease;\n min-height: 4px;\n }\n\n :host([orientation='horizontal']) .bar {\n height: var(--sw-audio-bar-width);\n width: 4px;\n min-width: 4px;\n min-height: auto;\n }\n\n .bar.active {\n /* Color is set dynamically via inline style */\n }\n\n .bar.level-low {\n background-color: var(--sw-color-success);\n }\n\n .bar.level-medium {\n background-color: var(--sw-color-warning);\n }\n\n .bar.level-high {\n background-color: var(--sw-color-danger);\n }\n `;\n\n /**\n * MediaStream to analyze for audio levels\n */\n @property({ type: Object }) stream?: MediaStream;\n\n /**\n * Number of bars to display (default: 5)\n */\n @property({ type: Number }) bars = 5;\n\n /**\n * Orientation of the bars: 'vertical' or 'horizontal'\n */\n @property({ type: String, reflect: true }) orientation: 'vertical' | 'horizontal' = 'vertical';\n\n /**\n * Maximum height/width of bars in pixels\n */\n @property({ type: Number }) maxSize = 32;\n\n /**\n * Current audio levels for each bar (0-1)\n */\n @state() private _levels: number[] = [];\n\n /**\n * Web Audio API context\n */\n private _audioContext?: AudioContext;\n\n /**\n * Analyser node for frequency data\n */\n private _analyser?: AnalyserNode;\n\n /**\n * Source node connected to the MediaStream\n */\n private _source?: MediaStreamAudioSourceNode;\n\n /**\n * Animation frame ID for cleanup\n */\n private _animationFrameId?: number;\n\n /**\n * Frequency data buffer\n */\n private _dataArray?: Uint8Array<ArrayBuffer>;\n\n /**\n * Lifecycle: Component connected to DOM\n */\n connectedCallback() {\n super.connectedCallback();\n this._levels = new Array(this.bars).fill(0);\n if (this.stream) {\n this.setupAudioAnalysis();\n }\n }\n\n /**\n * Lifecycle: React to property changes\n */\n protected updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n if (changedProperties.has('stream')) {\n this.cleanupAudioAnalysis();\n if (this.stream) {\n this.setupAudioAnalysis();\n }\n }\n\n if (changedProperties.has('bars')) {\n this._levels = new Array(this.bars).fill(0);\n }\n }\n\n /**\n * Lifecycle: Component disconnected from DOM\n */\n disconnectedCallback() {\n super.disconnectedCallback();\n this.cleanupAudioAnalysis();\n }\n\n /**\n * Public method to release all audio resources immediately\n * Call this before stopping the MediaStream tracks to ensure proper cleanup\n */\n public releaseResources(): void {\n this.cleanupAudioAnalysis();\n this.stream = undefined;\n }\n\n /**\n * Setup Web Audio API for audio level analysis\n */\n private setupAudioAnalysis(): void {\n if (!this.stream) return;\n\n // Check if stream has audio tracks\n const audioTracks = this.stream.getAudioTracks();\n if (audioTracks.length === 0) {\n console.warn('sw-audio-level: MediaStream has no audio tracks');\n return;\n }\n\n try {\n // Create AudioContext\n this._audioContext = new AudioContext();\n\n // Create analyser node\n this._analyser = this._audioContext.createAnalyser();\n this._analyser.fftSize = 256;\n this._analyser.smoothingTimeConstant = 0.8;\n\n // Create source from MediaStream\n this._source = this._audioContext.createMediaStreamSource(this.stream);\n this._source.connect(this._analyser);\n\n // Create data array for frequency data\n const bufferLength = this._analyser.frequencyBinCount;\n this._dataArray = new Uint8Array(bufferLength);\n\n // Start animation loop\n this.startAnimationLoop();\n } catch (error) {\n console.error('sw-audio-level: Failed to setup audio analysis:', error);\n }\n }\n\n /**\n * Cleanup Web Audio API resources\n */\n private cleanupAudioAnalysis(): void {\n // Cancel animation frame\n if (this._animationFrameId !== undefined) {\n cancelAnimationFrame(this._animationFrameId);\n this._animationFrameId = undefined;\n }\n\n // Disconnect source\n if (this._source) {\n this._source.disconnect();\n this._source = undefined;\n }\n\n // Disconnect analyser (not strictly necessary but good practice)\n if (this._analyser) {\n this._analyser.disconnect();\n this._analyser = undefined;\n }\n\n // Close AudioContext\n if (this._audioContext && this._audioContext.state !== 'closed') {\n this._audioContext.close().catch(console.error);\n this._audioContext = undefined;\n }\n\n // Clear data array\n this._dataArray = undefined;\n\n // Reset levels\n this._levels = new Array(this.bars).fill(0);\n }\n\n /**\n * Start the animation loop for updating levels\n */\n private startAnimationLoop(): void {\n const updateLevels = () => {\n const analyser = this._analyser;\n const dataArray = this._dataArray;\n if (!analyser || !dataArray) {\n return;\n }\n\n // Get frequency data\n analyser.getByteFrequencyData(dataArray);\n\n // Calculate levels for each bar by sampling frequency ranges\n const levels: number[] = [];\n const binCount = dataArray.length;\n const binsPerBar = Math.floor(binCount / this.bars);\n\n for (let i = 0; i < this.bars; i++) {\n const startBin = i * binsPerBar;\n const endBin = Math.min(startBin + binsPerBar, binCount);\n\n // Average the frequency values for this bar's range\n let sum = 0;\n for (let j = startBin; j < endBin; j++) {\n sum += dataArray[j] ?? 0;\n }\n const average = sum / (endBin - startBin);\n\n // Normalize to 0-1 range\n levels.push(average / 255);\n }\n\n this._levels = levels;\n this.requestUpdate();\n\n // Schedule next frame\n this._animationFrameId = requestAnimationFrame(updateLevels);\n };\n\n this._animationFrameId = requestAnimationFrame(updateLevels);\n }\n\n /**\n * Get the color class based on level\n */\n private getLevelClass(level: number): string {\n if (level > 0.7) return 'level-high';\n if (level > 0.4) return 'level-medium';\n if (level > 0.05) return 'level-low';\n return '';\n }\n\n /**\n * Get the active class if level is above threshold\n */\n private isActive(level: number): boolean {\n return level > 0.05;\n }\n\n /**\n * Render the component\n */\n render() {\n // Ensure we have the right number of levels\n const levels = this._levels.length === this.bars ? this._levels : new Array(this.bars).fill(0);\n\n return html`\n <div class=\"container\" part=\"container\">\n ${levels.map((level, index) => {\n const isActive = this.isActive(level);\n const levelClass = this.getLevelClass(level);\n const size = Math.max(4, level * this.maxSize);\n\n const style =\n this.orientation === 'horizontal' ? `width: ${size}px;` : `height: ${size}px;`;\n\n return html`\n <div\n class=\"bar ${isActive ? 'active' : ''} ${levelClass}\"\n part=\"bar ${isActive ? 'bar-active' : ''}\"\n style=\"${style}\"\n data-bar-index=\"${index}\"\n ></div>\n `;\n })}\n </div>\n `;\n }\n}\n\n/**\n * Declare global type for TypeScript\n */\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-audio-level': AudioLevel;\n }\n}\n"],"names":["AudioLevel","LitElement","changedProperties","bufferLength","error","updateLevels","analyser","dataArray","levels","binCount","binsPerBar","i","startBin","endBin","sum","j","average","level","html","index","isActive","levelClass","size","style","css","__decorateClass","property","state","customElement"],"mappings":"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"}