@livepeer-frameworks/player-wc 0.1.8 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/dist/esm/components/controls/fw-fullscreen-button.js +76 -0
  2. package/dist/esm/components/controls/fw-fullscreen-button.js.map +1 -0
  3. package/dist/esm/components/controls/fw-live-badge.js +109 -0
  4. package/dist/esm/components/controls/fw-live-badge.js.map +1 -0
  5. package/dist/esm/components/controls/fw-play-button.js +76 -0
  6. package/dist/esm/components/controls/fw-play-button.js.map +1 -0
  7. package/dist/esm/components/controls/fw-skip-button.js +62 -0
  8. package/dist/esm/components/controls/fw-skip-button.js.map +1 -0
  9. package/dist/esm/components/controls/fw-time-display.js +77 -0
  10. package/dist/esm/components/controls/fw-time-display.js.map +1 -0
  11. package/dist/esm/components/controls/fw-volume-control.js +76 -0
  12. package/dist/esm/components/controls/fw-volume-control.js.map +1 -0
  13. package/dist/esm/components/fw-dev-mode-panel.js +11 -15
  14. package/dist/esm/components/fw-dev-mode-panel.js.map +1 -1
  15. package/dist/esm/components/fw-error-overlay.js +13 -5
  16. package/dist/esm/components/fw-error-overlay.js.map +1 -1
  17. package/dist/esm/components/fw-idle-screen.js +10 -2
  18. package/dist/esm/components/fw-idle-screen.js.map +1 -1
  19. package/dist/esm/components/fw-loading-screen.js +89 -42
  20. package/dist/esm/components/fw-loading-screen.js.map +1 -1
  21. package/dist/esm/components/fw-loading-spinner.js +20 -9
  22. package/dist/esm/components/fw-loading-spinner.js.map +1 -1
  23. package/dist/esm/components/fw-player-controls.js +41 -26
  24. package/dist/esm/components/fw-player-controls.js.map +1 -1
  25. package/dist/esm/components/fw-player.js +165 -59
  26. package/dist/esm/components/fw-player.js.map +1 -1
  27. package/dist/esm/components/fw-settings-menu.js +44 -9
  28. package/dist/esm/components/fw-settings-menu.js.map +1 -1
  29. package/dist/esm/components/fw-stream-state-overlay.js +13 -5
  30. package/dist/esm/components/fw-stream-state-overlay.js.map +1 -1
  31. package/dist/esm/components/fw-toast.js +11 -1
  32. package/dist/esm/components/fw-toast.js.map +1 -1
  33. package/dist/esm/components/fw-volume-control.js +104 -39
  34. package/dist/esm/components/fw-volume-control.js.map +1 -1
  35. package/dist/esm/controllers/player-controller-host.js +14 -1
  36. package/dist/esm/controllers/player-controller-host.js.map +1 -1
  37. package/dist/esm/index.js +6 -0
  38. package/dist/esm/index.js.map +1 -1
  39. package/dist/esm/styles/shared-styles.js +401 -304
  40. package/dist/esm/styles/shared-styles.js.map +1 -1
  41. package/dist/fw-player.iife.js +722 -499
  42. package/dist/types/components/controls/fw-fullscreen-button.d.ts +18 -0
  43. package/dist/types/components/controls/fw-live-badge.d.ts +19 -0
  44. package/dist/types/components/controls/fw-play-button.d.ts +18 -0
  45. package/dist/types/components/controls/fw-skip-button.d.ts +17 -0
  46. package/dist/types/components/controls/fw-time-display.d.ts +17 -0
  47. package/dist/types/components/controls/fw-volume-control.d.ts +18 -0
  48. package/dist/types/components/controls/index.d.ts +6 -0
  49. package/dist/types/components/fw-dev-mode-panel.d.ts +1 -1
  50. package/dist/types/components/fw-error-overlay.d.ts +4 -0
  51. package/dist/types/components/fw-idle-screen.d.ts +4 -0
  52. package/dist/types/components/fw-loading-screen.d.ts +5 -1
  53. package/dist/types/components/fw-loading-spinner.d.ts +4 -0
  54. package/dist/types/components/fw-player-controls.d.ts +3 -1
  55. package/dist/types/components/fw-player.d.ts +10 -1
  56. package/dist/types/components/fw-settings-menu.d.ts +3 -1
  57. package/dist/types/components/fw-stream-state-overlay.d.ts +4 -0
  58. package/dist/types/components/fw-toast.d.ts +4 -0
  59. package/dist/types/components/fw-volume-control.d.ts +11 -0
  60. package/dist/types/controllers/player-controller-host.d.ts +7 -1
  61. package/dist/types/index.d.ts +1 -0
  62. package/package.json +10 -13
  63. package/src/components/controls/fw-fullscreen-button.ts +75 -0
  64. package/src/components/controls/fw-live-badge.ts +109 -0
  65. package/src/components/controls/fw-play-button.ts +75 -0
  66. package/src/components/controls/fw-skip-button.ts +59 -0
  67. package/src/components/controls/fw-time-display.ts +74 -0
  68. package/src/components/controls/fw-volume-control.ts +75 -0
  69. package/src/components/controls/index.ts +6 -0
  70. package/src/components/fw-dev-mode-panel.ts +10 -17
  71. package/src/components/fw-error-overlay.ts +13 -5
  72. package/src/components/fw-idle-screen.ts +10 -2
  73. package/src/components/fw-loading-screen.ts +90 -46
  74. package/src/components/fw-loading-spinner.ts +18 -9
  75. package/src/components/fw-player-controls.ts +39 -28
  76. package/src/components/fw-player.ts +166 -64
  77. package/src/components/fw-settings-menu.ts +49 -9
  78. package/src/components/fw-stream-state-overlay.ts +13 -5
  79. package/src/components/fw-toast.ts +11 -1
  80. package/src/components/fw-volume-control.ts +112 -43
  81. package/src/controllers/player-controller-host.ts +18 -0
  82. package/src/index.ts +10 -0
  83. package/src/styles/shared-styles.ts +401 -304
  84. package/dist/cjs/components/fw-context-menu.js +0 -17
  85. package/dist/cjs/components/fw-context-menu.js.map +0 -1
  86. package/dist/cjs/components/fw-dev-mode-panel.js +0 -907
  87. package/dist/cjs/components/fw-dev-mode-panel.js.map +0 -1
  88. package/dist/cjs/components/fw-dvd-logo.js +0 -211
  89. package/dist/cjs/components/fw-dvd-logo.js.map +0 -1
  90. package/dist/cjs/components/fw-error-overlay.js +0 -101
  91. package/dist/cjs/components/fw-error-overlay.js.map +0 -1
  92. package/dist/cjs/components/fw-idle-screen.js +0 -726
  93. package/dist/cjs/components/fw-idle-screen.js.map +0 -1
  94. package/dist/cjs/components/fw-loading-screen.js +0 -513
  95. package/dist/cjs/components/fw-loading-screen.js.map +0 -1
  96. package/dist/cjs/components/fw-loading-spinner.js +0 -62
  97. package/dist/cjs/components/fw-loading-spinner.js.map +0 -1
  98. package/dist/cjs/components/fw-player-controls.js +0 -441
  99. package/dist/cjs/components/fw-player-controls.js.map +0 -1
  100. package/dist/cjs/components/fw-player.js +0 -832
  101. package/dist/cjs/components/fw-player.js.map +0 -1
  102. package/dist/cjs/components/fw-seek-bar.js +0 -383
  103. package/dist/cjs/components/fw-seek-bar.js.map +0 -1
  104. package/dist/cjs/components/fw-settings-menu.js +0 -253
  105. package/dist/cjs/components/fw-settings-menu.js.map +0 -1
  106. package/dist/cjs/components/fw-skip-indicator.js +0 -143
  107. package/dist/cjs/components/fw-skip-indicator.js.map +0 -1
  108. package/dist/cjs/components/fw-speed-indicator.js +0 -61
  109. package/dist/cjs/components/fw-speed-indicator.js.map +0 -1
  110. package/dist/cjs/components/fw-stats-panel.js +0 -205
  111. package/dist/cjs/components/fw-stats-panel.js.map +0 -1
  112. package/dist/cjs/components/fw-stream-state-overlay.js +0 -338
  113. package/dist/cjs/components/fw-stream-state-overlay.js.map +0 -1
  114. package/dist/cjs/components/fw-subtitle-renderer.js +0 -217
  115. package/dist/cjs/components/fw-subtitle-renderer.js.map +0 -1
  116. package/dist/cjs/components/fw-thumbnail-overlay.js +0 -161
  117. package/dist/cjs/components/fw-thumbnail-overlay.js.map +0 -1
  118. package/dist/cjs/components/fw-title-overlay.js +0 -72
  119. package/dist/cjs/components/fw-title-overlay.js.map +0 -1
  120. package/dist/cjs/components/fw-toast.js +0 -74
  121. package/dist/cjs/components/fw-toast.js.map +0 -1
  122. package/dist/cjs/components/fw-volume-control.js +0 -221
  123. package/dist/cjs/components/fw-volume-control.js.map +0 -1
  124. package/dist/cjs/components/shared/hitmarker-audio.js +0 -76
  125. package/dist/cjs/components/shared/hitmarker-audio.js.map +0 -1
  126. package/dist/cjs/constants/media-assets.js +0 -11
  127. package/dist/cjs/constants/media-assets.js.map +0 -1
  128. package/dist/cjs/controllers/player-controller-host.js +0 -364
  129. package/dist/cjs/controllers/player-controller-host.js.map +0 -1
  130. package/dist/cjs/define.js +0 -53
  131. package/dist/cjs/define.js.map +0 -1
  132. package/dist/cjs/icons/index.js +0 -180
  133. package/dist/cjs/icons/index.js.map +0 -1
  134. package/dist/cjs/index.js +0 -108
  135. package/dist/cjs/index.js.map +0 -1
  136. package/dist/cjs/node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.57.1_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js +0 -33
  137. package/dist/cjs/node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.57.1_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js.map +0 -1
  138. package/dist/cjs/styles/shared-styles.js +0 -1985
  139. package/dist/cjs/styles/shared-styles.js.map +0 -1
  140. package/dist/cjs/styles/utility-styles.js +0 -725
  141. package/dist/cjs/styles/utility-styles.js.map +0 -1
