@streamscloud/embeddable 10.1.2 → 12.0.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 (204) hide show
  1. package/dist/ads/ad-card/cmp.ad-card.svelte +30 -10
  2. package/dist/ads/ad-card/cmp.ad-card.svelte.d.ts +7 -0
  3. package/dist/content-player/cmp.content-player.svelte +67 -142
  4. package/dist/content-player/content-player-config.svelte.d.ts +14 -10
  5. package/dist/content-player/content-player-config.svelte.js +5 -20
  6. package/dist/content-player/content-player-settings.d.ts +7 -9
  7. package/dist/content-player/content-player-settings.js +12 -4
  8. package/dist/content-player/controls-and-attachments.svelte +63 -58
  9. package/dist/content-player/overview-panel.svelte +32 -74
  10. package/dist/content-player/overview-panel.svelte.d.ts +34 -7
  11. package/dist/content-player/ui-manager.svelte.d.ts +2 -6
  12. package/dist/content-player/ui-manager.svelte.js +3 -7
  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 +27 -23
  15. package/dist/media-center/config/operations.generated.d.ts +23 -3
  16. package/dist/media-center/config/operations.generated.js +37 -6
  17. package/dist/media-center/config/operations.graphql +24 -4
  18. package/dist/media-center/config/types.d.ts +18 -2
  19. package/dist/media-center/media-center/cmp.media-center.svelte +213 -398
  20. package/dist/media-center/media-center/cmp.media-center.svelte.d.ts +2 -17
  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-view.svelte.d.ts +15 -0
  33. package/dist/media-center/media-center/discover/index.d.ts +2 -0
  34. package/dist/media-center/media-center/discover/index.js +2 -0
  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 +27 -0
  45. package/dist/media-center/media-center/handlers/categories-handler.svelte.js +39 -0
  46. package/dist/media-center/media-center/handlers/index.d.ts +2 -0
  47. package/dist/media-center/media-center/handlers/index.js +2 -0
  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/index.d.ts +3 -0
  51. package/dist/media-center/media-center/header-footer/index.js +3 -0
  52. package/dist/media-center/media-center/header-footer/media-center-footer.svelte +73 -0
  53. package/dist/media-center/media-center/header-footer/media-center-footer.svelte.d.ts +7 -0
  54. package/dist/media-center/media-center/header-footer/media-center-header-localization.d.ts +13 -0
  55. package/dist/media-center/media-center/header-footer/media-center-header-localization.js +46 -0
  56. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte +80 -0
  57. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte.d.ts +12 -0
  58. package/dist/media-center/media-center/header-footer/media-center-header.svelte +313 -0
  59. package/dist/media-center/media-center/header-footer/media-center-header.svelte.d.ts +12 -0
  60. package/dist/media-center/media-center/media-center-context.svelte.d.ts +68 -0
  61. package/dist/media-center/media-center/media-center-context.svelte.js +134 -0
  62. package/dist/media-center/media-center/{category-following-wrapper.svelte → menu/category-following-wrapper.svelte} +3 -2
  63. package/dist/media-center/media-center/{category-following-wrapper.svelte.d.ts → menu/category-following-wrapper.svelte.d.ts} +2 -2
  64. package/dist/media-center/media-center/menu/index.d.ts +2 -0
  65. package/dist/media-center/media-center/menu/index.js +2 -0
  66. package/dist/media-center/media-center/menu/menu-localization.d.ts +10 -0
  67. package/dist/media-center/media-center/menu/menu-localization.js +39 -0
  68. package/dist/media-center/media-center/menu/menu.svelte +353 -0
  69. package/dist/media-center/media-center/menu/menu.svelte.d.ts +14 -0
  70. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.d.ts +10 -0
  71. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.js +23 -0
  72. package/dist/media-center/media-center/moments/cmp.moments-circle.svelte +41 -0
  73. package/dist/media-center/media-center/moments/cmp.moments-circle.svelte.d.ts +7 -0
  74. package/dist/media-center/media-center/moments/index.d.ts +1 -0
  75. package/dist/media-center/media-center/moments/index.js +1 -0
  76. package/dist/media-center/media-center/streams-in-category/index.d.ts +2 -0
  77. package/dist/media-center/media-center/streams-in-category/index.js +2 -0
  78. package/dist/media-center/media-center/{streams-in-category-panel-handler.svelte.d.ts → streams-in-category/streams-in-category-panel-handler.svelte.d.ts} +5 -5
  79. package/dist/media-center/media-center/{streams-in-category-panel-handler.svelte.js → streams-in-category/streams-in-category-panel-handler.svelte.js} +5 -5
  80. package/dist/media-center/media-center/{streams-in-category-panel.svelte → streams-in-category/streams-in-category-panel.svelte} +1 -1
  81. package/dist/media-center/media-center/{streams-in-category-panel.svelte.d.ts → streams-in-category/streams-in-category-panel.svelte.d.ts} +1 -1
  82. package/dist/media-center/media-center/types.d.ts +44 -1
  83. package/dist/media-page/index.d.ts +121 -0
  84. package/dist/media-page/index.js +43 -0
  85. package/dist/posts/attachments/cmp.attachments.svelte +6 -3
  86. package/dist/posts/attachments/cmp.attachments.svelte.d.ts +6 -0
  87. package/dist/posts/controls/cmp.controls.svelte +51 -14
  88. package/dist/posts/controls/cmp.controls.svelte.d.ts +2 -0
  89. package/dist/posts/data-loaders/operations.generated.d.ts +4 -0
  90. package/dist/posts/data-loaders/operations.generated.js +6 -2
  91. package/dist/posts/model/types.d.ts +2 -0
  92. package/dist/posts/post-viewer/cmp.post-viewer.svelte +29 -19
  93. package/dist/posts/post-viewer/cmp.post-viewer.svelte.d.ts +4 -0
  94. package/dist/posts/post-viewer/mapper.js +2 -0
  95. package/dist/posts/post-viewer/operations.generated.d.ts +2 -0
  96. package/dist/posts/post-viewer/operations.generated.js +3 -1
  97. package/dist/posts/post-viewer/operations.graphql +2 -0
  98. package/dist/posts/post-viewer/post-texts.svelte +3 -3
  99. package/dist/posts/posts-player/cmp.posts-player.svelte +20 -6
  100. package/dist/posts/posts-player/cmp.posts-player.svelte.d.ts +18 -2
  101. package/dist/posts/posts-player/index.d.ts +18 -3
  102. package/dist/posts/posts-player/index.js +42 -89
  103. package/dist/posts/posts-player/posts-player-proxy.svelte +19 -0
  104. package/dist/posts/posts-player/posts-player-proxy.svelte.d.ts +22 -0
  105. package/dist/posts/posts-player/posts-player-view.svelte +20 -34
  106. package/dist/posts/posts-player/posts-player-view.svelte.d.ts +2 -6
  107. package/dist/posts/posts-player/types.d.ts +19 -6
  108. package/dist/products/product-card/cmp.product-card.svelte +39 -15
  109. package/dist/products/product-card/cmp.product-card.svelte.d.ts +6 -1
  110. package/dist/short-videos/short-video-card/cmp.short-video-card.svelte +160 -19
  111. package/dist/short-videos/short-video-card/cmp.short-video-card.svelte.d.ts +2 -1
  112. package/dist/short-videos/short-video-card/localization.d.ts +5 -0
  113. package/dist/short-videos/short-video-card/localization.js +13 -0
  114. package/dist/short-videos/short-video-card/types.d.ts +4 -0
  115. package/dist/short-videos/short-videos-player/index.js +26 -33
  116. package/dist/streams/data-loaders/mapper.js +0 -5
  117. package/dist/streams/data-loaders/operations.generated.d.ts +0 -12
  118. package/dist/streams/data-loaders/operations.generated.js +0 -26
  119. package/dist/streams/data-loaders/operations.graphql +0 -6
  120. package/dist/streams/layout/element-views/cmp.short-video-stream-element.svelte +2 -1
  121. package/dist/streams/layout/element-views/cmp.short-video-stream-element.svelte.d.ts +4 -0
  122. package/dist/streams/layout/element-views/cmp.stream-element.svelte +2 -2
  123. package/dist/streams/layout/element-views/cmp.text-ref-stream-element.svelte +7 -3
  124. package/dist/streams/layout/element-views/cmp.text-ref-stream-element.svelte.d.ts +2 -0
  125. package/dist/streams/layout/element-views/cmp.text-stream-element.svelte +7 -3
  126. package/dist/streams/layout/element-views/cmp.text-stream-element.svelte.d.ts +2 -0
  127. package/dist/streams/layout/element-views/price-element-view.svelte +2 -2
  128. package/dist/streams/layout/element-views/price-stream-element-localization.d.ts +1 -1
  129. package/dist/streams/layout/element-views/price-stream-element-localization.js +2 -2
  130. package/dist/streams/layout/models/mapper.js +2 -0
  131. package/dist/streams/stream-card/cmp.stream-card.svelte +5 -5
  132. package/dist/streams/streams-player/index.d.ts +21 -2
  133. package/dist/streams/streams-player/index.js +49 -24
  134. package/dist/streams/streams-player/stream-overview.svelte +6 -96
  135. package/dist/streams/streams-player/stream-overview.svelte.d.ts +0 -4
  136. package/dist/streams/streams-player/stream-player-localization.d.ts +0 -1
  137. package/dist/streams/streams-player/stream-player-localization.js +0 -6
  138. package/dist/streams/streams-player/streams-player-buffer.svelte.d.ts +1 -3
  139. package/dist/streams/streams-player/streams-player-buffer.svelte.js +2 -2
  140. package/dist/streams/streams-player/streams-player-view.svelte +25 -23
  141. package/dist/streams/streams-player/streams-player-view.svelte.d.ts +1 -5
  142. package/dist/streams/streams-player/types.d.ts +18 -8
  143. package/dist/ui/icon/cmp.icon.svelte +3 -2
  144. package/dist/ui/line-clamp/cmp.line-clamp-auto.svelte +119 -0
  145. package/dist/ui/line-clamp/cmp.line-clamp-auto.svelte.d.ts +10 -0
  146. package/dist/ui/line-clamp/cmp.line-clamp.svelte +44 -72
  147. package/dist/ui/line-clamp/cmp.line-clamp.svelte.d.ts +3 -4
  148. package/dist/ui/line-clamp/index.d.ts +1 -0
  149. package/dist/ui/line-clamp/index.js +1 -0
  150. package/dist/ui/player/button/cmp.mobile-player-buttons-group.svelte +44 -0
  151. package/dist/ui/player/button/cmp.mobile-player-buttons-group.svelte.d.ts +7 -0
  152. package/dist/ui/player/button/cmp.player-button.svelte +16 -5
  153. package/dist/ui/player/button/cmp.player-button.svelte.d.ts +3 -0
  154. package/dist/ui/player/button/cmp.player-buttons-group.svelte +27 -8
  155. package/dist/ui/player/button/cmp.player-buttons-group.svelte.d.ts +2 -0
  156. package/dist/ui/player/button/index.d.ts +1 -0
  157. package/dist/ui/player/button/index.js +1 -0
  158. package/dist/ui/player/close-orchestrator/close-orchestrator.svelte.d.ts +18 -0
  159. package/dist/ui/player/close-orchestrator/close-orchestrator.svelte.js +58 -0
  160. package/dist/ui/player/close-orchestrator/index.d.ts +2 -0
  161. package/dist/ui/player/close-orchestrator/index.js +1 -0
  162. package/dist/ui/player/close-orchestrator/types.d.ts +9 -0
  163. package/dist/ui/player/close-orchestrator/types.js +1 -0
  164. package/dist/ui/player/colors/index.d.ts +1 -0
  165. package/dist/ui/player/colors/index.js +1 -0
  166. package/dist/ui/player/colors/player-colors.d.ts +11 -0
  167. package/dist/ui/player/colors/player-colors.js +1 -0
  168. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.d.ts +2 -6
  169. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.js +11 -11
  170. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.d.ts +2 -3
  171. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.js +5 -5
  172. package/dist/ui/player/providers/default-feed-player-buffer.svelte.d.ts +3 -4
  173. package/dist/ui/player/providers/default-feed-player-buffer.svelte.js +16 -9
  174. package/dist/ui/player/providers/service.d.ts +2 -0
  175. package/dist/ui/player/providers/service.js +13 -0
  176. package/dist/ui/player/providers/types.d.ts +1 -0
  177. package/dist/ui/with-background/cmp.with-background.svelte +86 -0
  178. package/dist/ui/with-background/cmp.with-background.svelte.d.ts +10 -0
  179. package/dist/ui/with-background/index.d.ts +1 -0
  180. package/dist/ui/with-background/index.js +1 -0
  181. package/package.json +5 -1
  182. package/dist/content-player/content-player-localization.d.ts +0 -6
  183. package/dist/content-player/content-player-localization.js +0 -15
  184. package/dist/content-player/fade-mixins.scss +0 -12
  185. package/dist/content-player/header.svelte +0 -137
  186. package/dist/content-player/header.svelte.d.ts +0 -32
  187. package/dist/media-center/media-center/desktop-categories-selector.svelte +0 -132
  188. package/dist/media-center/media-center/desktop-categories-selector.svelte.d.ts +0 -12
  189. package/dist/media-center/media-center/discover-panel-handler.svelte.d.ts +0 -32
  190. package/dist/media-center/media-center/discover-panel-handler.svelte.js +0 -101
  191. package/dist/media-center/media-center/discover-panel.svelte +0 -133
  192. package/dist/media-center/media-center/discover-panel.svelte.d.ts +0 -15
  193. package/dist/media-center/media-center/media-center-handler.svelte.d.ts +0 -28
  194. package/dist/media-center/media-center/media-center-handler.svelte.js +0 -73
  195. package/dist/media-center/media-center/media-center-localization.d.ts +0 -10
  196. package/dist/media-center/media-center/media-center-localization.js +0 -39
  197. package/dist/media-center/media-center/mobile-controls-panel.svelte +0 -268
  198. package/dist/media-center/media-center/mobile-controls-panel.svelte.d.ts +0 -20
  199. package/dist/media-center/media-center/post-player-provider-generator.d.ts +0 -8
  200. package/dist/media-center/media-center/post-player-provider-generator.js +0 -32
  201. package/dist/media-center/media-center/streams-player-provider-generator.d.ts +0 -8
  202. package/dist/media-center/media-center/streams-player-provider-generator.js +0 -36
  203. package/dist/media-center/model/types.d.ts +0 -16
  204. /package/dist/media-center/{model → media-center/feed}/types.js +0 -0
