@streamscloud/embeddable 11.0.0 → 12.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 (174) hide show
  1. package/dist/ads/ad-card/cmp.ad-card.svelte +4 -4
  2. package/dist/ads/ad-card/cmp.ad-card.svelte.d.ts +2 -0
  3. package/dist/content-player/cmp.content-player.svelte +63 -128
  4. package/dist/content-player/content-player-config.svelte.d.ts +3 -10
  5. package/dist/content-player/content-player-config.svelte.js +3 -21
  6. package/dist/content-player/content-player-settings.d.ts +7 -21
  7. package/dist/content-player/content-player-settings.js +0 -4
  8. package/dist/content-player/controls-and-attachments.svelte +39 -5
  9. package/dist/content-player/overview-panel.svelte +14 -6
  10. package/dist/content-player/overview-panel.svelte.d.ts +5 -1
  11. package/dist/content-player/ui-manager.svelte.d.ts +0 -2
  12. package/dist/content-player/ui-manager.svelte.js +0 -2
  13. package/dist/media-center/config/internal-media-center-config.d.ts +7 -3
  14. package/dist/media-center/config/internal-media-center-config.js +28 -24
  15. package/dist/media-center/config/operations.generated.d.ts +36 -23
  16. package/dist/media-center/config/operations.generated.js +53 -33
  17. package/dist/media-center/config/operations.graphql +34 -21
  18. package/dist/media-center/config/types.d.ts +13 -2
  19. package/dist/media-center/media-center/cmp.media-center.svelte +195 -149
  20. package/dist/media-center/media-center/cmp.media-center.svelte.d.ts +2 -19
  21. package/dist/media-center/media-center/discover/data-loading.d.ts +8 -0
  22. package/dist/media-center/media-center/discover/data-loading.js +35 -0
  23. package/dist/media-center/media-center/discover/discover-header-localization.d.ts +6 -0
  24. package/dist/media-center/media-center/discover/discover-header-localization.js +15 -0
  25. package/dist/media-center/media-center/discover/discover-header.svelte +214 -0
  26. package/dist/media-center/media-center/discover/discover-header.svelte.d.ts +9 -0
  27. package/dist/media-center/media-center/discover/discover-view-handler.svelte.d.ts +28 -0
  28. package/dist/media-center/media-center/discover/discover-view-handler.svelte.js +101 -0
  29. package/dist/media-center/media-center/discover/discover-view-localization.d.ts +6 -0
  30. package/dist/media-center/media-center/discover/discover-view-localization.js +15 -0
  31. package/dist/media-center/media-center/discover/discover-view.svelte +238 -0
  32. package/dist/media-center/media-center/discover/{discover-panel.svelte.d.ts → discover-view.svelte.d.ts} +4 -4
  33. package/dist/media-center/media-center/discover/index.d.ts +2 -2
  34. package/dist/media-center/media-center/discover/index.js +2 -2
  35. package/dist/media-center/media-center/discover/types.svelte.d.ts +20 -0
  36. package/dist/media-center/media-center/discover/types.svelte.js +20 -0
  37. package/dist/media-center/media-center/feed/feed-handler.svelte.d.ts +50 -0
  38. package/dist/media-center/media-center/feed/feed-handler.svelte.js +84 -0
  39. package/dist/media-center/media-center/feed/feed-providers-generator.d.ts +11 -0
  40. package/dist/media-center/media-center/feed/feed-providers-generator.js +79 -0
  41. package/dist/media-center/media-center/feed/index.d.ts +1 -0
  42. package/dist/media-center/media-center/feed/index.js +1 -0
  43. package/dist/media-center/media-center/feed/types.d.ts +12 -0
  44. package/dist/media-center/media-center/handlers/categories-handler.svelte.d.ts +29 -10
  45. package/dist/media-center/media-center/handlers/categories-handler.svelte.js +25 -7
  46. package/dist/media-center/media-center/handlers/index.d.ts +2 -1
  47. package/dist/media-center/media-center/handlers/index.js +1 -1
  48. package/dist/media-center/media-center/handlers/media-center-settings-handler.svelte.d.ts +19 -0
  49. package/dist/media-center/media-center/handlers/media-center-settings-handler.svelte.js +26 -0
  50. package/dist/media-center/media-center/header-footer/media-center-footer.svelte +4 -8
  51. package/dist/media-center/media-center/header-footer/media-center-header-localization.d.ts +1 -0
  52. package/dist/media-center/media-center/header-footer/media-center-header-localization.js +6 -0
  53. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte +25 -36
  54. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte.d.ts +2 -1
  55. package/dist/media-center/media-center/header-footer/media-center-header.svelte +14 -11
  56. package/dist/media-center/media-center/header-footer/media-center-header.svelte.d.ts +1 -2
  57. package/dist/media-center/media-center/media-center-context.svelte.d.ts +31 -13
  58. package/dist/media-center/media-center/media-center-context.svelte.js +71 -35
  59. package/dist/media-center/media-center/menu/menu-localization.d.ts +2 -11
  60. package/dist/media-center/media-center/menu/menu-localization.js +6 -45
  61. package/dist/media-center/media-center/menu/menu.svelte +94 -93
  62. package/dist/media-center/media-center/menu/menu.svelte.d.ts +1 -1
  63. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.d.ts +1 -1
  64. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.js +0 -3
  65. package/dist/media-center/media-center/moments/cmp.moments-circle.svelte +41 -0
  66. package/dist/media-center/media-center/moments/cmp.moments-circle.svelte.d.ts +7 -0
  67. package/dist/media-center/media-center/moments/index.d.ts +1 -0
  68. package/dist/media-center/media-center/moments/index.js +1 -0
  69. package/dist/media-center/media-center/streams-in-category/streams-in-category-panel-handler.svelte.d.ts +1 -1
  70. package/dist/media-center/media-center/streams-in-category/streams-in-category-panel-handler.svelte.js +1 -1
  71. package/dist/media-center/media-center/types.d.ts +44 -1
  72. package/dist/media-page/index.d.ts +121 -0
  73. package/dist/media-page/index.js +43 -0
  74. package/dist/posts/attachments/cmp.attachments.svelte +1 -0
  75. package/dist/posts/controls/cmp.controls.svelte +50 -13
  76. package/dist/posts/data-loaders/operations.generated.d.ts +4 -0
  77. package/dist/posts/data-loaders/operations.generated.js +6 -2
  78. package/dist/posts/model/types.d.ts +2 -0
  79. package/dist/posts/post-viewer/cmp.post-viewer.svelte +26 -18
  80. package/dist/posts/post-viewer/mapper.js +2 -0
  81. package/dist/posts/post-viewer/operations.generated.d.ts +2 -0
  82. package/dist/posts/post-viewer/operations.generated.js +3 -1
  83. package/dist/posts/post-viewer/operations.graphql +2 -0
  84. package/dist/posts/post-viewer/post-texts.svelte +3 -3
  85. package/dist/posts/posts-player/cmp.posts-player.svelte +20 -6
  86. package/dist/posts/posts-player/cmp.posts-player.svelte.d.ts +18 -2
  87. package/dist/posts/posts-player/index.d.ts +18 -3
  88. package/dist/posts/posts-player/index.js +42 -89
  89. package/dist/posts/posts-player/posts-player-proxy.svelte +19 -0
  90. package/dist/posts/posts-player/posts-player-proxy.svelte.d.ts +22 -0
  91. package/dist/posts/posts-player/posts-player-view.svelte +20 -34
  92. package/dist/posts/posts-player/posts-player-view.svelte.d.ts +2 -6
  93. package/dist/posts/posts-player/types.d.ts +19 -6
  94. package/dist/products/product-card/cmp.product-card.svelte +5 -5
  95. package/dist/products/product-card/cmp.product-card.svelte.d.ts +1 -1
  96. package/dist/short-videos/short-video-card/cmp.short-video-card.svelte +160 -19
  97. package/dist/short-videos/short-video-card/cmp.short-video-card.svelte.d.ts +2 -1
  98. package/dist/short-videos/short-video-card/localization.d.ts +5 -0
  99. package/dist/short-videos/short-video-card/localization.js +13 -0
  100. package/dist/short-videos/short-video-card/types.d.ts +4 -0
  101. package/dist/short-videos/short-videos-player/index.js +26 -33
  102. package/dist/streams/layout/element-views/cmp.stream-element.svelte +2 -2
  103. package/dist/streams/layout/element-views/cmp.text-ref-stream-element.svelte +7 -3
  104. package/dist/streams/layout/element-views/cmp.text-ref-stream-element.svelte.d.ts +2 -0
  105. package/dist/streams/layout/element-views/cmp.text-stream-element.svelte +7 -3
  106. package/dist/streams/layout/element-views/cmp.text-stream-element.svelte.d.ts +2 -0
  107. package/dist/streams/layout/element-views/price-element-view.svelte +2 -2
  108. package/dist/streams/layout/element-views/price-stream-element-localization.d.ts +1 -1
  109. package/dist/streams/layout/element-views/price-stream-element-localization.js +2 -2
  110. package/dist/streams/layout/models/mapper.js +2 -0
  111. package/dist/streams/streams-player/index.d.ts +21 -2
  112. package/dist/streams/streams-player/index.js +49 -24
  113. package/dist/streams/streams-player/stream-overview.svelte +1 -1
  114. package/dist/streams/streams-player/streams-player-buffer.svelte.d.ts +1 -3
  115. package/dist/streams/streams-player/streams-player-buffer.svelte.js +2 -2
  116. package/dist/streams/streams-player/streams-player-view.svelte +25 -21
  117. package/dist/streams/streams-player/streams-player-view.svelte.d.ts +1 -5
  118. package/dist/streams/streams-player/types.d.ts +18 -4
  119. package/dist/ui/line-clamp/cmp.line-clamp-auto.svelte +119 -0
  120. package/dist/ui/line-clamp/cmp.line-clamp-auto.svelte.d.ts +10 -0
  121. package/dist/ui/line-clamp/cmp.line-clamp.svelte +44 -72
  122. package/dist/ui/line-clamp/cmp.line-clamp.svelte.d.ts +3 -4
  123. package/dist/ui/line-clamp/index.d.ts +1 -0
  124. package/dist/ui/line-clamp/index.js +1 -0
  125. package/dist/ui/player/button/cmp.mobile-player-buttons-group.svelte +44 -0
  126. package/dist/ui/player/button/cmp.mobile-player-buttons-group.svelte.d.ts +7 -0
  127. package/dist/ui/player/button/cmp.player-button.svelte +0 -1
  128. package/dist/ui/player/button/cmp.player-buttons-group.svelte +15 -11
  129. package/dist/ui/player/button/cmp.player-buttons-group.svelte.d.ts +1 -1
  130. package/dist/ui/player/button/index.d.ts +1 -0
  131. package/dist/ui/player/button/index.js +1 -0
  132. package/dist/ui/player/button/types.d.ts +0 -2
  133. package/dist/ui/player/close-orchestrator/close-orchestrator.svelte.d.ts +18 -0
  134. package/dist/ui/player/close-orchestrator/close-orchestrator.svelte.js +58 -0
  135. package/dist/ui/player/close-orchestrator/index.d.ts +2 -0
  136. package/dist/ui/player/close-orchestrator/index.js +1 -0
  137. package/dist/ui/player/close-orchestrator/types.d.ts +9 -0
  138. package/dist/ui/player/close-orchestrator/types.js +1 -0
  139. package/dist/ui/player/colors/index.d.ts +1 -0
  140. package/dist/ui/player/colors/index.js +1 -0
  141. package/dist/ui/player/colors/player-colors.d.ts +11 -0
  142. package/dist/ui/player/colors/player-colors.js +1 -0
  143. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.d.ts +2 -6
  144. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.js +11 -11
  145. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.d.ts +2 -3
  146. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.js +5 -5
  147. package/dist/ui/player/providers/default-feed-player-buffer.svelte.d.ts +3 -4
  148. package/dist/ui/player/providers/default-feed-player-buffer.svelte.js +16 -9
  149. package/dist/ui/player/providers/service.d.ts +2 -0
  150. package/dist/ui/player/providers/service.js +13 -0
  151. package/dist/ui/player/providers/types.d.ts +1 -0
  152. package/dist/ui/with-background/cmp.with-background.svelte +86 -0
  153. package/dist/ui/with-background/cmp.with-background.svelte.d.ts +10 -0
  154. package/dist/ui/with-background/index.d.ts +1 -0
  155. package/dist/ui/with-background/index.js +1 -0
  156. package/package.json +5 -1
  157. package/dist/content-player/fade-mixins.scss +0 -12
  158. package/dist/content-player/header.svelte +0 -15
  159. package/dist/content-player/header.svelte.d.ts +0 -28
  160. package/dist/media-center/media-center/discover/discover-panel-handler.svelte.d.ts +0 -31
  161. package/dist/media-center/media-center/discover/discover-panel-handler.svelte.js +0 -94
  162. package/dist/media-center/media-center/discover/discover-panel-localization.d.ts +0 -19
  163. package/dist/media-center/media-center/discover/discover-panel-localization.js +0 -78
  164. package/dist/media-center/media-center/discover/discover-panel.svelte +0 -142
  165. package/dist/media-center/media-center/handlers/feed-handler.svelte.d.ts +0 -6
  166. package/dist/media-center/media-center/handlers/feed-handler.svelte.js +0 -12
  167. package/dist/media-center/media-center/providers/index.d.ts +0 -2
  168. package/dist/media-center/media-center/providers/index.js +0 -2
  169. package/dist/media-center/media-center/providers/post-player-provider-generator.d.ts +0 -8
  170. package/dist/media-center/media-center/providers/post-player-provider-generator.js +0 -32
  171. package/dist/media-center/media-center/providers/streams-player-provider-generator.d.ts +0 -8
  172. package/dist/media-center/media-center/providers/streams-player-provider-generator.js +0 -36
  173. package/dist/media-center/model/types.d.ts +0 -17
  174. /package/dist/media-center/{model → media-center/feed}/types.js +0 -0