@@ -1,6 +1,6 @@
1
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
2
  import { css, LitElement, nothing, html } from 'lit';
3
- import { property, state, customElement } from 'lit/decorators.js';
3
+ import { property, state, query, customElement } from 'lit/decorators.js';
4
4
  import { classMap } from 'lit/directives/class-map.js';
5
5
  import { sharedStyles } from '../styles/shared-styles.js';
6
6
  import { utilityStyles } from '../styles/utility-styles.js';
@@ -22,13 +22,14 @@ let FwPlayerControls = class FwPlayerControls extends LitElement {
22
22
  this._onBufferedUpdate = null;
23
23
  this._onWindowClick = (event) => {
24
24
  const path = event.composedPath();
25
- const insideControls = path.some((entry) => {
26
- if (!(entry instanceof HTMLElement)) {
27
- return false;
28
- }
29
- return (entry.classList.contains("fw-settings-anchor") ||
30
- entry.classList.contains("fw-settings-menu"));
31
- });
25
+ const anchor = this._settingsAnchorEl;
26
+ const insideControls = anchor !== null &&
27
+ path.some((entry) => {
28
+ if (!(entry instanceof Node)) {
29
+ return false;
30
+ }
31
+ return anchor.contains(entry);
32
+ });
32
33
  if (!insideControls) {
33
34
  this._settingsOpen = false;
34
35
  }
@@ -216,11 +217,11 @@ let FwPlayerControls = class FwPlayerControls extends LitElement {
216
217
  seekableStart: context.seekableStart,
217
218
  unixoffset: context.mistStreamInfo?.unixoffset,
218
219
  });
220
+ const showTimeDisplay = !(context.isLive && timeDisplay === "LIVE");
219
221
  const liveButtonDisabled = !context.hasDvrWindow || this._isNearLiveState;
220
222
  return html `
221
223
  <div
222
224
  class=${classMap({
223
- "fw-player-surface": true,
224
225
  "fw-controls-wrapper": true,
225
226
  "fw-controls-wrapper--visible": shouldShowControls,
226
227
  "fw-controls-wrapper--hidden": !shouldShowControls,
@@ -252,7 +253,7 @@ let FwPlayerControls = class FwPlayerControls extends LitElement {
252
253
  type="button"
253
254
  class="fw-btn-flush"
254
255
  ?disabled=${disabled}
255
- aria-label=${state.isPlaying ? "Pause" : "Play"}
256
+ aria-label=${state.isPlaying ? this.pc.t("pause") : this.pc.t("play")}
256
257
  @click=${() => this.pc.togglePlay()}
257
258
  >
258
259
  ${state.isPlaying ? pauseIcon(18) : playIcon(18)}
@@ -264,7 +265,7 @@ let FwPlayerControls = class FwPlayerControls extends LitElement {
264
265
  type="button"
265
266
  class="fw-btn-flush hidden sm:flex"
266
267
  ?disabled=${disabled}
267
- aria-label="Skip back 10 seconds"
268
+ aria-label=${this.pc.t("skipBackward")}
268
269
  @click=${() => this.pc.seekBy(-10)}
269
270
  >
270
271
  ${skipBackIcon(16)}
@@ -273,7 +274,7 @@ let FwPlayerControls = class FwPlayerControls extends LitElement {
273
274
  type="button"
274
275
  class="fw-btn-flush hidden sm:flex"
275
276
  ?disabled=${disabled}
276
- aria-label="Skip forward 10 seconds"
277
+ aria-label=${this.pc.t("skipForward")}
277
278
  @click=${() => this.pc.seekBy(10)}
278
279
  >
279
280
  ${skipForwardIcon(16)}
@@ -286,10 +287,13 @@ let FwPlayerControls = class FwPlayerControls extends LitElement {
286
287
  <fw-volume-control .pc=${this.pc}></fw-volume-control>
287
288
  </div>
288
289
 
289
- <div class="fw-control-group">
290
- <span class="fw-time-display">${timeDisplay}</span>
291
- </div>
292
-
290
+ ${showTimeDisplay
291
+ ? html `
292
+ <div class="fw-control-group">
293
+ <span class="fw-time-display">${timeDisplay}</span>
294
+ </div>
295
+ `
296
+ : nothing}
293
297
  ${context.isLive
294
298
  ? html `
295
299
  <div class="fw-control-group">
@@ -303,12 +307,12 @@ let FwPlayerControls = class FwPlayerControls extends LitElement {
303
307
  "fw-live-badge--behind": !liveButtonDisabled,
304
308
  })}
