@livepeer-frameworks/player-wc 0.1.8 → 0.2.1

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 (141) hide show
  1. package/dist/esm/components/controls/fw-fullscreen-button.js +76 -0
  2. package/dist/esm/components/controls/fw-fullscreen-button.js.map +1 -0
  3. package/dist/esm/components/controls/fw-live-badge.js +109 -0
  4. package/dist/esm/components/controls/fw-live-badge.js.map +1 -0
  5. package/dist/esm/components/controls/fw-play-button.js +76 -0
  6. package/dist/esm/components/controls/fw-play-button.js.map +1 -0
  7. package/dist/esm/components/controls/fw-skip-button.js +62 -0
  8. package/dist/esm/components/controls/fw-skip-button.js.map +1 -0
  9. package/dist/esm/components/controls/fw-time-display.js +77 -0
  10. package/dist/esm/components/controls/fw-time-display.js.map +1 -0
  11. package/dist/esm/components/controls/fw-volume-control.js +76 -0
  12. package/dist/esm/components/controls/fw-volume-control.js.map +1 -0
  13. package/dist/esm/components/fw-dev-mode-panel.js +11 -15
  14. package/dist/esm/components/fw-dev-mode-panel.js.map +1 -1
  15. package/dist/esm/components/fw-error-overlay.js +13 -5
  16. package/dist/esm/components/fw-error-overlay.js.map +1 -1
  17. package/dist/esm/components/fw-idle-screen.js +10 -2
  18. package/dist/esm/components/fw-idle-screen.js.map +1 -1
  19. package/dist/esm/components/fw-loading-screen.js +89 -42
  20. package/dist/esm/components/fw-loading-screen.js.map +1 -1
  21. package/dist/esm/components/fw-loading-spinner.js +20 -9
  22. package/dist/esm/components/fw-loading-spinner.js.map +1 -1
  23. package/dist/esm/components/fw-player-controls.js +41 -26
  24. package/dist/esm/components/fw-player-controls.js.map +1 -1
  25. package/dist/esm/components/fw-player.js +165 -59
  26. package/dist/esm/components/fw-player.js.map +1 -1
  27. package/dist/esm/components/fw-settings-menu.js +44 -9
  28. package/dist/esm/components/fw-settings-menu.js.map +1 -1
  29. package/dist/esm/components/fw-stream-state-overlay.js +13 -5
  30. package/dist/esm/components/fw-stream-state-overlay.js.map +1 -1
  31. package/dist/esm/components/fw-toast.js +11 -1
  32. package/dist/esm/components/fw-toast.js.map +1 -1
  33. package/dist/esm/components/fw-volume-control.js +104 -39
  34. package/dist/esm/components/fw-volume-control.js.map +1 -1
  35. package/dist/esm/controllers/player-controller-host.js +14 -1
  36. package/dist/esm/controllers/player-controller-host.js.map +1 -1
  37. package/dist/esm/index.js +6 -0
  38. package/dist/esm/index.js.map +1 -1
  39. package/dist/esm/styles/shared-styles.js +401 -304
  40. package/dist/esm/styles/shared-styles.js.map +1 -1
  41. package/dist/fw-player.iife.js +722 -499
  42. package/dist/types/components/controls/fw-fullscreen-button.d.ts +18 -0
  43. package/dist/types/components/controls/fw-live-badge.d.ts +19 -0
  44. package/dist/types/components/controls/fw-play-button.d.ts +18 -0
  45. package/dist/types/components/controls/fw-skip-button.d.ts +17 -0
  46. package/dist/types/components/controls/fw-time-display.d.ts +17 -0
  47. package/dist/types/components/controls/fw-volume-control.d.ts +18 -0
  48. package/dist/types/components/controls/index.d.ts +6 -0
  49. package/dist/types/components/fw-dev-mode-panel.d.ts +1 -1
  50. package/dist/types/components/fw-error-overlay.d.ts +4 -0
  51. package/dist/types/components/fw-idle-screen.d.ts +4 -0
  52. package/dist/types/components/fw-loading-screen.d.ts +5 -1
  53. package/dist/types/components/fw-loading-spinner.d.ts +4 -0
  54. package/dist/types/components/fw-player-controls.d.ts +3 -1
  55. package/dist/types/components/fw-player.d.ts +10 -1
  56. package/dist/types/components/fw-settings-menu.d.ts +3 -1
  57. package/dist/types/components/fw-stream-state-overlay.d.ts +4 -0
  58. package/dist/types/components/fw-toast.d.ts +4 -0
  59. package/dist/types/components/fw-volume-control.d.ts +11 -0
  60. package/dist/types/controllers/player-controller-host.d.ts +7 -1
  61. package/dist/types/index.d.ts +1 -0
  62. package/package.json +10 -13
  63. package/src/components/controls/fw-fullscreen-button.ts +75 -0
  64. package/src/components/controls/fw-live-badge.ts +109 -0
  65. package/src/components/controls/fw-play-button.ts +75 -0
  66. package/src/components/controls/fw-skip-button.ts +59 -0
  67. package/src/components/controls/fw-time-display.ts +74 -0
  68. package/src/components/controls/fw-volume-control.ts +75 -0
  69. package/src/components/controls/index.ts +6 -0
  70. package/src/components/fw-dev-mode-panel.ts +10 -17
  71. package/src/components/fw-error-overlay.ts +13 -5
  72. package/src/components/fw-idle-screen.ts +10 -2
  73. package/src/components/fw-loading-screen.ts +90 -46
  74. package/src/components/fw-loading-spinner.ts +18 -9
  75. package/src/components/fw-player-controls.ts +39 -28
  76. package/src/components/fw-player.ts +166 -64
  77. package/src/components/fw-settings-menu.ts +49 -9
  78. package/src/components/fw-stream-state-overlay.ts +13 -5
  79. package/src/components/fw-toast.ts +11 -1
  80. package/src/components/fw-volume-control.ts +112 -43
  81. package/src/controllers/player-controller-host.ts +18 -0
  82. package/src/index.ts +10 -0
  83. package/src/styles/shared-styles.ts +401 -304
  84. package/dist/cjs/components/fw-context-menu.js +0 -17
  85. package/dist/cjs/components/fw-context-menu.js.map +0 -1
  86. package/dist/cjs/components/fw-dev-mode-panel.js +0 -907
  87. package/dist/cjs/components/fw-dev-mode-panel.js.map +0 -1
  88. package/dist/cjs/components/fw-dvd-logo.js +0 -211
  89. package/dist/cjs/components/fw-dvd-logo.js.map +0 -1
  90. package/dist/cjs/components/fw-error-overlay.js +0 -101
  91. package/dist/cjs/components/fw-error-overlay.js.map +0 -1
  92. package/dist/cjs/components/fw-idle-screen.js +0 -726
  93. package/dist/cjs/components/fw-idle-screen.js.map +0 -1
  94. package/dist/cjs/components/fw-loading-screen.js +0 -513
  95. package/dist/cjs/components/fw-loading-screen.js.map +0 -1
  96. package/dist/cjs/components/fw-loading-spinner.js +0 -62
  97. package/dist/cjs/components/fw-loading-spinner.js.map +0 -1
  98. package/dist/cjs/components/fw-player-controls.js +0 -441
  99. package/dist/cjs/components/fw-player-controls.js.map +0 -1
  100. package/dist/cjs/components/fw-player.js +0 -832
  101. package/dist/cjs/components/fw-player.js.map +0 -1
  102. package/dist/cjs/components/fw-seek-bar.js +0 -383
  103. package/dist/cjs/components/fw-seek-bar.js.map +0 -1
  104. package/dist/cjs/components/fw-settings-menu.js +0 -253
  105. package/dist/cjs/components/fw-settings-menu.js.map +0 -1
  106. package/dist/cjs/components/fw-skip-indicator.js +0 -143
  107. package/dist/cjs/components/fw-skip-indicator.js.map +0 -1
  108. package/dist/cjs/components/fw-speed-indicator.js +0 -61
  109. package/dist/cjs/components/fw-speed-indicator.js.map +0 -1
  110. package/dist/cjs/components/fw-stats-panel.js +0 -205
  111. package/dist/cjs/components/fw-stats-panel.js.map +0 -1
  112. package/dist/cjs/components/fw-stream-state-overlay.js +0 -338
  113. package/dist/cjs/components/fw-stream-state-overlay.js.map +0 -1
  114. package/dist/cjs/components/fw-subtitle-renderer.js +0 -217
  115. package/dist/cjs/components/fw-subtitle-renderer.js.map +0 -1
  116. package/dist/cjs/components/fw-thumbnail-overlay.js +0 -161
  117. package/dist/cjs/components/fw-thumbnail-overlay.js.map +0 -1
  118. package/dist/cjs/components/fw-title-overlay.js +0 -72
  119. package/dist/cjs/components/fw-title-overlay.js.map +0 -1
  120. package/dist/cjs/components/fw-toast.js +0 -74
  121. package/dist/cjs/components/fw-toast.js.map +0 -1
  122. package/dist/cjs/components/fw-volume-control.js +0 -221
  123. package/dist/cjs/components/fw-volume-control.js.map +0 -1
  124. package/dist/cjs/components/shared/hitmarker-audio.js +0 -76
  125. package/dist/cjs/components/shared/hitmarker-audio.js.map +0 -1
  126. package/dist/cjs/constants/media-assets.js +0 -11
  127. package/dist/cjs/constants/media-assets.js.map +0 -1
  128. package/dist/cjs/controllers/player-controller-host.js +0 -364
  129. package/dist/cjs/controllers/player-controller-host.js.map +0 -1
  130. package/dist/cjs/define.js +0 -53
  131. package/dist/cjs/define.js.map +0 -1
  132. package/dist/cjs/icons/index.js +0 -180
  133. package/dist/cjs/icons/index.js.map +0 -1
  134. package/dist/cjs/index.js +0 -108
  135. package/dist/cjs/index.js.map +0 -1
  136. package/dist/cjs/node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.57.1_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js +0 -33
  137. package/dist/cjs/node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.57.1_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js.map +0 -1
  138. package/dist/cjs/styles/shared-styles.js +0 -1985
  139. package/dist/cjs/styles/shared-styles.js.map +0 -1
  140. package/dist/cjs/styles/utility-styles.js +0 -725
  141. package/dist/cjs/styles/utility-styles.js.map +0 -1
