@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.
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 +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 +22 -25
  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/LICENSE.md +0 -24
  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 -451
  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 -276
  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
@@ -0,0 +1,76 @@
1
+ import { __decorate } from '../../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';
2
+ import { css, LitElement, html } from 'lit';
3
+ import { state, customElement } from 'lit/decorators.js';
4
+ import { createTranslator } from '@livepeer-frameworks/player-core';
5
+
6
+ let FwFullscreenButton = class FwFullscreenButton extends LitElement {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.isFullscreen = false;
10
+ this._player = null;
11
+ this._cleanup = null;
12
+ }
13
+ get _t() {
14
+ return this._player?.pc?.t ?? createTranslator({ locale: "en" });
15
+ }
16
+ _resolvePlayer() {
17
+ const forId = this.getAttribute("for");
18
+ if (forId)
19
+ return document.getElementById(forId);
20
+ return this.closest("fw-player");
21
+ }
22
+ connectedCallback() {
23
+ super.connectedCallback();
24
+ this._player = this._resolvePlayer();
25
+ if (!this._player)
26
+ return;
27
+ const pc = this._player.pc;
28
+ if (!pc)
29
+ return;
30
+ this.isFullscreen = pc.s.isFullscreen;
31
+ const handler = () => {
32
+ this.isFullscreen = this._player.pc.s.isFullscreen;
33
+ };
34
+ this._player.addEventListener("fw-fullscreen-change", handler);
35
+ this._player.addEventListener("fw-ready", handler);
36
+ this._cleanup = () => {
37
+ this._player?.removeEventListener("fw-fullscreen-change", handler);
38
+ this._player?.removeEventListener("fw-ready", handler);
39
+ };
40
+ }
41
+ disconnectedCallback() {
42
+ super.disconnectedCallback();
43
+ this._cleanup?.();
44
+ this._cleanup = null;
45
+ }
46
+ handleClick() {
47
+ this._player?.pc?.toggleFullscreen();
48
+ }
49
+ render() {
50
+ return html `<button
51
+ type="button"
52
+ class="fw-btn-flush"
53
+ aria-label=${this.isFullscreen ? this._t("exitFullscreen") : this._t("fullscreen")}
54
+ aria-pressed=${this.isFullscreen}
55
+ title=${this.isFullscreen ? this._t("exitFullscreen") : this._t("fullscreen")}
56
+ @click=${this.handleClick}
57
+ >
58
+ ${this.isFullscreen ? "\u2716" : "\u26F6"}
59
+ </button>`;
60
+ }
61
+ };
62
+ FwFullscreenButton.styles = css `
63
+ :host {
64
+ display: inline-flex;
65
+ align-items: center;
66
+ }
67
+ `;
68
+ __decorate([
69
+ state()
70
+ ], FwFullscreenButton.prototype, "isFullscreen", void 0);
71
+ FwFullscreenButton = __decorate([
72
+ customElement("fw-fullscreen-button")
73
+ ], FwFullscreenButton);
74
+
75
+ export { FwFullscreenButton };
76
+ //# sourceMappingURL=fw-fullscreen-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fw-fullscreen-button.js","sources":["../../../../../src/components/controls/fw-fullscreen-button.ts"],"sourcesContent":["import { LitElement, html, css } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { createTranslator, type TranslateFn } from \"@livepeer-frameworks/player-core\";\n\n@customElement(\"fw-fullscreen-button\")\nexport class FwFullscreenButton extends LitElement {\n @state() private isFullscreen = false;\n private _player: any = null;\n private _cleanup: (() => void) | null = null;\n\n private get _t(): TranslateFn {\n return this._player?.pc?.t ?? createTranslator({ locale: \"en\" });\n }\n\n static styles = css`\n :host {\n display: inline-flex;\n align-items: center;\n }\n `;\n\n private _resolvePlayer(): HTMLElement | null {\n const forId = this.getAttribute(\"for\");\n if (forId) return document.getElementById(forId);\n return this.closest(\"fw-player\");\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._player = this._resolvePlayer();\n if (!this._player) return;\n const pc = this._player.pc;\n if (!pc) return;\n\n this.isFullscreen = pc.s.isFullscreen;\n const handler = () => {\n this.isFullscreen = this._player.pc.s.isFullscreen;\n };\n this._player.addEventListener(\"fw-fullscreen-change\", handler);\n this._player.addEventListener(\"fw-ready\", handler);\n this._cleanup = () => {\n this._player?.removeEventListener(\"fw-fullscreen-change\", handler);\n this._player?.removeEventListener(\"fw-ready\", handler);\n };\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._cleanup?.();\n this._cleanup = null;\n }\n\n private handleClick() {\n this._player?.pc?.toggleFullscreen();\n }\n\n render() {\n return html`<button\n type=\"button\"\n class=\"fw-btn-flush\"\n aria-label=${this.isFullscreen ? this._t(\"exitFullscreen\") : this._t(\"fullscreen\")}\n aria-pressed=${this.isFullscreen}\n title=${this.isFullscreen ? this._t(\"exitFullscreen\") : this._t(\"fullscreen\")}\n @click=${this.handleClick}\n >\n ${this.isFullscreen ? \"\\u2716\" : \"\\u26F6\"}\n </button>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"fw-fullscreen-button\": FwFullscreenButton;\n }\n}\n"],"names":[],"mappings":";;;;;AAKO,IAAM,kBAAkB,GAAxB,MAAM,kBAAmB,SAAQ,UAAU,CAAA;AAA3C,IAAA,WAAA,GAAA;;QACY,IAAA,CAAA,YAAY,GAAG,KAAK;QAC7B,IAAA,CAAA,OAAO,GAAQ,IAAI;QACnB,IAAA,CAAA,QAAQ,GAAwB,IAAI;IA4D9C;AA1DE,IAAA,IAAY,EAAE,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,IAAI,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAClE;IASQ,cAAc,GAAA;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACtC,QAAA,IAAI,KAAK;AAAE,YAAA,OAAO,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC;AAChD,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;IAClC;IAEA,iBAAiB,GAAA;QACf,KAAK,CAAC,iBAAiB,EAAE;AACzB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE;QACpC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;AACnB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE;AAC1B,QAAA,IAAI,CAAC,EAAE;YAAE;QAET,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC,CAAC,YAAY;QACrC,MAAM,OAAO,GAAG,MAAK;AACnB,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY;AACpD,QAAA,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,sBAAsB,EAAE,OAAO,CAAC;QAC9D,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC;AAClD,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAK;YACnB,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,sBAAsB,EAAE,OAAO,CAAC;YAClE,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC;AACxD,QAAA,CAAC;IACH;IAEA,oBAAoB,GAAA;QAClB,KAAK,CAAC,oBAAoB,EAAE;AAC5B,QAAA,IAAI,CAAC,QAAQ,IAAI;AACjB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACtB;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,gBAAgB,EAAE;IACtC;IAEA,MAAM,GAAA;AACJ,QAAA,OAAO,IAAI,CAAA,CAAA;;;AAGI,iBAAA,EAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC;AACnE,mBAAA,EAAA,IAAI,CAAC,YAAY;AACxB,YAAA,EAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC;AACpE,aAAA,EAAA,IAAI,CAAC,WAAW;;QAEvB,IAAI,CAAC,YAAY,GAAG,QAAQ,GAAG,QAAQ;cACjC;IACZ;;AArDO,kBAAA,CAAA,MAAM,GAAG,GAAG,CAAA;;;;;AAKlB,EAAA,CALY;AARI,UAAA,CAAA;AAAhB,IAAA,KAAK;AAAgC,CAAA,EAAA,kBAAA,CAAA,SAAA,EAAA,cAAA,EAAA,MAAA,CAAA;AAD3B,kBAAkB,GAAA,UAAA,CAAA;IAD9B,aAAa,CAAC,sBAAsB;AACxB,CAAA,EAAA,kBAAkB,CA+D9B;;;;"}
@@ -0,0 +1,109 @@
1
+ import { __decorate } from '../../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';
2
+ import { css, LitElement, html } from 'lit';
3
+ import { state, customElement } from 'lit/decorators.js';
4
+ import { createTranslator } from '@livepeer-frameworks/player-core';
5
+
6
+ let FwLiveBadge = class FwLiveBadge extends LitElement {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.isLive = false;
10
+ this._player = null;
11
+ this._cleanup = null;
12
+ }
13
+ get _t() {
14
+ return this._player?.pc?.t ?? createTranslator({ locale: "en" });
15
+ }
16
+ _resolvePlayer() {
17
+ const forId = this.getAttribute("for");
18
+ if (forId)
19
+ return document.getElementById(forId);
20
+ return this.closest("fw-player");
21
+ }
22
+ connectedCallback() {
23
+ super.connectedCallback();
24
+ this._player = this._resolvePlayer();
25
+ if (!this._player)
26
+ return;
27
+ const pc = this._player.pc;
28
+ if (!pc)
29
+ return;
30
+ this.syncLive();
31
+ const handler = () => this.syncLive();
32
+ this._player.addEventListener("fw-state-change", handler);
33
+ this._player.addEventListener("fw-stream-state", handler);
34
+ this._player.addEventListener("fw-ready", handler);
35
+ this._cleanup = () => {
36
+ this._player?.removeEventListener("fw-state-change", handler);
37
+ this._player?.removeEventListener("fw-stream-state", handler);
38
+ this._player?.removeEventListener("fw-ready", handler);
39
+ };
40
+ }
41
+ disconnectedCallback() {
42
+ super.disconnectedCallback();
43
+ this._cleanup?.();
44
+ this._cleanup = null;
45
+ }
46
+ syncLive() {
47
+ const live = this._player?.pc?.s?.isEffectivelyLive ?? false;
48
+ this.isLive = live;
49
+ this.toggleAttribute("live", live);
50
+ }
51
+ handleClick() {
52
+ this._player?.pc?.jumpToLive();
53
+ }
54
+ render() {
55
+ if (!this.isLive)
56
+ return html ``;
57
+ return html `<button type="button" aria-label=${this._t("live")} @click=${this.handleClick}>
58
+ <span class="dot"></span> ${this._t("live").toUpperCase()}
59
+ </button>`;
60
+ }
61
+ };
62
+ FwLiveBadge.styles = css `
63
+ :host {
64
+ display: inline-flex;
65
+ align-items: center;
66
+ }
67
+ button {
68
+ display: inline-flex;
69
+ align-items: center;
70
+ gap: 0.25rem;
71
+ border: none;
72
+ background: none;
73
+ cursor: pointer;
74
+ padding: 0.125rem 0.375rem;
75
+ border-radius: 0.25rem;
76
+ font-size: 0.625rem;
77
+ font-weight: 700;
78
+ text-transform: uppercase;
79
+ letter-spacing: 0.05em;
80
+ color: inherit;
81
+ }
82
+ .dot {
83
+ width: 0.375rem;
84
+ height: 0.375rem;
85
+ border-radius: 50%;
86
+ background: #ef4444;
87
+ }
88
+ :host([live]) .dot {
89
+ animation: pulse 1.5s ease-in-out infinite;
90
+ }
91
+ @keyframes pulse {
92
+ 0%,
93
+ 100% {
94
+ opacity: 1;
95
+ }
96
+ 50% {
97
+ opacity: 0.4;
98
+ }
99
+ }
100
+ `;
101
+ __decorate([
102
+ state()
103
+ ], FwLiveBadge.prototype, "isLive", void 0);
104
+ FwLiveBadge = __decorate([
105
+ customElement("fw-live-badge")
106
+ ], FwLiveBadge);
107
+
108
+ export { FwLiveBadge };
109
+ //# sourceMappingURL=fw-live-badge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fw-live-badge.js","sources":["../../../../../src/components/controls/fw-live-badge.ts"],"sourcesContent":["import { LitElement, html, css } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { createTranslator, type TranslateFn } from \"@livepeer-frameworks/player-core\";\n\n@customElement(\"fw-live-badge\")\nexport class FwLiveBadge extends LitElement {\n @state() private isLive = false;\n private _player: any = null;\n private _cleanup: (() => void) | null = null;\n\n private get _t(): TranslateFn {\n return this._player?.pc?.t ?? createTranslator({ locale: \"en\" });\n }\n\n static styles = css`\n :host {\n display: inline-flex;\n align-items: center;\n }\n button {\n display: inline-flex;\n align-items: center;\n gap: 0.25rem;\n border: none;\n background: none;\n cursor: pointer;\n padding: 0.125rem 0.375rem;\n border-radius: 0.25rem;\n font-size: 0.625rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: inherit;\n }\n .dot {\n width: 0.375rem;\n height: 0.375rem;\n border-radius: 50%;\n background: #ef4444;\n }\n :host([live]) .dot {\n animation: pulse 1.5s ease-in-out infinite;\n }\n @keyframes pulse {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.4;\n }\n }\n `;\n\n private _resolvePlayer(): HTMLElement | null {\n const forId = this.getAttribute(\"for\");\n if (forId) return document.getElementById(forId);\n return this.closest(\"fw-player\");\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._player = this._resolvePlayer();\n if (!this._player) return;\n const pc = this._player.pc;\n if (!pc) return;\n\n this.syncLive();\n const handler = () => this.syncLive();\n this._player.addEventListener(\"fw-state-change\", handler);\n this._player.addEventListener(\"fw-stream-state\", handler);\n this._player.addEventListener(\"fw-ready\", handler);\n this._cleanup = () => {\n this._player?.removeEventListener(\"fw-state-change\", handler);\n this._player?.removeEventListener(\"fw-stream-state\", handler);\n this._player?.removeEventListener(\"fw-ready\", handler);\n };\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._cleanup?.();\n this._cleanup = null;\n }\n\n private syncLive() {\n const live = this._player?.pc?.s?.isEffectivelyLive ?? false;\n this.isLive = live;\n this.toggleAttribute(\"live\", live);\n }\n\n private handleClick() {\n this._player?.pc?.jumpToLive();\n }\n\n render() {\n if (!this.isLive) return html``;\n\n return html`<button type=\"button\" aria-label=${this._t(\"live\")} @click=${this.handleClick}>\n <span class=\"dot\"></span> ${this._t(\"live\").toUpperCase()}\n </button>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"fw-live-badge\": FwLiveBadge;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import { __decorate } from '../../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';
2
+ import { css, LitElement, html } from 'lit';
3
+ import { state, customElement } from 'lit/decorators.js';
4
+ import { createTranslator } from '@livepeer-frameworks/player-core';
5
+
6
+ let FwPlayButton = class FwPlayButton extends LitElement {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.isPlaying = false;
10
+ this._player = null;
11
+ this._cleanup = null;
12
+ }
13
+ get _t() {
14
+ return this._player?.pc?.t ?? createTranslator({ locale: "en" });
15
+ }
16
+ _resolvePlayer() {
17
+ const forId = this.getAttribute("for");
18
+ if (forId)
19
+ return document.getElementById(forId);
20
+ return this.closest("fw-player");
21
+ }
22
+ connectedCallback() {
23
+ super.connectedCallback();
24
+ this._player = this._resolvePlayer();
25
+ if (!this._player)
26
+ return;
27
+ const pc = this._player.pc;
28
+ if (!pc)
29
+ return;
30
+ this.isPlaying = pc.s.isPlaying;
31
+ const handler = () => {
32
+ this.isPlaying = pc.s.isPlaying;
33
+ };
34
+ this._player.addEventListener("fw-state-change", handler);
35
+ this._player.addEventListener("fw-ready", handler);
36
+ this._cleanup = () => {
37
+ this._player?.removeEventListener("fw-state-change", handler);
38
+ this._player?.removeEventListener("fw-ready", handler);
39
+ };
40
+ }
41
+ disconnectedCallback() {
42
+ super.disconnectedCallback();
43
+ this._cleanup?.();
44
+ this._cleanup = null;
45
+ }
46
+ handleClick() {
47
+ this._player?.pc?.togglePlay();
48
+ }
49
+ render() {
50
+ return html `<button
51
+ type="button"
52
+ class="fw-btn-flush"
53
+ aria-label=${this.isPlaying ? this._t("pause") : this._t("play")}
54
+ aria-pressed=${this.isPlaying}
55
+ title=${this.isPlaying ? this._t("pause") : this._t("play")}
56
+ @click=${this.handleClick}
57
+ >
58
+ ${this.isPlaying ? "\u23F8" : "\u25B6"}
59
+ </button>`;
60
+ }
61
+ };
62
+ FwPlayButton.styles = css `
63
+ :host {
64
+ display: inline-flex;
65
+ align-items: center;
66
+ }
67
+ `;
68
+ __decorate([
69
+ state()
70
+ ], FwPlayButton.prototype, "isPlaying", void 0);
71
+ FwPlayButton = __decorate([
72
+ customElement("fw-play-button")
73
+ ], FwPlayButton);
74
+
75
+ export { FwPlayButton };
76
+ //# sourceMappingURL=fw-play-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fw-play-button.js","sources":["../../../../../src/components/controls/fw-play-button.ts"],"sourcesContent":["import { LitElement, html, css } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { createTranslator, type TranslateFn } from \"@livepeer-frameworks/player-core\";\n\n@customElement(\"fw-play-button\")\nexport class FwPlayButton extends LitElement {\n @state() private isPlaying = false;\n private _player: any = null;\n private _cleanup: (() => void) | null = null;\n\n private get _t(): TranslateFn {\n return this._player?.pc?.t ?? createTranslator({ locale: \"en\" });\n }\n\n static styles = css`\n :host {\n display: inline-flex;\n align-items: center;\n }\n `;\n\n private _resolvePlayer(): HTMLElement | null {\n const forId = this.getAttribute(\"for\");\n if (forId) return document.getElementById(forId);\n return this.closest(\"fw-player\");\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._player = this._resolvePlayer();\n if (!this._player) return;\n const pc = this._player.pc;\n if (!pc) return;\n\n this.isPlaying = pc.s.isPlaying;\n const handler = () => {\n this.isPlaying = pc.s.isPlaying;\n };\n this._player.addEventListener(\"fw-state-change\", handler);\n this._player.addEventListener(\"fw-ready\", handler);\n this._cleanup = () => {\n this._player?.removeEventListener(\"fw-state-change\", handler);\n this._player?.removeEventListener(\"fw-ready\", handler);\n };\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._cleanup?.();\n this._cleanup = null;\n }\n\n private handleClick() {\n this._player?.pc?.togglePlay();\n }\n\n render() {\n return html`<button\n type=\"button\"\n class=\"fw-btn-flush\"\n aria-label=${this.isPlaying ? this._t(\"pause\") : this._t(\"play\")}\n aria-pressed=${this.isPlaying}\n title=${this.isPlaying ? this._t(\"pause\") : this._t(\"play\")}\n @click=${this.handleClick}\n >\n ${this.isPlaying ? \"\\u23F8\" : \"\\u25B6\"}\n </button>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"fw-play-button\": FwPlayButton;\n }\n}\n"],"names":[],"mappings":";;;;;AAKO,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,UAAU,CAAA;AAArC,IAAA,WAAA,GAAA;;QACY,IAAA,CAAA,SAAS,GAAG,KAAK;QAC1B,IAAA,CAAA,OAAO,GAAQ,IAAI;QACnB,IAAA,CAAA,QAAQ,GAAwB,IAAI;IA4D9C;AA1DE,IAAA,IAAY,EAAE,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,IAAI,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAClE;IASQ,cAAc,GAAA;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACtC,QAAA,IAAI,KAAK;AAAE,YAAA,OAAO,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC;AAChD,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;IAClC;IAEA,iBAAiB,GAAA;QACf,KAAK,CAAC,iBAAiB,EAAE;AACzB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE;QACpC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;AACnB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE;AAC1B,QAAA,IAAI,CAAC,EAAE;YAAE;QAET,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;QAC/B,MAAM,OAAO,GAAG,MAAK;YACnB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;AACjC,QAAA,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,OAAO,CAAC;QACzD,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC;AAClD,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAK;YACnB,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,iBAAiB,EAAE,OAAO,CAAC;YAC7D,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC;AACxD,QAAA,CAAC;IACH;IAEA,oBAAoB,GAAA;QAClB,KAAK,CAAC,oBAAoB,EAAE;AAC5B,QAAA,IAAI,CAAC,QAAQ,IAAI;AACjB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACtB;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE;IAChC;IAEA,MAAM,GAAA;AACJ,QAAA,OAAO,IAAI,CAAA,CAAA;;;AAGI,iBAAA,EAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;AACjD,mBAAA,EAAA,IAAI,CAAC,SAAS;AACrB,YAAA,EAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;AAClD,aAAA,EAAA,IAAI,CAAC,WAAW;;QAEvB,IAAI,CAAC,SAAS,GAAG,QAAQ,GAAG,QAAQ;cAC9B;IACZ;;AArDO,YAAA,CAAA,MAAM,GAAG,GAAG,CAAA;;;;;AAKlB,EAAA,CALY;AARI,UAAA,CAAA;AAAhB,IAAA,KAAK;AAA6B,CAAA,EAAA,YAAA,CAAA,SAAA,EAAA,WAAA,EAAA,MAAA,CAAA;AADxB,YAAY,GAAA,UAAA,CAAA;IADxB,aAAa,CAAC,gBAAgB;AAClB,CAAA,EAAA,YAAY,CA+DxB;;;;"}
@@ -0,0 +1,62 @@
1
+ import { __decorate } from '../../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';
2
+ import { css, LitElement, html } from 'lit';
3
+ import { property, customElement } from 'lit/decorators.js';
4
+ import { createTranslator } from '@livepeer-frameworks/player-core';
5
+
6
+ let FwSkipButton = class FwSkipButton extends LitElement {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.direction = "forward";
10
+ this.seconds = 10;
11
+ this._player = null;
12
+ }
13
+ get _t() {
14
+ return this._player?.pc?.t ?? createTranslator({ locale: "en" });
15
+ }
16
+ _resolvePlayer() {
17
+ const forId = this.getAttribute("for");
18
+ if (forId)
19
+ return document.getElementById(forId);
20
+ return this.closest("fw-player");
21
+ }
22
+ connectedCallback() {
23
+ super.connectedCallback();
24
+ this._player = this._resolvePlayer();
25
+ }
26
+ handleClick() {
27
+ const delta = this.direction === "back" ? -this.seconds : this.seconds;
28
+ this._player?.pc?.seekBy(delta);
29
+ }
30
+ render() {
31
+ const label = this.direction === "back" ? this._t("skipBackward") : this._t("skipForward");
32
+ const icon = this.direction === "back" ? "\u23EA" : "\u23E9";
33
+ const shortcut = this.direction === "back" ? "j" : "l";
34
+ return html `<button
35
+ type="button"
36
+ class="fw-btn-flush"
37
+ aria-label=${label}
38
+ title="${label} (${shortcut})"
39
+ @click=${this.handleClick}
40
+ >
41
+ ${icon} ${this.seconds}s
42
+ </button>`;
43
+ }
44
+ };
45
+ FwSkipButton.styles = css `
46
+ :host {
47
+ display: inline-flex;
48
+ align-items: center;
49
+ }
50
+ `;
51
+ __decorate([
52
+ property({ type: String })
53
+ ], FwSkipButton.prototype, "direction", void 0);
54
+ __decorate([
55
+ property({ type: Number })
56
+ ], FwSkipButton.prototype, "seconds", void 0);
57
+ FwSkipButton = __decorate([
58
+ customElement("fw-skip-button")
59
+ ], FwSkipButton);
60
+
61
+ export { FwSkipButton };
62
+ //# sourceMappingURL=fw-skip-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fw-skip-button.js","sources":["../../../../../src/components/controls/fw-skip-button.ts"],"sourcesContent":["import { LitElement, html, css } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { createTranslator, type TranslateFn } from \"@livepeer-frameworks/player-core\";\n\n@customElement(\"fw-skip-button\")\nexport class FwSkipButton extends LitElement {\n @property({ type: String }) direction: \"back\" | \"forward\" = \"forward\";\n @property({ type: Number }) seconds = 10;\n private _player: any = null;\n\n private get _t(): TranslateFn {\n return this._player?.pc?.t ?? createTranslator({ locale: \"en\" });\n }\n\n static styles = css`\n :host {\n display: inline-flex;\n align-items: center;\n }\n `;\n\n private _resolvePlayer(): HTMLElement | null {\n const forId = this.getAttribute(\"for\");\n if (forId) return document.getElementById(forId);\n return this.closest(\"fw-player\");\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._player = this._resolvePlayer();\n }\n\n private handleClick() {\n const delta = this.direction === \"back\" ? -this.seconds : this.seconds;\n this._player?.pc?.seekBy(delta);\n }\n\n render() {\n const label = this.direction === \"back\" ? this._t(\"skipBackward\") : this._t(\"skipForward\");\n const icon = this.direction === \"back\" ? \"\\u23EA\" : \"\\u23E9\";\n const shortcut = this.direction === \"back\" ? \"j\" : \"l\";\n\n return html`<button\n type=\"button\"\n class=\"fw-btn-flush\"\n aria-label=${label}\n title=\"${label} (${shortcut})\"\n @click=${this.handleClick}\n >\n ${icon} ${this.seconds}s\n </button>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"fw-skip-button\": FwSkipButton;\n }\n}\n"],"names":[],"mappings":";;;;;AAKO,IAAM,YAAY,GAAlB,MAAM,YAAa,SAAQ,UAAU,CAAA;AAArC,IAAA,WAAA,GAAA;;QACuB,IAAA,CAAA,SAAS,GAAuB,SAAS;QACzC,IAAA,CAAA,OAAO,GAAG,EAAE;QAChC,IAAA,CAAA,OAAO,GAAQ,IAAI;IA4C7B;AA1CE,IAAA,IAAY,EAAE,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,IAAI,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAClE;IASQ,cAAc,GAAA;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACtC,QAAA,IAAI,KAAK;AAAE,YAAA,OAAO,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC;AAChD,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;IAClC;IAEA,iBAAiB,GAAA;QACf,KAAK,CAAC,iBAAiB,EAAE;AACzB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE;IACtC;IAEQ,WAAW,GAAA;QACjB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,KAAK,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;QACtE,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC;IACjC;IAEA,MAAM,GAAA;QACJ,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,KAAK,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC;AAC1F,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,KAAK,MAAM,GAAG,QAAQ,GAAG,QAAQ;AAC5D,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,KAAK,MAAM,GAAG,GAAG,GAAG,GAAG;AAEtD,QAAA,OAAO,IAAI,CAAA,CAAA;;;mBAGI,KAAK;AACT,aAAA,EAAA,KAAK,KAAK,QAAQ,CAAA;AAClB,aAAA,EAAA,IAAI,CAAC,WAAW;;QAEvB,IAAI,CAAA,CAAA,EAAI,IAAI,CAAC,OAAO,CAAA;cACd;IACZ;;AArCO,YAAA,CAAA,MAAM,GAAG,GAAG,CAAA;;;;;AAKlB,EAAA,CALY;AARe,UAAA,CAAA;AAA3B,IAAA,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;AAA4C,CAAA,EAAA,YAAA,CAAA,SAAA,EAAA,WAAA,EAAA,MAAA,CAAA;AAC1C,UAAA,CAAA;AAA3B,IAAA,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE;AAAe,CAAA,EAAA,YAAA,CAAA,SAAA,EAAA,SAAA,EAAA,MAAA,CAAA;AAF9B,YAAY,GAAA,UAAA,CAAA;IADxB,aAAa,CAAC,gBAAgB;AAClB,CAAA,EAAA,YAAY,CA+CxB;;;;"}
@@ -0,0 +1,77 @@
1
+ import { __decorate } from '../../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';
2
+ import { css, LitElement, html } from 'lit';
3
+ import { state, customElement } from 'lit/decorators.js';
4
+ import { formatTimeDisplay } from '@livepeer-frameworks/player-core';
5
+
6
+ let FwTimeDisplay = class FwTimeDisplay extends LitElement {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.display = "";
10
+ this._player = null;
11
+ this._cleanup = null;
12
+ }
13
+ _resolvePlayer() {
14
+ const forId = this.getAttribute("for");
15
+ if (forId)
16
+ return document.getElementById(forId);
17
+ return this.closest("fw-player");
18
+ }
19
+ connectedCallback() {
20
+ super.connectedCallback();
21
+ this._player = this._resolvePlayer();
22
+ if (!this._player)
23
+ return;
24
+ const pc = this._player.pc;
25
+ if (!pc)
26
+ return;
27
+ this.updateDisplay();
28
+ const handler = () => this.updateDisplay();
29
+ this._player.addEventListener("fw-time-update", handler);
30
+ this._player.addEventListener("fw-ready", handler);
31
+ this._cleanup = () => {
32
+ this._player?.removeEventListener("fw-time-update", handler);
33
+ this._player?.removeEventListener("fw-ready", handler);
34
+ };
35
+ }
36
+ disconnectedCallback() {
37
+ super.disconnectedCallback();
38
+ this._cleanup?.();
39
+ this._cleanup = null;
40
+ }
41
+ updateDisplay() {
42
+ const pc = this._player?.pc;
43
+ if (!pc)
44
+ return;
45
+ const s = pc.s;
46
+ this.display = formatTimeDisplay({
47
+ isLive: s.isEffectivelyLive,
48
+ currentTime: s.currentTime,
49
+ duration: s.duration,
50
+ liveEdge: pc.getLiveEdge?.() ?? s.duration,
51
+ seekableStart: pc.getSeekableStart?.() ?? 0,
52
+ });
53
+ }
54
+ render() {
55
+ return html `<span>${this.display}</span>`;
56
+ }
57
+ };
58
+ FwTimeDisplay.styles = css `
59
+ :host {
60
+ display: inline-flex;
61
+ align-items: center;
62
+ font-variant-numeric: tabular-nums;
63
+ }
64
+ span {
65
+ white-space: nowrap;
66
+ font-size: 0.75rem;
67
+ }
68
+ `;
69
+ __decorate([
70
+ state()
71
+ ], FwTimeDisplay.prototype, "display", void 0);
72
+ FwTimeDisplay = __decorate([
73
+ customElement("fw-time-display")
74
+ ], FwTimeDisplay);
75
+
76
+ export { FwTimeDisplay };
77
+ //# sourceMappingURL=fw-time-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fw-time-display.js","sources":["../../../../../src/components/controls/fw-time-display.ts"],"sourcesContent":["import { LitElement, html, css } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { formatTimeDisplay } from \"@livepeer-frameworks/player-core\";\n\n@customElement(\"fw-time-display\")\nexport class FwTimeDisplay extends LitElement {\n @state() private display = \"\";\n private _player: any = null;\n private _cleanup: (() => void) | null = null;\n\n static styles = css`\n :host {\n display: inline-flex;\n align-items: center;\n font-variant-numeric: tabular-nums;\n }\n span {\n white-space: nowrap;\n font-size: 0.75rem;\n }\n `;\n\n private _resolvePlayer(): HTMLElement | null {\n const forId = this.getAttribute(\"for\");\n if (forId) return document.getElementById(forId);\n return this.closest(\"fw-player\");\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._player = this._resolvePlayer();\n if (!this._player) return;\n const pc = this._player.pc;\n if (!pc) return;\n\n this.updateDisplay();\n const handler = () => this.updateDisplay();\n this._player.addEventListener(\"fw-time-update\", handler);\n this._player.addEventListener(\"fw-ready\", handler);\n this._cleanup = () => {\n this._player?.removeEventListener(\"fw-time-update\", handler);\n this._player?.removeEventListener(\"fw-ready\", handler);\n };\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._cleanup?.();\n this._cleanup = null;\n }\n\n private updateDisplay() {\n const pc = this._player?.pc;\n if (!pc) return;\n const s = pc.s;\n this.display = formatTimeDisplay({\n isLive: s.isEffectivelyLive,\n currentTime: s.currentTime,\n duration: s.duration,\n liveEdge: pc.getLiveEdge?.() ?? s.duration,\n seekableStart: pc.getSeekableStart?.() ?? 0,\n });\n }\n\n render() {\n return html`<span>${this.display}</span>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"fw-time-display\": FwTimeDisplay;\n }\n}\n"],"names":[],"mappings":";;;;;AAKO,IAAM,aAAa,GAAnB,MAAM,aAAc,SAAQ,UAAU,CAAA;AAAtC,IAAA,WAAA,GAAA;;QACY,IAAA,CAAA,OAAO,GAAG,EAAE;QACrB,IAAA,CAAA,OAAO,GAAQ,IAAI;QACnB,IAAA,CAAA,QAAQ,GAAwB,IAAI;IA2D9C;IA7CU,cAAc,GAAA;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACtC,QAAA,IAAI,KAAK;AAAE,YAAA,OAAO,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC;AAChD,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;IAClC;IAEA,iBAAiB,GAAA;QACf,KAAK,CAAC,iBAAiB,EAAE;AACzB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE;QACpC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;AACnB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE;AAC1B,QAAA,IAAI,CAAC,EAAE;YAAE;QAET,IAAI,CAAC,aAAa,EAAE;QACpB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE;QAC1C,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,OAAO,CAAC;QACxD,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC;AAClD,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAK;YACnB,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,gBAAgB,EAAE,OAAO,CAAC;YAC5D,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC;AACxD,QAAA,CAAC;IACH;IAEA,oBAAoB,GAAA;QAClB,KAAK,CAAC,oBAAoB,EAAE;AAC5B,QAAA,IAAI,CAAC,QAAQ,IAAI;AACjB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACtB;IAEQ,aAAa,GAAA;AACnB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE;AAC3B,QAAA,IAAI,CAAC,EAAE;YAAE;AACT,QAAA,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;AACd,QAAA,IAAI,CAAC,OAAO,GAAG,iBAAiB,CAAC;YAC/B,MAAM,EAAE,CAAC,CAAC,iBAAiB;YAC3B,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,QAAQ,EAAE,EAAE,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC,QAAQ;AAC1C,YAAA,aAAa,EAAE,EAAE,CAAC,gBAAgB,IAAI,IAAI,CAAC;AAC5C,SAAA,CAAC;IACJ;IAEA,MAAM,GAAA;AACJ,QAAA,OAAO,IAAI,CAAA,CAAA,MAAA,EAAS,IAAI,CAAC,OAAO,SAAS;IAC3C;;AAxDO,aAAA,CAAA,MAAM,GAAG,GAAG,CAAA;;;;;;;;;;AAUlB,EAAA,CAVY;AAJI,UAAA,CAAA;AAAhB,IAAA,KAAK;AAAwB,CAAA,EAAA,aAAA,CAAA,SAAA,EAAA,SAAA,EAAA,MAAA,CAAA;AADnB,aAAa,GAAA,UAAA,CAAA;IADzB,aAAa,CAAC,iBAAiB;AACnB,CAAA,EAAA,aAAa,CA8DzB;;;;"}
@@ -0,0 +1,76 @@
1
+ import { __decorate } from '../../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';
2
+ import { css, LitElement, html } from 'lit';
3
+ import { state, customElement } from 'lit/decorators.js';
4
+ import { createTranslator } from '@livepeer-frameworks/player-core';
5
+
6
+ let FwVolumeControl = class FwVolumeControl extends LitElement {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.isMuted = false;
10
+ this._player = null;
11
+ this._cleanup = null;
12
+ }
13
+ get _t() {
14
+ return this._player?.pc?.t ?? createTranslator({ locale: "en" });
15
+ }
16
+ _resolvePlayer() {
17
+ const forId = this.getAttribute("for");
18
+ if (forId)
19
+ return document.getElementById(forId);
20
+ return this.closest("fw-player");
21
+ }
22
+ connectedCallback() {
23
+ super.connectedCallback();
24
+ this._player = this._resolvePlayer();
25
+ if (!this._player)
26
+ return;
27
+ const pc = this._player.pc;
28
+ if (!pc)
29
+ return;
30
+ this.isMuted = pc.s.isMuted;
31
+ const handler = () => {
32
+ this.isMuted = this._player.pc.s.isMuted;
33
+ };
34
+ this._player.addEventListener("fw-volume-change", handler);
35
+ this._player.addEventListener("fw-ready", handler);
36
+ this._cleanup = () => {
37
+ this._player?.removeEventListener("fw-volume-change", handler);
38
+ this._player?.removeEventListener("fw-ready", handler);
39
+ };
40
+ }
41
+ disconnectedCallback() {
42
+ super.disconnectedCallback();
43
+ this._cleanup?.();
44
+ this._cleanup = null;
45
+ }
46
+ handleClick() {
47
+ this._player?.pc?.toggleMute();
48
+ }
49
+ render() {
50
+ return html `<button
51
+ type="button"
52
+ class="fw-btn-flush"
53
+ aria-label=${this.isMuted ? this._t("unmute") : this._t("mute")}
54
+ aria-pressed=${this.isMuted}
55
+ title=${this.isMuted ? this._t("unmute") : this._t("mute")}
56
+ @click=${this.handleClick}
57
+ >
58
+ ${this.isMuted ? "\uD83D\uDD07" : "\uD83D\uDD0A"}
59
+ </button>`;
60
+ }
61
+ };
62
+ FwVolumeControl.styles = css `
63
+ :host {
64
+ display: inline-flex;
65
+ align-items: center;
66
+ }
67
+ `;
68
+ __decorate([
69
+ state()
70
+ ], FwVolumeControl.prototype, "isMuted", void 0);
71
+ FwVolumeControl = __decorate([
72
+ customElement("fw-volume-button")
73
+ ], FwVolumeControl);
74
+
75
+ export { FwVolumeControl };
76
+ //# sourceMappingURL=fw-volume-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fw-volume-control.js","sources":["../../../../../src/components/controls/fw-volume-control.ts"],"sourcesContent":["import { LitElement, html, css } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { createTranslator, type TranslateFn } from \"@livepeer-frameworks/player-core\";\n\n@customElement(\"fw-volume-button\")\nexport class FwVolumeControl extends LitElement {\n @state() private isMuted = false;\n private _player: any = null;\n private _cleanup: (() => void) | null = null;\n\n private get _t(): TranslateFn {\n return this._player?.pc?.t ?? createTranslator({ locale: \"en\" });\n }\n\n static styles = css`\n :host {\n display: inline-flex;\n align-items: center;\n }\n `;\n\n private _resolvePlayer(): HTMLElement | null {\n const forId = this.getAttribute(\"for\");\n if (forId) return document.getElementById(forId);\n return this.closest(\"fw-player\");\n }\n\n connectedCallback() {\n super.connectedCallback();\n this._player = this._resolvePlayer();\n if (!this._player) return;\n const pc = this._player.pc;\n if (!pc) return;\n\n this.isMuted = pc.s.isMuted;\n const handler = () => {\n this.isMuted = this._player.pc.s.isMuted;\n };\n this._player.addEventListener(\"fw-volume-change\", handler);\n this._player.addEventListener(\"fw-ready\", handler);\n this._cleanup = () => {\n this._player?.removeEventListener(\"fw-volume-change\", handler);\n this._player?.removeEventListener(\"fw-ready\", handler);\n };\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this._cleanup?.();\n this._cleanup = null;\n }\n\n private handleClick() {\n this._player?.pc?.toggleMute();\n }\n\n render() {\n return html`<button\n type=\"button\"\n class=\"fw-btn-flush\"\n aria-label=${this.isMuted ? this._t(\"unmute\") : this._t(\"mute\")}\n aria-pressed=${this.isMuted}\n title=${this.isMuted ? this._t(\"unmute\") : this._t(\"mute\")}\n @click=${this.handleClick}\n >\n ${this.isMuted ? \"\\uD83D\\uDD07\" : \"\\uD83D\\uDD0A\"}\n </button>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"fw-volume-button\": FwVolumeControl;\n }\n}\n"],"names":[],"mappings":";;;;;AAKO,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,UAAU,CAAA;AAAxC,IAAA,WAAA,GAAA;;QACY,IAAA,CAAA,OAAO,GAAG,KAAK;QACxB,IAAA,CAAA,OAAO,GAAQ,IAAI;QACnB,IAAA,CAAA,QAAQ,GAAwB,IAAI;IA4D9C;AA1DE,IAAA,IAAY,EAAE,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,IAAI,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAClE;IASQ,cAAc,GAAA;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;AACtC,QAAA,IAAI,KAAK;AAAE,YAAA,OAAO,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC;AAChD,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;IAClC;IAEA,iBAAiB,GAAA;QACf,KAAK,CAAC,iBAAiB,EAAE;AACzB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,EAAE;QACpC,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE;AACnB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE;AAC1B,QAAA,IAAI,CAAC,EAAE;YAAE;QAET,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO;QAC3B,MAAM,OAAO,GAAG,MAAK;AACnB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO;AAC1C,QAAA,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,OAAO,CAAC;QAC1D,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC;AAClD,QAAA,IAAI,CAAC,QAAQ,GAAG,MAAK;YACnB,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,kBAAkB,EAAE,OAAO,CAAC;YAC9D,IAAI,CAAC,OAAO,EAAE,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC;AACxD,QAAA,CAAC;IACH;IAEA,oBAAoB,GAAA;QAClB,KAAK,CAAC,oBAAoB,EAAE;AAC5B,QAAA,IAAI,CAAC,QAAQ,IAAI;AACjB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;IACtB;IAEQ,WAAW,GAAA;AACjB,QAAA,IAAI,CAAC,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE;IAChC;IAEA,MAAM,GAAA;AACJ,QAAA,OAAO,IAAI,CAAA,CAAA;;;AAGI,iBAAA,EAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;AAChD,mBAAA,EAAA,IAAI,CAAC,OAAO;AACnB,YAAA,EAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;AACjD,aAAA,EAAA,IAAI,CAAC,WAAW;;QAEvB,IAAI,CAAC,OAAO,GAAG,cAAc,GAAG,cAAc;cACxC;IACZ;;AArDO,eAAA,CAAA,MAAM,GAAG,GAAG,CAAA;;;;;AAKlB,EAAA,CALY;AARI,UAAA,CAAA;AAAhB,IAAA,KAAK;AAA2B,CAAA,EAAA,eAAA,CAAA,SAAA,EAAA,SAAA,EAAA,MAAA,CAAA;AADtB,eAAe,GAAA,UAAA,CAAA;IAD3B,aAAa,CAAC,kBAAkB;AACpB,CAAA,EAAA,eAAe,CA+D3B;;;;"}
@@ -23,7 +23,7 @@ let FwDevModePanel = class FwDevModePanel extends LitElement {
23
23
  this.playbackMode = "auto";
24
24
  this._activeTab = "config";
25
25
  this._hoveredComboIndex = null;
26
- this._tooltipAbove = false;
26
+ this._tooltipPos = null;
27
27
  this._showDisabledPlayers = false;
28
28
  this._playbackScore = 1;
29
29
  this._qualityScore = 100;
@@ -158,15 +158,12 @@ let FwDevModePanel = class FwDevModePanel extends LitElement {
158
158
  }
159
159
  _handleComboMouseEnter(index, event) {
160
160
  this._hoveredComboIndex = index;
161
- const container = this.renderRoot.querySelector(".fw-dev-body");
162
- if (!container) {
163
- return;
164
- }
165
161
  const row = event.currentTarget;
166
- const containerRect = container.getBoundingClientRect();
167
162
  const rowRect = row.getBoundingClientRect();
168
- const relativePosition = (rowRect.top - containerRect.top) / containerRect.height;
169
- this._tooltipAbove = relativePosition > 0.6;
163
+ this._tooltipPos = {
164
+ top: Math.max(8, Math.min(rowRect.top, window.innerHeight - 200)),
165
+ left: Math.max(8, rowRect.left - 228),
166
+ };
170
167
  }
171
168
  _handleModeChange(mode) {
172
169
  this.playbackMode = mode;
@@ -645,6 +642,7 @@ let FwDevModePanel = class FwDevModePanel extends LitElement {
645
642
  @mouseenter=${(event) => this._handleComboMouseEnter(index, event)}
646
643
  @mouseleave=${() => {
647
644
  this._hoveredComboIndex = null;
645
+ this._tooltipPos = null;
648
646
  }}
649
647
  >
650
648
  <button
@@ -685,14 +683,12 @@ let FwDevModePanel = class FwDevModePanel extends LitElement {
685
683
  >
686
684
  </button>
687
685
 
688
- ${this._hoveredComboIndex === index
686
+ ${this._hoveredComboIndex === index && this._tooltipPos
689
687
  ? html `
690
688
  <div
691
- class=${classMap({
692
- "fw-dev-tooltip": true,
693
- "fw-dev-tooltip--above": this._tooltipAbove,
694
- "fw-dev-tooltip--below": !this._tooltipAbove,
695
- })}
689
+ class="fw-dev-tooltip"
690
+ style="top: ${this._tooltipPos.top}px; left: ${this._tooltipPos
691
+ .left}px;"
696
692
  >
697
693
  <div class="fw-dev-tooltip-header">
698
694
  <div class="fw-dev-tooltip-title">${combo.playerName}</div>
@@ -877,7 +873,7 @@ __decorate([
877
873
  ], FwDevModePanel.prototype, "_hoveredComboIndex", void 0);
878
874
  __decorate([
879
875
  state()
880
- ], FwDevModePanel.prototype, "_tooltipAbove", void 0);
876
+ ], FwDevModePanel.prototype, "_tooltipPos", void 0);
881
877
  __decorate([
882
878
  state()
883
879
  ], FwDevModePanel.prototype, "_showDisabledPlayers", void 0);