@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,319 @@
|
|
|
1
|
+
import { LitElement as p, html as l, css as h } from "lit";
|
|
2
|
+
import { state as d, property as b, customElement as m } from "lit/decorators.js";
|
|
3
|
+
import { consume as g } from "@lit/context";
|
|
4
|
+
import { callStateContext as _ } from "../context/call-state-context.js";
|
|
5
|
+
var v = Object.defineProperty, y = Object.getOwnPropertyDescriptor, a = (e, t, i, s) => {
|
|
6
|
+
for (var r = s > 1 ? void 0 : s ? y(t, i) : t, o = e.length - 1, c; o >= 0; o--)
|
|
7
|
+
(c = e[o]) && (r = (s ? c(t, i, r) : c(r)) || r);
|
|
8
|
+
return s && r && v(t, i, r), r;
|
|
9
|
+
};
|
|
10
|
+
let n = class extends p {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(...arguments), this._directLayoutLayers = [], this._directParticipants = [], this._directSelf = null, this._directSubscriptions = [], this._openMenuId = null, this._handleOutsideClick = (e) => {
|
|
13
|
+
const t = e.target;
|
|
14
|
+
!t.closest(".menu-trigger") && !t.closest(".menu-dropdown") && (this._openMenuId = null);
|
|
15
|
+
}, this._handleEscape = (e) => {
|
|
16
|
+
e.key === "Escape" && this._openMenuId !== null && (this._openMenuId = null);
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
connectedCallback() {
|
|
20
|
+
super.connectedCallback(), document.addEventListener("click", this._handleOutsideClick), document.addEventListener("keydown", this._handleEscape);
|
|
21
|
+
}
|
|
22
|
+
disconnectedCallback() {
|
|
23
|
+
super.disconnectedCallback(), document.removeEventListener("click", this._handleOutsideClick), document.removeEventListener("keydown", this._handleEscape), this._teardownDirect();
|
|
24
|
+
}
|
|
25
|
+
updated(e) {
|
|
26
|
+
super.updated(e), e.has("call") && (this._teardownDirect(), this.call && this._directSubscriptions.push(
|
|
27
|
+
this.call.layoutLayers$.subscribe((t) => this._directLayoutLayers = t),
|
|
28
|
+
this.call.participants$.subscribe((t) => this._directParticipants = t),
|
|
29
|
+
this.call.self$.subscribe((t) => this._directSelf = t)
|
|
30
|
+
));
|
|
31
|
+
}
|
|
32
|
+
_teardownDirect() {
|
|
33
|
+
this._directSubscriptions.forEach((e) => e.unsubscribe()), this._directSubscriptions = [], this._directLayoutLayers = [], this._directParticipants = [], this._directSelf = null;
|
|
34
|
+
}
|
|
35
|
+
// ── Helpers ────────────────────────────────────────────────────────
|
|
36
|
+
_toggleMenu(e, t) {
|
|
37
|
+
t.stopPropagation(), this._openMenuId = this._openMenuId === e ? null : e;
|
|
38
|
+
}
|
|
39
|
+
_getParticipant(e) {
|
|
40
|
+
var i;
|
|
41
|
+
return (this.call ? this._directParticipants : ((i = this._callState) == null ? void 0 : i.participants) ?? []).find((s) => s.id === e);
|
|
42
|
+
}
|
|
43
|
+
async _handleMuteAudio(e, t) {
|
|
44
|
+
t.stopPropagation();
|
|
45
|
+
const i = this._getParticipant(e);
|
|
46
|
+
if (i) {
|
|
47
|
+
try {
|
|
48
|
+
i.audioMuted ? await i.unmute() : await i.mute(), this.dispatchEvent(
|
|
49
|
+
new CustomEvent("sw-participant-mute-audio", {
|
|
50
|
+
detail: { participant: i, memberId: e },
|
|
51
|
+
bubbles: !0,
|
|
52
|
+
composed: !0
|
|
53
|
+
})
|
|
54
|
+
);
|
|
55
|
+
} catch {
|
|
56
|
+
}
|
|
57
|
+
this._openMenuId = null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async _handleMuteVideo(e, t) {
|
|
61
|
+
t.stopPropagation();
|
|
62
|
+
const i = this._getParticipant(e);
|
|
63
|
+
if (i) {
|
|
64
|
+
try {
|
|
65
|
+
i.videoMuted ? await i.unmuteVideo() : await i.muteVideo(), this.dispatchEvent(
|
|
66
|
+
new CustomEvent("sw-participant-mute-video", {
|
|
67
|
+
detail: { participant: i, memberId: e },
|
|
68
|
+
bubbles: !0,
|
|
69
|
+
composed: !0
|
|
70
|
+
})
|
|
71
|
+
);
|
|
72
|
+
} catch {
|
|
73
|
+
}
|
|
74
|
+
this._openMenuId = null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async _handleRemove(e, t) {
|
|
78
|
+
t.stopPropagation();
|
|
79
|
+
const i = this._getParticipant(e);
|
|
80
|
+
if (i != null && i.remove) {
|
|
81
|
+
try {
|
|
82
|
+
await i.remove(), this.dispatchEvent(
|
|
83
|
+
new CustomEvent("sw-participant-remove", {
|
|
84
|
+
detail: { participant: i, memberId: e },
|
|
85
|
+
bubbles: !0,
|
|
86
|
+
composed: !0
|
|
87
|
+
})
|
|
88
|
+
);
|
|
89
|
+
} catch {
|
|
90
|
+
}
|
|
91
|
+
this._openMenuId = null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// ── Render ─────────────────────────────────────────────────────────
|
|
95
|
+
_renderMenuIcon() {
|
|
96
|
+
return l`
|
|
97
|
+
<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
|
|
98
|
+
<circle cx="12" cy="6" r="2" />
|
|
99
|
+
<circle cx="12" cy="12" r="2" />
|
|
100
|
+
<circle cx="12" cy="18" r="2" />
|
|
101
|
+
</svg>
|
|
102
|
+
`;
|
|
103
|
+
}
|
|
104
|
+
_renderMenuDropdown(e) {
|
|
105
|
+
const t = this._getParticipant(e), i = this._openMenuId === e;
|
|
106
|
+
return l`
|
|
107
|
+
<div
|
|
108
|
+
class="menu-dropdown ${i ? "open" : ""}"
|
|
109
|
+
role="menu"
|
|
110
|
+
aria-label="Participant actions"
|
|
111
|
+
>
|
|
112
|
+
<button
|
|
113
|
+
class="menu-item"
|
|
114
|
+
role="menuitem"
|
|
115
|
+
@click=${(s) => this._handleMuteAudio(e, s)}
|
|
116
|
+
aria-label="${t != null && t.audioMuted ? "Unmute audio" : "Mute audio"}"
|
|
117
|
+
>
|
|
118
|
+
${t != null && t.audioMuted ? "Unmute" : "Mute"}
|
|
119
|
+
</button>
|
|
120
|
+
<button
|
|
121
|
+
class="menu-item"
|
|
122
|
+
role="menuitem"
|
|
123
|
+
@click=${(s) => this._handleMuteVideo(e, s)}
|
|
124
|
+
aria-label="${t != null && t.videoMuted ? "Enable video" : "Disable video"}"
|
|
125
|
+
>
|
|
126
|
+
${t != null && t.videoMuted ? "Enable video" : "Disable video"}
|
|
127
|
+
</button>
|
|
128
|
+
<button
|
|
129
|
+
class="menu-item danger"
|
|
130
|
+
role="menuitem"
|
|
131
|
+
@click=${(s) => this._handleRemove(e, s)}
|
|
132
|
+
aria-label="Remove participant"
|
|
133
|
+
>
|
|
134
|
+
Remove
|
|
135
|
+
</button>
|
|
136
|
+
</div>
|
|
137
|
+
`;
|
|
138
|
+
}
|
|
139
|
+
_renderOverlay(e, t) {
|
|
140
|
+
const i = e.member_id, s = `member-overlay${t ? " is-self" : ""}`, r = `
|
|
141
|
+
position: absolute;
|
|
142
|
+
top: ${e.y}%;
|
|
143
|
+
left: ${e.x}%;
|
|
144
|
+
width: ${e.width}%;
|
|
145
|
+
height: ${e.height}%;
|
|
146
|
+
opacity: ${e.visible ? 1 : 0};
|
|
147
|
+
overflow: visible;
|
|
148
|
+
transition: top 0.3s ease, left 0.3s ease, width 0.3s ease, height 0.3s ease, opacity 0.3s ease;
|
|
149
|
+
pointer-events: auto;
|
|
150
|
+
z-index: 10;
|
|
151
|
+
`;
|
|
152
|
+
return l`
|
|
153
|
+
<div class="${s}" part="overlay" style="${r}">
|
|
154
|
+
${t ? null : l`
|
|
155
|
+
<button
|
|
156
|
+
class="menu-trigger"
|
|
157
|
+
part="menu-trigger"
|
|
158
|
+
@click=${(o) => this._toggleMenu(i, o)}
|
|
159
|
+
aria-label="Participant menu"
|
|
160
|
+
aria-expanded="${this._openMenuId === i}"
|
|
161
|
+
aria-haspopup="menu"
|
|
162
|
+
>
|
|
163
|
+
${this._renderMenuIcon()}
|
|
164
|
+
</button>
|
|
165
|
+
${this._renderMenuDropdown(i)}
|
|
166
|
+
`}
|
|
167
|
+
<slot name="controls-${i}"></slot>
|
|
168
|
+
</div>
|
|
169
|
+
`;
|
|
170
|
+
}
|
|
171
|
+
render() {
|
|
172
|
+
var s, r, o, c;
|
|
173
|
+
const e = this.call ? this._directLayoutLayers : ((s = this._callState) == null ? void 0 : s.layoutLayers) ?? [], t = this.call ? (r = this._directSelf) == null ? void 0 : r.id : (c = (o = this._callState) == null ? void 0 : o.self) == null ? void 0 : c.id, i = e.filter((u) => u.member_id).map((u) => this._renderOverlay(u, u.member_id === t));
|
|
174
|
+
return l`
|
|
175
|
+
${i}
|
|
176
|
+
<slot></slot>
|
|
177
|
+
`;
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
n.styles = h`
|
|
181
|
+
:host {
|
|
182
|
+
display: contents;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.member-overlay {
|
|
186
|
+
box-sizing: border-box;
|
|
187
|
+
box-shadow: inset 0 0 0 8px rgba(255, 0, 0, 0.8);
|
|
188
|
+
background-color: rgba(255, 0, 0, 0.1);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.member-overlay.is-self {
|
|
192
|
+
box-shadow: inset 0 0 0 8px rgba(0, 0, 255, 0.8);
|
|
193
|
+
background-color: rgba(0, 0, 255, 0.1);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
.menu-trigger {
|
|
197
|
+
position: absolute;
|
|
198
|
+
top: 12px;
|
|
199
|
+
left: 12px;
|
|
200
|
+
width: 36px;
|
|
201
|
+
height: 36px;
|
|
202
|
+
border-radius: 50%;
|
|
203
|
+
background: rgba(0, 0, 0, 0.6);
|
|
204
|
+
border: 2px solid rgba(255, 255, 255, 0.3);
|
|
205
|
+
color: white;
|
|
206
|
+
cursor: pointer;
|
|
207
|
+
display: flex;
|
|
208
|
+
align-items: center;
|
|
209
|
+
justify-content: center;
|
|
210
|
+
transition:
|
|
211
|
+
background 0.2s ease,
|
|
212
|
+
transform 0.2s ease,
|
|
213
|
+
border-color 0.2s ease;
|
|
214
|
+
z-index: 20;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.menu-trigger:hover {
|
|
218
|
+
background: rgba(0, 0, 0, 0.8);
|
|
219
|
+
border-color: rgba(255, 255, 255, 0.6);
|
|
220
|
+
transform: scale(1.1);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
.menu-trigger:focus {
|
|
224
|
+
outline: none;
|
|
225
|
+
border-color: #044cf6;
|
|
226
|
+
box-shadow: 0 0 0 3px rgba(4, 78, 246, 0.4);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
.menu-trigger svg {
|
|
230
|
+
width: 20px;
|
|
231
|
+
height: 20px;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
.menu-dropdown {
|
|
235
|
+
position: absolute;
|
|
236
|
+
top: 12px;
|
|
237
|
+
left: 56px;
|
|
238
|
+
background: rgba(31, 41, 55, 0.95);
|
|
239
|
+
backdrop-filter: blur(8px);
|
|
240
|
+
border-radius: 8px;
|
|
241
|
+
padding: 8px 0;
|
|
242
|
+
min-width: 160px;
|
|
243
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
|
|
244
|
+
z-index: 30;
|
|
245
|
+
opacity: 0;
|
|
246
|
+
visibility: hidden;
|
|
247
|
+
transform: translateX(-10px);
|
|
248
|
+
transition:
|
|
249
|
+
opacity 0.2s ease,
|
|
250
|
+
transform 0.2s ease,
|
|
251
|
+
visibility 0.2s ease;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.menu-dropdown.open {
|
|
255
|
+
opacity: 1;
|
|
256
|
+
visibility: visible;
|
|
257
|
+
transform: translateX(0);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
.menu-item {
|
|
261
|
+
display: flex;
|
|
262
|
+
align-items: center;
|
|
263
|
+
gap: 8px;
|
|
264
|
+
padding: 8px 16px;
|
|
265
|
+
color: white;
|
|
266
|
+
font-size: 14px;
|
|
267
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
|
268
|
+
cursor: pointer;
|
|
269
|
+
transition: background 0.15s ease;
|
|
270
|
+
border: none;
|
|
271
|
+
background: none;
|
|
272
|
+
width: 100%;
|
|
273
|
+
text-align: left;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.menu-item:hover {
|
|
277
|
+
background: rgba(255, 255, 255, 0.1);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
.menu-item svg {
|
|
281
|
+
width: 16px;
|
|
282
|
+
height: 16px;
|
|
283
|
+
flex-shrink: 0;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
.menu-item.danger {
|
|
287
|
+
color: #ef4444;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
.menu-item.danger:hover {
|
|
291
|
+
background: rgba(239, 68, 68, 0.2);
|
|
292
|
+
}
|
|
293
|
+
`;
|
|
294
|
+
a([
|
|
295
|
+
g({ context: _, subscribe: !0 }),
|
|
296
|
+
d()
|
|
297
|
+
], n.prototype, "_callState", 2);
|
|
298
|
+
a([
|
|
299
|
+
b({ type: Object })
|
|
300
|
+
], n.prototype, "call", 2);
|
|
301
|
+
a([
|
|
302
|
+
d()
|
|
303
|
+
], n.prototype, "_directLayoutLayers", 2);
|
|
304
|
+
a([
|
|
305
|
+
d()
|
|
306
|
+
], n.prototype, "_directParticipants", 2);
|
|
307
|
+
a([
|
|
308
|
+
d()
|
|
309
|
+
], n.prototype, "_directSelf", 2);
|
|
310
|
+
a([
|
|
311
|
+
d()
|
|
312
|
+
], n.prototype, "_openMenuId", 2);
|
|
313
|
+
n = a([
|
|
314
|
+
m("sw-participants")
|
|
315
|
+
], n);
|
|
316
|
+
export {
|
|
317
|
+
n as SwParticipants
|
|
318
|
+
};
|
|
319
|
+
//# sourceMappingURL=sw-participants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-participants.js","sources":["../../src/components/sw-participants.ts"],"sourcesContent":["/**\n * SwParticipants Component\n *\n * Renders member overlays based on layoutLayers.\n * Excludes self member and provides slot for <self-media> child component.\n *\n * Input precedence (most specific wins): `.call` > context.\n *\n * @example\n * ```html\n * <sw-participants></sw-participants>\n * <sw-participants .call=${call}></sw-participants>\n * ```\n *\n * @slot - Default slot for overlay content.\n * @slot controls-{memberId} - Per-participant menu content (e.g. `sw-participant-controls`).\n *\n * @fires sw-participant-mute-audio - User muted/unmuted a participant's audio. Detail: `{ participant, memberId }`.\n * @fires sw-participant-mute-video - User muted/unmuted a participant's video. Detail: `{ participant, memberId }`.\n * @fires sw-participant-remove - User removed a participant. Detail: `{ participant, memberId }`.\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 { CallParticipant, CallSelfParticipant } from '@signalwire/js';\nimport type { Call, LayoutLayer } from '../types/index.js';\nimport { callStateContext, type CallState } from '../context/call-state-context.js';\n\n@customElement('sw-participants')\nexport class SwParticipants extends LitElement {\n static styles = css`\n :host {\n display: contents;\n }\n\n .member-overlay {\n box-sizing: border-box;\n box-shadow: inset 0 0 0 8px rgba(255, 0, 0, 0.8);\n background-color: rgba(255, 0, 0, 0.1);\n }\n\n .member-overlay.is-self {\n box-shadow: inset 0 0 0 8px rgba(0, 0, 255, 0.8);\n background-color: rgba(0, 0, 255, 0.1);\n }\n\n .menu-trigger {\n position: absolute;\n top: 12px;\n left: 12px;\n width: 36px;\n height: 36px;\n border-radius: 50%;\n background: rgba(0, 0, 0, 0.6);\n border: 2px solid rgba(255, 255, 255, 0.3);\n color: white;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition:\n background 0.2s ease,\n transform 0.2s ease,\n border-color 0.2s ease;\n z-index: 20;\n }\n\n .menu-trigger:hover {\n background: rgba(0, 0, 0, 0.8);\n border-color: rgba(255, 255, 255, 0.6);\n transform: scale(1.1);\n }\n\n .menu-trigger:focus {\n outline: none;\n border-color: #044cf6;\n box-shadow: 0 0 0 3px rgba(4, 78, 246, 0.4);\n }\n\n .menu-trigger svg {\n width: 20px;\n height: 20px;\n }\n\n .menu-dropdown {\n position: absolute;\n top: 12px;\n left: 56px;\n background: rgba(31, 41, 55, 0.95);\n backdrop-filter: blur(8px);\n border-radius: 8px;\n padding: 8px 0;\n min-width: 160px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n z-index: 30;\n opacity: 0;\n visibility: hidden;\n transform: translateX(-10px);\n transition:\n opacity 0.2s ease,\n transform 0.2s ease,\n visibility 0.2s ease;\n }\n\n .menu-dropdown.open {\n opacity: 1;\n visibility: visible;\n transform: translateX(0);\n }\n\n .menu-item {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 16px;\n color: white;\n font-size: 14px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n cursor: pointer;\n transition: background 0.15s ease;\n border: none;\n background: none;\n width: 100%;\n text-align: left;\n }\n\n .menu-item:hover {\n background: rgba(255, 255, 255, 0.1);\n }\n\n .menu-item svg {\n width: 16px;\n height: 16px;\n flex-shrink: 0;\n }\n\n .menu-item.danger {\n color: #ef4444;\n }\n\n .menu-item.danger:hover {\n background: rgba(239, 68, 68, 0.2);\n }\n `;\n\n @consume({ context: callStateContext, subscribe: true })\n @state()\n private _callState?: CallState;\n\n /** Explicit Call — when set, subscribes directly and bypasses context. */\n @property({ type: Object }) call?: Call;\n\n @state() private _directLayoutLayers: LayoutLayer[] = [];\n @state() private _directParticipants: CallParticipant[] = [];\n @state() private _directSelf: CallSelfParticipant | null = null;\n\n private _directSubscriptions: Subscription[] = [];\n\n @state()\n private _openMenuId: string | null = null;\n\n private _handleOutsideClick = (e: Event): void => {\n const target = e.target as Element;\n if (!target.closest('.menu-trigger') && !target.closest('.menu-dropdown')) {\n this._openMenuId = null;\n }\n };\n\n private _handleEscape = (e: KeyboardEvent): void => {\n if (e.key === 'Escape' && this._openMenuId !== null) {\n this._openMenuId = null;\n }\n };\n\n connectedCallback() {\n super.connectedCallback();\n document.addEventListener('click', this._handleOutsideClick);\n document.addEventListener('keydown', this._handleEscape);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener('click', this._handleOutsideClick);\n document.removeEventListener('keydown', this._handleEscape);\n this._teardownDirect();\n }\n\n protected updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('call')) {\n this._teardownDirect();\n if (this.call) {\n this._directSubscriptions.push(\n this.call.layoutLayers$.subscribe((l) => (this._directLayoutLayers = l)),\n this.call.participants$.subscribe((p) => (this._directParticipants = p)),\n this.call.self$.subscribe((s) => (this._directSelf = s))\n );\n }\n }\n }\n\n private _teardownDirect(): void {\n this._directSubscriptions.forEach((s) => s.unsubscribe());\n this._directSubscriptions = [];\n this._directLayoutLayers = [];\n this._directParticipants = [];\n this._directSelf = null;\n }\n\n // ── Helpers ────────────────────────────────────────────────────────\n\n private _toggleMenu(memberId: string, e: Event): void {\n e.stopPropagation();\n this._openMenuId = this._openMenuId === memberId ? null : memberId;\n }\n\n private _getParticipant(memberId: string) {\n const participants = this.call ? this._directParticipants : this._callState?.participants ?? [];\n return participants.find((p) => p.id === memberId);\n }\n\n private async _handleMuteAudio(memberId: string, e: Event): Promise<void> {\n e.stopPropagation();\n const participant = this._getParticipant(memberId);\n if (!participant) return;\n try {\n if (participant.audioMuted) {\n await participant.unmute();\n } else {\n await participant.mute();\n }\n this.dispatchEvent(\n new CustomEvent('sw-participant-mute-audio', {\n detail: { participant, memberId },\n bubbles: true,\n composed: true,\n })\n );\n } catch {\n // Silently handle error\n }\n this._openMenuId = null;\n }\n\n private async _handleMuteVideo(memberId: string, e: Event): Promise<void> {\n e.stopPropagation();\n const participant = this._getParticipant(memberId);\n if (!participant) return;\n try {\n if (participant.videoMuted) {\n await participant.unmuteVideo();\n } else {\n await participant.muteVideo();\n }\n this.dispatchEvent(\n new CustomEvent('sw-participant-mute-video', {\n detail: { participant, memberId },\n bubbles: true,\n composed: true,\n })\n );\n } catch {\n // Silently handle error\n }\n this._openMenuId = null;\n }\n\n private async _handleRemove(memberId: string, e: Event): Promise<void> {\n e.stopPropagation();\n const participant = this._getParticipant(memberId);\n if (!participant?.remove) return;\n try {\n await participant.remove();\n this.dispatchEvent(\n new CustomEvent('sw-participant-remove', {\n detail: { participant, memberId },\n bubbles: true,\n composed: true,\n })\n );\n } catch {\n // Silently handle error\n }\n this._openMenuId = null;\n }\n\n // ── Render ─────────────────────────────────────────────────────────\n\n private _renderMenuIcon() {\n return html`\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"6\" r=\"2\" />\n <circle cx=\"12\" cy=\"12\" r=\"2\" />\n <circle cx=\"12\" cy=\"18\" r=\"2\" />\n </svg>\n `;\n }\n\n private _renderMenuDropdown(memberId: string) {\n const participant = this._getParticipant(memberId);\n const isOpen = this._openMenuId === memberId;\n\n return html`\n <div\n class=\"menu-dropdown ${isOpen ? 'open' : ''}\"\n role=\"menu\"\n aria-label=\"Participant actions\"\n >\n <button\n class=\"menu-item\"\n role=\"menuitem\"\n @click=${(e: Event) => this._handleMuteAudio(memberId, e)}\n aria-label=\"${participant?.audioMuted ? 'Unmute audio' : 'Mute audio'}\"\n >\n ${participant?.audioMuted ? 'Unmute' : 'Mute'}\n </button>\n <button\n class=\"menu-item\"\n role=\"menuitem\"\n @click=${(e: Event) => this._handleMuteVideo(memberId, e)}\n aria-label=\"${participant?.videoMuted ? 'Enable video' : 'Disable video'}\"\n >\n ${participant?.videoMuted ? 'Enable video' : 'Disable video'}\n </button>\n <button\n class=\"menu-item danger\"\n role=\"menuitem\"\n @click=${(e: Event) => this._handleRemove(memberId, e)}\n aria-label=\"Remove participant\"\n >\n Remove\n </button>\n </div>\n `;\n }\n\n private _renderOverlay(layer: LayoutLayer, isSelf: boolean) {\n const memberId = layer.member_id!;\n const classes = `member-overlay${isSelf ? ' is-self' : ''}`;\n\n const style = `\n position: absolute;\n top: ${layer.y}%;\n left: ${layer.x}%;\n width: ${layer.width}%;\n height: ${layer.height}%;\n opacity: ${layer.visible ? 1 : 0};\n overflow: visible;\n transition: top 0.3s ease, left 0.3s ease, width 0.3s ease, height 0.3s ease, opacity 0.3s ease;\n pointer-events: auto;\n z-index: 10;\n `;\n\n return html`\n <div class=\"${classes}\" part=\"overlay\" style=\"${style}\">\n ${!isSelf\n ? html`\n <button\n class=\"menu-trigger\"\n part=\"menu-trigger\"\n @click=${(e: Event) => this._toggleMenu(memberId, e)}\n aria-label=\"Participant menu\"\n aria-expanded=\"${this._openMenuId === memberId}\"\n aria-haspopup=\"menu\"\n >\n ${this._renderMenuIcon()}\n </button>\n ${this._renderMenuDropdown(memberId)}\n `\n : null}\n <slot name=\"controls-${memberId}\"></slot>\n </div>\n `;\n }\n\n render() {\n const layers = this.call ? this._directLayoutLayers : this._callState?.layoutLayers ?? [];\n const selfId = this.call ? this._directSelf?.id : this._callState?.self?.id;\n\n const overlays = layers\n .filter((layer) => layer.member_id)\n .map((layer) => this._renderOverlay(layer, layer.member_id === selfId));\n\n return html`\n ${overlays}\n <slot></slot>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-participants': SwParticipants;\n }\n}\n"],"names":["SwParticipants","LitElement","target","changed","l","p","s","memberId","e","_a","participant","html","isOpen","layer","isSelf","classes","style","layers","selfId","_b","_d","_c","overlays","css","__decorateClass","consume","callStateContext","state","property","customElement"],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self Media Component
|
|
3
|
+
*
|
|
4
|
+
* Renders local video overlay with positioning from layoutLayers.
|
|
5
|
+
*
|
|
6
|
+
* Input precedence (most specific wins): `.call` > context.
|
|
7
|
+
* `.stream` is not applicable — this component requires `layoutLayers` and
|
|
8
|
+
* `self.id`, which only come from a Call.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```html
|
|
12
|
+
* <!-- Inside a context provider: -->
|
|
13
|
+
* <sw-self-media mirror></sw-self-media>
|
|
14
|
+
*
|
|
15
|
+
* <!-- Standalone with an explicit Call: -->
|
|
16
|
+
* <sw-self-media .call=${call} mirror></sw-self-media>
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* @csspart container - Positioned overlay container matching the layout layer rect.
|
|
20
|
+
* @csspart video - The `<video>` element rendering the local stream.
|
|
21
|
+
*/
|
|
22
|
+
import { LitElement } from 'lit';
|
|
23
|
+
import type { Call } from '../types/index.js';
|
|
24
|
+
export declare class SwSelfMedia extends LitElement {
|
|
25
|
+
static styles: import("lit").CSSResult;
|
|
26
|
+
mirror: boolean;
|
|
27
|
+
/** Explicit Call — when set, subscribes directly and bypasses context. */
|
|
28
|
+
call?: Call;
|
|
29
|
+
private _callState?;
|
|
30
|
+
private _directLocalStream;
|
|
31
|
+
private _directLayoutLayers;
|
|
32
|
+
private _directSelf;
|
|
33
|
+
private _directSubscriptions;
|
|
34
|
+
protected updated(changed: Map<string, unknown>): void;
|
|
35
|
+
disconnectedCallback(): void;
|
|
36
|
+
private _setupDirect;
|
|
37
|
+
private _teardownDirect;
|
|
38
|
+
private _getSelfLayer;
|
|
39
|
+
render(): import("lit-html").TemplateResult<1> | null;
|
|
40
|
+
}
|
|
41
|
+
declare global {
|
|
42
|
+
interface HTMLElementTagNameMap {
|
|
43
|
+
'sw-self-media': SwSelfMedia;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=sw-self-media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-self-media.d.ts","sourceRoot":"","sources":["../../src/components/sw-self-media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAK5C,OAAO,KAAK,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AAG3D,qBACa,WAAY,SAAQ,UAAU;IACzC,MAAM,CAAC,MAAM,0BAYX;IAE0C,MAAM,UAAS;IAE3D,0EAA0E;IAC9C,IAAI,CAAC,EAAE,IAAI,CAAC;IAIxC,OAAO,CAAC,UAAU,CAAC,CAAY;IAEtB,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,mBAAmB,CAAqB;IAChD,OAAO,CAAC,WAAW,CAAoC;IAEhE,OAAO,CAAC,oBAAoB,CAAsB;IAElD,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAQtD,oBAAoB;IAKpB,OAAO,CAAC,YAAY;IAQpB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,aAAa;IAOrB,MAAM;CAyCP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,eAAe,EAAE,WAAW,CAAC;KAC9B;CACF"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { LitElement as h, html as p, css as u } from "lit";
|
|
2
|
+
import { property as d, state as n, customElement as y } from "lit/decorators.js";
|
|
3
|
+
import { consume as _ } from "@lit/context";
|
|
4
|
+
import { callStateContext as f } from "../context/call-state-context.js";
|
|
5
|
+
var b = Object.defineProperty, m = Object.getOwnPropertyDescriptor, a = (t, e, l, r) => {
|
|
6
|
+
for (var s = r > 1 ? void 0 : r ? m(e, l) : e, i = t.length - 1, c; i >= 0; i--)
|
|
7
|
+
(c = t[i]) && (s = (r ? c(e, l, s) : c(s)) || s);
|
|
8
|
+
return r && s && b(e, l, s), s;
|
|
9
|
+
};
|
|
10
|
+
let o = class extends h {
|
|
11
|
+
constructor() {
|
|
12
|
+
super(...arguments), this.mirror = !1, this._directLocalStream = null, this._directLayoutLayers = [], this._directSelf = null, this._directSubscriptions = [];
|
|
13
|
+
}
|
|
14
|
+
updated(t) {
|
|
15
|
+
super.updated(t), t.has("call") && (this._teardownDirect(), this.call && this._setupDirect(this.call));
|
|
16
|
+
}
|
|
17
|
+
disconnectedCallback() {
|
|
18
|
+
super.disconnectedCallback(), this._teardownDirect();
|
|
19
|
+
}
|
|
20
|
+
_setupDirect(t) {
|
|
21
|
+
this._directSubscriptions.push(
|
|
22
|
+
t.localStream$.subscribe((e) => this._directLocalStream = e),
|
|
23
|
+
t.layoutLayers$.subscribe((e) => this._directLayoutLayers = e),
|
|
24
|
+
t.self$.subscribe((e) => this._directSelf = e)
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
_teardownDirect() {
|
|
28
|
+
this._directSubscriptions.forEach((t) => t.unsubscribe()), this._directSubscriptions = [], this._directLocalStream = null, this._directLayoutLayers = [], this._directSelf = null;
|
|
29
|
+
}
|
|
30
|
+
_getSelfLayer() {
|
|
31
|
+
var l, r, s, i;
|
|
32
|
+
const t = this.call ? (l = this._directSelf) == null ? void 0 : l.id : (s = (r = this._callState) == null ? void 0 : r.self) == null ? void 0 : s.id;
|
|
33
|
+
return t ? (this.call ? this._directLayoutLayers : ((i = this._callState) == null ? void 0 : i.layoutLayers) ?? []).find((c) => c.member_id === t) : void 0;
|
|
34
|
+
}
|
|
35
|
+
render() {
|
|
36
|
+
var i;
|
|
37
|
+
const t = this._getSelfLayer();
|
|
38
|
+
if (!t) return null;
|
|
39
|
+
const e = this.call ? this._directLocalStream : ((i = this._callState) == null ? void 0 : i.localStream) ?? null;
|
|
40
|
+
if (!(((e == null ? void 0 : e.getVideoTracks().length) ?? 0) > 0)) return null;
|
|
41
|
+
const r = `
|
|
42
|
+
position: absolute;
|
|
43
|
+
top: ${t.y}%;
|
|
44
|
+
left: ${t.x}%;
|
|
45
|
+
width: ${t.width}%;
|
|
46
|
+
height: ${t.height}%;
|
|
47
|
+
opacity: ${t.visible ? 1 : 0};
|
|
48
|
+
overflow: hidden;
|
|
49
|
+
transition: top 0.3s ease, left 0.3s ease, width 0.3s ease, height 0.3s ease, opacity 0.3s ease;
|
|
50
|
+
pointer-events: none;
|
|
51
|
+
`, s = this.mirror ? "transform: scale(-1, 1); -webkit-transform: scale(-1, 1);" : "";
|
|
52
|
+
return p`
|
|
53
|
+
<div class="local-overlay" part="container" style="${r}">
|
|
54
|
+
<video
|
|
55
|
+
class="local-video"
|
|
56
|
+
part="video"
|
|
57
|
+
style="width: 100%; height: 100%; object-fit: cover; ${s}"
|
|
58
|
+
autoplay
|
|
59
|
+
playsinline
|
|
60
|
+
muted
|
|
61
|
+
disablePictureInPicture
|
|
62
|
+
.srcObject=${e}
|
|
63
|
+
></video>
|
|
64
|
+
</div>
|
|
65
|
+
`;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
o.styles = u`
|
|
69
|
+
:host {
|
|
70
|
+
display: contents;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.local-overlay {
|
|
74
|
+
box-sizing: border-box;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
video {
|
|
78
|
+
display: block;
|
|
79
|
+
}
|
|
80
|
+
`;
|
|
81
|
+
a([
|
|
82
|
+
d({ type: Boolean, reflect: !0 })
|
|
83
|
+
], o.prototype, "mirror", 2);
|
|
84
|
+
a([
|
|
85
|
+
d({ type: Object })
|
|
86
|
+
], o.prototype, "call", 2);
|
|
87
|
+
a([
|
|
88
|
+
_({ context: f, subscribe: !0 }),
|
|
89
|
+
n()
|
|
90
|
+
], o.prototype, "_callState", 2);
|
|
91
|
+
a([
|
|
92
|
+
n()
|
|
93
|
+
], o.prototype, "_directLocalStream", 2);
|
|
94
|
+
a([
|
|
95
|
+
n()
|
|
96
|
+
], o.prototype, "_directLayoutLayers", 2);
|
|
97
|
+
a([
|
|
98
|
+
n()
|
|
99
|
+
], o.prototype, "_directSelf", 2);
|
|
100
|
+
o = a([
|
|
101
|
+
y("sw-self-media")
|
|
102
|
+
], o);
|
|
103
|
+
export {
|
|
104
|
+
o as SwSelfMedia
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=sw-self-media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-self-media.js","sources":["../../src/components/sw-self-media.ts"],"sourcesContent":["/**\n * Self Media Component\n *\n * Renders local video overlay with positioning from layoutLayers.\n *\n * Input precedence (most specific wins): `.call` > context.\n * `.stream` is not applicable — this component requires `layoutLayers` and\n * `self.id`, which only come from a Call.\n *\n * @example\n * ```html\n * <!-- Inside a context provider: -->\n * <sw-self-media mirror></sw-self-media>\n *\n * <!-- Standalone with an explicit Call: -->\n * <sw-self-media .call=${call} mirror></sw-self-media>\n * ```\n *\n * @csspart container - Positioned overlay container matching the layout layer rect.\n * @csspart video - The `<video>` element rendering the local stream.\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 { callStateContext, type CallState } from '../context/call-state-context.js';\nimport type { Call, LayoutLayer } from '../types/index.js';\nimport type { CallSelfParticipant } from '@signalwire/js';\n\n@customElement('sw-self-media')\nexport class SwSelfMedia extends LitElement {\n static styles = css`\n :host {\n display: contents;\n }\n\n .local-overlay {\n box-sizing: border-box;\n }\n\n video {\n display: block;\n }\n `;\n\n @property({ type: Boolean, reflect: true }) mirror = false;\n\n /** Explicit Call — when set, subscribes directly and bypasses context. */\n @property({ type: Object }) call?: Call;\n\n @consume({ context: callStateContext, subscribe: true })\n @state()\n private _callState?: CallState;\n\n @state() private _directLocalStream: MediaStream | null = null;\n @state() private _directLayoutLayers: LayoutLayer[] = [];\n @state() private _directSelf: CallSelfParticipant | null = null;\n\n private _directSubscriptions: Subscription[] = [];\n\n protected updated(changed: Map<string, unknown>): void {\n super.updated(changed);\n if (changed.has('call')) {\n this._teardownDirect();\n if (this.call) this._setupDirect(this.call);\n }\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._teardownDirect();\n }\n\n private _setupDirect(call: Call): void {\n this._directSubscriptions.push(\n call.localStream$.subscribe((s) => (this._directLocalStream = s)),\n call.layoutLayers$.subscribe((l) => (this._directLayoutLayers = l)),\n call.self$.subscribe((s) => (this._directSelf = s))\n );\n }\n\n private _teardownDirect(): void {\n this._directSubscriptions.forEach((s) => s.unsubscribe());\n this._directSubscriptions = [];\n this._directLocalStream = null;\n this._directLayoutLayers = [];\n this._directSelf = null;\n }\n\n private _getSelfLayer(): LayoutLayer | undefined {\n const selfId = this.call ? this._directSelf?.id : this._callState?.self?.id;\n if (!selfId) return undefined;\n const layers = this.call ? this._directLayoutLayers : this._callState?.layoutLayers ?? [];\n return layers.find((layer) => layer.member_id === selfId);\n }\n\n render() {\n const layer = this._getSelfLayer();\n if (!layer) return null;\n\n const localStream = this.call\n ? this._directLocalStream\n : this._callState?.localStream ?? null;\n const hasVideoTracks = (localStream?.getVideoTracks().length ?? 0) > 0;\n if (!hasVideoTracks) return null;\n\n const style = `\n position: absolute;\n top: ${layer.y}%;\n left: ${layer.x}%;\n width: ${layer.width}%;\n height: ${layer.height}%;\n opacity: ${layer.visible ? 1 : 0};\n overflow: hidden;\n transition: top 0.3s ease, left 0.3s ease, width 0.3s ease, height 0.3s ease, opacity 0.3s ease;\n pointer-events: none;\n `;\n\n const videoStyle = this.mirror\n ? 'transform: scale(-1, 1); -webkit-transform: scale(-1, 1);'\n : '';\n\n return html`\n <div class=\"local-overlay\" part=\"container\" style=\"${style}\">\n <video\n class=\"local-video\"\n part=\"video\"\n style=\"width: 100%; height: 100%; object-fit: cover; ${videoStyle}\"\n autoplay\n playsinline\n muted\n disablePictureInPicture\n .srcObject=${localStream}\n ></video>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-self-media': SwSelfMedia;\n }\n}\n"],"names":["SwSelfMedia","LitElement","changed","call","s","l","selfId","_a","_c","_b","_d","layer","localStream","style","videoStyle","html","css","__decorateClass","property","consume","callStateContext","state","customElement"],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Call } from '../types/index.js';
|
|
2
|
+
import type { ContextHost } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* ReactiveController that flattens all Call observables into a plain CallState
|
|
5
|
+
* object provided via Lit context. Consumer components get automatic re-renders
|
|
6
|
+
* on any change.
|
|
7
|
+
*
|
|
8
|
+
* Usage in a provider component:
|
|
9
|
+
*
|
|
10
|
+
* private _callState = new CallStateContextController(this);
|
|
11
|
+
*
|
|
12
|
+
* // When a call arrives:
|
|
13
|
+
* this._callState.connect(call);
|
|
14
|
+
*
|
|
15
|
+
* // When the call ends:
|
|
16
|
+
* this._callState.disconnect();
|
|
17
|
+
*/
|
|
18
|
+
export declare class CallStateContextController {
|
|
19
|
+
private _provider;
|
|
20
|
+
private _subscriptions;
|
|
21
|
+
private _state;
|
|
22
|
+
private _batching;
|
|
23
|
+
constructor(host: ContextHost);
|
|
24
|
+
hostConnected(): void;
|
|
25
|
+
hostDisconnected(): void;
|
|
26
|
+
connect(call: Call): void;
|
|
27
|
+
disconnect(): void;
|
|
28
|
+
private _patch;
|
|
29
|
+
private _publish;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=CallStateContextController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CallStateContextController.d.ts","sourceRoot":"","sources":["../../src/context/CallStateContextController.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAG9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAuC9C;;;;;;;;;;;;;;GAcG;AACH,qBAAa,0BAA0B;IACrC,OAAO,CAAC,SAAS,CAA2C;IAC5D,OAAO,CAAC,cAAc,CAAsB;IAC5C,OAAO,CAAC,MAAM,CAAsC;IACpD,OAAO,CAAC,SAAS,CAAS;gBAEd,IAAI,EAAE,WAAW;IAQ7B,aAAa;IACb,gBAAgB;IAIhB,OAAO,CAAC,IAAI,EAAE,IAAI;IAoFlB,UAAU;IAMV,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,QAAQ;CAGjB"}
|