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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) 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 +3225 -0
  239. package/dist/embed/signalwire-web-components-embed.iife.js.map +1 -0
  240. package/dist/embed/signalwire-web-components-embed.umd.cjs +3225 -0
  241. package/dist/embed/signalwire-web-components-embed.umd.cjs.map +1 -0
  242. package/dist/embed.d.ts +20 -0
  243. package/dist/embed.d.ts.map +1 -0
  244. package/dist/index.d.ts +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 +451 -0
  274. package/dist/theme.css.js +5 -0
  275. package/dist/theme.css.js.map +1 -0
  276. package/dist/utils/index.d.ts +2 -0
  277. package/dist/utils/index.d.ts.map +1 -1
  278. package/dist/utils/prism.d.ts +4 -0
  279. package/dist/utils/prism.d.ts.map +1 -0
  280. package/dist/utils/prism.js +34 -0
  281. package/dist/utils/prism.js.map +1 -0
  282. package/dist/utils/theme-loader.d.ts +11 -0
  283. package/dist/utils/theme-loader.d.ts.map +1 -0
  284. package/dist/utils/theme-loader.js +17 -0
  285. package/dist/utils/theme-loader.js.map +1 -0
  286. package/dist/utils/transcriptToMarkdown.d.ts +14 -0
  287. package/dist/utils/transcriptToMarkdown.d.ts.map +1 -0
  288. package/dist/utils/transcriptToMarkdown.js +59 -0
  289. package/dist/utils/transcriptToMarkdown.js.map +1 -0
  290. package/dist/utils/use-google-font.d.ts +18 -0
  291. package/dist/utils/use-google-font.d.ts.map +1 -0
  292. package/dist/utils/use-google-font.js +12 -0
  293. package/dist/utils/use-google-font.js.map +1 -0
  294. package/dist/utils/user-variables.d.ts +20 -0
  295. package/dist/utils/user-variables.d.ts.map +1 -0
  296. package/dist/utils/user-variables.js +37 -0
  297. package/dist/utils/user-variables.js.map +1 -0
  298. package/package.json +104 -41
  299. package/dist/components/audio-level.d.ts.map +0 -1
  300. package/dist/components/audio-level.js +0 -203
  301. package/dist/components/audio-level.js.map +0 -1
  302. package/dist/components/call-controls.d.ts +0 -183
  303. package/dist/components/call-controls.d.ts.map +0 -1
  304. package/dist/components/call-controls.js +0 -606
  305. package/dist/components/call-controls.js.map +0 -1
  306. package/dist/components/call-media.d.ts +0 -118
  307. package/dist/components/call-media.d.ts.map +0 -1
  308. package/dist/components/call-media.js +0 -219
  309. package/dist/components/call-media.js.map +0 -1
  310. package/dist/components/call-status.d.ts +0 -83
  311. package/dist/components/call-status.d.ts.map +0 -1
  312. package/dist/components/call-status.js +0 -255
  313. package/dist/components/call-status.js.map +0 -1
  314. package/dist/components/click-to-call.d.ts +0 -151
  315. package/dist/components/click-to-call.d.ts.map +0 -1
  316. package/dist/components/click-to-call.js +0 -428
  317. package/dist/components/click-to-call.js.map +0 -1
  318. package/dist/components/device-selector.d.ts +0 -238
  319. package/dist/components/device-selector.d.ts.map +0 -1
  320. package/dist/components/device-selector.js +0 -685
  321. package/dist/components/device-selector.js.map +0 -1
  322. package/dist/components/dialpad.d.ts +0 -74
  323. package/dist/components/dialpad.d.ts.map +0 -1
  324. package/dist/components/dialpad.js +0 -372
  325. package/dist/components/dialpad.js.map +0 -1
  326. package/dist/components/directory.d.ts.map +0 -1
  327. package/dist/components/directory.js +0 -503
  328. package/dist/components/directory.js.map +0 -1
  329. package/dist/components/example-button.d.ts +0 -21
  330. package/dist/components/example-button.d.ts.map +0 -1
  331. package/dist/components/example-button.js +0 -74
  332. package/dist/components/example-button.js.map +0 -1
  333. package/dist/components/participant-controls.d.ts +0 -123
  334. package/dist/components/participant-controls.d.ts.map +0 -1
  335. package/dist/components/participant-controls.js +0 -468
  336. package/dist/components/participant-controls.js.map +0 -1
  337. package/dist/components/participants.d.ts +0 -120
  338. package/dist/components/participants.d.ts.map +0 -1
  339. package/dist/components/participants.js +0 -394
  340. package/dist/components/participants.js.map +0 -1
  341. package/dist/components/self-media.d.ts +0 -78
  342. package/dist/components/self-media.d.ts.map +0 -1
  343. package/dist/components/self-media.js +0 -129
  344. package/dist/components/self-media.js.map +0 -1
  345. package/dist/context/call-context.d.ts +0 -13
  346. package/dist/context/call-context.d.ts.map +0 -1
  347. package/dist/context/call-context.js +0 -6
  348. package/dist/context/call-context.js.map +0 -1
  349. package/dist/types/index.js +0 -12
  350. package/dist/types/index.js.map +0 -1