305
309
  title=${!context.hasDvrWindow
306
- ? "Live only"
310
+ ? this.pc.t("live")
307
311
  : this._isNearLiveState
308
- ? "At live edge"
309
- : "Jump to live"}
312
+ ? this.pc.t("live")
313
+ : this.pc.t("live")}
310
314
  >
311
- LIVE
315
+ ${this.pc.t("live").toUpperCase()}
312
316
  ${!this._isNearLiveState && context.hasDvrWindow
313
317
  ? seekToLiveIcon(10)
314
318
  : nothing}
@@ -328,8 +332,8 @@ let FwPlayerControls = class FwPlayerControls extends LitElement {
328
332
  "fw-btn-flush": true,
329
333
  "fw-btn-flush--active": this.isStatsOpen,
330
334
  })}
331
- aria-label="Toggle stats"
332
- title="Stats"
335
+ aria-label=${this.pc.t("showStats")}
336
+ title=${this.pc.t("showStats")}
333
337
  @click=${() => this.dispatchEvent(new CustomEvent("fw-stats-toggle", {
334
338
  bubbles: true,
335
339
  composed: true,
@@ -348,10 +352,11 @@ let FwPlayerControls = class FwPlayerControls extends LitElement {
348
352
  group: true,
349
353
  "fw-btn-flush--active": this._settingsOpen,
350
354
  })}
351
- aria-label="Settings"
352
- title="Settings"
355
+ aria-label=${this.pc.t("settings")}
356
+ title=${this.pc.t("settings")}
353
357
  ?disabled=${disabled}
354
- @click=${() => {
358
+ @click=${(event) => {
359
+ event.stopPropagation();
355
360
  if (disabled) {
356
361
  return;
357
362
  }
@@ -368,6 +373,8 @@ let FwPlayerControls = class FwPlayerControls extends LitElement {
368
373
  .open=${this._settingsOpen}
369
374
  .playbackMode=${this.playbackMode}
370
375
  .isContentLive=${this.isContentLive}
376
+ .activeLocale=${this.activeLocale}
377
+ @click=${(event) => event.stopPropagation()}
371
378
  @fw-close=${() => {
372
379
  this._settingsOpen = false;
373
380
  }}
@@ -380,7 +387,9 @@ let FwPlayerControls = class FwPlayerControls extends LitElement {
380
387
  type="button"
381
388
  class="fw-btn-flush"
382
389
  ?disabled=${disabled}
383
- aria-label=${state.isFullscreen ? "Exit fullscreen" : "Fullscreen"}
390
+ aria-label=${state.isFullscreen
391
+ ? this.pc.t("exitFullscreen")
392
+ : this.pc.t("fullscreen")}
384
393
  @click=${() => this.pc.toggleFullscreen()}
385
394
  >
386
395
  ${state.isFullscreen ? fullscreenExitIcon(16) : fullscreenIcon(16)}
@@ -424,6 +433,9 @@ __decorate([
424
433
  __decorate([
425
434
  property({ type: Boolean, attribute: "is-stats-open" })
426
435
  ], FwPlayerControls.prototype, "isStatsOpen", void 0);
436
+ __decorate([
437
+ property({ attribute: "active-locale" })
438
+ ], FwPlayerControls.prototype, "activeLocale", void 0);
427
439
  __decorate([
428
440
  state()
429
441
  ], FwPlayerControls.prototype, "_settingsOpen", void 0);
@@ -433,6 +445,9 @@ __decorate([
433
445
  __decorate([
434
446
  state()
435
447
  ], FwPlayerControls.prototype, "_buffered", void 0);
448
+ __decorate([
449
+ query(".fw-settings-anchor")
450
+ ], FwPlayerControls.prototype, "_settingsAnchorEl", void 0);
436
451
  FwPlayerControls = __decorate([
437
452
  customElement("fw-player-controls")
438
453
  ], FwPlayerControls);
@@ -1 +1 @@
1
- {"version":3,"file":"fw-player-controls.js","sources":["../../../../src/components/fw-player-controls.ts"],"sourcesContent":["/**\n * <fw-player-controls> — Player controls with seek, volume, live state, and settings.\n * Parity port of React/Svelte control behavior.\n */\nimport { LitElement, html, css, nothing, type PropertyValues } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { sharedStyles } from \"../styles/shared-styles.js\";\nimport { utilityStyles } from \"../styles/utility-styles.js\";\nimport {\n playIcon,\n pauseIcon,\n fullscreenIcon,\n fullscreenExitIcon,\n settingsIcon,\n seekToLiveIcon,\n skipBackIcon,\n skipForwardIcon,\n statsIcon,\n} from \"../icons/index.js\";\nimport {\n calculateIsNearLive,\n calculateLiveThresholds,\n calculateSeekableRange,\n canSeekStream,\n formatTimeDisplay,\n isLiveContent,\n isMediaStreamSource,\n type MistStreamInfo,\n type PlaybackMode,\n} from \"@livepeer-frameworks/player-core\";\nimport type { PlayerControllerHost } from \"../controllers/player-controller-host.js\";\n\ninterface SeekingContext {\n mistStreamInfo?: MistStreamInfo;\n isLive: boolean;\n sourceType?: string;\n seekableStart: number;\n liveEdge: number;\n hasDvrWindow: boolean;\n canSeek: boolean;\n commitOnRelease: boolean;\n liveThresholds: ReturnType<typeof calculateLiveThresholds>;\n}\n\n@customElement(\"fw-player-controls\")\nexport class FwPlayerControls extends LitElement {\n @property({ attribute: false }) pc!: PlayerControllerHost;\n @property({ type: String }) playbackMode: PlaybackMode = \"auto\";\n @property({ type: Boolean, attribute: \"is-content-live\" }) isContentLive = false;\n @property({ type: Boolean, attribute: \"dev-mode\" }) devMode = false;\n @property({ type: Boolean, attribute: \"show-stats-button\" }) showStatsButton = false;\n @property({ type: Boolean, attribute: \"is-stats-open\" }) isStatsOpen = false;\n\n @state() private _settingsOpen = false;\n @state() private _isNearLiveState = true;\n @state() private _buffered: TimeRanges | null = null;\n\n private _boundVideo: HTMLVideoElement | null = null;\n private _onBufferedUpdate: (() => void) | null = null;\n\n static styles = [\n sharedStyles,\n utilityStyles,\n css`\n :host {\n display: contents;\n }\n\n .fw-settings-anchor {\n position: relative;\n }\n `,\n ];\n\n connectedCallback(): void {\n super.connectedCallback();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this._unbindVideoEvents();\n this._detachWindowClickListener();\n }\n\n protected updated(changed: PropertyValues<this>): void {\n this._bindVideoEvents();\n this._reconcileNearLiveState();\n\n if (changed.has(\"_settingsOpen\" as keyof FwPlayerControls)) {\n if (this._settingsOpen) {\n this._attachWindowClickListener();\n } else {\n this._detachWindowClickListener();\n }\n }\n }\n\n private _bindVideoEvents(): void {\n const video = this.pc?.s.videoElement ?? null;\n if (video === this._boundVideo) {\n return;\n }\n\n this._unbindVideoEvents();\n this._boundVideo = video;\n\n if (!video) {\n this._buffered = null;\n return;\n }\n\n const updateBuffered = () => {\n this._buffered = this.pc.getBufferedRanges() ?? video.buffered;\n };\n\n updateBuffered();\n video.addEventListener(\"progress\", updateBuffered);\n video.addEventListener(\"loadeddata\", updateBuffered);\n this._onBufferedUpdate = updateBuffered;\n }\n\n private _unbindVideoEvents(): void {\n if (!this._boundVideo) {\n return;\n }\n\n const updateBuffered = this._onBufferedUpdate;\n if (updateBuffered) {\n this._boundVideo.removeEventListener(\"progress\", updateBuffered);\n this._boundVideo.removeEventListener(\"loadeddata\", updateBuffered);\n }\n\n this._boundVideo = null;\n this._onBufferedUpdate = null;\n }\n\n private _attachWindowClickListener(): void {\n window.setTimeout(() => {\n if (!this._settingsOpen) {\n return;\n }\n window.addEventListener(\"click\", this._onWindowClick);\n }, 0);\n }\n\n private _detachWindowClickListener(): void {\n window.removeEventListener(\"click\", this._onWindowClick);\n }\n\n private _onWindowClick = (event: MouseEvent): void => {\n const path = event.composedPath();\n const insideControls = path.some((entry) => {\n if (!(entry instanceof HTMLElement)) {\n return false;\n }\n return (\n entry.classList.contains(\"fw-settings-anchor\") ||\n entry.classList.contains(\"fw-settings-menu\")\n );\n });\n\n if (!insideControls) {\n this._settingsOpen = false;\n }\n };\n\n private _deriveBufferWindowMs(\n tracks?: Record<string, { firstms?: number; lastms?: number }>\n ): number | undefined {\n if (!tracks) {\n return undefined;\n }\n\n const trackValues = Object.values(tracks);\n if (trackValues.length === 0) {\n return undefined;\n }\n\n const firstmsValues = trackValues\n .map((track) => track.firstms)\n .filter((value): value is number => typeof value === \"number\");\n const lastmsValues = trackValues\n .map((track) => track.lastms)\n .filter((value): value is number => typeof value === \"number\");\n\n if (firstmsValues.length === 0 || lastmsValues.length === 0) {\n return undefined;\n }\n\n const firstms = Math.max(...firstmsValues);\n const lastms = Math.min(...lastmsValues);\n const window = lastms - firstms;\n\n if (!Number.isFinite(window) || window <= 0) {\n return undefined;\n }\n\n return window;\n }\n\n private _getSeekingContext(): SeekingContext {\n const state = this.pc.s;\n const controller = this.pc.getController();\n const sourceType = state.currentSourceInfo?.type;\n const mistStreamInfo = state.streamState?.streamInfo as MistStreamInfo | undefined;\n\n const isLive = isLiveContent(this.isContentLive, mistStreamInfo, state.duration);\n const bufferWindowMs =\n mistStreamInfo?.meta?.buffer_window ??\n this._deriveBufferWindowMs(\n mistStreamInfo?.meta?.tracks as\n | Record<string, { firstms?: number; lastms?: number }>\n | undefined\n );\n\n const isWebRTC = isMediaStreamSource(state.videoElement);\n\n const allowMediaStreamDvr =\n isMediaStreamSource(state.videoElement) &&\n bufferWindowMs !== undefined &&\n bufferWindowMs > 0 &&\n sourceType !== \"whep\" &&\n sourceType !== \"webrtc\";\n\n const calculatedRange = calculateSeekableRange({\n isLive,\n video: state.videoElement,\n mistStreamInfo,\n currentTime: state.currentTime,\n duration: state.duration,\n allowMediaStreamDvr,\n });\n\n const controllerSeekableStart = this.pc.getSeekableStart();\n const controllerLiveEdge = this.pc.getLiveEdge();\n\n const useControllerRange =\n Number.isFinite(controllerSeekableStart) &&\n Number.isFinite(controllerLiveEdge) &&\n controllerLiveEdge >= controllerSeekableStart &&\n (controllerLiveEdge > 0 || controllerSeekableStart > 0);\n\n const seekableStart = useControllerRange\n ? controllerSeekableStart\n : calculatedRange.seekableStart;\n const liveEdge = useControllerRange ? controllerLiveEdge : calculatedRange.liveEdge;\n\n const hasDvrWindow =\n isLive &&\n Number.isFinite(liveEdge) &&\n Number.isFinite(seekableStart) &&\n liveEdge > seekableStart;\n\n const baseCanSeek =\n controller?.canSeekStream?.() ??\n canSeekStream({\n video: state.videoElement,\n isLive,\n duration: state.duration,\n bufferWindowMs,\n });\n\n const liveThresholds = calculateLiveThresholds(sourceType, isWebRTC, bufferWindowMs);\n\n return {\n mistStreamInfo,\n isLive,\n sourceType,\n seekableStart,\n liveEdge,\n hasDvrWindow,\n canSeek: baseCanSeek && (!isLive || hasDvrWindow),\n commitOnRelease: isLive,\n liveThresholds,\n };\n }\n\n private _reconcileNearLiveState(): void {\n const context = this._getSeekingContext();\n\n if (!context.isLive) {\n if (!this._isNearLiveState) {\n this._isNearLiveState = true;\n }\n return;\n }\n\n const next = calculateIsNearLive(\n this.pc.s.currentTime,\n context.liveEdge,\n context.liveThresholds,\n this._isNearLiveState\n );\n\n if (next !== this._isNearLiveState) {\n this._isNearLiveState = next;\n }\n }\n\n private _handleModeChange(\n event: CustomEvent<{ mode: \"auto\" | \"low-latency\" | \"quality\" }>\n ): void {\n const { mode } = event.detail;\n this.dispatchEvent(\n new CustomEvent(\"fw-mode-change\", {\n detail: { mode },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n protected render() {\n const state = this.pc.s;\n const disabled = !state.videoElement;\n const context = this._getSeekingContext();\n const shouldShowControls =\n state.shouldShowControls ||\n state.isPaused ||\n !state.hasPlaybackStarted ||\n state.shouldShowIdleScreen ||\n !!state.error ||\n this._settingsOpen;\n\n const timeDisplay = formatTimeDisplay({\n isLive: context.isLive,\n currentTime: state.currentTime,\n duration: state.duration,\n liveEdge: context.liveEdge,\n seekableStart: context.seekableStart,\n unixoffset: context.mistStreamInfo?.unixoffset,\n });\n\n const liveButtonDisabled = !context.hasDvrWindow || this._isNearLiveState;\n\n return html`\n <div\n class=${classMap({\n \"fw-player-surface\": true,\n \"fw-controls-wrapper\": true,\n \"fw-controls-wrapper--visible\": shouldShowControls,\n \"fw-controls-wrapper--hidden\": !shouldShowControls,\n })}\n >\n <div class=\"fw-control-bar\" @click=${(event: Event) => event.stopPropagation()}>\n ${context.canSeek\n ? html`\n <div class=\"fw-seek-wrapper\">\n <fw-seek-bar\n .currentTime=${state.currentTime}\n .duration=${state.duration}\n .buffered=${this._buffered}\n .disabled=${disabled}\n .isLive=${context.isLive}\n .seekableStart=${context.seekableStart}\n .liveEdge=${context.liveEdge}\n .commitOnRelease=${context.commitOnRelease}\n @fw-seek=${(event: CustomEvent<{ time: number }>) =>\n this.pc.seek(event.detail.time)}\n ></fw-seek-bar>\n </div>\n `\n : nothing}\n\n <div class=\"fw-controls-row\">\n <div class=\"fw-controls-left\">\n <div class=\"fw-control-group\">\n <button\n type=\"button\"\n class=\"fw-btn-flush\"\n ?disabled=${disabled}\n aria-label=${state.isPlaying ? \"Pause\" : \"Play\"}\n @click=${() => this.pc.togglePlay()}\n >\n ${state.isPlaying ? pauseIcon(18) : playIcon(18)}\n </button>\n\n ${context.canSeek\n ? html`\n <button\n type=\"button\"\n class=\"fw-btn-flush hidden sm:flex\"\n ?disabled=${disabled}\n aria-label=\"Skip back 10 seconds\"\n @click=${() => this.pc.seekBy(-10)}\n >\n ${skipBackIcon(16)}\n </button>\n <button\n type=\"button\"\n class=\"fw-btn-flush hidden sm:flex\"\n ?disabled=${disabled}\n aria-label=\"Skip forward 10 seconds\"\n @click=${() => this.pc.seekBy(10)}\n >\n ${skipForwardIcon(16)}\n </button>\n `\n : nothing}\n </div>\n\n <div class=\"fw-control-group\">\n <fw-volume-control .pc=${this.pc}></fw-volume-control>\n </div>\n\n <div class=\"fw-control-group\">\n <span class=\"fw-time-display\">${timeDisplay}</span>\n </div>\n\n ${context.isLive\n ? html`\n <div class=\"fw-control-group\">\n <button\n type=\"button\"\n @click=${() => this.pc.jumpToLive()}\n ?disabled=${liveButtonDisabled}\n class=${classMap({\n \"fw-live-badge\": true,\n \"fw-live-badge--active\": liveButtonDisabled,\n \"fw-live-badge--behind\": !liveButtonDisabled,\n })}\n title=${!context.hasDvrWindow\n ? \"Live only\"\n : this._isNearLiveState\n ? \"At live edge\"\n : \"Jump to live\"}\n >\n LIVE\n ${!this._isNearLiveState && context.hasDvrWindow\n ? seekToLiveIcon(10)\n : nothing}\n </button>\n </div>\n `\n : nothing}\n </div>\n\n <div class=\"fw-controls-right\">\n ${this.showStatsButton\n ? html`\n <div class=\"fw-control-group\">\n <button\n type=\"button\"\n class=${classMap({\n \"fw-btn-flush\": true,\n \"fw-btn-flush--active\": this.isStatsOpen,\n })}\n aria-label=\"Toggle stats\"\n title=\"Stats\"\n @click=${() =>\n this.dispatchEvent(\n new CustomEvent(\"fw-stats-toggle\", {\n bubbles: true,\n composed: true,\n })\n )}\n >\n ${statsIcon(16)}\n </button>\n </div>\n `\n : nothing}\n <div class=\"fw-control-group fw-settings-anchor\">\n <button\n type=\"button\"\n class=${classMap({\n \"fw-btn-flush\": true,\n group: true,\n \"fw-btn-flush--active\": this._settingsOpen,\n })}\n aria-label=\"Settings\"\n title=\"Settings\"\n ?disabled=${disabled}\n @click=${() => {\n if (disabled) {\n return;\n }\n this._settingsOpen = !this._settingsOpen;\n }}\n >\n <span class=\"transition-transform group-hover:rotate-90\"\n >${settingsIcon(16)}</span\n >\n </button>\n\n <fw-settings-menu\n .pc=${this.pc}\n .open=${this._settingsOpen}\n .playbackMode=${this.playbackMode}\n .isContentLive=${this.isContentLive}\n @fw-close=${() => {\n this._settingsOpen = false;\n }}\n @fw-mode-change=${this._handleModeChange}\n ></fw-settings-menu>\n </div>\n\n <div class=\"fw-control-group\">\n <button\n type=\"button\"\n class=\"fw-btn-flush\"\n ?disabled=${disabled}\n aria-label=${state.isFullscreen ? \"Exit fullscreen\" : \"Fullscreen\"}\n @click=${() => this.pc.toggleFullscreen()}\n >\n ${state.isFullscreen ? fullscreenExitIcon(16) : fullscreenIcon(16)}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"fw-player-controls\": FwPlayerControls;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fw-player-controls.js","sources":["../../../../src/components/fw-player-controls.ts"],"sourcesContent":["/**\n * <fw-player-controls> — Player controls with seek, volume, live state, and settings.\n * Parity port of React/Svelte control behavior.\n */\nimport { LitElement, html, css, nothing, type PropertyValues } from \"lit\";\nimport { customElement, property, query, state } from \"lit/decorators.js\";\nimport { classMap } from \"lit/directives/class-map.js\";\nimport { sharedStyles } from \"../styles/shared-styles.js\";\nimport { utilityStyles } from \"../styles/utility-styles.js\";\nimport {\n playIcon,\n pauseIcon,\n fullscreenIcon,\n fullscreenExitIcon,\n settingsIcon,\n seekToLiveIcon,\n skipBackIcon,\n skipForwardIcon,\n statsIcon,\n} from \"../icons/index.js\";\nimport {\n calculateIsNearLive,\n calculateLiveThresholds,\n calculateSeekableRange,\n canSeekStream,\n formatTimeDisplay,\n isLiveContent,\n isMediaStreamSource,\n type MistStreamInfo,\n type PlaybackMode,\n type FwLocale,\n} from \"@livepeer-frameworks/player-core\";\nimport type { PlayerControllerHost } from \"../controllers/player-controller-host.js\";\n\ninterface SeekingContext {\n mistStreamInfo?: MistStreamInfo;\n isLive: boolean;\n sourceType?: string;\n seekableStart: number;\n liveEdge: number;\n hasDvrWindow: boolean;\n canSeek: boolean;\n commitOnRelease: boolean;\n liveThresholds: ReturnType<typeof calculateLiveThresholds>;\n}\n\n@customElement(\"fw-player-controls\")\nexport class FwPlayerControls extends LitElement {\n @property({ attribute: false }) pc!: PlayerControllerHost;\n @property({ type: String }) playbackMode: PlaybackMode = \"auto\";\n @property({ type: Boolean, attribute: \"is-content-live\" }) isContentLive = false;\n @property({ type: Boolean, attribute: \"dev-mode\" }) devMode = false;\n @property({ type: Boolean, attribute: \"show-stats-button\" }) showStatsButton = false;\n @property({ type: Boolean, attribute: \"is-stats-open\" }) isStatsOpen = false;\n @property({ attribute: \"active-locale\" }) activeLocale?: FwLocale;\n\n @state() private _settingsOpen = false;\n @state() private _isNearLiveState = true;\n @state() private _buffered: TimeRanges | null = null;\n @query(\".fw-settings-anchor\") private _settingsAnchorEl!: HTMLElement | null;\n\n private _boundVideo: HTMLVideoElement | null = null;\n private _onBufferedUpdate: (() => void) | null = null;\n\n static styles = [\n sharedStyles,\n utilityStyles,\n css`\n :host {\n display: contents;\n }\n\n .fw-settings-anchor {\n position: relative;\n }\n `,\n ];\n\n connectedCallback(): void {\n super.connectedCallback();\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this._unbindVideoEvents();\n this._detachWindowClickListener();\n }\n\n protected updated(changed: PropertyValues<this>): void {\n this._bindVideoEvents();\n this._reconcileNearLiveState();\n\n if (changed.has(\"_settingsOpen\" as keyof FwPlayerControls)) {\n if (this._settingsOpen) {\n this._attachWindowClickListener();\n } else {\n this._detachWindowClickListener();\n }\n }\n }\n\n private _bindVideoEvents(): void {\n const video = this.pc?.s.videoElement ?? null;\n if (video === this._boundVideo) {\n return;\n }\n\n this._unbindVideoEvents();\n this._boundVideo = video;\n\n if (!video) {\n this._buffered = null;\n return;\n }\n\n const updateBuffered = () => {\n this._buffered = this.pc.getBufferedRanges() ?? video.buffered;\n };\n\n updateBuffered();\n video.addEventListener(\"progress\", updateBuffered);\n video.addEventListener(\"loadeddata\", updateBuffered);\n this._onBufferedUpdate = updateBuffered;\n }\n\n private _unbindVideoEvents(): void {\n if (!this._boundVideo) {\n return;\n }\n\n const updateBuffered = this._onBufferedUpdate;\n if (updateBuffered) {\n this._boundVideo.removeEventListener(\"progress\", updateBuffered);\n this._boundVideo.removeEventListener(\"loadeddata\", updateBuffered);\n }\n\n this._boundVideo = null;\n this._onBufferedUpdate = null;\n }\n\n private _attachWindowClickListener(): void {\n window.setTimeout(() => {\n if (!this._settingsOpen) {\n return;\n }\n window.addEventListener(\"click\", this._onWindowClick);\n }, 0);\n }\n\n private _detachWindowClickListener(): void {\n window.removeEventListener(\"click\", this._onWindowClick);\n }\n\n private _onWindowClick = (event: MouseEvent): void => {\n const path = event.composedPath();\n const anchor = this._settingsAnchorEl;\n const insideControls =\n anchor !== null &&\n path.some((entry) => {\n if (!(entry instanceof Node)) {\n return false;\n }\n return anchor.contains(entry);\n });\n\n if (!insideControls) {\n this._settingsOpen = false;\n }\n };\n\n private _deriveBufferWindowMs(\n tracks?: Record<string, { firstms?: number; lastms?: number }>\n ): number | undefined {\n if (!tracks) {\n return undefined;\n }\n\n const trackValues = Object.values(tracks);\n if (trackValues.length === 0) {\n return undefined;\n }\n\n const firstmsValues = trackValues\n .map((track) => track.firstms)\n .filter((value): value is number => typeof value === \"number\");\n const lastmsValues = trackValues\n .map((track) => track.lastms)\n .filter((value): value is number => typeof value === \"number\");\n\n if (firstmsValues.length === 0 || lastmsValues.length === 0) {\n return undefined;\n }\n\n const firstms = Math.max(...firstmsValues);\n const lastms = Math.min(...lastmsValues);\n const window = lastms - firstms;\n\n if (!Number.isFinite(window) || window <= 0) {\n return undefined;\n }\n\n return window;\n }\n\n private _getSeekingContext(): SeekingContext {\n const state = this.pc.s;\n const controller = this.pc.getController();\n const sourceType = state.currentSourceInfo?.type;\n const mistStreamInfo = state.streamState?.streamInfo as MistStreamInfo | undefined;\n\n const isLive = isLiveContent(this.isContentLive, mistStreamInfo, state.duration);\n const bufferWindowMs =\n mistStreamInfo?.meta?.buffer_window ??\n this._deriveBufferWindowMs(\n mistStreamInfo?.meta?.tracks as\n | Record<string, { firstms?: number; lastms?: number }>\n | undefined\n );\n\n const isWebRTC = isMediaStreamSource(state.videoElement);\n\n const allowMediaStreamDvr =\n isMediaStreamSource(state.videoElement) &&\n bufferWindowMs !== undefined &&\n bufferWindowMs > 0 &&\n sourceType !== \"whep\" &&\n sourceType !== \"webrtc\";\n\n const calculatedRange = calculateSeekableRange({\n isLive,\n video: state.videoElement,\n mistStreamInfo,\n currentTime: state.currentTime,\n duration: state.duration,\n allowMediaStreamDvr,\n });\n\n const controllerSeekableStart = this.pc.getSeekableStart();\n const controllerLiveEdge = this.pc.getLiveEdge();\n\n const useControllerRange =\n Number.isFinite(controllerSeekableStart) &&\n Number.isFinite(controllerLiveEdge) &&\n controllerLiveEdge >= controllerSeekableStart &&\n (controllerLiveEdge > 0 || controllerSeekableStart > 0);\n\n const seekableStart = useControllerRange\n ? controllerSeekableStart\n : calculatedRange.seekableStart;\n const liveEdge = useControllerRange ? controllerLiveEdge : calculatedRange.liveEdge;\n\n const hasDvrWindow =\n isLive &&\n Number.isFinite(liveEdge) &&\n Number.isFinite(seekableStart) &&\n liveEdge > seekableStart;\n\n const baseCanSeek =\n controller?.canSeekStream?.() ??\n canSeekStream({\n video: state.videoElement,\n isLive,\n duration: state.duration,\n bufferWindowMs,\n });\n\n const liveThresholds = calculateLiveThresholds(sourceType, isWebRTC, bufferWindowMs);\n\n return {\n mistStreamInfo,\n isLive,\n sourceType,\n seekableStart,\n liveEdge,\n hasDvrWindow,\n canSeek: baseCanSeek && (!isLive || hasDvrWindow),\n commitOnRelease: isLive,\n liveThresholds,\n };\n }\n\n private _reconcileNearLiveState(): void {\n const context = this._getSeekingContext();\n\n if (!context.isLive) {\n if (!this._isNearLiveState) {\n this._isNearLiveState = true;\n }\n return;\n }\n\n const next = calculateIsNearLive(\n this.pc.s.currentTime,\n context.liveEdge,\n context.liveThresholds,\n this._isNearLiveState\n );\n\n if (next !== this._isNearLiveState) {\n this._isNearLiveState = next;\n }\n }\n\n private _handleModeChange(\n event: CustomEvent<{ mode: \"auto\" | \"low-latency\" | \"quality\" }>\n ): void {\n const { mode } = event.detail;\n this.dispatchEvent(\n new CustomEvent(\"fw-mode-change\", {\n detail: { mode },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n protected render() {\n const state = this.pc.s;\n const disabled = !state.videoElement;\n const context = this._getSeekingContext();\n const shouldShowControls =\n state.shouldShowControls ||\n state.isPaused ||\n !state.hasPlaybackStarted ||\n state.shouldShowIdleScreen ||\n !!state.error ||\n this._settingsOpen;\n\n const timeDisplay = formatTimeDisplay({\n isLive: context.isLive,\n currentTime: state.currentTime,\n duration: state.duration,\n liveEdge: context.liveEdge,\n seekableStart: context.seekableStart,\n unixoffset: context.mistStreamInfo?.unixoffset,\n });\n const showTimeDisplay = !(context.isLive && timeDisplay === \"LIVE\");\n\n const liveButtonDisabled = !context.hasDvrWindow || this._isNearLiveState;\n\n return html`\n <div\n class=${classMap({\n \"fw-controls-wrapper\": true,\n \"fw-controls-wrapper--visible\": shouldShowControls,\n \"fw-controls-wrapper--hidden\": !shouldShowControls,\n })}\n >\n <div class=\"fw-control-bar\" @click=${(event: Event) => event.stopPropagation()}>\n ${context.canSeek\n ? html`\n <div class=\"fw-seek-wrapper\">\n <fw-seek-bar\n .currentTime=${state.currentTime}\n .duration=${state.duration}\n .buffered=${this._buffered}\n .disabled=${disabled}\n .isLive=${context.isLive}\n .seekableStart=${context.seekableStart}\n .liveEdge=${context.liveEdge}\n .commitOnRelease=${context.commitOnRelease}\n @fw-seek=${(event: CustomEvent<{ time: number }>) =>\n this.pc.seek(event.detail.time)}\n ></fw-seek-bar>\n </div>\n `\n : nothing}\n\n <div class=\"fw-controls-row\">\n <div class=\"fw-controls-left\">\n <div class=\"fw-control-group\">\n <button\n type=\"button\"\n class=\"fw-btn-flush\"\n ?disabled=${disabled}\n aria-label=${state.isPlaying ? this.pc.t(\"pause\") : this.pc.t(\"play\")}\n @click=${() => this.pc.togglePlay()}\n >\n ${state.isPlaying ? pauseIcon(18) : playIcon(18)}\n </button>\n\n ${context.canSeek\n ? html`\n <button\n type=\"button\"\n class=\"fw-btn-flush hidden sm:flex\"\n ?disabled=${disabled}\n aria-label=${this.pc.t(\"skipBackward\")}\n @click=${() => this.pc.seekBy(-10)}\n >\n ${skipBackIcon(16)}\n </button>\n <button\n type=\"button\"\n class=\"fw-btn-flush hidden sm:flex\"\n ?disabled=${disabled}\n aria-label=${this.pc.t(\"skipForward\")}\n @click=${() => this.pc.seekBy(10)}\n >\n ${skipForwardIcon(16)}\n </button>\n `\n : nothing}\n </div>\n\n <div class=\"fw-control-group\">\n <fw-volume-control .pc=${this.pc}></fw-volume-control>\n </div>\n\n ${showTimeDisplay\n ? html`\n <div class=\"fw-control-group\">\n <span class=\"fw-time-display\">${timeDisplay}</span>\n </div>\n `\n : nothing}\n ${context.isLive\n ? html`\n <div class=\"fw-control-group\">\n <button\n type=\"button\"\n @click=${() => this.pc.jumpToLive()}\n ?disabled=${liveButtonDisabled}\n class=${classMap({\n \"fw-live-badge\": true,\n \"fw-live-badge--active\": liveButtonDisabled,\n \"fw-live-badge--behind\": !liveButtonDisabled,\n })}\n title=${!context.hasDvrWindow\n ? this.pc.t(\"live\")\n : this._isNearLiveState\n ? this.pc.t(\"live\")\n : this.pc.t(\"live\")}\n >\n ${this.pc.t(\"live\").toUpperCase()}\n ${!this._isNearLiveState && context.hasDvrWindow\n ? seekToLiveIcon(10)\n : nothing}\n </button>\n </div>\n `\n : nothing}\n </div>\n\n <div class=\"fw-controls-right\">\n ${this.showStatsButton\n ? html`\n <div class=\"fw-control-group\">\n <button\n type=\"button\"\n class=${classMap({\n \"fw-btn-flush\": true,\n \"fw-btn-flush--active\": this.isStatsOpen,\n })}\n aria-label=${this.pc.t(\"showStats\")}\n title=${this.pc.t(\"showStats\")}\n @click=${() =>\n this.dispatchEvent(\n new CustomEvent(\"fw-stats-toggle\", {\n bubbles: true,\n composed: true,\n })\n )}\n >\n ${statsIcon(16)}\n </button>\n </div>\n `\n : nothing}\n <div class=\"fw-control-group fw-settings-anchor\">\n <button\n type=\"button\"\n class=${classMap({\n \"fw-btn-flush\": true,\n group: true,\n \"fw-btn-flush--active\": this._settingsOpen,\n })}\n aria-label=${this.pc.t(\"settings\")}\n title=${this.pc.t(\"settings\")}\n ?disabled=${disabled}\n @click=${(event: MouseEvent) => {\n event.stopPropagation();\n if (disabled) {\n return;\n }\n this._settingsOpen = !this._settingsOpen;\n }}\n >\n <span class=\"transition-transform group-hover:rotate-90\"\n >${settingsIcon(16)}</span\n >\n </button>\n\n <fw-settings-menu\n .pc=${this.pc}\n .open=${this._settingsOpen}\n .playbackMode=${this.playbackMode}\n .isContentLive=${this.isContentLive}\n .activeLocale=${this.activeLocale}\n @click=${(event: MouseEvent) => event.stopPropagation()}\n @fw-close=${() => {\n this._settingsOpen = false;\n }}\n @fw-mode-change=${this._handleModeChange}\n ></fw-settings-menu>\n </div>\n\n <div class=\"fw-control-group\">\n <button\n type=\"button\"\n class=\"fw-btn-flush\"\n ?disabled=${disabled}\n aria-label=${state.isFullscreen\n ? this.pc.t(\"exitFullscreen\")\n : this.pc.t(\"fullscreen\")}\n @click=${() => this.pc.toggleFullscreen()}\n >\n ${state.isFullscreen ? fullscreenExitIcon(16) : fullscreenIcon(16)}\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n \"fw-player-controls\": FwPlayerControls;\n }\n}\n"],"names":[],"mappings":"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"}