@livepeer-frameworks/player-wc 0.1.2 → 0.1.4

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 (116) hide show
  1. package/dist/cjs/components/fw-dev-mode-panel.js +845 -212
  2. package/dist/cjs/components/fw-dev-mode-panel.js.map +1 -1
  3. package/dist/cjs/components/fw-dvd-logo.js +211 -0
  4. package/dist/cjs/components/fw-dvd-logo.js.map +1 -0
  5. package/dist/cjs/components/fw-idle-screen.js +641 -97
  6. package/dist/cjs/components/fw-idle-screen.js.map +1 -1
  7. package/dist/cjs/components/fw-loading-screen.js +513 -0
  8. package/dist/cjs/components/fw-loading-screen.js.map +1 -0
  9. package/dist/cjs/components/fw-player-controls.js +390 -173
  10. package/dist/cjs/components/fw-player-controls.js.map +1 -1
  11. package/dist/cjs/components/fw-player.js +506 -63
  12. package/dist/cjs/components/fw-player.js.map +1 -1
  13. package/dist/cjs/components/fw-seek-bar.js +292 -142
  14. package/dist/cjs/components/fw-seek-bar.js.map +1 -1
  15. package/dist/cjs/components/fw-settings-menu.js +208 -81
  16. package/dist/cjs/components/fw-settings-menu.js.map +1 -1
  17. package/dist/cjs/components/fw-stats-panel.js +134 -70
  18. package/dist/cjs/components/fw-stats-panel.js.map +1 -1
  19. package/dist/cjs/components/fw-stream-state-overlay.js +338 -0
  20. package/dist/cjs/components/fw-stream-state-overlay.js.map +1 -0
  21. package/dist/cjs/components/fw-subtitle-renderer.js +174 -27
  22. package/dist/cjs/components/fw-subtitle-renderer.js.map +1 -1
  23. package/dist/cjs/components/fw-thumbnail-overlay.js +161 -0
  24. package/dist/cjs/components/fw-thumbnail-overlay.js.map +1 -0
  25. package/dist/cjs/components/fw-volume-control.js +150 -69
  26. package/dist/cjs/components/fw-volume-control.js.map +1 -1
  27. package/dist/cjs/components/shared/hitmarker-audio.js +76 -0
  28. package/dist/cjs/components/shared/hitmarker-audio.js.map +1 -0
  29. package/dist/cjs/constants/media-assets.js +11 -0
  30. package/dist/cjs/constants/media-assets.js.map +1 -0
  31. package/dist/cjs/controllers/player-controller-host.js +51 -2
  32. package/dist/cjs/controllers/player-controller-host.js.map +1 -1
  33. package/dist/cjs/define.js +8 -0
  34. package/dist/cjs/define.js.map +1 -1
  35. package/dist/cjs/icons/index.js +27 -0
  36. package/dist/cjs/icons/index.js.map +1 -1
  37. package/dist/cjs/index.js +20 -0
  38. package/dist/cjs/index.js.map +1 -1
  39. package/dist/esm/components/fw-dev-mode-panel.js +846 -213
  40. package/dist/esm/components/fw-dev-mode-panel.js.map +1 -1
  41. package/dist/esm/components/fw-dvd-logo.js +211 -0
  42. package/dist/esm/components/fw-dvd-logo.js.map +1 -0
  43. package/dist/esm/components/fw-idle-screen.js +643 -99
  44. package/dist/esm/components/fw-idle-screen.js.map +1 -1
  45. package/dist/esm/components/fw-loading-screen.js +513 -0
  46. package/dist/esm/components/fw-loading-screen.js.map +1 -0
  47. package/dist/esm/components/fw-player-controls.js +391 -174
  48. package/dist/esm/components/fw-player-controls.js.map +1 -1
  49. package/dist/esm/components/fw-player.js +506 -63
  50. package/dist/esm/components/fw-player.js.map +1 -1
  51. package/dist/esm/components/fw-seek-bar.js +293 -143
  52. package/dist/esm/components/fw-seek-bar.js.map +1 -1
  53. package/dist/esm/components/fw-settings-menu.js +209 -82
  54. package/dist/esm/components/fw-settings-menu.js.map +1 -1
  55. package/dist/esm/components/fw-stats-panel.js +135 -71
  56. package/dist/esm/components/fw-stats-panel.js.map +1 -1
  57. package/dist/esm/components/fw-stream-state-overlay.js +338 -0
  58. package/dist/esm/components/fw-stream-state-overlay.js.map +1 -0
  59. package/dist/esm/components/fw-subtitle-renderer.js +175 -28
  60. package/dist/esm/components/fw-subtitle-renderer.js.map +1 -1
  61. package/dist/esm/components/fw-thumbnail-overlay.js +161 -0
  62. package/dist/esm/components/fw-thumbnail-overlay.js.map +1 -0
  63. package/dist/esm/components/fw-volume-control.js +150 -69
  64. package/dist/esm/components/fw-volume-control.js.map +1 -1
  65. package/dist/esm/components/shared/hitmarker-audio.js +74 -0
  66. package/dist/esm/components/shared/hitmarker-audio.js.map +1 -0
  67. package/dist/esm/constants/media-assets.js +8 -0
  68. package/dist/esm/constants/media-assets.js.map +1 -0
  69. package/dist/esm/controllers/player-controller-host.js +51 -2
  70. package/dist/esm/controllers/player-controller-host.js.map +1 -1
  71. package/dist/esm/define.js +8 -0
  72. package/dist/esm/define.js.map +1 -1
  73. package/dist/esm/icons/index.js +26 -2
  74. package/dist/esm/icons/index.js.map +1 -1
  75. package/dist/esm/index.js +4 -0
  76. package/dist/esm/index.js.map +1 -1
  77. package/dist/fw-player.iife.js +2097 -883
  78. package/dist/types/components/fw-dev-mode-panel.d.ts +36 -9
  79. package/dist/types/components/fw-dvd-logo.d.ts +29 -0
  80. package/dist/types/components/fw-idle-screen.d.ts +36 -0
  81. package/dist/types/components/fw-loading-screen.d.ts +36 -0
  82. package/dist/types/components/fw-player-controls.d.ts +23 -6
  83. package/dist/types/components/fw-player.d.ts +32 -1
  84. package/dist/types/components/fw-seek-bar.d.ts +31 -14
  85. package/dist/types/components/fw-settings-menu.d.ts +16 -1
  86. package/dist/types/components/fw-stats-panel.d.ts +4 -4
  87. package/dist/types/components/fw-stream-state-overlay.d.ts +20 -0
  88. package/dist/types/components/fw-subtitle-renderer.d.ts +33 -2
  89. package/dist/types/components/fw-thumbnail-overlay.d.ts +17 -0
  90. package/dist/types/components/fw-volume-control.d.ts +11 -4
  91. package/dist/types/components/shared/hitmarker-audio.d.ts +1 -0
  92. package/dist/types/constants/media-assets.d.ts +5 -0
  93. package/dist/types/controllers/player-controller-host.d.ts +14 -1
  94. package/dist/types/iife-entry.d.ts +4 -0
  95. package/dist/types/index.d.ts +4 -0
  96. package/package.json +2 -2
  97. package/src/components/fw-dev-mode-panel.ts +929 -228
  98. package/src/components/fw-dvd-logo.ts +233 -0
  99. package/src/components/fw-idle-screen.ts +680 -100
  100. package/src/components/fw-loading-screen.ts +540 -0
  101. package/src/components/fw-player-controls.ts +475 -175
  102. package/src/components/fw-player.ts +551 -60
  103. package/src/components/fw-seek-bar.ts +336 -143
  104. package/src/components/fw-settings-menu.ts +248 -85
  105. package/src/components/fw-stats-panel.ts +150 -77
  106. package/src/components/fw-stream-state-overlay.ts +331 -0
  107. package/src/components/fw-subtitle-renderer.ts +216 -28
  108. package/src/components/fw-thumbnail-overlay.ts +148 -0
  109. package/src/components/fw-volume-control.ts +166 -66
  110. package/src/components/shared/hitmarker-audio.ts +92 -0
  111. package/src/constants/media-assets.ts +7 -0
  112. package/src/controllers/player-controller-host.ts +52 -3
  113. package/src/define.ts +8 -0
  114. package/src/iife-entry.ts +4 -0
  115. package/src/index.ts +4 -0
  116. package/dist/fw-player.iife.js.map +0 -1