@@ -0,0 +1,359 @@
1
+ import { LitElement as u, html as d, css as g } from "lit";
2
+ import { property as c, state as p, customElement as h } from "lit/decorators.js";
3
+ var b = Object.defineProperty, f = Object.getOwnPropertyDescriptor, r = (t, e, l, a) => {
4
+ for (var i = a > 1 ? void 0 : a ? f(e, l) : e, n = t.length - 1, o; n >= 0; n--)
5
+ (o = t[n]) && (i = (a ? o(e, l, i) : o(i)) || i);
6
+ return a && i && b(e, l, i), i;
7
+ };
8
+ const v = /^[0-9*#]$/, y = 500, m = [
9
+ { digit: "1", letters: "" },
10
+ { digit: "2", letters: "ABC" },
11
+ { digit: "3", letters: "DEF" },
12
+ { digit: "4", letters: "GHI" },
13
+ { digit: "5", letters: "JKL" },
14
+ { digit: "6", letters: "MNO" },
15
+ { digit: "7", letters: "PQRS" },
16
+ { digit: "8", letters: "TUV" },
17
+ { digit: "9", letters: "WXYZ" },
18
+ { digit: "*", letters: "" },
19
+ { digit: "0", letters: "+" },
20
+ { digit: "#", letters: "" }
21
+ ];
22
+ let s = class extends u {
23
+ constructor() {
24
+ super(...arguments), this.showCallButton = !1, this.allowText = !1, this.placeholder = "Enter number", this.digits = "", this.pressedKey = null, this._longPressTimer = null, this._longPressFired = !1;
25
+ }
26
+ _startLongPress(t) {
27
+ this._cancelLongPress(), this._longPressFired = !1, this._longPressTimer = setTimeout(() => {
28
+ this._longPressFired = !0, this._longPressTimer = null, t();
29
+ }, y);
30
+ }
31
+ _cancelLongPress() {
32
+ this._longPressTimer !== null && (clearTimeout(this._longPressTimer), this._longPressTimer = null);
33
+ }
34
+ disconnectedCallback() {
35
+ this._cancelLongPress(), super.disconnectedCallback();
36
+ }
37
+ _clearAll() {
38
+ this.digits.length !== 0 && (this.digits = "", this.dispatchEvent(
39
+ new CustomEvent("sw-dialpad-backspace", {
40
+ detail: { digits: this.digits },
41
+ bubbles: !0,
42
+ composed: !0
43
+ })
44
+ ));
45
+ }
46
+ _pressDigit(t) {
47
+ this.digits += t, this.pressedKey = t, this.dispatchEvent(
48
+ new CustomEvent("sw-digit-press", {
49
+ detail: { digit: t, digits: this.digits },
50
+ bubbles: !0,
51
+ composed: !0
52
+ })
53
+ ), setTimeout(() => {
54
+ this.pressedKey = null;
55
+ }, 100);
56
+ }
57
+ _backspace() {
58
+ this.digits.length !== 0 && (this.digits = this.digits.slice(0, -1), this.dispatchEvent(
59
+ new CustomEvent("sw-dialpad-backspace", {
60
+ detail: { digits: this.digits },
61
+ bubbles: !0,
62
+ composed: !0
63
+ })
64
+ ));
65
+ }
66
+ _dial() {
67
+ this.digits.length !== 0 && this.dispatchEvent(
68
+ new CustomEvent("sw-dial", {
69
+ detail: { digits: this.digits },
70
+ bubbles: !0,
71
+ composed: !0
72
+ })
73
+ );
74
+ }
75
+ /**
76
+ * Handle keyboard input on the display field.
77
+ * We intercept all keys and manage state ourselves to prevent the browser
78
+ * from accumulating non-DTMF characters in the input value.
79
+ */
80
+ _onKeyDown(t) {
81
+ const { key: e } = t;
82
+ if (this.allowText) {
83
+ e === "Enter" && this.showCallButton && (t.preventDefault(), this._dial());
84
+ return;
85
+ }
86
+ v.test(e) ? (t.preventDefault(), this._pressDigit(e)) : e === "Backspace" ? (t.preventDefault(), this._backspace()) : e === "Enter" && this.showCallButton ? (t.preventDefault(), this._dial()) : e !== "Tab" && !t.ctrlKey && !t.metaKey && t.preventDefault();
87
+ }
88
+ _onInput(t) {
89
+ if (!this.allowText) return;
90
+ const e = t.target.value;
91
+ this.digits = e, this.dispatchEvent(
92
+ new CustomEvent("sw-dialpad-input", {
93
+ detail: { digits: this.digits },
94
+ bubbles: !0,
95
+ composed: !0
96
+ })
97
+ );
98
+ }
99
+ render() {
100
+ return d`
101
+ <div class="container" part="container">
102
+ <div class="display" part="display">
103
+ <input
104
+ type=${this.allowText ? "text" : "tel"}
105
+ class="display-input"
106
+ .value=${this.digits}
107
+ placeholder=${this.placeholder}
108
+ @keydown=${this._onKeyDown}
109
+ @input=${this._onInput}
110
+ aria-label="Phone number input"
111
+ />
112
+ <button
113
+ class="backspace-button"
114
+ @click=${() => {
115
+ if (this._longPressFired) {
116
+ this._longPressFired = !1;
117
+ return;
118
+ }
119
+ this._backspace();
120
+ }}
121
+ @pointerdown=${() => this._startLongPress(() => this._clearAll())}
122
+ @pointerup=${() => this._cancelLongPress()}
123
+ @pointerleave=${() => this._cancelLongPress()}
124
+ @pointercancel=${() => this._cancelLongPress()}
125
+ ?disabled=${this.digits.length === 0}
126
+ aria-label="Delete last digit (long-press to clear)"
127
+ >
128
+ <sw-ui-icon name="backspace" size="24"></sw-ui-icon>
129
+ </button>
130
+ </div>
131
+
132
+ <div class="keypad" part="keypad" role="group" aria-label="Telephone keypad">
133
+ ${m.map(
134
+ (t) => d`
135
+ <button
136
+ class="key ${this.pressedKey === t.digit ? "pressed" : ""}"
137
+ part="key ${this.pressedKey === t.digit ? "key-pressed" : ""}"
138
+ @click=${() => {
139
+ if (this._longPressFired) {
140
+ this._longPressFired = !1;
141
+ return;
142
+ }
143
+ this._pressDigit(t.digit);
144
+ }}
145
+ @pointerdown=${t.digit === "0" ? () => this._startLongPress(() => this._pressDigit("+")) : void 0}
146
+ @pointerup=${t.digit === "0" ? () => this._cancelLongPress() : void 0}
147
+ @pointerleave=${t.digit === "0" ? () => this._cancelLongPress() : void 0}
148
+ @pointercancel=${t.digit === "0" ? () => this._cancelLongPress() : void 0}
149
+ aria-label="${t.digit}${t.letters ? `, ${t.letters}` : ""}${t.digit === "0" ? " (long-press for +)" : ""}"
150
+ >
151
+ <span class="key-digit">${t.digit}</span>
152
+ <span class="key-letters">${t.letters}</span>
153
+ </button>
154
+ `
155
+ )}
156
+ </div>
157
+
158
+ ${this.showCallButton ? d`
159
+ <button
160
+ class="call-button"
161
+ part="call-button"
162
+ @click=${this._dial}
163
+ ?disabled=${this.digits.length === 0}
164
+ aria-label="Call ${this.digits}"
165
+ >
166
+ <sw-ui-icon name="phone-call" size="20"></sw-ui-icon> Call
167
+ </button>
168
+ ` : null}
169
+ </div>
170
+ `;
171
+ }
172
+ };
173
+ s.styles = g`
174
+ :host {
175
+ --sw-dialpad-display-size: 32px;
176
+ --sw-dialpad-key-size: 24px;
177
+ display: block;
178
+ font-family: var(--type-family-body);
179
+ }
180
+
181
+ .container {
182
+ display: flex;
183
+ flex-direction: column;
184
+ gap: var(--sp-3);
185
+ padding: var(--sp-4);
186
+ max-width: 280px;
187
+ background: var(--bg-surface);
188
+ border-radius: var(--radius-md);
189
+ }
190
+
191
+ .display {
192
+ display: flex;
193
+ align-items: center;
194
+ justify-content: space-between;
195
+ padding: var(--sp-3) var(--sp-4);
196
+ background: var(--bg-surface-raised);
197
+ border-radius: var(--radius-md);
198
+ min-height: 48px;
199
+ }
200
+
201
+ .display-input {
202
+ flex: 1;
203
+ font-size: var(--sw-dialpad-display-size);
204
+ font-weight: 500;
205
+ font-family: var(--type-family-body);
206
+ color: var(--fg-default);
207
+ background: transparent;
208
+ border: none;
209
+ outline: none;
210
+ letter-spacing: 2px;
211
+ text-align: center;
212
+ width: 100%;
213
+ }
214
+
215
+ .display-input::placeholder {
216
+ color: var(--fg-muted);
217
+ font-size: var(--type-size-body);
218
+ letter-spacing: normal;
219
+ }
220
+
221
+ .backspace-button {
222
+ display: flex;
223
+ align-items: center;
224
+ justify-content: center;
225
+ width: 40px;
226
+ height: 40px;
227
+ background: transparent;
228
+ border: none;
229
+ border-radius: var(--radius-md);
230
+ cursor: pointer;
231
+ color: var(--fg-muted);
232
+ transition:
233
+ background-color 0.15s ease,
234
+ color 0.15s ease;
235
+ }
236
+
237
+ .backspace-button:hover {
238
+ background: var(--interactive-dropdown-hover);
239
+ color: var(--fg-default);
240
+ }
241
+
242
+ .backspace-button:disabled {
243
+ opacity: 0.3;
244
+ cursor: not-allowed;
245
+ }
246
+
247
+ .backspace-button sw-ui-icon {
248
+ pointer-events: none;
249
+ }
250
+
251
+ .keypad {
252
+ display: grid;
253
+ grid-template-columns: repeat(3, minmax(0, 72px));
254
+ justify-content: center;
255
+ gap: var(--sp-2);
256
+ }
257
+
258
+ .key {
259
+ display: flex;
260
+ flex-direction: column;
261
+ align-items: center;
262
+ justify-content: center;
263
+ min-width: 0;
264
+ aspect-ratio: 1;
265
+ background: var(--bg-surface);
266
+ border: 1px solid var(--border-default);
267
+ border-radius: var(--radius-full);
268
+ cursor: pointer;
269
+ transition:
270
+ background-color 0.1s ease,
271
+ transform 0.1s ease;
272
+ user-select: none;
273
+ -webkit-user-select: none;
274
+ -webkit-tap-highlight-color: transparent;
275
+ }
276
+
277
+ .key:hover {
278
+ background: var(--bg-surface-raised);
279
+ }
280
+
281
+ .key:active,
282
+ .key.pressed {
283
+ background: var(--interactive-dropdown-hover);
284
+ transform: scale(0.95);
285
+ }
286
+
287
+ .key-digit {
288
+ font-size: var(--sw-dialpad-key-size);
289
+ font-weight: 500;
290
+ color: var(--fg-default);
291
+ line-height: 1;
292
+ }
293
+
294
+ .key-letters {
295
+ font-size: var(--type-size-caption);
296
+ color: var(--fg-muted);
297
+ text-transform: uppercase;
298
+ letter-spacing: 1px;
299
+ margin-top: 2px;
300
+ min-height: 14px;
301
+ }
302
+
303
+ .call-button {
304
+ display: flex;
305
+ align-items: center;
306
+ justify-content: center;
307
+ width: 100%;
308
+ height: 56px;
309
+ background: var(--interactive-status-success);
310
+ border: none;
311
+ border-radius: var(--radius-md);
312
+ cursor: pointer;
313
+ color: white;
314
+ font-size: var(--type-size-body);
315
+ font-weight: 600;
316
+ font-family: var(--type-family-body);
317
+ transition: background-color 0.15s ease;
318
+ gap: var(--sp-2);
319
+ }
320
+
321
+ .call-button:hover {
322
+ background: #0ea472;
323
+ }
324
+
325
+ .call-button:active {
326
+ background: #0d9668;
327
+ }
328
+
329
+ .call-button:disabled {
330
+ opacity: 0.5;
331
+ cursor: not-allowed;
332
+ }
333
+
334
+ .call-button sw-ui-icon {
335
+ pointer-events: none;
336
+ }
337
+ `;
338
+ r([
339
+ c({ type: Boolean, reflect: !0, attribute: "show-call-button" })
340
+ ], s.prototype, "showCallButton", 2);
341
+ r([
342
+ c({ type: Boolean, reflect: !0, attribute: "allow-text" })
343
+ ], s.prototype, "allowText", 2);
344
+ r([
345
+ c({ type: String })
346
+ ], s.prototype, "placeholder", 2);
347
+ r([
348
+ p()
349
+ ], s.prototype, "digits", 2);
350
+ r([
351
+ p()
352
+ ], s.prototype, "pressedKey", 2);
353
+ s = r([
354
+ h("sw-ui-dialpad")
355
+ ], s);
356
+ export {
357
+ s as SwUiDialpad
358
+ };
359
+ //# sourceMappingURL=sw-ui-dialpad.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sw-ui-dialpad.js","sources":["../../../../src/components/UI/controls/sw-ui-dialpad.ts"],"sourcesContent":["/**\n * Dialpad Component\n *\n * A 12-key telephone keypad (0-9, *, #) for entering phone numbers\n * and sending DTMF tones during active calls. Pure UI component — no\n * call logic. Use `sw-call-dialpad` for a version that integrates with\n * a call context.\n *\n * @example\n * ```html\n * <sw-dialpad show-call-button></sw-dialpad>\n * ```\n *\n * Long-press behavior:\n * - Long-press the `0` key → inserts `+` (international prefix).\n * - Long-press the backspace button → clears the entire buffer.\n *\n * @fires sw-digit-press - Fired when a digit button is pressed. Detail: `{ digit: string, digits: string }`\n * @fires sw-dialpad-backspace - Fired when the backspace button is pressed (or long-pressed to clear). Detail: `{ digits: string }`\n * @fires sw-dial - Fired when the call button is pressed. Detail: `{ digits: string }`\n * @fires sw-dialpad-input - Fired when free-text input changes (only when `allow-text` is set). Detail: `{ digits: string }`\n *\n * @cssprop [--interactive-button-primary-bg=#044ef4] - Primary accent color.\n * @cssprop [--interactive-button-primary-hover=#0342cf] - Primary color on hover.\n * @cssprop [--interactive-status-success=#22c55e] - Success/call button color.\n * @cssprop [--interactive-button-destructive-bg=#dc2626] - Danger/hangup button color.\n * @cssprop [--bg-surface=#181a28] - Component background.\n * @cssprop [--fg-default=#f0f0f4] - Text color.\n * @cssprop [--fg-muted=#a0a0aa] - Muted text color.\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 '../icons/sw-ui-icon.js';\n\nconst DTMF_PATTERN = /^[0-9*#]$/;\nconst LONG_PRESS_MS = 500;\n\n/**\n * Key layout for standard telephone keypad\n */\nconst KEYS = [\n { digit: '1', letters: '' },\n { digit: '2', letters: 'ABC' },\n { digit: '3', letters: 'DEF' },\n { digit: '4', letters: 'GHI' },\n { digit: '5', letters: 'JKL' },\n { digit: '6', letters: 'MNO' },\n { digit: '7', letters: 'PQRS' },\n { digit: '8', letters: 'TUV' },\n { digit: '9', letters: 'WXYZ' },\n { digit: '*', letters: '' },\n { digit: '0', letters: '+' },\n { digit: '#', letters: '' }\n] as const;\n\n@customElement('sw-ui-dialpad')\nexport class SwUiDialpad extends LitElement {\n static styles = css`\n :host {\n --sw-dialpad-display-size: 32px;\n --sw-dialpad-key-size: 24px;\n display: block;\n font-family: var(--type-family-body);\n }\n\n .container {\n display: flex;\n flex-direction: column;\n gap: var(--sp-3);\n padding: var(--sp-4);\n max-width: 280px;\n background: var(--bg-surface);\n border-radius: var(--radius-md);\n }\n\n .display {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--sp-3) var(--sp-4);\n background: var(--bg-surface-raised);\n border-radius: var(--radius-md);\n min-height: 48px;\n }\n\n .display-input {\n flex: 1;\n font-size: var(--sw-dialpad-display-size);\n font-weight: 500;\n font-family: var(--type-family-body);\n color: var(--fg-default);\n background: transparent;\n border: none;\n outline: none;\n letter-spacing: 2px;\n text-align: center;\n width: 100%;\n }\n\n .display-input::placeholder {\n color: var(--fg-muted);\n font-size: var(--type-size-body);\n letter-spacing: normal;\n }\n\n .backspace-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n background: transparent;\n border: none;\n border-radius: var(--radius-md);\n cursor: pointer;\n color: var(--fg-muted);\n transition:\n background-color 0.15s ease,\n color 0.15s ease;\n }\n\n .backspace-button:hover {\n background: var(--interactive-dropdown-hover);\n color: var(--fg-default);\n }\n\n .backspace-button:disabled {\n opacity: 0.3;\n cursor: not-allowed;\n }\n\n .backspace-button sw-ui-icon {\n pointer-events: none;\n }\n\n .keypad {\n display: grid;\n grid-template-columns: repeat(3, minmax(0, 72px));\n justify-content: center;\n gap: var(--sp-2);\n }\n\n .key {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-width: 0;\n aspect-ratio: 1;\n background: var(--bg-surface);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-full);\n cursor: pointer;\n transition:\n background-color 0.1s ease,\n transform 0.1s ease;\n user-select: none;\n -webkit-user-select: none;\n -webkit-tap-highlight-color: transparent;\n }\n\n .key:hover {\n background: var(--bg-surface-raised);\n }\n\n .key:active,\n .key.pressed {\n background: var(--interactive-dropdown-hover);\n transform: scale(0.95);\n }\n\n .key-digit {\n font-size: var(--sw-dialpad-key-size);\n font-weight: 500;\n color: var(--fg-default);\n line-height: 1;\n }\n\n .key-letters {\n font-size: var(--type-size-caption);\n color: var(--fg-muted);\n text-transform: uppercase;\n letter-spacing: 1px;\n margin-top: 2px;\n min-height: 14px;\n }\n\n .call-button {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 56px;\n background: var(--interactive-status-success);\n border: none;\n border-radius: var(--radius-md);\n cursor: pointer;\n color: white;\n font-size: var(--type-size-body);\n font-weight: 600;\n font-family: var(--type-family-body);\n transition: background-color 0.15s ease;\n gap: var(--sp-2);\n }\n\n .call-button:hover {\n background: #0ea472;\n }\n\n .call-button:active {\n background: #0d9668;\n }\n\n .call-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .call-button sw-ui-icon {\n pointer-events: none;\n }\n `;\n\n /** Whether to display the call button below the keypad. */\n @property({ type: Boolean, reflect: true, attribute: 'show-call-button' })\n showCallButton: boolean = false;\n\n /** Allow free-text input in the display field (e.g., SIP URIs, vanity letters). Keypad buttons still append DTMF digits. */\n @property({ type: Boolean, reflect: true, attribute: 'allow-text' })\n allowText: boolean = false;\n\n /** Placeholder text shown in the digit display input. */\n @property({ type: String })\n placeholder: string = 'Enter number';\n\n @state() private digits: string = '';\n @state() private pressedKey: string | null = null;\n\n private _longPressTimer: ReturnType<typeof setTimeout> | null = null;\n private _longPressFired = false;\n\n private _startLongPress(action: () => void) {\n this._cancelLongPress();\n this._longPressFired = false;\n this._longPressTimer = setTimeout(() => {\n this._longPressFired = true;\n this._longPressTimer = null;\n action();\n }, LONG_PRESS_MS);\n }\n\n private _cancelLongPress() {\n if (this._longPressTimer !== null) {\n clearTimeout(this._longPressTimer);\n this._longPressTimer = null;\n }\n }\n\n override disconnectedCallback() {\n this._cancelLongPress();\n super.disconnectedCallback();\n }\n\n private _clearAll() {\n if (this.digits.length === 0) return;\n this.digits = '';\n this.dispatchEvent(\n new CustomEvent('sw-dialpad-backspace', {\n detail: { digits: this.digits },\n bubbles: true,\n composed: true\n })\n );\n }\n\n private _pressDigit(digit: string) {\n this.digits += digit;\n this.pressedKey = digit;\n\n this.dispatchEvent(\n new CustomEvent('sw-digit-press', {\n detail: { digit, digits: this.digits },\n bubbles: true,\n composed: true\n })\n );\n\n setTimeout(() => {\n this.pressedKey = null;\n }, 100);\n }\n\n private _backspace() {\n if (this.digits.length === 0) return;\n this.digits = this.digits.slice(0, -1);\n this.dispatchEvent(\n new CustomEvent('sw-dialpad-backspace', {\n detail: { digits: this.digits },\n bubbles: true,\n composed: true\n })\n );\n }\n\n private _dial() {\n if (this.digits.length === 0) return;\n this.dispatchEvent(\n new CustomEvent('sw-dial', {\n detail: { digits: this.digits },\n bubbles: true,\n composed: true\n })\n );\n }\n\n /**\n * Handle keyboard input on the display field.\n * We intercept all keys and manage state ourselves to prevent the browser\n * from accumulating non-DTMF characters in the input value.\n */\n private _onKeyDown(e: KeyboardEvent) {\n const { key } = e;\n\n if (this.allowText) {\n if (key === 'Enter' && this.showCallButton) {\n e.preventDefault();\n this._dial();\n }\n return;\n }\n\n if (DTMF_PATTERN.test(key)) {\n e.preventDefault();\n this._pressDigit(key);\n } else if (key === 'Backspace') {\n e.preventDefault();\n this._backspace();\n } else if (key === 'Enter' && this.showCallButton) {\n e.preventDefault();\n this._dial();\n } else if (key !== 'Tab' && !e.ctrlKey && !e.metaKey) {\n // Block all other printable characters\n e.preventDefault();\n }\n }\n\n private _onInput(e: Event) {\n if (!this.allowText) return;\n const value = (e.target as HTMLInputElement).value;\n this.digits = value;\n this.dispatchEvent(\n new CustomEvent('sw-dialpad-input', {\n detail: { digits: this.digits },\n bubbles: true,\n composed: true\n })\n );\n }\n\n render() {\n return html`\n <div class=\"container\" part=\"container\">\n <div class=\"display\" part=\"display\">\n <input\n type=${this.allowText ? 'text' : 'tel'}\n class=\"display-input\"\n .value=${this.digits}\n placeholder=${this.placeholder}\n @keydown=${this._onKeyDown}\n @input=${this._onInput}\n aria-label=\"Phone number input\"\n />\n <button\n class=\"backspace-button\"\n @click=${() => {\n if (this._longPressFired) { this._longPressFired = false; return; }\n this._backspace();\n }}\n @pointerdown=${() => this._startLongPress(() => this._clearAll())}\n @pointerup=${() => this._cancelLongPress()}\n @pointerleave=${() => this._cancelLongPress()}\n @pointercancel=${() => this._cancelLongPress()}\n ?disabled=${this.digits.length === 0}\n aria-label=\"Delete last digit (long-press to clear)\"\n >\n <sw-ui-icon name=\"backspace\" size=\"24\"></sw-ui-icon>\n </button>\n </div>\n\n <div class=\"keypad\" part=\"keypad\" role=\"group\" aria-label=\"Telephone keypad\">\n ${KEYS.map(\n (key) => html`\n <button\n class=\"key ${this.pressedKey === key.digit ? 'pressed' : ''}\"\n part=\"key ${this.pressedKey === key.digit ? 'key-pressed' : ''}\"\n @click=${() => {\n if (this._longPressFired) { this._longPressFired = false; return; }\n this._pressDigit(key.digit);\n }}\n @pointerdown=${key.digit === '0'\n ? () => this._startLongPress(() => this._pressDigit('+'))\n : undefined}\n @pointerup=${key.digit === '0' ? () => this._cancelLongPress() : undefined}\n @pointerleave=${key.digit === '0' ? () => this._cancelLongPress() : undefined}\n @pointercancel=${key.digit === '0' ? () => this._cancelLongPress() : undefined}\n aria-label=\"${key.digit}${key.letters ? `, ${key.letters}` : ''}${\n key.digit === '0' ? ' (long-press for +)' : ''\n }\"\n >\n <span class=\"key-digit\">${key.digit}</span>\n <span class=\"key-letters\">${key.letters}</span>\n </button>\n `\n )}\n </div>\n\n ${this.showCallButton\n ? html`\n <button\n class=\"call-button\"\n part=\"call-button\"\n @click=${this._dial}\n ?disabled=${this.digits.length === 0}\n aria-label=\"Call ${this.digits}\"\n >\n <sw-ui-icon name=\"phone-call\" size=\"20\"></sw-ui-icon> Call\n </button>\n `\n : null}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-ui-dialpad': SwUiDialpad;\n }\n}\n"],"names":["DTMF_PATTERN","LONG_PRESS_MS","KEYS","SwUiDialpad","LitElement","action","digit","e","key","value","html","css","__decorateClass","property","state","customElement"],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { LitElement } from 'lit';
2
+ export type DropUpItem = {
3
+ label: string;
4
+ id: string;
5
+ selected?: boolean;
6
+ };
7
+ /**
8
+ * Dropdown (opens upward) menu anchored to a trigger element.
9
+ *
10
+ * @fires sw-dropup-select - User picked an item. `detail` is the selected `DropUpItem`.
11
+ * @fires sw-dropup-close - Outside click closed the menu.
12
+ *
13
+ * @cssprop --sw-dropup-offset [4px] - gap between anchor and menu
14
+ * @cssprop --sw-dropup-max-width [200px] - maximum menu width
15
+ * @cssprop --sw-dropup-bg [#1f2937] - menu background
16
+ * @cssprop --sw-dropup-border [1px solid rgba(255,255,255,0.1)] - menu border
17
+ * @cssprop --sw-dropup-radius [8px] - menu border-radius
18
+ * @cssprop --sw-dropup-shadow [0 4px 12px rgba(0,0,0,0.4)] - menu box-shadow
19
+ * @cssprop --sw-dropup-color [#e5e7eb] - item text colour
20
+ * @cssprop --sw-dropup-item-hover [rgba(255,255,255,0.08)] - item hover background
21
+ * @cssprop --sw-dropup-item-active [rgba(255,255,255,0.15)] - selected item background
22
+ */
23
+ export declare class SwUiDropup extends LitElement {
24
+ static styles: import("lit").CSSResult;
25
+ items: Array<DropUpItem | string>;
26
+ open: boolean;
27
+ anchor?: Element;
28
+ private _menu;
29
+ private _outsideClickHandler;
30
+ updated(changed: Map<string, unknown>): void;
31
+ private _positionToAnchor;
32
+ disconnectedCallback(): void;
33
+ private normalizeItem;
34
+ private onSelect;
35
+ render(): import("lit-html").TemplateResult<1>;
36
+ }
37
+ declare global {
38
+ interface HTMLElementTagNameMap {
39
+ 'sw-ui-dropup': SwUiDropup;
40
+ }
41
+ }
42
+ //# sourceMappingURL=sw-ui-dropup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sw-ui-dropup.d.ts","sourceRoot":"","sources":["../../../../src/components/UI/controls/sw-ui-dropup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAGrD,MAAM,MAAM,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAE3E;;;;;;;;;;;;;;;GAeG;AACH,qBACa,UAAW,SAAQ,UAAU;IACxC,MAAM,CAAC,MAAM,0BA2CX;IAmBF,KAAK,EAAE,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,CAAM;IAGvC,IAAI,UAAS;IAIb,MAAM,CAAC,EAAE,OAAO,CAAC;IAGjB,OAAO,CAAC,KAAK,CAAe;IAE5B,OAAO,CAAC,oBAAoB,CAK1B;IAEF,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;IAarC,OAAO,CAAC,iBAAiB;IAWzB,oBAAoB;IAKpB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,QAAQ;IAehB,MAAM;CAkBP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,cAAc,EAAE,UAAU,CAAC;KAC5B;CACF"}
@@ -0,0 +1,137 @@
1
+ import { LitElement as c, html as d, nothing as p, css as m } from "lit";
2
+ import { property as u, query as h, customElement as f } from "lit/decorators.js";
3
+ var b = Object.defineProperty, v = Object.getOwnPropertyDescriptor, i = (e, t, s, o) => {
4
+ for (var r = o > 1 ? void 0 : o ? v(t, s) : t, a = e.length - 1, l; a >= 0; a--)
5
+ (l = e[a]) && (r = (o ? l(t, s, r) : l(r)) || r);
6
+ return o && r && b(t, s, r), r;
7
+ };
8
+ let n = class extends c {
9
+ constructor() {
10
+ super(...arguments), this.items = [], this.open = !1, this._outsideClickHandler = (e) => {
11
+ const t = e.composedPath();
12
+ !t.includes(this) && (!this.anchor || !t.includes(this.anchor)) && this.dispatchEvent(new CustomEvent("sw-dropup-close", { bubbles: !0, composed: !0 }));
13
+ };
14
+ }
15
+ updated(e) {
16
+ e.has("open") && (this.open ? (document.addEventListener("mousedown", this._outsideClickHandler), this.anchor && this._positionToAnchor()) : document.removeEventListener("mousedown", this._outsideClickHandler));
17
+ }
18
+ _positionToAnchor() {
19
+ const e = this.anchor.getBoundingClientRect(), t = 4;
20
+ this._menu.style.position = "fixed", this._menu.style.top = `${e.top - t}px`, this._menu.style.bottom = "auto", this._menu.style.left = `${e.left + e.width / 2}px`, this._menu.style.right = "auto", this._menu.style.transform = "translateX(-50%) translateY(-100%)";
21
+ }
22
+ disconnectedCallback() {
23
+ super.disconnectedCallback(), document.removeEventListener("mousedown", this._outsideClickHandler);
24
+ }
25
+ normalizeItem(e) {
26
+ return typeof e == "string" ? { label: e, id: e, selected: !1 } : e;
27
+ }
28
+ onSelect(e) {
29
+ const t = { ...e, selected: !0 };
30
+ this.items = (this.items ?? []).map((s) => {
31
+ const o = this.normalizeItem(s);
32
+ return { ...o, selected: o.id === e.id };
33
+ }), this.dispatchEvent(
34
+ new CustomEvent("sw-dropup-select", {
35
+ detail: t,
36
+ bubbles: !0,
37
+ composed: !0
38
+ })
39
+ );
40
+ }
41
+ render() {
42
+ const e = (this.items ?? []).map((t) => {
43
+ const s = this.normalizeItem(t);
44
+ return d`
45
+ <button
46
+ part="item"
47
+ @click=${() => this.onSelect(s)}
48
+ class=${s.selected === !0 ? "selected" : ""}
49
+ >
50
+ ${s.label}
51
+ </button>
52
+ `;
53
+ });
54
+ return d`
55
+ <div part="menu" class="menu ${this.open ? "open" : ""}">${e.length ? e : p}</div>
56
+ `;
57
+ }
58
+ };
59
+ n.styles = m`
60
+ :host {
61
+ display: inline-block;
62
+ position: relative;
63
+ }
64
+
65
+ .menu {
66
+ position: absolute;
67
+ bottom: calc(100% + var(--sw-dropup-offset, 4px));
68
+ left: 0;
69
+ display: none;
70
+ flex-direction: column;
71
+ border: 1px solid var(--border-default);
72
+ background: var(--bg-page);
73
+ color: var(--fg-default);
74
+ font-family: var(--type-family-body);
75
+ font-size: var(--type-size-small);
76
+ min-width: 120px;
77
+ max-width: var(--sw-dropup-max-width, 200px);
78
+ border-radius: var(--radius-md);
79
+ box-shadow: var(--shadow-md);
80
+ overflow: hidden;
81
+ }
82
+
83
+ .menu.open {
84
+ display: flex;
85
+ }
86
+
87
+ button {
88
+ all: unset;
89
+ padding: 8px 12px;
90
+ cursor: pointer;
91
+ font-size: 0.8125rem;
92
+ transition: background var(--transition-fast);
93
+ }
94
+
95
+ button.selected {
96
+ background: var(--bg-surface-raised);
97
+ }
98
+
99
+ button:hover {
100
+ background: var(--bg-surface);
101
+ }
102
+ `;
103
+ i([
104
+ u({
105
+ reflect: !0,
106
+ converter: {
107
+ fromAttribute(e) {
108
+ if (!e) return [];
109
+ try {
110
+ const t = JSON.parse(e);
111
+ return Array.isArray(t) ? t : [];
112
+ } catch {
113
+ return [];
114
+ }
115
+ },
116
+ toAttribute(e) {
117
+ return JSON.stringify(e);
118
+ }
119
+ }
120
+ })
121
+ ], n.prototype, "items", 2);
122
+ i([
123
+ u({ type: Boolean, reflect: !0 })
124
+ ], n.prototype, "open", 2);
125
+ i([
126
+ u({ attribute: !1 })
127
+ ], n.prototype, "anchor", 2);
128
+ i([
129
+ h(".menu")
130
+ ], n.prototype, "_menu", 2);
131
+ n = i([
132
+ f("sw-ui-dropup")
133
+ ], n);
134
+ export {
135
+ n as SwUiDropup
136
+ };
137
+ //# sourceMappingURL=sw-ui-dropup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sw-ui-dropup.js","sources":["../../../../src/components/UI/controls/sw-ui-dropup.ts"],"sourcesContent":["import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\n\nexport type DropUpItem = { label: string; id: string; selected?: boolean };\n\n/**\n * Dropdown (opens upward) menu anchored to a trigger element.\n *\n * @fires sw-dropup-select - User picked an item. `detail` is the selected `DropUpItem`.\n * @fires sw-dropup-close - Outside click closed the menu.\n *\n * @cssprop --sw-dropup-offset [4px] - gap between anchor and menu\n * @cssprop --sw-dropup-max-width [200px] - maximum menu width\n * @cssprop --sw-dropup-bg [#1f2937] - menu background\n * @cssprop --sw-dropup-border [1px solid rgba(255,255,255,0.1)] - menu border\n * @cssprop --sw-dropup-radius [8px] - menu border-radius\n * @cssprop --sw-dropup-shadow [0 4px 12px rgba(0,0,0,0.4)] - menu box-shadow\n * @cssprop --sw-dropup-color [#e5e7eb] - item text colour\n * @cssprop --sw-dropup-item-hover [rgba(255,255,255,0.08)] - item hover background\n * @cssprop --sw-dropup-item-active [rgba(255,255,255,0.15)] - selected item background\n */\n@customElement('sw-ui-dropup')\nexport class SwUiDropup extends LitElement {\n static styles = css`\n :host {\n display: inline-block;\n position: relative;\n }\n\n .menu {\n position: absolute;\n bottom: calc(100% + var(--sw-dropup-offset, 4px));\n left: 0;\n display: none;\n flex-direction: column;\n border: 1px solid var(--border-default);\n background: var(--bg-page);\n color: var(--fg-default);\n font-family: var(--type-family-body);\n font-size: var(--type-size-small);\n min-width: 120px;\n max-width: var(--sw-dropup-max-width, 200px);\n border-radius: var(--radius-md);\n box-shadow: var(--shadow-md);\n overflow: hidden;\n }\n\n .menu.open {\n display: flex;\n }\n\n button {\n all: unset;\n padding: 8px 12px;\n cursor: pointer;\n font-size: 0.8125rem;\n transition: background var(--transition-fast);\n }\n\n button.selected {\n background: var(--bg-surface-raised);\n }\n\n button:hover {\n background: var(--bg-surface);\n }\n `;\n\n @property({\n reflect: true,\n converter: {\n fromAttribute(value: string | null): Array<DropUpItem | string> {\n if (!value) return [];\n try {\n const parsed: unknown = JSON.parse(value);\n return Array.isArray(parsed) ? (parsed as Array<DropUpItem | string>) : [];\n } catch {\n return [];\n }\n },\n toAttribute(value: Array<DropUpItem | string>): string {\n return JSON.stringify(value);\n }\n }\n })\n items: Array<DropUpItem | string> = [];\n\n @property({ type: Boolean, reflect: true })\n open = false;\n\n // Optional element treated as \"inside\" for outside-click AND used as the position anchor\n @property({ attribute: false })\n anchor?: Element;\n\n @query('.menu')\n private _menu!: HTMLElement;\n\n private _outsideClickHandler = (e: MouseEvent) => {\n const path = e.composedPath();\n if (!path.includes(this) && (!this.anchor || !path.includes(this.anchor))) {\n this.dispatchEvent(new CustomEvent('sw-dropup-close', { bubbles: true, composed: true }));\n }\n };\n\n updated(changed: Map<string, unknown>) {\n if (!changed.has('open')) return;\n\n if (this.open) {\n document.addEventListener('mousedown', this._outsideClickHandler);\n if (this.anchor) {\n this._positionToAnchor();\n }\n } else {\n document.removeEventListener('mousedown', this._outsideClickHandler);\n }\n }\n\n private _positionToAnchor() {\n const rect = this.anchor!.getBoundingClientRect();\n const offset = 4;\n this._menu.style.position = 'fixed';\n this._menu.style.top = `${rect.top - offset}px`;\n this._menu.style.bottom = 'auto';\n this._menu.style.left = `${rect.left + rect.width / 2}px`;\n this._menu.style.right = 'auto';\n this._menu.style.transform = 'translateX(-50%) translateY(-100%)';\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener('mousedown', this._outsideClickHandler);\n }\n\n private normalizeItem(item: DropUpItem | string): DropUpItem {\n if (typeof item === 'string') {\n return { label: item, id: item, selected: false };\n }\n return item;\n }\n\n private onSelect(item: DropUpItem) {\n const selectedItem = { ...item, selected: true };\n this.items = (this.items ?? []).map((i) => {\n const normalized = this.normalizeItem(i);\n return { ...normalized, selected: normalized.id === item.id };\n });\n this.dispatchEvent(\n new CustomEvent('sw-dropup-select', {\n detail: selectedItem,\n bubbles: true,\n composed: true\n })\n );\n }\n\n render() {\n const list = (this.items ?? []).map((i) => {\n const item = this.normalizeItem(i);\n return html`\n <button\n part=\"item\"\n @click=${() => this.onSelect(item)}\n class=${item.selected === true ? 'selected' : ''}\n >\n ${item.label}\n </button>\n `;\n });\n\n return html`\n <div part=\"menu\" class=\"menu ${this.open ? 'open' : ''}\">${list.length ? list : nothing}</div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-ui-dropup': SwUiDropup;\n }\n}\n"],"names":["SwUiDropup","LitElement","path","changed","rect","offset","item","selectedItem","i","normalized","list","html","nothing","css","__decorateClass","property","value","parsed","query","customElement"],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { LitElement } from 'lit';
2
+ import type { DropUpItem } from './sw-ui-dropup';
3
+ /**
4
+ * Pill-shaped split button: main action + optional chevron dropdown.
5
+ *
6
+ * When `items` is non-empty, renders as a unified pill with a subtle
7
+ * divider between the icon area and the chevron: `[ 🎤 | ▲ ]`
8
+ *
9
+ * When `items` is empty, renders as a single pill button.
10
+ *
11
+ * - **active/inactive** slots → toggle button, dispatches `sw-split-button-toggle`
12
+ * - **default** slot only → push button, dispatches `sw-split-button-click`
13
+ *
14
+ * @slot active - icon shown when active
15
+ * @slot inactive - icon shown when inactive
16
+ * @slot (default)- icon for a non-toggle button
17
+ *
18
+ * @fires sw-split-button-toggle - Fired on toggle-mode click. `detail` is the new active state (boolean).
19
+ * @fires sw-split-button-click - Fired on push-mode click. No detail.
20
+ *
21
+ * @cssprop --sw-split-button-size [44px] - height (width auto-fits content)
22
+ * @cssprop --sw-split-button-bg - button background (falls back to --bg-surface)
23
+ * @cssprop --sw-split-button-bg-hover - hover background (falls back to --bg-surface-raised)
24
+ * @cssprop --sw-split-button-color - icon colour (falls back to --fg-default)
25
+ * @cssprop --sw-split-button-radius - border-radius (falls back to --radius-full)
26
+ */
27
+ export declare class SwUiSplitButton extends LitElement {
28
+ static styles: import("lit").CSSResult;
29
+ items: Array<DropUpItem | string>;
30
+ active: boolean;
31
+ private _dropupOpen;
32
+ private _hasNamedSlots;
33
+ private _chevronBtn;
34
+ private _onDropupSelect;
35
+ private _updateNamedSlots;
36
+ private _onMainClick;
37
+ render(): import("lit-html").TemplateResult<1>;
38
+ }
39
+ declare global {
40
+ interface HTMLElementTagNameMap {
41
+ 'sw-ui-split-button': SwUiSplitButton;
42
+ }
43
+ }
44
+ //# sourceMappingURL=sw-ui-split-button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sw-ui-split-button.d.ts","sourceRoot":"","sources":["../../../../src/components/UI/controls/sw-ui-split-button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAErD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,qBACa,eAAgB,SAAQ,UAAU;IAC7C,MAAM,CAAC,MAAM,0BAwEX;IAkBF,KAAK,EAAE,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,CAAM;IAGvC,MAAM,EAAE,OAAO,CAAS;IAGxB,OAAO,CAAC,WAAW,CAAkB;IAGrC,OAAO,CAAC,cAAc,CAAS;IAG/B,OAAO,CAAC,WAAW,CAAqB;IAExC,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,YAAY;IAepB,MAAM;CAsCP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,oBAAoB,EAAE,eAAe,CAAC;KACvC;CACF"}