@@ -1,9 +1,9 @@
1
1
  <script lang="ts">import { Icon } from '../../icon';
2
- let { scaleEffect = false, borderColor, backgroundColor, actions } = $props();
2
+ let { scaleEffect = false, activeColor, backgroundColor, actions } = $props();
3
3
  const styles = $derived.by(() => {
4
4
  const values = [];
5
- if (borderColor) {
6
- values.push(`--player-buttons-group--border-color: ${borderColor}`);
5
+ if (activeColor) {
6
+ values.push(`--player-buttons-group--active-color: ${activeColor}`);
7
7
  }
8
8
  if (backgroundColor) {
9
9
  values.push(`--player-buttons-group--background-color: ${backgroundColor}`);
@@ -15,7 +15,7 @@ const styles = $derived.by(() => {
15
15
  <div class="player-buttons-group" style={styles}>
16
16
  {#each actions as action (action.icon)}
17
17
  <button type="button" class="player-buttons-group__action" class:player-buttons-group__action--scale-effect={scaleEffect} onclick={action.callback}>
18
- <span class="player-buttons-group__action-icon" style={`--icon--stroke-width:${action.iconStrokeWidth}; --icon--stroke-color:${action.iconStrokeColor}`}>
18
+ <span class="player-buttons-group__action-icon">
19
19
  <Icon src={action.icon} color={action.iconColor} />
20
20
  </span>
21
21
  </button>
@@ -34,20 +34,18 @@ const styles = $derived.by(() => {
34
34
  }
35
35
  }
36
36
  .player-buttons-group {
37
- --_player-buttons-group--border-color: var(--player-buttons-group--border-color, rgb(from #000000 r g b / 95%));
37
+ --_player-buttons-group--active-color: var(--player-buttons-group--active-color, rgb(from #000000 r g b / 95%));
38
38
  --_player-buttons-group--background-color: var(
39
39
  --player-buttons-group--background-color,
40
- rgb(from var(--_player-buttons-group--border-color, #000000) r g b / 60%)
40
+ rgb(from var(--_player-buttons-group--active-color, #000000) r g b / 60%)
41
41
  );
42
42
  cursor: pointer;
43
43
  display: flex;
44
44
  flex-direction: column;
45
45
  justify-content: center;
46
- gap: 1.125rem;
47
- border: 1px solid var(--_player-buttons-group--border-color);
48
46
  border-radius: 1.25rem;
49
47
  background: var(--_player-buttons-group--background-color);
50
- padding: 1rem 0.625rem;
48
+ padding: 0.4375rem 0.0625rem;
51
49
  pointer-events: auto;
52
50
  /* Set 'container-type: inline-size;' to reference container*/
53
51
  }
@@ -56,11 +54,18 @@ const styles = $derived.by(() => {
56
54
  display: flex;
57
55
  justify-content: center;
58
56
  align-items: center;
57
+ padding: 0.5625rem;
58
+ border-radius: 1.25rem;
59
59
  --icon--color: #ffffff;
60
60
  --icon--size: 1.75rem;
61
+ transition: background-color 0.5s;
62
+ }
63
+ .player-buttons-group__action:hover {
64
+ background-color: var(--_player-buttons-group--active-color);
61
65
  }
62
66
  .player-buttons-group__action--scale-effect:hover {
63
67
  --_player-action--icon-scale: 1.2;
68
+ background-color: transparent;
64
69
  }
65
70
  .player-buttons-group__action-icon {
66
71
  display: block;
@@ -69,9 +74,8 @@ const styles = $derived.by(() => {
69
74
  }
70
75
  @container (width < 576px) {
71
76
  .player-buttons-group {
72
- gap: 1.125rem;
73
77
  border-radius: 0.9375rem;
74
- padding: 0.625rem 0.5rem;
78
+ padding: 0.25rem 0.0625rem;
75
79
  }
76
80
  .player-buttons-group__action {
77
81
  --icon--size: 1.5rem;
@@ -1,6 +1,6 @@
1
1
  import type { PlayerButtonsGroupAction } from './types';
2
2
  type Props = {
3
- borderColor: string | null;
3
+ activeColor: string | null;
4
4
  backgroundColor: string | null;
5
5
  actions: PlayerButtonsGroupAction[];
6
6
  scaleEffect?: boolean;
@@ -1,3 +1,4 @@
1
1
  export { default as PlayerButton } from './cmp.player-button.svelte';
2
2
  export { default as PlayerButtonsGroup } from './cmp.player-buttons-group.svelte';
3
+ export { default as MobilePlayerButtonsGroup } from './cmp.mobile-player-buttons-group.svelte';
3
4
  export type { PlayerButtonsGroupAction } from './types';
@@ -1,2 +1,3 @@
1
1
  export { default as PlayerButton } from './cmp.player-button.svelte';
2
2
  export { default as PlayerButtonsGroup } from './cmp.player-buttons-group.svelte';
3
+ export { default as MobilePlayerButtonsGroup } from './cmp.mobile-player-buttons-group.svelte';
@@ -2,7 +2,5 @@ import { IconColor } from '../../icon';
2
2
  export type PlayerButtonsGroupAction = {
3
3
  icon: string;
4
4
  iconColor?: IconColor;
5
- iconStrokeColor?: string;
6
- iconStrokeWidth?: string;
7
5
  callback: () => void;
8
6
  };
@@ -0,0 +1,18 @@
1
+ import type { ICloseOrchestrator } from './types';
2
+ export declare class CloseOrchestrator implements ICloseOrchestrator {
3
+ closingInProgress: boolean;
4
+ closed: boolean;
5
+ closeTriggerAttached: boolean;
6
+ private _canClose;
7
+ private _closeFn;
8
+ private _callbacks;
9
+ constructor(init: {
10
+ closeFn: () => void;
11
+ canClose: boolean;
12
+ });
13
+ get closeTriggerVisible(): boolean;
14
+ subscribe: (callback: () => void) => void;
15
+ unsubscribe: (callback: () => void) => void;
16
+ setCloseTriggerAttached: (attached: boolean) => void;
17
+ requestClose: () => Promise<void>;
18
+ }
@@ -0,0 +1,58 @@
1
+ export class CloseOrchestrator {
2
+ closingInProgress = $state(false);
3
+ closed = $state(false);
4
+ // Indicates whether the close trigger (button) is already attached to the DOM, to avoid duplicates
5
+ closeTriggerAttached = $state(false);
6
+ _canClose;
7
+ _closeFn;
8
+ _callbacks = new Set();
9
+ constructor(init) {
10
+ this._closeFn = init.closeFn;
11
+ this._canClose = init.canClose;
12
+ }
13
+ get closeTriggerVisible() {
14
+ return this._canClose;
15
+ }
16
+ subscribe = (callback) => {
17
+ this._callbacks.add(callback);
18
+ };
19
+ unsubscribe = (callback) => {
20
+ this._callbacks.delete(callback);
21
+ };
22
+ setCloseTriggerAttached = (attached) => {
23
+ this.closeTriggerAttached = attached;
24
+ };
25
+ requestClose = async () => {
26
+ // Check if closing is allowed
27
+ if (!this._canClose) {
28
+ return;
29
+ }
30
+ // Prevent multiple simultaneous close attempts
31
+ if (this.closingInProgress || this.closed) {
32
+ return;
33
+ }
34
+ this.closingInProgress = true;
35
+ try {
36
+ // Wait for all callbacks to complete
37
+ await Promise.all(Array.from(this._callbacks).map((cb) => cb()));
38
+ // Execute the close function
39
+ this._closeFn();
40
+ // Mark as successfully closed
41
+ this.closed = true;
42
+ }
43
+ catch (error) {
44
+ // Log error for debugging
45
+ console.error('Error during close operation:', error);
46
+ // Reset the flag to allow retry
47
+ this.closingInProgress = false;
48
+ // Re-throw error for upper-level handling
49
+ throw error;
50
+ }
51
+ finally {
52
+ // Clean up the closing flag on success
53
+ if (this.closed) {
54
+ this.closingInProgress = false;
55
+ }
56
+ }
57
+ };
58
+ }
@@ -0,0 +1,2 @@
1
+ export { CloseOrchestrator } from './close-orchestrator.svelte';
2
+ export type { ICloseOrchestrator } from './types';
@@ -0,0 +1 @@
1
+ export { CloseOrchestrator } from './close-orchestrator.svelte';
@@ -0,0 +1,9 @@
1
+ export type ICloseOrchestrator = {
2
+ readonly closingInProgress: boolean;
3
+ readonly closeTriggerVisible: boolean;
4
+ readonly closeTriggerAttached: boolean;
5
+ setCloseTriggerAttached: (attached: boolean) => void;
6
+ subscribe: (callback: () => void) => void;
7
+ unsubscribe: (callback: () => void) => void;
8
+ requestClose: () => void;
9
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export type { PlayerColors } from './player-colors';
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,11 @@
1
+ export type PlayerColors = {
2
+ brand: string | null;
3
+ button: string | null;
4
+ buttonInactive: string | null;
5
+ cardButton: string | null;
6
+ cardBackground: string | null;
7
+ playerBackground: string | null;
8
+ price: string | null;
9
+ salePrice: string | null;
10
+ sidebarBackground: string | null;
11
+ } | null;
@@ -0,0 +1 @@
1
+ export {};
@@ -2,14 +2,10 @@ import { PlayerChunk } from './player-chunk.svelte';
2
2
  import type { IChunksPlayerDataProvider, WithId } from '../types';
3
3
  export declare class PlayerChunksManager<TItem extends WithId, TChunk extends WithId> {
4
4
  private provider;
5
- private callbacks;
6
5
  private _activeChunkIndex;
7
6
  private _loadedChunks;
8
- private _isLoading;
9
- constructor(provider: IChunksPlayerDataProvider<TItem, TChunk>, callbacks: {
10
- onInitializationFinished: () => void;
11
- onEndReached: () => void;
12
- });
7
+ private _fetchDeferred;
8
+ constructor(provider: IChunksPlayerDataProvider<TItem, TChunk>);
13
9
  get activeChunk(): PlayerChunk<TItem, TChunk>;
14
10
  get loadedChunks(): PlayerChunk<TItem, TChunk>[];
15
11
  get flattenedChunkItems(): TItem[];
@@ -1,15 +1,14 @@
1
+ import { Deferred } from '../../../../core/deferred';
1
2
  import { PlayerChunk } from './player-chunk.svelte';
2
3
  const CHUNKS_BUFFER_SIZE = 5;
3
4
  const FIXED_START_INDEX = 0;
4
5
  export class PlayerChunksManager {
5
6
  provider;
6
- callbacks;
7
7
  _activeChunkIndex = $state(-1);
8
8
  _loadedChunks = $state.raw([]);
9
- _isLoading = $state(false);
10
- constructor(provider, callbacks) {
9
+ _fetchDeferred = $state.raw(null);
10
+ constructor(provider) {
11
11
  this.provider = provider;
12
- this.callbacks = callbacks;
13
12
  }
14
13
  get activeChunk() {
15
14
  return this._loadedChunks[this._activeChunkIndex] ?? null;
@@ -34,12 +33,10 @@ export class PlayerChunksManager {
34
33
  return itemsBeforeActiveChunk + this.activeChunk.activeChunkItem.indexWithinChunk;
35
34
  }
36
35
  initialize = async () => {
37
- const { onInitializationFinished, onEndReached } = this.callbacks;
38
36
  const handleInitialized = async () => {
39
37
  const startIndex = Math.min(FIXED_START_INDEX, this._loadedChunks.length - 1);
40
38
  const populateChunkResult = await this.populateChunkAtIndex(startIndex, (currentIndex) => currentIndex + 1);
41
39
  if (!populateChunkResult) {
42
- onEndReached();
43
40
  return;
44
41
  }
45
42
  this.setActiveChunkIndex(populateChunkResult.closestReadyChunkIndex);
@@ -48,7 +45,6 @@ export class PlayerChunksManager {
48
45
  this.provider.initialData.startItemIndex > 0) {
49
46
  this.activeChunk.setActiveItemIndex(this.provider.initialData.startItemIndex);
50
47
  }
51
- onInitializationFinished();
52
48
  };
53
49
  this._loadedChunks = this.provider.initialData.prefetchedChunks.map((chunk, chunkIndex) => new PlayerChunk({ chunk, chunkIndex, provider: { loadChunkItems: this.provider.loadChunkItems } }));
54
50
  const considerInitialized = this._loadedChunks.length !== 0;
@@ -84,10 +80,13 @@ export class PlayerChunksManager {
84
80
  };
85
81
  warmUp = async () => {
86
82
  // Early return if manager is sufficient or already loading
87
- if (this._loadedChunks.length >= this._activeChunkIndex + CHUNKS_BUFFER_SIZE || this._isLoading) {
83
+ if (this._fetchDeferred) {
84
+ return this._fetchDeferred.promise;
85
+ }
86
+ if (this._loadedChunks.length >= this._activeChunkIndex + CHUNKS_BUFFER_SIZE) {
88
87
  return;
89
88
  }
90
- this._isLoading = true;
89
+ this._fetchDeferred = new Deferred();
91
90
  try {
92
91
  const result = await this.provider.loadMoreChunks();
93
92
  this._loadedChunks = [
@@ -100,13 +99,14 @@ export class PlayerChunksManager {
100
99
  ];
101
100
  }
102
101
  finally {
103
- this._isLoading = false;
102
+ this._fetchDeferred.resolve();
103
+ this._fetchDeferred = null;
104
104
  }
105
105
  };
106
106
  reset = () => {
107
107
  this._activeChunkIndex = -1;
108
108
  this._loadedChunks = [];
109
- this._isLoading = false;
109
+ this._fetchDeferred = null;
110
110
  this.warmUp();
111
111
  };
112
112
  populateChunkAtIndex = async (index, nextIndexFn) => {
@@ -9,12 +9,11 @@ export declare class DefaultChunksPlayerBuffer<TItem extends WithId, TChunk exte
9
9
  readonly navigationDisabled: boolean;
10
10
  readonly animationDuration = 500;
11
11
  private _playerChunksManager;
12
- constructor(provider: IChunksPlayerDataProvider<TItem, TChunk>, on?: {
13
- preloaded?: (self: DefaultChunksPlayerBuffer<TItem, TChunk>) => void;
14
- });
12
+ constructor(provider: IChunksPlayerDataProvider<TItem, TChunk>);
15
13
  get activeChunk(): import("./chunks-player-buffer").PlayerChunk<TItem, TChunk>;
16
14
  setActiveChunkItemIndex: (index: number) => void;
17
15
  loadNext: () => Promise<void>;
18
16
  loadPrevious: () => Promise<void>;
19
17
  reset: () => void;
18
+ ensureWarmedUp: () => Promise<void>;
20
19
  }
@@ -10,14 +10,11 @@ export class DefaultChunksPlayerBuffer {
10
10
  navigationDisabled = $derived(!this.canLoadNext && !this.canLoadPrevious);
11
11
  animationDuration = 500;
12
12
  _playerChunksManager;
13
- constructor(provider, on) {
13
+ constructor(provider) {
14
14
  // Throttle navigation methods
15
15
  this.loadNext = Utils.throttle(this.loadNext, this.animationDuration);
16
16
  this.loadPrevious = Utils.throttle(this.loadPrevious, this.animationDuration);
17
- this._playerChunksManager = new PlayerChunksManager(provider, {
18
- onInitializationFinished: () => on?.preloaded?.(this),
19
- onEndReached: () => console.warn('end reached')
20
- });
17
+ this._playerChunksManager = new PlayerChunksManager(provider);
21
18
  this._playerChunksManager.initialize();
22
19
  }
23
20
  get activeChunk() {
@@ -44,4 +41,7 @@ export class DefaultChunksPlayerBuffer {
44
41
  reset = () => {
45
42
  this._playerChunksManager.reset();
46
43
  };
44
+ ensureWarmedUp = async () => {
45
+ await this._playerChunksManager.warmUp();
46
+ };
47
47
  }
@@ -15,13 +15,12 @@ export declare class DefaultFeedPlayerBuffer<T extends WithId> implements IFeedP
15
15
  private _currentIndex;
16
16
  private _loaded;
17
17
  private _loadMoreFn;
18
- private _isLoading;
19
- constructor(provider: IFeedPlayerDataProvider<T>, on?: {
20
- preloaded?: (self: DefaultFeedPlayerBuffer<T>) => void;
21
- });
18
+ private _fetchDeferred;
19
+ constructor(provider: IFeedPlayerDataProvider<T>);
22
20
  loadNext: () => Promise<void>;
23
21
  loadPrevious: () => Promise<void>;
24
22
  reset: () => void;
23
+ ensureWarmedUp: () => Promise<void>;
25
24
  private initializeBuffer;
26
25
  private warmUpBuffer;
27
26
  }
@@ -1,3 +1,4 @@
1
+ import { Deferred } from '../../../core/deferred';
1
2
  import { Utils } from '../../../core/utils';
2
3
  const BUFFER_SIZE = 5;
3
4
  export class DefaultFeedPlayerBuffer {
@@ -12,13 +13,13 @@ export class DefaultFeedPlayerBuffer {
12
13
  _currentIndex = $state(-1);
13
14
  _loaded = $state.raw([]);
14
15
  _loadMoreFn;
15
- _isLoading = $state(false);
16
- constructor(provider, on) {
16
+ _fetchDeferred = $state.raw(null);
17
+ constructor(provider) {
17
18
  this._loadMoreFn = provider.loadMore;
18
19
  // Throttle navigation methods
19
20
  this.loadNext = Utils.throttle(this.loadNext, this.animationDuration);
20
21
  this.loadPrevious = Utils.throttle(this.loadPrevious, this.animationDuration);
21
- this.initializeBuffer({ initialData: provider.initialData, onPreloaded: on?.preloaded });
22
+ this.initializeBuffer({ initialData: provider.initialData });
22
23
  }
23
24
  loadNext = async () => {
24
25
  if (!this.canLoadNext) {
@@ -36,11 +37,14 @@ export class DefaultFeedPlayerBuffer {
36
37
  reset = () => {
37
38
  this._loaded = [];
38
39
  this._currentIndex = -1;
39
- this._isLoading = false;
40
+ this._fetchDeferred = null;
40
41
  this.warmUpBuffer();
41
42
  };
43
+ ensureWarmedUp = async () => {
44
+ await this.warmUpBuffer();
45
+ };
42
46
  initializeBuffer = async (options) => {
43
- const { initialData, onPreloaded } = options;
47
+ const { initialData } = options;
44
48
  const handleInitialized = () => {
45
49
  const startIndex = initialData.startIndex >= 0 ? initialData.startIndex : 0;
46
50
  this._currentIndex = Math.min(startIndex, this._loaded.length - 1);
@@ -49,7 +53,6 @@ export class DefaultFeedPlayerBuffer {
49
53
  if (activeItem && hasCustomMediaIndex) {
50
54
  activeItem.mediaIndex = initialData.startMediaIndex;
51
55
  }
52
- onPreloaded?.(this);
53
56
  };
54
57
  this._loaded = initialData.prefetchedItems;
55
58
  const considerInitialized = this._loaded.length > 0;
@@ -63,16 +66,20 @@ export class DefaultFeedPlayerBuffer {
63
66
  };
64
67
  warmUpBuffer = async () => {
65
68
  // Early return if buffer is sufficient or already loading
66
- if (this._loaded.length >= this.currentIndex + BUFFER_SIZE || this._isLoading) {
69
+ if (this._fetchDeferred) {
70
+ return this._fetchDeferred.promise;
71
+ }
72
+ if (this._loaded.length >= this.currentIndex + BUFFER_SIZE) {
67
73
  return;
68
74
  }
69
- this._isLoading = true;
75
+ this._fetchDeferred = new Deferred();
70
76
  try {
71
77
  const result = await this._loadMoreFn();
72
78
  this._loaded = [...this._loaded, ...result];
73
79
  }
74
80
  finally {
75
- this._isLoading = false;
81
+ this._fetchDeferred.resolve();
82
+ this._fetchDeferred = null;
76
83
  }
77
84
  };
78
85
  }
@@ -0,0 +1,2 @@
1
+ import type { IPlayerBuffer, IPlayerDataProvider, WithId } from './types';
2
+ export declare const initBufferFromProvider: <T extends WithId>(provider: IPlayerDataProvider<T>) => IPlayerBuffer<T>;
@@ -0,0 +1,13 @@
1
+ import { Utils } from '../../../core/utils';
2
+ import { DefaultChunksPlayerBuffer } from './default-chunks-player-buffer.svelte';
3
+ import { DefaultFeedPlayerBuffer } from './default-feed-player-buffer.svelte';
4
+ export const initBufferFromProvider = (provider) => {
5
+ switch (provider.kind) {
6
+ case 'feed':
7
+ return new DefaultFeedPlayerBuffer(provider);
8
+ case 'chunks':
9
+ return new DefaultChunksPlayerBuffer(provider);
10
+ default:
11
+ Utils.assertUnreachable(provider);
12
+ }
13
+ };
@@ -33,6 +33,7 @@ export interface IPlayerBufferBase<T extends WithId> {
33
33
  loadNext: () => void;
34
34
  loadPrevious: () => void;
35
35
  reset: () => void;
36
+ ensureWarmedUp: () => Promise<void>;
36
37
  }
37
38
  type TExtended<T> = T & {
38
39
  mediaIndex?: number;
@@ -0,0 +1,86 @@
1
+ <script lang="ts">let { backgroundDisabled, backgroundImageUrl, backgroundColor, children } = $props();
2
+ const styles = $derived.by(() => {
3
+ const values = [];
4
+ if (backgroundImageUrl) {
5
+ values.push(`--with-background--background-image-url: url(${backgroundImageUrl})`);
6
+ }
7
+ if (backgroundColor) {
8
+ values.push(`--with-background--background: ${backgroundColor}`);
9
+ }
10
+ return values.join(';');
11
+ });
12
+ export {};
13
+ </script>
14
+
15
+ <svelte:head>
16
+ <meta name="theme-color" content="#242424" />
17
+ <meta name="color-scheme" content="dark" />
18
+ <meta name="mobile-web-app-capable" content="yes" />
19
+ <meta name="apple-mobile-web-app-capable" content="yes" />
20
+ <meta name="apple-mobile-web-app-status-bar-style" content="black" />
21
+
22
+ <style>
23
+ html,
24
+ body {
25
+ background-color: #242424;
26
+ color-scheme: dark;
27
+ }
28
+ </style>
29
+ </svelte:head>
30
+
31
+ <div
32
+ class="with-background"
33
+ class:with-background--background-enabled={!backgroundDisabled}
34
+ class:with-background--background-active={!backgroundDisabled && backgroundImageUrl && backgroundImageUrl !== 'not-applicable'}
35
+ class:with-background--background-loading={!backgroundDisabled && backgroundImageUrl !== 'not-applicable'}
36
+ style={styles}>
37
+ {@render children()}
38
+ </div>
39
+
40
+ <style>@keyframes fadeIn {
41
+ 0% {
42
+ opacity: 1;
43
+ }
44
+ 50% {
45
+ opacity: 0.4;
46
+ }
47
+ 100% {
48
+ opacity: 1;
49
+ }
50
+ }
51
+ .with-background {
52
+ --_with-background--background: var(--with-background--background);
53
+ --_with-background--background-image-url: var(--with-background--background-image-url);
54
+ width: 100%;
55
+ min-width: 100%;
56
+ max-width: 100%;
57
+ height: 100%;
58
+ min-height: 100%;
59
+ max-height: 100%;
60
+ container-type: inline-size;
61
+ display: flex;
62
+ flex-direction: column;
63
+ position: relative;
64
+ }
65
+ .with-background:before {
66
+ content: "";
67
+ position: absolute;
68
+ inset: 0;
69
+ backdrop-filter: blur(30px);
70
+ background-color: var(--_with-background--background);
71
+ display: none;
72
+ }
73
+ .with-background--background-enabled {
74
+ background-color: #7d7d7d;
75
+ }
76
+ .with-background--background-enabled:before {
77
+ display: block;
78
+ }
79
+ .with-background--background-active {
80
+ background-image: var(--_with-background--background-image-url);
81
+ background-size: cover;
82
+ background-blend-mode: multiply;
83
+ }
84
+ .with-background--background-loading {
85
+ background-color: transparent;
86
+ }</style>
@@ -0,0 +1,10 @@
1
+ import type { Snippet } from 'svelte';
2
+ type Props = {
3
+ backgroundDisabled: boolean;
4
+ backgroundImageUrl: string | null | 'not-applicable';
5
+ backgroundColor?: string | null;
6
+ children: Snippet;
7
+ };
8
+ declare const Cmp: import("svelte").Component<Props, {}, "">;
9
+ type Cmp = ReturnType<typeof Cmp>;
10
+ export default Cmp;
@@ -0,0 +1 @@
1
+ export { default as WithBackground } from './cmp.with-background.svelte';
@@ -0,0 +1 @@
1
+ export { default as WithBackground } from './cmp.with-background.svelte';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@streamscloud/embeddable",
3
- "version": "11.0.0",
3
+ "version": "12.1.0",
4
4
  "author": "StreamsCloud",
5
5
  "repository": {
6
6
  "type": "git",
@@ -37,6 +37,10 @@
37
37
  "types": "./dist/media-center/index.d.ts",
38
38
  "svelte": "./dist/media-center/index.js"
39
39
  },
40
+ "./media-page": {
41
+ "types": "./dist/media-page/index.d.ts",
42
+ "svelte": "./dist/media-page/index.js"
43
+ },
40
44
  "./posts": {
41
45
  "types": "./dist/posts/index.d.ts",
42
46
  "svelte": "./dist/posts/index.js"
@@ -1,12 +0,0 @@
1
- @mixin default-opacity {
2
- --content-player--elements-opacity: 1;
3
- }
4
-
5
- @mixin fade-opacity {
6
- --content-player--elements-opacity: 0;
7
- }
8
-
9
- @mixin handle-fade {
10
- opacity: var(--content-player--elements-opacity);
11
- transition: opacity 0.3s ease-in-out;
12
- }
@@ -1,15 +0,0 @@
1
- <script lang="ts">import { ContentPlayerConfig } from './content-player-config.svelte';
2
- import { onMount } from 'svelte';
3
- let { config } = $props();
4
- onMount(() => {
5
- var _a, _b;
6
- (_a = config.mediaCenterCallbacks) === null || _a === void 0 ? void 0 : _a.onPlayerInitialized({
7
- closePlayerFn: config.settings.enableCloseButton && ((_b = config.callbacks) === null || _b === void 0 ? void 0 : _b.close) ? config.callbacks.close : null,
8
- extraActionsForMobilePanel: []
9
- });
10
- });
11
- </script>
12
-
13
- {#if config.mediaCenterHeader}
14
- {@render config.mediaCenterHeader()}
15
- {/if}
@@ -1,28 +0,0 @@
1
- import { ContentPlayerConfig } from './content-player-config.svelte';
2
- declare class __sveltets_Render<T extends {
3
- id: string;
4
- }> {
5
- props(): {
6
- config: ContentPlayerConfig<T>;
7
- };
8
- events(): {};
9
- slots(): {};
10
- bindings(): "";
11
- exports(): {};
12
- }
13
- interface $$IsomorphicComponent {
14
- new <T extends {
15
- id: string;
16
- }>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
17
- $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
18
- } & ReturnType<__sveltets_Render<T>['exports']>;
19
- <T extends {
20
- id: string;
21
- }>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
22
- z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
23
- }
24
- declare const Header: $$IsomorphicComponent;
25
- type Header<T extends {
26
- id: string;
27
- }> = InstanceType<typeof Header<T>>;
28
- export default Header;