@moq/watch 0.2.11 → 0.2.13
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 +7 -7
- package/audio/buffer.d.ts +1 -1
- package/audio/buffer.d.ts.map +1 -1
- package/audio/decoder.d.ts +1 -1
- package/audio/decoder.d.ts.map +1 -1
- package/audio/render.d.ts +1 -1
- package/audio/render.d.ts.map +1 -1
- package/audio/ring-buffer.d.ts +1 -1
- package/audio/ring-buffer.d.ts.map +1 -1
- package/audio/shared-ring-buffer.d.ts +1 -1
- package/audio/shared-ring-buffer.d.ts.map +1 -1
- package/audio/source.d.ts.map +1 -1
- package/backend.d.ts +1 -1
- package/backend.d.ts.map +1 -1
- package/{broadcast-b74Ew4Ql.js → broadcast-CLjMphZS.js} +1108 -1013
- package/broadcast-CLjMphZS.js.map +1 -0
- package/broadcast.d.ts +4 -3
- package/broadcast.d.ts.map +1 -1
- package/chat/index.d.ts +1 -1
- package/chat/index.d.ts.map +1 -1
- package/chat/message.d.ts +1 -1
- package/chat/message.d.ts.map +1 -1
- package/chat/typing.d.ts +1 -1
- package/chat/typing.d.ts.map +1 -1
- package/dom-BsFrLb_F.js +35 -0
- package/dom-BsFrLb_F.js.map +1 -0
- package/element.d.ts +4 -4
- package/element.d.ts.map +1 -1
- package/element.js +43 -32
- package/element.js.map +1 -1
- package/index.d.ts +3 -1
- package/index.d.ts.map +1 -1
- package/index.js +22 -20
- package/index.js.map +1 -1
- package/libav-opus-af-BlMWboA7.js.map +1 -1
- package/location/index.d.ts +1 -1
- package/location/index.d.ts.map +1 -1
- package/location/peers.d.ts +1 -1
- package/location/peers.d.ts.map +1 -1
- package/location/window.d.ts +1 -1
- package/location/window.d.ts.map +1 -1
- package/main-DGBFe0O7.js.map +1 -1
- package/package.json +8 -9
- package/preview.d.ts +1 -1
- package/preview.d.ts.map +1 -1
- package/support/element.js +49 -60
- package/support/element.js.map +1 -1
- package/sync.d.ts +2 -2
- package/sync.d.ts.map +1 -1
- package/ui/components/buffer-control.d.ts +5 -0
- package/ui/components/buffer-control.d.ts.map +1 -0
- package/ui/components/buffering-indicator.d.ts +4 -0
- package/ui/components/buffering-indicator.d.ts.map +1 -0
- package/ui/components/fullscreen-button.d.ts +4 -0
- package/ui/components/fullscreen-button.d.ts.map +1 -0
- package/ui/components/offline-indicator.d.ts +4 -0
- package/ui/components/offline-indicator.d.ts.map +1 -0
- package/ui/components/play-pause.d.ts +4 -0
- package/ui/components/play-pause.d.ts.map +1 -0
- package/ui/components/quality-selector.d.ts +4 -0
- package/ui/components/quality-selector.d.ts.map +1 -0
- package/ui/components/stats-button.d.ts +3 -0
- package/ui/components/stats-button.d.ts.map +1 -0
- package/ui/components/volume-slider.d.ts +4 -0
- package/ui/components/volume-slider.d.ts.map +1 -0
- package/ui/components/watch-status-indicator.d.ts +4 -0
- package/ui/components/watch-status-indicator.d.ts.map +1 -0
- package/ui/element.d.ts +11 -4
- package/ui/element.d.ts.map +1 -1
- package/ui/element.js +382 -0
- package/ui/element.js.map +1 -0
- package/ui/icons.d.ts +16 -0
- package/ui/icons.d.ts.map +1 -0
- package/ui/stats.d.ts +4 -0
- package/ui/stats.d.ts.map +1 -0
- package/video/backend.d.ts +1 -1
- package/video/backend.d.ts.map +1 -1
- package/video/decoder.d.ts +1 -1
- package/video/decoder.d.ts.map +1 -1
- package/video/mse.d.ts +1 -1
- package/video/mse.d.ts.map +1 -1
- package/video/renderer.d.ts +1 -1
- package/video/renderer.d.ts.map +1 -1
- package/video/source.d.ts +2 -0
- package/video/source.d.ts.map +1 -1
- package/broadcast-b74Ew4Ql.js.map +0 -1
- package/ui/components/BufferControl.d.ts +0 -8
- package/ui/components/BufferControl.d.ts.map +0 -1
- package/ui/components/BufferingIndicator.d.ts +0 -2
- package/ui/components/BufferingIndicator.d.ts.map +0 -1
- package/ui/components/FullscreenButton.d.ts +0 -2
- package/ui/components/FullscreenButton.d.ts.map +0 -1
- package/ui/components/PlayPauseButton.d.ts +0 -2
- package/ui/components/PlayPauseButton.d.ts.map +0 -1
- package/ui/components/QualitySelector.d.ts +0 -3
- package/ui/components/QualitySelector.d.ts.map +0 -1
- package/ui/components/StatsButton.d.ts +0 -5
- package/ui/components/StatsButton.d.ts.map +0 -1
- package/ui/components/VolumeSlider.d.ts +0 -2
- package/ui/components/VolumeSlider.d.ts.map +0 -1
- package/ui/components/WatchControls.d.ts +0 -2
- package/ui/components/WatchControls.d.ts.map +0 -1
- package/ui/components/WatchStatusIndicator.d.ts +0 -2
- package/ui/components/WatchStatusIndicator.d.ts.map +0 -1
- package/ui/context.d.ts +0 -44
- package/ui/context.d.ts.map +0 -1
- package/ui/hooks/use-watch-ui.d.ts +0 -3
- package/ui/hooks/use-watch-ui.d.ts.map +0 -1
- package/ui/index.d.ts +0 -7
- package/ui/index.d.ts.map +0 -1
- package/ui/index.js +0 -1065
- package/ui/index.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moq/watch",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.13",
|
|
5
5
|
"description": "Watch Media over QUIC broadcasts",
|
|
6
6
|
"license": "(MIT OR Apache-2.0)",
|
|
7
7
|
"repository": "github:moq-dev/moq",
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
"default": "./element.js"
|
|
16
16
|
},
|
|
17
17
|
"./ui": {
|
|
18
|
-
"types": "./ui/
|
|
19
|
-
"default": "./ui/
|
|
18
|
+
"types": "./ui/element.d.ts",
|
|
19
|
+
"default": "./ui/element.js"
|
|
20
20
|
},
|
|
21
21
|
"./support": {
|
|
22
22
|
"types": "./support/index.d.ts",
|
|
@@ -29,14 +29,13 @@
|
|
|
29
29
|
},
|
|
30
30
|
"sideEffects": [
|
|
31
31
|
"./element.js",
|
|
32
|
-
"./ui/
|
|
32
|
+
"./ui/element.js",
|
|
33
33
|
"./support/element.js"
|
|
34
34
|
],
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@moq/hang": "^0.2.
|
|
37
|
-
"@moq/
|
|
38
|
-
"@moq/msf": "^0.1.
|
|
39
|
-
"@moq/signals": "^0.1.
|
|
40
|
-
"@moq/ui-core": "^0.1.1"
|
|
36
|
+
"@moq/hang": "^0.2.7",
|
|
37
|
+
"@moq/net": "^0.1.2",
|
|
38
|
+
"@moq/msf": "^0.1.1",
|
|
39
|
+
"@moq/signals": "^0.1.7"
|
|
41
40
|
}
|
|
42
41
|
}
|
package/preview.d.ts
CHANGED
package/preview.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../src/preview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,KAAK,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../src/preview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,KAAK,GAAG,MAAM,UAAU,CAAC;AAErC,OAAO,EAAU,MAAM,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,WAAW,YAAY;IAC5B,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;CACpC;AAED,qBAAa,OAAO;;IACnB,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACzB,OAAO;;;;;;;;mBAAsD;gBAM5D,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC,EAC5C,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,EACzC,KAAK,CAAC,EAAE,YAAY;IAiCrB,KAAK;CAGL"}
|
package/support/element.js
CHANGED
|
@@ -1,43 +1,32 @@
|
|
|
1
|
-
import { Signal as
|
|
1
|
+
import { Signal as c, Effect as v } from "@moq/signals";
|
|
2
|
+
import { c as a } from "../dom-BsFrLb_F.js";
|
|
2
3
|
import { isSupported as m } from "./index.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}), l && Object.entries(l).forEach(([r, c]) => {
|
|
10
|
-
n.setAttribute(r, c);
|
|
11
|
-
}), t && t.forEach((r) => {
|
|
12
|
-
typeof r == "string" ? n.appendChild(document.createTextNode(r)) : n.appendChild(r);
|
|
13
|
-
}), Object.assign(n, s), n;
|
|
14
|
-
}
|
|
15
|
-
const g = navigator.userAgent.toLowerCase().includes("firefox"), C = ["show", "details"];
|
|
16
|
-
class y extends HTMLElement {
|
|
17
|
-
#i = new u("warning");
|
|
18
|
-
#e = new u(!1);
|
|
19
|
-
#n = new u(void 0);
|
|
20
|
-
#r = new u(!1);
|
|
4
|
+
const h = navigator.userAgent.toLowerCase().includes("firefox"), C = ["show", "details"];
|
|
5
|
+
class b extends HTMLElement {
|
|
6
|
+
#i = new c("warning");
|
|
7
|
+
#e = new c(!1);
|
|
8
|
+
#n = new c(void 0);
|
|
9
|
+
#o = new c(!1);
|
|
21
10
|
#t;
|
|
22
11
|
static observedAttributes = C;
|
|
23
12
|
constructor() {
|
|
24
13
|
super(), m().then((e) => this.#n.set(e)).catch((e) => console.error("Failed to detect watch support:", e));
|
|
25
14
|
}
|
|
26
15
|
connectedCallback() {
|
|
27
|
-
this.#t = new
|
|
16
|
+
this.#t = new v(), this.#t.run(this.#d.bind(this));
|
|
28
17
|
}
|
|
29
18
|
disconnectedCallback() {
|
|
30
19
|
this.#t?.close(), this.#t = void 0;
|
|
31
20
|
}
|
|
32
|
-
attributeChangedCallback(e, t,
|
|
21
|
+
attributeChangedCallback(e, t, s) {
|
|
33
22
|
if (e === "show") {
|
|
34
|
-
const i =
|
|
23
|
+
const i = s ?? "warning";
|
|
35
24
|
if (i === "always" || i === "warning" || i === "error" || i === "never")
|
|
36
25
|
this.show = i;
|
|
37
26
|
else
|
|
38
27
|
throw new Error(`Invalid show: ${i}`);
|
|
39
28
|
} else if (e === "details")
|
|
40
|
-
this.details =
|
|
29
|
+
this.details = s !== null;
|
|
41
30
|
else {
|
|
42
31
|
const i = e;
|
|
43
32
|
throw new Error(`Invalid attribute: ${i}`);
|
|
@@ -55,27 +44,27 @@ class y extends HTMLElement {
|
|
|
55
44
|
set details(e) {
|
|
56
45
|
this.#e.set(e);
|
|
57
46
|
}
|
|
58
|
-
#
|
|
47
|
+
#r(e) {
|
|
59
48
|
return e.webtransport === "none" || !e.audio.decoding || !e.video.decoding || !e.audio.render || !e.video.render || !Object.values(e.audio.decoding).some((t) => t === !0 || t === "full" || t === "partial") || !Object.values(e.video.decoding).some((t) => t.software || t.hardware) ? "none" : !Object.values(e.audio.decoding).every((t) => t === !0 || t === "full") || !Object.values(e.video.decoding).every((t) => t.software || t.hardware) ? "partial" : "full";
|
|
60
49
|
}
|
|
61
|
-
#
|
|
50
|
+
#d(e) {
|
|
62
51
|
const t = e.get(this.#n);
|
|
63
|
-
if (!t || e.get(this.#
|
|
52
|
+
if (!t || e.get(this.#o)) return;
|
|
64
53
|
const i = e.get(this.#i);
|
|
65
54
|
if (i === "never") return;
|
|
66
|
-
const
|
|
67
|
-
if (i === "warning" &&
|
|
68
|
-
const
|
|
55
|
+
const r = this.#r(t);
|
|
56
|
+
if (i === "warning" && r === "full" || i === "error" && r !== "none") return;
|
|
57
|
+
const n = a("div", {
|
|
69
58
|
style: {
|
|
70
59
|
margin: "0 auto",
|
|
71
60
|
maxWidth: "28rem",
|
|
72
61
|
padding: "1rem"
|
|
73
62
|
}
|
|
74
63
|
});
|
|
75
|
-
this.appendChild(
|
|
64
|
+
this.appendChild(n), e.cleanup(() => this.removeChild(n)), this.#a(n, r, e), e.get(this.#e) && this.#s(n, t, e);
|
|
76
65
|
}
|
|
77
|
-
#a(e, t,
|
|
78
|
-
const i =
|
|
66
|
+
#a(e, t, s) {
|
|
67
|
+
const i = a("div", {
|
|
79
68
|
style: {
|
|
80
69
|
display: "flex",
|
|
81
70
|
flexDirection: "row",
|
|
@@ -84,20 +73,20 @@ class y extends HTMLElement {
|
|
|
84
73
|
justifyContent: "space-between",
|
|
85
74
|
alignItems: "center"
|
|
86
75
|
}
|
|
87
|
-
}),
|
|
76
|
+
}), r = a("div", {
|
|
88
77
|
style: { fontWeight: "bold" }
|
|
89
78
|
});
|
|
90
|
-
t === "full" ?
|
|
91
|
-
const
|
|
79
|
+
t === "full" ? r.textContent = "🟢 Full Browser Support" : t === "partial" ? r.textContent = "🟡 Partial Browser Support" : t === "none" && (r.textContent = "🔴 No Browser Support");
|
|
80
|
+
const n = a("button", {
|
|
92
81
|
type: "button",
|
|
93
82
|
style: { fontSize: "14px" }
|
|
94
83
|
});
|
|
95
|
-
|
|
96
|
-
this.#e.update((
|
|
97
|
-
}),
|
|
98
|
-
|
|
84
|
+
s.event(n, "click", () => {
|
|
85
|
+
this.#e.update((o) => !o);
|
|
86
|
+
}), s.run((o) => {
|
|
87
|
+
n.textContent = o.get(this.#e) ? "Details ➖" : "Details ➕";
|
|
99
88
|
});
|
|
100
|
-
const l =
|
|
89
|
+
const l = a(
|
|
101
90
|
"button",
|
|
102
91
|
{
|
|
103
92
|
type: "button",
|
|
@@ -105,12 +94,12 @@ class y extends HTMLElement {
|
|
|
105
94
|
},
|
|
106
95
|
"Close ❌"
|
|
107
96
|
);
|
|
108
|
-
|
|
109
|
-
this.#
|
|
110
|
-
}), i.appendChild(
|
|
97
|
+
s.event(l, "click", () => {
|
|
98
|
+
this.#o.set(!0);
|
|
99
|
+
}), i.appendChild(r), i.appendChild(n), i.appendChild(l), e.appendChild(i), s.cleanup(() => e.removeChild(i));
|
|
111
100
|
}
|
|
112
|
-
#
|
|
113
|
-
const i =
|
|
101
|
+
#s(e, t, s) {
|
|
102
|
+
const i = a("div", {
|
|
114
103
|
style: {
|
|
115
104
|
display: "grid",
|
|
116
105
|
gridTemplateColumns: "1fr 1fr 1fr",
|
|
@@ -121,8 +110,8 @@ class y extends HTMLElement {
|
|
|
121
110
|
padding: "1rem",
|
|
122
111
|
fontSize: "0.875rem"
|
|
123
112
|
}
|
|
124
|
-
}),
|
|
125
|
-
const
|
|
113
|
+
}), r = (d) => d ? "🟢 Yes" : "🔴 No", n = (d) => d?.hardware ? "🟢 Hardware" : d?.software ? `🟡 Software${h ? "*" : ""}` : "🔴 No", l = (d) => d === "full" ? "🟢 Full" : d === "partial" ? "🟡 Polyfill" : "🔴 None", o = (d, u, g) => {
|
|
114
|
+
const w = a(
|
|
126
115
|
"div",
|
|
127
116
|
{
|
|
128
117
|
style: {
|
|
@@ -131,8 +120,8 @@ class y extends HTMLElement {
|
|
|
131
120
|
textAlign: "right"
|
|
132
121
|
}
|
|
133
122
|
},
|
|
134
|
-
|
|
135
|
-
),
|
|
123
|
+
d
|
|
124
|
+
), p = a(
|
|
136
125
|
"div",
|
|
137
126
|
{
|
|
138
127
|
style: {
|
|
@@ -140,18 +129,18 @@ class y extends HTMLElement {
|
|
|
140
129
|
textAlign: "center"
|
|
141
130
|
}
|
|
142
131
|
},
|
|
143
|
-
|
|
144
|
-
),
|
|
132
|
+
u
|
|
133
|
+
), f = a(
|
|
145
134
|
"div",
|
|
146
135
|
{
|
|
147
136
|
style: { gridColumnStart: "3" }
|
|
148
137
|
},
|
|
149
|
-
|
|
138
|
+
g
|
|
150
139
|
);
|
|
151
|
-
i.appendChild(
|
|
140
|
+
i.appendChild(w), i.appendChild(p), i.appendChild(f);
|
|
152
141
|
};
|
|
153
|
-
if (
|
|
154
|
-
const
|
|
142
|
+
if (o("WebTransport", "", l(t.webtransport)), o("Rendering", "Audio", r(t.audio.render)), o("", "Video", r(t.video.render)), o("Decoding", "Opus", l(t.audio.decoding.opus)), o("", "AAC", r(t.audio.decoding.aac)), o("", "AV1", n(t.video.decoding?.av1)), o("", "H.265", n(t.video.decoding?.h265)), o("", "H.264", n(t.video.decoding?.h264)), o("", "VP9", n(t.video.decoding?.vp9)), o("", "VP8", n(t.video.decoding?.vp8)), h) {
|
|
143
|
+
const d = a(
|
|
155
144
|
"div",
|
|
156
145
|
{
|
|
157
146
|
style: {
|
|
@@ -163,7 +152,7 @@ class y extends HTMLElement {
|
|
|
163
152
|
}
|
|
164
153
|
},
|
|
165
154
|
"Hardware acceleration is ",
|
|
166
|
-
|
|
155
|
+
a(
|
|
167
156
|
"a",
|
|
168
157
|
{
|
|
169
158
|
href: "https://github.com/w3c/webcodecs/issues/896"
|
|
@@ -172,13 +161,13 @@ class y extends HTMLElement {
|
|
|
172
161
|
),
|
|
173
162
|
" on Firefox."
|
|
174
163
|
);
|
|
175
|
-
i.appendChild(
|
|
164
|
+
i.appendChild(d);
|
|
176
165
|
}
|
|
177
|
-
e.appendChild(i),
|
|
166
|
+
e.appendChild(i), s.cleanup(() => e.removeChild(i));
|
|
178
167
|
}
|
|
179
168
|
}
|
|
180
|
-
customElements.define("moq-watch-support",
|
|
169
|
+
customElements.define("moq-watch-support", b);
|
|
181
170
|
export {
|
|
182
|
-
|
|
171
|
+
b as default
|
|
183
172
|
};
|
|
184
173
|
//# sourceMappingURL=element.js.map
|
package/support/element.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"element.js","sources":["../../../signals/src/dom.ts","../../src/support/element.ts"],"sourcesContent":["import type { Effect } from \".\";\n\nexport type CreateOptions<T extends HTMLElement> = {\n\tstyle?: Partial<CSSStyleDeclaration>;\n\tclassName?: string;\n\tclassList?: string[];\n\tid?: string;\n\tdataset?: Record<string, string>;\n\tattributes?: Record<string, string>;\n} & Partial<Omit<T, \"style\" | \"dataset\">>;\n\nexport function create<K extends keyof HTMLElementTagNameMap>(\n\ttagName: K,\n\toptions?: CreateOptions<HTMLElementTagNameMap[K] & HTMLElement>,\n\t...children: (HTMLElement | string)[]\n): HTMLElementTagNameMap[K] {\n\tconst element = document.createElement(tagName);\n\n\tif (!options) return element;\n\n\tconst { style, classList, dataset, attributes, ...props } = options;\n\n\t// Apply styles\n\tif (style) {\n\t\tObject.assign(element.style, style);\n\t}\n\n\t// Apply class list\n\tif (classList) {\n\t\telement.classList.add(...classList);\n\t}\n\n\t// Apply dataset\n\tif (dataset) {\n\t\tObject.entries(dataset).forEach(([key, value]) => {\n\t\t\telement.dataset[key] = value;\n\t\t});\n\t}\n\n\t// Apply attributes\n\tif (attributes) {\n\t\tObject.entries(attributes).forEach(([key, value]) => {\n\t\t\telement.setAttribute(key, value);\n\t\t});\n\t}\n\n\t// Append children\n\tif (children) {\n\t\tchildren.forEach((child) => {\n\t\t\tif (typeof child === \"string\") {\n\t\t\t\telement.appendChild(document.createTextNode(child));\n\t\t\t} else {\n\t\t\t\telement.appendChild(child);\n\t\t\t}\n\t\t});\n\t}\n\n\t// Apply other properties\n\tObject.assign(element, props);\n\n\treturn element;\n}\n\n// Matches solid.js's JSX.Element type.\nexport type Element = Node | ArrayElement | (string & {}) | number | boolean | null | undefined;\ninterface ArrayElement extends Array<Element> {}\n\nexport function render(effect: Effect, parent: Node, element: Element | ((effect: Effect) => Element)) {\n\tconst e = typeof element === \"function\" ? element(effect) : element;\n\tif (e === undefined || e === null) return;\n\n\tlet node: Node;\n\tif (e instanceof Node) {\n\t\tnode = e;\n\t} else if (Array.isArray(e)) {\n\t\tnode = document.createDocumentFragment();\n\t\tfor (const child of e) {\n\t\t\trender(effect, node, child);\n\t\t}\n\t} else if (typeof e === \"number\" || typeof e === \"boolean\" || typeof e === \"string\") {\n\t\tnode = document.createTextNode(e.toString());\n\t} else {\n\t\tconst exhaustive: never = e;\n\t\tthrow new Error(`Invalid element type: ${exhaustive}`);\n\t}\n\n\tparent.appendChild(node);\n\teffect.cleanup(() => parent.removeChild(node));\n}\n\nexport function setClass(effect: Effect, element: HTMLElement, ...classNames: string[]) {\n\tfor (const className of classNames) {\n\t\telement.classList.add(className);\n\t}\n\n\teffect.cleanup(() => {\n\t\tfor (const className of classNames) {\n\t\t\telement.classList.remove(className);\n\t\t}\n\t});\n}\n","import { Effect, Signal } from \"@moq/signals\";\nimport * as DOM from \"@moq/signals/dom\";\nimport { type Codec, type Full, isSupported, type Partial } from \"./\";\n\n// https://bugzilla.mozilla.org/show_bug.cgi?id=1967793\nconst isFirefox = navigator.userAgent.toLowerCase().includes(\"firefox\");\n\nconst OBSERVED = [\"show\", \"details\"] as const;\ntype Observed = (typeof OBSERVED)[number];\n\n// Whether to display the support banner.\n// - \"always\": Always display the banner.\n// - \"warning\": Display the banner if a required feature needs a polyfill/fallback.\n// - \"error\": Display the banner if a required feature is unsupported.\n// - \"never\": Never display the banner.\nexport type Show = \"always\" | \"warning\" | \"error\" | \"never\";\n\nexport default class MoqWatchSupport extends HTMLElement {\n\t#show = new Signal<Show>(\"warning\");\n\t#details = new Signal<boolean>(false);\n\t#support = new Signal<Full | undefined>(undefined);\n\t#close = new Signal<boolean>(false);\n\n\t#signals?: Effect;\n\n\tstatic observedAttributes = OBSERVED;\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tisSupported()\n\t\t\t.then((s) => this.#support.set(s))\n\t\t\t.catch((err) => console.error(\"Failed to detect watch support:\", err));\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#signals = new Effect();\n\t\tthis.#signals.run(this.#render.bind(this));\n\t}\n\n\tdisconnectedCallback() {\n\t\tthis.#signals?.close();\n\t\tthis.#signals = undefined;\n\t}\n\n\tattributeChangedCallback(name: Observed, _oldValue: string | null, newValue: string | null) {\n\t\tif (name === \"show\") {\n\t\t\tconst show = newValue ?? \"warning\";\n\t\t\tif (show === \"always\" || show === \"warning\" || show === \"error\" || show === \"never\") {\n\t\t\t\tthis.show = show;\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Invalid show: ${show}`);\n\t\t\t}\n\t\t} else if (name === \"details\") {\n\t\t\tthis.details = newValue !== null;\n\t\t} else {\n\t\t\tconst exhaustive: never = name;\n\t\t\tthrow new Error(`Invalid attribute: ${exhaustive}`);\n\t\t}\n\t}\n\n\tget show(): Show {\n\t\treturn this.#show.peek();\n\t}\n\n\tset show(show: Show) {\n\t\tthis.#show.set(show);\n\t}\n\n\tget details(): boolean {\n\t\treturn this.#details.peek();\n\t}\n\n\tset details(details: boolean) {\n\t\tthis.#details.set(details);\n\t}\n\n\t#getSummary(support: Full): Partial {\n\t\tif (support.webtransport === \"none\") return \"none\";\n\n\t\tif (!support.audio.decoding || !support.video.decoding) return \"none\";\n\t\tif (!support.audio.render || !support.video.render) return \"none\";\n\n\t\tif (!Object.values(support.audio.decoding).some((v) => v === true || v === \"full\" || v === \"partial\"))\n\t\t\treturn \"none\";\n\t\tif (!Object.values(support.video.decoding).some((v) => v.software || v.hardware)) return \"none\";\n\n\t\tif (!Object.values(support.audio.decoding).every((v) => v === true || v === \"full\")) return \"partial\";\n\t\tif (!Object.values(support.video.decoding).every((v) => v.software || v.hardware)) return \"partial\";\n\n\t\treturn \"full\";\n\t}\n\n\t#render(effect: Effect) {\n\t\tconst support = effect.get(this.#support);\n\t\tif (!support) return;\n\n\t\tconst close = effect.get(this.#close);\n\t\tif (close) return;\n\n\t\tconst show = effect.get(this.#show);\n\t\tif (show === \"never\") return;\n\n\t\tconst summary = this.#getSummary(support);\n\n\t\t// Don't render the banner if we have full support and they only asked for warnings.\n\t\tif (show === \"warning\" && summary === \"full\") return;\n\n\t\t// Don't render the banner if we have at least partial support and they only asked for errors.\n\t\tif (show === \"error\" && summary !== \"none\") return;\n\n\t\tconst container = DOM.create(\"div\", {\n\t\t\tstyle: {\n\t\t\t\tmargin: \"0 auto\",\n\t\t\t\tmaxWidth: \"28rem\",\n\t\t\t\tpadding: \"1rem\",\n\t\t\t},\n\t\t});\n\n\t\tthis.appendChild(container);\n\t\teffect.cleanup(() => this.removeChild(container));\n\n\t\tthis.#renderHeader(container, summary, effect);\n\n\t\tif (effect.get(this.#details)) {\n\t\t\tthis.#renderDetails(container, support, effect);\n\t\t}\n\t}\n\n\t#renderHeader(parent: HTMLDivElement, summary: Partial, effect: Effect) {\n\t\tconst headerDiv = DOM.create(\"div\", {\n\t\t\tstyle: {\n\t\t\t\tdisplay: \"flex\",\n\t\t\t\tflexDirection: \"row\",\n\t\t\t\tgap: \"1rem\",\n\t\t\t\tflexWrap: \"wrap\",\n\t\t\t\tjustifyContent: \"space-between\",\n\t\t\t\talignItems: \"center\",\n\t\t\t},\n\t\t});\n\n\t\tconst statusDiv = DOM.create(\"div\", {\n\t\t\tstyle: { fontWeight: \"bold\" },\n\t\t});\n\n\t\tif (summary === \"full\") {\n\t\t\tstatusDiv.textContent = \"🟢 Full Browser Support\";\n\t\t} else if (summary === \"partial\") {\n\t\t\tstatusDiv.textContent = \"🟡 Partial Browser Support\";\n\t\t} else if (summary === \"none\") {\n\t\t\tstatusDiv.textContent = \"🔴 No Browser Support\";\n\t\t}\n\n\t\tconst detailsButton = DOM.create(\"button\", {\n\t\t\ttype: \"button\",\n\t\t\tstyle: { fontSize: \"14px\" },\n\t\t});\n\n\t\teffect.event(detailsButton, \"click\", () => {\n\t\t\tthis.#details.update((prev) => !prev);\n\t\t});\n\n\t\teffect.run((effect) => {\n\t\t\tdetailsButton.textContent = effect.get(this.#details) ? \"Details ➖\" : \"Details ➕\";\n\t\t});\n\n\t\tconst closeButton = DOM.create(\n\t\t\t\"button\",\n\t\t\t{\n\t\t\t\ttype: \"button\",\n\t\t\t\tstyle: { fontSize: \"14px\" },\n\t\t\t},\n\t\t\t\"Close ❌\",\n\t\t);\n\n\t\teffect.event(closeButton, \"click\", () => {\n\t\t\tthis.#close.set(true);\n\t\t});\n\n\t\theaderDiv.appendChild(statusDiv);\n\t\theaderDiv.appendChild(detailsButton);\n\t\theaderDiv.appendChild(closeButton);\n\n\t\tparent.appendChild(headerDiv);\n\t\teffect.cleanup(() => parent.removeChild(headerDiv));\n\t}\n\n\t#renderDetails(parent: HTMLDivElement, support: Full, effect: Effect) {\n\t\tconst container = DOM.create(\"div\", {\n\t\t\tstyle: {\n\t\t\t\tdisplay: \"grid\",\n\t\t\t\tgridTemplateColumns: \"1fr 1fr 1fr\",\n\t\t\t\tcolumnGap: \"0.5rem\",\n\t\t\t\trowGap: \"0.2rem\",\n\t\t\t\tbackgroundColor: \"rgba(0, 0, 0, 0.6)\",\n\t\t\t\tborderRadius: \"0.5rem\",\n\t\t\t\tpadding: \"1rem\",\n\t\t\t\tfontSize: \"0.875rem\",\n\t\t\t},\n\t\t});\n\n\t\tconst binary = (value: boolean | undefined) => (value ? \"🟢 Yes\" : \"🔴 No\");\n\t\tconst hardware = (codec: Codec | undefined) =>\n\t\t\tcodec?.hardware ? \"🟢 Hardware\" : codec?.software ? `🟡 Software${isFirefox ? \"*\" : \"\"}` : \"🔴 No\";\n\t\tconst partial = (value: Partial | undefined) =>\n\t\t\tvalue === \"full\" ? \"🟢 Full\" : value === \"partial\" ? \"🟡 Polyfill\" : \"🔴 None\";\n\n\t\tconst addRow = (label: string, col2: string, col3: string) => {\n\t\t\tconst labelDiv = DOM.create(\n\t\t\t\t\"div\",\n\t\t\t\t{\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tgridColumnStart: \"1\",\n\t\t\t\t\t\tfontWeight: \"bold\",\n\t\t\t\t\t\ttextAlign: \"right\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tlabel,\n\t\t\t);\n\n\t\t\tconst col2Div = DOM.create(\n\t\t\t\t\"div\",\n\t\t\t\t{\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tgridColumnStart: \"2\",\n\t\t\t\t\t\ttextAlign: \"center\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcol2,\n\t\t\t);\n\n\t\t\tconst col3Div = DOM.create(\n\t\t\t\t\"div\",\n\t\t\t\t{\n\t\t\t\t\tstyle: { gridColumnStart: \"3\" },\n\t\t\t\t},\n\t\t\t\tcol3,\n\t\t\t);\n\n\t\t\tcontainer.appendChild(labelDiv);\n\t\t\tcontainer.appendChild(col2Div);\n\t\t\tcontainer.appendChild(col3Div);\n\t\t};\n\n\t\taddRow(\"WebTransport\", \"\", partial(support.webtransport));\n\t\taddRow(\"Rendering\", \"Audio\", binary(support.audio.render));\n\t\taddRow(\"\", \"Video\", binary(support.video.render));\n\t\taddRow(\"Decoding\", \"Opus\", partial(support.audio.decoding.opus));\n\t\taddRow(\"\", \"AAC\", binary(support.audio.decoding.aac));\n\t\taddRow(\"\", \"AV1\", hardware(support.video.decoding?.av1));\n\t\taddRow(\"\", \"H.265\", hardware(support.video.decoding?.h265));\n\t\taddRow(\"\", \"H.264\", hardware(support.video.decoding?.h264));\n\t\taddRow(\"\", \"VP9\", hardware(support.video.decoding?.vp9));\n\t\taddRow(\"\", \"VP8\", hardware(support.video.decoding?.vp8));\n\n\t\tif (isFirefox) {\n\t\t\tconst noteDiv = DOM.create(\n\t\t\t\t\"div\",\n\t\t\t\t{\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tgridColumnStart: \"1\",\n\t\t\t\t\t\tgridColumnEnd: \"4\",\n\t\t\t\t\t\ttextAlign: \"center\",\n\t\t\t\t\t\tfontSize: \"0.875rem\",\n\t\t\t\t\t\tfontStyle: \"italic\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"Hardware acceleration is \",\n\t\t\t\tDOM.create(\n\t\t\t\t\t\"a\",\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"https://github.com/w3c/webcodecs/issues/896\",\n\t\t\t\t\t},\n\t\t\t\t\t\"undetectable\",\n\t\t\t\t),\n\t\t\t\t\" on Firefox.\",\n\t\t\t);\n\t\t\tcontainer.appendChild(noteDiv);\n\t\t}\n\n\t\tparent.appendChild(container);\n\t\teffect.cleanup(() => parent.removeChild(container));\n\t}\n}\n\ncustomElements.define(\"moq-watch-support\", MoqWatchSupport);\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t\"moq-watch-support\": MoqWatchSupport;\n\t}\n}\n"],"names":["create","tagName","options","children","element","style","classList","dataset","attributes","props","key","value","child","isFirefox","OBSERVED","MoqWatchSupport","#show","Signal","#details","#support","#close","#signals","isSupported","s","err","Effect","#render","name","_oldValue","newValue","show","exhaustive","details","#getSummary","support","v","effect","summary","container","DOM.create","#renderHeader","#renderDetails","parent","headerDiv","statusDiv","detailsButton","prev","closeButton","binary","hardware","codec","partial","addRow","label","col2","col3","labelDiv","col2Div","col3Div","noteDiv"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"element.js","sources":["../../src/support/element.ts"],"sourcesContent":["import { Effect, Signal } from \"@moq/signals\";\nimport * as DOM from \"@moq/signals/dom\";\nimport { type Codec, type Full, isSupported, type Partial } from \"./\";\n\n// https://bugzilla.mozilla.org/show_bug.cgi?id=1967793\nconst isFirefox = navigator.userAgent.toLowerCase().includes(\"firefox\");\n\nconst OBSERVED = [\"show\", \"details\"] as const;\ntype Observed = (typeof OBSERVED)[number];\n\n// Whether to display the support banner.\n// - \"always\": Always display the banner.\n// - \"warning\": Display the banner if a required feature needs a polyfill/fallback.\n// - \"error\": Display the banner if a required feature is unsupported.\n// - \"never\": Never display the banner.\nexport type Show = \"always\" | \"warning\" | \"error\" | \"never\";\n\nexport default class MoqWatchSupport extends HTMLElement {\n\t#show = new Signal<Show>(\"warning\");\n\t#details = new Signal<boolean>(false);\n\t#support = new Signal<Full | undefined>(undefined);\n\t#close = new Signal<boolean>(false);\n\n\t#signals?: Effect;\n\n\tstatic observedAttributes = OBSERVED;\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tisSupported()\n\t\t\t.then((s) => this.#support.set(s))\n\t\t\t.catch((err) => console.error(\"Failed to detect watch support:\", err));\n\t}\n\n\tconnectedCallback() {\n\t\tthis.#signals = new Effect();\n\t\tthis.#signals.run(this.#render.bind(this));\n\t}\n\n\tdisconnectedCallback() {\n\t\tthis.#signals?.close();\n\t\tthis.#signals = undefined;\n\t}\n\n\tattributeChangedCallback(name: Observed, _oldValue: string | null, newValue: string | null) {\n\t\tif (name === \"show\") {\n\t\t\tconst show = newValue ?? \"warning\";\n\t\t\tif (show === \"always\" || show === \"warning\" || show === \"error\" || show === \"never\") {\n\t\t\t\tthis.show = show;\n\t\t\t} else {\n\t\t\t\tthrow new Error(`Invalid show: ${show}`);\n\t\t\t}\n\t\t} else if (name === \"details\") {\n\t\t\tthis.details = newValue !== null;\n\t\t} else {\n\t\t\tconst exhaustive: never = name;\n\t\t\tthrow new Error(`Invalid attribute: ${exhaustive}`);\n\t\t}\n\t}\n\n\tget show(): Show {\n\t\treturn this.#show.peek();\n\t}\n\n\tset show(show: Show) {\n\t\tthis.#show.set(show);\n\t}\n\n\tget details(): boolean {\n\t\treturn this.#details.peek();\n\t}\n\n\tset details(details: boolean) {\n\t\tthis.#details.set(details);\n\t}\n\n\t#getSummary(support: Full): Partial {\n\t\tif (support.webtransport === \"none\") return \"none\";\n\n\t\tif (!support.audio.decoding || !support.video.decoding) return \"none\";\n\t\tif (!support.audio.render || !support.video.render) return \"none\";\n\n\t\tif (!Object.values(support.audio.decoding).some((v) => v === true || v === \"full\" || v === \"partial\"))\n\t\t\treturn \"none\";\n\t\tif (!Object.values(support.video.decoding).some((v) => v.software || v.hardware)) return \"none\";\n\n\t\tif (!Object.values(support.audio.decoding).every((v) => v === true || v === \"full\")) return \"partial\";\n\t\tif (!Object.values(support.video.decoding).every((v) => v.software || v.hardware)) return \"partial\";\n\n\t\treturn \"full\";\n\t}\n\n\t#render(effect: Effect) {\n\t\tconst support = effect.get(this.#support);\n\t\tif (!support) return;\n\n\t\tconst close = effect.get(this.#close);\n\t\tif (close) return;\n\n\t\tconst show = effect.get(this.#show);\n\t\tif (show === \"never\") return;\n\n\t\tconst summary = this.#getSummary(support);\n\n\t\t// Don't render the banner if we have full support and they only asked for warnings.\n\t\tif (show === \"warning\" && summary === \"full\") return;\n\n\t\t// Don't render the banner if we have at least partial support and they only asked for errors.\n\t\tif (show === \"error\" && summary !== \"none\") return;\n\n\t\tconst container = DOM.create(\"div\", {\n\t\t\tstyle: {\n\t\t\t\tmargin: \"0 auto\",\n\t\t\t\tmaxWidth: \"28rem\",\n\t\t\t\tpadding: \"1rem\",\n\t\t\t},\n\t\t});\n\n\t\tthis.appendChild(container);\n\t\teffect.cleanup(() => this.removeChild(container));\n\n\t\tthis.#renderHeader(container, summary, effect);\n\n\t\tif (effect.get(this.#details)) {\n\t\t\tthis.#renderDetails(container, support, effect);\n\t\t}\n\t}\n\n\t#renderHeader(parent: HTMLDivElement, summary: Partial, effect: Effect) {\n\t\tconst headerDiv = DOM.create(\"div\", {\n\t\t\tstyle: {\n\t\t\t\tdisplay: \"flex\",\n\t\t\t\tflexDirection: \"row\",\n\t\t\t\tgap: \"1rem\",\n\t\t\t\tflexWrap: \"wrap\",\n\t\t\t\tjustifyContent: \"space-between\",\n\t\t\t\talignItems: \"center\",\n\t\t\t},\n\t\t});\n\n\t\tconst statusDiv = DOM.create(\"div\", {\n\t\t\tstyle: { fontWeight: \"bold\" },\n\t\t});\n\n\t\tif (summary === \"full\") {\n\t\t\tstatusDiv.textContent = \"🟢 Full Browser Support\";\n\t\t} else if (summary === \"partial\") {\n\t\t\tstatusDiv.textContent = \"🟡 Partial Browser Support\";\n\t\t} else if (summary === \"none\") {\n\t\t\tstatusDiv.textContent = \"🔴 No Browser Support\";\n\t\t}\n\n\t\tconst detailsButton = DOM.create(\"button\", {\n\t\t\ttype: \"button\",\n\t\t\tstyle: { fontSize: \"14px\" },\n\t\t});\n\n\t\teffect.event(detailsButton, \"click\", () => {\n\t\t\tthis.#details.update((prev) => !prev);\n\t\t});\n\n\t\teffect.run((effect) => {\n\t\t\tdetailsButton.textContent = effect.get(this.#details) ? \"Details ➖\" : \"Details ➕\";\n\t\t});\n\n\t\tconst closeButton = DOM.create(\n\t\t\t\"button\",\n\t\t\t{\n\t\t\t\ttype: \"button\",\n\t\t\t\tstyle: { fontSize: \"14px\" },\n\t\t\t},\n\t\t\t\"Close ❌\",\n\t\t);\n\n\t\teffect.event(closeButton, \"click\", () => {\n\t\t\tthis.#close.set(true);\n\t\t});\n\n\t\theaderDiv.appendChild(statusDiv);\n\t\theaderDiv.appendChild(detailsButton);\n\t\theaderDiv.appendChild(closeButton);\n\n\t\tparent.appendChild(headerDiv);\n\t\teffect.cleanup(() => parent.removeChild(headerDiv));\n\t}\n\n\t#renderDetails(parent: HTMLDivElement, support: Full, effect: Effect) {\n\t\tconst container = DOM.create(\"div\", {\n\t\t\tstyle: {\n\t\t\t\tdisplay: \"grid\",\n\t\t\t\tgridTemplateColumns: \"1fr 1fr 1fr\",\n\t\t\t\tcolumnGap: \"0.5rem\",\n\t\t\t\trowGap: \"0.2rem\",\n\t\t\t\tbackgroundColor: \"rgba(0, 0, 0, 0.6)\",\n\t\t\t\tborderRadius: \"0.5rem\",\n\t\t\t\tpadding: \"1rem\",\n\t\t\t\tfontSize: \"0.875rem\",\n\t\t\t},\n\t\t});\n\n\t\tconst binary = (value: boolean | undefined) => (value ? \"🟢 Yes\" : \"🔴 No\");\n\t\tconst hardware = (codec: Codec | undefined) =>\n\t\t\tcodec?.hardware ? \"🟢 Hardware\" : codec?.software ? `🟡 Software${isFirefox ? \"*\" : \"\"}` : \"🔴 No\";\n\t\tconst partial = (value: Partial | undefined) =>\n\t\t\tvalue === \"full\" ? \"🟢 Full\" : value === \"partial\" ? \"🟡 Polyfill\" : \"🔴 None\";\n\n\t\tconst addRow = (label: string, col2: string, col3: string) => {\n\t\t\tconst labelDiv = DOM.create(\n\t\t\t\t\"div\",\n\t\t\t\t{\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tgridColumnStart: \"1\",\n\t\t\t\t\t\tfontWeight: \"bold\",\n\t\t\t\t\t\ttextAlign: \"right\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tlabel,\n\t\t\t);\n\n\t\t\tconst col2Div = DOM.create(\n\t\t\t\t\"div\",\n\t\t\t\t{\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tgridColumnStart: \"2\",\n\t\t\t\t\t\ttextAlign: \"center\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcol2,\n\t\t\t);\n\n\t\t\tconst col3Div = DOM.create(\n\t\t\t\t\"div\",\n\t\t\t\t{\n\t\t\t\t\tstyle: { gridColumnStart: \"3\" },\n\t\t\t\t},\n\t\t\t\tcol3,\n\t\t\t);\n\n\t\t\tcontainer.appendChild(labelDiv);\n\t\t\tcontainer.appendChild(col2Div);\n\t\t\tcontainer.appendChild(col3Div);\n\t\t};\n\n\t\taddRow(\"WebTransport\", \"\", partial(support.webtransport));\n\t\taddRow(\"Rendering\", \"Audio\", binary(support.audio.render));\n\t\taddRow(\"\", \"Video\", binary(support.video.render));\n\t\taddRow(\"Decoding\", \"Opus\", partial(support.audio.decoding.opus));\n\t\taddRow(\"\", \"AAC\", binary(support.audio.decoding.aac));\n\t\taddRow(\"\", \"AV1\", hardware(support.video.decoding?.av1));\n\t\taddRow(\"\", \"H.265\", hardware(support.video.decoding?.h265));\n\t\taddRow(\"\", \"H.264\", hardware(support.video.decoding?.h264));\n\t\taddRow(\"\", \"VP9\", hardware(support.video.decoding?.vp9));\n\t\taddRow(\"\", \"VP8\", hardware(support.video.decoding?.vp8));\n\n\t\tif (isFirefox) {\n\t\t\tconst noteDiv = DOM.create(\n\t\t\t\t\"div\",\n\t\t\t\t{\n\t\t\t\t\tstyle: {\n\t\t\t\t\t\tgridColumnStart: \"1\",\n\t\t\t\t\t\tgridColumnEnd: \"4\",\n\t\t\t\t\t\ttextAlign: \"center\",\n\t\t\t\t\t\tfontSize: \"0.875rem\",\n\t\t\t\t\t\tfontStyle: \"italic\",\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\t\"Hardware acceleration is \",\n\t\t\t\tDOM.create(\n\t\t\t\t\t\"a\",\n\t\t\t\t\t{\n\t\t\t\t\t\thref: \"https://github.com/w3c/webcodecs/issues/896\",\n\t\t\t\t\t},\n\t\t\t\t\t\"undetectable\",\n\t\t\t\t),\n\t\t\t\t\" on Firefox.\",\n\t\t\t);\n\t\t\tcontainer.appendChild(noteDiv);\n\t\t}\n\n\t\tparent.appendChild(container);\n\t\teffect.cleanup(() => parent.removeChild(container));\n\t}\n}\n\ncustomElements.define(\"moq-watch-support\", MoqWatchSupport);\n\ndeclare global {\n\tinterface HTMLElementTagNameMap {\n\t\t\"moq-watch-support\": MoqWatchSupport;\n\t}\n}\n"],"names":["isFirefox","OBSERVED","MoqWatchSupport","#show","Signal","#details","#support","#close","#signals","isSupported","s","err","Effect","#render","name","_oldValue","newValue","show","exhaustive","details","#getSummary","support","v","effect","summary","container","DOM.create","#renderHeader","#renderDetails","parent","headerDiv","statusDiv","detailsButton","prev","closeButton","binary","value","hardware","codec","partial","addRow","label","col2","col3","labelDiv","col2Div","col3Div","noteDiv"],"mappings":"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"}
|
package/sync.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type * as Moq from "@moq/
|
|
2
|
-
import { Time } from "@moq/
|
|
1
|
+
import type * as Moq from "@moq/net";
|
|
2
|
+
import { Time } from "@moq/net";
|
|
3
3
|
import { Signal } from "@moq/signals";
|
|
4
4
|
/** Latency: `"real-time"` auto-computes jitter from RTT; a `Time.Milli` sets a fixed jitter. */
|
|
5
5
|
export type Latency = "real-time" | Time.Milli;
|
package/sync.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAU,MAAM,EAAE,MAAM,cAAc,CAAC;AAE9C,gGAAgG;AAChG,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC;AAK/C,MAAM,WAAW,SAAS;IACzB,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;IAC5D,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IACpD,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;CACpD;AAED,qBAAa,IAAI;;IAIhB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,CAAmB;IAGrE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAKzB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAG3B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;IAItC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAgB;IAOnD,QAAQ,CAAC,SAAS,iDAAiD;IAYnE,OAAO,qBAAgB;gBAEX,KAAK,CAAC,EAAE,SAAS;IAuD7B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,SAAK,GAAG,IAAI;IA0CjD,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,SAAS;IAOvB,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAqChD,KAAK;CAGL"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Moq } from "@moq/hang";
|
|
2
|
+
import type { Effect } from "@moq/signals";
|
|
3
|
+
import type MoqWatch from "../../element";
|
|
4
|
+
export declare function bufferControl(parent: Effect, watch: MoqWatch, max?: Moq.Time.Milli): HTMLElement;
|
|
5
|
+
//# sourceMappingURL=buffer-control.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buffer-control.d.ts","sourceRoot":"","sources":["../../../src/ui/components/buffer-control.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAyE1C,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,GAAE,GAAG,CAAC,IAAI,CAAC,KAAmB,GAAG,WAAW,CAwH7G"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buffering-indicator.d.ts","sourceRoot":"","sources":["../../../src/ui/components/buffering-indicator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE1C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,WAAW,CAc/E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fullscreen-button.d.ts","sourceRoot":"","sources":["../../../src/ui/components/fullscreen-button.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAG1C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,WAAW,CAuB7E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"offline-indicator.d.ts","sourceRoot":"","sources":["../../../src/ui/components/offline-indicator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAE1C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,WAAW,CAiB7E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"play-pause.d.ts","sourceRoot":"","sources":["../../../src/ui/components/play-pause.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAG1C,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,WAAW,CAiB5E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-selector.d.ts","sourceRoot":"","sources":["../../../src/ui/components/quality-selector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAQ1C,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,WAAW,CA4C5E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats-button.d.ts","sourceRoot":"","sources":["../../../src/ui/components/stats-button.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGnD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,WAAW,CAiBjF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"volume-slider.d.ts","sourceRoot":"","sources":["../../../src/ui/components/volume-slider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAU1C,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,WAAW,CAsCzE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch-status-indicator.d.ts","sourceRoot":"","sources":["../../../src/ui/components/watch-status-indicator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAkB1C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,WAAW,CAoBjF"}
|
package/ui/element.d.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
export default class MoqWatchUi extends HTMLElement {
|
|
2
|
+
#private;
|
|
3
|
+
constructor();
|
|
4
|
+
connectedCallback(): void;
|
|
5
|
+
disconnectedCallback(): void;
|
|
6
|
+
}
|
|
7
|
+
declare global {
|
|
8
|
+
interface HTMLElementTagNameMap {
|
|
9
|
+
"moq-watch-ui": MoqWatchUi;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
5
12
|
//# sourceMappingURL=element.d.ts.map
|
package/ui/element.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../../src/ui/element.
|
|
1
|
+
{"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../../src/ui/element.ts"],"names":[],"mappings":"AAeA,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,WAAW;;;IAiBlD,iBAAiB;IASjB,oBAAoB;CA4CpB;AAID,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,qBAAqB;QAC9B,cAAc,EAAE,UAAU,CAAC;KAC3B;CACD"}
|