@livepeer-frameworks/player-svelte 0.1.2 → 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 (56) hide show
  1. package/LICENSE.md +24 -0
  2. package/README.md +6 -2
  3. package/dist/DevModePanel.svelte +53 -16
  4. package/dist/IdleScreen.svelte +36 -28
  5. package/dist/LoadingScreen.svelte +107 -67
  6. package/dist/LoadingScreen.svelte.bak +702 -0
  7. package/dist/Player.svelte +200 -53
  8. package/dist/Player.svelte.d.ts +6 -1
  9. package/dist/PlayerControls.svelte +114 -32
  10. package/dist/PlayerControls.svelte.d.ts +3 -0
  11. package/dist/StreamStateOverlay.svelte +33 -21
  12. package/dist/SubtitleRenderer.svelte +2 -2
  13. package/dist/controls/FullscreenButton.svelte +26 -0
  14. package/dist/controls/FullscreenButton.svelte.d.ts +3 -0
  15. package/dist/controls/LiveBadge.svelte +23 -0
  16. package/dist/controls/LiveBadge.svelte.d.ts +3 -0
  17. package/dist/controls/PlayButton.svelte +26 -0
  18. package/dist/controls/PlayButton.svelte.d.ts +3 -0
  19. package/dist/controls/SettingsMenu.svelte +208 -0
  20. package/dist/controls/SettingsMenu.svelte.d.ts +28 -0
  21. package/dist/controls/SkipButton.svelte +33 -0
  22. package/dist/controls/SkipButton.svelte.d.ts +7 -0
  23. package/dist/controls/TimeDisplay.svelte +18 -0
  24. package/dist/controls/TimeDisplay.svelte.d.ts +3 -0
  25. package/dist/controls/VolumeControl.svelte +26 -0
  26. package/dist/controls/VolumeControl.svelte.d.ts +3 -0
  27. package/dist/controls/index.d.ts +7 -0
  28. package/dist/controls/index.js +7 -0
  29. package/dist/index.d.ts +3 -2
  30. package/dist/index.js +3 -1
  31. package/dist/stores/i18n.d.ts +3 -0
  32. package/dist/stores/i18n.js +4 -0
  33. package/dist/stores/index.d.ts +1 -0
  34. package/dist/stores/index.js +2 -0
  35. package/dist/stores/playerController.d.ts +2 -0
  36. package/dist/stores/playerController.js +4 -0
  37. package/package.json +19 -19
  38. package/src/DevModePanel.svelte +53 -16
  39. package/src/IdleScreen.svelte +12 -4
  40. package/src/LoadingScreen.svelte +90 -50
  41. package/src/LoadingScreen.svelte.bak +702 -0
  42. package/src/Player.svelte +200 -53
  43. package/src/PlayerControls.svelte +114 -32
  44. package/src/StreamStateOverlay.svelte +17 -5
  45. package/src/controls/FullscreenButton.svelte +26 -0
  46. package/src/controls/LiveBadge.svelte +23 -0
  47. package/src/controls/PlayButton.svelte +26 -0
  48. package/src/controls/SettingsMenu.svelte +208 -0
  49. package/src/controls/SkipButton.svelte +33 -0
  50. package/src/controls/TimeDisplay.svelte +18 -0
  51. package/src/controls/VolumeControl.svelte +26 -0
  52. package/src/controls/index.ts +7 -0
  53. package/src/index.ts +10 -0
  54. package/src/stores/i18n.ts +7 -0
  55. package/src/stores/index.ts +3 -0
  56. package/src/stores/playerController.ts +7 -0
