@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.
- package/README.md +48 -55
- package/dist/_virtual/_commonjsHelpers.js +9 -0
- package/dist/_virtual/_commonjsHelpers.js.map +1 -0
- package/dist/_virtual/prism-python.js +28 -0
- package/dist/_virtual/prism-python.js.map +1 -0
- package/dist/_virtual/prism-python2.js +5 -0
- package/dist/_virtual/prism-python2.js.map +1 -0
- package/dist/_virtual/prism-typescript.js +28 -0
- package/dist/_virtual/prism-typescript.js.map +1 -0
- package/dist/_virtual/prism-typescript2.js +5 -0
- package/dist/_virtual/prism-typescript2.js.map +1 -0
- package/dist/_virtual/prism.js +28 -0
- package/dist/_virtual/prism.js.map +1 -0
- package/dist/_virtual/prism2.js +5 -0
- package/dist/_virtual/prism2.js.map +1 -0
- package/dist/assets/sw_background.webp.js +5 -0
- package/dist/assets/sw_background.webp.js.map +1 -0
- package/dist/components/UI/DEFAULT_BACKGROUND.d.ts +4 -0
- package/dist/components/UI/DEFAULT_BACKGROUND.d.ts.map +1 -0
- package/dist/components/UI/DEFAULT_BACKGROUND.js +5 -0
- package/dist/components/UI/DEFAULT_BACKGROUND.js.map +1 -0
- package/dist/components/UI/controls/sw-ui-control-bar.d.ts +114 -0
- package/dist/components/UI/controls/sw-ui-control-bar.d.ts.map +1 -0
- package/dist/components/UI/controls/sw-ui-control-bar.js +324 -0
- package/dist/components/UI/controls/sw-ui-control-bar.js.map +1 -0
- package/dist/components/UI/controls/sw-ui-dialpad.d.ts +67 -0
- package/dist/components/UI/controls/sw-ui-dialpad.d.ts.map +1 -0
- package/dist/components/UI/controls/sw-ui-dialpad.js +359 -0
- package/dist/components/UI/controls/sw-ui-dialpad.js.map +1 -0
- package/dist/components/UI/controls/sw-ui-dropup.d.ts +42 -0
- package/dist/components/UI/controls/sw-ui-dropup.d.ts.map +1 -0
- package/dist/components/UI/controls/sw-ui-dropup.js +137 -0
- package/dist/components/UI/controls/sw-ui-dropup.js.map +1 -0
- package/dist/components/UI/controls/sw-ui-split-button.d.ts +44 -0
- package/dist/components/UI/controls/sw-ui-split-button.d.ts.map +1 -0
- package/dist/components/UI/controls/sw-ui-split-button.js +177 -0
- package/dist/components/UI/controls/sw-ui-split-button.js.map +1 -0
- package/dist/components/UI/icons/backspace.svg.js +10 -0
- package/dist/components/UI/icons/backspace.svg.js.map +1 -0
- package/dist/components/UI/icons/camera-off.svg.js +8 -0
- package/dist/components/UI/icons/camera-off.svg.js.map +1 -0
- package/dist/components/UI/icons/camera-on.svg.js +8 -0
- package/dist/components/UI/icons/camera-on.svg.js.map +1 -0
- package/dist/components/UI/icons/check-circle.svg.js +6 -0
- package/dist/components/UI/icons/check-circle.svg.js.map +1 -0
- package/dist/components/UI/icons/chevron-up.svg.js +8 -0
- package/dist/components/UI/icons/chevron-up.svg.js.map +1 -0
- package/dist/components/UI/icons/close.svg.js +6 -0
- package/dist/components/UI/icons/close.svg.js.map +1 -0
- package/dist/components/UI/icons/copy.svg.js +6 -0
- package/dist/components/UI/icons/copy.svg.js.map +1 -0
- package/dist/components/UI/icons/download.svg.js +6 -0
- package/dist/components/UI/icons/download.svg.js.map +1 -0
- package/dist/components/UI/icons/fullscreen-exit.svg.js +8 -0
- package/dist/components/UI/icons/fullscreen-exit.svg.js.map +1 -0
- package/dist/components/UI/icons/fullscreen.svg.js +8 -0
- package/dist/components/UI/icons/fullscreen.svg.js.map +1 -0
- package/dist/components/UI/icons/hand-raise.svg.js +6 -0
- package/dist/components/UI/icons/hand-raise.svg.js.map +1 -0
- package/dist/components/UI/icons/icons.d.ts +31 -0
- package/dist/components/UI/icons/icons.d.ts.map +1 -0
- package/dist/components/UI/icons/icons.js +60 -0
- package/dist/components/UI/icons/icons.js.map +1 -0
- package/dist/components/UI/icons/index.d.ts +4 -0
- package/dist/components/UI/icons/index.d.ts.map +1 -0
- package/dist/components/UI/icons/info-circle.svg.js +6 -0
- package/dist/components/UI/icons/info-circle.svg.js.map +1 -0
- package/dist/components/UI/icons/mic-off.svg.js +8 -0
- package/dist/components/UI/icons/mic-off.svg.js.map +1 -0
- package/dist/components/UI/icons/mic-on.svg.js +8 -0
- package/dist/components/UI/icons/mic-on.svg.js.map +1 -0
- package/dist/components/UI/icons/person.svg.js +8 -0
- package/dist/components/UI/icons/person.svg.js.map +1 -0
- package/dist/components/UI/icons/phone-call.svg.js +8 -0
- package/dist/components/UI/icons/phone-call.svg.js.map +1 -0
- package/dist/components/UI/icons/phone-end.svg.js +8 -0
- package/dist/components/UI/icons/phone-end.svg.js.map +1 -0
- package/dist/components/UI/icons/room.svg.js +8 -0
- package/dist/components/UI/icons/room.svg.js.map +1 -0
- package/dist/components/UI/icons/screen-share-off.svg.js +9 -0
- package/dist/components/UI/icons/screen-share-off.svg.js.map +1 -0
- package/dist/components/UI/icons/screen-share.svg.js +9 -0
- package/dist/components/UI/icons/screen-share.svg.js.map +1 -0
- package/dist/components/UI/icons/sendIcon.svg.js +9 -0
- package/dist/components/UI/icons/sendIcon.svg.js.map +1 -0
- package/dist/components/UI/icons/settings.svg.js +8 -0
- package/dist/components/UI/icons/settings.svg.js.map +1 -0
- package/dist/components/UI/icons/speaker-off.svg.js +8 -0
- package/dist/components/UI/icons/speaker-off.svg.js.map +1 -0
- package/dist/components/UI/icons/speaker-on.svg.js +8 -0
- package/dist/components/UI/icons/speaker-on.svg.js.map +1 -0
- package/dist/components/UI/icons/spinner.svg.js +9 -0
- package/dist/components/UI/icons/spinner.svg.js.map +1 -0
- package/dist/components/UI/icons/sw-logo.svg.js +11 -0
- package/dist/components/UI/icons/sw-logo.svg.js.map +1 -0
- package/dist/components/UI/icons/sw-ui-icon.d.ts +28 -0
- package/dist/components/UI/icons/sw-ui-icon.d.ts.map +1 -0
- package/dist/components/UI/icons/sw-ui-icon.js +47 -0
- package/dist/components/UI/icons/sw-ui-icon.js.map +1 -0
- package/dist/components/UI/icons/transcript.svg.js +10 -0
- package/dist/components/UI/icons/transcript.svg.js.map +1 -0
- package/dist/components/UI/index.d.ts +18 -0
- package/dist/components/UI/index.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-background.d.ts +33 -0
- package/dist/components/UI/layout/sw-ui-background.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-background.js +106 -0
- package/dist/components/UI/layout/sw-ui-background.js.map +1 -0
- package/dist/components/UI/layout/sw-ui-call-layout.d.ts +69 -0
- package/dist/components/UI/layout/sw-ui-call-layout.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-call-layout.js +278 -0
- package/dist/components/UI/layout/sw-ui-call-layout.js.map +1 -0
- package/dist/components/UI/layout/sw-ui-content-drawer.d.ts +50 -0
- package/dist/components/UI/layout/sw-ui-content-drawer.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-content-drawer.js +413 -0
- package/dist/components/UI/layout/sw-ui-content-drawer.js.map +1 -0
- package/dist/components/UI/layout/sw-ui-modal.d.ts +31 -0
- package/dist/components/UI/layout/sw-ui-modal.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-modal.js +150 -0
- package/dist/components/UI/layout/sw-ui-modal.js.map +1 -0
- package/dist/components/UI/layout/sw-ui-responsive-container.d.ts +15 -0
- package/dist/components/UI/layout/sw-ui-responsive-container.d.ts.map +1 -0
- package/dist/components/UI/layout/sw-ui-responsive-container.js +78 -0
- package/dist/components/UI/layout/sw-ui-responsive-container.js.map +1 -0
- package/dist/components/UI/sw-ui-alert.d.ts +37 -0
- package/dist/components/UI/sw-ui-alert.d.ts.map +1 -0
- package/dist/components/UI/sw-ui-alert.js +126 -0
- package/dist/components/UI/sw-ui-alert.js.map +1 -0
- package/dist/components/UI/sw-ui-transcript-view.d.ts +56 -0
- package/dist/components/UI/sw-ui-transcript-view.d.ts.map +1 -0
- package/dist/components/UI/sw-ui-transcript-view.js +341 -0
- package/dist/components/UI/sw-ui-transcript-view.js.map +1 -0
- package/dist/components/{audio-level.d.ts → sw-audio-level.d.ts} +39 -7
- package/dist/components/sw-audio-level.d.ts.map +1 -0
- package/dist/components/sw-audio-level.js +252 -0
- package/dist/components/sw-audio-level.js.map +1 -0
- package/dist/components/sw-call-controls.d.ts +58 -0
- package/dist/components/sw-call-controls.d.ts.map +1 -0
- package/dist/components/sw-call-controls.js +186 -0
- package/dist/components/sw-call-controls.js.map +1 -0
- package/dist/components/sw-call-dialpad.d.ts +52 -0
- package/dist/components/sw-call-dialpad.d.ts.map +1 -0
- package/dist/components/sw-call-dialpad.js +70 -0
- package/dist/components/sw-call-dialpad.js.map +1 -0
- package/dist/components/sw-call-media.d.ts +68 -0
- package/dist/components/sw-call-media.d.ts.map +1 -0
- package/dist/components/sw-call-media.js +220 -0
- package/dist/components/sw-call-media.js.map +1 -0
- package/dist/components/sw-call-provider.d.ts +41 -0
- package/dist/components/sw-call-provider.d.ts.map +1 -0
- package/dist/components/sw-call-provider.js +37 -0
- package/dist/components/sw-call-provider.js.map +1 -0
- package/dist/components/sw-call-status.d.ts +50 -0
- package/dist/components/sw-call-status.d.ts.map +1 -0
- package/dist/components/sw-call-status.js +203 -0
- package/dist/components/sw-call-status.js.map +1 -0
- package/dist/components/sw-call-widget/client-factory.d.ts +6 -0
- package/dist/components/sw-call-widget/client-factory.d.ts.map +1 -0
- package/dist/components/sw-call-widget/client-factory.js +25 -0
- package/dist/components/sw-call-widget/client-factory.js.map +1 -0
- package/dist/components/sw-call-widget/sw-call-widget.d.ts +110 -0
- package/dist/components/sw-call-widget/sw-call-widget.d.ts.map +1 -0
- package/dist/components/sw-call-widget/sw-call-widget.js +250 -0
- package/dist/components/sw-call-widget/sw-call-widget.js.map +1 -0
- package/dist/components/sw-call-widget/sw-call-widget.templates.d.ts +17 -0
- package/dist/components/sw-call-widget/sw-call-widget.templates.d.ts.map +1 -0
- package/dist/components/sw-call-widget/sw-call-widget.templates.js +80 -0
- package/dist/components/sw-call-widget/sw-call-widget.templates.js.map +1 -0
- package/dist/components/sw-click-to-call.d.ts +39 -0
- package/dist/components/sw-click-to-call.d.ts.map +1 -0
- package/dist/components/sw-click-to-call.js +87 -0
- package/dist/components/sw-click-to-call.js.map +1 -0
- package/dist/components/sw-device-selector/index.d.ts +2 -0
- package/dist/components/sw-device-selector/index.d.ts.map +1 -0
- package/dist/components/sw-device-selector/sw-device-selector.d.ts +69 -0
- package/dist/components/sw-device-selector/sw-device-selector.d.ts.map +1 -0
- package/dist/components/sw-device-selector/sw-device-selector.js +277 -0
- package/dist/components/sw-device-selector/sw-device-selector.js.map +1 -0
- package/dist/components/sw-device-selector/sw-device-selector.styles.d.ts +2 -0
- package/dist/components/sw-device-selector/sw-device-selector.styles.d.ts.map +1 -0
- package/dist/components/sw-device-selector/sw-device-selector.styles.js +238 -0
- package/dist/components/sw-device-selector/sw-device-selector.styles.js.map +1 -0
- package/dist/components/{directory.d.ts → sw-directory.d.ts} +13 -21
- package/dist/components/sw-directory.d.ts.map +1 -0
- package/dist/components/sw-directory.js +434 -0
- package/dist/components/sw-directory.js.map +1 -0
- package/dist/components/sw-local-camera.d.ts +53 -0
- package/dist/components/sw-local-camera.d.ts.map +1 -0
- package/dist/components/sw-local-camera.js +147 -0
- package/dist/components/sw-local-camera.js.map +1 -0
- package/dist/components/sw-participant-controls.d.ts +58 -0
- package/dist/components/sw-participant-controls.d.ts.map +1 -0
- package/dist/components/sw-participant-controls.js +305 -0
- package/dist/components/sw-participant-controls.js.map +1 -0
- package/dist/components/sw-participants.d.ts +55 -0
- package/dist/components/sw-participants.d.ts.map +1 -0
- package/dist/components/sw-participants.js +319 -0
- package/dist/components/sw-participants.js.map +1 -0
- package/dist/components/sw-self-media.d.ts +46 -0
- package/dist/components/sw-self-media.d.ts.map +1 -0
- package/dist/components/sw-self-media.js +106 -0
- package/dist/components/sw-self-media.js.map +1 -0
- package/dist/context/CallStateContextController.d.ts +31 -0
- package/dist/context/CallStateContextController.d.ts.map +1 -0
- package/dist/context/CallStateContextController.js +125 -0
- package/dist/context/CallStateContextController.js.map +1 -0
- package/dist/context/DevicesContextController.d.ts +38 -0
- package/dist/context/DevicesContextController.d.ts.map +1 -0
- package/dist/context/DevicesContextController.js +124 -0
- package/dist/context/DevicesContextController.js.map +1 -0
- package/dist/context/TranscriptController.d.ts +32 -0
- package/dist/context/TranscriptController.d.ts.map +1 -0
- package/dist/context/TranscriptController.js +113 -0
- package/dist/context/TranscriptController.js.map +1 -0
- package/dist/context/UserEventController.d.ts +26 -0
- package/dist/context/UserEventController.d.ts.map +1 -0
- package/dist/context/UserEventController.js +55 -0
- package/dist/context/UserEventController.js.map +1 -0
- package/dist/context/call-state-context.d.ts +75 -0
- package/dist/context/call-state-context.d.ts.map +1 -0
- package/dist/context/call-state-context.js +39 -0
- package/dist/context/call-state-context.js.map +1 -0
- package/dist/context/chat-state.d.ts +41 -0
- package/dist/context/chat-state.d.ts.map +1 -0
- package/dist/context/chat-state.js +61 -0
- package/dist/context/chat-state.js.map +1 -0
- package/dist/context/devices-context.d.ts +28 -0
- package/dist/context/devices-context.d.ts.map +1 -0
- package/dist/context/devices-context.js +6 -0
- package/dist/context/devices-context.js.map +1 -0
- package/dist/context/index.d.ts +9 -1
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/transcript-context.d.ts +9 -0
- package/dist/context/transcript-context.d.ts.map +1 -0
- package/dist/context/transcript-context.js +6 -0
- package/dist/context/transcript-context.js.map +1 -0
- package/dist/context/types.d.ts +9 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/embed/signalwire-web-components-embed.iife.js +3225 -0
- package/dist/embed/signalwire-web-components-embed.iife.js.map +1 -0
- package/dist/embed/signalwire-web-components-embed.umd.cjs +3225 -0
- package/dist/embed/signalwire-web-components-embed.umd.cjs.map +1 -0
- package/dist/embed.d.ts +20 -0
- package/dist/embed.d.ts.map +1 -0
- package/dist/index.d.ts +18 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +83 -34
- package/dist/index.js.map +1 -1
- package/dist/node_modules/dompurify/dist/purify.es.js +597 -0
- package/dist/node_modules/dompurify/dist/purify.es.js.map +1 -0
- package/dist/node_modules/marked/lib/marked.esm.js +1475 -0
- package/dist/node_modules/marked/lib/marked.esm.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-bash.js +220 -0
- package/dist/node_modules/prismjs/components/prism-bash.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-css.js +56 -0
- package/dist/node_modules/prismjs/components/prism-css.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-javascript.js +138 -0
- package/dist/node_modules/prismjs/components/prism-javascript.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-json.js +26 -0
- package/dist/node_modules/prismjs/components/prism-json.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-markdown.js +301 -0
- package/dist/node_modules/prismjs/components/prism-markdown.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-python.js +69 -0
- package/dist/node_modules/prismjs/components/prism-python.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-sql.js +34 -0
- package/dist/node_modules/prismjs/components/prism-sql.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-typescript.js +53 -0
- package/dist/node_modules/prismjs/components/prism-typescript.js.map +1 -0
- package/dist/node_modules/prismjs/components/prism-yaml.js +67 -0
- package/dist/node_modules/prismjs/components/prism-yaml.js.map +1 -0
- package/dist/node_modules/prismjs/prism.js +1165 -0
- package/dist/node_modules/prismjs/prism.js.map +1 -0
- package/dist/react.d.ts +55 -26
- package/dist/theme.css +451 -0
- package/dist/theme.css.js +5 -0
- package/dist/theme.css.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/prism.d.ts +4 -0
- package/dist/utils/prism.d.ts.map +1 -0
- package/dist/utils/prism.js +34 -0
- package/dist/utils/prism.js.map +1 -0
- package/dist/utils/theme-loader.d.ts +11 -0
- package/dist/utils/theme-loader.d.ts.map +1 -0
- package/dist/utils/theme-loader.js +17 -0
- package/dist/utils/theme-loader.js.map +1 -0
- package/dist/utils/transcriptToMarkdown.d.ts +14 -0
- package/dist/utils/transcriptToMarkdown.d.ts.map +1 -0
- package/dist/utils/transcriptToMarkdown.js +59 -0
- package/dist/utils/transcriptToMarkdown.js.map +1 -0
- package/dist/utils/use-google-font.d.ts +18 -0
- package/dist/utils/use-google-font.d.ts.map +1 -0
- package/dist/utils/use-google-font.js +12 -0
- package/dist/utils/use-google-font.js.map +1 -0
- package/dist/utils/user-variables.d.ts +20 -0
- package/dist/utils/user-variables.d.ts.map +1 -0
- package/dist/utils/user-variables.js +37 -0
- package/dist/utils/user-variables.js.map +1 -0
- package/package.json +104 -41
- package/dist/components/audio-level.d.ts.map +0 -1
- package/dist/components/audio-level.js +0 -203
- package/dist/components/audio-level.js.map +0 -1
- package/dist/components/call-controls.d.ts +0 -183
- package/dist/components/call-controls.d.ts.map +0 -1
- package/dist/components/call-controls.js +0 -606
- package/dist/components/call-controls.js.map +0 -1
- package/dist/components/call-media.d.ts +0 -118
- package/dist/components/call-media.d.ts.map +0 -1
- package/dist/components/call-media.js +0 -219
- package/dist/components/call-media.js.map +0 -1
- package/dist/components/call-status.d.ts +0 -83
- package/dist/components/call-status.d.ts.map +0 -1
- package/dist/components/call-status.js +0 -255
- package/dist/components/call-status.js.map +0 -1
- package/dist/components/click-to-call.d.ts +0 -151
- package/dist/components/click-to-call.d.ts.map +0 -1
- package/dist/components/click-to-call.js +0 -428
- package/dist/components/click-to-call.js.map +0 -1
- package/dist/components/device-selector.d.ts +0 -238
- package/dist/components/device-selector.d.ts.map +0 -1
- package/dist/components/device-selector.js +0 -685
- package/dist/components/device-selector.js.map +0 -1
- package/dist/components/dialpad.d.ts +0 -74
- package/dist/components/dialpad.d.ts.map +0 -1
- package/dist/components/dialpad.js +0 -372
- package/dist/components/dialpad.js.map +0 -1
- package/dist/components/directory.d.ts.map +0 -1
- package/dist/components/directory.js +0 -503
- package/dist/components/directory.js.map +0 -1
- package/dist/components/example-button.d.ts +0 -21
- package/dist/components/example-button.d.ts.map +0 -1
- package/dist/components/example-button.js +0 -74
- package/dist/components/example-button.js.map +0 -1
- package/dist/components/participant-controls.d.ts +0 -123
- package/dist/components/participant-controls.d.ts.map +0 -1
- package/dist/components/participant-controls.js +0 -468
- package/dist/components/participant-controls.js.map +0 -1
- package/dist/components/participants.d.ts +0 -120
- package/dist/components/participants.d.ts.map +0 -1
- package/dist/components/participants.js +0 -394
- package/dist/components/participants.js.map +0 -1
- package/dist/components/self-media.d.ts +0 -78
- package/dist/components/self-media.d.ts.map +0 -1
- package/dist/components/self-media.js +0 -129
- package/dist/components/self-media.js.map +0 -1
- package/dist/context/call-context.d.ts +0 -13
- package/dist/context/call-context.d.ts.map +0 -1
- package/dist/context/call-context.js +0 -6
- package/dist/context/call-context.js.map +0 -1
- package/dist/types/index.js +0 -12
- package/dist/types/index.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-call-media.js","sources":["../../src/components/sw-call-media.ts"],"sourcesContent":["/**\n * Call Media Component\n *\n * Renders the remote video stream with aspect-ratio-aware sizing.\n *\n * Input precedence (most specific wins): `.stream` > `.call` > context.\n *\n * @example\n * ```html\n * <!-- Inside a context provider (sw-call-widget): -->\n * <sw-call-media></sw-call-media>\n *\n * <!-- With an explicit Call: -->\n * <sw-call-media .call=${call}></sw-call-media>\n *\n * <!-- With a raw remote stream: -->\n * <sw-call-media .stream=${remoteStream}></sw-call-media>\n * ```\n *\n * @csspart container - Outer container that holds the video and overlay layers.\n * @csspart video - The `<video>` element rendering the remote stream.\n *\n * @slot - Default slot for overlay layers (e.g. `<sw-self-media>`, `<sw-participants>`).\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\nimport { Subscription } from 'rxjs';\nimport type { Call } from '../types/index.js';\nimport { callStateContext, type CallState } from '../context/call-state-context.js';\nimport { devicesContext, type DevicesState } from '../context/devices-context.js';\nimport { debounce } from '../utils/debounce.js';\nimport { waitForVideoReady, attachMediaStream, detachMediaStream } from '../utils/video.js';\nimport { getLogger } from '@signalwire/js';\n\nconst logger = getLogger();\n\n@customElement('sw-call-media')\nexport class SwCallMedia extends LitElement {\n static styles = css`\n :host {\n display: block;\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n\n .mcu-content {\n position: relative;\n width: 100%;\n height: 100%;\n margin: 0 auto;\n display: flex;\n align-items: center;\n justify-content: center;\n background-color: var(--bg-page, #0e0e18);\n overflow: hidden;\n }\n\n .padding-wrapper {\n position: relative;\n max-width: 100%;\n max-height: 100%;\n transition:\n width 0.3s ease,\n height 0.3s ease;\n }\n\n /* Outer rounding is owned by sw-ui-call-layout's :host border-radius +\n overflow:hidden. Rounding here too carves a notch out of the right\n edge of the video cell that exposes whatever sits behind the widget\n (page / modal backdrop) as a black sliver in light mode. */\n .mcu-wrapper {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n overflow: hidden;\n }\n\n .mcu-video {\n width: 100%;\n height: 100%;\n display: block;\n object-fit: contain;\n }\n\n .mcu-layers {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n }\n `;\n\n /**\n * Explicit Call — when set, subscribes directly to its observables instead\n * of relying on context. Overridden by `.stream` if both are set.\n */\n @property({ type: Object }) call?: Call;\n\n /**\n * Explicit remote MediaStream — highest precedence. Bypasses both `.call`\n * and context. Useful for raw rendering with no SDK at all.\n */\n @property({ attribute: false }) stream: MediaStream | null = null;\n\n @consume({ context: callStateContext, subscribe: true })\n @state()\n private _callState?: CallState;\n\n @consume({ context: devicesContext, subscribe: true })\n @state()\n private _devicesState?: DevicesState;\n\n private _remoteStreamValue: MediaStream | null = null;\n private _lastTrackSignature = '';\n private _subscriptions: Subscription[] = [];\n private _resizeObserver?: ResizeObserver;\n private _videoResizeHandler?: () => void;\n private _windowResizeHandler?: () => void;\n private _videoElement?: HTMLVideoElement;\n private _paddingWrapper?: HTMLDivElement;\n\n // ── Lifecycle ──────────────────────────────────────────────────────\n\n connectedCallback() {\n super.connectedCallback();\n if (!this.stream && this.call) this._setupDirectSubscriptions();\n if (this.stream) {\n this._remoteStreamValue = this.stream;\n this._lastTrackSignature = this._computeTrackSignature(this.stream);\n }\n }\n\n protected updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n // Direct call prop changed — re-subscribe (only meaningful when `.stream` isn't set)\n if (changedProperties.has('call')) {\n this._cleanupDirectSubscriptions();\n if (!this.stream && this.call) this._setupDirectSubscriptions();\n }\n\n // Explicit `.stream` prop wins — attach it and skip everything else.\n if (changedProperties.has('stream')) {\n this._cleanupDirectSubscriptions();\n const stream = this.stream;\n const signature = this._computeTrackSignature(stream);\n if (stream !== this._remoteStreamValue || signature !== this._lastTrackSignature) {\n this._remoteStreamValue = stream;\n this._lastTrackSignature = signature;\n const video = this.shadowRoot?.querySelector('video.mcu-video') as HTMLVideoElement;\n if (video) attachMediaStream(video, stream);\n }\n }\n\n // Context-driven: stream or its track set changed.\n // WebRTC delivers tracks one at a time via ontrack, and the SDK re-emits\n // the same MediaStream reference each time — so we must also re-attach when\n // the track set changes, otherwise Chromium may never render a video track\n // added after the initial srcObject assignment.\n if (!this.stream && !this.call && changedProperties.has('_callState')) {\n const stream = this._callState?.remoteStream ?? null;\n const signature = this._computeTrackSignature(stream);\n if (stream !== this._remoteStreamValue || signature !== this._lastTrackSignature) {\n this._remoteStreamValue = stream;\n this._lastTrackSignature = signature;\n const video = this.shadowRoot?.querySelector('video.mcu-video') as HTMLVideoElement;\n if (video) attachMediaStream(video, stream);\n }\n }\n\n // Audio output device changed\n if (changedProperties.has('_devicesState')) {\n this._applySinkId(this._devicesState?.selectedAudioOutput?.deviceId ?? '');\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._cleanupDirectSubscriptions();\n this._cleanupResizeObserver();\n this._cleanupVideoElement();\n }\n\n protected firstUpdated(): void {\n const video = this.shadowRoot?.querySelector('video.mcu-video') as HTMLVideoElement;\n if (video) {\n waitForVideoReady(video).then(() => {\n if (this.isConnected) this._setupResizeObserver();\n });\n }\n }\n\n // ── Direct call subscriptions (legacy / standalone) ────────────────\n\n private _setupDirectSubscriptions(): void {\n if (!this.call) return;\n this._subscriptions.push(\n this.call.remoteStream$.subscribe((stream: MediaStream | null) => {\n const signature = this._computeTrackSignature(stream);\n if (stream === this._remoteStreamValue && signature === this._lastTrackSignature) {\n return;\n }\n this._remoteStreamValue = stream;\n this._lastTrackSignature = signature;\n this.requestUpdate();\n const video = this.shadowRoot?.querySelector('video.mcu-video') as HTMLVideoElement;\n if (video) attachMediaStream(video, stream);\n })\n );\n }\n\n private _computeTrackSignature(stream: MediaStream | null): string {\n if (!stream) return '';\n return stream.getTracks().map((t) => `${t.kind}:${t.id}`).sort().join('|');\n }\n\n private _cleanupDirectSubscriptions(): void {\n this._subscriptions.forEach((sub) => sub.unsubscribe());\n this._subscriptions = [];\n }\n\n // ── Audio output ───────────────────────────────────────────────────\n\n private _applySinkId(deviceId: string): void {\n const video = this.shadowRoot?.querySelector('video.mcu-video') as HTMLVideoElement & {\n setSinkId?: (sinkId: string) => Promise<void>;\n };\n if (!video?.setSinkId) return;\n video.setSinkId(deviceId).catch((err) => {\n logger.error('[SwCallMedia] Failed to set audio output device:', err);\n });\n }\n\n // ── Resize / dimension management ──────────────────────────────────\n\n private _setupResizeObserver(): void {\n const video = this.shadowRoot?.querySelector('video.mcu-video') as HTMLVideoElement;\n const paddingWrapper = this.shadowRoot?.querySelector('.padding-wrapper') as HTMLDivElement;\n if (!video || !paddingWrapper) return;\n\n this._videoElement = video;\n this._paddingWrapper = paddingWrapper;\n\n this._resizeObserver = new ResizeObserver(\n debounce(() => this._recalculateDimensions(), 50)\n );\n this._resizeObserver.observe(this);\n\n this._videoResizeHandler = () => this._recalculateDimensions();\n video.addEventListener('resize', this._videoResizeHandler);\n\n this._windowResizeHandler = () => {\n requestAnimationFrame(() => this._recalculateDimensions());\n };\n window.addEventListener('resize', this._windowResizeHandler);\n\n this._recalculateDimensions();\n }\n\n private _recalculateDimensions(): void {\n const video = this._videoElement;\n const paddingWrapper = this._paddingWrapper;\n if (!video || !paddingWrapper) return;\n\n if (!video.videoWidth || !video.videoHeight) {\n paddingWrapper.style.width = '100%';\n paddingWrapper.style.height = '100%';\n paddingWrapper.style.paddingBottom = '0';\n paddingWrapper.style.transform = 'none';\n return;\n }\n\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n const containerRect = this.getBoundingClientRect();\n const containerWidth = containerRect.width;\n const containerHeight = containerRect.height;\n if (containerWidth <= 0 || containerHeight <= 0) return;\n\n const scaleX = Math.min(1, (viewportWidth - containerRect.left) / containerWidth);\n const scaleY = Math.min(1, (viewportHeight - containerRect.top) / containerHeight);\n const scale = Math.min(scaleX, scaleY);\n\n const maxWidth = containerWidth * scale;\n const maxHeight = containerHeight * scale;\n if (maxWidth <= 0 || maxHeight <= 0) return;\n\n const videoAspectRatio = video.videoWidth / video.videoHeight;\n const availableAspectRatio = maxWidth / maxHeight;\n\n let finalWidth: number;\n let finalHeight: number;\n\n if (videoAspectRatio > availableAspectRatio) {\n finalWidth = maxWidth;\n finalHeight = finalWidth / videoAspectRatio;\n } else {\n finalHeight = maxHeight;\n finalWidth = finalHeight * videoAspectRatio;\n }\n\n const visibleLeft = Math.max(0, containerRect.left);\n const visibleTop = Math.max(0, containerRect.top);\n const visibleRight = Math.min(viewportWidth, containerRect.right);\n const visibleBottom = Math.min(viewportHeight, containerRect.bottom);\n\n const visibleCenterX = (visibleLeft + visibleRight) / 2;\n const visibleCenterY = (visibleTop + visibleBottom) / 2;\n const containerCenterX = containerRect.left + containerWidth / 2;\n const containerCenterY = containerRect.top + containerHeight / 2;\n\n const offsetX = visibleCenterX - containerCenterX;\n const offsetY = visibleCenterY - containerCenterY;\n\n paddingWrapper.style.width = `${finalWidth}px`;\n paddingWrapper.style.height = `${finalHeight}px`;\n paddingWrapper.style.paddingBottom = '0';\n paddingWrapper.style.transform = `translate(${offsetX}px, ${offsetY}px)`;\n }\n\n private _cleanupResizeObserver(): void {\n if (this._resizeObserver) {\n this._resizeObserver.disconnect();\n this._resizeObserver = undefined;\n }\n const video = this.shadowRoot?.querySelector('video.mcu-video') as HTMLVideoElement;\n if (video && this._videoResizeHandler) {\n video.removeEventListener('resize', this._videoResizeHandler);\n this._videoResizeHandler = undefined;\n }\n if (this._windowResizeHandler) {\n window.removeEventListener('resize', this._windowResizeHandler);\n this._windowResizeHandler = undefined;\n }\n }\n\n private _cleanupVideoElement(): void {\n const video = this.shadowRoot?.querySelector('video.mcu-video') as HTMLVideoElement;\n if (video) detachMediaStream(video);\n }\n\n // ── Render ─────────────────────────────────────────────────────────\n\n render() {\n return html`\n <div class=\"mcu-content\" part=\"container\">\n <div class=\"padding-wrapper\">\n <div class=\"mcu-wrapper\">\n <video\n class=\"mcu-video\"\n part=\"video\"\n autoplay\n playsinline\n .srcObject=${this._remoteStreamValue}\n ></video>\n </div>\n <div class=\"mcu-layers\">\n <slot></slot>\n </div>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-call-media': SwCallMedia;\n }\n}\n"],"names":["logger","getLogger","SwCallMedia","LitElement","changedProperties","stream","signature","video","_a","attachMediaStream","_b","_c","_e","_d","waitForVideoReady","t","sub","deviceId","err","paddingWrapper","debounce","viewportWidth","viewportHeight","containerRect","containerWidth","containerHeight","scaleX","scaleY","scale","maxWidth","maxHeight","videoAspectRatio","availableAspectRatio","finalWidth","finalHeight","visibleLeft","visibleTop","visibleRight","visibleBottom","visibleCenterX","visibleCenterY","containerCenterX","containerCenterY","offsetX","offsetY","html","css","__decorateClass","property","consume","callStateContext","state","devicesContext","customElement"],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
import type { Call, DeviceController } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Context provider element that bridges an external `Call` and/or
|
|
5
|
+
* `DeviceController` into Lit context so any descendant web component
|
|
6
|
+
* (sw-call-media, sw-call-controls, sw-participants, etc.) receives live
|
|
7
|
+
* state without manual property wiring.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* ```html
|
|
11
|
+
* <sw-call-provider id="provider">
|
|
12
|
+
* <sw-call-media></sw-call-media>
|
|
13
|
+
* <sw-call-controls></sw-call-controls>
|
|
14
|
+
* </sw-call-provider>
|
|
15
|
+
* ```
|
|
16
|
+
* ```js
|
|
17
|
+
* provider.call = activeCall;
|
|
18
|
+
* provider.deviceController = signalWireClient;
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @prop {Call} call - Active call object
|
|
22
|
+
* @prop {DeviceController} deviceController - Device controller for input/output device management
|
|
23
|
+
*
|
|
24
|
+
* @slot - Default slot. Descendants consume the provided contexts.
|
|
25
|
+
*/
|
|
26
|
+
export declare class SwCallProvider extends LitElement {
|
|
27
|
+
static styles: import("lit").CSSResult;
|
|
28
|
+
call: Call | undefined;
|
|
29
|
+
deviceController: DeviceController | undefined;
|
|
30
|
+
private _callState;
|
|
31
|
+
private _devices;
|
|
32
|
+
protected updated(changed: Map<string, unknown>): void;
|
|
33
|
+
disconnectedCallback(): void;
|
|
34
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
35
|
+
}
|
|
36
|
+
declare global {
|
|
37
|
+
interface HTMLElementTagNameMap {
|
|
38
|
+
'sw-call-provider': SwCallProvider;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=sw-call-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-call-provider.d.ts","sourceRoot":"","sources":["../../src/components/sw-call-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAE5C,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAIhE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBACa,cAAe,SAAQ,UAAU;IAC5C,MAAM,CAAC,MAAM,0BAAqC;IAElB,IAAI,EAAE,IAAI,GAAG,SAAS,CAAa;IACnC,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAAa;IAE3F,OAAO,CAAC,UAAU,CAAwC;IAC1D,OAAO,CAAC,QAAQ,CAAsC;IAEtD,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAkBtD,oBAAoB,IAAI,IAAI;IAM5B,MAAM;CAGP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,kBAAkB,EAAE,cAAc,CAAC;KACpC;CACF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { LitElement as d, html as p, css as v } from "lit";
|
|
2
|
+
import { property as a, customElement as h } from "lit/decorators.js";
|
|
3
|
+
import { CallStateContextController as C } from "../context/CallStateContextController.js";
|
|
4
|
+
import { DevicesContextController as _ } from "../context/DevicesContextController.js";
|
|
5
|
+
var f = Object.defineProperty, m = Object.getOwnPropertyDescriptor, n = (t, s, r, o) => {
|
|
6
|
+
for (var e = o > 1 ? void 0 : o ? m(s, r) : s, i = t.length - 1, c; i >= 0; i--)
|
|
7
|
+
(c = t[i]) && (e = (o ? c(s, r, e) : c(e)) || e);
|
|
8
|
+
return o && e && f(s, r, e), e;
|
|
9
|
+
};
|
|
10
|
+
let l = class extends d {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(...arguments), this.call = void 0, this.deviceController = void 0, this._callState = new C(this), this._devices = new _(this);
|
|
13
|
+
}
|
|
14
|
+
updated(t) {
|
|
15
|
+
super.updated(t), t.has("call") && (this.call ? (this._callState.connect(this.call), this._devices.connectCall(this.call)) : (this._callState.disconnect(), this._devices.disconnectCall())), t.has("deviceController") && this.deviceController && this._devices.connectDevices(this.deviceController);
|
|
16
|
+
}
|
|
17
|
+
disconnectedCallback() {
|
|
18
|
+
super.disconnectedCallback(), this._callState.disconnect(), this._devices.disconnect();
|
|
19
|
+
}
|
|
20
|
+
render() {
|
|
21
|
+
return p`<slot></slot>`;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
l.styles = v`:host { display: contents; }`;
|
|
25
|
+
n([
|
|
26
|
+
a({ attribute: !1 })
|
|
27
|
+
], l.prototype, "call", 2);
|
|
28
|
+
n([
|
|
29
|
+
a({ attribute: !1 })
|
|
30
|
+
], l.prototype, "deviceController", 2);
|
|
31
|
+
l = n([
|
|
32
|
+
h("sw-call-provider")
|
|
33
|
+
], l);
|
|
34
|
+
export {
|
|
35
|
+
l as SwCallProvider
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=sw-call-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-call-provider.js","sources":["../../src/components/sw-call-provider.ts"],"sourcesContent":["import { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { Call, DeviceController } from '../types/index.js';\nimport { CallStateContextController } from '../context/CallStateContextController.js';\nimport { DevicesContextController } from '../context/DevicesContextController.js';\n\n/**\n * Context provider element that bridges an external `Call` and/or\n * `DeviceController` into Lit context so any descendant web component\n * (sw-call-media, sw-call-controls, sw-participants, etc.) receives live\n * state without manual property wiring.\n *\n * Usage:\n * ```html\n * <sw-call-provider id=\"provider\">\n * <sw-call-media></sw-call-media>\n * <sw-call-controls></sw-call-controls>\n * </sw-call-provider>\n * ```\n * ```js\n * provider.call = activeCall;\n * provider.deviceController = signalWireClient;\n * ```\n *\n * @prop {Call} call - Active call object\n * @prop {DeviceController} deviceController - Device controller for input/output device management\n *\n * @slot - Default slot. Descendants consume the provided contexts.\n */\n@customElement('sw-call-provider')\nexport class SwCallProvider extends LitElement {\n static styles = css`:host { display: contents; }`;\n\n @property({ attribute: false }) call: Call | undefined = undefined;\n @property({ attribute: false }) deviceController: DeviceController | undefined = undefined;\n\n private _callState = new CallStateContextController(this);\n private _devices = new DevicesContextController(this);\n\n protected updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n\n if (changed.has('call')) {\n if (this.call) {\n this._callState.connect(this.call);\n this._devices.connectCall(this.call);\n } else {\n this._callState.disconnect();\n this._devices.disconnectCall();\n }\n }\n\n if (changed.has('deviceController') && this.deviceController) {\n this._devices.connectDevices(this.deviceController);\n }\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this._callState.disconnect();\n this._devices.disconnect();\n }\n\n render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-call-provider': SwCallProvider;\n }\n}\n"],"names":["SwCallProvider","LitElement","CallStateContextController","DevicesContextController","changed","html","css","__decorateClass","property","customElement"],"mappings":";;;;;;;;;AA8BO,IAAMA,IAAN,cAA6BC,EAAW;AAAA,EAAxC,cAAA;AAAA,UAAA,GAAA,SAAA,GAG2B,KAAA,OAAyB,QACzB,KAAA,mBAAiD,QAEjF,KAAQ,aAAa,IAAIC,EAA2B,IAAI,GACxD,KAAQ,WAAW,IAAIC,EAAyB,IAAI;AAAA,EAAA;AAAA,EAE1C,QAAQC,GAAqC;AACrD,UAAM,QAAQA,CAAO,GAEjBA,EAAQ,IAAI,MAAM,MAChB,KAAK,QACP,KAAK,WAAW,QAAQ,KAAK,IAAI,GACjC,KAAK,SAAS,YAAY,KAAK,IAAI,MAEnC,KAAK,WAAW,WAAA,GAChB,KAAK,SAAS,eAAA,KAIdA,EAAQ,IAAI,kBAAkB,KAAK,KAAK,oBAC1C,KAAK,SAAS,eAAe,KAAK,gBAAgB;AAAA,EAEtD;AAAA,EAEA,uBAA6B;AAC3B,UAAM,qBAAA,GACN,KAAK,WAAW,WAAA,GAChB,KAAK,SAAS,WAAA;AAAA,EAChB;AAAA,EAEA,SAAS;AACP,WAAOC;AAAA,EACT;AACF;AApCaL,EACJ,SAASM;AAEgBC,EAAA;AAAA,EAA/BC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GAHnBR,EAGqB,WAAA,QAAA,CAAA;AACAO,EAAA;AAAA,EAA/BC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GAJnBR,EAIqB,WAAA,oBAAA,CAAA;AAJrBA,IAANO,EAAA;AAAA,EADNE,EAAc,kBAAkB;AAAA,GACpBT,CAAA;"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call Status Component
|
|
3
|
+
*
|
|
4
|
+
* Displays current call state with status text and duration timer.
|
|
5
|
+
*
|
|
6
|
+
* Input precedence (most specific wins): `.call` > context.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```html
|
|
10
|
+
* <!-- Inside a context provider: -->
|
|
11
|
+
* <sw-call-status></sw-call-status>
|
|
12
|
+
*
|
|
13
|
+
* <!-- Standalone with an explicit Call: -->
|
|
14
|
+
* <sw-call-status .call=${call}></sw-call-status>
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* @csspart container - Outer status container.
|
|
18
|
+
* @csspart status-text - Text label of the current status.
|
|
19
|
+
* @csspart duration - Elapsed-time label (only rendered when connected).
|
|
20
|
+
*/
|
|
21
|
+
import { LitElement } from 'lit';
|
|
22
|
+
import type { Call } from '../types/index.js';
|
|
23
|
+
export declare class SwCallStatus extends LitElement {
|
|
24
|
+
static styles: import("lit").CSSResult;
|
|
25
|
+
/** Explicit Call — when set, subscribes directly to its observables and bypasses context. */
|
|
26
|
+
call?: Call;
|
|
27
|
+
private _callState?;
|
|
28
|
+
/** Status from a directly-subscribed `.call` — `null` when context is the source. */
|
|
29
|
+
private _directStatus;
|
|
30
|
+
private _callStartTime;
|
|
31
|
+
private _duration;
|
|
32
|
+
private _durationInterval;
|
|
33
|
+
private _prevStatus;
|
|
34
|
+
private _directSubscriptions;
|
|
35
|
+
private get _effectiveStatus();
|
|
36
|
+
protected updated(changed: Map<string, unknown>): void;
|
|
37
|
+
disconnectedCallback(): void;
|
|
38
|
+
private _setupDirect;
|
|
39
|
+
private _teardownDirect;
|
|
40
|
+
private _startDurationTimer;
|
|
41
|
+
private _stopDurationTimer;
|
|
42
|
+
private getStatusText;
|
|
43
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
44
|
+
}
|
|
45
|
+
declare global {
|
|
46
|
+
interface HTMLElementTagNameMap {
|
|
47
|
+
'sw-call-status': SwCallStatus;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=sw-call-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-call-status.d.ts","sourceRoot":"","sources":["../../src/components/sw-call-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAK5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAG9C,qBACa,YAAa,SAAQ,UAAU;IAC1C,MAAM,CAAC,MAAM,0BA4FT;IAEJ,6FAA6F;IACjE,IAAI,CAAC,EAAE,IAAI,CAAC;IAIxC,OAAO,CAAC,UAAU,CAAC,CAAY;IAE/B,qFAAqF;IAC5E,OAAO,CAAC,aAAa,CAA2B;IAEhD,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,SAAS,CAAU;IAEpC,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,oBAAoB,CAAsB;IAElD,OAAO,KAAK,gBAAgB,GAE3B;IAED,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAqBtD,oBAAoB;IAMpB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,aAAa;IA8BrB,MAAM;CAgBP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,gBAAgB,EAAE,YAAY,CAAC;KAChC;CACF"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { LitElement as d, html as l, css as p } from "lit";
|
|
2
|
+
import { property as h, state as c, customElement as v } from "lit/decorators.js";
|
|
3
|
+
import { consume as _ } from "@lit/context";
|
|
4
|
+
import { callStateContext as f } from "../context/call-state-context.js";
|
|
5
|
+
var g = Object.defineProperty, m = Object.getOwnPropertyDescriptor, n = (t, e, r, i) => {
|
|
6
|
+
for (var a = i > 1 ? void 0 : i ? m(e, r) : e, o = t.length - 1, u; o >= 0; o--)
|
|
7
|
+
(u = t[o]) && (a = (i ? u(e, r, a) : u(a)) || a);
|
|
8
|
+
return i && a && g(e, r, a), a;
|
|
9
|
+
};
|
|
10
|
+
let s = class extends d {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(...arguments), this._directStatus = null, this._callStartTime = null, this._duration = "0:00", this._durationInterval = null, this._prevStatus = "new", this._directSubscriptions = [];
|
|
13
|
+
}
|
|
14
|
+
get _effectiveStatus() {
|
|
15
|
+
var t;
|
|
16
|
+
return this.call ? this._directStatus ?? "new" : ((t = this._callState) == null ? void 0 : t.status) ?? "new";
|
|
17
|
+
}
|
|
18
|
+
updated(t) {
|
|
19
|
+
if (super.updated(t), t.has("call") && (this._teardownDirect(), this.call && this._setupDirect(this.call)), t.has("call") || t.has("_callState") || t.has("_directStatus")) {
|
|
20
|
+
const e = this._effectiveStatus;
|
|
21
|
+
e !== this._prevStatus && (e === "connected" && this._prevStatus !== "connected" ? this._startDurationTimer() : e !== "connected" && this._stopDurationTimer(), this._prevStatus = e);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
disconnectedCallback() {
|
|
25
|
+
super.disconnectedCallback(), this._stopDurationTimer(), this._teardownDirect();
|
|
26
|
+
}
|
|
27
|
+
_setupDirect(t) {
|
|
28
|
+
this._directSubscriptions.push(
|
|
29
|
+
t.status$.subscribe((e) => {
|
|
30
|
+
this._directStatus = e;
|
|
31
|
+
})
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
_teardownDirect() {
|
|
35
|
+
this._directSubscriptions.forEach((t) => t.unsubscribe()), this._directSubscriptions = [], this._directStatus = null;
|
|
36
|
+
}
|
|
37
|
+
_startDurationTimer() {
|
|
38
|
+
this._callStartTime = Date.now(), this._duration = "0:00", this._durationInterval = window.setInterval(() => {
|
|
39
|
+
if (this._callStartTime) {
|
|
40
|
+
const t = Math.floor((Date.now() - this._callStartTime) / 1e3), e = Math.floor(t / 3600), r = Math.floor(t % 3600 / 60), i = t % 60;
|
|
41
|
+
this._duration = e > 0 ? `${e}:${r.toString().padStart(2, "0")}:${i.toString().padStart(2, "0")}` : `${r}:${i.toString().padStart(2, "0")}`;
|
|
42
|
+
}
|
|
43
|
+
}, 1e3);
|
|
44
|
+
}
|
|
45
|
+
_stopDurationTimer() {
|
|
46
|
+
this._durationInterval && (clearInterval(this._durationInterval), this._durationInterval = null), this._callStartTime = null, this._duration = "0:00";
|
|
47
|
+
}
|
|
48
|
+
getStatusText() {
|
|
49
|
+
const t = this._effectiveStatus;
|
|
50
|
+
switch (t) {
|
|
51
|
+
case "new":
|
|
52
|
+
return "Ready";
|
|
53
|
+
case "trying":
|
|
54
|
+
return "Trying...";
|
|
55
|
+
case "connecting":
|
|
56
|
+
return "Connecting...";
|
|
57
|
+
case "ringing":
|
|
58
|
+
return "Ringing...";
|
|
59
|
+
case "connected":
|
|
60
|
+
return "Connected";
|
|
61
|
+
case "recovering":
|
|
62
|
+
return "Reconnecting...";
|
|
63
|
+
case "disconnecting":
|
|
64
|
+
return "Disconnecting...";
|
|
65
|
+
case "disconnected":
|
|
66
|
+
return "Disconnected";
|
|
67
|
+
case "failed":
|
|
68
|
+
return "Failed";
|
|
69
|
+
case "destroyed":
|
|
70
|
+
return "Ended";
|
|
71
|
+
default:
|
|
72
|
+
return String(t);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
render() {
|
|
76
|
+
const t = this._effectiveStatus, e = this.getStatusText();
|
|
77
|
+
return l`
|
|
78
|
+
<div class="container" part="container">
|
|
79
|
+
<span class="status-indicator ${t}" aria-hidden="true"></span>
|
|
80
|
+
<span class="status-text ${t}" part="status-text" role="status" aria-live="polite">
|
|
81
|
+
${e}
|
|
82
|
+
</span>
|
|
83
|
+
${t === "connected" ? l`<span class="duration" part="duration">${this._duration}</span>` : null}
|
|
84
|
+
</div>
|
|
85
|
+
`;
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
s.styles = p`
|
|
89
|
+
:host {
|
|
90
|
+
display: inline-flex;
|
|
91
|
+
align-items: center;
|
|
92
|
+
gap: 8px;
|
|
93
|
+
font-family: var(--type-family-body);
|
|
94
|
+
font-size: var(--type-size-small);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.container {
|
|
98
|
+
display: inline-flex;
|
|
99
|
+
align-items: center;
|
|
100
|
+
gap: 8px;
|
|
101
|
+
padding: 8px 12px;
|
|
102
|
+
border-radius: var(--radius-md);
|
|
103
|
+
color: var(--fg-default);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.status-indicator {
|
|
107
|
+
width: 10px;
|
|
108
|
+
height: 10px;
|
|
109
|
+
border-radius: 50%;
|
|
110
|
+
flex-shrink: 0;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.status-indicator.new {
|
|
114
|
+
background-color: var(--bg-surface-raised);
|
|
115
|
+
}
|
|
116
|
+
.status-indicator.connecting,
|
|
117
|
+
.status-indicator.ringing,
|
|
118
|
+
.status-indicator.trying,
|
|
119
|
+
.status-indicator.recovering {
|
|
120
|
+
background-color: var(--interactive-status-warning);
|
|
121
|
+
animation: pulse 1.5s ease-in-out infinite;
|
|
122
|
+
}
|
|
123
|
+
.status-indicator.connected {
|
|
124
|
+
background-color: var(--interactive-status-success);
|
|
125
|
+
}
|
|
126
|
+
.status-indicator.disconnecting {
|
|
127
|
+
background-color: var(--interactive-button-destructive-bg);
|
|
128
|
+
animation: pulse 1s ease-in-out infinite;
|
|
129
|
+
}
|
|
130
|
+
.status-indicator.disconnected,
|
|
131
|
+
.status-indicator.failed {
|
|
132
|
+
background-color: var(--interactive-button-destructive-bg);
|
|
133
|
+
}
|
|
134
|
+
.status-indicator.destroyed {
|
|
135
|
+
background-color: var(--bg-surface-raised);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
@keyframes pulse {
|
|
139
|
+
0%,
|
|
140
|
+
100% {
|
|
141
|
+
opacity: 1;
|
|
142
|
+
transform: scale(1);
|
|
143
|
+
}
|
|
144
|
+
50% {
|
|
145
|
+
opacity: 0.5;
|
|
146
|
+
transform: scale(1.1);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.status-text {
|
|
151
|
+
font-weight: 500;
|
|
152
|
+
white-space: nowrap;
|
|
153
|
+
}
|
|
154
|
+
.status-text.trying,
|
|
155
|
+
.status-text.connecting,
|
|
156
|
+
.status-text.ringing,
|
|
157
|
+
.status-text.recovering {
|
|
158
|
+
color: var(--interactive-status-warning);
|
|
159
|
+
}
|
|
160
|
+
.status-text.disconnecting {
|
|
161
|
+
color: var(--interactive-button-destructive-bg);
|
|
162
|
+
}
|
|
163
|
+
.status-text.connected {
|
|
164
|
+
color: var(--interactive-status-success);
|
|
165
|
+
}
|
|
166
|
+
.status-text.disconnected,
|
|
167
|
+
.status-text.failed {
|
|
168
|
+
color: var(--interactive-button-destructive-bg);
|
|
169
|
+
}
|
|
170
|
+
.status-text.new,
|
|
171
|
+
.status-text.destroyed {
|
|
172
|
+
color: var(--bg-surface-raised);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.duration {
|
|
176
|
+
font-variant-numeric: tabular-nums;
|
|
177
|
+
opacity: 0.6;
|
|
178
|
+
font-size: 0.85em;
|
|
179
|
+
}
|
|
180
|
+
`;
|
|
181
|
+
n([
|
|
182
|
+
h({ type: Object })
|
|
183
|
+
], s.prototype, "call", 2);
|
|
184
|
+
n([
|
|
185
|
+
_({ context: f, subscribe: !0 }),
|
|
186
|
+
c()
|
|
187
|
+
], s.prototype, "_callState", 2);
|
|
188
|
+
n([
|
|
189
|
+
c()
|
|
190
|
+
], s.prototype, "_directStatus", 2);
|
|
191
|
+
n([
|
|
192
|
+
c()
|
|
193
|
+
], s.prototype, "_callStartTime", 2);
|
|
194
|
+
n([
|
|
195
|
+
c()
|
|
196
|
+
], s.prototype, "_duration", 2);
|
|
197
|
+
s = n([
|
|
198
|
+
v("sw-call-status")
|
|
199
|
+
], s);
|
|
200
|
+
export {
|
|
201
|
+
s as SwCallStatus
|
|
202
|
+
};
|
|
203
|
+
//# sourceMappingURL=sw-call-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-call-status.js","sources":["../../src/components/sw-call-status.ts"],"sourcesContent":["/**\n * Call Status Component\n *\n * Displays current call state with status text and duration timer.\n *\n * Input precedence (most specific wins): `.call` > context.\n *\n * @example\n * ```html\n * <!-- Inside a context provider: -->\n * <sw-call-status></sw-call-status>\n *\n * <!-- Standalone with an explicit Call: -->\n * <sw-call-status .call=${call}></sw-call-status>\n * ```\n *\n * @csspart container - Outer status container.\n * @csspart status-text - Text label of the current status.\n * @csspart duration - Elapsed-time label (only rendered when connected).\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\nimport { Subscription } from 'rxjs';\nimport type { CallStatus } from '@signalwire/js';\nimport type { Call } from '../types/index.js';\nimport { callStateContext, type CallState } from '../context/call-state-context.js';\n\n@customElement('sw-call-status')\nexport class SwCallStatus extends LitElement {\n static styles = css`\n :host {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n font-family: var(--type-family-body);\n font-size: var(--type-size-small);\n }\n\n .container {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-radius: var(--radius-md);\n color: var(--fg-default);\n }\n\n .status-indicator {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n flex-shrink: 0;\n }\n\n .status-indicator.new {\n background-color: var(--bg-surface-raised);\n }\n .status-indicator.connecting,\n .status-indicator.ringing,\n .status-indicator.trying,\n .status-indicator.recovering {\n background-color: var(--interactive-status-warning);\n animation: pulse 1.5s ease-in-out infinite;\n }\n .status-indicator.connected {\n background-color: var(--interactive-status-success);\n }\n .status-indicator.disconnecting {\n background-color: var(--interactive-button-destructive-bg);\n animation: pulse 1s ease-in-out infinite;\n }\n .status-indicator.disconnected,\n .status-indicator.failed {\n background-color: var(--interactive-button-destructive-bg);\n }\n .status-indicator.destroyed {\n background-color: var(--bg-surface-raised);\n }\n\n @keyframes pulse {\n 0%,\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n 50% {\n opacity: 0.5;\n transform: scale(1.1);\n }\n }\n\n .status-text {\n font-weight: 500;\n white-space: nowrap;\n }\n .status-text.trying,\n .status-text.connecting,\n .status-text.ringing,\n .status-text.recovering {\n color: var(--interactive-status-warning);\n }\n .status-text.disconnecting {\n color: var(--interactive-button-destructive-bg);\n }\n .status-text.connected {\n color: var(--interactive-status-success);\n }\n .status-text.disconnected,\n .status-text.failed {\n color: var(--interactive-button-destructive-bg);\n }\n .status-text.new,\n .status-text.destroyed {\n color: var(--bg-surface-raised);\n }\n\n .duration {\n font-variant-numeric: tabular-nums;\n opacity: 0.6;\n font-size: 0.85em;\n }\n `;\n\n /** Explicit Call — when set, subscribes directly to its observables and bypasses context. */\n @property({ type: Object }) call?: Call;\n\n @consume({ context: callStateContext, subscribe: true })\n @state()\n private _callState?: CallState;\n\n /** Status from a directly-subscribed `.call` — `null` when context is the source. */\n @state() private _directStatus: CallStatus | null = null;\n\n @state() private _callStartTime: number | null = null;\n @state() private _duration = '0:00';\n\n private _durationInterval: number | null = null;\n private _prevStatus: CallStatus = 'new';\n private _directSubscriptions: Subscription[] = [];\n\n private get _effectiveStatus(): CallStatus {\n return this.call ? this._directStatus ?? 'new' : this._callState?.status ?? 'new';\n }\n\n protected updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n\n if (changed.has('call')) {\n this._teardownDirect();\n if (this.call) this._setupDirect(this.call);\n }\n\n if (changed.has('call') || changed.has('_callState') || changed.has('_directStatus')) {\n const status = this._effectiveStatus;\n if (status !== this._prevStatus) {\n if (status === 'connected' && this._prevStatus !== 'connected') {\n this._startDurationTimer();\n } else if (status !== 'connected') {\n this._stopDurationTimer();\n }\n this._prevStatus = status;\n }\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._stopDurationTimer();\n this._teardownDirect();\n }\n\n private _setupDirect(call: Call): void {\n this._directSubscriptions.push(\n call.status$.subscribe((s) => {\n this._directStatus = s;\n })\n );\n }\n\n private _teardownDirect(): void {\n this._directSubscriptions.forEach((s) => s.unsubscribe());\n this._directSubscriptions = [];\n this._directStatus = null;\n }\n\n private _startDurationTimer(): void {\n this._callStartTime = Date.now();\n this._duration = '0:00';\n this._durationInterval = window.setInterval(() => {\n if (this._callStartTime) {\n const elapsed = Math.floor((Date.now() - this._callStartTime) / 1000);\n const hours = Math.floor(elapsed / 3600);\n const minutes = Math.floor((elapsed % 3600) / 60);\n const secs = elapsed % 60;\n this._duration =\n hours > 0\n ? `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`\n : `${minutes}:${secs.toString().padStart(2, '0')}`;\n }\n }, 1000);\n }\n\n private _stopDurationTimer(): void {\n if (this._durationInterval) {\n clearInterval(this._durationInterval);\n this._durationInterval = null;\n }\n this._callStartTime = null;\n this._duration = '0:00';\n }\n\n private getStatusText(): string {\n const status = this._effectiveStatus;\n switch (status) {\n case 'new':\n return 'Ready';\n case 'trying':\n return 'Trying...';\n case 'connecting':\n return 'Connecting...';\n case 'ringing':\n return 'Ringing...';\n case 'connected':\n return 'Connected';\n case 'recovering':\n return 'Reconnecting...';\n case 'disconnecting':\n return 'Disconnecting...';\n case 'disconnected':\n return 'Disconnected';\n case 'failed':\n return 'Failed';\n case 'destroyed':\n return 'Ended';\n default: {\n const _exhaustive: never = status;\n return String(_exhaustive);\n }\n }\n }\n\n render() {\n const status = this._effectiveStatus;\n const statusText = this.getStatusText();\n\n return html`\n <div class=\"container\" part=\"container\">\n <span class=\"status-indicator ${status}\" aria-hidden=\"true\"></span>\n <span class=\"status-text ${status}\" part=\"status-text\" role=\"status\" aria-live=\"polite\">\n ${statusText}\n </span>\n ${status === 'connected'\n ? html`<span class=\"duration\" part=\"duration\">${this._duration}</span>`\n : null}\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-call-status': SwCallStatus;\n }\n}\n"],"names":["SwCallStatus","LitElement","_a","changed","status","call","s","elapsed","hours","minutes","secs","statusText","html","css","__decorateClass","property","consume","callStateContext","state","customElement"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { StaticCredentialProvider, EmbedTokenCredentialProvider } from '@signalwire/js';
|
|
2
|
+
export declare const DEFAULT_EMBED_HOST = "embeds.signalwire.com";
|
|
3
|
+
export declare function normalizeHost(h: string): string;
|
|
4
|
+
export declare function isEmbedToken(t: string): boolean;
|
|
5
|
+
export declare function buildCredentialProvider(token: string, host: string): EmbedTokenCredentialProvider | StaticCredentialProvider;
|
|
6
|
+
//# sourceMappingURL=client-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-factory.d.ts","sourceRoot":"","sources":["../../../src/components/sw-call-widget/client-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC7B,MAAM,gBAAgB,CAAC;AAGxB,eAAO,MAAM,kBAAkB,0BAA0B,CAAC;AAE1D,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAO/C;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,2DAQlE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { EmbedTokenCredentialProvider as t, StaticCredentialProvider as n } from "@signalwire/js";
|
|
2
|
+
const i = ["c2c_", "c2t_"], o = "embeds.signalwire.com";
|
|
3
|
+
function c(r) {
|
|
4
|
+
try {
|
|
5
|
+
return new URL(r.includes("://") ? r : `https://${r}`).hostname;
|
|
6
|
+
} catch {
|
|
7
|
+
return r;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function s(r) {
|
|
11
|
+
return i.some((e) => r.startsWith(e));
|
|
12
|
+
}
|
|
13
|
+
function d(r, e) {
|
|
14
|
+
return s(r) ? new t(
|
|
15
|
+
c(e || o),
|
|
16
|
+
r
|
|
17
|
+
) : new n({ token: r });
|
|
18
|
+
}
|
|
19
|
+
export {
|
|
20
|
+
o as DEFAULT_EMBED_HOST,
|
|
21
|
+
d as buildCredentialProvider,
|
|
22
|
+
s as isEmbedToken,
|
|
23
|
+
c as normalizeHost
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=client-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-factory.js","sources":["../../../src/components/sw-call-widget/client-factory.ts"],"sourcesContent":["import {\n StaticCredentialProvider,\n EmbedTokenCredentialProvider,\n} from '@signalwire/js';\n\nconst EMBED_TOKEN_PREFIXES = ['c2c_', 'c2t_'] as const;\nexport const DEFAULT_EMBED_HOST = 'embeds.signalwire.com';\n\nexport function normalizeHost(h: string): string {\n try {\n const url = new URL(h.includes('://') ? h : `https://${h}`);\n return url.hostname;\n } catch {\n return h;\n }\n}\n\nexport function isEmbedToken(t: string): boolean {\n return EMBED_TOKEN_PREFIXES.some((p) => t.startsWith(p));\n}\n\nexport function buildCredentialProvider(token: string, host: string) {\n if (isEmbedToken(token)) {\n return new EmbedTokenCredentialProvider(\n normalizeHost(host || DEFAULT_EMBED_HOST),\n token,\n );\n }\n return new StaticCredentialProvider({ token });\n}\n"],"names":["EMBED_TOKEN_PREFIXES","DEFAULT_EMBED_HOST","normalizeHost","h","isEmbedToken","t","p","buildCredentialProvider","token","host","EmbedTokenCredentialProvider","StaticCredentialProvider"],"mappings":";AAKA,MAAMA,IAAuB,CAAC,QAAQ,MAAM,GAC/BC,IAAqB;AAE3B,SAASC,EAAcC,GAAmB;AAC/C,MAAI;AAEF,WADY,IAAI,IAAIA,EAAE,SAAS,KAAK,IAAIA,IAAI,WAAWA,CAAC,EAAE,EAC/C;AAAA,EACb,QAAQ;AACN,WAAOA;AAAA,EACT;AACF;AAEO,SAASC,EAAaC,GAAoB;AAC/C,SAAOL,EAAqB,KAAK,CAACM,MAAMD,EAAE,WAAWC,CAAC,CAAC;AACzD;AAEO,SAASC,EAAwBC,GAAeC,GAAc;AACnE,SAAIL,EAAaI,CAAK,IACb,IAAIE;AAAA,IACTR,EAAcO,KAAQR,CAAkB;AAAA,IACxCO;AAAA,EAAA,IAGG,IAAIG,EAAyB,EAAE,OAAAH,GAAO;AAC/C;"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
import '../sw-call-media.js';
|
|
3
|
+
import '../sw-local-camera.js';
|
|
4
|
+
import '../sw-call-controls.js';
|
|
5
|
+
import '../UI/layout/sw-ui-call-layout.js';
|
|
6
|
+
import '../UI/layout/sw-ui-responsive-container.js';
|
|
7
|
+
import '../UI/layout/sw-ui-modal.js';
|
|
8
|
+
import '../UI/layout/sw-ui-background.js';
|
|
9
|
+
import '../UI/layout/sw-ui-content-drawer.js';
|
|
10
|
+
import '../UI/sw-ui-transcript-view.js';
|
|
11
|
+
/**
|
|
12
|
+
* All-in-one call widget. Handles client initialisation, dialling, media,
|
|
13
|
+
* controls and optional AI transcript — in either inline or modal modes.
|
|
14
|
+
*
|
|
15
|
+
* Composes `sw-ui-call-layout`, `sw-call-media`, `sw-local-camera`,
|
|
16
|
+
* `sw-call-controls`, and `sw-ui-transcript-view` under the hood.
|
|
17
|
+
* All child components are wired via Lit context — no manual plumbing needed.
|
|
18
|
+
*
|
|
19
|
+
* @prop {string} token - SignalWire SAT or embed token
|
|
20
|
+
* @prop {string} host - Optional server host
|
|
21
|
+
* @prop {string} destination - Call destination (address or resource)
|
|
22
|
+
* @prop {boolean} modal - Render in a `<sw-ui-modal>` overlay
|
|
23
|
+
* @prop {boolean} transcription - Show AI transcript panel
|
|
24
|
+
*
|
|
25
|
+
* @slot background - Background element (e.g. `<sw-ui-background default>`)
|
|
26
|
+
* @slot (default) - Trigger element (click to dial, shown when idle)
|
|
27
|
+
*
|
|
28
|
+
* @fires sw-dial - When `dial()` is invoked. Detail: `{ destination }`.
|
|
29
|
+
* @fires sw-call-ended - When the call reaches a terminal state (user hangup, remote disconnect, or failure). Detail: `{ status }`.
|
|
30
|
+
* @fires sw-display-content - From `display_content` user event. Detail: `DisplayContentPayload`.
|
|
31
|
+
* @fires signalwire-address:event - Forwarded SignalWire custom user events.
|
|
32
|
+
*
|
|
33
|
+
* All inner events bubble.
|
|
34
|
+
*
|
|
35
|
+
* @method dial() - Initiate call
|
|
36
|
+
* @method hangup() - End active call
|
|
37
|
+
*/
|
|
38
|
+
export declare class SwCallWidget extends LitElement {
|
|
39
|
+
static styles: import("lit").CSSResult;
|
|
40
|
+
token: string;
|
|
41
|
+
host: string;
|
|
42
|
+
destination: string;
|
|
43
|
+
modal: boolean;
|
|
44
|
+
transcription: boolean;
|
|
45
|
+
allowIncomingCalls: boolean;
|
|
46
|
+
audioOnly: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Custom variables sent with the Verto invite as a JSON object.
|
|
49
|
+
*
|
|
50
|
+
* The widget always advertises `capabilities.display_content` and
|
|
51
|
+
* `metadata.widget.opened_at` so the agent can detect that the caller
|
|
52
|
+
* supports the content drawer; user-supplied keys are merged in and win
|
|
53
|
+
* on shallow conflict.
|
|
54
|
+
*
|
|
55
|
+
* Invalid JSON is logged and ignored — the call still dials.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* <sw-call-widget user-variables='{"customer_id": "abc-123"}'></sw-call-widget>
|
|
59
|
+
*/
|
|
60
|
+
userVariables: string;
|
|
61
|
+
/**
|
|
62
|
+
* Skip auto-injecting the SignalWire `theme.css` design-token stylesheet.
|
|
63
|
+
* Set this when the host page already loads `@signalwire/web-components/theme.css`
|
|
64
|
+
* or a custom theme written against the same DTCG token names.
|
|
65
|
+
*/
|
|
66
|
+
disableAutoTheme: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Skip auto-loading the SignalWire brand fonts (Lexend, Instrument Sans,
|
|
69
|
+
* JetBrains Mono) from Google Fonts. Set this when fonts are self-hosted
|
|
70
|
+
* or loaded elsewhere.
|
|
71
|
+
*/
|
|
72
|
+
disableAutoFonts: boolean;
|
|
73
|
+
private _call;
|
|
74
|
+
private _connecting;
|
|
75
|
+
private _hasLayoutLayers;
|
|
76
|
+
private _drawer;
|
|
77
|
+
private _callState;
|
|
78
|
+
private _devices;
|
|
79
|
+
private _transcript;
|
|
80
|
+
private _userEventCtrl;
|
|
81
|
+
private _incomingCalls;
|
|
82
|
+
private _client;
|
|
83
|
+
private _subs;
|
|
84
|
+
private _pendingIncoming;
|
|
85
|
+
connectedCallback(): void;
|
|
86
|
+
protected updated(changed: Map<string, unknown>): void;
|
|
87
|
+
disconnectedCallback(): void;
|
|
88
|
+
private _destroyClient;
|
|
89
|
+
private _refreshClient;
|
|
90
|
+
dial(): Promise<void>;
|
|
91
|
+
hangup(): Promise<void>;
|
|
92
|
+
private _connectIncomingCalls;
|
|
93
|
+
private _handleIncomingCall;
|
|
94
|
+
private _wireCall;
|
|
95
|
+
private _onDisplayContent;
|
|
96
|
+
private _onDrawerClose;
|
|
97
|
+
private _unwireCall;
|
|
98
|
+
private _onSlotChange;
|
|
99
|
+
private _onHangUp;
|
|
100
|
+
private _onModalClose;
|
|
101
|
+
private _onFullscreenToggle;
|
|
102
|
+
private _onTranscriptToggle;
|
|
103
|
+
render(): import("lit-html").TemplateResult;
|
|
104
|
+
}
|
|
105
|
+
declare global {
|
|
106
|
+
interface HTMLElementTagNameMap {
|
|
107
|
+
'sw-call-widget': SwCallWidget;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=sw-call-widget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-call-widget.d.ts","sourceRoot":"","sources":["../../../src/components/sw-call-widget/sw-call-widget.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,KAAK,CAAC;AAchD,OAAO,qBAAqB,CAAC;AAC7B,OAAO,uBAAuB,CAAC;AAC/B,OAAO,wBAAwB,CAAC;AAChC,OAAO,mCAAmC,CAAC;AAC3C,OAAO,4CAA4C,CAAC;AACpD,OAAO,6BAA6B,CAAC;AACrC,OAAO,kCAAkC,CAAC;AAC1C,OAAO,sCAAsC,CAAC;AAC9C,OAAO,gCAAgC,CAAC;AAiBxC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBACa,YAAa,SAAQ,UAAU;IAC1C,MAAM,CAAC,MAAM,0BAAgB;IAID,KAAK,SAAM;IACX,IAAI,SAAM;IACV,WAAW,SAAM;IACD,KAAK,UAAS;IACd,aAAa,UAAS;IACa,kBAAkB,UAAS;IACrC,SAAS,UAAS;IAEvF;;;;;;;;;;;;OAYG;IACsD,aAAa,SAAM;IAE5E;;;;OAIG;IAC0E,gBAAgB,UAAS;IAEtG;;;;OAIG;IAC0E,gBAAgB,UAAS;IAI7F,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,OAAO,CAAsC;IAI9D,OAAO,CAAC,UAAU,CAAwC;IAC1D,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,WAAW,CAAwD;IAC3E,OAAO,CAAC,cAAc,CAAiC;IACvD,OAAO,CAAC,cAAc,CAAoC;IAI1D,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,gBAAgB,CAAS;IAIjC,iBAAiB,IAAI,IAAI;IAMzB,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAsBtD,oBAAoB,IAAI,IAAI;IAO5B,OAAO,CAAC,cAAc;IAwBtB,OAAO,CAAC,cAAc;IAoBhB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAoDrB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ7B,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,mBAAmB,CAyBzB;IAIF,OAAO,CAAC,SAAS;IAoCjB,OAAO,CAAC,iBAAiB,CASvB;IAEF,OAAO,CAAC,cAAc,CAEpB;IAEF,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,aAAa,CAYnB;IAEF,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,mBAAmB;IAM3B,MAAM;CAgCP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,gBAAgB,EAAE,YAAY,CAAC;KAChC;CACF"}
|