@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.
Files changed (112) hide show
  1. package/README.md +7 -7
  2. package/audio/buffer.d.ts +1 -1
  3. package/audio/buffer.d.ts.map +1 -1
  4. package/audio/decoder.d.ts +1 -1
  5. package/audio/decoder.d.ts.map +1 -1
  6. package/audio/render.d.ts +1 -1
  7. package/audio/render.d.ts.map +1 -1
  8. package/audio/ring-buffer.d.ts +1 -1
  9. package/audio/ring-buffer.d.ts.map +1 -1
  10. package/audio/shared-ring-buffer.d.ts +1 -1
  11. package/audio/shared-ring-buffer.d.ts.map +1 -1
  12. package/audio/source.d.ts.map +1 -1
  13. package/backend.d.ts +1 -1
  14. package/backend.d.ts.map +1 -1
  15. package/{broadcast-b74Ew4Ql.js → broadcast-CLjMphZS.js} +1108 -1013
  16. package/broadcast-CLjMphZS.js.map +1 -0
  17. package/broadcast.d.ts +4 -3
  18. package/broadcast.d.ts.map +1 -1
  19. package/chat/index.d.ts +1 -1
  20. package/chat/index.d.ts.map +1 -1
  21. package/chat/message.d.ts +1 -1
  22. package/chat/message.d.ts.map +1 -1
  23. package/chat/typing.d.ts +1 -1
  24. package/chat/typing.d.ts.map +1 -1
  25. package/dom-BsFrLb_F.js +35 -0
  26. package/dom-BsFrLb_F.js.map +1 -0
  27. package/element.d.ts +4 -4
  28. package/element.d.ts.map +1 -1
  29. package/element.js +43 -32
  30. package/element.js.map +1 -1
  31. package/index.d.ts +3 -1
  32. package/index.d.ts.map +1 -1
  33. package/index.js +22 -20
  34. package/index.js.map +1 -1
  35. package/libav-opus-af-BlMWboA7.js.map +1 -1
  36. package/location/index.d.ts +1 -1
  37. package/location/index.d.ts.map +1 -1
  38. package/location/peers.d.ts +1 -1
  39. package/location/peers.d.ts.map +1 -1
  40. package/location/window.d.ts +1 -1
  41. package/location/window.d.ts.map +1 -1
  42. package/main-DGBFe0O7.js.map +1 -1
  43. package/package.json +8 -9
  44. package/preview.d.ts +1 -1
  45. package/preview.d.ts.map +1 -1
  46. package/support/element.js +49 -60
  47. package/support/element.js.map +1 -1
  48. package/sync.d.ts +2 -2
  49. package/sync.d.ts.map +1 -1
  50. package/ui/components/buffer-control.d.ts +5 -0
  51. package/ui/components/buffer-control.d.ts.map +1 -0
  52. package/ui/components/buffering-indicator.d.ts +4 -0
  53. package/ui/components/buffering-indicator.d.ts.map +1 -0
  54. package/ui/components/fullscreen-button.d.ts +4 -0
  55. package/ui/components/fullscreen-button.d.ts.map +1 -0
  56. package/ui/components/offline-indicator.d.ts +4 -0
  57. package/ui/components/offline-indicator.d.ts.map +1 -0
  58. package/ui/components/play-pause.d.ts +4 -0
  59. package/ui/components/play-pause.d.ts.map +1 -0
  60. package/ui/components/quality-selector.d.ts +4 -0
  61. package/ui/components/quality-selector.d.ts.map +1 -0
  62. package/ui/components/stats-button.d.ts +3 -0
  63. package/ui/components/stats-button.d.ts.map +1 -0
  64. package/ui/components/volume-slider.d.ts +4 -0
  65. package/ui/components/volume-slider.d.ts.map +1 -0
  66. package/ui/components/watch-status-indicator.d.ts +4 -0
  67. package/ui/components/watch-status-indicator.d.ts.map +1 -0
  68. package/ui/element.d.ts +11 -4
  69. package/ui/element.d.ts.map +1 -1
  70. package/ui/element.js +382 -0
  71. package/ui/element.js.map +1 -0
  72. package/ui/icons.d.ts +16 -0
  73. package/ui/icons.d.ts.map +1 -0
  74. package/ui/stats.d.ts +4 -0
  75. package/ui/stats.d.ts.map +1 -0
  76. package/video/backend.d.ts +1 -1
  77. package/video/backend.d.ts.map +1 -1
  78. package/video/decoder.d.ts +1 -1
  79. package/video/decoder.d.ts.map +1 -1
  80. package/video/mse.d.ts +1 -1
  81. package/video/mse.d.ts.map +1 -1
  82. package/video/renderer.d.ts +1 -1
  83. package/video/renderer.d.ts.map +1 -1
  84. package/video/source.d.ts +2 -0
  85. package/video/source.d.ts.map +1 -1
  86. package/broadcast-b74Ew4Ql.js.map +0 -1
  87. package/ui/components/BufferControl.d.ts +0 -8
  88. package/ui/components/BufferControl.d.ts.map +0 -1
  89. package/ui/components/BufferingIndicator.d.ts +0 -2
  90. package/ui/components/BufferingIndicator.d.ts.map +0 -1
  91. package/ui/components/FullscreenButton.d.ts +0 -2
  92. package/ui/components/FullscreenButton.d.ts.map +0 -1
  93. package/ui/components/PlayPauseButton.d.ts +0 -2
  94. package/ui/components/PlayPauseButton.d.ts.map +0 -1
  95. package/ui/components/QualitySelector.d.ts +0 -3
  96. package/ui/components/QualitySelector.d.ts.map +0 -1
  97. package/ui/components/StatsButton.d.ts +0 -5
  98. package/ui/components/StatsButton.d.ts.map +0 -1
  99. package/ui/components/VolumeSlider.d.ts +0 -2
  100. package/ui/components/VolumeSlider.d.ts.map +0 -1
  101. package/ui/components/WatchControls.d.ts +0 -2
  102. package/ui/components/WatchControls.d.ts.map +0 -1
  103. package/ui/components/WatchStatusIndicator.d.ts +0 -2
  104. package/ui/components/WatchStatusIndicator.d.ts.map +0 -1
  105. package/ui/context.d.ts +0 -44
  106. package/ui/context.d.ts.map +0 -1
  107. package/ui/hooks/use-watch-ui.d.ts +0 -3
  108. package/ui/hooks/use-watch-ui.d.ts.map +0 -1
  109. package/ui/index.d.ts +0 -7
  110. package/ui/index.d.ts.map +0 -1
  111. package/ui/index.js +0 -1065
  112. 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.11",
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/index.d.ts",
19
- "default": "./ui/index.js"
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/index.js",
32
+ "./ui/element.js",
33
33
  "./support/element.js"
