@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.
@@ -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 = (level: "root" | "submenu" = this._contextMenuActiveLevel) =>
228
+ private _getContextMenuItems = () =>
233
229
  Array.from(
234
230
  this._getQueryRoot()?.querySelectorAll<HTMLButtonElement>(
235
- `[data-context-menu-item="true"][data-context-menu-level="${level}"]:not([data-disabled="true"])`
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
- level: "root" | "submenu" = this._contextMenuActiveLevel
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
- if (this._contextMenuActiveLevel === "submenu") {
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
- if (e.key === "ArrowRight" && this._contextMenuActiveLevel === "root") {
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(this._contextMenuActiveLevel);
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("root");
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: