@ghchinoy/lit-audio-ui 0.5.0 → 0.6.0
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/custom-elements.json +133 -45
- package/dist/components/atoms/ui-audio-next-button.js +9 -13
- package/dist/components/atoms/ui-audio-play-button.js +10 -14
- package/dist/components/atoms/ui-audio-player-error.js +10 -14
- package/dist/components/atoms/ui-audio-prev-button.js +9 -13
- package/dist/components/atoms/ui-audio-progress-slider.js +16 -20
- package/dist/components/atoms/ui-audio-time-display.js +15 -19
- package/dist/components/atoms/ui-audio-volume-slider.js +17 -21
- package/dist/components/atoms/ui-speech-cancel-button.js +5 -5
- package/dist/components/atoms/ui-speech-record-button.js +5 -5
- package/dist/components/atoms/ui-timed-text.js +14 -18
- package/dist/components/atoms/ui-voice-waveform.js +15 -19
- package/dist/components/molecules/ui-live-waveform.js +33 -32
- package/dist/components/molecules/ui-mic-selector.js +14 -18
- package/dist/components/molecules/ui-playlist.js +15 -19
- package/dist/components/molecules/ui-scrolling-waveform.js +30 -29
- package/dist/components/molecules/ui-spectrum-visualizer.js +23 -25
- package/dist/components/molecules/ui-speech-preview.js +16 -20
- package/dist/components/molecules/ui-voice-button.js +25 -29
- package/dist/components/molecules/ui-voice-picker.js +21 -25
- package/dist/components/molecules/ui-voice-pill.js +5 -5
- package/dist/components/molecules/ui-waveform.js +46 -36
- package/dist/components/organisms/ui-audio-player.js +7 -11
- package/dist/components/providers/ui-audio-provider.js +15 -15
- package/dist/components/providers/ui-speech-provider.js +13 -17
- package/dist/index.js +36 -36
- package/dist/node_modules/@chenglou/pretext/dist/analysis.js +456 -0
- package/dist/node_modules/@chenglou/pretext/dist/bidi.js +62 -0
- package/dist/node_modules/@chenglou/pretext/dist/layout.js +190 -0
- package/dist/node_modules/@chenglou/pretext/dist/line-break.js +234 -0
- package/dist/node_modules/@chenglou/pretext/dist/measurement.js +106 -0
- package/dist/scream-audio-ui.umd.js +45 -41
- package/dist/src/components/molecules/ui-waveform.d.ts +7 -1
- package/dist/src/components/providers/ui-audio-provider.d.ts +2 -0
- package/dist/src/utils/audio-utils.d.ts +8 -0
- package/dist/standalone/scream-audio-ui.standalone.js +2644 -1658
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/audio-utils.js +27 -16
- package/package.json +7 -4
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { __decorate as e } from "../../_virtual/_@oxc-project_runtime@0.113.0/helpers/decorate.js";
|
|
2
|
+
import { speechContext as t } from "../../utils/speech-context.js";
|
|
3
3
|
import "@material/web/icon/icon.js";
|
|
4
4
|
import { LitElement as n, css as r, html as i } from "lit";
|
|
5
5
|
import { customElement as a, property as o } from "lit/decorators.js";
|
|
@@ -77,8 +77,8 @@ var c = class extends n {
|
|
|
77
77
|
this._context && (this._context.state === "idle" ? this._context.start() : this._context.state === "recording" && this._context.stop());
|
|
78
78
|
}
|
|
79
79
|
};
|
|
80
|
-
|
|
81
|
-
context:
|
|
80
|
+
e([s({
|
|
81
|
+
context: t,
|
|
82
82
|
subscribe: !0
|
|
83
|
-
})], c.prototype, "_context", void 0),
|
|
83
|
+
})], c.prototype, "_context", void 0), e([o({ type: String })], c.prototype, "size", void 0), c = e([a("ui-speech-record-button")], c);
|
|
84
84
|
export { c as UiSpeechRecordButton };
|
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
import { audioPlayerContext as e } from "../../utils/audio-context.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { __decorate as t } from "../../_virtual/_@oxc-project_runtime@0.113.0/helpers/decorate.js";
|
|
3
|
+
import { LitElement as n, css as r, html as i } from "lit";
|
|
4
|
+
import { customElement as a, property as o } from "lit/decorators.js";
|
|
5
|
+
import { consume as s } from "@lit/context";
|
|
5
6
|
/**
|
|
6
7
|
* Copyright 2026 Google LLC
|
|
7
8
|
*/
|
|
8
|
-
var
|
|
9
|
-
var i = arguments.length, a = i < 3 ? t : r === null ? r = Object.getOwnPropertyDescriptor(t, n) : r, o;
|
|
10
|
-
if (typeof Reflect == "object" && typeof Reflect.decorate == "function") a = Reflect.decorate(e, t, n, r);
|
|
11
|
-
else for (var s = e.length - 1; s >= 0; s--) (o = e[s]) && (a = (i < 3 ? o(a) : i > 3 ? o(t, n, a) : o(t, n)) || a);
|
|
12
|
-
return i > 3 && a && Object.defineProperty(t, n, a), a;
|
|
13
|
-
}, c = class extends t {
|
|
9
|
+
var c = class extends n {
|
|
14
10
|
static {
|
|
15
|
-
this.styles =
|
|
11
|
+
this.styles = r`
|
|
16
12
|
:host {
|
|
17
13
|
display: block;
|
|
18
14
|
font-family: inherit;
|
|
@@ -57,9 +53,9 @@ var s = function(e, t, n, r) {
|
|
|
57
53
|
}
|
|
58
54
|
render() {
|
|
59
55
|
let e = this.playerState?.transcript || [], t = this.playerState?.currentTime || 0;
|
|
60
|
-
return
|
|
56
|
+
return i`
|
|
61
57
|
<slot></slot>
|
|
62
|
-
${e.length > 0 ?
|
|
58
|
+
${e.length > 0 ? i`
|
|
63
59
|
<div class="transcript" part="container">
|
|
64
60
|
${e.map((e) => this._renderWord(e, t))}
|
|
65
61
|
</div>
|
|
@@ -67,18 +63,18 @@ var s = function(e, t, n, r) {
|
|
|
67
63
|
`;
|
|
68
64
|
}
|
|
69
65
|
_renderWord(e, t) {
|
|
70
|
-
let n = t >= e.start && t <= e.end,
|
|
71
|
-
return
|
|
66
|
+
let n = t >= e.start && t <= e.end, r = t > e.end;
|
|
67
|
+
return i`
|
|
72
68
|
<span
|
|
73
|
-
class="word ${n ? "active" : ""} ${
|
|
74
|
-
part="word ${n ? "word-active" : ""} ${
|
|
69
|
+
class="word ${n ? "active" : ""} ${r ? "past" : ""}"
|
|
70
|
+
part="word ${n ? "word-active" : ""} ${r ? "word-past" : ""}"
|
|
75
71
|
>${e.text}</span
|
|
76
72
|
>
|
|
77
73
|
`;
|
|
78
74
|
}
|
|
79
75
|
};
|
|
80
|
-
|
|
76
|
+
t([s({
|
|
81
77
|
context: e,
|
|
82
78
|
subscribe: !0
|
|
83
|
-
}),
|
|
79
|
+
}), o({ attribute: !1 })], c.prototype, "playerState", void 0), c = t([a("ui-timed-text")], c);
|
|
84
80
|
export { c as UiTimedText };
|
|
@@ -1,22 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { __decorate as e } from "../../_virtual/_@oxc-project_runtime@0.113.0/helpers/decorate.js";
|
|
2
|
+
import { speechContext as t } from "../../utils/speech-context.js";
|
|
2
3
|
import "../molecules/ui-live-waveform.js";
|
|
3
|
-
import { LitElement as
|
|
4
|
-
import { customElement as
|
|
5
|
-
import { consume as
|
|
4
|
+
import { LitElement as n, css as r, html as i } from "lit";
|
|
5
|
+
import { customElement as a, property as o } from "lit/decorators.js";
|
|
6
|
+
import { consume as s } from "@lit/context";
|
|
6
7
|
/**
|
|
7
8
|
* Copyright 2026 Google LLC
|
|
8
9
|
*/
|
|
9
|
-
var
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
else for (var s = e.length - 1; s >= 0; s--) (o = e[s]) && (a = (i < 3 ? o(a) : i > 3 ? o(t, n, a) : o(t, n)) || a);
|
|
13
|
-
return i > 3 && a && Object.defineProperty(t, n, a), a;
|
|
14
|
-
}, c = class extends t {
|
|
15
|
-
constructor() {
|
|
16
|
-
super(...arguments), this.barWidth = 2, this.barGap = 1, this.barColor = "currentColor", this.height = 20;
|
|
10
|
+
var c = class extends n {
|
|
11
|
+
constructor(...e) {
|
|
12
|
+
super(...e), this.barWidth = 2, this.barGap = 1, this.barColor = "currentColor", this.height = 20;
|
|
17
13
|
}
|
|
18
14
|
static {
|
|
19
|
-
this.styles =
|
|
15
|
+
this.styles = r`
|
|
20
16
|
:host {
|
|
21
17
|
display: block;
|
|
22
18
|
width: 100%;
|
|
@@ -24,9 +20,9 @@ var s = function(e, t, n, r) {
|
|
|
24
20
|
`;
|
|
25
21
|
}
|
|
26
22
|
render() {
|
|
27
|
-
if (!this._context) return
|
|
23
|
+
if (!this._context) return i``;
|
|
28
24
|
let e = this._context.state === "recording", t = this._context.state === "processing" || this._context.state === "connecting";
|
|
29
|
-
return e || t ?
|
|
25
|
+
return e || t ? i`
|
|
30
26
|
<ui-live-waveform
|
|
31
27
|
.active=${e}
|
|
32
28
|
.processing=${t}
|
|
@@ -36,11 +32,11 @@ var s = function(e, t, n, r) {
|
|
|
36
32
|
.barColor=${this.barColor}
|
|
37
33
|
.height=${this.height}
|
|
38
34
|
></ui-live-waveform>
|
|
39
|
-
` :
|
|
35
|
+
` : i``;
|
|
40
36
|
}
|
|
41
37
|
};
|
|
42
|
-
|
|
43
|
-
context:
|
|
38
|
+
e([s({
|
|
39
|
+
context: t,
|
|
44
40
|
subscribe: !0
|
|
45
|
-
})], c.prototype, "_context", void 0),
|
|
41
|
+
})], c.prototype, "_context", void 0), e([o({ type: Number })], c.prototype, "barWidth", void 0), e([o({ type: Number })], c.prototype, "barGap", void 0), e([o({ type: String })], c.prototype, "barColor", void 0), e([o({ type: Number })], c.prototype, "height", void 0), c = e([a("ui-voice-waveform")], c);
|
|
46
42
|
export { c as UiVoiceWaveform };
|
|
@@ -1,20 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { __decorate as e } from "../../_virtual/_@oxc-project_runtime@0.113.0/helpers/decorate.js";
|
|
2
|
+
import { applyCanvasEdgeFade as t, getNormalizedFrequencyData as n } from "../../utils/audio-utils.js";
|
|
3
|
+
import { LitElement as r, css as i, html as a } from "lit";
|
|
4
|
+
import { customElement as o, property as s, query as c } from "lit/decorators.js";
|
|
4
5
|
/**
|
|
5
6
|
* Copyright 2026 Google LLC
|
|
6
7
|
*/
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
else for (var s = e.length - 1; s >= 0; s--) (o = e[s]) && (a = (i < 3 ? o(a) : i > 3 ? o(t, n, a) : o(t, n)) || a);
|
|
11
|
-
return i > 3 && a && Object.defineProperty(t, n, a), a;
|
|
12
|
-
}, l = class extends n {
|
|
13
|
-
constructor() {
|
|
14
|
-
super(...arguments), this.active = !1, this.processing = !1, this.barWidth = 3, this.barHeight = 4, this.barGap = 1, this.barRadius = 1.5, this.fadeEdges = !0, this.fadeWidth = 24, this.sensitivity = 1, this.updateRate = 30, this._animationFrameId = 0, this._lastUpdateTime = 0, this._currentBars = [], this._processingTime = 0, this._transitionProgress = 0, this._lastActiveData = [];
|
|
8
|
+
var l = class extends r {
|
|
9
|
+
constructor(...e) {
|
|
10
|
+
super(...e), this.active = !1, this.processing = !1, this.barWidth = 3, this.barHeight = 4, this.barGap = 1, this.barRadius = 1.5, this.fadeEdges = !0, this.fadeWidth = 24, this.sensitivity = 1, this.updateRate = 30, this._animationFrameId = 0, this._lastUpdateTime = 0, this._currentBars = [], this._processingTime = 0, this._transitionProgress = 0, this._lastActiveData = [];
|
|
15
11
|
}
|
|
16
12
|
static {
|
|
17
|
-
this.styles =
|
|
13
|
+
this.styles = i`
|
|
18
14
|
:host {
|
|
19
15
|
display: block;
|
|
20
16
|
width: 100%;
|
|
@@ -36,7 +32,7 @@ var c = function(e, t, n, r) {
|
|
|
36
32
|
`;
|
|
37
33
|
}
|
|
38
34
|
render() {
|
|
39
|
-
return
|
|
35
|
+
return a`
|
|
40
36
|
<div class="container" style="height: ${this.height === void 0 ? "100%" : typeof this.height == "number" || !isNaN(Number(this.height)) ? `${this.height}px` : this.height};">
|
|
41
37
|
<canvas></canvas>
|
|
42
38
|
</div>
|
|
@@ -72,12 +68,12 @@ var c = function(e, t, n, r) {
|
|
|
72
68
|
this._animationFrameId = requestAnimationFrame(e);
|
|
73
69
|
}
|
|
74
70
|
_updateData(e) {
|
|
75
|
-
if (!this.
|
|
76
|
-
let
|
|
71
|
+
if (!this._container) return;
|
|
72
|
+
let t = this._container.getBoundingClientRect(), r = Math.floor(t.width / (this.barWidth + this.barGap));
|
|
77
73
|
if (this.active && this.analyserNode && this._dataArray) {
|
|
78
74
|
if (e - this._lastUpdateTime > this.updateRate) {
|
|
79
75
|
this._lastUpdateTime = e;
|
|
80
|
-
let
|
|
76
|
+
let t = n(this.analyserNode, this._dataArray), i = Math.floor(t.length * .05), a = Math.floor(t.length * .4), o = t.slice(i, a), s = Math.floor(r / 2), c = Array(r).fill(.05), l = o.length - 1;
|
|
81
77
|
for (let e = 0; e <= s; e++) {
|
|
82
78
|
let t = e / s, n = o[Math.floor(t * l)] || 0;
|
|
83
79
|
t > .8 && (n *= 1 - (t - .8) * 5);
|
|
@@ -106,26 +102,31 @@ var c = function(e, t, n, r) {
|
|
|
106
102
|
}
|
|
107
103
|
_renderFrame() {
|
|
108
104
|
if (!this._canvas) return;
|
|
109
|
-
let
|
|
110
|
-
if (!
|
|
111
|
-
let n = this.
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
105
|
+
let e = this._canvas.getContext("2d");
|
|
106
|
+
if (!e) return;
|
|
107
|
+
let n = window.devicePixelRatio || 1, r = this._container.getBoundingClientRect();
|
|
108
|
+
if (r.width === 0 || r.height === 0) {
|
|
109
|
+
this._animationFrameId = requestAnimationFrame(() => this._renderFrame());
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
let i = Math.round(r.width * n), a = Math.round(r.height * n);
|
|
113
|
+
this._canvas.width !== i || this._canvas.height !== a ? (this._canvas.width = i, this._canvas.height = a, this._canvas.style.width = `${r.width}px`, this._canvas.style.height = `${r.height}px`, e.scale(n, n)) : e.clearRect(0, 0, r.width, r.height);
|
|
114
|
+
let o = getComputedStyle(this), s = this.barColor || "currentColor";
|
|
115
|
+
if (s.startsWith("var(")) {
|
|
116
|
+
let e = s.match(/var\(([^,)]+)/)?.[1].trim();
|
|
116
117
|
if (e) {
|
|
117
|
-
let t =
|
|
118
|
-
t && (
|
|
118
|
+
let t = o.getPropertyValue(e).trim();
|
|
119
|
+
t && (s = t);
|
|
119
120
|
}
|
|
120
121
|
}
|
|
121
|
-
(
|
|
122
|
-
let
|
|
123
|
-
for (let
|
|
124
|
-
let
|
|
125
|
-
|
|
122
|
+
(s === "currentColor" || !s) && (s = o.getPropertyValue("--md-sys-color-primary").trim() || "#0066cc");
|
|
123
|
+
let c = this.barWidth + this.barGap, l = Math.floor(r.width / c), u = r.height / 2;
|
|
124
|
+
for (let t = 0; t < l && t < this._currentBars.length; t++) {
|
|
125
|
+
let n = this._currentBars[t] || .05, i = t * c, a = Math.max(this.barHeight, n * r.height * .8), o = u - a / 2;
|
|
126
|
+
e.fillStyle = s, e.globalAlpha = .6 + n * .4, this.barRadius > 0 ? (e.beginPath(), e.roundRect(i, o, this.barWidth, a, this.barRadius), e.fill()) : e.fillRect(i, o, this.barWidth, a);
|
|
126
127
|
}
|
|
127
|
-
this.fadeEdges && e
|
|
128
|
+
this.fadeEdges && t(e, r.width, r.height, this.fadeWidth), e.globalAlpha = 1;
|
|
128
129
|
}
|
|
129
130
|
};
|
|
130
|
-
|
|
131
|
+
e([s({ type: Boolean })], l.prototype, "active", void 0), e([s({ type: Boolean })], l.prototype, "processing", void 0), e([s({ attribute: !1 })], l.prototype, "analyserNode", void 0), e([s({ type: Number })], l.prototype, "barWidth", void 0), e([s({ type: Number })], l.prototype, "barHeight", void 0), e([s({ type: Number })], l.prototype, "barGap", void 0), e([s({ type: Number })], l.prototype, "barRadius", void 0), e([s({ type: String })], l.prototype, "barColor", void 0), e([s({ type: Boolean })], l.prototype, "fadeEdges", void 0), e([s({ type: Number })], l.prototype, "fadeWidth", void 0), e([s()], l.prototype, "height", void 0), e([s({ type: Number })], l.prototype, "sensitivity", void 0), e([s({ type: Number })], l.prototype, "updateRate", void 0), e([c("canvas")], l.prototype, "_canvas", void 0), e([c(".container")], l.prototype, "_container", void 0), l = e([o("ui-live-waveform")], l);
|
|
131
132
|
export { l as UiLiveWaveform };
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { __decorate as e } from "../../_virtual/_@oxc-project_runtime@0.113.0/helpers/decorate.js";
|
|
1
2
|
import "./ui-live-waveform.js";
|
|
2
3
|
import "@material/web/icon/icon.js";
|
|
3
|
-
import { LitElement as
|
|
4
|
-
import { customElement as
|
|
4
|
+
import { LitElement as t, css as n, html as r } from "lit";
|
|
5
|
+
import { customElement as i, property as a, query as o, state as s } from "lit/decorators.js";
|
|
5
6
|
import "@material/web/menu/menu.js";
|
|
6
7
|
import "@material/web/menu/menu-item.js";
|
|
7
8
|
import "@material/web/divider/divider.js";
|
|
@@ -22,19 +23,14 @@ import "@material/web/button/filled-tonal-button.js";
|
|
|
22
23
|
* See the License for the specific language governing permissions and
|
|
23
24
|
* limitations under the License.
|
|
24
25
|
*/
|
|
25
|
-
var
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
else for (var s = e.length - 1; s >= 0; s--) (o = e[s]) && (a = (i < 3 ? o(a) : i > 3 ? o(t, n, a) : o(t, n)) || a);
|
|
29
|
-
return i > 3 && a && Object.defineProperty(t, n, a), a;
|
|
30
|
-
}, c = class extends e {
|
|
31
|
-
constructor() {
|
|
32
|
-
super(...arguments), this.muted = !1, this.disabled = !1, this._devices = [], this._loading = !0, this._error = null, this._hasPermission = !1, this._isMenuOpen = !1, this._handleDeviceChange = () => {
|
|
26
|
+
var c = class extends t {
|
|
27
|
+
constructor(...e) {
|
|
28
|
+
super(...e), this.muted = !1, this.disabled = !1, this._devices = [], this._loading = !0, this._error = null, this._hasPermission = !1, this._isMenuOpen = !1, this._handleDeviceChange = () => {
|
|
33
29
|
this._hasPermission ? this._loadDevicesWithPermission() : this._loadDevicesWithoutPermission();
|
|
34
30
|
};
|
|
35
31
|
}
|
|
36
32
|
static {
|
|
37
|
-
this.styles =
|
|
33
|
+
this.styles = n`
|
|
38
34
|
:host {
|
|
39
35
|
display: inline-block;
|
|
40
36
|
position: relative;
|
|
@@ -141,7 +137,7 @@ var s = function(e, t, n, r) {
|
|
|
141
137
|
}
|
|
142
138
|
render() {
|
|
143
139
|
let e = this._devices.find((e) => e.deviceId === this.value) || this._devices[0] || { label: this._loading ? "Loading..." : "No microphone" };
|
|
144
|
-
return
|
|
140
|
+
return r`
|
|
145
141
|
<!-- Anchor Button -->
|
|
146
142
|
<button
|
|
147
143
|
id="anchor-button"
|
|
@@ -166,22 +162,22 @@ var s = function(e, t, n, r) {
|
|
|
166
162
|
@closed=${() => this._isMenuOpen = !1}
|
|
167
163
|
@opened=${() => this._isMenuOpen = !0}
|
|
168
164
|
>
|
|
169
|
-
${this._loading ?
|
|
165
|
+
${this._loading ? r`<md-menu-item disabled
|
|
170
166
|
><div slot="headline">Loading devices...</div></md-menu-item
|
|
171
|
-
>` : this._error ?
|
|
167
|
+
>` : this._error ? r`<md-menu-item disabled
|
|
172
168
|
><div slot="headline" style="color: var(--md-sys-color-error)">
|
|
173
169
|
${this._error}
|
|
174
170
|
</div></md-menu-item
|
|
175
|
-
>` : this._devices.map((e) =>
|
|
171
|
+
>` : this._devices.map((e) => r`
|
|
176
172
|
<md-menu-item
|
|
177
173
|
@click=${() => this._selectDevice(e.deviceId)}
|
|
178
174
|
?selected=${this.value === e.deviceId || !this.value && this._devices[0]?.deviceId === e.deviceId}
|
|
179
175
|
>
|
|
180
176
|
<div slot="headline">${e.label}</div>
|
|
181
|
-
${this.value === e.deviceId || !this.value && this._devices[0]?.deviceId === e.deviceId ?
|
|
177
|
+
${this.value === e.deviceId || !this.value && this._devices[0]?.deviceId === e.deviceId ? r`<md-icon slot="end">check</md-icon>` : ""}
|
|
182
178
|
</md-menu-item>
|
|
183
179
|
`)}
|
|
184
|
-
${this._devices.length > 0 ?
|
|
180
|
+
${this._devices.length > 0 ? r`
|
|
185
181
|
<md-divider></md-divider>
|
|
186
182
|
<div class="menu-footer">
|
|
187
183
|
<md-text-button
|
|
@@ -275,5 +271,5 @@ var s = function(e, t, n, r) {
|
|
|
275
271
|
this._previewStream &&= (this._previewStream.getTracks().forEach((e) => e.stop()), void 0), this._previewAudioContext && this._previewAudioContext.state !== "closed" && (this._previewAudioContext.close(), this._previewAudioContext = void 0), this._previewAnalyser = void 0;
|
|
276
272
|
}
|
|
277
273
|
};
|
|
278
|
-
|
|
274
|
+
e([a({ type: String })], c.prototype, "value", void 0), e([a({ type: Boolean })], c.prototype, "muted", void 0), e([a({ type: Boolean })], c.prototype, "disabled", void 0), e([s()], c.prototype, "_devices", void 0), e([s()], c.prototype, "_loading", void 0), e([s()], c.prototype, "_error", void 0), e([s()], c.prototype, "_hasPermission", void 0), e([s()], c.prototype, "_isMenuOpen", void 0), e([s()], c.prototype, "_previewAnalyser", void 0), e([o("md-menu")], c.prototype, "_menuEl", void 0), c = e([i("ui-mic-selector")], c);
|
|
279
275
|
export { c as UiMicSelector };
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { audioPlayerContext as e } from "../../utils/audio-context.js";
|
|
2
|
+
import { __decorate as t } from "../../_virtual/_@oxc-project_runtime@0.113.0/helpers/decorate.js";
|
|
2
3
|
import "@material/web/icon/icon.js";
|
|
3
|
-
import { LitElement as
|
|
4
|
-
import { customElement as
|
|
5
|
-
import { consume as
|
|
4
|
+
import { LitElement as n, css as r, html as i } from "lit";
|
|
5
|
+
import { customElement as a, property as o } from "lit/decorators.js";
|
|
6
|
+
import { consume as s } from "@lit/context";
|
|
6
7
|
import "@material/web/list/list.js";
|
|
7
8
|
import "@material/web/list/list-item.js";
|
|
8
9
|
/**
|
|
@@ -20,17 +21,12 @@ import "@material/web/list/list-item.js";
|
|
|
20
21
|
* See the License for the specific language governing permissions and
|
|
21
22
|
* limitations under the License.
|
|
22
23
|
*/
|
|
23
|
-
var
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
else for (var s = e.length - 1; s >= 0; s--) (o = e[s]) && (a = (i < 3 ? o(a) : i > 3 ? o(t, n, a) : o(t, n)) || a);
|
|
27
|
-
return i > 3 && a && Object.defineProperty(t, n, a), a;
|
|
28
|
-
}, c = class extends t {
|
|
29
|
-
constructor() {
|
|
30
|
-
super(...arguments), this.header = "Queue", this.emptyText = "No tracks in queue";
|
|
24
|
+
var c = class extends n {
|
|
25
|
+
constructor(...e) {
|
|
26
|
+
super(...e), this.header = "Queue", this.emptyText = "No tracks in queue";
|
|
31
27
|
}
|
|
32
28
|
static {
|
|
33
|
-
this.styles =
|
|
29
|
+
this.styles = r`
|
|
34
30
|
:host {
|
|
35
31
|
display: block;
|
|
36
32
|
background: var(--md-sys-color-surface-container-low, transparent);
|
|
@@ -86,12 +82,12 @@ var s = function(e, t, n, r) {
|
|
|
86
82
|
}
|
|
87
83
|
render() {
|
|
88
84
|
let e = this.playerState?.items || [], t = this.playerState?.currentIndex ?? -1;
|
|
89
|
-
return
|
|
85
|
+
return i`
|
|
90
86
|
<div class="playlist-header">${this.header}</div>
|
|
91
87
|
|
|
92
|
-
${e.length === 0 ?
|
|
88
|
+
${e.length === 0 ? i`<div class="empty-state">${this.emptyText}</div>` : i`
|
|
93
89
|
<md-list>
|
|
94
|
-
${e.map((e, n) =>
|
|
90
|
+
${e.map((e, n) => i`
|
|
95
91
|
<md-list-item
|
|
96
92
|
?selected=${n === t}
|
|
97
93
|
@click=${() => this.playerState?.select(n)}
|
|
@@ -102,9 +98,9 @@ var s = function(e, t, n, r) {
|
|
|
102
98
|
<div slot="supporting-text">
|
|
103
99
|
${e.artist || "Unknown Artist"}
|
|
104
100
|
</div>
|
|
105
|
-
${n === t ?
|
|
101
|
+
${n === t ? i`<md-icon slot="start" class="now-playing-icon"
|
|
106
102
|
>${this.playerState?.isPlaying ? "graphic_eq" : "play_arrow"}</md-icon
|
|
107
|
-
>` :
|
|
103
|
+
>` : i`<md-icon slot="start">music_note</md-icon>`}
|
|
108
104
|
</md-list-item>
|
|
109
105
|
`)}
|
|
110
106
|
</md-list>
|
|
@@ -112,8 +108,8 @@ var s = function(e, t, n, r) {
|
|
|
112
108
|
`;
|
|
113
109
|
}
|
|
114
110
|
};
|
|
115
|
-
|
|
111
|
+
t([s({
|
|
116
112
|
context: e,
|
|
117
113
|
subscribe: !0
|
|
118
|
-
})], c.prototype, "playerState", void 0),
|
|
114
|
+
})], c.prototype, "playerState", void 0), t([o({ type: String })], c.prototype, "header", void 0), t([o({ type: String })], c.prototype, "emptyText", void 0), c = t([a("ui-playlist")], c);
|
|
119
115
|
export { c as UiPlaylist };
|
|
@@ -1,17 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
return i > 3 && a && Object.defineProperty(t, n, a), a;
|
|
9
|
-
}, c = class extends t {
|
|
10
|
-
constructor() {
|
|
11
|
-
super(...arguments), this.speed = 50, this.barCount = 60, this.barWidth = 4, this.barHeight = 4, this.barGap = 2, this.barRadius = 2, this.fadeEdges = !0, this.fadeWidth = 24, this.align = "center", this.active = !0, this._animationFrameId = 0, this._lastTime = 0, this._bars = [], this._seed = Math.random(), this._dataIndex = 0;
|
|
1
|
+
import { __decorate as e } from "../../_virtual/_@oxc-project_runtime@0.113.0/helpers/decorate.js";
|
|
2
|
+
import { applyCanvasEdgeFade as t } from "../../utils/audio-utils.js";
|
|
3
|
+
import { LitElement as n, css as r, html as i } from "lit";
|
|
4
|
+
import { customElement as a, property as o, query as s } from "lit/decorators.js";
|
|
5
|
+
var c = class extends n {
|
|
6
|
+
constructor(...e) {
|
|
7
|
+
super(...e), this.speed = 50, this.barCount = 60, this.barWidth = 4, this.barHeight = 4, this.barGap = 2, this.barRadius = 2, this.fadeEdges = !0, this.fadeWidth = 24, this.align = "center", this.active = !0, this._animationFrameId = 0, this._lastTime = 0, this._bars = [], this._seed = Math.random(), this._dataIndex = 0;
|
|
12
8
|
}
|
|
13
9
|
static {
|
|
14
|
-
this.styles =
|
|
10
|
+
this.styles = r`
|
|
15
11
|
:host {
|
|
16
12
|
display: block;
|
|
17
13
|
width: 100%;
|
|
@@ -34,7 +30,7 @@ var s = function(e, t, n, r) {
|
|
|
34
30
|
`;
|
|
35
31
|
}
|
|
36
32
|
render() {
|
|
37
|
-
return
|
|
33
|
+
return i`
|
|
38
34
|
<div class="container" style="height: ${this.height === void 0 ? "100%" : typeof this.height == "number" || !isNaN(Number(this.height)) ? `${this.height}px` : this.height};">
|
|
39
35
|
<canvas></canvas>
|
|
40
36
|
</div>
|
|
@@ -69,20 +65,25 @@ var s = function(e, t, n, r) {
|
|
|
69
65
|
}
|
|
70
66
|
_startAnimation() {
|
|
71
67
|
this._lastTime = performance.now();
|
|
72
|
-
let
|
|
68
|
+
let e = (n) => {
|
|
73
69
|
if (!this._canvas) return;
|
|
74
70
|
let r = this._canvas.getContext("2d");
|
|
75
71
|
if (!r) return;
|
|
76
72
|
let i = this._lastTime ? (n - this._lastTime) / 1e3 : 0;
|
|
77
73
|
this._lastTime = n;
|
|
78
|
-
let a = this.
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
74
|
+
let a = window.devicePixelRatio || 1, o = this._container.getBoundingClientRect();
|
|
75
|
+
if (o.width === 0 || o.height === 0) {
|
|
76
|
+
this._animationFrameId = requestAnimationFrame(e);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
let s = Math.round(o.width * a), c = Math.round(o.height * a);
|
|
80
|
+
this._canvas.width !== s || this._canvas.height !== c ? (this._canvas.width = s, this._canvas.height = c, this._canvas.style.width = `${o.width}px`, this._canvas.style.height = `${o.height}px`, r.scale(a, a)) : r.clearRect(0, 0, o.width, o.height);
|
|
81
|
+
let l = this.barColor;
|
|
82
|
+
l ||= getComputedStyle(this).getPropertyValue("--md-sys-color-primary").trim() || "#0066cc";
|
|
83
|
+
let u = this.barWidth + this.barGap, d = this.active ? this.speed : 0;
|
|
84
|
+
for (let e = 0; e < this._bars.length; e++) this._bars[e].x -= d * i, this.active || (this._bars[e].height += (.05 - this._bars[e].height) * .15);
|
|
85
|
+
for (this._bars = this._bars.filter((e) => e.x + this.barWidth > -u); this._bars.length === 0 || this._bars[this._bars.length - 1].x < o.width;) {
|
|
86
|
+
let e = this._bars[this._bars.length - 1], t = e ? e.x + u : o.width, n, r = this.peaks && this.peaks.length > 0 ? this.peaks : this.data;
|
|
86
87
|
if (r && r.length > 0) n = r[this._dataIndex % r.length] || .1, this._dataIndex = (this._dataIndex + 1) % r.length;
|
|
87
88
|
else if (this.analyserNode) {
|
|
88
89
|
(!this._dataArray || this._dataArray.length !== this.analyserNode.frequencyBinCount) && (this._dataArray = new Uint8Array(this.analyserNode.frequencyBinCount)), this.analyserNode.getByteFrequencyData(this._dataArray);
|
|
@@ -99,15 +100,15 @@ var s = function(e, t, n, r) {
|
|
|
99
100
|
height: n
|
|
100
101
|
}), this._bars.length > this.barCount * 2) break;
|
|
101
102
|
}
|
|
102
|
-
let
|
|
103
|
-
for (let e of this._bars) if (e.x <
|
|
104
|
-
let t = Math.max(this.barHeight, e.height *
|
|
105
|
-
r.fillStyle =
|
|
103
|
+
let f = o.height / 2;
|
|
104
|
+
for (let e of this._bars) if (e.x < o.width && e.x + this.barWidth > 0) {
|
|
105
|
+
let t = Math.max(this.barHeight, e.height * o.height * .8), n = f - t / 2;
|
|
106
|
+
r.fillStyle = l, r.globalAlpha = .6 + e.height * .4, this.barRadius > 0 ? (r.beginPath(), r.roundRect(e.x, n, this.barWidth, t, this.barRadius), r.fill()) : r.fillRect(e.x, n, this.barWidth, t);
|
|
106
107
|
}
|
|
107
|
-
r.globalAlpha = 1, this.fadeEdges && this.fadeWidth > 0 &&
|
|
108
|
+
r.globalAlpha = 1, this.fadeEdges && this.fadeWidth > 0 && t(r, o.width, o.height, this.fadeWidth), this._animationFrameId = requestAnimationFrame(e);
|
|
108
109
|
};
|
|
109
|
-
this._animationFrameId = requestAnimationFrame(
|
|
110
|
+
this._animationFrameId = requestAnimationFrame(e);
|
|
110
111
|
}
|
|
111
112
|
};
|
|
112
|
-
|
|
113
|
+
e([o({ type: Number })], c.prototype, "speed", void 0), e([o({ type: Number })], c.prototype, "barCount", void 0), e([o({ type: Number })], c.prototype, "barWidth", void 0), e([o({ type: Number })], c.prototype, "barHeight", void 0), e([o({ type: Number })], c.prototype, "barGap", void 0), e([o({ type: Number })], c.prototype, "barRadius", void 0), e([o({ type: String })], c.prototype, "barColor", void 0), e([o({ type: Boolean })], c.prototype, "fadeEdges", void 0), e([o({ type: Number })], c.prototype, "fadeWidth", void 0), e([o()], c.prototype, "height", void 0), e([o({ type: String })], c.prototype, "align", void 0), e([o({ type: Array })], c.prototype, "data", void 0), e([o({ type: Array })], c.prototype, "peaks", void 0), e([o({ attribute: !1 })], c.prototype, "analyserNode", void 0), e([o({ type: Boolean })], c.prototype, "active", void 0), e([s("canvas")], c.prototype, "_canvas", void 0), e([s(".container")], c.prototype, "_container", void 0), c = e([a("ui-scrolling-waveform")], c);
|
|
113
114
|
export { c as UiScrollingWaveform };
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { audioPlayerContext as e } from "../../utils/audio-context.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
2
|
+
import { __decorate as t } from "../../_virtual/_@oxc-project_runtime@0.113.0/helpers/decorate.js";
|
|
3
|
+
import { getNormalizedFrequencyData as n } from "../../utils/audio-utils.js";
|
|
4
|
+
import { LitElement as r, css as i, html as a } from "lit";
|
|
5
|
+
import { customElement as o, property as s, query as c } from "lit/decorators.js";
|
|
6
|
+
import { consume as l } from "@lit/context";
|
|
6
7
|
/**
|
|
7
8
|
* Copyright 2026 Google LLC
|
|
8
9
|
*
|
|
@@ -18,17 +19,12 @@ import { consume as c } from "@lit/context";
|
|
|
18
19
|
* See the License for the specific language governing permissions and
|
|
19
20
|
* limitations under the License.
|
|
20
21
|
*/
|
|
21
|
-
var
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
else for (var s = e.length - 1; s >= 0; s--) (o = e[s]) && (a = (i < 3 ? o(a) : i > 3 ? o(t, n, a) : o(t, n)) || a);
|
|
25
|
-
return i > 3 && a && Object.defineProperty(t, n, a), a;
|
|
26
|
-
}, u = class extends n {
|
|
27
|
-
constructor() {
|
|
28
|
-
super(...arguments), this.barWidth = 4, this.barGap = 2, this._animationFrameId = 0;
|
|
22
|
+
var u = class extends r {
|
|
23
|
+
constructor(...e) {
|
|
24
|
+
super(...e), this.barWidth = 4, this.barGap = 2, this._animationFrameId = 0;
|
|
29
25
|
}
|
|
30
26
|
static {
|
|
31
|
-
this.styles =
|
|
27
|
+
this.styles = i`
|
|
32
28
|
:host {
|
|
33
29
|
display: block;
|
|
34
30
|
width: 100%;
|
|
@@ -43,7 +39,7 @@ var l = function(e, t, n, r) {
|
|
|
43
39
|
`;
|
|
44
40
|
}
|
|
45
41
|
render() {
|
|
46
|
-
return
|
|
42
|
+
return a`<canvas style="height: ${this.height === void 0 ? "100%" : typeof this.height == "number" || !isNaN(Number(this.height)) ? `${this.height}px` : this.height};"></canvas>`;
|
|
47
43
|
}
|
|
48
44
|
firstUpdated() {
|
|
49
45
|
this._startLoop();
|
|
@@ -61,20 +57,22 @@ var l = function(e, t, n, r) {
|
|
|
61
57
|
if (!this._canvas || !this.playerState?.analyserNode) return;
|
|
62
58
|
let e = this.playerState.analyserNode;
|
|
63
59
|
this._dataArray ||= new Uint8Array(e.frequencyBinCount);
|
|
64
|
-
let
|
|
65
|
-
if (!
|
|
66
|
-
let r = this.
|
|
67
|
-
|
|
68
|
-
let
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
60
|
+
let t = this._canvas.getContext("2d");
|
|
61
|
+
if (!t) return;
|
|
62
|
+
let r = this.getBoundingClientRect();
|
|
63
|
+
if (r.width === 0 || r.height === 0) return;
|
|
64
|
+
let i = window.devicePixelRatio || 1, a = Math.round(r.width * i), o = Math.round(r.height * i);
|
|
65
|
+
this._canvas.width !== a || this._canvas.height !== o ? (this._canvas.width = a, this._canvas.height = o, this._canvas.style.width = `${r.width}px`, this._canvas.style.height = `${r.height}px`, t.scale(i, i)) : t.clearRect(0, 0, r.width, r.height);
|
|
66
|
+
let s = n(e, this._dataArray), c = this.barWidth + this.barGap, l = Math.floor(r.width / c), u = getComputedStyle(this), d = this.color;
|
|
67
|
+
d ||= u.getPropertyValue("--md-sys-color-primary").trim() || "#0066cc", t.fillStyle = d;
|
|
68
|
+
for (let e = 0; e < l; e++) {
|
|
69
|
+
let n = (s[Math.floor(e / l * (s.length * .6))] || 0) * r.height, i = e * c, a = r.height - n;
|
|
70
|
+
t.fillRect(i, a, this.barWidth, n);
|
|
73
71
|
}
|
|
74
72
|
}
|
|
75
73
|
};
|
|
76
|
-
|
|
74
|
+
t([l({
|
|
77
75
|
context: e,
|
|
78
76
|
subscribe: !0
|
|
79
|
-
})], u.prototype, "playerState", void 0),
|
|
77
|
+
})], u.prototype, "playerState", void 0), t([s({ type: Number })], u.prototype, "barWidth", void 0), t([s({ type: Number })], u.prototype, "barGap", void 0), t([s()], u.prototype, "height", void 0), t([s({ type: String })], u.prototype, "color", void 0), t([c("canvas")], u.prototype, "_canvas", void 0), u = t([o("ui-spectrum-visualizer")], u);
|
|
80
78
|
export { u as UiSpectrumVisualizer };
|