@livepeer-frameworks/player-wc 0.1.9 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/dist/esm/components/controls/fw-fullscreen-button.js +76 -0
  2. package/dist/esm/components/controls/fw-fullscreen-button.js.map +1 -0
  3. package/dist/esm/components/controls/fw-live-badge.js +109 -0
  4. package/dist/esm/components/controls/fw-live-badge.js.map +1 -0
  5. package/dist/esm/components/controls/fw-play-button.js +76 -0
  6. package/dist/esm/components/controls/fw-play-button.js.map +1 -0
  7. package/dist/esm/components/controls/fw-skip-button.js +62 -0
  8. package/dist/esm/components/controls/fw-skip-button.js.map +1 -0
  9. package/dist/esm/components/controls/fw-time-display.js +77 -0
  10. package/dist/esm/components/controls/fw-time-display.js.map +1 -0
  11. package/dist/esm/components/controls/fw-volume-control.js +76 -0
  12. package/dist/esm/components/controls/fw-volume-control.js.map +1 -0
  13. package/dist/esm/components/fw-dev-mode-panel.js +11 -15
  14. package/dist/esm/components/fw-dev-mode-panel.js.map +1 -1
  15. package/dist/esm/components/fw-error-overlay.js +13 -5
  16. package/dist/esm/components/fw-error-overlay.js.map +1 -1
  17. package/dist/esm/components/fw-idle-screen.js +10 -2
  18. package/dist/esm/components/fw-idle-screen.js.map +1 -1
  19. package/dist/esm/components/fw-loading-screen.js +89 -42
  20. package/dist/esm/components/fw-loading-screen.js.map +1 -1
  21. package/dist/esm/components/fw-loading-spinner.js +20 -9
  22. package/dist/esm/components/fw-loading-spinner.js.map +1 -1
  23. package/dist/esm/components/fw-player-controls.js +18 -13
  24. package/dist/esm/components/fw-player-controls.js.map +1 -1
  25. package/dist/esm/components/fw-player.js +165 -59
  26. package/dist/esm/components/fw-player.js.map +1 -1
  27. package/dist/esm/components/fw-settings-menu.js +44 -9
  28. package/dist/esm/components/fw-settings-menu.js.map +1 -1
  29. package/dist/esm/components/fw-stream-state-overlay.js +13 -5
  30. package/dist/esm/components/fw-stream-state-overlay.js.map +1 -1
  31. package/dist/esm/components/fw-toast.js +11 -1
  32. package/dist/esm/components/fw-toast.js.map +1 -1
  33. package/dist/esm/components/fw-volume-control.js +13 -3
  34. package/dist/esm/components/fw-volume-control.js.map +1 -1
  35. package/dist/esm/controllers/player-controller-host.js +14 -1
  36. package/dist/esm/controllers/player-controller-host.js.map +1 -1
  37. package/dist/esm/index.js +6 -0
  38. package/dist/esm/index.js.map +1 -1
  39. package/dist/esm/styles/shared-styles.js +401 -304
  40. package/dist/esm/styles/shared-styles.js.map +1 -1
  41. package/dist/fw-player.iife.js +707 -488
  42. package/dist/types/components/controls/fw-fullscreen-button.d.ts +18 -0
  43. package/dist/types/components/controls/fw-live-badge.d.ts +19 -0
  44. package/dist/types/components/controls/fw-play-button.d.ts +18 -0
  45. package/dist/types/components/controls/fw-skip-button.d.ts +17 -0
  46. package/dist/types/components/controls/fw-time-display.d.ts +17 -0
  47. package/dist/types/components/controls/fw-volume-control.d.ts +18 -0
  48. package/dist/types/components/controls/index.d.ts +6 -0
  49. package/dist/types/components/fw-dev-mode-panel.d.ts +1 -1
  50. package/dist/types/components/fw-error-overlay.d.ts +4 -0
  51. package/dist/types/components/fw-idle-screen.d.ts +4 -0
  52. package/dist/types/components/fw-loading-screen.d.ts +5 -1
  53. package/dist/types/components/fw-loading-spinner.d.ts +4 -0
  54. package/dist/types/components/fw-player-controls.d.ts +2 -1
  55. package/dist/types/components/fw-player.d.ts +10 -1
  56. package/dist/types/components/fw-settings-menu.d.ts +3 -1
  57. package/dist/types/components/fw-stream-state-overlay.d.ts +4 -0
  58. package/dist/types/components/fw-toast.d.ts +4 -0
  59. package/dist/types/controllers/player-controller-host.d.ts +7 -1
  60. package/dist/types/index.d.ts +1 -0
  61. package/package.json +10 -13
  62. package/src/components/controls/fw-fullscreen-button.ts +75 -0
  63. package/src/components/controls/fw-live-badge.ts +109 -0
  64. package/src/components/controls/fw-play-button.ts +75 -0
  65. package/src/components/controls/fw-skip-button.ts +59 -0
  66. package/src/components/controls/fw-time-display.ts +74 -0
  67. package/src/components/controls/fw-volume-control.ts +75 -0
  68. package/src/components/controls/index.ts +6 -0
  69. package/src/components/fw-dev-mode-panel.ts +10 -17
  70. package/src/components/fw-error-overlay.ts +13 -5
  71. package/src/components/fw-idle-screen.ts +10 -2
  72. package/src/components/fw-loading-screen.ts +90 -46
  73. package/src/components/fw-loading-spinner.ts +18 -9
  74. package/src/components/fw-player-controls.ts +17 -13
  75. package/src/components/fw-player.ts +166 -64
  76. package/src/components/fw-settings-menu.ts +49 -9
  77. package/src/components/fw-stream-state-overlay.ts +13 -5
  78. package/src/components/fw-toast.ts +11 -1
  79. package/src/components/fw-volume-control.ts +14 -3
  80. package/src/controllers/player-controller-host.ts +18 -0
  81. package/src/index.ts +10 -0
  82. package/src/styles/shared-styles.ts +401 -304
  83. package/dist/cjs/components/fw-context-menu.js +0 -17
  84. package/dist/cjs/components/fw-context-menu.js.map +0 -1
  85. package/dist/cjs/components/fw-dev-mode-panel.js +0 -907
  86. package/dist/cjs/components/fw-dev-mode-panel.js.map +0 -1
  87. package/dist/cjs/components/fw-dvd-logo.js +0 -211
  88. package/dist/cjs/components/fw-dvd-logo.js.map +0 -1
  89. package/dist/cjs/components/fw-error-overlay.js +0 -101
  90. package/dist/cjs/components/fw-error-overlay.js.map +0 -1
  91. package/dist/cjs/components/fw-idle-screen.js +0 -726
  92. package/dist/cjs/components/fw-idle-screen.js.map +0 -1
  93. package/dist/cjs/components/fw-loading-screen.js +0 -513
  94. package/dist/cjs/components/fw-loading-screen.js.map +0 -1
  95. package/dist/cjs/components/fw-loading-spinner.js +0 -62
  96. package/dist/cjs/components/fw-loading-spinner.js.map +0 -1
  97. package/dist/cjs/components/fw-player-controls.js +0 -451
  98. package/dist/cjs/components/fw-player-controls.js.map +0 -1
  99. package/dist/cjs/components/fw-player.js +0 -832
  100. package/dist/cjs/components/fw-player.js.map +0 -1
  101. package/dist/cjs/components/fw-seek-bar.js +0 -383
  102. package/dist/cjs/components/fw-seek-bar.js.map +0 -1
  103. package/dist/cjs/components/fw-settings-menu.js +0 -253
  104. package/dist/cjs/components/fw-settings-menu.js.map +0 -1
  105. package/dist/cjs/components/fw-skip-indicator.js +0 -143
  106. package/dist/cjs/components/fw-skip-indicator.js.map +0 -1
  107. package/dist/cjs/components/fw-speed-indicator.js +0 -61
  108. package/dist/cjs/components/fw-speed-indicator.js.map +0 -1
  109. package/dist/cjs/components/fw-stats-panel.js +0 -205
  110. package/dist/cjs/components/fw-stats-panel.js.map +0 -1
  111. package/dist/cjs/components/fw-stream-state-overlay.js +0 -338
  112. package/dist/cjs/components/fw-stream-state-overlay.js.map +0 -1
  113. package/dist/cjs/components/fw-subtitle-renderer.js +0 -217
  114. package/dist/cjs/components/fw-subtitle-renderer.js.map +0 -1
  115. package/dist/cjs/components/fw-thumbnail-overlay.js +0 -161
  116. package/dist/cjs/components/fw-thumbnail-overlay.js.map +0 -1
  117. package/dist/cjs/components/fw-title-overlay.js +0 -72
  118. package/dist/cjs/components/fw-title-overlay.js.map +0 -1
  119. package/dist/cjs/components/fw-toast.js +0 -74
  120. package/dist/cjs/components/fw-toast.js.map +0 -1
  121. package/dist/cjs/components/fw-volume-control.js +0 -276
  122. package/dist/cjs/components/fw-volume-control.js.map +0 -1
  123. package/dist/cjs/components/shared/hitmarker-audio.js +0 -76
  124. package/dist/cjs/components/shared/hitmarker-audio.js.map +0 -1
  125. package/dist/cjs/constants/media-assets.js +0 -11
  126. package/dist/cjs/constants/media-assets.js.map +0 -1
  127. package/dist/cjs/controllers/player-controller-host.js +0 -364
  128. package/dist/cjs/controllers/player-controller-host.js.map +0 -1
  129. package/dist/cjs/define.js +0 -53
  130. package/dist/cjs/define.js.map +0 -1
  131. package/dist/cjs/icons/index.js +0 -180
  132. package/dist/cjs/icons/index.js.map +0 -1
  133. package/dist/cjs/index.js +0 -108
  134. package/dist/cjs/index.js.map +0 -1
  135. package/dist/cjs/node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.57.1_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js +0 -33
  136. package/dist/cjs/node_modules/.pnpm/@rollup_plugin-typescript@12.3.0_rollup@4.57.1_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js.map +0 -1
  137. package/dist/cjs/styles/shared-styles.js +0 -1985
  138. package/dist/cjs/styles/shared-styles.js.map +0 -1
  139. package/dist/cjs/styles/utility-styles.js +0 -725
  140. package/dist/cjs/styles/utility-styles.js.map +0 -1