@@ -6,6 +6,7 @@ import { PlayerControllerHost } from '../controllers/player-controller-host.js';
6
6
  import { sharedStyles } from '../styles/shared-styles.js';
7
7
  import { utilityStyles } from '../styles/utility-styles.js';
8
8
  import { closeIcon, statsIcon, settingsIcon, pictureInPictureIcon, loopIcon } from '../icons/index.js';
9
+ import { clearTheme, applyTheme, applyThemeOverrides } from '@livepeer-frameworks/player-core';
9
10
 
10
11
  let FwPlayer = class FwPlayer extends LitElement {
11
12
  constructor() {
@@ -28,6 +29,11 @@ let FwPlayer = class FwPlayer extends LitElement {
28
29
  this._skipDirection = null;
29
30
  this._contextMenuOpen = false;
30
31
  this._contextMenuMounted = false;
32
+ // Error fade-out
33
+ this._displayedError = null;
34
+ this._displayedIsPassive = false;
35
+ this._isErrorDismissing = false;
36
+ this._errorDismissTimer = null;
31
37
  this._contextMenuState = "closed";
32
38
  this._contextMenuSide = "bottom";
33
39
  this._contextMenuX = 0;
@@ -241,6 +247,29 @@ let FwPlayer = class FwPlayer extends LitElement {
241
247
  }
242
248
  // ---- Lifecycle ----
243
249
  willUpdate(changed) {
250
+ if (changed.has("locale")) {
251
+ this.pc.updateTranslator({ locale: this.locale ?? "en" });
252
+ }
253
+ // Error fade-out: sync displayed error from controller state
254
+ const es = this.pc.s;
255
+ if (es.error) {
256
+ if (this._errorDismissTimer) {
257
+ clearTimeout(this._errorDismissTimer);
258
+ this._errorDismissTimer = null;
259
+ }
260
+ this._displayedError = es.error;
261
+ this._displayedIsPassive = es.isPassiveError;
262
+ this._isErrorDismissing = false;
263
+ }
264
+ else if (this._displayedError && !this._isErrorDismissing) {
265
+ this._isErrorDismissing = true;
266
+ this._errorDismissTimer = setTimeout(() => {
267
+ this._displayedError = null;
268
+ this._displayedIsPassive = false;
269
+ this._isErrorDismissing = false;
270
+ this._errorDismissTimer = null;
271
+ }, 300);
272
+ }
244
273
  if (changed.has("contentId") ||
245
274
  changed.has("contentType") ||
246
275
  changed.has("gatewayUrl") ||
@@ -284,9 +313,25 @@ let FwPlayer = class FwPlayer extends LitElement {
284
313
  clearTimeout(this._contextMenuCloseTimer);
285
314
  this._contextMenuCloseTimer = undefined;
286
315
  }
316
+ if (this._errorDismissTimer) {
317
+ clearTimeout(this._errorDismissTimer);
318
+ this._errorDismissTimer = null;
319
+ }
287
320
  this._resetContextMenuTypeahead();
288
321
  }
289
322
  updated(changed) {
323
+ // Apply theme changes (preset or overrides) via JS custom properties
324
+ if (changed.has("theme") || changed.has("themeOverrides")) {
325
+ const root = this.shadowRoot?.querySelector('[part="root"]');
326
+ if (root) {
327
+ clearTheme(root);
328
+ if (this.theme && this.theme !== "default") {
329
+ applyTheme(root, this.theme);
330
+ }
331
+ if (this.themeOverrides)
332
+ applyThemeOverrides(root, this.themeOverrides);
333
+ }
334
+ }
290
335
  if (this.pc.s.toast) {
291
336
  clearTimeout(this._toastTimer);
292
337
  this._toastTimer = setTimeout(() => this.pc.dismissToast(), 3000);
@@ -315,15 +360,19 @@ let FwPlayer = class FwPlayer extends LitElement {
315
360
  get _waitingMessage() {
316
361
  const s = this.pc.s;
317
362
  if (this.gatewayUrl && s.state === "gateway_loading") {
318
- return "Resolving viewing endpoint...";
363
+ return this.pc.t("resolvingEndpoint");
319
364
  }
320
- return "Waiting for endpoint...";
365
+ return this.pc.t("waitingForStream");
321
366
  }
322
367
  get _useStockControls() {
323
368
  return (this.stockControls ||
324
369
  this.nativeControls ||
325
370
  this.pc.s.currentPlayerInfo?.shortname === "mist-legacy");
326
371
  }
372
+ /** Expose the PlayerControllerHost for composable controls */
373
+ get controller() {
374
+ return this.pc;
375
+ }
327
376
  // ---- Public API methods ----
328
377
  async play() {
329
378
  await this.pc.play();
@@ -391,6 +440,7 @@ let FwPlayer = class FwPlayer extends LitElement {
391
440
  flex: this.devMode,
392
441
  })}
393
442
  data-player-container="true"
443
+ data-theme=${this.theme && this.theme !== "default" ? this.theme : nothing}
394
444
  tabindex="0"
395
445
  @mouseenter=${() => this.pc.handleMouseEnter()}
396
446
  @mouseleave=${() => this.pc.handleMouseLeave()}
@@ -474,7 +524,7 @@ let FwPlayer = class FwPlayer extends LitElement {
474
524
  ? html `
475
525
  <fw-idle-screen
476
526
  .status=${s.isEffectivelyLive ? s.streamState?.status : undefined}
477
- .message=${s.isEffectivelyLive ? s.streamState?.message : "Loading video..."}
527
+ .message=${s.isEffectivelyLive ? s.streamState?.message : this.pc.t("loading")}
478
528
  .percentage=${s.isEffectivelyLive ? s.streamState?.percentage : undefined}
479
529
  @fw-retry=${() => {
480
530
  this.pc.clearError();
@@ -486,82 +536,108 @@ let FwPlayer = class FwPlayer extends LitElement {
486
536
 
487
537
  <!-- Buffering spinner -->
488
538
  ${this._showBufferingSpinner
539
+ ? html `
540
+ <div role="status" aria-live="polite" class="fw-buffering-overlay">
541
+ <div class="fw-buffering-pill">
542
+ <div class="fw-buffering-spinner"></div>
543
+ <span>${this.pc.t("buffering")}</span>
544
+ </div>
545
+ </div>
546
+ `
547
+ : nothing}
548
+
549
+ <!-- Passive error toast (non-blocking) -->
550
+ ${!s.shouldShowIdleScreen && this._displayedError && this._displayedIsPassive
489
551
  ? html `
490
552
  <div
553
+ class="absolute bottom-20 left-1/2 -translate-x-1/2 z-30"
554
+ style="transition:opacity 300ms;opacity:${this._isErrorDismissing ? "0" : "1"}"
491
555
  role="status"
492
556
  aria-live="polite"
493
- class="fw-player-surface absolute inset-0 flex items-center justify-center bg-black/40 backdrop-blur-sm z-20"
494
557
  >
495
558
  <div
496
- class="flex items-center gap-3 rounded-lg border border-white/10 bg-black/70 px-4 py-3 text-sm text-white shadow-lg"
559
+ class="flex items-center gap-2 rounded-lg border border-yellow-500/30 bg-black/80 px-4 py-2 text-sm text-white shadow-lg backdrop-blur-sm"
497
560
  >
498
- <div
499
- class="w-4 h-4 border-2 border-white/10 rounded-full animate-spin"
500
- style="border-top-color: white;"
501
- ></div>
502
- <span>Buffering...</span>
561
+ <span class="text-yellow-400 text-xs font-semibold uppercase"
562
+ >${this.pc.t("warning")}</span
563
+ >
564
+ <span>${this._displayedError}</span>
565
+ <button
566
+ type="button"
567
+ @click=${() => this.pc.clearError()}
568
+ class="ml-0.5 text-white/60 hover\\:text-white cursor-pointer"
569
+ aria-label=${this.pc.t("dismiss")}
570
+ >
571
+ ${closeIcon()}
572
+ </button>
503
573
  </div>
504
574
  </div>
505
575
  `
506
576
  : nothing}
507
577
 
508
- <!-- Error overlay -->
509
- ${!s.shouldShowIdleScreen && s.error
578
+ <!-- Fatal error overlay (blocking) — auto-dismisses on playback resume -->
579
+ ${!s.shouldShowIdleScreen && this._displayedError && !this._displayedIsPassive
510
580
  ? html `
511
581
  <div
512
582
  role="alert"
513
583
  aria-live="assertive"
514
- class=${classMap({
515
- "fw-error-overlay": true,
516
- "fw-error-overlay--passive": s.isPassiveError,
517
- "fw-error-overlay--fullscreen": !s.isPassiveError,
518
- })}
584
+ class="fw-error-overlay fw-error-overlay--fullscreen"
585
+ style="transition:opacity 300ms;opacity:${this._isErrorDismissing ? "0" : "1"}"
519
586
  >
520
- <div
521
- class=${classMap({
522
- "fw-error-popup": true,
523
- "fw-error-popup--passive": s.isPassiveError,
524
- "fw-error-popup--fullscreen": !s.isPassiveError,
525
- })}
526
- >
527
- <div
528
- class=${classMap({
529
- "fw-error-header": true,
530
- "fw-error-header--warning": s.isPassiveError,
531
- "fw-error-header--error": !s.isPassiveError,
532
- })}
533
- >
534
- <span
535
- class=${classMap({
536
- "fw-error-title": true,
537
- "fw-error-title--warning": s.isPassiveError,
538
- "fw-error-title--error": !s.isPassiveError,
539
- })}
540
- >${s.isPassiveError ? "Warning" : "Error"}</span
587
+ <div class="fw-error-popup fw-error-popup--fullscreen">
588
+ <div class="fw-error-header fw-error-header--error">
589
+ <span class="fw-error-title fw-error-title--error"
590
+ >${this.pc.t("error")}</span
541
591
  >
542
592
  <button
543
593
  type="button"
544
594
  class="fw-error-close"
545
595
  @click=${() => this.pc.clearError()}
546
- aria-label="Dismiss"
596
+ aria-label=${this.pc.t("dismiss")}
547
597
  >
548
598
  ${closeIcon()}
549
599
  </button>
550
600
  </div>
551
601
  <div class="fw-error-body">
552
- <p class="fw-error-message">Playback issue</p>
602
+ <p class="fw-error-message">${this._displayedError}</p>
553
603
  </div>
554
604
  <div class="fw-error-actions">
555
605
  <button
556
606
  type="button"
557
607
  class="fw-error-btn"
558
- aria-label="Retry playback"
608
+ aria-label=${this.pc.t("retry")}
559
609
  @click=${() => {
560
610
  this.pc.clearError();
561
611
  this.pc.retry();
562
612
  }}
563
613
  >
564
- Retry
614
+ ${this.pc.t("retry")}
615
+ </button>
616
+ ${this.pc.canAttemptFallback()
617
+ ? html `
618
+ <button
619
+ type="button"
620
+ class="fw-error-btn fw-error-btn--secondary"
621
+ aria-label=${this.pc.t("tryNext")}
622
+ @click=${() => {
623
+ this.pc.clearError();
624
+ this.pc.tryNextSource();
625
+ }}
626
+ >
627
+ ${this.pc.t("tryNext")}
628
+ </button>
629
+ `
630
+ : nothing}
631
+ <button
632
+ type="button"
633
+ class="fw-error-btn fw-error-btn--secondary"
634
+ aria-label=${this.pc.t("reloadPlayer")}
635
+ @click=${() => {
636
+ this.pc.clearError();
637
+ this.pc.reload();
638
+ }}
639
+ >
640
+ ${this.pc.t("reloadPlayer")}
565
641
  </button>
566
642
  </div>
567
643
  </div>
@@ -585,7 +661,7 @@ let FwPlayer = class FwPlayer extends LitElement {
585
661
  type="button"
586
662
  @click=${() => this.pc.dismissToast()}
587
663
  class="ml-0.5 text-white/60 hover\\:text-white cursor-pointer"
588
- aria-label="Dismiss"
664
+ aria-label=${this.pc.t("dismiss")}
589
665
  >
590
666
  ${closeIcon()}
591
667
  </button>
@@ -594,23 +670,29 @@ let FwPlayer = class FwPlayer extends LitElement {
594
670
  `
595
671
  : nothing}
596
672
 
597
- <!-- Player controls -->
673
+ <!-- Player controls: slot allows custom controls, fallback renders defaults -->
598
674
  ${!this._useStockControls
599
675
  ? html `
600
- <fw-player-controls
601
- part="controls"
602
- .pc=${this.pc}
603
- .playbackMode=${this.playbackMode}
604
- .isContentLive=${s.isEffectivelyLive}
605
- .devMode=${this.devMode}
606
- .isStatsOpen=${this._isStatsOpen}
607
- @fw-stats-toggle=${() => {
676
+ <slot name="controls">
677
+ <fw-player-controls
678
+ part="controls"
679
+ .pc=${this.pc}
680
+ .playbackMode=${this.playbackMode}
681
+ .isContentLive=${s.isEffectivelyLive}
682
+ .devMode=${this.devMode}
683
+ .isStatsOpen=${this._isStatsOpen}
684
+ .activeLocale=${this.locale ?? "en"}
685
+ @fw-stats-toggle=${() => {
608
686
  this._isStatsOpen = !this._isStatsOpen;
609
687
  }}
610
- @fw-mode-change=${(event) => {
688
+ @fw-mode-change=${(event) => {
611
689
  this.playbackMode = event.detail.mode;
612
690
  }}
613
- ></fw-player-controls>
691
+ @fw-locale-change=${(e) => {
692
+ this.locale = e.detail.locale;
693
+ }}
694
+ ></fw-player-controls>
695
+ </slot>
614
696
  `
615
697
  : nothing}
616
698
  </div>
@@ -640,7 +722,7 @@ let FwPlayer = class FwPlayer extends LitElement {
640
722
  data-context-menu="true"
641
723
  data-state=${this._contextMenuState}
642
724
  data-side=${this._contextMenuSide}
643
- class="fw-player-surface fw-context-menu"
725
+ class="fw-context-menu"
644
726
  role="menu"
645
727
  aria-label="Player options"
646
728
  tabindex="-1"
@@ -662,7 +744,7 @@ let FwPlayer = class FwPlayer extends LitElement {
662
744
  }}
663
745
  >
664
746
  <span class="opacity-70 shrink-0">${statsIcon(14)}</span>
665
- <span>${this._isStatsOpen ? "Hide Stats" : "Stats"}</span>
747
+ <span>${this._isStatsOpen ? this.pc.t("hideStats") : this.pc.t("showStats")}</span>
666
748
  </button>
667
749
  ${this.devMode
668
750
  ? html `
@@ -680,7 +762,11 @@ let FwPlayer = class FwPlayer extends LitElement {
680
762
  }}
681
763
  >
682
764
  <span class="opacity-70 shrink-0">${settingsIcon(14)}</span>
683
- <span>${this._isDevPanelOpen ? "Hide Settings" : "Settings"}</span>
765
+ <span
766
+ >${this._isDevPanelOpen
767
+ ? this.pc.t("hideSettings")
768
+ : this.pc.t("settings")}</span
769
+ >
684
770
  </button>
685
771
  `
686
772
  : nothing}
@@ -699,7 +785,7 @@ let FwPlayer = class FwPlayer extends LitElement {
699
785
  }}
700
786
  >
701
787
  <span class="opacity-70 shrink-0">${pictureInPictureIcon(14)}</span>
702
- <span>Picture-in-Picture</span>
788
+ <span>${this.pc.t("pictureInPicture")}</span>
703
789
  </button>
704
790
  <button
705
791
  type="button"
@@ -715,7 +801,7 @@ let FwPlayer = class FwPlayer extends LitElement {
715
801
  }}
716
802
  >
717
803
  <span class="opacity-70 shrink-0">${loopIcon(14)}</span>
718
- <span>${s.isLoopEnabled ? "Disable Loop" : "Enable Loop"}</span>
804
+ <span>${s.isLoopEnabled ? this.pc.t("disableLoop") : this.pc.t("enableLoop")}</span>
719
805
  </button>
720
806
  </div>
721
807
  `
@@ -732,6 +818,8 @@ FwPlayer.styles = [
732
818
  position: relative;
733
819
  width: 100%;
734
820
  height: 100%;
821
+ min-height: 0;
822
+ overflow: hidden;
735
823
  contain: layout style;
736
824
  }
737
825
  :host([hidden]) {
@@ -791,6 +879,15 @@ __decorate([
791
879
  __decorate([
792
880
  property({ attribute: "playback-mode" })
793
881
  ], FwPlayer.prototype, "playbackMode", void 0);
882
+ __decorate([
883
+ property({ attribute: "theme" })
884
+ ], FwPlayer.prototype, "theme", void 0);
885
+ __decorate([
886
+ property({ attribute: false })
887
+ ], FwPlayer.prototype, "themeOverrides", void 0);
888
+ __decorate([
889
+ property({ attribute: "locale" })
890
+ ], FwPlayer.prototype, "locale", void 0);
794
891
  __decorate([
795
892
  property({ attribute: false })
796
893
  ], FwPlayer.prototype, "endpoints", void 0);
@@ -809,6 +906,15 @@ __decorate([
809
906
  __decorate([
810
907
  state()
811
908
  ], FwPlayer.prototype, "_contextMenuMounted", void 0);
909
+ __decorate([
910
+ state()
911
+ ], FwPlayer.prototype, "_displayedError", void 0);
912
+ __decorate([
913
+ state()
914
+ ], FwPlayer.prototype, "_displayedIsPassive", void 0);
915
+ __decorate([
916
+ state()
917
+ ], FwPlayer.prototype, "_isErrorDismissing", void 0);
812
918
  __decorate([
813
919
  state()
814
920
  ], FwPlayer.prototype, "_contextMenuState", void 0);