@@ -0,0 +1,233 @@
1
+ import { LitElement, css, html } from "lit";
2
+ import { customElement, property, state } from "lit/decorators.js";
3
+
4
+ type Point = { top: number; left: number };
5
+ type Velocity = { x: number; y: number };
6
+ type Size = { width: number; height: number };
7
+
8
+ const ORIGINAL_WIDTH = 153;
9
+ const ORIGINAL_HEIGHT = 69;
10
+ const ASPECT_RATIO = ORIGINAL_WIDTH / ORIGINAL_HEIGHT;
11
+
12
+ const COLORS = [
13
+ "#7aa2f7",
14
+ "#bb9af7",
15
+ "#9ece6a",
16
+ "#73daca",
17
+ "#7dcfff",
18
+ "#f7768e",
19
+ "#e0af68",
20
+ "#2ac3de",
21
+ ];
22
+
23
+ function pickNextColor(current?: string): string {
24
+ if (COLORS.length === 0) {
25
+ return current ?? "#ffffff";
26
+ }
27
+ if (COLORS.length === 1) {
28
+ return COLORS[0];
29
+ }
30
+
31
+ let next = COLORS[0];
32
+ while (next === current) {
33
+ next = COLORS[Math.floor(Math.random() * COLORS.length)];
34
+ }
35
+ return next;
36
+ }
37
+
38
+ @customElement("fw-dvd-logo")
39
+ export class FwDvdLogo extends LitElement {
40
+ @property({ attribute: false }) parentRef: HTMLElement | null = null;
41
+ @property({ type: Number }) scale = 0.15;
42
+
43
+ @state() private _position: Point = { top: 0, left: 0 };
44
+ @state() private _dimensions: Size = { width: ORIGINAL_WIDTH, height: ORIGINAL_HEIGHT };
45
+ @state() private _color = pickNextColor();
46
+
47
+ private _velocity: Velocity = { x: 1.8, y: 1.6 };
48
+ private _animationFrame: number | null = null;
49
+ private _resizeObserver: ResizeObserver | null = null;
50
+ private _lastTimestamp = performance.now();
51
+
52
+ static styles = css`
53
+ :host {
54
+ position: absolute;
55
+ pointer-events: none;
56
+ user-select: none;
57
+ display: block;
58
+ z-index: 6;
59
+ }
60
+ `;
61
+
62
+ connectedCallback(): void {
63
+ super.connectedCallback();
64
+ this._startAnimation();
65
+ }
66
+
67
+ firstUpdated(): void {
68
+ this._attachResizeObserver();
69
+ this._recalculateDimensions();
70
+ }
71
+
72
+ disconnectedCallback(): void {
73
+ super.disconnectedCallback();
74
+ this._stopAnimation();
75
+ this._detachResizeObserver();
76
+ }
77
+
78
+ protected updated(changed: Map<string, unknown>): void {
79
+ if (changed.has("parentRef") || changed.has("scale")) {
80
+ this._attachResizeObserver();
81
+ this._recalculateDimensions();
82
+ }
83
+ }
84
+
85
+ private _getParent(): HTMLElement | null {
86
+ return this.parentRef ?? this.parentElement;
87
+ }
88
+
89
+ private _attachResizeObserver(): void {
90
+ this._detachResizeObserver();
91
+
92
+ const parent = this._getParent();
93
+ if (!parent || typeof ResizeObserver === "undefined") {
94
+ return;
95
+ }
96
+
97
+ this._resizeObserver = new ResizeObserver(() => this._recalculateDimensions());
98
+ this._resizeObserver.observe(parent);
99
+ }
100
+
101
+ private _detachResizeObserver(): void {
102
+ this._resizeObserver?.disconnect();
103
+ this._resizeObserver = null;
104
+ }
105
+
106
+ private _recalculateDimensions(): void {
107
+ const parent = this._getParent();
108
+ if (!parent) {
109
+ return;
110
+ }
111
+
112
+ const parentWidth = parent.clientWidth;
113
+ const parentHeight = parent.clientHeight;
114
+ if (parentWidth <= 0 || parentHeight <= 0) {
115
+ return;
116
+ }
117
+
118
+ const maxWidth = parentWidth * this.scale;
119
+ const maxHeight = parentHeight * this.scale;
120
+
121
+ let width = maxWidth;
122
+ let height = width / ASPECT_RATIO;
123
+ if (height > maxHeight) {
124
+ height = maxHeight;
125
+ width = height * ASPECT_RATIO;
126
+ }
127
+
128
+ const nextDimensions: Size = {
129
+ width: Math.max(20, width),
130
+ height: Math.max(20, height),
131
+ };
132
+ this._dimensions = nextDimensions;
133
+
134
+ const maxTop = Math.max(0, parentHeight - nextDimensions.height);
135
+ const maxLeft = Math.max(0, parentWidth - nextDimensions.width);
136
+ this._position = {
137
+ top: Math.random() * maxTop,
138
+ left: Math.random() * maxLeft,
139
+ };
140
+
141
+ const baseSpeed = Math.max(1.2, Math.min(nextDimensions.width, nextDimensions.height) / 70);
142
+ this._velocity = {
143
+ x: baseSpeed * (Math.random() > 0.5 ? 1 : -1),
144
+ y: baseSpeed * (Math.random() > 0.5 ? 1 : -1),
145
+ };
146
+ }
147
+
148
+ private _startAnimation(): void {
149
+ if (this._animationFrame != null) {
150
+ return;
151
+ }
152
+
153
+ const tick = (timestamp: number) => {
154
+ const parent = this._getParent();
155
+ const dims = this._dimensions;
156
+ if (!parent || dims.width <= 0 || dims.height <= 0) {
157
+ this._animationFrame = requestAnimationFrame(tick);
158
+ return;
159
+ }
160
+
161
+ const deltaMs = timestamp - this._lastTimestamp;
162
+ this._lastTimestamp = timestamp;
163
+ const speedMultiplier = Math.min(deltaMs / 16, 2);
164
+
165
+ const maxTop = parent.clientHeight - dims.height;
166
+ const maxLeft = parent.clientWidth - dims.width;
167
+
168
+ let { top, left } = this._position;
169
+ let { x, y } = this._velocity;
170
+ let bounced = false;
171
+
172
+ top += y * speedMultiplier;
173
+ left += x * speedMultiplier;
174
+
175
+ if (top <= 0 || top >= maxTop) {
176
+ y = -y;
177
+ top = Math.max(0, Math.min(maxTop, top));
178
+ bounced = true;
179
+ }
180
+
181
+ if (left <= 0 || left >= maxLeft) {
182
+ x = -x;
183
+ left = Math.max(0, Math.min(maxLeft, left));
184
+ bounced = true;
185
+ }
186
+
187
+ this._velocity = { x, y };
188
+ this._position = { top, left };
189
+ if (bounced) {
190
+ this._color = pickNextColor(this._color);
191
+ }
192
+
193
+ this._animationFrame = requestAnimationFrame(tick);
194
+ };
195
+
196
+ this._animationFrame = requestAnimationFrame(tick);
197
+ }
198
+
199
+ private _stopAnimation(): void {
200
+ if (this._animationFrame != null) {
201
+ cancelAnimationFrame(this._animationFrame);
202
+ this._animationFrame = null;
203
+ }
204
+ }
205
+
206
+ protected render() {
207
+ return html`
208
+ <div
209
+ style="
210
+ position:absolute;
211
+ top:${this._position.top}px;
212
+ left:${this._position.left}px;
213
+ width:${this._dimensions.width}px;
214
+ height:${this._dimensions.height}px;
215
+ "
216
+ >
217
+ <svg width="100%" height="100%" viewBox="0 0 153 69" fill=${this._color}>
218
+ <g>
219
+ <path
220
+ d="M140.186,63.52h-1.695l-0.692,5.236h-0.847l0.77-5.236h-1.693l0.076-0.694h4.158L140.186,63.52L140.186,63.52z M146.346,68.756h-0.848v-4.545l0,0l-2.389,4.545l-1-4.545l0,0l-1.462,4.545h-0.771l1.924-5.931h0.695l0.924,4.006l2.078-4.006 h0.848V68.756L146.346,68.756z M126.027,0.063H95.352c0,0-8.129,9.592-9.654,11.434c-8.064,9.715-9.523,12.32-9.779,13.02 c0.063-0.699-0.256-3.304-3.686-13.148C71.282,8.7,68.359,0.062,68.359,0.062H57.881V0L32.35,0.063H13.169l-1.97,8.131 l14.543,0.062h3.365c9.336,0,15.055,3.747,13.467,10.354c-1.717,7.24-9.91,10.416-18.545,10.416h-3.24l4.191-17.783H10.502 L4.34,37.219h20.578c15.432,0,30.168-8.13,32.709-18.608c0.508-1.906,0.443-6.67-0.764-9.527c0-0.127-0.063-0.191-0.127-0.444 c-0.064-0.063-0.127-0.509,0.127-0.571c0.128-0.062,0.383,0.189,0.445,0.254c0.127,0.317,0.19,0.57,0.19,0.57l13.083,36.965 l33.344-37.6h14.1h3.365c9.337,0,15.055,3.747,13.528,10.354c-1.778,7.24-9.972,10.416-18.608,10.416h-3.238l4.191-17.783h-14.481 l-6.159,25.976h20.576c15.434,0,30.232-8.13,32.709-18.608C152.449,8.193,141.523,0.063,126.027,0.063L126.027,0.063z M71.091,45.981c-39.123,0-70.816,4.512-70.816,10.035c0,5.59,31.693,10.034,70.816,10.034c39.121,0,70.877-4.444,70.877-10.034 C141.968,50.493,110.212,45.981,71.091,45.981L71.091,45.981z M68.55,59.573c-8.956,0-16.196-1.523-16.196-3.365 c0-1.84,7.239-3.303,16.196-3.303c8.955,0,16.195,1.463,16.195,3.303C84.745,58.050,77.505,59.573,68.55,59.573L68.55,59.573z"
221
+ />
222
+ </g>
223
+ </svg>
224
+ </div>
225
+ `;
226
+ }
227
+ }
228
+
229
+ declare global {
230
+ interface HTMLElementTagNameMap {
231
+ "fw-dvd-logo": FwDvdLogo;
232
+ }
233
+ }