@signalwire/web-components 1.0.0-dev-20260428141127 → 1.0.0-dev-20260428183200
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 +45 -52
- 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 +57 -0
- package/dist/components/UI/controls/sw-ui-dialpad.d.ts.map +1 -0
- package/dist/components/UI/controls/sw-ui-dialpad.js +319 -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/directory.d.ts +10 -18
- package/dist/components/directory.d.ts.map +1 -1
- package/dist/components/directory.js +129 -198
- package/dist/components/directory.js.map +1 -1
- package/dist/embed/signalwire-web-components-embed.iife.js +2336 -982
- package/dist/embed/signalwire-web-components-embed.iife.js.map +1 -1
- package/dist/embed/signalwire-web-components-embed.umd.cjs +2336 -982
- package/dist/embed/signalwire-web-components-embed.umd.cjs.map +1 -1
- package/dist/embed.d.ts +1 -1
- package/dist/embed.d.ts.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -33
- 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 +3 -3
- 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/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/package.json +53 -9
- 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/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
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { LitElement } from 'lit';
|
|
2
|
+
import type { DropUpItem } from './sw-ui-dropup';
|
|
3
|
+
export interface MicToggleDetail {
|
|
4
|
+
muted: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface CameraToggleDetail {
|
|
7
|
+
muted: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface SpeakerToggleDetail {
|
|
10
|
+
muted: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface DeviceChangeDetail {
|
|
13
|
+
kind: 'mic' | 'camera' | 'speaker';
|
|
14
|
+
deviceId: string;
|
|
15
|
+
label: string;
|
|
16
|
+
}
|
|
17
|
+
export interface FullscreenToggleDetail {
|
|
18
|
+
fullscreen: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface ScreenShareToggleDetail {
|
|
21
|
+
active: boolean;
|
|
22
|
+
}
|
|
23
|
+
export interface HandRaiseToggleDetail {
|
|
24
|
+
raised: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface SettingsChangeDetail {
|
|
27
|
+
settingId: string;
|
|
28
|
+
}
|
|
29
|
+
export interface SwUiControlBarEventMap {
|
|
30
|
+
'sw-mic-toggle': CustomEvent<MicToggleDetail>;
|
|
31
|
+
'sw-camera-toggle': CustomEvent<CameraToggleDetail>;
|
|
32
|
+
'sw-speaker-toggle': CustomEvent<SpeakerToggleDetail>;
|
|
33
|
+
'sw-device-change': CustomEvent<DeviceChangeDetail>;
|
|
34
|
+
'sw-fullscreen-toggle': CustomEvent<FullscreenToggleDetail>;
|
|
35
|
+
'sw-screen-share-toggle': CustomEvent<ScreenShareToggleDetail>;
|
|
36
|
+
'sw-hand-raise-toggle': CustomEvent<HandRaiseToggleDetail>;
|
|
37
|
+
'sw-transcript-toggle': CustomEvent<void>;
|
|
38
|
+
'sw-settings-change': CustomEvent<SettingsChangeDetail>;
|
|
39
|
+
'sw-call-hangup': CustomEvent<void>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Call controls bar.
|
|
43
|
+
*
|
|
44
|
+
* Buttons rendered (left to right): mic, camera, speaker, screen share,
|
|
45
|
+
* hand raise, transcript, fullscreen, hang-up. Optional buttons are hidden
|
|
46
|
+
* when their `show*` property is false.
|
|
47
|
+
*
|
|
48
|
+
* @fires sw-mic-toggle - Mic toggled. Detail: `{ muted: boolean }`.
|
|
49
|
+
* @fires sw-camera-toggle - Camera toggled. Detail: `{ muted: boolean }`.
|
|
50
|
+
* @fires sw-speaker-toggle - Speaker toggled. Detail: `{ muted: boolean }`.
|
|
51
|
+
* @fires sw-device-change - Device picked from a chevron menu. Detail: `{ kind, deviceId, label }`.
|
|
52
|
+
* @fires sw-fullscreen-toggle - Fullscreen toggled. Detail: `{ fullscreen: boolean }`.
|
|
53
|
+
* @fires sw-screen-share-toggle - Screen share toggled. Detail: `{ active: boolean }`.
|
|
54
|
+
* @fires sw-hand-raise-toggle - Hand raise toggled. Detail: `{ raised: boolean }`.
|
|
55
|
+
* @fires sw-transcript-toggle - Transcript button clicked. No detail.
|
|
56
|
+
* @fires sw-settings-change - Settings menu item picked. Detail: `{ settingId: string }`.
|
|
57
|
+
* @fires sw-call-hangup - Hang-up button clicked. No detail.
|
|
58
|
+
*
|
|
59
|
+
* @cssprop --sw-control-bar-bg [transparent] - bar background
|
|
60
|
+
* @cssprop --sw-control-bar-padding [8px 16px] - bar padding
|
|
61
|
+
* @cssprop --sw-control-bar-gap [8px] - gap between buttons
|
|
62
|
+
* @cssprop --sw-control-bar-radius [0] - bar border-radius
|
|
63
|
+
*
|
|
64
|
+
* @cssprop --sw-split-button-size [44px] - button width & height
|
|
65
|
+
* @cssprop --sw-split-button-bg [rgba(255,255,255,0.12)] - button background
|
|
66
|
+
* @cssprop --sw-split-button-bg-hover [rgba(255,255,255,0.22)] - button hover bg
|
|
67
|
+
* @cssprop --sw-split-button-color [#fff] - icon colour
|
|
68
|
+
* @cssprop --sw-split-button-radius [9999px] - button border-radius
|
|
69
|
+
*
|
|
70
|
+
* @cssprop --sw-control-bar-hangup-bg - hang-up background (falls back to --interactive-button-destructive-bg)
|
|
71
|
+
* @cssprop --sw-control-bar-hangup-bg-hover - hang-up hover bg (falls back to --interactive-button-destructive-hover)
|
|
72
|
+
* @cssprop --sw-control-bar-hangup-color - hang-up icon colour (defaults to #fff)
|
|
73
|
+
*
|
|
74
|
+
* The active-toggle variant uses --interactive-button-primary-{bg,hover,text} from the design tokens.
|
|
75
|
+
*/
|
|
76
|
+
export declare class SwUiControlBar extends LitElement {
|
|
77
|
+
static styles: import("lit").CSSResult;
|
|
78
|
+
micMuted: boolean;
|
|
79
|
+
cameraMuted: boolean;
|
|
80
|
+
speakerMuted: boolean;
|
|
81
|
+
fullscreen: boolean;
|
|
82
|
+
screenSharing: boolean;
|
|
83
|
+
handRaised: boolean;
|
|
84
|
+
transcriptActive: boolean;
|
|
85
|
+
showScreenShare: boolean;
|
|
86
|
+
showHandRaise: boolean;
|
|
87
|
+
showTranscript: boolean;
|
|
88
|
+
showSettings: boolean;
|
|
89
|
+
showFullscreen: boolean;
|
|
90
|
+
micDevices: DropUpItem[];
|
|
91
|
+
cameraDevices: DropUpItem[];
|
|
92
|
+
speakerDevices: DropUpItem[];
|
|
93
|
+
settingsItems: DropUpItem[];
|
|
94
|
+
private _dispatch;
|
|
95
|
+
private _onMicToggle;
|
|
96
|
+
private _onCameraToggle;
|
|
97
|
+
private _onSpeakerToggle;
|
|
98
|
+
private _onDeviceSelect;
|
|
99
|
+
private _onFullscreenToggle;
|
|
100
|
+
private _onScreenShareToggle;
|
|
101
|
+
private _onHandRaiseToggle;
|
|
102
|
+
private _onTranscriptToggle;
|
|
103
|
+
private _onSettingsSelect;
|
|
104
|
+
private _onHangUp;
|
|
105
|
+
private _overflowItems;
|
|
106
|
+
private _onOverflowSelect;
|
|
107
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
108
|
+
}
|
|
109
|
+
declare global {
|
|
110
|
+
interface HTMLElementTagNameMap {
|
|
111
|
+
'sw-ui-control-bar': SwUiControlBar;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=sw-ui-control-bar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-ui-control-bar.d.ts","sourceRoot":"","sources":["../../../../src/components/UI/controls/sw-ui-control-bar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAErD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAIjD,MAAM,WAAW,eAAe;IAAG,KAAK,EAAE,OAAO,CAAA;CAAE;AACnD,MAAM,WAAW,kBAAkB;IAAG,KAAK,EAAE,OAAO,CAAA;CAAE;AACtD,MAAM,WAAW,mBAAmB;IAAG,KAAK,EAAE,OAAO,CAAA;CAAE;AACvD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,sBAAsB;IAAG,UAAU,EAAE,OAAO,CAAA;CAAE;AAC/D,MAAM,WAAW,uBAAuB;IAAG,MAAM,EAAE,OAAO,CAAA;CAAE;AAC5D,MAAM,WAAW,qBAAqB;IAAG,MAAM,EAAE,OAAO,CAAA;CAAE;AAC1D,MAAM,WAAW,oBAAoB;IAAG,SAAS,EAAE,MAAM,CAAA;CAAE;AAI3D,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,WAAW,CAAC,eAAe,CAAC,CAAC;IAC9C,kBAAkB,EAAE,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACpD,mBAAmB,EAAE,WAAW,CAAC,mBAAmB,CAAC,CAAC;IACtD,kBAAkB,EAAE,WAAW,CAAC,kBAAkB,CAAC,CAAC;IACpD,sBAAsB,EAAE,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAC5D,wBAAwB,EAAE,WAAW,CAAC,uBAAuB,CAAC,CAAC;IAC/D,sBAAsB,EAAE,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAC3D,sBAAsB,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1C,oBAAoB,EAAE,WAAW,CAAC,oBAAoB,CAAC,CAAC;IACxD,gBAAgB,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC;CACrC;AAID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,qBACa,cAAe,SAAQ,UAAU;IAC5C,MAAM,CAAC,MAAM,0BA2EX;IAKF,QAAQ,UAAS;IAGjB,WAAW,UAAS;IAGpB,YAAY,UAAS;IAGrB,UAAU,UAAS;IAGnB,aAAa,UAAS;IAGtB,UAAU,UAAS;IAGnB,gBAAgB,UAAS;IAKzB,eAAe,UAAS;IAGxB,aAAa,UAAS;IAGtB,cAAc,UAAS;IAGvB,YAAY,UAAS;IAGrB,cAAc,UAAQ;IAKtB,UAAU,EAAE,UAAU,EAAE,CAAM;IAG9B,aAAa,EAAE,UAAU,EAAE,CAAM;IAGjC,cAAc,EAAE,UAAU,EAAE,CAAM;IAGlC,aAAa,EAAE,UAAU,EAAE,CAAM;IAIjC,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,cAAc;IAoCtB,OAAO,CAAC,iBAAiB;IAqBzB,MAAM;CAsHP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,mBAAmB,EAAE,cAAc,CAAC;KACrC;CACF"}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { LitElement as h, nothing as r, html as a, css as w } from "lit";
|
|
2
|
+
import { property as i, customElement as d } from "lit/decorators.js";
|
|
3
|
+
var g = Object.defineProperty, b = Object.getOwnPropertyDescriptor, s = (t, n, c, l) => {
|
|
4
|
+
for (var o = l > 1 ? void 0 : l ? b(n, c) : n, p = t.length - 1, u; p >= 0; p--)
|
|
5
|
+
(u = t[p]) && (o = (l ? u(n, c, o) : u(o)) || o);
|
|
6
|
+
return l && o && g(n, c, o), o;
|
|
7
|
+
};
|
|
8
|
+
let e = class extends h {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(...arguments), this.micMuted = !1, this.cameraMuted = !1, this.speakerMuted = !1, this.fullscreen = !1, this.screenSharing = !1, this.handRaised = !1, this.transcriptActive = !1, this.showScreenShare = !1, this.showHandRaise = !1, this.showTranscript = !1, this.showSettings = !1, this.showFullscreen = !0, this.micDevices = [], this.cameraDevices = [], this.speakerDevices = [], this.settingsItems = [];
|
|
11
|
+
}
|
|
12
|
+
// ── Dispatchers ───────────────────────────────────────────────────────────
|
|
13
|
+
_dispatch(t, n) {
|
|
14
|
+
this.dispatchEvent(new CustomEvent(t, { detail: n, bubbles: !0, composed: !0 }));
|
|
15
|
+
}
|
|
16
|
+
_onMicToggle() {
|
|
17
|
+
this.micMuted = !this.micMuted, this._dispatch("sw-mic-toggle", { muted: this.micMuted });
|
|
18
|
+
}
|
|
19
|
+
_onCameraToggle() {
|
|
20
|
+
this.cameraMuted = !this.cameraMuted, this._dispatch("sw-camera-toggle", { muted: this.cameraMuted });
|
|
21
|
+
}
|
|
22
|
+
_onSpeakerToggle() {
|
|
23
|
+
this.speakerMuted = !this.speakerMuted, this._dispatch("sw-speaker-toggle", { muted: this.speakerMuted });
|
|
24
|
+
}
|
|
25
|
+
_onDeviceSelect(t, n) {
|
|
26
|
+
this._dispatch("sw-device-change", { kind: t, deviceId: n.id, label: n.label });
|
|
27
|
+
}
|
|
28
|
+
_onFullscreenToggle() {
|
|
29
|
+
this.fullscreen = !this.fullscreen, this._dispatch("sw-fullscreen-toggle", { fullscreen: this.fullscreen });
|
|
30
|
+
}
|
|
31
|
+
_onScreenShareToggle() {
|
|
32
|
+
this.screenSharing = !this.screenSharing, this._dispatch("sw-screen-share-toggle", { active: this.screenSharing });
|
|
33
|
+
}
|
|
34
|
+
_onHandRaiseToggle() {
|
|
35
|
+
this.handRaised = !this.handRaised, this._dispatch("sw-hand-raise-toggle", { raised: this.handRaised });
|
|
36
|
+
}
|
|
37
|
+
_onTranscriptToggle() {
|
|
38
|
+
this.transcriptActive = !this.transcriptActive, this._dispatch("sw-transcript-toggle", void 0);
|
|
39
|
+
}
|
|
40
|
+
_onSettingsSelect(t) {
|
|
41
|
+
this._dispatch("sw-settings-change", { settingId: t.detail.id });
|
|
42
|
+
}
|
|
43
|
+
_onHangUp() {
|
|
44
|
+
this._dispatch("sw-call-hangup", void 0);
|
|
45
|
+
}
|
|
46
|
+
_overflowItems() {
|
|
47
|
+
const t = [];
|
|
48
|
+
return this.showScreenShare && t.push({
|
|
49
|
+
id: "__overflow:screen-share",
|
|
50
|
+
label: this.screenSharing ? "Stop sharing" : "Share screen",
|
|
51
|
+
selected: this.screenSharing
|
|
52
|
+
}), this.showHandRaise && t.push({
|
|
53
|
+
id: "__overflow:hand-raise",
|
|
54
|
+
label: this.handRaised ? "Lower hand" : "Raise hand",
|
|
55
|
+
selected: this.handRaised
|
|
56
|
+
}), this.showTranscript && t.push({
|
|
57
|
+
id: "__overflow:transcript",
|
|
58
|
+
label: "Transcript",
|
|
59
|
+
selected: this.transcriptActive
|
|
60
|
+
}), this.showSettings && t.push(...this.settingsItems), this.showFullscreen && t.push({
|
|
61
|
+
id: "__overflow:fullscreen",
|
|
62
|
+
label: this.fullscreen ? "Exit fullscreen" : "Fullscreen",
|
|
63
|
+
selected: this.fullscreen
|
|
64
|
+
}), t;
|
|
65
|
+
}
|
|
66
|
+
_onOverflowSelect(t) {
|
|
67
|
+
switch (t.detail.id) {
|
|
68
|
+
case "__overflow:screen-share":
|
|
69
|
+
this._onScreenShareToggle();
|
|
70
|
+
return;
|
|
71
|
+
case "__overflow:hand-raise":
|
|
72
|
+
this._onHandRaiseToggle();
|
|
73
|
+
return;
|
|
74
|
+
case "__overflow:transcript":
|
|
75
|
+
this._onTranscriptToggle();
|
|
76
|
+
return;
|
|
77
|
+
case "__overflow:fullscreen":
|
|
78
|
+
this._onFullscreenToggle();
|
|
79
|
+
return;
|
|
80
|
+
default:
|
|
81
|
+
this._dispatch("sw-settings-change", { settingId: t.detail.id });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// ── Render ────────────────────────────────────────────────────────────────
|
|
85
|
+
render() {
|
|
86
|
+
return a`
|
|
87
|
+
<div class="bar" part="bar">
|
|
88
|
+
<!-- SignalWire logo -->
|
|
89
|
+
<span class="sw-logo" part="logo" aria-hidden="true">
|
|
90
|
+
<sw-ui-icon name="sw-logo" size="20"></sw-ui-icon>
|
|
91
|
+
</span>
|
|
92
|
+
|
|
93
|
+
<!-- Mic -->
|
|
94
|
+
<sw-ui-split-button
|
|
95
|
+
.active=${!this.micMuted}
|
|
96
|
+
.items=${this.micDevices}
|
|
97
|
+
@sw-split-button-toggle=${this._onMicToggle}
|
|
98
|
+
@sw-dropup-select=${(t) => this._onDeviceSelect("mic", t.detail)}
|
|
99
|
+
>
|
|
100
|
+
<sw-ui-icon slot="active" name="mic-on"></sw-ui-icon>
|
|
101
|
+
<sw-ui-icon slot="inactive" name="mic-off"></sw-ui-icon>
|
|
102
|
+
</sw-ui-split-button>
|
|
103
|
+
|
|
104
|
+
<!-- Camera -->
|
|
105
|
+
<sw-ui-split-button
|
|
106
|
+
.active=${!this.cameraMuted}
|
|
107
|
+
.items=${this.cameraDevices}
|
|
108
|
+
@sw-split-button-toggle=${this._onCameraToggle}
|
|
109
|
+
@sw-dropup-select=${(t) => this._onDeviceSelect("camera", t.detail)}
|
|
110
|
+
>
|
|
111
|
+
<sw-ui-icon slot="active" name="camera-on"></sw-ui-icon>
|
|
112
|
+
<sw-ui-icon slot="inactive" name="camera-off"></sw-ui-icon>
|
|
113
|
+
</sw-ui-split-button>
|
|
114
|
+
|
|
115
|
+
<!-- Speaker -->
|
|
116
|
+
<sw-ui-split-button
|
|
117
|
+
.active=${!this.speakerMuted}
|
|
118
|
+
.items=${this.speakerDevices}
|
|
119
|
+
@sw-split-button-toggle=${this._onSpeakerToggle}
|
|
120
|
+
@sw-dropup-select=${(t) => this._onDeviceSelect("speaker", t.detail)}
|
|
121
|
+
>
|
|
122
|
+
<sw-ui-icon slot="active" name="speaker-on"></sw-ui-icon>
|
|
123
|
+
<sw-ui-icon slot="inactive" name="speaker-off"></sw-ui-icon>
|
|
124
|
+
</sw-ui-split-button>
|
|
125
|
+
|
|
126
|
+
<!-- Screen share (optional) -->
|
|
127
|
+
${this.showScreenShare ? a`
|
|
128
|
+
<sw-ui-split-button
|
|
129
|
+
class="optional ${this.screenSharing ? "active-toggle" : ""}"
|
|
130
|
+
@sw-split-button-click=${this._onScreenShareToggle}
|
|
131
|
+
>
|
|
132
|
+
<sw-ui-icon name=${this.screenSharing ? "screen-share-off" : "screen-share"}></sw-ui-icon>
|
|
133
|
+
</sw-ui-split-button>
|
|
134
|
+
` : r}
|
|
135
|
+
|
|
136
|
+
<!-- Hand raise (optional) -->
|
|
137
|
+
${this.showHandRaise ? a`
|
|
138
|
+
<sw-ui-split-button
|
|
139
|
+
class="optional ${this.handRaised ? "active-toggle" : ""}"
|
|
140
|
+
@sw-split-button-click=${this._onHandRaiseToggle}
|
|
141
|
+
>
|
|
142
|
+
<sw-ui-icon name="hand-raise"></sw-ui-icon>
|
|
143
|
+
</sw-ui-split-button>
|
|
144
|
+
` : r}
|
|
145
|
+
|
|
146
|
+
<!-- Transcript (optional) -->
|
|
147
|
+
${this.showTranscript ? a`
|
|
148
|
+
<sw-ui-split-button
|
|
149
|
+
class="optional ${this.transcriptActive ? "active-toggle" : ""}"
|
|
150
|
+
@sw-split-button-click=${this._onTranscriptToggle}
|
|
151
|
+
>
|
|
152
|
+
<sw-ui-icon name="transcript"></sw-ui-icon>
|
|
153
|
+
</sw-ui-split-button>
|
|
154
|
+
` : r}
|
|
155
|
+
|
|
156
|
+
<!-- Settings (optional) -->
|
|
157
|
+
${this.showSettings ? a`
|
|
158
|
+
<sw-ui-split-button
|
|
159
|
+
class="optional"
|
|
160
|
+
.items=${this.settingsItems}
|
|
161
|
+
@sw-dropup-select=${this._onSettingsSelect}
|
|
162
|
+
>
|
|
163
|
+
<sw-ui-icon name="settings"></sw-ui-icon>
|
|
164
|
+
</sw-ui-split-button>
|
|
165
|
+
` : r}
|
|
166
|
+
|
|
167
|
+
<!-- Fullscreen (optional) -->
|
|
168
|
+
${this.showFullscreen ? a`
|
|
169
|
+
<sw-ui-split-button class="optional" @sw-split-button-click=${this._onFullscreenToggle}>
|
|
170
|
+
<sw-ui-icon name=${this.fullscreen ? "fullscreen-exit" : "fullscreen"}></sw-ui-icon>
|
|
171
|
+
</sw-ui-split-button>
|
|
172
|
+
` : r}
|
|
173
|
+
|
|
174
|
+
<!-- Overflow menu (shown on narrow containers) -->
|
|
175
|
+
<sw-ui-split-button
|
|
176
|
+
class="overflow"
|
|
177
|
+
.items=${this._overflowItems()}
|
|
178
|
+
@sw-dropup-select=${this._onOverflowSelect}
|
|
179
|
+
>
|
|
180
|
+
<sw-ui-icon name="settings"></sw-ui-icon>
|
|
181
|
+
</sw-ui-split-button>
|
|
182
|
+
|
|
183
|
+
<!-- Hang up -->
|
|
184
|
+
<sw-ui-split-button class="hangup" @sw-split-button-click=${this._onHangUp}>
|
|
185
|
+
<sw-ui-icon name="phone-end"></sw-ui-icon>
|
|
186
|
+
</sw-ui-split-button>
|
|
187
|
+
|
|
188
|
+
<!-- Spacer to balance the logo and keep buttons centered -->
|
|
189
|
+
<span class="bar-spacer" aria-hidden="true"></span>
|
|
190
|
+
</div>
|
|
191
|
+
`;
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
e.styles = w`
|
|
195
|
+
:host {
|
|
196
|
+
display: block;
|
|
197
|
+
background: var(--sw-control-bar-bg, transparent);
|
|
198
|
+
border-radius: var(--sw-control-bar-radius, 0);
|
|
199
|
+
container-type: inline-size;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
.bar {
|
|
203
|
+
display: flex;
|
|
204
|
+
align-items: center;
|
|
205
|
+
justify-content: center;
|
|
206
|
+
gap: var(--sw-control-bar-gap, 8px);
|
|
207
|
+
padding: var(--sw-control-bar-padding, 8px 16px);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.sw-logo {
|
|
211
|
+
display: inline-flex;
|
|
212
|
+
align-items: center;
|
|
213
|
+
color: var(--fg-default);
|
|
214
|
+
opacity: 0.5;
|
|
215
|
+
flex-shrink: 0;
|
|
216
|
+
pointer-events: none;
|
|
217
|
+
margin-right: auto;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.bar-spacer {
|
|
221
|
+
margin-left: auto;
|
|
222
|
+
width: 20px;
|
|
223
|
+
flex-shrink: 0;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.hangup {
|
|
227
|
+
--sw-split-button-bg: var(--sw-control-bar-hangup-bg, var(--interactive-button-destructive-bg));
|
|
228
|
+
--sw-split-button-bg-hover: var(--sw-control-bar-hangup-bg-hover, var(--interactive-button-destructive-hover));
|
|
229
|
+
--sw-split-button-color: var(--sw-control-bar-hangup-color, #fff);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.active-toggle {
|
|
233
|
+
--sw-split-button-bg: var(--interactive-button-primary-bg);
|
|
234
|
+
--sw-split-button-bg-hover: var(--interactive-button-primary-hover);
|
|
235
|
+
--sw-split-button-color: var(--interactive-button-primary-text);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/* Overflow menu hidden by default (wide containers) */
|
|
239
|
+
sw-ui-split-button.overflow { display: none; }
|
|
240
|
+
|
|
241
|
+
/* Collapse optional/secondary buttons into an overflow menu on narrow containers */
|
|
242
|
+
@container (max-width: 720px) {
|
|
243
|
+
sw-ui-split-button.optional { display: none !important; }
|
|
244
|
+
sw-ui-split-button.overflow { display: inline-flex; }
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/* Shrink buttons on very narrow containers */
|
|
248
|
+
@container (max-width: 540px) {
|
|
249
|
+
.bar {
|
|
250
|
+
--sw-split-button-size: 34px;
|
|
251
|
+
--sw-split-button-width: 42px;
|
|
252
|
+
--sw-split-button-height: 28px;
|
|
253
|
+
gap: 4px;
|
|
254
|
+
padding: 4px 8px;
|
|
255
|
+
}
|
|
256
|
+
.sw-logo, .bar-spacer { display: none; }
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/* Further shrink for very small phones to prevent clipping */
|
|
260
|
+
@container (max-width: 360px) {
|
|
261
|
+
.bar {
|
|
262
|
+
--sw-split-button-size: 28px;
|
|
263
|
+
--sw-split-button-width: 34px;
|
|
264
|
+
--sw-split-button-height: 24px;
|
|
265
|
+
gap: 2px;
|
|
266
|
+
padding: 2px 4px;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
`;
|
|
270
|
+
s([
|
|
271
|
+
i({ type: Boolean, reflect: !0, attribute: "mic-muted" })
|
|
272
|
+
], e.prototype, "micMuted", 2);
|
|
273
|
+
s([
|
|
274
|
+
i({ type: Boolean, reflect: !0, attribute: "camera-muted" })
|
|
275
|
+
], e.prototype, "cameraMuted", 2);
|
|
276
|
+
s([
|
|
277
|
+
i({ type: Boolean, reflect: !0, attribute: "speaker-muted" })
|
|
278
|
+
], e.prototype, "speakerMuted", 2);
|
|
279
|
+
s([
|
|
280
|
+
i({ type: Boolean, reflect: !0 })
|
|
281
|
+
], e.prototype, "fullscreen", 2);
|
|
282
|
+
s([
|
|
283
|
+
i({ type: Boolean, reflect: !0, attribute: "screen-sharing" })
|
|
284
|
+
], e.prototype, "screenSharing", 2);
|
|
285
|
+
s([
|
|
286
|
+
i({ type: Boolean, reflect: !0, attribute: "hand-raised" })
|
|
287
|
+
], e.prototype, "handRaised", 2);
|
|
288
|
+
s([
|
|
289
|
+
i({ type: Boolean, reflect: !0, attribute: "transcript-active" })
|
|
290
|
+
], e.prototype, "transcriptActive", 2);
|
|
291
|
+
s([
|
|
292
|
+
i({ type: Boolean, reflect: !0, attribute: "show-screen-share" })
|
|
293
|
+
], e.prototype, "showScreenShare", 2);
|
|
294
|
+
s([
|
|
295
|
+
i({ type: Boolean, reflect: !0, attribute: "show-hand-raise" })
|
|
296
|
+
], e.prototype, "showHandRaise", 2);
|
|
297
|
+
s([
|
|
298
|
+
i({ type: Boolean, reflect: !0, attribute: "show-transcript" })
|
|
299
|
+
], e.prototype, "showTranscript", 2);
|
|
300
|
+
s([
|
|
301
|
+
i({ type: Boolean, reflect: !0, attribute: "show-settings" })
|
|
302
|
+
], e.prototype, "showSettings", 2);
|
|
303
|
+
s([
|
|
304
|
+
i({ type: Boolean, reflect: !0, attribute: "show-fullscreen" })
|
|
305
|
+
], e.prototype, "showFullscreen", 2);
|
|
306
|
+
s([
|
|
307
|
+
i({ attribute: !1 })
|
|
308
|
+
], e.prototype, "micDevices", 2);
|
|
309
|
+
s([
|
|
310
|
+
i({ attribute: !1 })
|
|
311
|
+
], e.prototype, "cameraDevices", 2);
|
|
312
|
+
s([
|
|
313
|
+
i({ attribute: !1 })
|
|
314
|
+
], e.prototype, "speakerDevices", 2);
|
|
315
|
+
s([
|
|
316
|
+
i({ attribute: !1 })
|
|
317
|
+
], e.prototype, "settingsItems", 2);
|
|
318
|
+
e = s([
|
|
319
|
+
d("sw-ui-control-bar")
|
|
320
|
+
], e);
|
|
321
|
+
export {
|
|
322
|
+
e as SwUiControlBar
|
|
323
|
+
};
|
|
324
|
+
//# sourceMappingURL=sw-ui-control-bar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-ui-control-bar.js","sources":["../../../../src/components/UI/controls/sw-ui-control-bar.ts"],"sourcesContent":["import { LitElement, html, css, nothing } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { DropUpItem } from './sw-ui-dropup';\n\n// ── Event detail types ────────────────────────────────────────────────────────\n\nexport interface MicToggleDetail { muted: boolean }\nexport interface CameraToggleDetail { muted: boolean }\nexport interface SpeakerToggleDetail { muted: boolean }\nexport interface DeviceChangeDetail {\n kind: 'mic' | 'camera' | 'speaker';\n deviceId: string;\n label: string;\n}\nexport interface FullscreenToggleDetail { fullscreen: boolean }\nexport interface ScreenShareToggleDetail { active: boolean }\nexport interface HandRaiseToggleDetail { raised: boolean }\nexport interface SettingsChangeDetail { settingId: string }\n\n// ── Event map ─────────────────────────────────────────────────────────────────\n\nexport interface SwUiControlBarEventMap {\n 'sw-mic-toggle': CustomEvent<MicToggleDetail>;\n 'sw-camera-toggle': CustomEvent<CameraToggleDetail>;\n 'sw-speaker-toggle': CustomEvent<SpeakerToggleDetail>;\n 'sw-device-change': CustomEvent<DeviceChangeDetail>;\n 'sw-fullscreen-toggle': CustomEvent<FullscreenToggleDetail>;\n 'sw-screen-share-toggle': CustomEvent<ScreenShareToggleDetail>;\n 'sw-hand-raise-toggle': CustomEvent<HandRaiseToggleDetail>;\n 'sw-transcript-toggle': CustomEvent<void>;\n 'sw-settings-change': CustomEvent<SettingsChangeDetail>;\n 'sw-call-hangup': CustomEvent<void>;\n}\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\n/**\n * Call controls bar.\n *\n * Buttons rendered (left to right): mic, camera, speaker, screen share,\n * hand raise, transcript, fullscreen, hang-up. Optional buttons are hidden\n * when their `show*` property is false.\n *\n * @fires sw-mic-toggle - Mic toggled. Detail: `{ muted: boolean }`.\n * @fires sw-camera-toggle - Camera toggled. Detail: `{ muted: boolean }`.\n * @fires sw-speaker-toggle - Speaker toggled. Detail: `{ muted: boolean }`.\n * @fires sw-device-change - Device picked from a chevron menu. Detail: `{ kind, deviceId, label }`.\n * @fires sw-fullscreen-toggle - Fullscreen toggled. Detail: `{ fullscreen: boolean }`.\n * @fires sw-screen-share-toggle - Screen share toggled. Detail: `{ active: boolean }`.\n * @fires sw-hand-raise-toggle - Hand raise toggled. Detail: `{ raised: boolean }`.\n * @fires sw-transcript-toggle - Transcript button clicked. No detail.\n * @fires sw-settings-change - Settings menu item picked. Detail: `{ settingId: string }`.\n * @fires sw-call-hangup - Hang-up button clicked. No detail.\n *\n * @cssprop --sw-control-bar-bg [transparent] - bar background\n * @cssprop --sw-control-bar-padding [8px 16px] - bar padding\n * @cssprop --sw-control-bar-gap [8px] - gap between buttons\n * @cssprop --sw-control-bar-radius [0] - bar border-radius\n *\n * @cssprop --sw-split-button-size [44px] - button width & height\n * @cssprop --sw-split-button-bg [rgba(255,255,255,0.12)] - button background\n * @cssprop --sw-split-button-bg-hover [rgba(255,255,255,0.22)] - button hover bg\n * @cssprop --sw-split-button-color [#fff] - icon colour\n * @cssprop --sw-split-button-radius [9999px] - button border-radius\n *\n * @cssprop --sw-control-bar-hangup-bg - hang-up background (falls back to --interactive-button-destructive-bg)\n * @cssprop --sw-control-bar-hangup-bg-hover - hang-up hover bg (falls back to --interactive-button-destructive-hover)\n * @cssprop --sw-control-bar-hangup-color - hang-up icon colour (defaults to #fff)\n *\n * The active-toggle variant uses --interactive-button-primary-{bg,hover,text} from the design tokens.\n */\n@customElement('sw-ui-control-bar')\nexport class SwUiControlBar extends LitElement {\n static styles = css`\n :host {\n display: block;\n background: var(--sw-control-bar-bg, transparent);\n border-radius: var(--sw-control-bar-radius, 0);\n container-type: inline-size;\n }\n\n .bar {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--sw-control-bar-gap, 8px);\n padding: var(--sw-control-bar-padding, 8px 16px);\n }\n\n .sw-logo {\n display: inline-flex;\n align-items: center;\n color: var(--fg-default);\n opacity: 0.5;\n flex-shrink: 0;\n pointer-events: none;\n margin-right: auto;\n }\n\n .bar-spacer {\n margin-left: auto;\n width: 20px;\n flex-shrink: 0;\n }\n\n .hangup {\n --sw-split-button-bg: var(--sw-control-bar-hangup-bg, var(--interactive-button-destructive-bg));\n --sw-split-button-bg-hover: var(--sw-control-bar-hangup-bg-hover, var(--interactive-button-destructive-hover));\n --sw-split-button-color: var(--sw-control-bar-hangup-color, #fff);\n }\n\n .active-toggle {\n --sw-split-button-bg: var(--interactive-button-primary-bg);\n --sw-split-button-bg-hover: var(--interactive-button-primary-hover);\n --sw-split-button-color: var(--interactive-button-primary-text);\n }\n\n /* Overflow menu hidden by default (wide containers) */\n sw-ui-split-button.overflow { display: none; }\n\n /* Collapse optional/secondary buttons into an overflow menu on narrow containers */\n @container (max-width: 720px) {\n sw-ui-split-button.optional { display: none !important; }\n sw-ui-split-button.overflow { display: inline-flex; }\n }\n\n /* Shrink buttons on very narrow containers */\n @container (max-width: 540px) {\n .bar {\n --sw-split-button-size: 34px;\n --sw-split-button-width: 42px;\n --sw-split-button-height: 28px;\n gap: 4px;\n padding: 4px 8px;\n }\n .sw-logo, .bar-spacer { display: none; }\n }\n\n /* Further shrink for very small phones to prevent clipping */\n @container (max-width: 360px) {\n .bar {\n --sw-split-button-size: 28px;\n --sw-split-button-width: 34px;\n --sw-split-button-height: 24px;\n gap: 2px;\n padding: 2px 4px;\n }\n }\n `;\n\n // ── Media toggle state ─────────────────────────────────────────────\n\n @property({ type: Boolean, reflect: true, attribute: 'mic-muted' })\n micMuted = false;\n\n @property({ type: Boolean, reflect: true, attribute: 'camera-muted' })\n cameraMuted = false;\n\n @property({ type: Boolean, reflect: true, attribute: 'speaker-muted' })\n speakerMuted = false;\n\n @property({ type: Boolean, reflect: true })\n fullscreen = false;\n\n @property({ type: Boolean, reflect: true, attribute: 'screen-sharing' })\n screenSharing = false;\n\n @property({ type: Boolean, reflect: true, attribute: 'hand-raised' })\n handRaised = false;\n\n @property({ type: Boolean, reflect: true, attribute: 'transcript-active' })\n transcriptActive = false;\n\n // ── Visibility flags ───────────────────────────────────────────────\n\n @property({ type: Boolean, reflect: true, attribute: 'show-screen-share' })\n showScreenShare = false;\n\n @property({ type: Boolean, reflect: true, attribute: 'show-hand-raise' })\n showHandRaise = false;\n\n @property({ type: Boolean, reflect: true, attribute: 'show-transcript' })\n showTranscript = false;\n\n @property({ type: Boolean, reflect: true, attribute: 'show-settings' })\n showSettings = false;\n\n @property({ type: Boolean, reflect: true, attribute: 'show-fullscreen' })\n showFullscreen = true;\n\n // ── Device lists ───────────────────────────────────────────────────\n\n @property({ attribute: false })\n micDevices: DropUpItem[] = [];\n\n @property({ attribute: false })\n cameraDevices: DropUpItem[] = [];\n\n @property({ attribute: false })\n speakerDevices: DropUpItem[] = [];\n\n @property({ attribute: false })\n settingsItems: DropUpItem[] = [];\n\n // ── Dispatchers ───────────────────────────────────────────────────────────\n\n private _dispatch<K extends keyof SwUiControlBarEventMap>(\n type: K,\n detail: SwUiControlBarEventMap[K] extends CustomEvent<infer D> ? D : never\n ) {\n this.dispatchEvent(new CustomEvent(type, { detail, bubbles: true, composed: true }));\n }\n\n private _onMicToggle() {\n this.micMuted = !this.micMuted;\n this._dispatch('sw-mic-toggle', { muted: this.micMuted });\n }\n\n private _onCameraToggle() {\n this.cameraMuted = !this.cameraMuted;\n this._dispatch('sw-camera-toggle', { muted: this.cameraMuted });\n }\n\n private _onSpeakerToggle() {\n this.speakerMuted = !this.speakerMuted;\n this._dispatch('sw-speaker-toggle', { muted: this.speakerMuted });\n }\n\n private _onDeviceSelect(kind: 'mic' | 'camera' | 'speaker', item: DropUpItem) {\n this._dispatch('sw-device-change', { kind, deviceId: item.id, label: item.label });\n }\n\n private _onFullscreenToggle() {\n this.fullscreen = !this.fullscreen;\n this._dispatch('sw-fullscreen-toggle', { fullscreen: this.fullscreen });\n }\n\n private _onScreenShareToggle() {\n this.screenSharing = !this.screenSharing;\n this._dispatch('sw-screen-share-toggle', { active: this.screenSharing });\n }\n\n private _onHandRaiseToggle() {\n this.handRaised = !this.handRaised;\n this._dispatch('sw-hand-raise-toggle', { raised: this.handRaised });\n }\n\n private _onTranscriptToggle() {\n this.transcriptActive = !this.transcriptActive;\n this._dispatch('sw-transcript-toggle', undefined as never);\n }\n\n private _onSettingsSelect(e: CustomEvent<DropUpItem>) {\n this._dispatch('sw-settings-change', { settingId: e.detail.id });\n }\n\n private _onHangUp() {\n this._dispatch('sw-call-hangup', undefined as never);\n }\n\n private _overflowItems(): DropUpItem[] {\n const items: DropUpItem[] = [];\n if (this.showScreenShare) {\n items.push({\n id: '__overflow:screen-share',\n label: this.screenSharing ? 'Stop sharing' : 'Share screen',\n selected: this.screenSharing,\n });\n }\n if (this.showHandRaise) {\n items.push({\n id: '__overflow:hand-raise',\n label: this.handRaised ? 'Lower hand' : 'Raise hand',\n selected: this.handRaised,\n });\n }\n if (this.showTranscript) {\n items.push({\n id: '__overflow:transcript',\n label: 'Transcript',\n selected: this.transcriptActive,\n });\n }\n if (this.showSettings) {\n items.push(...this.settingsItems);\n }\n if (this.showFullscreen) {\n items.push({\n id: '__overflow:fullscreen',\n label: this.fullscreen ? 'Exit fullscreen' : 'Fullscreen',\n selected: this.fullscreen,\n });\n }\n return items;\n }\n\n private _onOverflowSelect(e: CustomEvent<DropUpItem>) {\n switch (e.detail.id) {\n case '__overflow:screen-share':\n this._onScreenShareToggle();\n return;\n case '__overflow:hand-raise':\n this._onHandRaiseToggle();\n return;\n case '__overflow:transcript':\n this._onTranscriptToggle();\n return;\n case '__overflow:fullscreen':\n this._onFullscreenToggle();\n return;\n default:\n this._dispatch('sw-settings-change', { settingId: e.detail.id });\n }\n }\n\n // ── Render ────────────────────────────────────────────────────────────────\n\n render() {\n return html`\n <div class=\"bar\" part=\"bar\">\n <!-- SignalWire logo -->\n <span class=\"sw-logo\" part=\"logo\" aria-hidden=\"true\">\n <sw-ui-icon name=\"sw-logo\" size=\"20\"></sw-ui-icon>\n </span>\n\n <!-- Mic -->\n <sw-ui-split-button\n .active=${!this.micMuted}\n .items=${this.micDevices}\n @sw-split-button-toggle=${this._onMicToggle}\n @sw-dropup-select=${(e: CustomEvent<DropUpItem>) => this._onDeviceSelect('mic', e.detail)}\n >\n <sw-ui-icon slot=\"active\" name=\"mic-on\"></sw-ui-icon>\n <sw-ui-icon slot=\"inactive\" name=\"mic-off\"></sw-ui-icon>\n </sw-ui-split-button>\n\n <!-- Camera -->\n <sw-ui-split-button\n .active=${!this.cameraMuted}\n .items=${this.cameraDevices}\n @sw-split-button-toggle=${this._onCameraToggle}\n @sw-dropup-select=${(e: CustomEvent<DropUpItem>) => this._onDeviceSelect('camera', e.detail)}\n >\n <sw-ui-icon slot=\"active\" name=\"camera-on\"></sw-ui-icon>\n <sw-ui-icon slot=\"inactive\" name=\"camera-off\"></sw-ui-icon>\n </sw-ui-split-button>\n\n <!-- Speaker -->\n <sw-ui-split-button\n .active=${!this.speakerMuted}\n .items=${this.speakerDevices}\n @sw-split-button-toggle=${this._onSpeakerToggle}\n @sw-dropup-select=${(e: CustomEvent<DropUpItem>) => this._onDeviceSelect('speaker', e.detail)}\n >\n <sw-ui-icon slot=\"active\" name=\"speaker-on\"></sw-ui-icon>\n <sw-ui-icon slot=\"inactive\" name=\"speaker-off\"></sw-ui-icon>\n </sw-ui-split-button>\n\n <!-- Screen share (optional) -->\n ${this.showScreenShare\n ? html`\n <sw-ui-split-button\n class=\"optional ${this.screenSharing ? 'active-toggle' : ''}\"\n @sw-split-button-click=${this._onScreenShareToggle}\n >\n <sw-ui-icon name=${this.screenSharing ? 'screen-share-off' : 'screen-share'}></sw-ui-icon>\n </sw-ui-split-button>\n `\n : nothing}\n\n <!-- Hand raise (optional) -->\n ${this.showHandRaise\n ? html`\n <sw-ui-split-button\n class=\"optional ${this.handRaised ? 'active-toggle' : ''}\"\n @sw-split-button-click=${this._onHandRaiseToggle}\n >\n <sw-ui-icon name=\"hand-raise\"></sw-ui-icon>\n </sw-ui-split-button>\n `\n : nothing}\n\n <!-- Transcript (optional) -->\n ${this.showTranscript\n ? html`\n <sw-ui-split-button\n class=\"optional ${this.transcriptActive ? 'active-toggle' : ''}\"\n @sw-split-button-click=${this._onTranscriptToggle}\n >\n <sw-ui-icon name=\"transcript\"></sw-ui-icon>\n </sw-ui-split-button>\n `\n : nothing}\n\n <!-- Settings (optional) -->\n ${this.showSettings\n ? html`\n <sw-ui-split-button\n class=\"optional\"\n .items=${this.settingsItems}\n @sw-dropup-select=${this._onSettingsSelect}\n >\n <sw-ui-icon name=\"settings\"></sw-ui-icon>\n </sw-ui-split-button>\n `\n : nothing}\n\n <!-- Fullscreen (optional) -->\n ${this.showFullscreen\n ? html`\n <sw-ui-split-button class=\"optional\" @sw-split-button-click=${this._onFullscreenToggle}>\n <sw-ui-icon name=${this.fullscreen ? 'fullscreen-exit' : 'fullscreen'}></sw-ui-icon>\n </sw-ui-split-button>\n `\n : nothing}\n\n <!-- Overflow menu (shown on narrow containers) -->\n <sw-ui-split-button\n class=\"overflow\"\n .items=${this._overflowItems()}\n @sw-dropup-select=${this._onOverflowSelect}\n >\n <sw-ui-icon name=\"settings\"></sw-ui-icon>\n </sw-ui-split-button>\n\n <!-- Hang up -->\n <sw-ui-split-button class=\"hangup\" @sw-split-button-click=${this._onHangUp}>\n <sw-ui-icon name=\"phone-end\"></sw-ui-icon>\n </sw-ui-split-button>\n\n <!-- Spacer to balance the logo and keep buttons centered -->\n <span class=\"bar-spacer\" aria-hidden=\"true\"></span>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-ui-control-bar': SwUiControlBar;\n }\n}\n"],"names":["SwUiControlBar","LitElement","type","detail","kind","item","e","items","html","nothing","css","__decorateClass","property","customElement"],"mappings":";;;;;;;AAwEO,IAAMA,IAAN,cAA6BC,EAAW;AAAA,EAAxC,cAAA;AAAA,UAAA,GAAA,SAAA,GAiFL,KAAA,WAAW,IAGX,KAAA,cAAc,IAGd,KAAA,eAAe,IAGf,KAAA,aAAa,IAGb,KAAA,gBAAgB,IAGhB,KAAA,aAAa,IAGb,KAAA,mBAAmB,IAKnB,KAAA,kBAAkB,IAGlB,KAAA,gBAAgB,IAGhB,KAAA,iBAAiB,IAGjB,KAAA,eAAe,IAGf,KAAA,iBAAiB,IAKjB,KAAA,aAA2B,CAAA,GAG3B,KAAA,gBAA8B,CAAA,GAG9B,KAAA,iBAA+B,CAAA,GAG/B,KAAA,gBAA8B,CAAA;AAAA,EAAC;AAAA;AAAA,EAIvB,UACNC,GACAC,GACA;AACA,SAAK,cAAc,IAAI,YAAYD,GAAM,EAAE,QAAAC,GAAQ,SAAS,IAAM,UAAU,GAAA,CAAM,CAAC;AAAA,EACrF;AAAA,EAEQ,eAAe;AACrB,SAAK,WAAW,CAAC,KAAK,UACtB,KAAK,UAAU,iBAAiB,EAAE,OAAO,KAAK,UAAU;AAAA,EAC1D;AAAA,EAEQ,kBAAkB;AACxB,SAAK,cAAc,CAAC,KAAK,aACzB,KAAK,UAAU,oBAAoB,EAAE,OAAO,KAAK,aAAa;AAAA,EAChE;AAAA,EAEQ,mBAAmB;AACzB,SAAK,eAAe,CAAC,KAAK,cAC1B,KAAK,UAAU,qBAAqB,EAAE,OAAO,KAAK,cAAc;AAAA,EAClE;AAAA,EAEQ,gBAAgBC,GAAoCC,GAAkB;AAC5E,SAAK,UAAU,oBAAoB,EAAE,MAAAD,GAAM,UAAUC,EAAK,IAAI,OAAOA,EAAK,MAAA,CAAO;AAAA,EACnF;AAAA,EAEQ,sBAAsB;AAC5B,SAAK,aAAa,CAAC,KAAK,YACxB,KAAK,UAAU,wBAAwB,EAAE,YAAY,KAAK,YAAY;AAAA,EACxE;AAAA,EAEQ,uBAAuB;AAC7B,SAAK,gBAAgB,CAAC,KAAK,eAC3B,KAAK,UAAU,0BAA0B,EAAE,QAAQ,KAAK,eAAe;AAAA,EACzE;AAAA,EAEQ,qBAAqB;AAC3B,SAAK,aAAa,CAAC,KAAK,YACxB,KAAK,UAAU,wBAAwB,EAAE,QAAQ,KAAK,YAAY;AAAA,EACpE;AAAA,EAEQ,sBAAsB;AAC5B,SAAK,mBAAmB,CAAC,KAAK,kBAC9B,KAAK,UAAU,wBAAwB,MAAkB;AAAA,EAC3D;AAAA,EAEQ,kBAAkBC,GAA4B;AACpD,SAAK,UAAU,sBAAsB,EAAE,WAAWA,EAAE,OAAO,IAAI;AAAA,EACjE;AAAA,EAEQ,YAAY;AAClB,SAAK,UAAU,kBAAkB,MAAkB;AAAA,EACrD;AAAA,EAEQ,iBAA+B;AACrC,UAAMC,IAAsB,CAAA;AAC5B,WAAI,KAAK,mBACPA,EAAM,KAAK;AAAA,MACT,IAAI;AAAA,MACJ,OAAO,KAAK,gBAAgB,iBAAiB;AAAA,MAC7C,UAAU,KAAK;AAAA,IAAA,CAChB,GAEC,KAAK,iBACPA,EAAM,KAAK;AAAA,MACT,IAAI;AAAA,MACJ,OAAO,KAAK,aAAa,eAAe;AAAA,MACxC,UAAU,KAAK;AAAA,IAAA,CAChB,GAEC,KAAK,kBACPA,EAAM,KAAK;AAAA,MACT,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,UAAU,KAAK;AAAA,IAAA,CAChB,GAEC,KAAK,gBACPA,EAAM,KAAK,GAAG,KAAK,aAAa,GAE9B,KAAK,kBACPA,EAAM,KAAK;AAAA,MACT,IAAI;AAAA,MACJ,OAAO,KAAK,aAAa,oBAAoB;AAAA,MAC7C,UAAU,KAAK;AAAA,IAAA,CAChB,GAEIA;AAAA,EACT;AAAA,EAEQ,kBAAkBD,GAA4B;AACpD,YAAQA,EAAE,OAAO,IAAA;AAAA,MACf,KAAK;AACH,aAAK,qBAAA;AACL;AAAA,MACF,KAAK;AACH,aAAK,mBAAA;AACL;AAAA,MACF,KAAK;AACH,aAAK,oBAAA;AACL;AAAA,MACF,KAAK;AACH,aAAK,oBAAA;AACL;AAAA,MACF;AACE,aAAK,UAAU,sBAAsB,EAAE,WAAWA,EAAE,OAAO,IAAI;AAAA,IAAA;AAAA,EAErE;AAAA;AAAA,EAIA,SAAS;AACP,WAAOE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBASS,CAAC,KAAK,QAAQ;AAAA,mBACf,KAAK,UAAU;AAAA,oCACE,KAAK,YAAY;AAAA,8BACvB,CAACF,MAA+B,KAAK,gBAAgB,OAAOA,EAAE,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAQ/E,CAAC,KAAK,WAAW;AAAA,mBAClB,KAAK,aAAa;AAAA,oCACD,KAAK,eAAe;AAAA,8BAC1B,CAACA,MAA+B,KAAK,gBAAgB,UAAUA,EAAE,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAQlF,CAAC,KAAK,YAAY;AAAA,mBACnB,KAAK,cAAc;AAAA,oCACF,KAAK,gBAAgB;AAAA,8BAC3B,CAACA,MAA+B,KAAK,gBAAgB,WAAWA,EAAE,MAAM,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAO7F,KAAK,kBACHE;AAAA;AAAA,kCAEsB,KAAK,gBAAgB,kBAAkB,EAAE;AAAA,yCAClC,KAAK,oBAAoB;AAAA;AAAA,mCAE/B,KAAK,gBAAgB,qBAAqB,cAAc;AAAA;AAAA,gBAG/EC,CAAO;AAAA;AAAA;AAAA,UAGT,KAAK,gBACHD;AAAA;AAAA,kCAEsB,KAAK,aAAa,kBAAkB,EAAE;AAAA,yCAC/B,KAAK,kBAAkB;AAAA;AAAA;AAAA;AAAA,gBAKpDC,CAAO;AAAA;AAAA;AAAA,UAGT,KAAK,iBACHD;AAAA;AAAA,kCAEsB,KAAK,mBAAmB,kBAAkB,EAAE;AAAA,yCACrC,KAAK,mBAAmB;AAAA;AAAA;AAAA;AAAA,gBAKrDC,CAAO;AAAA;AAAA;AAAA,UAGT,KAAK,eACHD;AAAA;AAAA;AAAA,yBAGa,KAAK,aAAa;AAAA,oCACP,KAAK,iBAAiB;AAAA;AAAA;AAAA;AAAA,gBAK9CC,CAAO;AAAA;AAAA;AAAA,UAGT,KAAK,iBACHD;AAAA,4EACgE,KAAK,mBAAmB;AAAA,mCACjE,KAAK,aAAa,oBAAoB,YAAY;AAAA;AAAA,gBAGzEC,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,mBAKA,KAAK,gBAAgB;AAAA,8BACV,KAAK,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oEAMgB,KAAK,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQhF;AACF;AA3WaT,EACJ,SAASU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgFhBC,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,aAAa;AAAA,GAhFvDZ,EAiFX,WAAA,YAAA,CAAA;AAGAW,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,gBAAgB;AAAA,GAnF1DZ,EAoFX,WAAA,eAAA,CAAA;AAGAW,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,iBAAiB;AAAA,GAtF3DZ,EAuFX,WAAA,gBAAA,CAAA;AAGAW,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAzF/BZ,EA0FX,WAAA,cAAA,CAAA;AAGAW,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,kBAAkB;AAAA,GA5F5DZ,EA6FX,WAAA,iBAAA,CAAA;AAGAW,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,eAAe;AAAA,GA/FzDZ,EAgGX,WAAA,cAAA,CAAA;AAGAW,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,qBAAqB;AAAA,GAlG/DZ,EAmGX,WAAA,oBAAA,CAAA;AAKAW,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,qBAAqB;AAAA,GAvG/DZ,EAwGX,WAAA,mBAAA,CAAA;AAGAW,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,mBAAmB;AAAA,GA1G7DZ,EA2GX,WAAA,iBAAA,CAAA;AAGAW,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,mBAAmB;AAAA,GA7G7DZ,EA8GX,WAAA,kBAAA,CAAA;AAGAW,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,iBAAiB;AAAA,GAhH3DZ,EAiHX,WAAA,gBAAA,CAAA;AAGAW,EAAA;AAAA,EADCC,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM,WAAW,mBAAmB;AAAA,GAnH7DZ,EAoHX,WAAA,kBAAA,CAAA;AAKAW,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GAxHnBZ,EAyHX,WAAA,cAAA,CAAA;AAGAW,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GA3HnBZ,EA4HX,WAAA,iBAAA,CAAA;AAGAW,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GA9HnBZ,EA+HX,WAAA,kBAAA,CAAA;AAGAW,EAAA;AAAA,EADCC,EAAS,EAAE,WAAW,GAAA,CAAO;AAAA,GAjInBZ,EAkIX,WAAA,iBAAA,CAAA;AAlIWA,IAANW,EAAA;AAAA,EADNE,EAAc,mBAAmB;AAAA,GACrBb,CAAA;"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dialpad Component
|
|
3
|
+
*
|
|
4
|
+
* A 12-key telephone keypad (0-9, *, #) for entering phone numbers
|
|
5
|
+
* and sending DTMF tones during active calls. Pure UI component — no
|
|
6
|
+
* call logic. Use `sw-call-dialpad` for a version that integrates with
|
|
7
|
+
* a call context.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```html
|
|
11
|
+
* <sw-dialpad show-call-button></sw-dialpad>
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* @fires sw-digit-press - Fired when a digit button is pressed. Detail: `{ digit: string, digits: string }`
|
|
15
|
+
* @fires sw-dialpad-backspace - Fired when the backspace button is pressed. Detail: `{ digits: string }`
|
|
16
|
+
* @fires sw-dial - Fired when the call button is pressed. Detail: `{ digits: string }`
|
|
17
|
+
* @fires sw-dialpad-input - Fired when free-text input changes (only when `allow-text` is set). Detail: `{ digits: string }`
|
|
18
|
+
*
|
|
19
|
+
* @cssprop [--interactive-button-primary-bg=#044ef4] - Primary accent color.
|
|
20
|
+
* @cssprop [--interactive-button-primary-hover=#0342cf] - Primary color on hover.
|
|
21
|
+
* @cssprop [--interactive-status-success=#22c55e] - Success/call button color.
|
|
22
|
+
* @cssprop [--interactive-button-destructive-bg=#dc2626] - Danger/hangup button color.
|
|
23
|
+
* @cssprop [--bg-surface=#181a28] - Component background.
|
|
24
|
+
* @cssprop [--fg-default=#f0f0f4] - Text color.
|
|
25
|
+
* @cssprop [--fg-muted=#a0a0aa] - Muted text color.
|
|
26
|
+
* @cssprop [--border-default=rgba(255,255,255,0.12)] - Border color.
|
|
27
|
+
*/
|
|
28
|
+
import { LitElement } from 'lit';
|
|
29
|
+
import '../icons/sw-ui-icon.js';
|
|
30
|
+
export declare class SwUiDialpad extends LitElement {
|
|
31
|
+
static styles: import("lit").CSSResult;
|
|
32
|
+
/** Whether to display the call button below the keypad. */
|
|
33
|
+
showCallButton: boolean;
|
|
34
|
+
/** Allow free-text input in the display field (e.g., SIP URIs, vanity letters). Keypad buttons still append DTMF digits. */
|
|
35
|
+
allowText: boolean;
|
|
36
|
+
/** Placeholder text shown in the digit display input. */
|
|
37
|
+
placeholder: string;
|
|
38
|
+
private digits;
|
|
39
|
+
private pressedKey;
|
|
40
|
+
private _pressDigit;
|
|
41
|
+
private _backspace;
|
|
42
|
+
private _dial;
|
|
43
|
+
/**
|
|
44
|
+
* Handle keyboard input on the display field.
|
|
45
|
+
* We intercept all keys and manage state ourselves to prevent the browser
|
|
46
|
+
* from accumulating non-DTMF characters in the input value.
|
|
47
|
+
*/
|
|
48
|
+
private _onKeyDown;
|
|
49
|
+
private _onInput;
|
|
50
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
51
|
+
}
|
|
52
|
+
declare global {
|
|
53
|
+
interface HTMLElementTagNameMap {
|
|
54
|
+
'sw-ui-dialpad': SwUiDialpad;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=sw-ui-dialpad.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sw-ui-dialpad.d.ts","sourceRoot":"","sources":["../../../../src/components/UI/controls/sw-ui-dialpad.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAE5C,OAAO,wBAAwB,CAAC;AAsBhC,qBACa,WAAY,SAAQ,UAAU;IACzC,MAAM,CAAC,MAAM,0BAoKX;IAEF,2DAA2D;IAE3D,cAAc,EAAE,OAAO,CAAS;IAEhC,4HAA4H;IAE5H,SAAS,EAAE,OAAO,CAAS;IAE3B,yDAAyD;IAEzD,WAAW,EAAE,MAAM,CAAkB;IAE5B,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,UAAU,CAAuB;IAElD,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,KAAK;IAWb;;;;OAIG;IACH,OAAO,CAAC,UAAU;IA0BlB,OAAO,CAAC,QAAQ;IAahB,MAAM;CAuDP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,eAAe,EAAE,WAAW,CAAC;KAC9B;CACF"}
|