@@ -9,8 +9,10 @@ import { utilityStyles } from "../styles/utility-styles.js";
9
9
  import {
10
10
  SPEED_PRESETS,
11
11
  supportsPlaybackRate as coreSupportsPlaybackRate,
12
+ getAvailableLocales,
13
+ getLocaleDisplayName,
12
14
  } from "@livepeer-frameworks/player-core";
13
- import type { PlaybackMode } from "@livepeer-frameworks/player-core";
15
+ import type { PlaybackMode, FwLocale } from "@livepeer-frameworks/player-core";
14
16
  import type { PlayerControllerHost } from "../controllers/player-controller-host.js";
15
17
 
16
18
  @customElement("fw-settings-menu")
@@ -23,6 +25,7 @@ export class FwSettingsMenu extends LitElement {
23
25
  @property({ type: String, attribute: "quality-value" }) qualityValue?: string;
24
26
  @property({ type: String, attribute: "caption-value" }) captionValue?: string;
25
27
  @property({ type: Boolean, attribute: "supports-playback-rate" }) supportsPlaybackRate?: boolean;
28
+ @property({ attribute: "active-locale" }) activeLocale?: FwLocale;
26
29
 
27
30
  @state() private _playbackRate = 1;
28
31
 
@@ -109,6 +112,16 @@ export class FwSettingsMenu extends LitElement {
109
112
  this._close();
110
113
  }
111
114
 
115
+ private _handleLocaleChange(locale: FwLocale): void {
116
+ this.dispatchEvent(
117
+ new CustomEvent("fw-locale-change", {
118
+ detail: { locale },
119
+ bubbles: true,
120
+ composed: true,
121
+ })
122
+ );
123
+ }
124
+
112
125
  private _deriveFallbackQualities(): Array<{
113
126
  id: string;
114
127
  label: string;
@@ -166,11 +179,11 @@ export class FwSettingsMenu extends LitElement {
166
179
  this.supportsPlaybackRate ?? coreSupportsPlaybackRate(state.videoElement);
167
180
 
168
181
  return html`
169
- <div class="fw-player-surface fw-settings-menu" role="menu" aria-label="Player settings">
182
+ <div class="fw-settings-menu" role="menu" aria-label=${this.pc.t("settings")}>
170
183
  ${this.isContentLive
171
184
  ? html`
172
185
  <div class="fw-settings-section">
173
- <div class="fw-settings-label">Mode</div>
186
+ <div class="fw-settings-label">${this.pc.t("mode")}</div>
174
187
  <div class="fw-settings-options">
175
188
  ${(["auto", "low-latency", "quality"] as const).map(
176
189
  (mode) => html`
@@ -182,7 +195,11 @@ export class FwSettingsMenu extends LitElement {
182
195
  })}
183
196
  @click=${() => this._handleModeChange(mode)}
184
197
  >
185
- ${mode === "low-latency" ? "Fast" : mode === "quality" ? "Stable" : "Auto"}
198
+ ${mode === "low-latency"
199
+ ? this.pc.t("fast")
200
+ : mode === "quality"
201
+ ? this.pc.t("stable")
202
+ : this.pc.t("auto")}
186
203
  </button>
187
204
  `
188
205
  )}
@@ -193,7 +210,7 @@ export class FwSettingsMenu extends LitElement {
193
210
  ${supportsPlaybackRate
194
211
  ? html`
195
212
  <div class="fw-settings-section">
196
- <div class="fw-settings-label">Speed</div>
213
+ <div class="fw-settings-label">${this.pc.t("speed")}</div>
197
214
  <div class="fw-settings-options fw-settings-options--wrap">
198
215
  ${SPEED_PRESETS.map(
199
216
  (rate) => html`
@@ -216,7 +233,7 @@ export class FwSettingsMenu extends LitElement {
216
233
  ${qualities.length > 0
217
234
  ? html`
218
235
  <div class="fw-settings-section">
219
- <div class="fw-settings-label">Quality</div>
236
+ <div class="fw-settings-label">${this.pc.t("quality")}</div>
220
237
  <div class="fw-settings-list">
221
238
  <button
222
239
  type="button"
@@ -226,7 +243,7 @@ export class FwSettingsMenu extends LitElement {
226
243
  })}
227
244
  @click=${() => this._handleQualityChange("auto")}
228
245
  >
229
- Auto
246
+ ${this.pc.t("auto")}
230
247
  </button>
231
248
  ${qualities.map(
232
249
  (quality) => html`
@@ -249,7 +266,7 @@ export class FwSettingsMenu extends LitElement {
249
266
  ${textTracks.length > 0
250
267
  ? html`
251
268
  <div class="fw-settings-section">
252
- <div class="fw-settings-label">Captions</div>
269
+ <div class="fw-settings-label">${this.pc.t("captions")}</div>
253
270
  <div class="fw-settings-list">
254
271
  <button
255
272
  type="button"
@@ -259,7 +276,7 @@ export class FwSettingsMenu extends LitElement {
259
276
  })}
260
277
  @click=${() => this._handleCaptionChange("none")}
261
278
  >
262
- Off
279
+ ${this.pc.t("captionsOff")}
263
280
  </button>
264
281
  ${textTracks.map(
265
282
  (track) => html`
@@ -279,6 +296,29 @@ export class FwSettingsMenu extends LitElement {
279
296
  </div>
280
297
  `
281
298
  : nothing}
299
+ ${this.activeLocale !== undefined
300
+ ? html`
301
+ <div class="fw-settings-section">
302
+ <div class="fw-settings-label">${this.pc.t("language")}</div>
303
+ <div class="fw-settings-list">
304
+ ${getAvailableLocales().map(
305
+ (loc) => html`
306
+ <button
307
+ type="button"
308
+ class=${classMap({
309
+ "fw-settings-list-item": true,
310
+ "fw-settings-list-item--active": this.activeLocale === loc,
311
+ })}
312
+ @click=${() => this._handleLocaleChange(loc)}
313
+ >
314
+ ${getLocaleDisplayName(loc)}
315
+ </button>
316
+ `
317
+ )}
318
+ </div>
319
+ </div>
320
+ `
321
+ : nothing}
282
322
  </div>
283
323
  `;
284
324
  }
@@ -1,6 +1,7 @@
1
1
  import { LitElement, css, html, nothing } from "lit";
2
2
  import { customElement, property } from "lit/decorators.js";
3
3
  import type { StreamStatus } from "@livepeer-frameworks/player-core";
4
+ import { createTranslator, type TranslateFn } from "@livepeer-frameworks/player-core";
4
5
  import { sharedStyles } from "../styles/shared-styles.js";
5
6
 
6
7
  @customElement("fw-stream-state-overlay")
@@ -11,6 +12,13 @@ export class FwStreamStateOverlay extends LitElement {
11
12
  @property({ type: Boolean }) visible = true;
12
13
  @property({ type: Boolean, attribute: "retry-enabled" }) retryEnabled = false;
13
14
  @property({ attribute: false }) onRetry?: () => void;
15
+ @property({ attribute: false }) translator?: TranslateFn;
16
+
17
+ private _defaultTranslator: TranslateFn = createTranslator({ locale: "en" });
18
+
19
+ private get _t(): TranslateFn {
20
+ return this.translator ?? this._defaultTranslator;
21
+ }
14
22
 
15
23
  static styles = [
16
24
  sharedStyles,
@@ -294,15 +302,15 @@ export class FwStreamStateOverlay extends LitElement {
294
302
  `
295
303
  : nothing}
296
304
  ${this.status === "OFFLINE"
297
- ? html`<p class="hint">The stream will start when the broadcaster goes live</p>`
305
+ ? html`<p class="hint">${this._t("broadcasterGoLive")}</p>`
298
306
  : nothing}
299
307
  ${this.status === "BOOTING" || this.status === "WAITING_FOR_DATA"
300
- ? html`<p class="hint">Please wait while the stream prepares...</p>`
308
+ ? html`<p class="hint">${this._t("streamPreparing")}</p>`
301
309
  : nothing}
302
310
  ${!showRetry
303
311
  ? html`<div class="polling-indicator">
304
312
  <span class="polling-dot"></span>
305
- <span>Checking stream status...</span>
313
+ <span>${this._t("checkingStatus")}</span>
306
314
  </div>`
307
315
  : nothing}
308
316
  </div>
@@ -312,9 +320,9 @@ export class FwStreamStateOverlay extends LitElement {
312
320
  type="button"
313
321
  class="btn-flush"
314
322
  @click=${this._handleRetry}
315
- aria-label="Retry connection"
323
+ aria-label=${this._t("retryConnection")}
316
324
  >
317
- Retry Connection
325
+ ${this._t("retryConnection")}
318
326
  </button>
319
327
  </div>`
320
328
  : nothing}
@@ -1,10 +1,18 @@
1
1
  import { LitElement, html, css, nothing } from "lit";
2
2
  import { customElement, property } from "lit/decorators.js";
3
3
  import { closeIcon } from "../icons/index.js";
4
+ import { createTranslator, type TranslateFn } from "@livepeer-frameworks/player-core";
4
5
 
5
6
  @customElement("fw-toast")
6
7
  export class FwToast extends LitElement {
7
8
  @property({ type: String }) message = "";
9
+ @property({ attribute: false }) translator?: TranslateFn;
10
+
11
+ private _defaultTranslator: TranslateFn = createTranslator({ locale: "en" });
12
+
13
+ private get _t(): TranslateFn {
14
+ return this.translator ?? this._defaultTranslator;
15
+ }
8
16
 
9
17
  static styles = css`
10
18
  :host {
@@ -53,7 +61,9 @@ export class FwToast extends LitElement {
53
61
  return html`
54
62
  <div class="toast">
55
63
  <span>${this.message}</span>
56
- <button type="button" @click=${this._dismiss} aria-label="Dismiss">${closeIcon()}</button>
64
+ <button type="button" @click=${this._dismiss} aria-label=${this._t("dismiss")}>
65
+ ${closeIcon()}
66
+ </button>
57
67
  </div>
58
68
  `;
59
69
  }
@@ -76,6 +76,13 @@ export class FwVolumeControl extends LitElement {
76
76
  }
77
77
 
78
78
  private _updateHasAudio(): void {
79
+ // Primary: trust MistServer stream metadata (matches ddvtech embed approach)
80
+ const mistHasAudio = this.pc?.s.streamState?.streamInfo?.hasAudio;
81
+ if (mistHasAudio !== undefined) {
82
+ this._hasAudio = mistHasAudio;
83
+ return;
84
+ }
85
+
79
86
  const video = this.pc?.s.videoElement;
80
87
  if (!video) {
81
88
  this._hasAudio = true;
@@ -260,8 +267,12 @@ export class FwVolumeControl extends LitElement {
260
267
  }
261
268
  }}
262
269
  ?disabled=${!this._hasAudio}
263
- aria-label=${!this._hasAudio ? "No audio" : isMuted ? "Unmute" : "Mute"}
264
- title=${!this._hasAudio ? "No audio" : isMuted ? "Unmute" : "Mute"}
270
+ aria-label=${!this._hasAudio
271
+ ? "No audio"
272
+ : isMuted
273
+ ? this.pc.t("unmute")
274
+ : this.pc.t("mute")}
275
+ title=${!this._hasAudio ? "No audio" : isMuted ? this.pc.t("unmute") : this.pc.t("mute")}
265
276
  >
266
277
  ${isMuted || !this._hasAudio ? volumeOffIcon(16) : volumeUpIcon(16)}
267
278
  </button>
@@ -276,7 +287,7 @@ export class FwVolumeControl extends LitElement {
276
287
  <div
277
288
  class="slider"
278
289
  role="slider"
279
- aria-label="Volume"
290
+ aria-label=${this.pc.t("volume")}
280
291
  aria-valuemin="0"
281
292
  aria-valuemax="100"
282
293
  aria-valuenow=${Math.round(displayVolume * 100)}
@@ -5,6 +5,7 @@
5
5
  import type { ReactiveController, ReactiveControllerHost } from "lit";
6
6
  import {
7
7
  PlayerController,
8
+ createTranslator,
8
9
  type PlayerControllerConfig,
9
10
  type PlayerState,
10
11
  type StreamState,
@@ -13,6 +14,8 @@ import {
13
14
  type ContentEndpoints,
14
15
  type ContentMetadata,
15
16
  type ClassifiedError,
17
+ type TranslateFn,
18
+ type I18nConfig,
16
19
  } from "@livepeer-frameworks/player-core";
17
20
 
18
21
  export interface PlayerControllerHostState {
@@ -105,11 +108,20 @@ export class PlayerControllerHost implements ReactiveController {
105
108
 
106
109
  s: PlayerControllerHostState = { ...initialState };
107
110
 
111
+ /** Translation function, updated when locale changes. */
112
+ t: TranslateFn = createTranslator({ locale: "en" });
113
+
108
114
  constructor(host: HostElement) {
109
115
  this.host = host;
110
116
  host.addController(this);
111
117
  }
112
118
 
119
+ /** Rebuild the translator when locale or custom translations change. */
120
+ updateTranslator(config: I18nConfig) {
121
+ this.t = createTranslator(config);
122
+ this.host.requestUpdate();
123
+ }
124
+
113
125
  // ---- Configuration & Lifecycle ----
114
126
 
115
127
  configure(config: PlayerControllerConfig) {
@@ -434,6 +446,12 @@ export class PlayerControllerHost implements ReactiveController {
434
446
  async retry() {
435
447
  await this.controller?.retry();
436
448
  }
449
+ async tryNextSource() {
450
+ await this.controller?.retryWithFallback();
451
+ }
452
+ canAttemptFallback(): boolean {
453
+ return this.controller?.canAttemptFallback() ?? false;
454
+ }
437
455
  async reload() {
438
456
  await this.controller?.reload();
439
457
  }
package/src/index.ts CHANGED
@@ -30,6 +30,16 @@ export { FwSkipIndicator } from "./components/fw-skip-indicator.js";
30
30
  export { FwSpeedIndicator } from "./components/fw-speed-indicator.js";
31
31
  export { FwContextMenu } from "./components/fw-context-menu.js";
32
32
 
33
+ // Composable control elements
34
+ export {
35
+ FwPlayButton,
36
+ FwSkipButton,
37
+ FwVolumeControl as FwVolumeButton,
38
+ FwTimeDisplay,
39
+ FwLiveBadge,
40
+ FwFullscreenButton,
41
+ } from "./components/controls/index.js";
42
+
33
43
  // Controller
34
44
  export { PlayerControllerHost } from "./controllers/player-controller-host.js";
35
45
  export type { PlayerControllerHostState } from "./controllers/player-controller-host.js";