@livepeer-frameworks/player-wc 0.1.9 → 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 (140) 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 +18 -13
  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 +13 -3
  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 +707 -488
  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 +2 -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/controllers/player-controller-host.d.ts +7 -1
  60. package/dist/types/index.d.ts +1 -0
  61. package/package.json +10 -13
  62. package/src/components/controls/fw-fullscreen-button.ts +75 -0
  63. package/src/components/controls/fw-live-badge.ts +109 -0
  64. package/src/components/controls/fw-play-button.ts +75 -0
  65. package/src/components/controls/fw-skip-button.ts +59 -0
  66. package/src/components/controls/fw-time-display.ts +74 -0
  67. package/src/components/controls/fw-volume-control.ts +75 -0
  68. package/src/components/controls/index.ts +6 -0
  69. package/src/components/fw-dev-mode-panel.ts +10 -17
  70. package/src/components/fw-error-overlay.ts +13 -5
  71. package/src/components/fw-idle-screen.ts +10 -2
  72. package/src/components/fw-loading-screen.ts +90 -46
  73. package/src/components/fw-loading-spinner.ts +18 -9
  74. package/src/components/fw-player-controls.ts +17 -13
  75. package/src/components/fw-player.ts +166 -64
  76. package/src/components/fw-settings-menu.ts +49 -9
  77. package/src/components/fw-stream-state-overlay.ts +13 -5
  78. package/src/components/fw-toast.ts +11 -1
  79. package/src/components/fw-volume-control.ts +14 -3
  80. package/src/controllers/player-controller-host.ts +18 -0
  81. package/src/index.ts +10 -0
  82. package/src/styles/shared-styles.ts +401 -304
  83. package/dist/cjs/components/fw-context-menu.js +0 -17
  84. package/dist/cjs/components/fw-context-menu.js.map +0 -1
  85. package/dist/cjs/components/fw-dev-mode-panel.js +0 -907
  86. package/dist/cjs/components/fw-dev-mode-panel.js.map +0 -1
  87. package/dist/cjs/components/fw-dvd-logo.js +0 -211
  88. package/dist/cjs/components/fw-dvd-logo.js.map +0 -1
  89. package/dist/cjs/components/fw-error-overlay.js +0 -101
  90. package/dist/cjs/components/fw-error-overlay.js.map +0 -1
  91. package/dist/cjs/components/fw-idle-screen.js +0 -726
  92. package/dist/cjs/components/fw-idle-screen.js.map +0 -1
  93. package/dist/cjs/components/fw-loading-screen.js +0 -513
  94. package/dist/cjs/components/fw-loading-screen.js.map +0 -1
  95. package/dist/cjs/components/fw-loading-spinner.js +0 -62
  96. package/dist/cjs/components/fw-loading-spinner.js.map +0 -1
  97. package/dist/cjs/components/fw-player-controls.js +0 -451
  98. package/dist/cjs/components/fw-player-controls.js.map +0 -1
  99. package/dist/cjs/components/fw-player.js +0 -832
  100. package/dist/cjs/components/fw-player.js.map +0 -1
  101. package/dist/cjs/components/fw-seek-bar.js +0 -383
  102. package/dist/cjs/components/fw-seek-bar.js.map +0 -1
  103. package/dist/cjs/components/fw-settings-menu.js +0 -253
  104. package/dist/cjs/components/fw-settings-menu.js.map +0 -1
  105. package/dist/cjs/components/fw-skip-indicator.js +0 -143
  106. package/dist/cjs/components/fw-skip-indicator.js.map +0 -1
  107. package/dist/cjs/components/fw-speed-indicator.js +0 -61
  108. package/dist/cjs/components/fw-speed-indicator.js.map +0 -1
  109. package/dist/cjs/components/fw-stats-panel.js +0 -205
  110. package/dist/cjs/components/fw-stats-panel.js.map +0 -1
  111. package/dist/cjs/components/fw-stream-state-overlay.js +0 -338
  112. package/dist/cjs/components/fw-stream-state-overlay.js.map +0 -1
  113. package/dist/cjs/components/fw-subtitle-renderer.js +0 -217
  114. package/dist/cjs/components/fw-subtitle-renderer.js.map +0 -1
  115. package/dist/cjs/components/fw-thumbnail-overlay.js +0 -161
  116. package/dist/cjs/components/fw-thumbnail-overlay.js.map +0 -1
  117. package/dist/cjs/components/fw-title-overlay.js +0 -72
  118. package/dist/cjs/components/fw-title-overlay.js.map +0 -1
  119. package/dist/cjs/components/fw-toast.js +0 -74
  120. package/dist/cjs/components/fw-toast.js.map +0 -1
  121. package/dist/cjs/components/fw-volume-control.js +0 -276
  122. package/dist/cjs/components/fw-volume-control.js.map +0 -1
  123. package/dist/cjs/components/shared/hitmarker-audio.js +0 -76
  124. package/dist/cjs/components/shared/hitmarker-audio.js.map +0 -1
  125. package/dist/cjs/constants/media-assets.js +0 -11
  126. package/dist/cjs/constants/media-assets.js.map +0 -1
  127. package/dist/cjs/controllers/player-controller-host.js +0 -364
  128. package/dist/cjs/controllers/player-controller-host.js.map +0 -1
  129. package/dist/cjs/define.js +0 -53
  130. package/dist/cjs/define.js.map +0 -1
  131. package/dist/cjs/icons/index.js +0 -180
  132. package/dist/cjs/icons/index.js.map +0 -1
  133. package/dist/cjs/index.js +0 -108
  134. package/dist/cjs/index.js.map +0 -1
  135. 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
  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.map +0 -1
  137. package/dist/cjs/styles/shared-styles.js +0 -1985
  138. package/dist/cjs/styles/shared-styles.js.map +0 -1
  139. package/dist/cjs/styles/utility-styles.js +0 -725
  140. package/dist/cjs/styles/utility-styles.js.map +0 -1
