@livepeer-frameworks/player-wc 0.1.9 → 0.2.2
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/esm/components/controls/fw-fullscreen-button.js +76 -0
- package/dist/esm/components/controls/fw-fullscreen-button.js.map +1 -0
- package/dist/esm/components/controls/fw-live-badge.js +109 -0
- package/dist/esm/components/controls/fw-live-badge.js.map +1 -0
- package/dist/esm/components/controls/fw-play-button.js +76 -0
- package/dist/esm/components/controls/fw-play-button.js.map +1 -0
- package/dist/esm/components/controls/fw-skip-button.js +62 -0
- package/dist/esm/components/controls/fw-skip-button.js.map +1 -0
- package/dist/esm/components/controls/fw-time-display.js +77 -0
- package/dist/esm/components/controls/fw-time-display.js.map +1 -0
- package/dist/esm/components/controls/fw-volume-control.js +76 -0
- package/dist/esm/components/controls/fw-volume-control.js.map +1 -0
- package/dist/esm/components/fw-dev-mode-panel.js +11 -15
- package/dist/esm/components/fw-dev-mode-panel.js.map +1 -1
- package/dist/esm/components/fw-error-overlay.js +13 -5
- package/dist/esm/components/fw-error-overlay.js.map +1 -1
- package/dist/esm/components/fw-idle-screen.js +10 -2
- package/dist/esm/components/fw-idle-screen.js.map +1 -1
- package/dist/esm/components/fw-loading-screen.js +89 -42
- package/dist/esm/components/fw-loading-screen.js.map +1 -1
- package/dist/esm/components/fw-loading-spinner.js +20 -9
- package/dist/esm/components/fw-loading-spinner.js.map +1 -1
- package/dist/esm/components/fw-player-controls.js +18 -13
- package/dist/esm/components/fw-player-controls.js.map +1 -1
- package/dist/esm/components/fw-player.js +165 -59
- package/dist/esm/components/fw-player.js.map +1 -1
- package/dist/esm/components/fw-settings-menu.js +44 -9
- package/dist/esm/components/fw-settings-menu.js.map +1 -1
- package/dist/esm/components/fw-stream-state-overlay.js +13 -5
- package/dist/esm/components/fw-stream-state-overlay.js.map +1 -1
- package/dist/esm/components/fw-toast.js +11 -1
- package/dist/esm/components/fw-toast.js.map +1 -1
- package/dist/esm/components/fw-volume-control.js +13 -3
- package/dist/esm/components/fw-volume-control.js.map +1 -1
- package/dist/esm/controllers/player-controller-host.js +14 -1
- package/dist/esm/controllers/player-controller-host.js.map +1 -1
- package/dist/esm/index.js +6 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/styles/shared-styles.js +401 -304
- package/dist/esm/styles/shared-styles.js.map +1 -1
- package/dist/fw-player.iife.js +707 -488
- package/dist/types/components/controls/fw-fullscreen-button.d.ts +18 -0
- package/dist/types/components/controls/fw-live-badge.d.ts +19 -0
- package/dist/types/components/controls/fw-play-button.d.ts +18 -0
- package/dist/types/components/controls/fw-skip-button.d.ts +17 -0
- package/dist/types/components/controls/fw-time-display.d.ts +17 -0
- package/dist/types/components/controls/fw-volume-control.d.ts +18 -0
- package/dist/types/components/controls/index.d.ts +6 -0
- package/dist/types/components/fw-dev-mode-panel.d.ts +1 -1
- package/dist/types/components/fw-error-overlay.d.ts +4 -0
- package/dist/types/components/fw-idle-screen.d.ts +4 -0
- package/dist/types/components/fw-loading-screen.d.ts +5 -1
- package/dist/types/components/fw-loading-spinner.d.ts +4 -0
- package/dist/types/components/fw-player-controls.d.ts +2 -1
- package/dist/types/components/fw-player.d.ts +10 -1
- package/dist/types/components/fw-settings-menu.d.ts +3 -1
- package/dist/types/components/fw-stream-state-overlay.d.ts +4 -0
- package/dist/types/components/fw-toast.d.ts +4 -0
- package/dist/types/controllers/player-controller-host.d.ts +7 -1
- package/dist/types/index.d.ts +1 -0
- package/package.json +22 -25
- package/src/components/controls/fw-fullscreen-button.ts +75 -0
- package/src/components/controls/fw-live-badge.ts +109 -0
- package/src/components/controls/fw-play-button.ts +75 -0
- package/src/components/controls/fw-skip-button.ts +59 -0
- package/src/components/controls/fw-time-display.ts +74 -0
- package/src/components/controls/fw-volume-control.ts +75 -0
- package/src/components/controls/index.ts +6 -0
- package/src/components/fw-dev-mode-panel.ts +10 -17
- package/src/components/fw-error-overlay.ts +13 -5
- package/src/components/fw-idle-screen.ts +10 -2
- package/src/components/fw-loading-screen.ts +90 -46
- package/src/components/fw-loading-spinner.ts +18 -9
- package/src/components/fw-player-controls.ts +17 -13
- package/src/components/fw-player.ts +166 -64
- package/src/components/fw-settings-menu.ts +49 -9
- package/src/components/fw-stream-state-overlay.ts +13 -5
- package/src/components/fw-toast.ts +11 -1
- package/src/components/fw-volume-control.ts +14 -3
- package/src/controllers/player-controller-host.ts +18 -0
- package/src/index.ts +10 -0
- package/src/styles/shared-styles.ts +401 -304
- package/LICENSE.md +0 -24
- package/dist/cjs/components/fw-context-menu.js +0 -17
- package/dist/cjs/components/fw-context-menu.js.map +0 -1
- package/dist/cjs/components/fw-dev-mode-panel.js +0 -907
- package/dist/cjs/components/fw-dev-mode-panel.js.map +0 -1
- package/dist/cjs/components/fw-dvd-logo.js +0 -211
- package/dist/cjs/components/fw-dvd-logo.js.map +0 -1
- package/dist/cjs/components/fw-error-overlay.js +0 -101
- package/dist/cjs/components/fw-error-overlay.js.map +0 -1
- package/dist/cjs/components/fw-idle-screen.js +0 -726
- package/dist/cjs/components/fw-idle-screen.js.map +0 -1
- package/dist/cjs/components/fw-loading-screen.js +0 -513
- package/dist/cjs/components/fw-loading-screen.js.map +0 -1
- package/dist/cjs/components/fw-loading-spinner.js +0 -62
- package/dist/cjs/components/fw-loading-spinner.js.map +0 -1
- package/dist/cjs/components/fw-player-controls.js +0 -451
- package/dist/cjs/components/fw-player-controls.js.map +0 -1
- package/dist/cjs/components/fw-player.js +0 -832
- package/dist/cjs/components/fw-player.js.map +0 -1
- package/dist/cjs/components/fw-seek-bar.js +0 -383
- package/dist/cjs/components/fw-seek-bar.js.map +0 -1
- package/dist/cjs/components/fw-settings-menu.js +0 -253
- package/dist/cjs/components/fw-settings-menu.js.map +0 -1
- package/dist/cjs/components/fw-skip-indicator.js +0 -143
- package/dist/cjs/components/fw-skip-indicator.js.map +0 -1
- package/dist/cjs/components/fw-speed-indicator.js +0 -61
- package/dist/cjs/components/fw-speed-indicator.js.map +0 -1
- package/dist/cjs/components/fw-stats-panel.js +0 -205
- package/dist/cjs/components/fw-stats-panel.js.map +0 -1
- package/dist/cjs/components/fw-stream-state-overlay.js +0 -338
- package/dist/cjs/components/fw-stream-state-overlay.js.map +0 -1
- package/dist/cjs/components/fw-subtitle-renderer.js +0 -217
- package/dist/cjs/components/fw-subtitle-renderer.js.map +0 -1
- package/dist/cjs/components/fw-thumbnail-overlay.js +0 -161
- package/dist/cjs/components/fw-thumbnail-overlay.js.map +0 -1
- package/dist/cjs/components/fw-title-overlay.js +0 -72
- package/dist/cjs/components/fw-title-overlay.js.map +0 -1
- package/dist/cjs/components/fw-toast.js +0 -74
- package/dist/cjs/components/fw-toast.js.map +0 -1
- package/dist/cjs/components/fw-volume-control.js +0 -276
- package/dist/cjs/components/fw-volume-control.js.map +0 -1
- package/dist/cjs/components/shared/hitmarker-audio.js +0 -76
- package/dist/cjs/components/shared/hitmarker-audio.js.map +0 -1
- package/dist/cjs/constants/media-assets.js +0 -11
- package/dist/cjs/constants/media-assets.js.map +0 -1
- package/dist/cjs/controllers/player-controller-host.js +0 -364
- package/dist/cjs/controllers/player-controller-host.js.map +0 -1
- package/dist/cjs/define.js +0 -53
- package/dist/cjs/define.js.map +0 -1
- package/dist/cjs/icons/index.js +0 -180
- package/dist/cjs/icons/index.js.map +0 -1
- package/dist/cjs/index.js +0 -108
- package/dist/cjs/index.js.map +0 -1
- 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
- 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
- package/dist/cjs/styles/shared-styles.js +0 -1985
- package/dist/cjs/styles/shared-styles.js.map +0 -1
- package/dist/cjs/styles/utility-styles.js +0 -725
- package/dist/cjs/styles/utility-styles.js.map +0 -1
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { LitElement, html, css } from "lit";
|
|
2
|
+
import { customElement, property } from "lit/decorators.js";
|
|
3
|
+
import { createTranslator, type TranslateFn } from "@livepeer-frameworks/player-core";
|
|
4
|
+
|
|
5
|
+
@customElement("fw-skip-button")
|
|
6
|
+
export class FwSkipButton extends LitElement {
|
|
7
|
+
@property({ type: String }) direction: "back" | "forward" = "forward";
|
|
8
|
+
@property({ type: Number }) seconds = 10;
|
|
9
|
+
private _player: any = 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
|
+
}
|
|
32
|
+
|
|
33
|
+
private handleClick() {
|
|
34
|
+
const delta = this.direction === "back" ? -this.seconds : this.seconds;
|
|
35
|
+
this._player?.pc?.seekBy(delta);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
render() {
|
|
39
|
+
const label = this.direction === "back" ? this._t("skipBackward") : this._t("skipForward");
|
|
40
|
+
const icon = this.direction === "back" ? "\u23EA" : "\u23E9";
|
|
41
|
+
const shortcut = this.direction === "back" ? "j" : "l";
|
|
42
|
+
|
|
43
|
+
return html`<button
|
|
44
|
+
type="button"
|
|
45
|
+
class="fw-btn-flush"
|
|
46
|
+
aria-label=${label}
|
|
47
|
+
title="${label} (${shortcut})"
|
|
48
|
+
@click=${this.handleClick}
|
|
49
|
+
>
|
|
50
|
+
${icon} ${this.seconds}s
|
|
51
|
+
</button>`;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
declare global {
|
|
56
|
+
interface HTMLElementTagNameMap {
|
|
57
|
+
"fw-skip-button": FwSkipButton;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { LitElement, html, css } from "lit";
|
|
2
|
+
import { customElement, state } from "lit/decorators.js";
|
|
3
|
+
import { formatTimeDisplay } from "@livepeer-frameworks/player-core";
|
|
4
|
+
|
|
5
|
+
@customElement("fw-time-display")
|
|
6
|
+
export class FwTimeDisplay extends LitElement {
|
|
7
|
+
@state() private display = "";
|
|
8
|
+
private _player: any = null;
|
|
9
|
+
private _cleanup: (() => void) | null = null;
|
|
10
|
+
|
|
11
|
+
static styles = css`
|
|
12
|
+
:host {
|
|
13
|
+
display: inline-flex;
|
|
14
|
+
align-items: center;
|
|
15
|
+
font-variant-numeric: tabular-nums;
|
|
16
|
+
}
|
|
17
|
+
span {
|
|
18
|
+
white-space: nowrap;
|
|
19
|
+
font-size: 0.75rem;
|
|
20
|
+
}
|
|
21
|
+
`;
|
|
22
|
+
|
|
23
|
+
private _resolvePlayer(): HTMLElement | null {
|
|
24
|
+
const forId = this.getAttribute("for");
|
|
25
|
+
if (forId) return document.getElementById(forId);
|
|
26
|
+
return this.closest("fw-player");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
connectedCallback() {
|
|
30
|
+
super.connectedCallback();
|
|
31
|
+
this._player = this._resolvePlayer();
|
|
32
|
+
if (!this._player) return;
|
|
33
|
+
const pc = this._player.pc;
|
|
34
|
+
if (!pc) return;
|
|
35
|
+
|
|
36
|
+
this.updateDisplay();
|
|
37
|
+
const handler = () => this.updateDisplay();
|
|
38
|
+
this._player.addEventListener("fw-time-update", handler);
|
|
39
|
+
this._player.addEventListener("fw-ready", handler);
|
|
40
|
+
this._cleanup = () => {
|
|
41
|
+
this._player?.removeEventListener("fw-time-update", handler);
|
|
42
|
+
this._player?.removeEventListener("fw-ready", handler);
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
disconnectedCallback() {
|
|
47
|
+
super.disconnectedCallback();
|
|
48
|
+
this._cleanup?.();
|
|
49
|
+
this._cleanup = null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
private updateDisplay() {
|
|
53
|
+
const pc = this._player?.pc;
|
|
54
|
+
if (!pc) return;
|
|
55
|
+
const s = pc.s;
|
|
56
|
+
this.display = formatTimeDisplay({
|
|
57
|
+
isLive: s.isEffectivelyLive,
|
|
58
|
+
currentTime: s.currentTime,
|
|
59
|
+
duration: s.duration,
|
|
60
|
+
liveEdge: pc.getLiveEdge?.() ?? s.duration,
|
|
61
|
+
seekableStart: pc.getSeekableStart?.() ?? 0,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
render() {
|
|
66
|
+
return html`<span>${this.display}</span>`;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
declare global {
|
|
71
|
+
interface HTMLElementTagNameMap {
|
|
72
|
+
"fw-time-display": FwTimeDisplay;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -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-volume-button")
|
|
6
|
+
export class FwVolumeControl extends LitElement {
|
|
7
|
+
@state() private isMuted = 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.isMuted = pc.s.isMuted;
|
|
36
|
+
const handler = () => {
|
|
37
|
+
this.isMuted = this._player.pc.s.isMuted;
|
|
38
|
+
};
|
|
39
|
+
this._player.addEventListener("fw-volume-change", handler);
|
|
40
|
+
this._player.addEventListener("fw-ready", handler);
|
|
41
|
+
this._cleanup = () => {
|
|
42
|
+
this._player?.removeEventListener("fw-volume-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?.toggleMute();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
render() {
|
|
58
|
+
return html`<button
|
|
59
|
+
type="button"
|
|
60
|
+
class="fw-btn-flush"
|
|
61
|
+
aria-label=${this.isMuted ? this._t("unmute") : this._t("mute")}
|
|
62
|
+
aria-pressed=${this.isMuted}
|
|
63
|
+
title=${this.isMuted ? this._t("unmute") : this._t("mute")}
|
|
64
|
+
@click=${this.handleClick}
|
|
65
|
+
>
|
|
66
|
+
${this.isMuted ? "\uD83D\uDD07" : "\uD83D\uDD0A"}
|
|
67
|
+
</button>`;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
declare global {
|
|
72
|
+
interface HTMLElementTagNameMap {
|
|
73
|
+
"fw-volume-button": FwVolumeControl;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -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";
|
|
@@ -36,7 +36,7 @@ export class FwDevModePanel extends LitElement {
|
|
|
36
36
|
|
|
37
37
|
@state() private _activeTab: "config" | "stats" = "config";
|
|
38
38
|
@state() private _hoveredComboIndex: number | null = null;
|
|
39
|
-
@state() private
|
|
39
|
+
@state() private _tooltipPos: { top: number; left: number } | null = null;
|
|
40
40
|
@state() private _showDisabledPlayers = false;
|
|
41
41
|
|
|
42
42
|
@state() private _playbackScore = 1;
|
|
@@ -219,18 +219,12 @@ export class FwDevModePanel extends LitElement {
|
|
|
219
219
|
|
|
220
220
|
private _handleComboMouseEnter(index: number, event: MouseEvent): void {
|
|
221
221
|
this._hoveredComboIndex = index;
|
|
222
|
-
|
|
223
|
-
const container = this.renderRoot.querySelector(".fw-dev-body") as HTMLElement | null;
|
|
224
|
-
if (!container) {
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
222
|
const row = event.currentTarget as HTMLElement;
|
|
229
|
-
const containerRect = container.getBoundingClientRect();
|
|
230
223
|
const rowRect = row.getBoundingClientRect();
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
224
|
+
this._tooltipPos = {
|
|
225
|
+
top: Math.max(8, Math.min(rowRect.top, window.innerHeight - 200)),
|
|
226
|
+
left: Math.max(8, rowRect.left - 228),
|
|
227
|
+
};
|
|
234
228
|
}
|
|
235
229
|
|
|
236
230
|
private _handleModeChange(mode: "auto" | "low-latency" | "quality"): void {
|
|
@@ -764,6 +758,7 @@ export class FwDevModePanel extends LitElement {
|
|
|
764
758
|
this._handleComboMouseEnter(index, event)}
|
|
765
759
|
@mouseleave=${() => {
|
|
766
760
|
this._hoveredComboIndex = null;
|
|
761
|
+
this._tooltipPos = null;
|
|
767
762
|
}}
|
|
768
763
|
>
|
|
769
764
|
<button
|
|
@@ -804,14 +799,12 @@ export class FwDevModePanel extends LitElement {
|
|
|
804
799
|
>
|
|
805
800
|
</button>
|
|
806
801
|
|
|
807
|
-
${this._hoveredComboIndex === index
|
|
802
|
+
${this._hoveredComboIndex === index && this._tooltipPos
|
|
808
803
|
? html`
|
|
809
804
|
<div
|
|
810
|
-
class
|
|
811
|
-
|
|
812
|
-
"
|
|
813
|
-
"fw-dev-tooltip--below": !this._tooltipAbove,
|
|
814
|
-
})}
|
|
805
|
+
class="fw-dev-tooltip"
|
|
806
|
+
style="top: ${this._tooltipPos.top}px; left: ${this._tooltipPos
|
|
807
|
+
.left}px;"
|
|
815
808
|
>
|
|
816
809
|
<div class="fw-dev-tooltip-header">
|
|
817
810
|
<div class="fw-dev-tooltip-title">${combo.playerName}</div>
|
|
@@ -4,11 +4,19 @@ import { classMap } from "lit/directives/class-map.js";
|
|
|
4
4
|
import { sharedStyles } from "../styles/shared-styles.js";
|
|
5
5
|
import { utilityStyles } from "../styles/utility-styles.js";
|
|
6
6
|
import { closeIcon } from "../icons/index.js";
|
|
7
|
+
import { createTranslator, type TranslateFn } from "@livepeer-frameworks/player-core";
|
|
7
8
|
|
|
8
9
|
@customElement("fw-error-overlay")
|
|
9
10
|
export class FwErrorOverlay extends LitElement {
|
|
10
11
|
@property({ type: String }) error: string | null = null;
|
|
11
12
|
@property({ type: Boolean, attribute: "is-passive" }) isPassive = false;
|
|
13
|
+
@property({ attribute: false }) translator?: TranslateFn;
|
|
14
|
+
|
|
15
|
+
private _defaultTranslator: TranslateFn = createTranslator({ locale: "en" });
|
|
16
|
+
|
|
17
|
+
private get _t(): TranslateFn {
|
|
18
|
+
return this.translator ?? this._defaultTranslator;
|
|
19
|
+
}
|
|
12
20
|
|
|
13
21
|
static styles = [
|
|
14
22
|
sharedStyles,
|
|
@@ -51,28 +59,28 @@ export class FwErrorOverlay extends LitElement {
|
|
|
51
59
|
"fw-error-title--warning": this.isPassive,
|
|
52
60
|
"fw-error-title--error": !this.isPassive,
|
|
53
61
|
})}
|
|
54
|
-
>${this.isPassive ? "
|
|
62
|
+
>${this.isPassive ? this._t("warning") : this._t("error")}</span
|
|
55
63
|
>
|
|
56
64
|
<button
|
|
57
65
|
type="button"
|
|
58
66
|
class="fw-error-close"
|
|
59
67
|
@click=${this._clearError}
|
|
60
|
-
aria-label
|
|
68
|
+
aria-label=${this._t("dismiss")}
|
|
61
69
|
>
|
|
62
70
|
${closeIcon()}
|
|
63
71
|
</button>
|
|
64
72
|
</div>
|
|
65
73
|
<div class="fw-error-body">
|
|
66
|
-
<p class="fw-error-message"
|
|
74
|
+
<p class="fw-error-message">${this.error || this._t("playbackIssue")}</p>
|
|
67
75
|
</div>
|
|
68
76
|
<div class="fw-error-actions">
|
|
69
77
|
<button
|
|
70
78
|
type="button"
|
|
71
79
|
class="fw-error-btn"
|
|
72
|
-
aria-label
|
|
80
|
+
aria-label=${this._t("retry")}
|
|
73
81
|
@click=${this._retry}
|
|
74
82
|
>
|
|
75
|
-
|
|
83
|
+
${this._t("retry")}
|
|
76
84
|
</button>
|
|
77
85
|
</div>
|
|
78
86
|
</div>
|
|
@@ -4,6 +4,7 @@ import { sharedStyles } from "../styles/shared-styles.js";
|
|
|
4
4
|
import { utilityStyles } from "../styles/utility-styles.js";
|
|
5
5
|
import { LOGOMARK_DATA_URL } from "../constants/media-assets.js";
|
|
6
6
|
import { playHitmarkerSound } from "./shared/hitmarker-audio.js";
|
|
7
|
+
import { createTranslator, type TranslateFn } from "@livepeer-frameworks/player-core";
|
|
7
8
|
import "./fw-dvd-logo.js";
|
|
8
9
|
|
|
9
10
|
interface ParticleState {
|
|
@@ -59,6 +60,13 @@ export class FwIdleScreen extends LitElement {
|
|
|
59
60
|
@property({ type: String, attribute: "logo-src" }) logoSrc?: string;
|
|
60
61
|
@property({ type: Boolean, attribute: "retry-enabled" }) retryEnabled = false;
|
|
61
62
|
@property({ attribute: false }) onRetry?: () => void;
|
|
63
|
+
@property({ attribute: false }) translator?: TranslateFn;
|
|
64
|
+
|
|
65
|
+
private _defaultTranslator: TranslateFn = createTranslator({ locale: "en" });
|
|
66
|
+
|
|
67
|
+
private get _t(): TranslateFn {
|
|
68
|
+
return this.translator ?? this._defaultTranslator;
|
|
69
|
+
}
|
|
62
70
|
@query(".idle-container") private _containerEl?: HTMLDivElement;
|
|
63
71
|
|
|
64
72
|
@state() private _logoSize = 100;
|
|
@@ -552,7 +560,7 @@ export class FwIdleScreen extends LitElement {
|
|
|
552
560
|
}
|
|
553
561
|
|
|
554
562
|
private get _displayMessage() {
|
|
555
|
-
return this.error || this.message || "
|
|
563
|
+
return this.error || this.message || this._t("waitingForStream");
|
|
556
564
|
}
|
|
557
565
|
|
|
558
566
|
private _renderStatusIcon() {
|
|
@@ -744,7 +752,7 @@ export class FwIdleScreen extends LitElement {
|
|
|
744
752
|
: nothing}
|
|
745
753
|
${this._showRetry
|
|
746
754
|
? html`<button type="button" class="retry-btn" @click=${this._handleRetry}>
|
|
747
|
-
|
|
755
|
+
${this._t("retry")}
|
|
748
756
|
</button>`
|
|
749
757
|
: nothing}
|
|
750
758
|
</div>
|