34
34
  ],
35
35
  "dependencies": {
36
- "@moq/hang": "^0.2.5",
37
- "@moq/lite": "^0.2.3",
38
- "@moq/msf": "^0.1.0",
39
- "@moq/signals": "^0.1.6",
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
@@ -1,5 +1,5 @@
1
1
  import * as Catalog from "@moq/hang/catalog";
2
- import type * as Moq from "@moq/lite";
2
+ import type * as Moq from "@moq/net";
3
3
  import { Signal } from "@moq/signals";
4
4
  export interface PreviewProps {
5
5
  enabled?: boolean | Signal<boolean>;
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,WAAW,CAAC;AAEtC,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"}
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"}
@@ -1,43 +1,32 @@
1
- import { Signal as u, Effect as b } from "@moq/signals";
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
- function d(h, e, ...t) {
4
- const n = document.createElement(h);
5
- if (!e) return n;
6
- const { style: i, classList: a, dataset: o, attributes: l, ...s } = e;
7
- return i && Object.assign(n.style, i), a && n.classList.add(...a), o && Object.entries(o).forEach(([r, c]) => {
8
- n.dataset[r] = c;
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 b(), this.#t.run(this.#s.bind(this));
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, n) {
21
+ attributeChangedCallback(e, t, s) {
33
22
  if (e === "show") {
34
- const i = n ?? "warning";
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 = n !== null;
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
- #o(e) {
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
- #s(e) {
50
+ #d(e) {
62
51
  const t = e.get(this.#n);
63
- if (!t || e.get(this.#r)) return;
52
+ if (!t || e.get(this.#o)) return;
64
53
  const i = e.get(this.#i);
65
54
  if (i === "never") return;
66
- const a = this.#o(t);
67
- if (i === "warning" && a === "full" || i === "error" && a !== "none") return;
68
- const o = d("div", {
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(o), e.cleanup(() => this.removeChild(o)), this.#a(o, a, e), e.get(this.#e) && this.#d(o, t, e);
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, n) {
78
- const i = d("div", {
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
- }), a = d("div", {
76
+ }), r = a("div", {
88
77
  style: { fontWeight: "bold" }
89
78
  });
90
- t === "full" ? a.textContent = "🟢 Full Browser Support" : t === "partial" ? a.textContent = "🟡 Partial Browser Support" : t === "none" && (a.textContent = "🔴 No Browser Support");
91
- const o = d("button", {
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
- n.event(o, "click", () => {
96
- this.#e.update((s) => !s);
97
- }), n.run((s) => {
98
- o.textContent = s.get(this.#e) ? "Details ➖" : "Details ➕";
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 = d(
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
- n.event(l, "click", () => {
109
- this.#r.set(!0);
110
- }), i.appendChild(a), i.appendChild(o), i.appendChild(l), e.appendChild(i), n.cleanup(() => e.removeChild(i));
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
- #d(e, t, n) {
113
- const i = d("div", {
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
- }), a = (r) => r ? "🟢 Yes" : "🔴 No", o = (r) => r?.hardware ? "🟢 Hardware" : r?.software ? `🟡 Software${g ? "*" : ""}` : "🔴 No", l = (r) => r === "full" ? "🟢 Full" : r === "partial" ? "🟡 Polyfill" : "🔴 None", s = (r, c, f) => {
125
- const p = d(
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
- r
135
- ), w = d(
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
- c
144
- ), v = d(
132
+ u
133
+ ), f = a(
145
134
  "div",
146
135
  {
147
136
  style: { gridColumnStart: "3" }
148
137
  },
149
- f
138
+ g
150
139
  );
151
- i.appendChild(p), i.appendChild(w), i.appendChild(v);
140
+ i.appendChild(w), i.appendChild(p), i.appendChild(f);
152
141
  };
153
- if (s("WebTransport", "", l(t.webtransport)), s("Rendering", "Audio", a(t.audio.render)), s("", "Video", a(t.video.render)), s("Decoding", "Opus", l(t.audio.decoding.opus)), s("", "AAC", a(t.audio.decoding.aac)), s("", "AV1", o(t.video.decoding?.av1)), s("", "H.265", o(t.video.decoding?.h265)), s("", "H.264", o(t.video.decoding?.h264)), s("", "VP9", o(t.video.decoding?.vp9)), s("", "VP8", o(t.video.decoding?.vp8)), g) {
154
- const r = d(
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
- d(
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(r);
164
+ i.appendChild(d);
176
165
  }
177
- e.appendChild(i), n.cleanup(() => e.removeChild(i));
166
+ e.appendChild(i), s.cleanup(() => e.removeChild(i));
178
167
  }
179
168
  }
180
- customElements.define("moq-watch-support", y);
169
+ customElements.define("moq-watch-support", b);
181
170
  export {
182
- y as default
171
+ b as default
183
172
  };
184
173
  //# sourceMappingURL=element.js.map
@@ -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/lite";
2
- import { Time } from "@moq/lite";
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,WAAW,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,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"}
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,4 @@
1
+ import type { Effect } from "@moq/signals";
2
+ import type MoqWatch from "../../element";
3
+ export declare function bufferingIndicator(parent: Effect, watch: MoqWatch): HTMLElement;
4
+ //# sourceMappingURL=buffering-indicator.d.ts.map
@@ -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,4 @@
1
+ import type { Effect } from "@moq/signals";
2
+ import type MoqWatch from "../../element";
3
+ export declare function fullscreenButton(parent: Effect, watch: MoqWatch): HTMLElement;
4
+ //# sourceMappingURL=fullscreen-button.d.ts.map
@@ -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,4 @@
1
+ import type { Effect } from "@moq/signals";
2
+ import type MoqWatch from "../../element";
3
+ export declare function offlineIndicator(parent: Effect, watch: MoqWatch): HTMLElement;
4
+ //# sourceMappingURL=offline-indicator.d.ts.map
@@ -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,4 @@
1
+ import type { Effect } from "@moq/signals";
2
+ import type MoqWatch from "../../element";
3
+ export declare function playPauseButton(parent: Effect, watch: MoqWatch): HTMLElement;
4
+ //# sourceMappingURL=play-pause.d.ts.map
@@ -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,4 @@
1
+ import type { Effect } from "@moq/signals";
2
+ import type MoqWatch from "../../element";
3
+ export declare function qualitySelector(parent: Effect, watch: MoqWatch): HTMLElement;
4
+ //# sourceMappingURL=quality-selector.d.ts.map
@@ -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,3 @@
1
+ import type { Effect, Signal } from "@moq/signals";
2
+ export declare function statsButton(parent: Effect, visible: Signal<boolean>): HTMLElement;
3
+ //# sourceMappingURL=stats-button.d.ts.map
@@ -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,4 @@
1
+ import type { Effect } from "@moq/signals";
2
+ import type MoqWatch from "../../element";
3
+ export declare function volumeSlider(parent: Effect, watch: MoqWatch): HTMLElement;
4
+ //# sourceMappingURL=volume-slider.d.ts.map
@@ -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,4 @@
1
+ import type { Effect } from "@moq/signals";
2
+ import type MoqWatch from "../../element";
3
+ export declare function watchStatusIndicator(parent: Effect, watch: MoqWatch): HTMLElement;
4
+ //# sourceMappingURL=watch-status-indicator.d.ts.map
@@ -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
- import type MoqWatch from "../element";
2
- export declare function WatchUI(props: {
3
- watch: MoqWatch;
4
- }): import("solid-js").JSX.Element;
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
@@ -1 +1 @@
1
- {"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../../src/ui/element.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AAOvC,wBAAgB,OAAO,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,QAAQ,CAAA;CAAE,kCA8BjD"}
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"}