@livepeer-frameworks/player-wc 0.1.0

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/cjs/components/fw-context-menu.js +17 -0
  2. package/dist/cjs/components/fw-context-menu.js.map +1 -0
  3. package/dist/cjs/components/fw-dev-mode-panel.js +273 -0
  4. package/dist/cjs/components/fw-dev-mode-panel.js.map +1 -0
  5. package/dist/cjs/components/fw-error-overlay.js +101 -0
  6. package/dist/cjs/components/fw-error-overlay.js.map +1 -0
  7. package/dist/cjs/components/fw-idle-screen.js +182 -0
  8. package/dist/cjs/components/fw-idle-screen.js.map +1 -0
  9. package/dist/cjs/components/fw-loading-spinner.js +62 -0
  10. package/dist/cjs/components/fw-loading-spinner.js.map +1 -0
  11. package/dist/cjs/components/fw-player-controls.js +258 -0
  12. package/dist/cjs/components/fw-player-controls.js.map +1 -0
  13. package/dist/cjs/components/fw-player.js +570 -0
  14. package/dist/cjs/components/fw-player.js.map +1 -0
  15. package/dist/cjs/components/fw-seek-bar.js +233 -0
  16. package/dist/cjs/components/fw-seek-bar.js.map +1 -0
  17. package/dist/cjs/components/fw-settings-menu.js +126 -0
  18. package/dist/cjs/components/fw-settings-menu.js.map +1 -0
  19. package/dist/cjs/components/fw-skip-indicator.js +143 -0
  20. package/dist/cjs/components/fw-skip-indicator.js.map +1 -0
  21. package/dist/cjs/components/fw-speed-indicator.js +61 -0
  22. package/dist/cjs/components/fw-speed-indicator.js.map +1 -0
  23. package/dist/cjs/components/fw-stats-panel.js +141 -0
  24. package/dist/cjs/components/fw-stats-panel.js.map +1 -0
  25. package/dist/cjs/components/fw-subtitle-renderer.js +70 -0
  26. package/dist/cjs/components/fw-subtitle-renderer.js.map +1 -0
  27. package/dist/cjs/components/fw-title-overlay.js +72 -0
  28. package/dist/cjs/components/fw-title-overlay.js.map +1 -0
  29. package/dist/cjs/components/fw-toast.js +74 -0
  30. package/dist/cjs/components/fw-toast.js.map +1 -0
  31. package/dist/cjs/components/fw-volume-control.js +140 -0
  32. package/dist/cjs/components/fw-volume-control.js.map +1 -0
  33. package/dist/cjs/controllers/player-controller-host.js +315 -0
  34. package/dist/cjs/controllers/player-controller-host.js.map +1 -0
  35. package/dist/cjs/define.js +45 -0
  36. package/dist/cjs/define.js.map +1 -0
  37. package/dist/cjs/icons/index.js +153 -0
  38. package/dist/cjs/icons/index.js.map +1 -0
  39. package/dist/cjs/index.js +88 -0
  40. package/dist/cjs/index.js.map +1 -0
  41. 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 +33 -0
  42. 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 +1 -0
  43. package/dist/cjs/styles/shared-styles.js +1967 -0
  44. package/dist/cjs/styles/shared-styles.js.map +1 -0
  45. package/dist/cjs/styles/utility-styles.js +725 -0
  46. package/dist/cjs/styles/utility-styles.js.map +1 -0
  47. package/dist/esm/components/fw-context-menu.js +17 -0
  48. package/dist/esm/components/fw-context-menu.js.map +1 -0
  49. package/dist/esm/components/fw-dev-mode-panel.js +273 -0
  50. package/dist/esm/components/fw-dev-mode-panel.js.map +1 -0
  51. package/dist/esm/components/fw-error-overlay.js +101 -0
  52. package/dist/esm/components/fw-error-overlay.js.map +1 -0
  53. package/dist/esm/components/fw-idle-screen.js +182 -0
  54. package/dist/esm/components/fw-idle-screen.js.map +1 -0
  55. package/dist/esm/components/fw-loading-spinner.js +62 -0
  56. package/dist/esm/components/fw-loading-spinner.js.map +1 -0
  57. package/dist/esm/components/fw-player-controls.js +258 -0
  58. package/dist/esm/components/fw-player-controls.js.map +1 -0
  59. package/dist/esm/components/fw-player.js +570 -0
  60. package/dist/esm/components/fw-player.js.map +1 -0
  61. package/dist/esm/components/fw-seek-bar.js +233 -0
  62. package/dist/esm/components/fw-seek-bar.js.map +1 -0
  63. package/dist/esm/components/fw-settings-menu.js +126 -0
  64. package/dist/esm/components/fw-settings-menu.js.map +1 -0
  65. package/dist/esm/components/fw-skip-indicator.js +143 -0
  66. package/dist/esm/components/fw-skip-indicator.js.map +1 -0
  67. package/dist/esm/components/fw-speed-indicator.js +61 -0
  68. package/dist/esm/components/fw-speed-indicator.js.map +1 -0
  69. package/dist/esm/components/fw-stats-panel.js +141 -0
  70. package/dist/esm/components/fw-stats-panel.js.map +1 -0
  71. package/dist/esm/components/fw-subtitle-renderer.js +70 -0
  72. package/dist/esm/components/fw-subtitle-renderer.js.map +1 -0
  73. package/dist/esm/components/fw-title-overlay.js +72 -0
  74. package/dist/esm/components/fw-title-overlay.js.map +1 -0
  75. package/dist/esm/components/fw-toast.js +74 -0
  76. package/dist/esm/components/fw-toast.js.map +1 -0
  77. package/dist/esm/components/fw-volume-control.js +140 -0
  78. package/dist/esm/components/fw-volume-control.js.map +1 -0
  79. package/dist/esm/controllers/player-controller-host.js +313 -0
  80. package/dist/esm/controllers/player-controller-host.js.map +1 -0
  81. package/dist/esm/define.js +43 -0
  82. package/dist/esm/define.js.map +1 -0
  83. package/dist/esm/icons/index.js +141 -0
  84. package/dist/esm/icons/index.js.map +1 -0
  85. package/dist/esm/index.js +18 -0
  86. package/dist/esm/index.js.map +1 -0
  87. package/dist/esm/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 +31 -0
  88. package/dist/esm/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 +1 -0
  89. package/dist/esm/styles/shared-styles.js +1965 -0
  90. package/dist/esm/styles/shared-styles.js.map +1 -0
  91. package/dist/esm/styles/utility-styles.js +723 -0
  92. package/dist/esm/styles/utility-styles.js.map +1 -0
  93. package/dist/fw-player.iife.js +4362 -0
  94. package/dist/fw-player.iife.js.map +1 -0
  95. package/dist/types/components/fw-context-menu.d.ts +15 -0
  96. package/dist/types/components/fw-dev-mode-panel.d.ts +24 -0
  97. package/dist/types/components/fw-error-overlay.d.ts +14 -0
  98. package/dist/types/components/fw-idle-screen.d.ts +13 -0
  99. package/dist/types/components/fw-loading-spinner.d.ts +10 -0
  100. package/dist/types/components/fw-player-controls.d.ts +23 -0
  101. package/dist/types/components/fw-player.d.ts +74 -0
  102. package/dist/types/components/fw-seek-bar.d.ts +33 -0
  103. package/dist/types/components/fw-settings-menu.d.ts +16 -0
  104. package/dist/types/components/fw-skip-indicator.d.ts +18 -0
  105. package/dist/types/components/fw-speed-indicator.d.ts +11 -0
  106. package/dist/types/components/fw-stats-panel.d.ts +18 -0
  107. package/dist/types/components/fw-subtitle-renderer.d.ts +21 -0
  108. package/dist/types/components/fw-title-overlay.d.ts +12 -0
  109. package/dist/types/components/fw-toast.d.ts +12 -0
  110. package/dist/types/components/fw-volume-control.d.ts +18 -0
  111. package/dist/types/controllers/player-controller-host.d.ts +119 -0
  112. package/dist/types/define.d.ts +1 -0
  113. package/dist/types/icons/index.d.ts +23 -0
  114. package/dist/types/iife-entry.d.ts +11 -0
  115. package/dist/types/index.d.ts +25 -0
  116. package/dist/types/styles/shared-styles.d.ts +1 -0
  117. package/dist/types/styles/utility-styles.d.ts +1 -0
  118. package/package.json +65 -0
  119. package/src/components/fw-context-menu.ts +23 -0
  120. package/src/components/fw-dev-mode-panel.ts +285 -0
  121. package/src/components/fw-error-overlay.ts +96 -0
  122. package/src/components/fw-idle-screen.ts +182 -0
  123. package/src/components/fw-loading-spinner.ts +63 -0
  124. package/src/components/fw-player-controls.ts +256 -0
  125. package/src/components/fw-player.ts +557 -0
  126. package/src/components/fw-seek-bar.ts +219 -0
  127. package/src/components/fw-settings-menu.ts +128 -0
  128. package/src/components/fw-skip-indicator.ts +139 -0
  129. package/src/components/fw-speed-indicator.ts +57 -0
  130. package/src/components/fw-stats-panel.ts +154 -0
  131. package/src/components/fw-subtitle-renderer.ts +65 -0
  132. package/src/components/fw-title-overlay.ts +64 -0
  133. package/src/components/fw-toast.ts +70 -0
  134. package/src/components/fw-volume-control.ts +140 -0
  135. package/src/controllers/player-controller-host.ts +457 -0
  136. package/src/define.ts +43 -0
  137. package/src/icons/index.ts +209 -0
  138. package/src/iife-entry.ts +11 -0
  139. package/src/index.ts +31 -0
  140. package/src/styles/shared-styles.ts +1962 -0
  141. package/src/styles/utility-styles.ts +720 -0
