@signalwire/web-components 4.0.0-beta.1 → 4.0.0-beta.10
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 +9 -10
- package/dist/components/audio-level.d.ts +106 -0
- package/dist/components/audio-level.d.ts.map +1 -0
- package/dist/components/audio-level.js +203 -0
- package/dist/components/audio-level.js.map +1 -0
- package/dist/components/call-controls.d.ts +163 -0
- package/dist/components/call-controls.d.ts.map +1 -0
- package/dist/components/call-controls.js +606 -0
- package/dist/components/call-controls.js.map +1 -0
- package/dist/components/call-media.d.ts +114 -0
- package/dist/components/call-media.d.ts.map +1 -0
- package/dist/components/call-media.js +219 -0
- package/dist/components/call-media.js.map +1 -0
- package/dist/components/call-status.d.ts +68 -0
- package/dist/components/call-status.d.ts.map +1 -0
- package/dist/components/call-status.js +254 -0
- package/dist/components/call-status.js.map +1 -0
- package/dist/components/click-to-call.d.ts +123 -0
- package/dist/components/click-to-call.d.ts.map +1 -0
- package/dist/components/click-to-call.js +428 -0
- package/dist/components/click-to-call.js.map +1 -0
- package/dist/components/device-selector.d.ts +224 -0
- package/dist/components/device-selector.d.ts.map +1 -0
- package/dist/components/device-selector.js +685 -0
- package/dist/components/device-selector.js.map +1 -0
- package/dist/components/dialpad.d.ts +60 -0
- package/dist/components/dialpad.d.ts.map +1 -0
- package/dist/components/dialpad.js +372 -0
- package/dist/components/dialpad.js.map +1 -0
- package/dist/components/directory.d.ts +103 -0
- package/dist/components/directory.d.ts.map +1 -0
- package/dist/components/directory.js +503 -0
- package/dist/components/directory.js.map +1 -0
- package/dist/components/example-button.d.ts +20 -0
- package/dist/components/example-button.d.ts.map +1 -0
- package/dist/components/example-button.js +74 -0
- package/dist/components/example-button.js.map +1 -0
- package/dist/components/participant-controls.d.ts +94 -0
- package/dist/components/participant-controls.d.ts.map +1 -0
- package/dist/components/participant-controls.js +468 -0
- package/dist/components/participant-controls.js.map +1 -0
- package/dist/components/participants.d.ts +116 -0
- package/dist/components/participants.d.ts.map +1 -0
- package/dist/components/participants.js +394 -0
- package/dist/components/participants.js.map +1 -0
- package/dist/components/self-media.d.ts +78 -0
- package/dist/components/self-media.d.ts.map +1 -0
- package/dist/components/self-media.js +129 -0
- package/dist/components/self-media.js.map +1 -0
- package/dist/constants.d.ts +10 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +5 -0
- package/dist/constants.js.map +1 -0
- package/dist/context/call-context.d.ts +13 -0
- package/dist/context/call-context.d.ts.map +1 -0
- package/dist/context/call-context.js +6 -0
- package/dist/context/call-context.js.map +1 -0
- package/dist/context/index.d.ts +2 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -5644
- package/dist/index.js.map +1 -1
- package/dist/react.d.ts +101 -0
- package/dist/types/index.d.ts +44 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/debounce.d.ts +10 -0
- package/dist/utils/debounce.d.ts.map +1 -0
- package/dist/utils/debounce.js +13 -0
- package/dist/utils/debounce.js.map +1 -0
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/video.d.ts +34 -0
- package/dist/utils/video.d.ts.map +1 -0
- package/dist/utils/video.js +26 -0
- package/dist/utils/video.js.map +1 -0
- package/package.json +70 -3
package/README.md
CHANGED
|
@@ -24,7 +24,9 @@ npm install @signalwire/web-components
|
|
|
24
24
|
import '@signalwire/web-components';
|
|
25
25
|
|
|
26
26
|
// Or import specific components
|
|
27
|
-
import
|
|
27
|
+
import '@signalwire/web-components/call-status';
|
|
28
|
+
import '@signalwire/web-components/call-media';
|
|
29
|
+
import '@signalwire/web-components/self-media';
|
|
28
30
|
```
|
|
29
31
|
|
|
30
32
|
```html
|
|
@@ -212,7 +214,7 @@ Displays call state, status text, and duration timer.
|
|
|
212
214
|
|----------|------|---------|-------------|
|
|
213
215
|
| `call` | `CallStatusCall` | - | Call with status$ observable |
|
|
214
216
|
|
|
215
|
-
**Status Values:** `
|
|
217
|
+
**Status Values:** `new`, `trying`, `ringing`, `connecting`, `connected`, `disconnecting`, `disconnected`, `failed`, `destroyed`
|
|
216
218
|
|
|
217
219
|
**CSS Custom Properties:**
|
|
218
220
|
|
|
@@ -312,7 +314,7 @@ Dropdown for selecting audio/video input and output devices.
|
|
|
312
314
|
| Event | Detail | Description |
|
|
313
315
|
|-------|--------|-------------|
|
|
314
316
|
| `sw-tab-change` | `{ tab: 'microphone' \| 'camera' \| 'speaker' }` | Tab changed |
|
|
315
|
-
| `sw-device-change` | `{ device:
|
|
317
|
+
| `sw-device-change` | `{ device: MediaDeviceInfo }` | Device selected |
|
|
316
318
|
| `sw-test-speaker` | - | Speaker test triggered |
|
|
317
319
|
|
|
318
320
|
**CSS Custom Properties:**
|
|
@@ -666,7 +668,7 @@ sw-call-media::part(video) {
|
|
|
666
668
|
## TypeScript Interfaces
|
|
667
669
|
|
|
668
670
|
```typescript
|
|
669
|
-
import type { Call,
|
|
671
|
+
import type { Call, CallSelf, DeviceController, LayoutLayer, Participant } from '@signalwire/web-components';
|
|
670
672
|
|
|
671
673
|
// Call object interface
|
|
672
674
|
interface Call {
|
|
@@ -692,12 +694,9 @@ interface LayoutLayer {
|
|
|
692
694
|
height: number;
|
|
693
695
|
}
|
|
694
696
|
|
|
695
|
-
//
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
label: string;
|
|
699
|
-
kind: 'audioinput' | 'audiooutput' | 'videoinput';
|
|
700
|
-
}
|
|
697
|
+
// DeviceController is imported from @signalwire/js via @signalwire/web-components
|
|
698
|
+
// It provides observables for device lists and selection methods.
|
|
699
|
+
// See @signalwire/js documentation for the full DeviceController interface.
|
|
701
700
|
|
|
702
701
|
// Directory address
|
|
703
702
|
interface Address {
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audio Level Component
|
|
3
|
+
*
|
|
4
|
+
* Visual audio level indicator that renders real-time audio levels from a MediaStream
|
|
5
|
+
* via Web Audio API. Displays configurable number of bars with color transitions
|
|
6
|
+
* based on audio intensity.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```html
|
|
10
|
+
* <sw-audio-level .stream=${mediaStream} bars="5" orientation="vertical"></sw-audio-level>
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
import { LitElement } from 'lit';
|
|
14
|
+
export declare class AudioLevel extends LitElement {
|
|
15
|
+
static styles: import("lit").CSSResult;
|
|
16
|
+
/**
|
|
17
|
+
* MediaStream to analyze for audio levels
|
|
18
|
+
*/
|
|
19
|
+
stream?: MediaStream;
|
|
20
|
+
/**
|
|
21
|
+
* Number of bars to display (default: 5)
|
|
22
|
+
*/
|
|
23
|
+
bars: number;
|
|
24
|
+
/**
|
|
25
|
+
* Orientation of the bars: 'vertical' or 'horizontal'
|
|
26
|
+
*/
|
|
27
|
+
orientation: 'vertical' | 'horizontal';
|
|
28
|
+
/**
|
|
29
|
+
* Maximum height/width of bars in pixels
|
|
30
|
+
*/
|
|
31
|
+
maxSize: number;
|
|
32
|
+
/**
|
|
33
|
+
* Current audio levels for each bar (0-1)
|
|
34
|
+
*/
|
|
35
|
+
private _levels;
|
|
36
|
+
/**
|
|
37
|
+
* Web Audio API context
|
|
38
|
+
*/
|
|
39
|
+
private _audioContext?;
|
|
40
|
+
/**
|
|
41
|
+
* Analyser node for frequency data
|
|
42
|
+
*/
|
|
43
|
+
private _analyser?;
|
|
44
|
+
/**
|
|
45
|
+
* Source node connected to the MediaStream
|
|
46
|
+
*/
|
|
47
|
+
private _source?;
|
|
48
|
+
/**
|
|
49
|
+
* Animation frame ID for cleanup
|
|
50
|
+
*/
|
|
51
|
+
private _animationFrameId?;
|
|
52
|
+
/**
|
|
53
|
+
* Frequency data buffer
|
|
54
|
+
*/
|
|
55
|
+
private _dataArray?;
|
|
56
|
+
/**
|
|
57
|
+
* Lifecycle: Component connected to DOM
|
|
58
|
+
*/
|
|
59
|
+
connectedCallback(): void;
|
|
60
|
+
/**
|
|
61
|
+
* Lifecycle: React to property changes
|
|
62
|
+
*/
|
|
63
|
+
protected updated(changedProperties: Map<string, unknown>): void;
|
|
64
|
+
/**
|
|
65
|
+
* Lifecycle: Component disconnected from DOM
|
|
66
|
+
*/
|
|
67
|
+
disconnectedCallback(): void;
|
|
68
|
+
/**
|
|
69
|
+
* Public method to release all audio resources immediately
|
|
70
|
+
* Call this before stopping the MediaStream tracks to ensure proper cleanup
|
|
71
|
+
*/
|
|
72
|
+
releaseResources(): void;
|
|
73
|
+
/**
|
|
74
|
+
* Setup Web Audio API for audio level analysis
|
|
75
|
+
*/
|
|
76
|
+
private setupAudioAnalysis;
|
|
77
|
+
/**
|
|
78
|
+
* Cleanup Web Audio API resources
|
|
79
|
+
*/
|
|
80
|
+
private cleanupAudioAnalysis;
|
|
81
|
+
/**
|
|
82
|
+
* Start the animation loop for updating levels
|
|
83
|
+
*/
|
|
84
|
+
private startAnimationLoop;
|
|
85
|
+
/**
|
|
86
|
+
* Get the color class based on level
|
|
87
|
+
*/
|
|
88
|
+
private getLevelClass;
|
|
89
|
+
/**
|
|
90
|
+
* Get the active class if level is above threshold
|
|
91
|
+
*/
|
|
92
|
+
private isActive;
|
|
93
|
+
/**
|
|
94
|
+
* Render the component
|
|
95
|
+
*/
|
|
96
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Declare global type for TypeScript
|
|
100
|
+
*/
|
|
101
|
+
declare global {
|
|
102
|
+
interface HTMLElementTagNameMap {
|
|
103
|
+
'sw-audio-level': AudioLevel;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=audio-level.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio-level.d.ts","sourceRoot":"","sources":["../../src/components/audio-level.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAa,MAAM,KAAK,CAAC;AAG5C,qBACa,UAAW,SAAQ,UAAU;IACxC,MAAM,CAAC,MAAM,0BAiEX;IAEF;;OAEG;IACyB,MAAM,CAAC,EAAE,WAAW,CAAC;IAEjD;;OAEG;IACyB,IAAI,SAAK;IAErC;;OAEG;IACwC,WAAW,EAAE,UAAU,GAAG,YAAY,CAAc;IAE/F;;OAEG;IACyB,OAAO,SAAM;IAEzC;;OAEG;IACM,OAAO,CAAC,OAAO,CAAgB;IAExC;;OAEG;IACH,OAAO,CAAC,aAAa,CAAC,CAAe;IAErC;;OAEG;IACH,OAAO,CAAC,SAAS,CAAC,CAAe;IAEjC;;OAEG;IACH,OAAO,CAAC,OAAO,CAAC,CAA6B;IAE7C;;OAEG;IACH,OAAO,CAAC,iBAAiB,CAAC,CAAS;IAEnC;;OAEG;IACH,OAAO,CAAC,UAAU,CAAC,CAA0B;IAE7C;;OAEG;IACH,iBAAiB;IAQjB;;OAEG;IACH,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAehE;;OAEG;IACH,oBAAoB;IAKpB;;;OAGG;IACI,gBAAgB,IAAI,IAAI;IAK/B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkC1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgC5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAyC1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAOrB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAIhB;;OAEG;IACH,MAAM;CA0BP;AAED;;GAEG;AACH,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,gBAAgB,EAAE,UAAU,CAAC;KAC9B;CACF"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { LitElement as b, html as p, css as y } from "lit";
|
|
2
|
+
import { property as c, state as f, customElement as _ } from "lit/decorators.js";
|
|
3
|
+
var w = Object.defineProperty, g = Object.getOwnPropertyDescriptor, l = (t, e, s, a) => {
|
|
4
|
+
for (var i = a > 1 ? void 0 : a ? g(e, s) : e, r = t.length - 1, o; r >= 0; r--)
|
|
5
|
+
(o = t[r]) && (i = (a ? o(e, s, i) : o(i)) || i);
|
|
6
|
+
return a && i && w(e, s, i), i;
|
|
7
|
+
};
|
|
8
|
+
let n = class extends b {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(...arguments), this.bars = 5, this.orientation = "vertical", this.maxSize = 32, this._levels = [];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Lifecycle: Component connected to DOM
|
|
14
|
+
*/
|
|
15
|
+
connectedCallback() {
|
|
16
|
+
super.connectedCallback(), this._levels = new Array(this.bars).fill(0), this.stream && this.setupAudioAnalysis();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Lifecycle: React to property changes
|
|
20
|
+
*/
|
|
21
|
+
updated(t) {
|
|
22
|
+
super.updated(t), t.has("stream") && (this.cleanupAudioAnalysis(), this.stream && this.setupAudioAnalysis()), t.has("bars") && (this._levels = new Array(this.bars).fill(0));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Lifecycle: Component disconnected from DOM
|
|
26
|
+
*/
|
|
27
|
+
disconnectedCallback() {
|
|
28
|
+
super.disconnectedCallback(), this.cleanupAudioAnalysis();
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Public method to release all audio resources immediately
|
|
32
|
+
* Call this before stopping the MediaStream tracks to ensure proper cleanup
|
|
33
|
+
*/
|
|
34
|
+
releaseResources() {
|
|
35
|
+
this.cleanupAudioAnalysis(), this.stream = void 0;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Setup Web Audio API for audio level analysis
|
|
39
|
+
*/
|
|
40
|
+
setupAudioAnalysis() {
|
|
41
|
+
if (!this.stream) return;
|
|
42
|
+
if (this.stream.getAudioTracks().length === 0) {
|
|
43
|
+
console.warn("sw-audio-level: MediaStream has no audio tracks");
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
this._audioContext = new AudioContext(), this._analyser = this._audioContext.createAnalyser(), this._analyser.fftSize = 256, this._analyser.smoothingTimeConstant = 0.8, this._source = this._audioContext.createMediaStreamSource(this.stream), this._source.connect(this._analyser);
|
|
48
|
+
const e = this._analyser.frequencyBinCount;
|
|
49
|
+
this._dataArray = new Uint8Array(e), this.startAnimationLoop();
|
|
50
|
+
} catch (e) {
|
|
51
|
+
console.error("sw-audio-level: Failed to setup audio analysis:", e);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Cleanup Web Audio API resources
|
|
56
|
+
*/
|
|
57
|
+
cleanupAudioAnalysis() {
|
|
58
|
+
this._animationFrameId !== void 0 && (cancelAnimationFrame(this._animationFrameId), this._animationFrameId = void 0), this._source && (this._source.disconnect(), this._source = void 0), this._analyser && (this._analyser.disconnect(), this._analyser = void 0), this._audioContext && this._audioContext.state !== "closed" && (this._audioContext.close().catch(console.error), this._audioContext = void 0), this._dataArray = void 0, this._levels = new Array(this.bars).fill(0);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Start the animation loop for updating levels
|
|
62
|
+
*/
|
|
63
|
+
startAnimationLoop() {
|
|
64
|
+
const t = () => {
|
|
65
|
+
const e = this._analyser, s = this._dataArray;
|
|
66
|
+
if (!e || !s)
|
|
67
|
+
return;
|
|
68
|
+
e.getByteFrequencyData(s);
|
|
69
|
+
const a = [], i = s.length, r = Math.floor(i / this.bars);
|
|
70
|
+
for (let o = 0; o < this.bars; o++) {
|
|
71
|
+
const h = o * r, u = Math.min(h + r, i);
|
|
72
|
+
let m = 0;
|
|
73
|
+
for (let d = h; d < u; d++)
|
|
74
|
+
m += s[d] ?? 0;
|
|
75
|
+
const v = m / (u - h);
|
|
76
|
+
a.push(v / 255);
|
|
77
|
+
}
|
|
78
|
+
this._levels = a, this.requestUpdate(), this._animationFrameId = requestAnimationFrame(t);
|
|
79
|
+
};
|
|
80
|
+
this._animationFrameId = requestAnimationFrame(t);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Get the color class based on level
|
|
84
|
+
*/
|
|
85
|
+
getLevelClass(t) {
|
|
86
|
+
return t > 0.7 ? "level-high" : t > 0.4 ? "level-medium" : t > 0.05 ? "level-low" : "";
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get the active class if level is above threshold
|
|
90
|
+
*/
|
|
91
|
+
isActive(t) {
|
|
92
|
+
return t > 0.05;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Render the component
|
|
96
|
+
*/
|
|
97
|
+
render() {
|
|
98
|
+
const t = this._levels.length === this.bars ? this._levels : new Array(this.bars).fill(0);
|
|
99
|
+
return p`
|
|
100
|
+
<div class="container" part="container">
|
|
101
|
+
${t.map((e, s) => {
|
|
102
|
+
const a = this.isActive(e), i = this.getLevelClass(e), r = Math.max(4, e * this.maxSize), o = this.orientation === "horizontal" ? `width: ${r}px;` : `height: ${r}px;`;
|
|
103
|
+
return p`
|
|
104
|
+
<div
|
|
105
|
+
class="bar ${a ? "active" : ""} ${i}"
|
|
106
|
+
part="bar ${a ? "bar-active" : ""}"
|
|
107
|
+
style="${o}"
|
|
108
|
+
data-bar-index="${s}"
|
|
109
|
+
></div>
|
|
110
|
+
`;
|
|
111
|
+
})}
|
|
112
|
+
</div>
|
|
113
|
+
`;
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
n.styles = y`
|
|
117
|
+
:host {
|
|
118
|
+
/* CSS Custom Properties for theming */
|
|
119
|
+
--sw-color-success: #10b981;
|
|
120
|
+
--sw-color-warning: #f59e0b;
|
|
121
|
+
--sw-color-danger: #ef4444;
|
|
122
|
+
--sw-audio-bar-width: 4px;
|
|
123
|
+
--sw-audio-bar-gap: 2px;
|
|
124
|
+
--sw-audio-bar-radius: 2px;
|
|
125
|
+
--sw-audio-bar-background: rgba(255, 255, 255, 0.2);
|
|
126
|
+
|
|
127
|
+
display: inline-flex;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.container {
|
|
131
|
+
display: flex;
|
|
132
|
+
align-items: flex-end;
|
|
133
|
+
justify-content: center;
|
|
134
|
+
gap: var(--sw-audio-bar-gap);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
:host([orientation='horizontal']) .container {
|
|
138
|
+
flex-direction: row;
|
|
139
|
+
align-items: center;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
:host([orientation='vertical']) .container,
|
|
143
|
+
.container {
|
|
144
|
+
flex-direction: row;
|
|
145
|
+
align-items: flex-end;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.bar {
|
|
149
|
+
width: var(--sw-audio-bar-width);
|
|
150
|
+
background: var(--sw-audio-bar-background);
|
|
151
|
+
border-radius: var(--sw-audio-bar-radius);
|
|
152
|
+
transition:
|
|
153
|
+
height 0.05s ease-out,
|
|
154
|
+
width 0.05s ease-out,
|
|
155
|
+
background-color 0.1s ease;
|
|
156
|
+
min-height: 4px;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
:host([orientation='horizontal']) .bar {
|
|
160
|
+
height: var(--sw-audio-bar-width);
|
|
161
|
+
width: 4px;
|
|
162
|
+
min-width: 4px;
|
|
163
|
+
min-height: auto;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.bar.active {
|
|
167
|
+
/* Color is set dynamically via inline style */
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.bar.level-low {
|
|
171
|
+
background-color: var(--sw-color-success);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.bar.level-medium {
|
|
175
|
+
background-color: var(--sw-color-warning);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.bar.level-high {
|
|
179
|
+
background-color: var(--sw-color-danger);
|
|
180
|
+
}
|
|
181
|
+
`;
|
|
182
|
+
l([
|
|
183
|
+
c({ type: Object })
|
|
184
|
+
], n.prototype, "stream", 2);
|
|
185
|
+
l([
|
|
186
|
+
c({ type: Number })
|
|
187
|
+
], n.prototype, "bars", 2);
|
|
188
|
+
l([
|
|
189
|
+
c({ type: String, reflect: !0 })
|
|
190
|
+
], n.prototype, "orientation", 2);
|
|
191
|
+
l([
|
|
192
|
+
c({ type: Number })
|
|
193
|
+
], n.prototype, "maxSize", 2);
|
|
194
|
+
l([
|
|
195
|
+
f()
|
|
196
|
+
], n.prototype, "_levels", 2);
|
|
197
|
+
n = l([
|
|
198
|
+
_("sw-audio-level")
|
|
199
|
+
], n);
|
|
200
|
+
export {
|
|
201
|
+
n as AudioLevel
|
|
202
|
+
};
|
|
203
|
+
//# sourceMappingURL=audio-level.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio-level.js","sources":["../../src/components/audio-level.ts"],"sourcesContent":["/**\n * Audio Level Component\n *\n * Visual audio level indicator that renders real-time audio levels from a MediaStream\n * via Web Audio API. Displays configurable number of bars with color transitions\n * based on audio intensity.\n *\n * @example\n * ```html\n * <sw-audio-level .stream=${mediaStream} bars=\"5\" orientation=\"vertical\"></sw-audio-level>\n * ```\n */\n\nimport { LitElement, html, css } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\n@customElement('sw-audio-level')\nexport class AudioLevel extends LitElement {\n static styles = css`\n :host {\n /* CSS Custom Properties for theming */\n --sw-color-success: #10b981;\n --sw-color-warning: #f59e0b;\n --sw-color-danger: #ef4444;\n --sw-audio-bar-width: 4px;\n --sw-audio-bar-gap: 2px;\n --sw-audio-bar-radius: 2px;\n --sw-audio-bar-background: rgba(255, 255, 255, 0.2);\n\n display: inline-flex;\n }\n\n .container {\n display: flex;\n align-items: flex-end;\n justify-content: center;\n gap: var(--sw-audio-bar-gap);\n }\n\n :host([orientation='horizontal']) .container {\n flex-direction: row;\n align-items: center;\n }\n\n :host([orientation='vertical']) .container,\n .container {\n flex-direction: row;\n align-items: flex-end;\n }\n\n .bar {\n width: var(--sw-audio-bar-width);\n background: var(--sw-audio-bar-background);\n border-radius: var(--sw-audio-bar-radius);\n transition:\n height 0.05s ease-out,\n width 0.05s ease-out,\n background-color 0.1s ease;\n min-height: 4px;\n }\n\n :host([orientation='horizontal']) .bar {\n height: var(--sw-audio-bar-width);\n width: 4px;\n min-width: 4px;\n min-height: auto;\n }\n\n .bar.active {\n /* Color is set dynamically via inline style */\n }\n\n .bar.level-low {\n background-color: var(--sw-color-success);\n }\n\n .bar.level-medium {\n background-color: var(--sw-color-warning);\n }\n\n .bar.level-high {\n background-color: var(--sw-color-danger);\n }\n `;\n\n /**\n * MediaStream to analyze for audio levels\n */\n @property({ type: Object }) stream?: MediaStream;\n\n /**\n * Number of bars to display (default: 5)\n */\n @property({ type: Number }) bars = 5;\n\n /**\n * Orientation of the bars: 'vertical' or 'horizontal'\n */\n @property({ type: String, reflect: true }) orientation: 'vertical' | 'horizontal' = 'vertical';\n\n /**\n * Maximum height/width of bars in pixels\n */\n @property({ type: Number }) maxSize = 32;\n\n /**\n * Current audio levels for each bar (0-1)\n */\n @state() private _levels: number[] = [];\n\n /**\n * Web Audio API context\n */\n private _audioContext?: AudioContext;\n\n /**\n * Analyser node for frequency data\n */\n private _analyser?: AnalyserNode;\n\n /**\n * Source node connected to the MediaStream\n */\n private _source?: MediaStreamAudioSourceNode;\n\n /**\n * Animation frame ID for cleanup\n */\n private _animationFrameId?: number;\n\n /**\n * Frequency data buffer\n */\n private _dataArray?: Uint8Array<ArrayBuffer>;\n\n /**\n * Lifecycle: Component connected to DOM\n */\n connectedCallback() {\n super.connectedCallback();\n this._levels = new Array(this.bars).fill(0);\n if (this.stream) {\n this.setupAudioAnalysis();\n }\n }\n\n /**\n * Lifecycle: React to property changes\n */\n protected updated(changedProperties: Map<string, unknown>): void {\n super.updated(changedProperties);\n\n if (changedProperties.has('stream')) {\n this.cleanupAudioAnalysis();\n if (this.stream) {\n this.setupAudioAnalysis();\n }\n }\n\n if (changedProperties.has('bars')) {\n this._levels = new Array(this.bars).fill(0);\n }\n }\n\n /**\n * Lifecycle: Component disconnected from DOM\n */\n disconnectedCallback() {\n super.disconnectedCallback();\n this.cleanupAudioAnalysis();\n }\n\n /**\n * Public method to release all audio resources immediately\n * Call this before stopping the MediaStream tracks to ensure proper cleanup\n */\n public releaseResources(): void {\n this.cleanupAudioAnalysis();\n this.stream = undefined;\n }\n\n /**\n * Setup Web Audio API for audio level analysis\n */\n private setupAudioAnalysis(): void {\n if (!this.stream) return;\n\n // Check if stream has audio tracks\n const audioTracks = this.stream.getAudioTracks();\n if (audioTracks.length === 0) {\n console.warn('sw-audio-level: MediaStream has no audio tracks');\n return;\n }\n\n try {\n // Create AudioContext\n this._audioContext = new AudioContext();\n\n // Create analyser node\n this._analyser = this._audioContext.createAnalyser();\n this._analyser.fftSize = 256;\n this._analyser.smoothingTimeConstant = 0.8;\n\n // Create source from MediaStream\n this._source = this._audioContext.createMediaStreamSource(this.stream);\n this._source.connect(this._analyser);\n\n // Create data array for frequency data\n const bufferLength = this._analyser.frequencyBinCount;\n this._dataArray = new Uint8Array(bufferLength);\n\n // Start animation loop\n this.startAnimationLoop();\n } catch (error) {\n console.error('sw-audio-level: Failed to setup audio analysis:', error);\n }\n }\n\n /**\n * Cleanup Web Audio API resources\n */\n private cleanupAudioAnalysis(): void {\n // Cancel animation frame\n if (this._animationFrameId !== undefined) {\n cancelAnimationFrame(this._animationFrameId);\n this._animationFrameId = undefined;\n }\n\n // Disconnect source\n if (this._source) {\n this._source.disconnect();\n this._source = undefined;\n }\n\n // Disconnect analyser (not strictly necessary but good practice)\n if (this._analyser) {\n this._analyser.disconnect();\n this._analyser = undefined;\n }\n\n // Close AudioContext\n if (this._audioContext && this._audioContext.state !== 'closed') {\n this._audioContext.close().catch(console.error);\n this._audioContext = undefined;\n }\n\n // Clear data array\n this._dataArray = undefined;\n\n // Reset levels\n this._levels = new Array(this.bars).fill(0);\n }\n\n /**\n * Start the animation loop for updating levels\n */\n private startAnimationLoop(): void {\n const updateLevels = () => {\n const analyser = this._analyser;\n const dataArray = this._dataArray;\n if (!analyser || !dataArray) {\n return;\n }\n\n // Get frequency data\n analyser.getByteFrequencyData(dataArray);\n\n // Calculate levels for each bar by sampling frequency ranges\n const levels: number[] = [];\n const binCount = dataArray.length;\n const binsPerBar = Math.floor(binCount / this.bars);\n\n for (let i = 0; i < this.bars; i++) {\n const startBin = i * binsPerBar;\n const endBin = Math.min(startBin + binsPerBar, binCount);\n\n // Average the frequency values for this bar's range\n let sum = 0;\n for (let j = startBin; j < endBin; j++) {\n sum += dataArray[j] ?? 0;\n }\n const average = sum / (endBin - startBin);\n\n // Normalize to 0-1 range\n levels.push(average / 255);\n }\n\n this._levels = levels;\n this.requestUpdate();\n\n // Schedule next frame\n this._animationFrameId = requestAnimationFrame(updateLevels);\n };\n\n this._animationFrameId = requestAnimationFrame(updateLevels);\n }\n\n /**\n * Get the color class based on level\n */\n private getLevelClass(level: number): string {\n if (level > 0.7) return 'level-high';\n if (level > 0.4) return 'level-medium';\n if (level > 0.05) return 'level-low';\n return '';\n }\n\n /**\n * Get the active class if level is above threshold\n */\n private isActive(level: number): boolean {\n return level > 0.05;\n }\n\n /**\n * Render the component\n */\n render() {\n // Ensure we have the right number of levels\n const levels = this._levels.length === this.bars ? this._levels : new Array(this.bars).fill(0);\n\n return html`\n <div class=\"container\" part=\"container\">\n ${levels.map((level, index) => {\n const isActive = this.isActive(level);\n const levelClass = this.getLevelClass(level);\n const size = Math.max(4, level * this.maxSize);\n\n const style =\n this.orientation === 'horizontal' ? `width: ${size}px;` : `height: ${size}px;`;\n\n return html`\n <div\n class=\"bar ${isActive ? 'active' : ''} ${levelClass}\"\n part=\"bar ${isActive ? 'bar-active' : ''}\"\n style=\"${style}\"\n data-bar-index=\"${index}\"\n ></div>\n `;\n })}\n </div>\n `;\n }\n}\n\n/**\n * Declare global type for TypeScript\n */\ndeclare global {\n interface HTMLElementTagNameMap {\n 'sw-audio-level': AudioLevel;\n }\n}\n"],"names":["AudioLevel","LitElement","changedProperties","bufferLength","error","updateLevels","analyser","dataArray","levels","binCount","binsPerBar","i","startBin","endBin","sum","j","average","level","html","index","isActive","levelClass","size","style","css","__decorateClass","property","state","customElement"],"mappings":"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"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call Controls Component
|
|
3
|
+
*
|
|
4
|
+
* Responsive button bar for call actions. Displays mute audio, mute video,
|
|
5
|
+
* screen share, and hangup buttons with states reflecting current call state.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```html
|
|
9
|
+
* <sw-call-controls .call=${call}></sw-call-controls>
|
|
10
|
+
* ```
|
|
11
|
+
*/
|
|
12
|
+
import { LitElement } from 'lit';
|
|
13
|
+
import type { Observable } from 'rxjs';
|
|
14
|
+
/**
|
|
15
|
+
* Screen share status type
|
|
16
|
+
*/
|
|
17
|
+
export type ScreenShareStatus = 'inactive' | 'pending' | 'active';
|
|
18
|
+
/**
|
|
19
|
+
* SelfParticipant interface for call controls
|
|
20
|
+
*/
|
|
21
|
+
export interface SelfParticipant {
|
|
22
|
+
id: string;
|
|
23
|
+
audioMuted$: Observable<boolean>;
|
|
24
|
+
videoMuted$: Observable<boolean>;
|
|
25
|
+
screenShareStatus$?: Observable<string>;
|
|
26
|
+
mute: () => Promise<void>;
|
|
27
|
+
unmute: () => Promise<void>;
|
|
28
|
+
muteVideo: () => Promise<void>;
|
|
29
|
+
unmuteVideo: () => Promise<void>;
|
|
30
|
+
startScreenShare?: () => Promise<void>;
|
|
31
|
+
stopScreenShare?: () => Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Call interface for call controls
|
|
35
|
+
*/
|
|
36
|
+
export interface CallControlsCall {
|
|
37
|
+
self?: SelfParticipant | null;
|
|
38
|
+
self$?: Observable<SelfParticipant | null>;
|
|
39
|
+
capabilities$?: Observable<string[]>;
|
|
40
|
+
hangup: () => Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
export declare class CallControls extends LitElement {
|
|
43
|
+
static styles: import("lit").CSSResult;
|
|
44
|
+
/**
|
|
45
|
+
* The call object - can be provided via property or context
|
|
46
|
+
*/
|
|
47
|
+
call?: CallControlsCall;
|
|
48
|
+
/**
|
|
49
|
+
* Consume call from context if not provided as property
|
|
50
|
+
*/
|
|
51
|
+
private _contextCall?;
|
|
52
|
+
/**
|
|
53
|
+
* Orientation: horizontal (default) or vertical
|
|
54
|
+
*/
|
|
55
|
+
orientation: 'horizontal' | 'vertical';
|
|
56
|
+
/**
|
|
57
|
+
* Show tooltips on hover
|
|
58
|
+
*/
|
|
59
|
+
showTooltips: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Current audio muted state
|
|
62
|
+
*/
|
|
63
|
+
private _audioMuted;
|
|
64
|
+
/**
|
|
65
|
+
* Current video muted state
|
|
66
|
+
*/
|
|
67
|
+
private _videoMuted;
|
|
68
|
+
/**
|
|
69
|
+
* Current screen share status
|
|
70
|
+
*/
|
|
71
|
+
private _screenShareStatus;
|
|
72
|
+
/**
|
|
73
|
+
* Available capabilities
|
|
74
|
+
*/
|
|
75
|
+
private _capabilities;
|
|
76
|
+
/**
|
|
77
|
+
* Is overflow menu open
|
|
78
|
+
*/
|
|
79
|
+
private _overflowOpen;
|
|
80
|
+
/**
|
|
81
|
+
* RxJS subscriptions for cleanup
|
|
82
|
+
*/
|
|
83
|
+
private subscriptions;
|
|
84
|
+
/**
|
|
85
|
+
* Cached self participant reference for button handlers.
|
|
86
|
+
* Marked as @state() to trigger re-render when self becomes available,
|
|
87
|
+
* enabling the control buttons.
|
|
88
|
+
*/
|
|
89
|
+
private selfParticipant?;
|
|
90
|
+
/**
|
|
91
|
+
* Get the effective call (property or context)
|
|
92
|
+
*/
|
|
93
|
+
private get effectiveCall();
|
|
94
|
+
/**
|
|
95
|
+
* Lifecycle: Component connected to DOM
|
|
96
|
+
*/
|
|
97
|
+
connectedCallback(): void;
|
|
98
|
+
/**
|
|
99
|
+
* Lifecycle: React to property changes
|
|
100
|
+
*/
|
|
101
|
+
protected updated(changedProperties: Map<string, unknown>): void;
|
|
102
|
+
/**
|
|
103
|
+
* Lifecycle: Component disconnected from DOM
|
|
104
|
+
*/
|
|
105
|
+
disconnectedCallback(): void;
|
|
106
|
+
/**
|
|
107
|
+
* Subscribe to call observables
|
|
108
|
+
*/
|
|
109
|
+
private setupSubscriptions;
|
|
110
|
+
/**
|
|
111
|
+
* Cleanup all subscriptions
|
|
112
|
+
*/
|
|
113
|
+
private cleanupSubscriptions;
|
|
114
|
+
/**
|
|
115
|
+
* Check if capability is available
|
|
116
|
+
*/
|
|
117
|
+
private hasCapability;
|
|
118
|
+
/**
|
|
119
|
+
* Handle mute audio toggle
|
|
120
|
+
*/
|
|
121
|
+
private handleMuteAudio;
|
|
122
|
+
/**
|
|
123
|
+
* Handle mute video toggle
|
|
124
|
+
*/
|
|
125
|
+
private handleMuteVideo;
|
|
126
|
+
/**
|
|
127
|
+
* Handle screen share toggle
|
|
128
|
+
*/
|
|
129
|
+
private handleScreenShare;
|
|
130
|
+
/**
|
|
131
|
+
* Handle hangup
|
|
132
|
+
*/
|
|
133
|
+
private handleHangup;
|
|
134
|
+
/**
|
|
135
|
+
* Toggle overflow menu
|
|
136
|
+
*/
|
|
137
|
+
private toggleOverflow;
|
|
138
|
+
/**
|
|
139
|
+
* Get tooltip text for button
|
|
140
|
+
*/
|
|
141
|
+
private getTooltipText;
|
|
142
|
+
/**
|
|
143
|
+
* Render button icon
|
|
144
|
+
*/
|
|
145
|
+
private renderIcon;
|
|
146
|
+
/**
|
|
147
|
+
* Render a control button
|
|
148
|
+
*/
|
|
149
|
+
private renderButton;
|
|
150
|
+
/**
|
|
151
|
+
* Render the component
|
|
152
|
+
*/
|
|
153
|
+
render(): import("lit-html").TemplateResult<1>;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Declare global type for TypeScript
|
|
157
|
+
*/
|
|
158
|
+
declare global {
|
|
159
|
+
interface HTMLElementTagNameMap {
|
|
160
|
+
'sw-call-controls': CallControls;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=call-controls.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"call-controls.d.ts","sourceRoot":"","sources":["../../src/components/call-controls.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAsB,MAAM,KAAK,CAAC;AAKrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAGvC;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,WAAW,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACjC,kBAAkB,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IAC9B,KAAK,CAAC,EAAE,UAAU,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAC3C,aAAa,CAAC,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAOD,qBACa,YAAa,SAAQ,UAAU;IAC1C,MAAM,CAAC,MAAM,0BAmPX;IAEF;;OAEG;IACyB,IAAI,CAAC,EAAE,gBAAgB,CAAC;IAEpD;;OAEG;IAGH,OAAO,CAAC,YAAY,CAAC,CAAmB;IAExC;;OAEG;IACyB,WAAW,EAAE,YAAY,GAAG,UAAU,CAAgB;IAElF;;OAEG;IACsD,YAAY,UAAQ;IAE7E;;OAEG;IACM,OAAO,CAAC,WAAW,CAAS;IAErC;;OAEG;IACM,OAAO,CAAC,WAAW,CAAS;IAErC;;OAEG;IACM,OAAO,CAAC,kBAAkB,CAAiC;IAEpE;;OAEG;IACM,OAAO,CAAC,aAAa,CAAgB;IAE9C;;OAEG;IACM,OAAO,CAAC,aAAa,CAAS;IAEvC;;OAEG;IACH,OAAO,CAAC,aAAa,CAAsB;IAE3C;;;;OAIG;IACM,OAAO,CAAC,eAAe,CAAC,CAAkB;IAEnD;;OAEG;IACH,OAAO,KAAK,aAAa,GAExB;IAED;;OAEG;IACH,iBAAiB;IAKjB;;OAEG;IACH,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAQhE;;OAEG;IACH,oBAAoB;IAKpB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAyE1B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACH,OAAO,CAAC,aAAa;IAQrB;;OAEG;YACW,eAAe;IA0B7B;;OAEG;YACW,eAAe;IA0B7B;;OAEG;YACW,iBAAiB;IA0B/B;;OAEG;YACW,YAAY;IAkB1B;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,cAAc;IAatB;;OAEG;IACH,OAAO,CAAC,UAAU;IAkDlB;;OAEG;IACH,OAAO,CAAC,YAAY;IA6BpB;;OAEG;IACH,MAAM;CAkFP;AAED;;GAEG;AACH,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,kBAAkB,EAAE,YAAY,CAAC;KAClC;CACF"}
|