@livepeer-frameworks/player-wc 0.1.4 → 0.1.6
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/dist/cjs/components/fw-dev-mode-panel.js +1 -0
- package/dist/cjs/components/fw-dev-mode-panel.js.map +1 -1
- package/dist/cjs/components/fw-player-controls.js +0 -34
- package/dist/cjs/components/fw-player-controls.js.map +1 -1
- package/dist/cjs/components/fw-player.js +8 -189
- package/dist/cjs/components/fw-player.js.map +1 -1
- package/dist/cjs/styles/shared-styles.js +18 -0
- package/dist/cjs/styles/shared-styles.js.map +1 -1
- package/dist/esm/components/fw-dev-mode-panel.js +1 -0
- package/dist/esm/components/fw-dev-mode-panel.js.map +1 -1
- package/dist/esm/components/fw-player-controls.js +0 -34
- package/dist/esm/components/fw-player-controls.js.map +1 -1
- package/dist/esm/components/fw-player.js +8 -189
- package/dist/esm/components/fw-player.js.map +1 -1
- package/dist/esm/styles/shared-styles.js +18 -0
- package/dist/esm/styles/shared-styles.js.map +1 -1
- package/dist/fw-player.iife.js +23 -102
- package/dist/types/components/fw-player-controls.d.ts +0 -1
- package/dist/types/components/fw-player.d.ts +0 -7
- package/package.json +2 -2
- package/src/components/fw-dev-mode-panel.ts +1 -0
- package/src/components/fw-player-controls.ts +0 -34
- package/src/components/fw-player.ts +9 -190
- package/src/styles/shared-styles.ts +18 -0
|
@@ -48,9 +48,6 @@ export class FwPlayer extends LitElement {
|
|
|
48
48
|
@state() private _contextMenuMounted = false;
|
|
49
49
|
@state() private _contextMenuState: "open" | "closed" = "closed";
|
|
50
50
|
@state() private _contextMenuSide: "top" | "bottom" | "left" | "right" = "bottom";
|
|
51
|
-
@state() private _contextMenuActiveLevel: "root" | "submenu" = "root";
|
|
52
|
-
@state() private _contextMenuOpenSubmenu: "playback-mode" | null = null;
|
|
53
|
-
@state() private _contextMenuSubmenuSide: "left" | "right" = "right";
|
|
54
51
|
@state() private _contextMenuX = 0;
|
|
55
52
|
@state() private _contextMenuY = 0;
|
|
56
53
|
|
|
@@ -82,6 +79,7 @@ export class FwPlayer extends LitElement {
|
|
|
82
79
|
.player-area--dev {
|
|
83
80
|
flex: 1;
|
|
84
81
|
min-width: 0;
|
|
82
|
+
min-height: 0;
|
|
85
83
|
}
|
|
86
84
|
`,
|
|
87
85
|
];
|
|
@@ -177,8 +175,6 @@ export class FwPlayer extends LitElement {
|
|
|
177
175
|
private _closeContextMenu = (restoreFocus = false) => {
|
|
178
176
|
this._contextMenuOpen = false;
|
|
179
177
|
this._contextMenuState = "closed";
|
|
180
|
-
this._contextMenuActiveLevel = "root";
|
|
181
|
-
this._contextMenuOpenSubmenu = null;
|
|
182
178
|
this._resetContextMenuTypeahead();
|
|
183
179
|
if (this._contextMenuCloseTimer) {
|
|
184
180
|
clearTimeout(this._contextMenuCloseTimer);
|
|
@@ -229,46 +225,18 @@ export class FwPlayer extends LitElement {
|
|
|
229
225
|
};
|
|
230
226
|
};
|
|
231
227
|
|
|
232
|
-
private _getContextMenuItems = (
|
|
228
|
+
private _getContextMenuItems = () =>
|
|
233
229
|
Array.from(
|
|
234
230
|
this._getQueryRoot()?.querySelectorAll<HTMLButtonElement>(
|
|
235
|
-
|
|
231
|
+
'[data-context-menu-item="true"][data-context-menu-level="root"]:not([data-disabled="true"])'
|
|
236
232
|
) ?? []
|
|
237
233
|
);
|
|
238
234
|
|
|
239
|
-
private _focusFirstContextMenuItem = (
|
|
240
|
-
|
|
241
|
-
) => {
|
|
242
|
-
const [firstItem] = this._getContextMenuItems(level);
|
|
235
|
+
private _focusFirstContextMenuItem = () => {
|
|
236
|
+
const [firstItem] = this._getContextMenuItems();
|
|
243
237
|
firstItem?.focus();
|
|
244
238
|
};
|
|
245
239
|
|
|
246
|
-
private _focusPlaybackModeTrigger = () => {
|
|
247
|
-
const trigger = this._getQueryRoot()?.querySelector<HTMLButtonElement>(
|
|
248
|
-
'[data-context-menu-trigger="playback-mode"]'
|
|
249
|
-
);
|
|
250
|
-
trigger?.focus();
|
|
251
|
-
};
|
|
252
|
-
|
|
253
|
-
private _openPlaybackModeSubmenu = () => {
|
|
254
|
-
this._contextMenuOpenSubmenu = "playback-mode";
|
|
255
|
-
this._contextMenuActiveLevel = "submenu";
|
|
256
|
-
this._resetContextMenuTypeahead();
|
|
257
|
-
queueMicrotask(() => {
|
|
258
|
-
this._syncPlaybackModeSubmenuSide();
|
|
259
|
-
this._focusFirstContextMenuItem("submenu");
|
|
260
|
-
});
|
|
261
|
-
};
|
|
262
|
-
|
|
263
|
-
private _closePlaybackModeSubmenu = (restoreTriggerFocus = false) => {
|
|
264
|
-
this._contextMenuOpenSubmenu = null;
|
|
265
|
-
this._contextMenuActiveLevel = "root";
|
|
266
|
-
this._resetContextMenuTypeahead();
|
|
267
|
-
if (restoreTriggerFocus) {
|
|
268
|
-
this._focusPlaybackModeTrigger();
|
|
269
|
-
}
|
|
270
|
-
};
|
|
271
|
-
|
|
272
240
|
private _clampContextMenuPosition = (x: number, y: number, width: number, height: number) => {
|
|
273
241
|
const viewportPadding = 8;
|
|
274
242
|
const bounds = this._getContextMenuBounds();
|
|
@@ -305,17 +273,6 @@ export class FwPlayer extends LitElement {
|
|
|
305
273
|
}
|
|
306
274
|
};
|
|
307
275
|
|
|
308
|
-
private _syncPlaybackModeSubmenuSide = () => {
|
|
309
|
-
if (this._contextMenuOpenSubmenu !== "playback-mode") return;
|
|
310
|
-
const menu = this._getContextMenuElement();
|
|
311
|
-
if (!menu) return;
|
|
312
|
-
const bounds = this._getContextMenuBounds();
|
|
313
|
-
const rect = menu.getBoundingClientRect();
|
|
314
|
-
const estimatedSubmenuWidth = 190;
|
|
315
|
-
this._contextMenuSubmenuSide =
|
|
316
|
-
rect.right + estimatedSubmenuWidth > bounds.right - 8 ? "left" : "right";
|
|
317
|
-
};
|
|
318
|
-
|
|
319
276
|
private _openContextMenu = (clientX: number, clientY: number) => {
|
|
320
277
|
const local = this._toLocalContextMenuPoint(clientX, clientY);
|
|
321
278
|
const next = this._clampContextMenuPosition(local.x, local.y, 220, 200);
|
|
@@ -324,8 +281,6 @@ export class FwPlayer extends LitElement {
|
|
|
324
281
|
this._contextMenuY = next.y;
|
|
325
282
|
this._contextMenuMounted = true;
|
|
326
283
|
this._contextMenuState = "open";
|
|
327
|
-
this._contextMenuActiveLevel = "root";
|
|
328
|
-
this._contextMenuOpenSubmenu = null;
|
|
329
284
|
if (this._contextMenuCloseTimer) {
|
|
330
285
|
clearTimeout(this._contextMenuCloseTimer);
|
|
331
286
|
this._contextMenuCloseTimer = undefined;
|
|
@@ -385,11 +340,7 @@ export class FwPlayer extends LitElement {
|
|
|
385
340
|
|
|
386
341
|
if (e.key === "Escape") {
|
|
387
342
|
e.preventDefault();
|
|
388
|
-
|
|
389
|
-
this._closePlaybackModeSubmenu(true);
|
|
390
|
-
} else {
|
|
391
|
-
this._closeContextMenu(true);
|
|
392
|
-
}
|
|
343
|
+
this._closeContextMenu(true);
|
|
393
344
|
return;
|
|
394
345
|
}
|
|
395
346
|
|
|
@@ -398,27 +349,13 @@ export class FwPlayer extends LitElement {
|
|
|
398
349
|
return;
|
|
399
350
|
}
|
|
400
351
|
|
|
401
|
-
|
|
402
|
-
if (activeElement?.dataset.contextMenuTrigger === "playback-mode") {
|
|
403
|
-
e.preventDefault();
|
|
404
|
-
this._openPlaybackModeSubmenu();
|
|
405
|
-
}
|
|
406
|
-
return;
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
if (e.key === "ArrowLeft" && this._contextMenuActiveLevel === "submenu") {
|
|
410
|
-
e.preventDefault();
|
|
411
|
-
this._closePlaybackModeSubmenu(true);
|
|
412
|
-
return;
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
const items = this._getContextMenuItems(this._contextMenuActiveLevel);
|
|
352
|
+
const items = this._getContextMenuItems();
|
|
416
353
|
if (items.length === 0) return;
|
|
417
354
|
const activeIndex = items.findIndex((item) => item === activeElement);
|
|
418
355
|
|
|
419
356
|
if (e.key === "Home") {
|
|
420
357
|
e.preventDefault();
|
|
421
|
-
this._focusFirstContextMenuItem(
|
|
358
|
+
this._focusFirstContextMenuItem();
|
|
422
359
|
return;
|
|
423
360
|
}
|
|
424
361
|
|
|
@@ -481,16 +418,7 @@ export class FwPlayer extends LitElement {
|
|
|
481
418
|
) {
|
|
482
419
|
queueMicrotask(() => {
|
|
483
420
|
this._syncContextMenuPosition();
|
|
484
|
-
this._focusFirstContextMenuItem(
|
|
485
|
-
});
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
if (
|
|
489
|
-
changed.has("_contextMenuOpenSubmenu") &&
|
|
490
|
-
this._contextMenuOpenSubmenu === "playback-mode"
|
|
491
|
-
) {
|
|
492
|
-
queueMicrotask(() => {
|
|
493
|
-
this._syncPlaybackModeSubmenuSide();
|
|
421
|
+
this._focusFirstContextMenuItem();
|
|
494
422
|
});
|
|
495
423
|
}
|
|
496
424
|
}
|
|
@@ -811,14 +739,10 @@ export class FwPlayer extends LitElement {
|
|
|
811
739
|
.playbackMode=${this.playbackMode}
|
|
812
740
|
.isContentLive=${s.isEffectivelyLive}
|
|
813
741
|
.devMode=${this.devMode}
|
|
814
|
-
.isDevPanelOpen=${this._isDevPanelOpen}
|
|
815
742
|
.isStatsOpen=${this._isStatsOpen}
|
|
816
743
|
@fw-stats-toggle=${() => {
|
|
817
744
|
this._isStatsOpen = !this._isStatsOpen;
|
|
818
745
|
}}
|
|
819
|
-
@fw-dev-panel-toggle=${() => {
|
|
820
|
-
this._isDevPanelOpen = !this._isDevPanelOpen;
|
|
821
|
-
}}
|
|
822
746
|
@fw-mode-change=${(event: CustomEvent<{ mode: PlaybackMode }>) => {
|
|
823
747
|
this.playbackMode = event.detail.mode;
|
|
824
748
|
}}
|
|
@@ -929,111 +853,6 @@ export class FwPlayer extends LitElement {
|
|
|
929
853
|
<span class="opacity-70 shrink-0">${loopIcon(14)}</span>
|
|
930
854
|
<span>${s.isLoopEnabled ? "Disable Loop" : "Enable Loop"}</span>
|
|
931
855
|
</button>
|
|
932
|
-
${this.devMode
|
|
933
|
-
? html`
|
|
934
|
-
<div class="fw-context-menu-separator"></div>
|
|
935
|
-
<button
|
|
936
|
-
type="button"
|
|
937
|
-
role="menuitem"
|
|
938
|
-
aria-haspopup="menu"
|
|
939
|
-
aria-expanded=${String(this._contextMenuOpenSubmenu === "playback-mode")}
|
|
940
|
-
tabindex="-1"
|
|
941
|
-
data-context-menu-item="true"
|
|
942
|
-
data-context-menu-level="root"
|
|
943
|
-
data-context-menu-trigger="playback-mode"
|
|
944
|
-
class="fw-context-menu-item gap-2"
|
|
945
|
-
@click=${() => {
|
|
946
|
-
if (this._contextMenuOpenSubmenu === "playback-mode") {
|
|
947
|
-
this._closePlaybackModeSubmenu();
|
|
948
|
-
} else {
|
|
949
|
-
this._openPlaybackModeSubmenu();
|
|
950
|
-
}
|
|
951
|
-
}}
|
|
952
|
-
>
|
|
953
|
-
<span>Playback Mode</span>
|
|
954
|
-
<span class="ml-auto opacity-70">›</span>
|
|
955
|
-
</button>
|
|
956
|
-
${this._contextMenuOpenSubmenu === "playback-mode"
|
|
957
|
-
? html`
|
|
958
|
-
<div
|
|
959
|
-
class="fw-player-surface fw-context-menu"
|
|
960
|
-
role="menu"
|
|
961
|
-
aria-label="Playback mode options"
|
|
962
|
-
data-state="open"
|
|
963
|
-
data-side=${this._contextMenuSubmenuSide === "right" ? "right" : "left"}
|
|
964
|
-
style=${this._contextMenuSubmenuSide === "right"
|
|
965
|
-
? "position:absolute; top:0; left: calc(100% + 4px);"
|
|
966
|
-
: "position:absolute; top:0; right: calc(100% + 4px);"}
|
|
967
|
-
>
|
|
968
|
-
<button
|
|
969
|
-
type="button"
|
|
970
|
-
role="menuitemradio"
|
|
971
|
-
aria-checked=${String(this.playbackMode === "auto")}
|
|
972
|
-
tabindex="-1"
|
|
973
|
-
data-context-menu-item="true"
|
|
974
|
-
data-context-menu-level="submenu"
|
|
975
|
-
class="fw-context-menu-item gap-2"
|
|
976
|
-
@click=${() => {
|
|
977
|
-
this.playbackMode = "auto";
|
|
978
|
-
void this.pc.setDevModeOptions({ playbackMode: "auto" });
|
|
979
|
-
this._closeContextMenu();
|
|
980
|
-
}}
|
|
981
|
-
>
|
|
982
|
-
<span>Auto</span>
|
|
983
|
-
</button>
|
|
984
|
-
<button
|
|
985
|
-
type="button"
|
|
986
|
-
role="menuitemradio"
|
|
987
|
-
aria-checked=${String(this.playbackMode === "low-latency")}
|
|
988
|
-
tabindex="-1"
|
|
989
|
-
data-context-menu-item="true"
|
|
990
|
-
data-context-menu-level="submenu"
|
|
991
|
-
class="fw-context-menu-item gap-2"
|
|
992
|
-
@click=${() => {
|
|
993
|
-
this.playbackMode = "low-latency";
|
|
994
|
-
void this.pc.setDevModeOptions({ playbackMode: "low-latency" });
|
|
995
|
-
this._closeContextMenu();
|
|
996
|
-
}}
|
|
997
|
-
>
|
|
998
|
-
<span>Low Latency</span>
|
|
999
|
-
</button>
|
|
1000
|
-
<button
|
|
1001
|
-
type="button"
|
|
1002
|
-
role="menuitemradio"
|
|
1003
|
-
aria-checked=${String(this.playbackMode === "quality")}
|
|
1004
|
-
tabindex="-1"
|
|
1005
|
-
data-context-menu-item="true"
|
|
1006
|
-
data-context-menu-level="submenu"
|
|
1007
|
-
class="fw-context-menu-item gap-2"
|
|
1008
|
-
@click=${() => {
|
|
1009
|
-
this.playbackMode = "quality";
|
|
1010
|
-
void this.pc.setDevModeOptions({ playbackMode: "quality" });
|
|
1011
|
-
this._closeContextMenu();
|
|
1012
|
-
}}
|
|
1013
|
-
>
|
|
1014
|
-
<span>Quality</span>
|
|
1015
|
-
</button>
|
|
1016
|
-
<button
|
|
1017
|
-
type="button"
|
|
1018
|
-
role="menuitemradio"
|
|
1019
|
-
aria-checked=${String(this.playbackMode === "vod")}
|
|
1020
|
-
tabindex="-1"
|
|
1021
|
-
data-context-menu-item="true"
|
|
1022
|
-
data-context-menu-level="submenu"
|
|
1023
|
-
class="fw-context-menu-item gap-2"
|
|
1024
|
-
@click=${() => {
|
|
1025
|
-
this.playbackMode = "vod";
|
|
1026
|
-
void this.pc.setDevModeOptions({ playbackMode: "vod" });
|
|
1027
|
-
this._closeContextMenu();
|
|
1028
|
-
}}
|
|
1029
|
-
>
|
|
1030
|
-
<span>VOD</span>
|
|
1031
|
-
</button>
|
|
1032
|
-
</div>
|
|
1033
|
-
`
|
|
1034
|
-
: nothing}
|
|
1035
|
-
`
|
|
1036
|
-
: nothing}
|
|
1037
856
|
</div>
|
|
1038
857
|
`
|
|
1039
858
|
: nothing}
|
|
@@ -442,11 +442,20 @@ export const sharedStyles = css`
|
|
|
442
442
|
.fw-context-menu-item {
|
|
443
443
|
position: relative;
|
|
444
444
|
display: flex;
|
|
445
|
+
width: 100%;
|
|
446
|
+
justify-content: flex-start;
|
|
447
|
+
gap: 0.5rem;
|
|
445
448
|
cursor: pointer;
|
|
446
449
|
user-select: none;
|
|
447
450
|
align-items: center;
|
|
448
451
|
padding: 0.5rem 0.75rem;
|
|
449
452
|
font-size: 0.875rem;
|
|
453
|
+
text-align: left;
|
|
454
|
+
font: inherit;
|
|
455
|
+
border: none;
|
|
456
|
+
background: transparent;
|
|
457
|
+
appearance: none;
|
|
458
|
+
-webkit-appearance: none;
|
|
450
459
|
outline: none;
|
|
451
460
|
color: hsl(var(--tn-fg));
|
|
452
461
|
transition:
|
|
@@ -485,11 +494,20 @@ export const sharedStyles = css`
|
|
|
485
494
|
.fw-context-menu-checkbox {
|
|
486
495
|
position: relative;
|
|
487
496
|
display: flex;
|
|
497
|
+
width: 100%;
|
|
498
|
+
justify-content: flex-start;
|
|
499
|
+
gap: 0.5rem;
|
|
488
500
|
cursor: pointer;
|
|
489
501
|
user-select: none;
|
|
490
502
|
align-items: center;
|
|
491
503
|
padding: 0.5rem 0.5rem 0.5rem 2rem;
|
|
492
504
|
font-size: 0.875rem;
|
|
505
|
+
text-align: left;
|
|
506
|
+
font: inherit;
|
|
507
|
+
border: none;
|
|
508
|
+
background: transparent;
|
|
509
|
+
appearance: none;
|
|
510
|
+
-webkit-appearance: none;
|
|
493
511
|
outline: none;
|
|
494
512
|
color: hsl(var(--tn-fg));
|
|
495
513
|
transition:
|