@@ -0,0 +1,18 @@
1
+ import { LitElement } from "lit";
2
+ export declare class FwFullscreenButton extends LitElement {
3
+ private isFullscreen;
4
+ private _player;
5
+ private _cleanup;
6
+ private get _t();
7
+ static styles: import("lit").CSSResult;
8
+ private _resolvePlayer;
9
+ connectedCallback(): void;
10
+ disconnectedCallback(): void;
11
+ private handleClick;
12
+ render(): import("lit").TemplateResult<1>;
13
+ }
14
+ declare global {
15
+ interface HTMLElementTagNameMap {
16
+ "fw-fullscreen-button": FwFullscreenButton;
17
+ }
18
+ }
@@ -0,0 +1,19 @@
1
+ import { LitElement } from "lit";
2
+ export declare class FwLiveBadge extends LitElement {
3
+ private isLive;
4
+ private _player;
5
+ private _cleanup;
6
+ private get _t();
7
+ static styles: import("lit").CSSResult;
8
+ private _resolvePlayer;
9
+ connectedCallback(): void;
10
+ disconnectedCallback(): void;
11
+ private syncLive;
12
+ private handleClick;
13
+ render(): import("lit").TemplateResult<1>;
14
+ }
15
+ declare global {
16
+ interface HTMLElementTagNameMap {
17
+ "fw-live-badge": FwLiveBadge;
18
+ }
19
+ }
@@ -0,0 +1,18 @@
1
+ import { LitElement } from "lit";
2
+ export declare class FwPlayButton extends LitElement {
3
+ private isPlaying;
4
+ private _player;
5
+ private _cleanup;
6
+ private get _t();
7
+ static styles: import("lit").CSSResult;
8
+ private _resolvePlayer;
9
+ connectedCallback(): void;
10
+ disconnectedCallback(): void;
11
+ private handleClick;
12
+ render(): import("lit").TemplateResult<1>;
13
+ }
14
+ declare global {
15
+ interface HTMLElementTagNameMap {
16
+ "fw-play-button": FwPlayButton;
17
+ }
18
+ }
@@ -0,0 +1,17 @@
1
+ import { LitElement } from "lit";
2
+ export declare class FwSkipButton extends LitElement {
3
+ direction: "back" | "forward";
4
+ seconds: number;
5
+ private _player;
6
+ private get _t();
7
+ static styles: import("lit").CSSResult;
8
+ private _resolvePlayer;
9
+ connectedCallback(): void;
10
+ private handleClick;
11
+ render(): import("lit").TemplateResult<1>;
12
+ }
13
+ declare global {
14
+ interface HTMLElementTagNameMap {
15
+ "fw-skip-button": FwSkipButton;
16
+ }
17
+ }
@@ -0,0 +1,17 @@
1
+ import { LitElement } from "lit";
2
+ export declare class FwTimeDisplay extends LitElement {
3
+ private display;
4
+ private _player;
5
+ private _cleanup;
6
+ static styles: import("lit").CSSResult;
7
+ private _resolvePlayer;
8
+ connectedCallback(): void;
9
+ disconnectedCallback(): void;
10
+ private updateDisplay;
11
+ render(): import("lit").TemplateResult<1>;
12
+ }
13
+ declare global {
14
+ interface HTMLElementTagNameMap {
15
+ "fw-time-display": FwTimeDisplay;
16
+ }
17
+ }
@@ -0,0 +1,18 @@
1
+ import { LitElement } from "lit";
2
+ export declare class FwVolumeControl extends LitElement {
3
+ private isMuted;
4
+ private _player;
5
+ private _cleanup;
6
+ private get _t();
7
+ static styles: import("lit").CSSResult;
8
+ private _resolvePlayer;
9
+ connectedCallback(): void;
10
+ disconnectedCallback(): void;
11
+ private handleClick;
12
+ render(): import("lit").TemplateResult<1>;
13
+ }
14
+ declare global {
15
+ interface HTMLElementTagNameMap {
16
+ "fw-volume-button": FwVolumeControl;
17
+ }
18
+ }
@@ -0,0 +1,6 @@
1
+ export { FwPlayButton } from "./fw-play-button";
2
+ export { FwSkipButton } from "./fw-skip-button";
3
+ export { FwVolumeControl } from "./fw-volume-control";
4
+ export { FwTimeDisplay } from "./fw-time-display";
5
+ export { FwLiveBadge } from "./fw-live-badge";
6
+ export { FwFullscreenButton } from "./fw-fullscreen-button";
@@ -10,7 +10,7 @@ export declare class FwDevModePanel extends LitElement {
10
10
  playbackMode: PlaybackMode;
11
11
  private _activeTab;
12
12
  private _hoveredComboIndex;
13
- private _tooltipAbove;
13
+ private _tooltipPos;
14
14
  private _showDisabledPlayers;
15
15
  private _playbackScore;
16
16
  private _qualityScore;
@@ -1,7 +1,11 @@
1
1
  import { LitElement } from "lit";
2
+ import { type TranslateFn } from "@livepeer-frameworks/player-core";
2
3
  export declare class FwErrorOverlay extends LitElement {
3
4
  error: string | null;
4
5
  isPassive: boolean;
6
+ translator?: TranslateFn;
7
+ private _defaultTranslator;
8
+ private get _t();
5
9
  static styles: import("lit").CSSResult[];
6
10
  protected render(): import("lit").TemplateResult<1>;
7
11
  private _clearError;
@@ -1,4 +1,5 @@
1
1
  import { LitElement } from "lit";
2
+ import { type TranslateFn } from "@livepeer-frameworks/player-core";
2
3
  import "./fw-dvd-logo.js";
3
4
  export declare class FwIdleScreen extends LitElement {
4
5
  status?: string;
@@ -8,6 +9,9 @@ export declare class FwIdleScreen extends LitElement {
8
9
  logoSrc?: string;
9
10
  retryEnabled: boolean;
10
11
  onRetry?: () => void;
12
+ translator?: TranslateFn;
13
+ private _defaultTranslator;
14
+ private get _t();
11
15
  private _containerEl?;
12
16
  private _logoSize;
13
17
  private _logoOffset;
@@ -1,8 +1,11 @@
1
1
  import { LitElement } from "lit";
2
+ import { type TranslateFn } from "@livepeer-frameworks/player-core";
2
3
  import "./fw-dvd-logo.js";
3
4
  export declare class FwLoadingScreen extends LitElement {
4
- message: string;
5
+ message?: string;
5
6
  logoSrc?: string;
7
+ translator?: TranslateFn;
8
+ private _defaultTranslator;
6
9
  private _containerEl?;
7
10
  private _logoSize;
8
11
  private _logoOffset;
@@ -27,6 +30,7 @@ export declare class FwLoadingScreen extends LitElement {
27
30
  private _handleMouseMove;
28
31
  private _handleMouseLeave;
29
32
  private _handleLogoClick;
33
+ private get _t();
30
34
  protected render(): import("lit").TemplateResult<1>;
31
35
  }
32
36
  declare global {
@@ -1,5 +1,9 @@
1
1
  import { LitElement } from "lit";
2
+ import { type TranslateFn } from "@livepeer-frameworks/player-core";
2
3
  export declare class FwLoadingSpinner extends LitElement {
4
+ translator?: TranslateFn;
5
+ private _defaultTranslator;
6
+ private get _t();
3
7
  static styles: import("lit").CSSResult;
4
8
  protected render(): import("lit").TemplateResult<1>;
5
9
  }
@@ -3,7 +3,7 @@
3
3
  * Parity port of React/Svelte control behavior.
4
4
  */
5
5
  import { LitElement, type PropertyValues } from "lit";
6
- import { type PlaybackMode } from "@livepeer-frameworks/player-core";
6
+ import { type PlaybackMode, type FwLocale } from "@livepeer-frameworks/player-core";
7
7
  import type { PlayerControllerHost } from "../controllers/player-controller-host.js";
8
8
  export declare class FwPlayerControls extends LitElement {
9
9
  pc: PlayerControllerHost;
@@ -12,6 +12,7 @@ export declare class FwPlayerControls extends LitElement {
12
12
  devMode: boolean;
13
13
  showStatsButton: boolean;
14
14
  isStatsOpen: boolean;
15
+ activeLocale?: FwLocale;
15
16
  private _settingsOpen;
16
17
  private _isNearLiveState;
17
18
  private _buffered;
@@ -4,7 +4,7 @@
4
4
  */
5
5
  import { LitElement, type PropertyValues } from "lit";
6
6
  import { PlayerControllerHost } from "../controllers/player-controller-host.js";
7
- import type { ContentEndpoints, PlaybackMode } from "@livepeer-frameworks/player-core";
7
+ import type { ContentEndpoints, PlaybackMode, FwThemePreset, FwThemeOverrides, FwLocale } from "@livepeer-frameworks/player-core";
8
8
  export declare class FwPlayer extends LitElement {
9
9
  contentId: string;
10
10
  contentType?: "live" | "dvr" | "clip" | "vod";
@@ -20,12 +20,19 @@ export declare class FwPlayer extends LitElement {
20
20
  devMode: boolean;
21
21
  thumbnailUrl?: string;
22
22
  playbackMode: PlaybackMode;
23
+ theme?: FwThemePreset;
24
+ themeOverrides?: FwThemeOverrides;
25
+ locale?: FwLocale;
23
26
  endpoints?: ContentEndpoints;
24
27
  private _isStatsOpen;
25
28
  private _isDevPanelOpen;
26
29
  private _skipDirection;
27
30
  private _contextMenuOpen;
28
31
  private _contextMenuMounted;
32
+ private _displayedError;
33
+ private _displayedIsPassive;
34
+ private _isErrorDismissing;
35
+ private _errorDismissTimer;
29
36
  private _contextMenuState;
30
37
  private _contextMenuSide;
31
38
  private _contextMenuX;
@@ -64,6 +71,8 @@ export declare class FwPlayer extends LitElement {
64
71
  private get _showWaitingForEndpoint();
65
72
  private get _waitingMessage();
66
73
  private get _useStockControls();
74
+ /** Expose the PlayerControllerHost for composable controls */
75
+ get controller(): PlayerControllerHost;
67
76
  play(): Promise<void>;
68
77
  pause(): void;
69
78
  togglePlay(): void;
@@ -2,7 +2,7 @@
2
2
  * <fw-settings-menu> — Mode, speed, quality, and captions settings popup.
3
3
  */
4
4
  import { LitElement, nothing } from "lit";
5
- import type { PlaybackMode } from "@livepeer-frameworks/player-core";
5
+ import type { PlaybackMode, FwLocale } from "@livepeer-frameworks/player-core";
6
6
  import type { PlayerControllerHost } from "../controllers/player-controller-host.js";
7
7
  export declare class FwSettingsMenu extends LitElement {
8
8
  pc: PlayerControllerHost;
@@ -13,6 +13,7 @@ export declare class FwSettingsMenu extends LitElement {
13
13
  qualityValue?: string;
14
14
  captionValue?: string;
15
15
  supportsPlaybackRate?: boolean;
16
+ activeLocale?: FwLocale;
16
17
  private _playbackRate;
17
18
  static styles: import("lit").CSSResult[];
18
19
  protected updated(): void;
@@ -21,6 +22,7 @@ export declare class FwSettingsMenu extends LitElement {
21
22
  private _handleSpeedChange;
22
23
  private _handleQualityChange;
23
24
  private _handleCaptionChange;
25
+ private _handleLocaleChange;
24
26
  private _deriveFallbackQualities;
25
27
  protected render(): import("lit").TemplateResult<1> | typeof nothing;
26
28
  }
@@ -1,5 +1,6 @@
1
1
  import { LitElement, nothing } from "lit";
2
2
  import type { StreamStatus } from "@livepeer-frameworks/player-core";
3
+ import { type TranslateFn } from "@livepeer-frameworks/player-core";
3
4
  export declare class FwStreamStateOverlay extends LitElement {
4
5
  status: StreamStatus;
5
6
  message: string;
@@ -7,6 +8,9 @@ export declare class FwStreamStateOverlay extends LitElement {
7
8
  visible: boolean;
8
9
  retryEnabled: boolean;
9
10
  onRetry?: () => void;
11
+ translator?: TranslateFn;
12
+ private _defaultTranslator;
13
+ private get _t();
10
14
  static styles: import("lit").CSSResult[];
11
15
  private _getStatusLabel;
12
16
  private _renderStatusIcon;
@@ -1,6 +1,10 @@
1
1
  import { LitElement, nothing } from "lit";
2
+ import { type TranslateFn } from "@livepeer-frameworks/player-core";
2
3
  export declare class FwToast extends LitElement {
3
4
  message: string;
5
+ translator?: TranslateFn;
6
+ private _defaultTranslator;
7
+ private get _t();
4
8
  static styles: import("lit").CSSResult;
5
9
  protected render(): import("lit").TemplateResult<1> | typeof nothing;
6
10
  private _dismiss;
@@ -3,7 +3,7 @@
3
3
  * Direct port of usePlayerController.ts from player-react.
4
4
  */
5
5
  import type { ReactiveController, ReactiveControllerHost } from "lit";
6
- import { PlayerController, type PlayerControllerConfig, type PlayerState, type StreamState, type StreamInfo, type PlaybackQuality, type ContentEndpoints, type ContentMetadata, type ClassifiedError } from "@livepeer-frameworks/player-core";
6
+ import { PlayerController, type PlayerControllerConfig, type PlayerState, type StreamState, type StreamInfo, type PlaybackQuality, type ContentEndpoints, type ContentMetadata, type ClassifiedError, type TranslateFn, type I18nConfig } from "@livepeer-frameworks/player-core";
7
7
  export interface PlayerControllerHostState {
8
8
  state: PlayerState;
9
9
  streamState: StreamState | null;
@@ -68,7 +68,11 @@ export declare class PlayerControllerHost implements ReactiveController {
68
68
  private unsubs;
69
69
  private currentConfig;
70
70
  s: PlayerControllerHostState;
71
+ /** Translation function, updated when locale changes. */
72
+ t: TranslateFn;
71
73
  constructor(host: HostElement);
74
+ /** Rebuild the translator when locale or custom translations change. */
75
+ updateTranslator(config: I18nConfig): void;
72
76
  configure(config: PlayerControllerConfig): void;
73
77
  attach(container: HTMLDivElement): Promise<void>;
74
78
  hostConnected(): void;
@@ -93,6 +97,8 @@ export declare class PlayerControllerHost implements ReactiveController {
93
97
  clearError(): void;
94
98
  dismissToast(): void;
95
99
  retry(): Promise<void>;
100
+ tryNextSource(): Promise<void>;
101
+ canAttemptFallback(): boolean;
96
102
  reload(): Promise<void>;
97
103
  getQualities(): {
98
104
  id: string;
@@ -25,5 +25,6 @@ export { FwSubtitleRenderer } from "./components/fw-subtitle-renderer.js";
25
25
  export { FwSkipIndicator } from "./components/fw-skip-indicator.js";
26
26
  export { FwSpeedIndicator } from "./components/fw-speed-indicator.js";
27
27
  export { FwContextMenu } from "./components/fw-context-menu.js";
28
+ export { FwPlayButton, FwSkipButton, FwVolumeControl as FwVolumeButton, FwTimeDisplay, FwLiveBadge, FwFullscreenButton, } from "./components/controls/index.js";
28
29
  export { PlayerControllerHost } from "./controllers/player-controller-host.js";
29
30
  export type { PlayerControllerHostState } from "./controllers/player-controller-host.js";
package/package.json CHANGED
@@ -1,10 +1,9 @@
1
1
  {
2
2
  "name": "@livepeer-frameworks/player-wc",
3
- "version": "0.1.9",
3
+ "version": "0.2.1",
4
4
  "type": "module",
5
5
  "description": "Lit Web Components for FrameWorks streaming player — <fw-player> custom element with full UI",
6
- "main": "dist/cjs/index.js",
7
- "module": "dist/esm/index.js",
6
+ "main": "dist/esm/index.js",
8
7
  "types": "dist/types/index.d.ts",
9
8
  "files": [
10
9
  "dist",
@@ -14,32 +13,30 @@
14
13
  ".": {
15
14
  "source": "./src/index.ts",
16
15
  "types": "./dist/types/index.d.ts",
17
- "import": "./dist/esm/index.js",
18
- "require": "./dist/cjs/index.js"
16
+ "default": "./dist/esm/index.js"
19
17
  },
20
18
  "./define": {
21
19
  "source": "./src/define.ts",
22
20
  "types": "./dist/types/define.d.ts",
23
- "import": "./dist/esm/define.js",
24
- "require": "./dist/cjs/define.js"
21
+ "default": "./dist/esm/define.js"
25
22
  },
26
23
  "./fw-player.js": {
27
24
  "default": "./dist/fw-player.iife.js"
28
25
  }
29
26
  },
30
27
  "dependencies": {
31
- "lit": "^3.2.0",
32
- "@livepeer-frameworks/player-core": "0.1.5"
28
+ "lit": "^3.3.2",
29
+ "@livepeer-frameworks/player-core": "0.2.1"
33
30
  },
34
31
  "devDependencies": {
35
32
  "@rollup/plugin-commonjs": "^29.0.0",
36
- "@rollup/plugin-node-resolve": "^16.0.1",
37
- "@rollup/plugin-terser": "^0.4.0",
38
- "@rollup/plugin-typescript": "^12.1.4",
33
+ "@rollup/plugin-node-resolve": "^16.0.3",
34
+ "@rollup/plugin-terser": "^0.4.4",
35
+ "@rollup/plugin-typescript": "^12.3.0",
39
36
  "@vitest/coverage-v8": "^4.0.18",
40
37
  "rollup": "^4.57.1",
41
38
  "tslib": "^2.8.1",
42
- "typescript": "^5.9.2",
39
+ "typescript": "^5.9.3",
43
40
  "vitest": "^4.0.18"
44
41
  },
45
42
  "keywords": [
@@ -0,0 +1,75 @@
1
+ import { LitElement, html, css } from "lit";
2
+ import { customElement, state } from "lit/decorators.js";
3
+ import { createTranslator, type TranslateFn } from "@livepeer-frameworks/player-core";
4
+
5
+ @customElement("fw-fullscreen-button")
6
+ export class FwFullscreenButton extends LitElement {
7
+ @state() private isFullscreen = false;
8
+ private _player: any = null;
9
+ private _cleanup: (() => void) | null = null;
10
+
11
+ private get _t(): TranslateFn {
12
+ return this._player?.pc?.t ?? createTranslator({ locale: "en" });
13
+ }
14
+
15
+ static styles = css`
16
+ :host {
17
+ display: inline-flex;
18
+ align-items: center;
19
+ }
20
+ `;
21
+
22
+ private _resolvePlayer(): HTMLElement | null {
23
+ const forId = this.getAttribute("for");
24
+ if (forId) return document.getElementById(forId);
25
+ return this.closest("fw-player");
26
+ }
27
+
28
+ connectedCallback() {
29
+ super.connectedCallback();
30
+ this._player = this._resolvePlayer();
31
+ if (!this._player) return;
32
+ const pc = this._player.pc;
33
+ if (!pc) return;
34
+
35
+ this.isFullscreen = pc.s.isFullscreen;
36
+ const handler = () => {
37
+ this.isFullscreen = this._player.pc.s.isFullscreen;
38
+ };
39
+ this._player.addEventListener("fw-fullscreen-change", handler);
40
+ this._player.addEventListener("fw-ready", handler);
41
+ this._cleanup = () => {
42
+ this._player?.removeEventListener("fw-fullscreen-change", handler);
43
+ this._player?.removeEventListener("fw-ready", handler);
44
+ };
45
+ }
46
+
47
+ disconnectedCallback() {
48
+ super.disconnectedCallback();
49
+ this._cleanup?.();
50
+ this._cleanup = null;
51
+ }
52
+
53
+ private handleClick() {
54
+ this._player?.pc?.toggleFullscreen();
55
+ }
56
+
57
+ render() {
58
+ return html`<button
59
+ type="button"
60
+ class="fw-btn-flush"
61
+ aria-label=${this.isFullscreen ? this._t("exitFullscreen") : this._t("fullscreen")}
62
+ aria-pressed=${this.isFullscreen}
63
+ title=${this.isFullscreen ? this._t("exitFullscreen") : this._t("fullscreen")}
64
+ @click=${this.handleClick}
65
+ >
66
+ ${this.isFullscreen ? "\u2716" : "\u26F6"}
67
+ </button>`;
68
+ }
69
+ }
70
+
71
+ declare global {
72
+ interface HTMLElementTagNameMap {
73
+ "fw-fullscreen-button": FwFullscreenButton;
74
+ }
75
+ }
@@ -0,0 +1,109 @@
1
+ import { LitElement, html, css } from "lit";
2
+ import { customElement, state } from "lit/decorators.js";
3
+ import { createTranslator, type TranslateFn } from "@livepeer-frameworks/player-core";
4
+
5
+ @customElement("fw-live-badge")
6
+ export class FwLiveBadge extends LitElement {
7
+ @state() private isLive = false;
8
+ private _player: any = null;
9
+ private _cleanup: (() => void) | null = null;
10
+
11
+ private get _t(): TranslateFn {
12
+ return this._player?.pc?.t ?? createTranslator({ locale: "en" });
13
+ }
14
+
15
+ static styles = css`
16
+ :host {
17
+ display: inline-flex;
18
+ align-items: center;
19
+ }
20
+ button {
21
+ display: inline-flex;
22
+ align-items: center;
23
+ gap: 0.25rem;
24
+ border: none;
25
+ background: none;
26
+ cursor: pointer;
27
+ padding: 0.125rem 0.375rem;
28
+ border-radius: 0.25rem;
29
+ font-size: 0.625rem;
30
+ font-weight: 700;
31
+ text-transform: uppercase;
32
+ letter-spacing: 0.05em;
33
+ color: inherit;
34
+ }
35
+ .dot {
36
+ width: 0.375rem;
37
+ height: 0.375rem;
38
+ border-radius: 50%;
39
+ background: #ef4444;
40
+ }
41
+ :host([live]) .dot {
42
+ animation: pulse 1.5s ease-in-out infinite;
43
+ }
44
+ @keyframes pulse {
45
+ 0%,
46
+ 100% {
47
+ opacity: 1;
48
+ }
49
+ 50% {
50
+ opacity: 0.4;
51
+ }
52
+ }
53
+ `;
54
+
55
+ private _resolvePlayer(): HTMLElement | null {
56
+ const forId = this.getAttribute("for");
57
+ if (forId) return document.getElementById(forId);
58
+ return this.closest("fw-player");
59
+ }
60
+
61
+ connectedCallback() {
62
+ super.connectedCallback();
63
+ this._player = this._resolvePlayer();
64
+ if (!this._player) return;
65
+ const pc = this._player.pc;
66
+ if (!pc) return;
67
+
68
+ this.syncLive();
69
+ const handler = () => this.syncLive();
70
+ this._player.addEventListener("fw-state-change", handler);
71
+ this._player.addEventListener("fw-stream-state", handler);
72
+ this._player.addEventListener("fw-ready", handler);
73
+ this._cleanup = () => {
74
+ this._player?.removeEventListener("fw-state-change", handler);
75
+ this._player?.removeEventListener("fw-stream-state", handler);
76
+ this._player?.removeEventListener("fw-ready", handler);
77
+ };
78
+ }
79
+
80
+ disconnectedCallback() {
81
+ super.disconnectedCallback();
82
+ this._cleanup?.();
83
+ this._cleanup = null;
84
+ }
85
+
86
+ private syncLive() {
87
+ const live = this._player?.pc?.s?.isEffectivelyLive ?? false;
88
+ this.isLive = live;
89
+ this.toggleAttribute("live", live);
90
+ }
91
+
92
+ private handleClick() {
93
+ this._player?.pc?.jumpToLive();
94
+ }
95
+
96
+ render() {
97
+ if (!this.isLive) return html``;
98
+
99
+ return html`<button type="button" aria-label=${this._t("live")} @click=${this.handleClick}>
100
+ <span class="dot"></span> ${this._t("live").toUpperCase()}
101
+ </button>`;
102
+ }
103
+ }
104
+
105
+ declare global {
106
+ interface HTMLElementTagNameMap {
107
+ "fw-live-badge": FwLiveBadge;
108
+ }
109
+ }
@@ -0,0 +1,75 @@
1
+ import { LitElement, html, css } from "lit";
2
+ import { customElement, state } from "lit/decorators.js";
3
+ import { createTranslator, type TranslateFn } from "@livepeer-frameworks/player-core";
4
+
5
+ @customElement("fw-play-button")
6
+ export class FwPlayButton extends LitElement {
7
+ @state() private isPlaying = false;
8
+ private _player: any = null;
9
+ private _cleanup: (() => void) | null = null;
10
+
11
+ private get _t(): TranslateFn {
12
+ return this._player?.pc?.t ?? createTranslator({ locale: "en" });
13
+ }
14
+
15
+ static styles = css`
16
+ :host {
17
+ display: inline-flex;
18
+ align-items: center;
19
+ }
20
+ `;
21
+
22
+ private _resolvePlayer(): HTMLElement | null {
23
+ const forId = this.getAttribute("for");
24
+ if (forId) return document.getElementById(forId);
25
+ return this.closest("fw-player");
26
+ }
27
+
28
+ connectedCallback() {
29
+ super.connectedCallback();
30
+ this._player = this._resolvePlayer();
31
+ if (!this._player) return;
32
+ const pc = this._player.pc;
33
+ if (!pc) return;
34
+
35
+ this.isPlaying = pc.s.isPlaying;
36
+ const handler = () => {
37
+ this.isPlaying = pc.s.isPlaying;
38
+ };
39
+ this._player.addEventListener("fw-state-change", handler);
40
+ this._player.addEventListener("fw-ready", handler);
41
+ this._cleanup = () => {
42
+ this._player?.removeEventListener("fw-state-change", handler);
43
+ this._player?.removeEventListener("fw-ready", handler);
44
+ };
45
+ }
46
+
47
+ disconnectedCallback() {
48
+ super.disconnectedCallback();
49
+ this._cleanup?.();
50
+ this._cleanup = null;
51
+ }
52
+
53
+ private handleClick() {
54
+ this._player?.pc?.togglePlay();
55
+ }
56
+
57
+ render() {
58
+ return html`<button
59
+ type="button"
60
+ class="fw-btn-flush"
61
+ aria-label=${this.isPlaying ? this._t("pause") : this._t("play")}
62
+ aria-pressed=${this.isPlaying}
63
+ title=${this.isPlaying ? this._t("pause") : this._t("play")}
64
+ @click=${this.handleClick}
65
+ >
66
+ ${this.isPlaying ? "\u23F8" : "\u25B6"}
67
+ </button>`;
68
+ }
69
+ }
70
+
71
+ declare global {
72
+ interface HTMLElementTagNameMap {
73
+ "fw-play-button": FwPlayButton;
74
+ }
75
+ }