@@ -0,0 +1,2 @@
1
+ export { default as StreamsInCategoryPanel } from './streams-in-category-panel.svelte';
2
+ export { StreamsInCategoryPanelHandler } from './streams-in-category-panel-handler.svelte';
@@ -0,0 +1,2 @@
1
+ export { default as StreamsInCategoryPanel } from './streams-in-category-panel.svelte';
2
+ export { StreamsInCategoryPanelHandler } from './streams-in-category-panel-handler.svelte';
@@ -1,6 +1,6 @@
1
- import type { IMediaCenterConfig } from '../../short-videos/short-videos-player';
2
- import type { StreamPlayerModel } from '../../streams/streams-player';
3
- import type { MediaCenterCategoryData } from './types';
1
+ import type { IMediaCenterConfig } from '../../../short-videos/short-videos-player';
2
+ import type { StreamPlayerModel } from '../../../streams/streams-player';
3
+ import type { MediaCenterCategoryData } from '../types';
4
4
  export declare class StreamsInCategoryPanelHandler {
5
5
  private readonly config;
6
6
  private _activated;
@@ -8,13 +8,13 @@ export declare class StreamsInCategoryPanelHandler {
8
8
  private _categoryId;
9
9
  private _categoryName;
10
10
  private _streams;
11
- constructor(config: IMediaCenterConfig | null);
11
+ constructor(config: IMediaCenterConfig);
12
12
  get streamSectionItems(): StreamPlayerModel[];
13
13
  get categoryId(): string;
14
14
  get categoryName(): string;
15
15
  get activated(): boolean;
16
16
  get active(): boolean;
17
17
  get loading(): boolean;
18
- activate: (category: MediaCenterCategoryData) => Promise<void>;
18
+ activate: (categoryData: MediaCenterCategoryData | null) => Promise<void>;
19
19
  deactivate: () => void;
20
20
  }
@@ -26,16 +26,16 @@ export class StreamsInCategoryPanelHandler {
26
26
  get loading() {
27
27
  return this._activated && this._state === 'loading';
28
28
  }
29
- activate = async (category) => {
30
- if (!this.config) {
29
+ activate = async (categoryData) => {
30
+ if (!categoryData || this.categoryId === categoryData.id) {
31
31
  return;
32
32
  }
33
33
  this._activated = true;
34
34
  this._state = 'loading';
35
35
  try {
36
- const streamsResponse = await this.config.streamPlayer.getStreamsCursor({ filter: { categoryId: category.id }, limit: 5 });
37
- this._categoryName = category.parentName ? `${category.parentName} - ${category.name}` : category.name;
38
- this._categoryId = category.id;
36
+ const streamsResponse = await this.config.streamPlayer.getStreamsCursor({ filter: { categoryId: categoryData.id }, limit: 5 });
37
+ this._categoryName = categoryData.parentName ? `${categoryData.parentName} - ${categoryData.name}` : categoryData.name;
38
+ this._categoryId = categoryData.id;
39
39
  this._streams = streamsResponse.items;
40
40
  }
41
41
  finally {
@@ -1,4 +1,4 @@
1
- <script lang="ts">import { StreamCard } from '../../streams/stream-card';
1
+ <script lang="ts">import { StreamCard } from '../../../streams/stream-card';
2
2
  import { StreamsInCategoryPanelHandler } from './streams-in-category-panel-handler.svelte';
3
3
  let { handler, on } = $props();
4
4
  </script>
@@ -1,4 +1,4 @@
1
- import type { StreamPlayerModel } from '../../streams/streams-player';
1
+ import type { StreamPlayerModel } from '../../../streams/streams-player/types';
2
2
  import { StreamsInCategoryPanelHandler } from './streams-in-category-panel-handler.svelte';
3
3
  type Props = {
4
4
  handler: StreamsInCategoryPanelHandler;
@@ -1,7 +1,50 @@
1
- export type MediaCenterMode = 'stream' | 'posts';
1
+ import type { Locale } from '../../core/locale';
2
+ import type { IMediaCenterConfig } from '../config/types';
3
+ import type { PostPlayerModel, PostsPlayerProps } from '../../posts/posts-player/types';
4
+ import type { IStreamsPlayerDataProvider, StreamAmplificationParameters, StreamsPlayerProps } from '../../streams/streams-player/types';
5
+ import type { ICloseOrchestrator } from '../../ui/player/close-orchestrator';
6
+ import type { IPlayerDataProvider } from '../../ui/player/providers';
7
+ export type MediaCenterMode = 'feed' | 'discover';
2
8
  export type MediaCenterCategoryData = {
3
9
  id: string;
4
10
  name: string;
5
11
  parentId: string | undefined;
6
12
  parentName: string | undefined;
7
13
  };
14
+ export type MediaCenterProps = {
15
+ config: IMediaCenterConfig;
16
+ settings?: MediaCenterSettings;
17
+ modeProps: MediaCenterModeProps;
18
+ closeOrchestrator: ICloseOrchestrator;
19
+ };
20
+ export type MediaCenterModeProps = {
21
+ mode: 'posts';
22
+ props: {
23
+ dataProvider: IPlayerDataProvider<PostPlayerModel>;
24
+ onPostActivated?: (id: string) => void;
25
+ };
26
+ } | {
27
+ mode: 'streams';
28
+ props: {
29
+ dataProvider: IStreamsPlayerDataProvider;
30
+ amplificationParameters?: StreamAmplificationParameters;
31
+ onStreamActivated?: (data: {
32
+ title: string;
33
+ image: string | null;
34
+ }) => void;
35
+ };
36
+ } | {
37
+ mode: 'discover';
38
+ };
39
+ export type PlayerProps = {
40
+ type: 'posts';
41
+ props: PostsPlayerProps;
42
+ } | {
43
+ type: 'streams';
44
+ props: StreamsPlayerProps;
45
+ };
46
+ export type MediaCenterSettings = {
47
+ locale?: Locale;
48
+ showStreamsCloudWatermark?: boolean;
49
+ disableBackground?: boolean;
50
+ };
@@ -0,0 +1,121 @@
1
+ import type { Locale } from '../core/locale';
2
+ import { type IMediaCenterConfig } from '../media-center/config/types';
3
+ export type { IMediaCenterConfig };
4
+ export { mapToPostPlayerModel } from '../posts/data-loaders/mapper';
5
+ /**
6
+ * Opens the media page modal.
7
+ *
8
+ * Two overloads (mutually exclusive; enforced by TypeScript):
9
+ * - Config mode: openMediaPageModal({ mediaCenterConfig, viewerSettings?, on? })
10
+ * - Internal config mode: openMediaPageModal({ id, initiator, graphqlOrigin?, viewerSettings?, on? })
11
+ *
12
+ * @param init Configuration options.
13
+ *
14
+ * Config mode (overload 1)
15
+ * @param {IMediaCenterConfig} init.mediaCenterConfig
16
+ * Configuration for the media center.
17
+ *
18
+ * Internal config mode (overload 2)
19
+ * @param {string} init.id
20
+ * Media page ID, used to construct an internal media-center config.
21
+ * @param {string} init.initiator
22
+ * Initiator identifier (used for tracking/analytics and GraphQL).
23
+ * @param {string} [init.graphqlOrigin]
24
+ * Optional GraphQL origin (base URL). If omitted, the default origin is determined internally.
25
+ *
26
+ * Common (optional)
27
+ * @param {MediaPageViewerSettings} [init.viewerSettings]
28
+ * Viewer UI and behavior settings.
29
+ *
30
+ * Fields of MediaPageViewerSettings:
31
+ * - {boolean} [disableBackground]
32
+ * If true , hides the viewer background image.
33
+ * - {Locale} [locale='en']
34
+ * Localization for the viewer UI. Supported values: 'en' | 'no'.
35
+ * If omitted, the default locale 'en' is used.
36
+ * - {boolean} [showStreamsCloudWatermark]
37
+ * If true, shows the StreamsCloud watermark.
38
+ * - {boolean} [hideCloseButton]
39
+ * If true, hides the close button.
40
+ *
41
+ * Events
42
+ * @param {{ closed?: () => void }} [init.on]
43
+ * Optional event handlers.
44
+ * @param {() => void} [init.on.closed]
45
+ * Called after the modal is fully closed (after unmount and removal from the DOM).
46
+ *
47
+ * Notes
48
+ * - If neither mediaCenterConfig nor id is specified, a warning is shown and the modal is not opened.
49
+ *
50
+ * @returns {void}
51
+ *
52
+ * @example <caption>Config mode</caption>
53
+ * ```ts
54
+ * import {
55
+ * openMediaPageModal,
56
+ * type IMediaCenterConfig,
57
+ * } from '@streamscloud/embeddable/media-page';
58
+ *
59
+ * const mediaCenterConfig: IMediaCenterConfig = {
60
+ * // ...your media center configuration
61
+ * };
62
+ *
63
+ * openMediaPageModal({
64
+ * mediaCenterConfig,
65
+ * viewerSettings: {
66
+ * // Locale defaults to 'en'; set 'no' to switch to Norwegian:
67
+ * locale: 'no',
68
+ * disableBackground: false,
69
+ * hideCloseButton: false,
70
+ * showStreamsCloudWatermark: true,
71
+ * },
72
+ * on: {
73
+ * closed: () => console.log('Media page modal closed'),
74
+ * },
75
+ * });
76
+ * ```
77
+ *
78
+
79
+
80
+ * @example <caption>Internal config mode</caption>
81
+ * ```ts
82
+ * import { openMediaPageModal } from '@streamscloud/embeddable/media-page';
83
+ *
84
+ * openMediaPageModal({
85
+ * id: 'media-page-123',
86
+ * initiator: 'marketing-campaign',
87
+ * graphqlOrigin: 'https://api.example.com',
88
+ * viewerSettings: {
89
+ * locale: 'en',
90
+ * disableBackground: true,
91
+ * hideCloseButton: false,
92
+ * showStreamsCloudWatermark: false,
93
+ * },
94
+ * on: {
95
+ * closed: () => console.log('Media page modal closed'),
96
+ * },
97
+ * });
98
+ * ```
99
+ */
100
+ export declare function openMediaPageModal(init: {
101
+ mediaCenterConfig: IMediaCenterConfig;
102
+ viewerSettings?: MediaPageViewerSettings;
103
+ on?: {
104
+ closed?: () => void;
105
+ };
106
+ }): void;
107
+ export declare function openMediaPageModal(init: {
108
+ id: string;
109
+ initiator: string;
110
+ graphqlOrigin?: string;
111
+ viewerSettings?: MediaPageViewerSettings;
112
+ on?: {
113
+ closed?: () => void;
114
+ };
115
+ }): void;
116
+ export type MediaPageViewerSettings = {
117
+ disableBackground?: boolean;
118
+ locale?: Locale;
119
+ showStreamsCloudWatermark?: boolean;
120
+ hideCloseButton?: boolean;
121
+ };
@@ -0,0 +1,43 @@
1
+ import { toastrWarning } from '../core/toastr';
2
+ import { InternalMediaCenterConfig } from '../media-center/config/internal-media-center-config';
3
+ import {} from '../media-center/config/types';
4
+ import { MediaCenter } from '../media-center/media-center';
5
+ import { CloseOrchestrator } from '../ui/player/close-orchestrator';
6
+ import { ModalShadowHost } from '../ui/shadow-dom';
7
+ import { mount, unmount } from 'svelte';
8
+ export { mapToPostPlayerModel } from '../posts/data-loaders/mapper';
9
+ export function openMediaPageModal(init) {
10
+ const { id, graphqlOrigin, initiator, viewerSettings, on } = init;
11
+ let mediaCenterConfig = init.mediaCenterConfig;
12
+ if (!mediaCenterConfig && id) {
13
+ mediaCenterConfig = new InternalMediaCenterConfig({ mediaPageId: id, graphqlOrigin, initiator });
14
+ }
15
+ if (!mediaCenterConfig) {
16
+ toastrWarning('Config is not specified.');
17
+ return;
18
+ }
19
+ const shadowHost = new ModalShadowHost();
20
+ let mounted = null;
21
+ const makeCloseOrchestrator = () => new CloseOrchestrator({
22
+ closeFn: async () => {
23
+ await unmount(mounted);
24
+ shadowHost.remove();
25
+ if (on?.closed) {
26
+ on.closed();
27
+ }
28
+ },
29
+ canClose: !viewerSettings?.hideCloseButton
30
+ });
31
+ mounted = mount(MediaCenter, {
32
+ target: shadowHost.shadowRoot,
33
+ props: {
34
+ config: mediaCenterConfig,
35
+ settings: viewerSettings,
36
+ modeProps: {
37
+ mode: 'discover'
38
+ },
39
+ closeOrchestrator: makeCloseOrchestrator()
40
+ }
41
+ });
42
+ shadowHost.attachToBody();
43
+ }
@@ -2,7 +2,7 @@
2
2
  import { AdCard } from '../../ads/ad-card';
3
3
  import { PostModel } from '../model';
4
4
  import { ProductCard } from '../../products/product-card';
5
- let { model, trackingParams: externalTrackingParams, locale = 'en', on } = $props();
5
+ let { model, colors, trackingParams: externalTrackingParams, locale = 'en', on } = $props();
6
6
  const trackingParams = $derived.by(() => {
7
7
  if (externalTrackingParams || externalTrackingParams === false) {
8
8
  return externalTrackingParams;
@@ -15,12 +15,14 @@ const trackingParams = $derived.by(() => {
15
15
  </script>
16
16
 
17
17
  {#if model.attachments}
18
- <div class="post-attachments">
18
+ <div class="post-attachments" data-theme="dark">
19
19
  {#if model.attachments.ads.length}
20
20
  {#each model.attachments.ads as ad (ad.id)}
21
21
  <AdCard
22
22
  ad={ad}
23
+ colors={colors}
23
24
  trackingParams={trackingParams}
25
+ locale={locale}
24
26
  on={{
25
27
  click: on?.adClick,
26
28
  impression: on?.adImpression
@@ -32,6 +34,7 @@ const trackingParams = $derived.by(() => {
32
34
  {#each model.attachments.products as product (product.id)}
33
35
  <ProductCard
34
36
  product={product}
37
+ colors={colors}
35
38
  trackingParams={trackingParams}
36
39
  locale={locale}
37
40
  on={{
@@ -55,7 +58,7 @@ const trackingParams = $derived.by(() => {
55
58
  }
56
59
  }
57
60
  .post-attachments {
58
- --_post-attachments--gap: var(--post-attachments--gap, 2.75rem);
61
+ --_post-attachments--gap: var(--post-attachments--gap, 1.875rem);
59
62
  display: flex;
60
63
  flex-direction: column;
61
64
  gap: var(--_post-attachments--gap);
@@ -3,6 +3,12 @@ import type { TrackingParams } from '../../marketing-tracking';
3
3
  import { PostModel } from '../model';
4
4
  type Props = {
5
5
  model: PostModel;
6
+ colors: {
7
+ background?: string | null;
8
+ price?: string | null;
9
+ salePrice?: string | null;
10
+ buttonBackground?: string | null;
11
+ };
6
12
  trackingParams: TrackingParams | null;
7
13
  locale?: Locale;
8
14
  on?: {
@@ -9,14 +9,14 @@
9
9
  };
10
10
  import { IconColor } from '../../ui/icon';
11
11
  import { MediaVolumeManager } from '../../ui/media-playback';
12
- import { PlayerButton, PlayerButtonsGroup } from '../../ui/player/button';
13
- import IconHeartFilled from '@fluentui/svg-icons/icons/heart_20_filled.svg?raw';
14
- import IconHeart from '@fluentui/svg-icons/icons/heart_28_regular.svg?raw';
15
- import IconShare from '@fluentui/svg-icons/icons/share_28_regular.svg?raw';
16
- import IconShoppingBag from '@fluentui/svg-icons/icons/shopping_bag_28_regular.svg?raw';
17
- import IconSpeaker2 from '@fluentui/svg-icons/icons/speaker_2_28_regular.svg?raw';
18
- import IconSpeakerMute from '@fluentui/svg-icons/icons/speaker_mute_28_regular.svg?raw';
19
- let { model, socialInteractionsHandler, on } = $props();
12
+ import { MobilePlayerButtonsGroup, PlayerButton, PlayerButtonsGroup } from '../../ui/player/button';
13
+ import IconHeartFilled from '@fluentui/svg-icons/icons/heart_32_filled.svg?raw';
14
+ import IconHeart from '@fluentui/svg-icons/icons/heart_32_regular.svg?raw';
15
+ import IconShare from '@fluentui/svg-icons/icons/share_48_regular.svg?raw';
16
+ import IconShoppingBag from '@fluentui/svg-icons/icons/shopping_bag_32_regular.svg?raw';
17
+ import IconSpeaker2 from '@fluentui/svg-icons/icons/speaker_2_32_regular.svg?raw';
18
+ import IconSpeakerMute from '@fluentui/svg-icons/icons/speaker_mute_32_regular.svg?raw';
19
+ let { model, activeColor, inactiveColor, socialInteractionsHandler, on } = $props();
20
20
  const showSocialInteractions = $derived(!!socialInteractionsHandler && model.enableSocialInteractions);
21
21
  let isLikedStore = $state.raw({
22
22
  get isLiked() {
@@ -71,10 +71,47 @@ const refreshIsLiked = () => __awaiter(void 0, void 0, void 0, function* () {
71
71
  });
72
72
  </script>
73
73
 
74
- {#if actions.length > 0}
75
- {#if actions.length === 1}
76
- <PlayerButton scaleEffect={true} icon={actions[0].icon} on={{ click: actions[0].callback }} />
77
- {:else}
78
- <PlayerButtonsGroup scaleEffect={true} actions={actions} />
74
+ <div class="desktop-controls">
75
+ {#if actions.length > 0}
76
+ {#if actions.length === 1}
77
+ <PlayerButton scaleEffect={true} activeColor={activeColor} inactiveColor={inactiveColor} icon={actions[0].icon} on={{ click: actions[0].callback }} />
78
+ {:else}
79
+ <PlayerButtonsGroup scaleEffect={true} activeColor={activeColor} backgroundColor={inactiveColor} actions={actions} />
80
+ {/if}
79
81
  {/if}
80
- {/if}
82
+ </div>
83
+
84
+ <div class="mobile-controls">
85
+ <MobilePlayerButtonsGroup actions={actions} />
86
+ </div>
87
+
88
+ <style>@keyframes fadeIn {
89
+ 0% {
90
+ opacity: 1;
91
+ }
92
+ 50% {
93
+ opacity: 0.4;
94
+ }
95
+ 100% {
96
+ opacity: 1;
97
+ }
98
+ }
99
+ .desktop-controls {
100
+ display: block;
101
+ /* Set 'container-type: inline-size;' to reference container*/
102
+ }
103
+ @container (width < 576px) {
104
+ .desktop-controls {
105
+ display: none;
106
+ }
107
+ }
108
+
109
+ .mobile-controls {
110
+ display: none;
111
+ /* Set 'container-type: inline-size;' to reference container*/
112
+ }
113
+ @container (width < 576px) {
114
+ .mobile-controls {
115
+ display: block;
116
+ }
117
+ }</style>
@@ -2,6 +2,8 @@ import type { PostModel } from '../model';
2
2
  import type { IPostSocialInteractionsHandler } from '../social-interactions';
3
3
  type Props = {
4
4
  model: PostModel;
5
+ activeColor: string | null;
6
+ inactiveColor: string | null;
5
7
  socialInteractionsHandler?: IPostSocialInteractionsHandler;
6
8
  on?: {
7
9
  attachmentsClicked?: () => void;
@@ -10,6 +10,8 @@ export type GetPostsQuery = {
10
10
  items: Array<{
11
11
  id: string;
12
12
  enableSocialInteractions: boolean;
13
+ viewsCount: number;
14
+ displayDate: any;
13
15
  ownerProfile: {
14
16
  id: string;
15
17
  type: SchemaTypes.ProfileType;
@@ -89,6 +91,8 @@ export type GetPostsQuery = {
89
91
  export type PostsPlayerPayloadFragment = {
90
92
  id: string;
91
93
  enableSocialInteractions: boolean;
94
+ viewsCount: number;
95
+ displayDate: any;
92
96
  ownerProfile: {
93
97
  id: string;
94
98
  type: SchemaTypes.ProfileType;
@@ -221,7 +221,9 @@ export const PostsPlayerPayloadFragmentDoc = {
221
221
  }
222
222
  ]
223
223
  }
224
- }
224
+ },
225
+ { kind: 'Field', name: { kind: 'Name', value: 'viewsCount' } },
226
+ { kind: 'Field', name: { kind: 'Name', value: 'displayDate' } }
225
227
  ]
226
228
  }
227
229
  }
@@ -468,7 +470,9 @@ export const GetPostsDocument = {
468
470
  }
469
471
  ]
470
472
  }
471
- }
473
+ },
474
+ { kind: 'Field', name: { kind: 'Name', value: 'viewsCount' } },
475
+ { kind: 'Field', name: { kind: 'Name', value: 'displayDate' } }
472
476
  ]
473
477
  }
474
478
  },
@@ -7,6 +7,8 @@ export type IPostModel = {
7
7
  kicker: string | null;
8
8
  title: string | null;
9
9
  text: string | null;
10
+ viewsCount: number;
11
+ displayDate: string;
10
12
  readMoreUrl?: string;
11
13
  heading: IPostHeadingModel | null;
12
14
  enableSocialInteractions: boolean;
@@ -7,7 +7,7 @@ import { default as PostMedia } from './media/post-media.svelte';
7
7
  import { default as Texts } from './post-texts.svelte';
8
8
  import { PostViewerLocalization } from './post-viewer-localization';
9
9
  import { PostViewerUiManager } from './ui-manager.svelte';
10
- let { model, socialInteractionsHandler, trackingParams: externalTrackingParams, enableAttachments = true, enableControls = true, autoplay = 'on-appearance', locale = 'en', on } = $props();
10
+ let { model, socialInteractionsHandler, trackingParams: externalTrackingParams, controlsColors = null, enableAttachments = true, enableControls = true, autoplay = 'on-appearance', locale = 'en', on } = $props();
11
11
  const localization = $derived(new PostViewerLocalization(locale));
12
12
  const uiManager = new PostViewerUiManager();
13
13
  $effect(() => {
@@ -57,30 +57,34 @@ const variables = $derived.by(() => {
57
57
 
58
58
  <div class="post-viewer" style={variables} use:viewerMounted>
59
59
  <PostMedia id={model.id} media={model.media} locale={locale} autoplay={autoplay} on={{ videoProgress: on?.progress }} />
60
- <div class="post-viewer__information">
61
- {#if model.heading}
62
- <Heading model={model.heading} uiManager={uiManager} localization={localization} />
63
- {/if}
64
- <Texts model={model.texts} uiManager={uiManager} localization={localization} />
60
+ {#if (uiManager.showAttachments && model.attachments) || model.heading || model.texts.kicker || model.texts.title || model.texts.text || model.texts.readMoreUrl}
61
+ <div class="post-viewer__information">
62
+ {#if model.heading}
63
+ <Heading model={model.heading} uiManager={uiManager} localization={localization} />
64
+ {/if}
65
+ <Texts model={model.texts} uiManager={uiManager} localization={localization} />
65
66
 
66
- {#if uiManager.showAttachments && model.attachments}
67
- <AttachmentsHorizontal
68
- model={model}
69
- trackingParams={trackingParams}
70
- uiManager={uiManager}
71
- on={{
72
- productClick: on?.productClick,
73
- productImpression: on?.productImpression,
74
- adClick: on?.adClick,
75
- adImpression: on?.adImpression
76
- }} />
77
- {/if}
78
- </div>
67
+ {#if uiManager.showAttachments && model.attachments}
68
+ <AttachmentsHorizontal
69
+ model={model}
70
+ trackingParams={trackingParams}
71
+ uiManager={uiManager}
72
+ on={{
73
+ productClick: on?.productClick,
74
+ productImpression: on?.productImpression,
75
+ adClick: on?.adClick,
76
+ adImpression: on?.adImpression
77
+ }} />
78
+ {/if}
79
+ </div>
80
+ {/if}
79
81
 
80
82
  {#if uiManager.showControls}
81
83
  <div class="post-viewer__controls-panel" use:trackControlsPanelSize>
82
84
  <PostControls
83
85
  model={model}
86
+ activeColor={controlsColors?.active ?? null}
87
+ inactiveColor={controlsColors?.inactive ?? null}
84
88
  socialInteractionsHandler={socialInteractionsHandler}
85
89
  on={{ attachmentsClicked: () => (uiManager.canShowAttachments = !uiManager.canShowAttachments) }} />
86
90
  </div>
@@ -127,6 +131,12 @@ const variables = $derived.by(() => {
127
131
  justify-content: flex-end;
128
132
  align-items: flex-end;
129
133
  padding: 0 0.625rem;
134
+ /* Set 'container-type: inline-size;' to reference container*/
135
+ }
136
+ @container (width < 576px) {
137
+ .post-viewer__controls-panel {
138
+ padding-right: 0;
139
+ }
130
140
  }
131
141
  .post-viewer__information {
132
142
  pointer-events: none;
@@ -8,6 +8,10 @@ type Props = {
8
8
  trackingParams: TrackingParams | null | false;
9
9
  enableAttachments?: boolean;
10
10
  enableControls?: boolean;
11
+ controlsColors: {
12
+ active: string | null;
13
+ inactive: string | null;
14
+ } | null;
11
15
  autoplay?: true | false | 'on-appearance';
12
16
  locale?: Locale;
13
17
  on?: {
@@ -11,6 +11,8 @@ export const mapToPostModel = (payload) => {
11
11
  title: extractPostTitle(payload.postData),
12
12
  text: extractPostText(payload.postData),
13
13
  enableSocialInteractions: payload.enableSocialInteractions,
14
+ viewsCount: payload.viewsCount,
15
+ displayDate: payload.displayDate,
14
16
  heading: null,
15
17
  ads: payload.ad ? [mapToPostViewerAdCardModel(payload.ad)] : [],
16
18
  products: payload.allProducts.map((x) => mapToPostViewerProductCard(x))
@@ -3,6 +3,8 @@ import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-
3
3
  export type PostViewerPayloadFragment = {
4
4
  id: string;
5
5
  enableSocialInteractions: boolean;
6
+ viewsCount: number;
7
+ displayDate: any;
6
8
  allProducts: Array<{
7
9
  id: string;
8
10
  title: string;
@@ -199,7 +199,9 @@ export const PostViewerPayloadFragmentDoc = {
199
199
  }
200
200
  ]
201
201
  }
202
- }
202
+ },
203
+ { kind: 'Field', name: { kind: 'Name', value: 'viewsCount' } },
204
+ { kind: 'Field', name: { kind: 'Name', value: 'displayDate' } }
203
205
  ]
204
206
  }
205
207
  }
@@ -70,4 +70,6 @@ fragment PostViewerPayloadFragment on Post {
70
70
  text
71
71
  }
72
72
  }
73
+ viewsCount
74
+ displayDate
73
75
  }
@@ -13,17 +13,17 @@ const variables = $derived.by(() => {
13
13
  <div class="post-viewer-texts" style={variables}>
14
14
  {#if model.kicker}
15
15
  <div class="post-viewer-texts__kicker">
16
- <LineClamp value={model.kicker} maxLines={1} enableShowMore={false} />
16
+ <LineClamp maxLines={1} enableShowMore={false} locale={localization.locale}>{model.kicker}</LineClamp>
17
17
  </div>
18
18
  {/if}
19
19
  {#if model.title}
20
20
  <div class="post-viewer-texts__title">
21
- <LineClamp value={model.title} maxLines={2} enableShowMore={false} />
21
+ <LineClamp maxLines={2} enableShowMore={false} locale={localization.locale}>{model.title}</LineClamp>
22
22
  </div>
23
23
  {/if}
24
24
  {#if model.text}
25
25
  <div class="post-viewer-texts__text">
26
- <LineClamp value={model.text} maxLines={2} enableShowMore={true} />
26
+ <LineClamp maxLines={2} enableShowMore={true} locale={localization.locale}>{model.text}</LineClamp>
27
27
  </div>
28
28
  {/if}
29
29
  {#if model.readMoreUrl}