@@ -0,0 +1,65 @@
1
+ import { LitElement, html, css, nothing } from "lit";
2
+ import { customElement, property, state } from "lit/decorators.js";
3
+
4
+ interface SubtitleCue {
5
+ id?: string;
6
+ startTime: number;
7
+ endTime: number;
8
+ text: string;
9
+ }
10
+
11
+ @customElement("fw-subtitle-renderer")
12
+ export class FwSubtitleRenderer extends LitElement {
13
+ @property({ type: Number }) currentTime = 0;
14
+ @property({ type: Boolean }) enabled = false;
15
+ @property({ attribute: false }) cues: SubtitleCue[] = [];
16
+
17
+ static styles = css`
18
+ :host {
19
+ display: contents;
20
+ }
21
+ .subtitle {
22
+ position: absolute;
23
+ bottom: 5%;
24
+ left: 50%;
25
+ transform: translateX(-50%);
26
+ display: inline-block;
27
+ max-width: 90%;
28
+ padding: 0.5em 1em;
29
+ border-radius: 4px;
30
+ background: rgb(0 0 0 / 0.75);
31
+ color: white;
32
+ font-size: 1.5rem;
33
+ font-family:
34
+ system-ui,
35
+ -apple-system,
36
+ sans-serif;
37
+ text-shadow: 2px 2px 4px rgb(0 0 0 / 0.5);
38
+ white-space: pre-wrap;
39
+ text-align: center;
40
+ z-index: 15;
41
+ pointer-events: none;
42
+ }
43
+ `;
44
+
45
+ private get _activeCue(): string | null {
46
+ if (!this.enabled || !this.cues.length) return null;
47
+ const t = this.currentTime * 1000; // Convert to ms
48
+ for (const cue of this.cues) {
49
+ if (t >= cue.startTime && t <= cue.endTime) return cue.text;
50
+ }
51
+ return null;
52
+ }
53
+
54
+ protected render() {
55
+ const text = this._activeCue;
56
+ if (!text) return nothing;
57
+ return html`<span class="subtitle" aria-live="polite">${text}</span>`;
58
+ }
59
+ }
60
+
61
+ declare global {
62
+ interface HTMLElementTagNameMap {
63
+ "fw-subtitle-renderer": FwSubtitleRenderer;
64
+ }
65
+ }
@@ -0,0 +1,64 @@
1
+ import { LitElement, html, css, nothing } from "lit";
2
+ import { customElement, property } from "lit/decorators.js";
3
+ import { sharedStyles } from "../styles/shared-styles.js";
4
+ import { utilityStyles } from "../styles/utility-styles.js";
5
+
6
+ @customElement("fw-title-overlay")
7
+ export class FwTitleOverlay extends LitElement {
8
+ @property({ type: String }) override title: string = "";
9
+ @property({ type: String }) description: string | null = null;
10
+
11
+ static styles = [
12
+ sharedStyles,
13
+ utilityStyles,
14
+ css`
15
+ :host {
16
+ display: contents;
17
+ }
18
+ .overlay {
19
+ position: absolute;
20
+ inset: 0 0 auto 0;
21
+ padding: 1rem 1.25rem;
22
+ background: linear-gradient(to bottom, rgb(0 0 0 / 0.7), rgb(0 0 0 / 0.4), transparent);
23
+ pointer-events: none;
24
+ transition: opacity 300ms ease;
25
+ z-index: 10;
26
+ }
27
+ .title {
28
+ font-size: 0.875rem;
29
+ font-weight: 500;
30
+ color: white;
31
+ max-width: 80%;
32
+ overflow: hidden;
33
+ text-overflow: ellipsis;
34
+ white-space: nowrap;
35
+ }
36
+ .desc {
37
+ margin-top: 0.25rem;
38
+ font-size: 0.75rem;
39
+ color: rgb(255 255 255 / 0.7);
40
+ max-width: 70%;
41
+ display: -webkit-box;
42
+ -webkit-line-clamp: 2;
43
+ -webkit-box-orient: vertical;
44
+ overflow: hidden;
45
+ }
46
+ `,
47
+ ];
48
+
49
+ protected render() {
50
+ if (this.title === "" && !this.description) return nothing;
51
+ return html`
52
+ <div class="overlay fw-title-overlay">
53
+ ${this.title ? html`<div class="title">${this.title}</div>` : nothing}
54
+ ${this.description ? html`<div class="desc">${this.description}</div>` : nothing}
55
+ </div>
56
+ `;
57
+ }
58
+ }
59
+
60
+ declare global {
61
+ interface HTMLElementTagNameMap {
62
+ "fw-title-overlay": FwTitleOverlay;
63
+ }
64
+ }
@@ -0,0 +1,70 @@
1
+ import { LitElement, html, css, nothing } from "lit";
2
+ import { customElement, property } from "lit/decorators.js";
3
+ import { closeIcon } from "../icons/index.js";
4
+
5
+ @customElement("fw-toast")
6
+ export class FwToast extends LitElement {
7
+ @property({ type: String }) message = "";
8
+
9
+ static styles = css`
10
+ :host {
11
+ display: contents;
12
+ }
13
+ .toast {
14
+ display: flex;
15
+ align-items: center;
16
+ gap: 0.5rem;
17
+ border-radius: 0.5rem;
18
+ border: 1px solid rgb(255 255 255 / 0.1);
19
+ background: rgb(0 0 0 / 0.8);
20
+ padding: 0.5rem 1rem;
21
+ font-size: 0.875rem;
22
+ color: white;
23
+ box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1);
24
+ backdrop-filter: blur(4px);
25
+ animation: _fw-slide-up 200ms ease-out;
26
+ }
27
+ @keyframes _fw-slide-up {
28
+ from {
29
+ opacity: 0;
30
+ transform: translateY(8px);
31
+ }
32
+ to {
33
+ opacity: 1;
34
+ transform: translateY(0);
35
+ }
36
+ }
37
+ button {
38
+ margin-left: 0.125rem;
39
+ color: rgb(255 255 255 / 0.6);
40
+ background: none;
41
+ border: none;
42
+ cursor: pointer;
43
+ padding: 0;
44
+ display: flex;
45
+ }
46
+ button:hover {
47
+ color: white;
48
+ }
49
+ `;
50
+
51
+ protected render() {
52
+ if (!this.message) return nothing;
53
+ return html`
54
+ <div class="toast">
55
+ <span>${this.message}</span>
56
+ <button type="button" @click=${this._dismiss} aria-label="Dismiss">${closeIcon()}</button>
57
+ </div>
58
+ `;
59
+ }
60
+
61
+ private _dismiss() {
62
+ this.dispatchEvent(new CustomEvent("fw-dismiss", { bubbles: true, composed: true }));
63
+ }
64
+ }
65
+
66
+ declare global {
67
+ interface HTMLElementTagNameMap {
68
+ "fw-toast": FwToast;
69
+ }
70
+ }
@@ -0,0 +1,140 @@
1
+ /**
2
+ * <fw-volume-control> — Mute toggle + volume slider.
3
+ */
4
+ import { LitElement, html, css } from "lit";
5
+ import { customElement, property, state } from "lit/decorators.js";
6
+ import { classMap } from "lit/directives/class-map.js";
7
+ import { styleMap } from "lit/directives/style-map.js";
8
+ import { sharedStyles } from "../styles/shared-styles.js";
9
+ import { volumeUpIcon, volumeOffIcon } from "../icons/index.js";
10
+ import type { PlayerControllerHost } from "../controllers/player-controller-host.js";
11
+
12
+ @customElement("fw-volume-control")
13
+ export class FwVolumeControl extends LitElement {
14
+ @property({ attribute: false }) pc!: PlayerControllerHost;
15
+ @state() private _expanded = false;
16
+
17
+ static styles = [
18
+ sharedStyles,
19
+ css`
20
+ :host {
21
+ display: flex;
22
+ align-items: center;
23
+ }
24
+ .group {
25
+ display: flex;
26
+ align-items: center;
27
+ gap: 0;
28
+ }
29
+ .btn {
30
+ display: flex;
31
+ align-items: center;
32
+ justify-content: center;
33
+ width: 2rem;
34
+ height: 2rem;
35
+ background: none;
36
+ border: none;
37
+ color: rgb(255 255 255 / 0.8);
38
+ cursor: pointer;
39
+ padding: 0;
40
+ border-radius: 0.25rem;
41
+ transition: color 150ms;
42
+ }
43
+ .btn:hover {
44
+ color: white;
45
+ }
46
+ .slider-wrap {
47
+ width: 0;
48
+ overflow: hidden;
49
+ transition: width 200ms ease;
50
+ }
51
+ .slider-wrap--expanded {
52
+ width: 72px;
53
+ }
54
+ .slider {
55
+ position: relative;
56
+ width: 72px;
57
+ height: 4px;
58
+ background: rgb(255 255 255 / 0.15);
59
+ border-radius: 2px;
60
+ cursor: pointer;
61
+ }
62
+ .slider-fill {
63
+ position: absolute;
64
+ top: 0;
65
+ left: 0;
66
+ height: 100%;
67
+ background: white;
68
+ border-radius: 2px;
69
+ pointer-events: none;
70
+ }
71
+ .slider-thumb {
72
+ position: absolute;
73
+ top: 50%;
74
+ width: 10px;
75
+ height: 10px;
76
+ border-radius: 50%;
77
+ background: white;
78
+ transform: translate(-50%, -50%);
79
+ pointer-events: none;
80
+ }
81
+ `,
82
+ ];
83
+
84
+ private _handleSliderClick = (e: MouseEvent) => {
85
+ const target = e.currentTarget as HTMLElement;
86
+ const rect = target.getBoundingClientRect();
87
+ const pct = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));
88
+ this.pc.setVolume(pct);
89
+ if (this.pc.s.isMuted && pct > 0) this.pc.toggleMute();
90
+ };
91
+
92
+ private _handleSliderDrag = (e: PointerEvent) => {
93
+ const target = e.currentTarget as HTMLElement;
94
+ const rect = target.getBoundingClientRect();
95
+ const pct = Math.max(0, Math.min(1, (e.clientX - rect.left) / rect.width));
96
+ this.pc.setVolume(pct);
97
+ };
98
+
99
+ protected render() {
100
+ const { isMuted, volume } = this.pc.s;
101
+ const displayVol = isMuted ? 0 : volume;
102
+
103
+ return html`
104
+ <div
105
+ class="group fw-volume-group"
106
+ @mouseenter=${() => {
107
+ this._expanded = true;
108
+ }}
109
+ @mouseleave=${() => {
110
+ this._expanded = false;
111
+ }}
112
+ >
113
+ <button
114
+ class="btn fw-btn-flush fw-volume-btn"
115
+ type="button"
116
+ @click=${() => this.pc.toggleMute()}
117
+ aria-label="${isMuted ? "Unmute" : "Mute"}"
118
+ >
119
+ ${isMuted ? volumeOffIcon(16) : volumeUpIcon(16)}
120
+ </button>
121
+ <div class=${classMap({ "slider-wrap": true, "slider-wrap--expanded": this._expanded })}>
122
+ <div
123
+ class="slider"
124
+ @click=${this._handleSliderClick}
125
+ @pointermove=${this._handleSliderDrag}
126
+ >
127
+ <div class="slider-fill" style=${styleMap({ width: `${displayVol * 100}%` })}></div>
128
+ <div class="slider-thumb" style=${styleMap({ left: `${displayVol * 100}%` })}></div>
129
+ </div>
130
+ </div>
131
+ </div>
132
+ `;
133
+ }
134
+ }
135
+
136
+ declare global {
137
+ interface HTMLElementTagNameMap {
138
+ "fw-volume-control": FwVolumeControl;
139
+ }
140
+ }