@@ -0,0 +1,33 @@
1
+ <script lang="ts">
2
+ import { getContext } from "svelte";
3
+ import type { Readable } from "svelte/store";
4
+ import { createTranslator, type TranslateFn } from "@livepeer-frameworks/player-core";
5
+ import { SkipBackIcon, SkipForwardIcon } from "../icons";
6
+
7
+ interface Props {
8
+ direction: "back" | "forward";
9
+ seconds?: number;
10
+ }
11
+
12
+ let { direction, seconds = 10 }: Props = $props();
13
+ let pc: any = getContext("fw-player-controller");
14
+ const translatorCtx = getContext<Readable<TranslateFn> | undefined>("fw-translator");
15
+ const fallbackT = createTranslator({ locale: "en" });
16
+ let t: TranslateFn = $derived(translatorCtx ? $translatorCtx : fallbackT);
17
+
18
+ let label = $derived(direction === "back" ? t("skipBackward") : t("skipForward"));
19
+ </script>
20
+
21
+ <button
22
+ type="button"
23
+ class="fw-btn-flush"
24
+ aria-label={label}
25
+ title={label}
26
+ onclick={() => pc?.seek((pc?.currentTime ?? 0) + (direction === "back" ? -seconds : seconds))}
27
+ >
28
+ {#if direction === "back"}
29
+ <SkipBackIcon size={16} />
30
+ {:else}
31
+ <SkipForwardIcon size={16} />
32
+ {/if}
33
+ </button>
@@ -0,0 +1,18 @@
1
+ <script lang="ts">
2
+ import { getContext } from "svelte";
3
+ import { formatTimeDisplay } from "@livepeer-frameworks/player-core";
4
+
5
+ let pc: any = getContext("fw-player-controller");
6
+
7
+ let timeText = $derived(
8
+ formatTimeDisplay({
9
+ isLive: pc?.isEffectivelyLive ?? false,
10
+ currentTime: pc?.currentTime ?? 0,
11
+ duration: pc?.duration ?? NaN,
12
+ liveEdge: pc?.duration ?? 0,
13
+ seekableStart: 0,
14
+ })
15
+ );
16
+ </script>
17
+
18
+ <span class="fw-time-display">{timeText}</span>
@@ -0,0 +1,26 @@
1
+ <script lang="ts">
2
+ import { getContext } from "svelte";
3
+ import type { Readable } from "svelte/store";
4
+ import { createTranslator, type TranslateFn } from "@livepeer-frameworks/player-core";
5
+ import { VolumeUpIcon, VolumeOffIcon } from "../icons";
6
+
7
+ let pc: any = getContext("fw-player-controller");
8
+ const translatorCtx = getContext<Readable<TranslateFn> | undefined>("fw-translator");
9
+ const fallbackT = createTranslator({ locale: "en" });
10
+ let t: TranslateFn = $derived(translatorCtx ? $translatorCtx : fallbackT);
11
+ </script>
12
+
13
+ <button
14
+ type="button"
15
+ class="fw-btn-flush"
16
+ aria-label={pc?.isMuted ? t("unmute") : t("mute")}
17
+ aria-pressed={pc?.isMuted ?? false}
18
+ title={pc?.isMuted ? t("unmute") : t("mute")}
19
+ onclick={() => pc?.toggleMute()}
20
+ >
21
+ {#if pc?.isMuted}
22
+ <VolumeOffIcon size={16} />
23
+ {:else}
24
+ <VolumeUpIcon size={16} />
25
+ {/if}
26
+ </button>
@@ -0,0 +1,7 @@
1
+ export { default as PlayButton } from "./PlayButton.svelte";
2
+ export { default as SkipButton } from "./SkipButton.svelte";
3
+ export { default as VolumeControl } from "./VolumeControl.svelte";
4
+ export { default as TimeDisplay } from "./TimeDisplay.svelte";
5
+ export { default as LiveBadge } from "./LiveBadge.svelte";
6
+ export { default as FullscreenButton } from "./FullscreenButton.svelte";
7
+ export { default as SettingsMenu } from "./SettingsMenu.svelte";
package/src/index.ts CHANGED
@@ -48,6 +48,9 @@ export { default as ThumbnailOverlay } from "./ThumbnailOverlay.svelte";
48
48
  export { default as StatsPanel } from "./StatsPanel.svelte";
49
49
  export { default as DevModePanel } from "./DevModePanel.svelte";
50
50
 
51
+ // Composable control components
52
+ export * from "./controls";
53
+
51
54
  // Icon components
52
55
  export * from "./icons";
53
56
 
@@ -65,6 +68,9 @@ export {
65
68
  PlayerController,
66
69
  PlayerManager,
67
70
  globalPlayerManager,
71
+ createTranslator,
72
+ getAvailableLocales,
73
+ getLocaleDisplayName,
68
74
  } from "@livepeer-frameworks/player-core";
69
75
  export type {
70
76
  PlayerControllerConfig,
@@ -88,4 +94,8 @@ export type {
88
94
  PlayerCombination,
89
95
  PlayerManagerOptions,
90
96
  PlayerManagerEvents,
97
+ FwLocale,
98
+ TranslateFn,
99
+ TranslationStrings,
100
+ I18nConfig,
91
101
  } from "@livepeer-frameworks/player-core";
@@ -0,0 +1,7 @@
1
+ import { writable, derived } from "svelte/store";
2
+ import { createTranslator, type FwLocale } from "@livepeer-frameworks/player-core";
3
+
4
+ export const localeStore = writable<FwLocale>("en");
5
+ export const translatorStore = derived(localeStore, ($locale) =>
6
+ createTranslator({ locale: $locale })
7
+ );
@@ -71,6 +71,9 @@ export {
71
71
  type PlayerSelectionStore,
72
72
  } from "./playerSelection";
73
73
 
74
+ // i18n (locale + translator)
75
+ export { localeStore, translatorStore } from "./i18n";
76
+
74
77
  // PlayerController store (central orchestrator)
75
78
  export {
76
79
  createPlayerControllerStore,
@@ -106,6 +106,8 @@ export interface PlayerControllerStore extends Readable<PlayerControllerState> {
106
106
  seek: (time: number) => void;
107
107
  /** Seek by delta */
108
108
  seekBy: (delta: number) => void;
109
+ /** Jump to live edge (for live streams) */
110
+ jumpToLive: () => void;
109
111
  /** Set volume */
110
112
  setVolume: (volume: number) => void;
111
113
  /** Toggle mute */
@@ -485,6 +487,10 @@ export function createPlayerControllerStore(
485
487
  controller?.seekBy(delta);
486
488
  }
487
489
 
490
+ function jumpToLive(): void {
491
+ controller?.jumpToLive();
492
+ }
493
+
488
494
  function setVolume(volume: number): void {
489
495
  controller?.setVolume(volume);
490
496
  }
@@ -579,6 +585,7 @@ export function createPlayerControllerStore(
579
585
  togglePlay,
580
586
  seek,
581
587
  seekBy,
588
+ jumpToLive,
582
589
  setVolume,
583
590
  toggleMute,
584
591
  toggleLoop,