@streamscloud/embeddable 12.1.0 → 13.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 (219) hide show
  1. package/dist/ads/ad-card/cmp.ad-card.svelte +4 -16
  2. package/dist/content-player/cmp.content-player.svelte +1 -1
  3. package/dist/content-player/content-player-config.svelte.d.ts +2 -12
  4. package/dist/content-player/content-player-config.svelte.js +1 -1
  5. package/dist/content-player/content-player-settings.svelte.d.ts +16 -0
  6. package/dist/content-player/content-player-settings.svelte.js +27 -0
  7. package/dist/content-player/controls-and-attachments.svelte +32 -2
  8. package/dist/content-player/controls-and-attachments.svelte.d.ts +1 -0
  9. package/dist/content-player/index.d.ts +1 -0
  10. package/dist/content-player/index.js +1 -0
  11. package/dist/content-player/overview-panel.svelte +2 -2
  12. package/dist/content-player/ui-manager.svelte.d.ts +2 -1
  13. package/dist/content-player/ui-manager.svelte.js +2 -1
  14. package/dist/core/enums.d.ts +3 -0
  15. package/dist/core/enums.js +4 -0
  16. package/dist/core/theme/index.d.ts +2 -0
  17. package/dist/core/theme/index.js +1 -0
  18. package/dist/core/theme/theme-store.svelte.d.ts +6 -0
  19. package/dist/core/theme/theme-store.svelte.js +10 -0
  20. package/dist/external-api/data-providers/index.d.ts +6 -0
  21. package/dist/external-api/data-providers/index.js +6 -0
  22. package/dist/external-api/data-providers/internal-media-center-data-provider.svelte.d.ts +15 -0
  23. package/dist/{media-center/config/internal-media-center-config.js → external-api/data-providers/internal-media-center-data-provider.svelte.js} +33 -17
  24. package/dist/{posts/handlers → external-api/data-providers}/internal-post-analytics-handler.d.ts +1 -1
  25. package/dist/{short-videos → external-api}/data-providers/internal-short-video-player-items-provider.js +1 -1
  26. package/dist/{streams/streams-player → external-api/data-providers}/internal-stream-analytics-handler.d.ts +1 -1
  27. package/dist/{streams/streams-player → external-api/data-providers}/internal-streams-player-data-provider.d.ts +1 -1
  28. package/dist/{streams/streams-player → external-api/data-providers}/internal-streams-player-data-provider.js +1 -1
  29. package/dist/{media-center/config → external-api/data-providers}/operations.generated.d.ts +6 -0
  30. package/dist/{media-center/config → external-api/data-providers}/operations.generated.js +13 -0
  31. package/dist/{media-center/config → external-api/data-providers}/operations.graphql +6 -0
  32. package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/mapper.d.ts +1 -1
  33. package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/mapper.js +2 -2
  34. package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/operations.generated.d.ts +1 -1
  35. package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/posts-loader.d.ts +2 -2
  36. package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/posts-loader.js +1 -1
  37. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/mapper.d.ts +1 -1
  38. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/mapper.js +1 -1
  39. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/operations.generated.d.ts +1 -1
  40. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/stream-pages-loader.d.ts +1 -1
  41. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/stream-pages-loader.js +2 -2
  42. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/streams-loader.d.ts +2 -2
  43. package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/streams-loader.js +6 -2
  44. package/dist/external-api/index.d.ts +3 -0
  45. package/dist/external-api/index.js +3 -0
  46. package/dist/external-api/media-page/index.d.ts +83 -0
  47. package/dist/external-api/media-page/index.js +82 -0
  48. package/dist/{short-videos → external-api}/short-videos-player/index.d.ts +27 -12
  49. package/dist/{short-videos → external-api}/short-videos-player/index.js +35 -28
  50. package/dist/external-api/streams-player/index.d.ts +105 -0
  51. package/dist/external-api/streams-player/index.js +110 -0
  52. package/dist/media-center/config/types.d.ts +28 -27
  53. package/dist/media-center/index.d.ts +3 -1
  54. package/dist/media-center/media-center/cmp.media-center-proxy.svelte +59 -0
  55. package/dist/media-center/media-center/cmp.media-center-proxy.svelte.d.ts +15 -0
  56. package/dist/media-center/media-center/discover/community-features-localization.d.ts +8 -0
  57. package/dist/media-center/media-center/discover/community-features-localization.js +31 -0
  58. package/dist/media-center/media-center/discover/community-features.svelte +171 -0
  59. package/dist/media-center/media-center/discover/community-features.svelte.d.ts +11 -0
  60. package/dist/media-center/media-center/discover/data-loading.d.ts +3 -3
  61. package/dist/media-center/media-center/discover/data-loading.js +5 -5
  62. package/dist/media-center/media-center/discover/discover-header.svelte +13 -65
  63. package/dist/media-center/media-center/discover/discover-header.svelte.d.ts +0 -2
  64. package/dist/media-center/media-center/discover/discover-view-handler.svelte.d.ts +3 -3
  65. package/dist/media-center/media-center/discover/discover-view-handler.svelte.js +4 -4
  66. package/dist/media-center/media-center/discover/discover-view.svelte +6 -6
  67. package/dist/media-center/media-center/discover/discover-view.svelte.d.ts +0 -2
  68. package/dist/media-center/media-center/feed/feed-handler.svelte.d.ts +5 -3
  69. package/dist/media-center/media-center/feed/feed-handler.svelte.js +18 -10
  70. package/dist/media-center/media-center/feed/feed-providers-generator.d.ts +11 -5
  71. package/dist/media-center/media-center/feed/feed-providers-generator.js +13 -9
  72. package/dist/media-center/media-center/footer/index.d.ts +1 -0
  73. package/dist/media-center/media-center/footer/index.js +1 -0
  74. package/dist/media-center/media-center/{header-footer → footer}/media-center-footer.svelte +5 -5
  75. package/dist/media-center/media-center/handlers/categories-handler.svelte.d.ts +3 -5
  76. package/dist/media-center/media-center/handlers/categories-handler.svelte.js +16 -13
  77. package/dist/media-center/media-center/handlers/media-center-settings-handler.svelte.d.ts +18 -5
  78. package/dist/media-center/media-center/handlers/media-center-settings-handler.svelte.js +21 -9
  79. package/dist/media-center/media-center/{header-footer → header}/index.d.ts +0 -1
  80. package/dist/media-center/media-center/{header-footer → header}/index.js +0 -1
  81. package/dist/media-center/media-center/{header-footer → header}/media-center-header-mobile.svelte +5 -4
  82. package/dist/media-center/media-center/{header-footer → header}/media-center-header.svelte +138 -35
  83. package/dist/media-center/media-center/{header-footer → header}/media-center-header.svelte.d.ts +2 -2
  84. package/dist/media-center/media-center/index.d.ts +2 -1
  85. package/dist/media-center/media-center/index.js +2 -1
  86. package/dist/media-center/media-center/media-center-context.svelte.d.ts +16 -20
  87. package/dist/media-center/media-center/media-center-context.svelte.js +61 -19
  88. package/dist/media-center/media-center/media-center-settings.svelte.d.ts +11 -0
  89. package/dist/media-center/media-center/media-center-settings.svelte.js +23 -0
  90. package/dist/media-center/media-center/{cmp.media-center.svelte → media-center-view.svelte} +65 -108
  91. package/dist/media-center/media-center/media-center-view.svelte.d.ts +9 -0
  92. package/dist/media-center/media-center/menu/category-following-wrapper.svelte.d.ts +1 -1
  93. package/dist/media-center/media-center/menu/menu.svelte +40 -35
  94. package/dist/media-center/media-center/menu/menu.svelte.d.ts +0 -2
  95. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.d.ts +3 -3
  96. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.js +4 -4
  97. package/dist/media-center/media-center/moments/cmp.moments-circle.svelte +24 -7
  98. package/dist/media-center/media-center/moments/index.d.ts +1 -0
  99. package/dist/media-center/media-center/moments/index.js +1 -0
  100. package/dist/media-center/media-center/moments/moments-feed-handler.svelte.d.ts +26 -0
  101. package/dist/media-center/media-center/moments/moments-feed-handler.svelte.js +49 -0
  102. package/dist/media-center/media-center/moments/moments-state.svelte.d.ts +20 -0
  103. package/dist/media-center/media-center/moments/moments-state.svelte.js +82 -0
  104. package/dist/media-center/media-center/streams-in-category/streams-in-category-panel-handler.svelte.d.ts +3 -3
  105. package/dist/media-center/media-center/streams-in-category/streams-in-category-panel-handler.svelte.js +4 -4
  106. package/dist/media-center/media-center/streams-in-category/streams-in-category-panel.svelte +2 -3
  107. package/dist/media-center/media-center/types.d.ts +4 -11
  108. package/dist/media-center/membership/index.d.ts +1 -0
  109. package/dist/media-center/membership/index.js +1 -0
  110. package/dist/media-center/membership/mock-membership-handler.svelte.d.ts +10 -0
  111. package/dist/media-center/membership/mock-membership-handler.svelte.js +21 -0
  112. package/dist/media-center/membership/types.d.ts +10 -0
  113. package/dist/media-center/membership/types.js +1 -0
  114. package/dist/media-center/navigation/index.d.ts +2 -0
  115. package/dist/media-center/navigation/index.js +1 -0
  116. package/dist/media-center/navigation/media-center-state.d.ts +19 -0
  117. package/dist/media-center/navigation/media-center-state.js +1 -0
  118. package/dist/media-center/navigation/mock-navigation-handler.svelte.d.ts +6 -0
  119. package/dist/media-center/navigation/mock-navigation-handler.svelte.js +6 -0
  120. package/dist/media-center/navigation/types.d.ts +5 -0
  121. package/dist/media-center/navigation/types.js +1 -0
  122. package/dist/media-page/cmp.media-page.svelte +45 -0
  123. package/dist/media-page/cmp.media-page.svelte.d.ts +11 -0
  124. package/dist/media-page/index.d.ts +42 -58
  125. package/dist/media-page/index.js +131 -17
  126. package/dist/posts/attachments/cmp.attachments.svelte +1 -1
  127. package/dist/posts/controls/cmp.controls.svelte +4 -1
  128. package/dist/posts/controls/cmp.controls.svelte.d.ts +2 -0
  129. package/dist/posts/post-viewer/attachments-horizontal.svelte +4 -12
  130. package/dist/posts/post-viewer/heading.svelte +4 -4
  131. package/dist/posts/post-viewer/media/post-media.svelte +1 -1
  132. package/dist/posts/post-viewer/post-texts.svelte +2 -2
  133. package/dist/posts/posts-player/cmp.posts-player.svelte.d.ts +1 -0
  134. package/dist/posts/posts-player/index.d.ts +31 -32
  135. package/dist/posts/posts-player/index.js +90 -35
  136. package/dist/posts/posts-player/posts-player-proxy.svelte +13 -4
  137. package/dist/posts/posts-player/posts-player-proxy.svelte.d.ts +1 -0
  138. package/dist/posts/posts-player/posts-player-view.svelte +1 -1
  139. package/dist/posts/posts-player/types.d.ts +2 -1
  140. package/dist/products/product-card/cmp.product-card.svelte +4 -16
  141. package/dist/short-videos/short-video-card/cmp.short-video-card.svelte +6 -6
  142. package/dist/streams/layout/styles-transformer.d.ts +1 -1
  143. package/dist/streams/stream-card/cmp.stream-card.svelte +1 -1
  144. package/dist/streams/streams-player/cmp.streams-player.svelte +42 -0
  145. package/dist/streams/streams-player/cmp.streams-player.svelte.d.ts +24 -0
  146. package/dist/streams/streams-player/index.d.ts +18 -83
  147. package/dist/streams/streams-player/index.js +85 -65
  148. package/dist/streams/streams-player/stream-overview.svelte +1 -1
  149. package/dist/streams/streams-player/streams-player-buffer.svelte.js +2 -1
  150. package/dist/streams/streams-player/streams-player-proxy.svelte +32 -0
  151. package/dist/streams/streams-player/streams-player-proxy.svelte.d.ts +26 -0
  152. package/dist/streams/streams-player/streams-player-view.svelte +1 -1
  153. package/dist/streams/streams-player/types.d.ts +3 -1
  154. package/dist/ui/button/cmp.options-button.svelte +123 -0
  155. package/dist/ui/button/cmp.options-button.svelte.d.ts +20 -0
  156. package/dist/ui/button/index.d.ts +1 -0
  157. package/dist/ui/button/index.js +1 -0
  158. package/dist/ui/button/resources/button-theme.svelte +6 -143
  159. package/dist/ui/button/resources/button-types.d.ts +0 -1
  160. package/dist/ui/button/resources/button-types.js +0 -1
  161. package/dist/ui/icon/cmp.icon.svelte +8 -28
  162. package/dist/ui/image/cmp.image-rounded.svelte +3 -10
  163. package/dist/ui/image/cmp.image-stub.svelte +1 -4
  164. package/dist/ui/image/cmp.image.svelte +1 -4
  165. package/dist/ui/loading/cmp.loading.svelte +1 -4
  166. package/dist/ui/player/button/cmp.mobile-player-buttons-group.svelte +2 -2
  167. package/dist/ui/player/button/cmp.mobile-player-buttons-group.svelte.d.ts +2 -2
  168. package/dist/ui/player/button/cmp.player-button.svelte +7 -3
  169. package/dist/ui/player/button/cmp.player-buttons-group.svelte +4 -3
  170. package/dist/ui/player/button/cmp.player-buttons-group.svelte.d.ts +2 -2
  171. package/dist/ui/player/button/index.d.ts +1 -1
  172. package/dist/ui/player/button/types.d.ts +1 -1
  173. package/dist/ui/player/colors/index.d.ts +1 -1
  174. package/dist/ui/player/colors/index.js +1 -1
  175. package/dist/ui/player/colors/player-colors.d.ts +15 -1
  176. package/dist/ui/player/colors/player-colors.js +24 -1
  177. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.d.ts +1 -0
  178. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.js +7 -1
  179. package/dist/ui/player/providers/default-feed-player-buffer.svelte.d.ts +1 -0
  180. package/dist/ui/player/providers/default-feed-player-buffer.svelte.js +7 -1
  181. package/dist/ui/player/providers/types.d.ts +3 -1
  182. package/dist/ui/shadow-dom/cmp.shadow-root.svelte +158 -0
  183. package/dist/ui/shadow-dom/colors.scss +74 -0
  184. package/dist/ui/shadow-dom/index.d.ts +1 -0
  185. package/dist/ui/shadow-dom/index.js +1 -0
  186. package/dist/ui/shadow-dom/shadow-root-service.js +0 -4
  187. package/dist/ui/slider/cmp.slider.svelte +5 -5
  188. package/package.json +5 -1
  189. package/dist/content-player/content-player-settings.d.ts +0 -12
  190. package/dist/content-player/content-player-settings.js +0 -22
  191. package/dist/media-center/config/internal-media-center-config.d.ts +0 -14
  192. package/dist/media-center/media-center/cmp.media-center.svelte.d.ts +0 -4
  193. package/dist/media-center/media-center/discover/discover-header-localization.d.ts +0 -6
  194. package/dist/media-center/media-center/discover/discover-header-localization.js +0 -15
  195. package/dist/posts/handlers/index.d.ts +0 -1
  196. package/dist/posts/handlers/index.js +0 -1
  197. package/dist/short-videos/data-providers/index.d.ts +0 -1
  198. package/dist/short-videos/data-providers/index.js +0 -1
  199. package/dist/ui/with-background/cmp.with-background.svelte +0 -86
  200. package/dist/ui/with-background/index.d.ts +0 -1
  201. package/dist/ui/with-background/index.js +0 -1
  202. /package/dist/{media-center/config → external-api/data-providers}/internal-media-center-analytics-handler.d.ts +0 -0
  203. /package/dist/{media-center/config → external-api/data-providers}/internal-media-center-analytics-handler.js +0 -0
  204. /package/dist/{posts/handlers → external-api/data-providers}/internal-post-analytics-handler.js +0 -0
  205. /package/dist/{short-videos → external-api}/data-providers/internal-short-video-player-items-provider.d.ts +0 -0
  206. /package/dist/{streams/streams-player → external-api/data-providers}/internal-stream-analytics-handler.js +0 -0
  207. /package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/index.d.ts +0 -0
  208. /package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/index.js +0 -0
  209. /package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/operations.generated.js +0 -0
  210. /package/dist/{posts/data-loaders → external-api/data-providers/post-data-loaders}/operations.graphql +0 -0
  211. /package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/index.d.ts +0 -0
  212. /package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/index.js +0 -0
  213. /package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/operations.generated.js +0 -0
  214. /package/dist/{streams/data-loaders → external-api/data-providers/stream-data-loaders}/operations.graphql +0 -0
  215. /package/dist/media-center/media-center/{header-footer → footer}/media-center-footer.svelte.d.ts +0 -0
  216. /package/dist/media-center/media-center/{header-footer → header}/media-center-header-localization.d.ts +0 -0
  217. /package/dist/media-center/media-center/{header-footer → header}/media-center-header-localization.js +0 -0
  218. /package/dist/media-center/media-center/{header-footer → header}/media-center-header-mobile.svelte.d.ts +0 -0
  219. /package/dist/ui/{with-background/cmp.with-background.svelte.d.ts → shadow-dom/cmp.shadow-root.svelte.d.ts} +0 -0
@@ -1,21 +1,72 @@
1
- import { toastrWarning } from '../core/toastr';
2
- import { InternalMediaCenterConfig } from '../media-center/config/internal-media-center-config';
3
1
  import {} from '../media-center/config/types';
4
- import { MediaCenter } from '../media-center/media-center';
2
+ import { MediaCenterProxy, MediaCenterSettings } from '../media-center/media-center';
5
3
  import { CloseOrchestrator } from '../ui/player/close-orchestrator';
6
4
  import { ModalShadowHost } from '../ui/shadow-dom';
7
5
  import { mount, unmount } from 'svelte';
8
- export { mapToPostPlayerModel } from '../posts/data-loaders/mapper';
6
+ export { default as MediaPage } from './cmp.media-page.svelte';
7
+ /**
8
+ * Opens the media page modal.
9
+ *
10
+ * @param init Configuration options.
11
+ *
12
+ * Config mode
13
+ * @param {IMediaCenterDataProvider} init.dataProvider
14
+ * Configuration for the media center.
15
+ *
16
+ * Common (optional)
17
+ * @param {Object} [init.viewerSettings]
18
+ * Viewer UI and behavior settings.
19
+ *
20
+ * Fields of `viewerSettings`:
21
+ * - {boolean} [viewerSettings.disableBackground]
22
+ * If true, hides the viewer background image.
23
+ * - {Locale} [viewerSettings.locale]
24
+ * Localization for the viewer UI. Supported values: 'en' | 'no'.
25
+ * If omitted, the default locale 'en' is used.
26
+ * - {boolean} [viewerSettings.showStreamsCloudWatermark]
27
+ * If true, shows the StreamsCloud watermark.
28
+ * - {boolean} [viewerSettings.hideCloseButton]
29
+ * If true, hides the close button.
30
+ * - {'light' | 'dark'} [viewerSettings.theme]
31
+ * Optional theme for the viewer UI.
32
+ *
33
+ * Events
34
+ * @param {{ closed?: () => void }} [init.on]
35
+ * Optional event handlers.
36
+ * @param {() => void} [init.on.closed]
37
+ * Called after the modal is fully closed (after unmount and removal from the DOM).
38
+ *
39
+ * @returns {void}
40
+ *
41
+ * @example <caption>Config mode</caption>
42
+ * ```ts
43
+ * import {
44
+ * openMediaPageModal,
45
+ * type IMediaCenterDataProvider
46
+ * } from '@streamscloud/embeddable/media-page';
47
+ *
48
+ * const dataProvider: IMediaDataProvider= {
49
+ * // ...your media center configuration
50
+ * };
51
+ *
52
+ * openMediaPageModal({
53
+ * dataProvider,
54
+ * viewerSettings: {
55
+ * // Example: switch to Norwegian (if supported by your Locale type)
56
+ * locale: 'no',
57
+ * disableBackground: false,
58
+ * hideCloseButton: false,
59
+ * showStreamsCloudWatermark: true,
60
+ * theme: 'dark',
61
+ * },
62
+ * on: {
63
+ * closed: () => console.log('Media page modal closed'),
64
+ * },
65
+ * });
66
+ * ```
67
+ */
9
68
  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
- }
69
+ const { dataProvider, viewerSettings, on } = init;
19
70
  const shadowHost = new ModalShadowHost();
20
71
  let mounted = null;
21
72
  const makeCloseOrchestrator = () => new CloseOrchestrator({
@@ -28,13 +79,76 @@ export function openMediaPageModal(init) {
28
79
  },
29
80
  canClose: !viewerSettings?.hideCloseButton
30
81
  });
31
- mounted = mount(MediaCenter, {
82
+ mounted = mount(MediaCenterProxy, {
32
83
  target: shadowHost.shadowRoot,
33
84
  props: {
34
- config: mediaCenterConfig,
35
- settings: viewerSettings,
85
+ dataProvider,
86
+ settings: new MediaCenterSettings(viewerSettings),
36
87
  modeProps: {
37
- mode: 'discover'
88
+ mode: 'default'
89
+ },
90
+ closeOrchestrator: makeCloseOrchestrator()
91
+ }
92
+ });
93
+ shadowHost.attachToBody();
94
+ }
95
+ export function openMediaPageModalWithInitialPostsProvider(init) {
96
+ const { dataProvider, mediaCenterDataProvider, viewerSettings, on } = init;
97
+ const shadowHost = new ModalShadowHost();
98
+ let mounted = null;
99
+ const makeCloseOrchestrator = () => new CloseOrchestrator({
100
+ closeFn: async () => {
101
+ await unmount(mounted);
102
+ shadowHost.remove();
103
+ if (on?.closed) {
104
+ on.closed();
105
+ }
106
+ },
107
+ canClose: !viewerSettings?.hideCloseButton
108
+ });
109
+ mounted = mount(MediaCenterProxy, {
110
+ target: shadowHost.shadowRoot,
111
+ props: {
112
+ dataProvider: mediaCenterDataProvider,
113
+ settings: new MediaCenterSettings(viewerSettings),
114
+ modeProps: {
115
+ mode: 'posts',
116
+ props: {
117
+ dataProvider,
118
+ onPostActivated: on?.postActivated
119
+ }
120
+ },
121
+ closeOrchestrator: makeCloseOrchestrator()
122
+ }
123
+ });
124
+ shadowHost.attachToBody();
125
+ }
126
+ export function openMediaPageModalWithInitialStreamsProvider(init) {
127
+ const { dataProvider, amplificationParameters, mediaCenterDataProvider, viewerSettings, on } = init;
128
+ const shadowHost = new ModalShadowHost();
129
+ let mounted = null;
130
+ const makeCloseOrchestrator = () => new CloseOrchestrator({
131
+ closeFn: async () => {
132
+ await unmount(mounted);
133
+ shadowHost.remove();
134
+ if (on?.closed) {
135
+ on.closed();
136
+ }
137
+ },
138
+ canClose: !viewerSettings?.hideCloseButton
139
+ });
140
+ mounted = mount(MediaCenterProxy, {
141
+ target: shadowHost.shadowRoot,
142
+ props: {
143
+ dataProvider: mediaCenterDataProvider,
144
+ settings: new MediaCenterSettings(viewerSettings),
145
+ modeProps: {
146
+ mode: 'streams',
147
+ props: {
148
+ dataProvider,
149
+ amplificationParameters,
150
+ onStreamActivated: on?.streamActivated
151
+ }
38
152
  },
39
153
  closeOrchestrator: makeCloseOrchestrator()
40
154
  }
@@ -15,7 +15,7 @@ const trackingParams = $derived.by(() => {
15
15
  </script>
16
16
 
17
17
  {#if model.attachments}
18
- <div class="post-attachments" data-theme="dark">
18
+ <div class="post-attachments">
19
19
  {#if model.attachments.ads.length}
20
20
  {#each model.attachments.ads as ad (ad.id)}
21
21
  <AdCard
@@ -16,7 +16,7 @@ import IconShare from '@fluentui/svg-icons/icons/share_48_regular.svg?raw';
16
16
  import IconShoppingBag from '@fluentui/svg-icons/icons/shopping_bag_32_regular.svg?raw';
17
17
  import IconSpeaker2 from '@fluentui/svg-icons/icons/speaker_2_32_regular.svg?raw';
18
18
  import IconSpeakerMute from '@fluentui/svg-icons/icons/speaker_mute_32_regular.svg?raw';
19
- let { model, activeColor, inactiveColor, socialInteractionsHandler, on } = $props();
19
+ let { model, activeColor, inactiveColor, socialInteractionsHandler, extraActions, on } = $props();
20
20
  const showSocialInteractions = $derived(!!socialInteractionsHandler && model.enableSocialInteractions);
21
21
  let isLikedStore = $state.raw({
22
22
  get isLiked() {
@@ -39,6 +39,9 @@ const actions = $derived.by(() => {
39
39
  if (model.media && !model.media.currentItem.isImage) {
40
40
  result.push({ icon: MediaVolumeManager.isMuted ? IconSpeakerMute : IconSpeaker2, callback: onMuteClicked });
41
41
  }
42
+ if (extraActions === null || extraActions === void 0 ? void 0 : extraActions.length) {
43
+ result.push(...extraActions);
44
+ }
42
45
  return result;
43
46
  });
44
47
  $effect(() => {
@@ -1,10 +1,12 @@
1
1
  import type { PostModel } from '../model';
2
2
  import type { IPostSocialInteractionsHandler } from '../social-interactions';
3
+ import { type PlayerButtonDef } from '../../ui/player/button';
3
4
  type Props = {
4
5
  model: PostModel;
5
6
  activeColor: string | null;
6
7
  inactiveColor: string | null;
7
8
  socialInteractionsHandler?: IPostSocialInteractionsHandler;
9
+ extraActions?: PlayerButtonDef[];
8
10
  on?: {
9
11
  attachmentsClicked?: () => void;
10
12
  };
@@ -192,19 +192,14 @@ const variables = $derived.by(() => {
192
192
  align-items: center;
193
193
  width: 15.625rem;
194
194
  padding: 0.375rem;
195
- background-color: rgba(255, 255, 255, 0.9);
196
- color: #000000;
197
- border: 0.0625rem solid #f2f2f3;
195
+ background-color: rgb(from var(--sc-mc-color--bg-card) r g b/90%);
196
+ color: var(--sc-mc-color--text-primary);
197
+ border: 0.0625rem solid var(--sc-mc-color--border-card);
198
198
  border-radius: 0.25rem;
199
199
  }
200
200
  .attachments-card--single {
201
201
  width: 100%;
202
202
  }
203
- :global([data-theme="dark"]) .attachments-card {
204
- background-color: rgba(18, 18, 18, 0.9);
205
- color: #ffffff;
206
- border-color: #1e1e1e;
207
- }
208
203
  .attachments-card__thumb {
209
204
  --image--rounded--width: 2.375rem;
210
205
  --image--rounded--height: 2.375rem;
@@ -226,11 +221,8 @@ const variables = $derived.by(() => {
226
221
  }
227
222
  .attachments-card__extra-info {
228
223
  font-size: 0.625rem;
229
- color: #6b7280;
224
+ color: var(--sc-mc-color--text-secondary);
230
225
  white-space: nowrap;
231
226
  overflow: hidden;
232
227
  text-overflow: ellipsis;
233
- }
234
- :global([data-theme="dark"]) .attachments-card__extra-info {
235
- color: #ffffff;
236
228
  }</style>
@@ -67,8 +67,8 @@ const variables = $derived.by(() => {
67
67
  font-size: 0.75rem;
68
68
  line-height: 0.9375rem;
69
69
  font-weight: 500;
70
- color: #ffffff;
71
- text-shadow: 1px 1px hsl(0, 0%, 10%);
70
+ color: var(--sc-mc-color--text-white);
71
+ text-shadow: var(--sc-mc-color--text-white-shadow);
72
72
  text-overflow: ellipsis;
73
73
  width: 100%;
74
74
  white-space: nowrap;
@@ -79,6 +79,6 @@ const variables = $derived.by(() => {
79
79
  font-size: 0.625rem;
80
80
  line-height: 0.75rem;
81
81
  font-weight: 400;
82
- color: #ffffff;
83
- text-shadow: 1px 1px hsl(0, 0%, 10%);
82
+ color: var(--sc-mc-color--text-white);
83
+ text-shadow: var(--sc-mc-color--text-white-shadow);
84
84
  }</style>
@@ -52,7 +52,7 @@ let { id, media, locale, autoplay = 'on-appearance', on } = $props();
52
52
  height: 100%;
53
53
  min-height: 100%;
54
54
  max-height: 100%;
55
- background-color: rgba(0, 0, 0, 0.6);
55
+ background-color: rgb(from var(--sc-mc-color--bg-panel) r g b/60%);
56
56
  }
57
57
  .post-media--fit {
58
58
  --video--media-fit: contain;
@@ -45,8 +45,8 @@ const variables = $derived.by(() => {
45
45
  }
46
46
  }
47
47
  .post-viewer-texts {
48
- color: #ffffff;
49
- text-shadow: 0 1px 0 rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 6px rgba(0, 0, 0, 0.05);
48
+ color: var(--sc-mc-color--text-white);
49
+ text-shadow: var(--sc-mc-color--text-white-shadow);
50
50
  padding: var(--_post-viewer-texts--padding);
51
51
  display: flex;
52
52
  flex-direction: column;
@@ -10,6 +10,7 @@ type Props = {
10
10
  locale?: Locale;
11
11
  showStreamsCloudWatermark?: boolean;
12
12
  disableBackground?: boolean;
13
+ theme?: 'light' | 'dark';
13
14
  };
14
15
  on?: {
15
16
  postActivated?: (id: string) => void;
@@ -1,24 +1,19 @@
1
1
  import type { Locale } from '../../core/locale';
2
- import { type IMediaCenterConfig } from '../../media-center/config/types';
2
+ import { type IMediaCenterDataProvider } from '../../media-center/config/types';
3
3
  import type { IPostSocialInteractionsHandler } from '../social-interactions';
4
4
  import { default as PostsPlayer } from './cmp.posts-player.svelte';
5
5
  import type { IPostAnalyticsHandler, PostPlayerModel } from './types';
6
6
  export { PostsPlayer, type PostPlayerModel };
7
- export type { IMediaCenterConfig, IPostAnalyticsHandler };
8
- export { mapToPostPlayerModel } from '../data-loaders/mapper';
7
+ export type { IMediaCenterDataProvider, IPostAnalyticsHandler };
9
8
  /**
10
9
  * Opens the posts player modal.
11
10
  *
12
- * @param init Configuration options.
11
+ * @param init Configuration options for the posts player.
13
12
  *
14
13
  * Data provider (required)
15
- * @param init.postsProvider
14
+ * @param {IPostsPlayerDataProvider} init.postsProvider
16
15
  * Provider that supplies post items to the player.
17
16
  *
18
- * Media center (optional)
19
- * @param {IMediaCenterConfig} [init.mediaCenterConfig]
20
- * Optional media-center config passed to MediaCenter.
21
- *
22
17
  * Analytics (optional)
23
18
  * @param {IPostAnalyticsHandler} [init.analyticsHandler]
24
19
  * Custom analytics handler for posts player events.
@@ -27,20 +22,23 @@ export { mapToPostPlayerModel } from '../data-loaders/mapper';
27
22
  * @param {IPostSocialInteractionsHandler} [init.socialInteractionsHandler]
28
23
  * Handler for social interactions (like, share, etc.).
29
24
  *
30
- * Player settings
31
- * @param {PostPlayerSettings} [init.playerSettings]
25
+ * Player settings (optional)
26
+ * @param {object} [init.playerSettings]
32
27
  * Player UI and behavior settings.
33
- * Fields of PostPlayerSettings:
28
+ * Fields of PostsPlayerSettings:
34
29
  * - {boolean} [disableBackground]
35
30
  * If true, hides the player's background image.
36
31
  * - {boolean} [hideCloseButton]
37
32
  * If true, hides the close button.
33
+ * Note: when true, the `CloseOrchestrator` will not allow closing via the close button.
38
34
  * - {'en'|'no'} [locale='en']
39
35
  * Localization for the player UI. Default is 'en'; use 'no' for Norwegian.
40
36
  * - {boolean} [showStreamsCloudWatermark]
41
37
  * If true, shows the StreamsCloud watermark.
38
+ * - {'light' | 'dark'} [theme]
39
+ * Optional theme for the player UI.
42
40
  *
43
- * Events
41
+ * Events (optional)
44
42
  * @param {{ playerClosed?: () => void; postActivated?: (id: string) => void }} [init.on]
45
43
  * Optional event handlers.
46
44
  * @param {() => void} [init.on.playerClosed]
@@ -55,16 +53,26 @@ export { mapToPostPlayerModel } from '../data-loaders/mapper';
55
53
  * import { openPostsPlayer } from '@streamscloud/embeddable/posts-player';
56
54
  *
57
55
  * openPostsPlayer({
58
- * postsProvider: myPostsProvider,
59
- * mediaCenterConfig: myMediaCenterConfig,
56
+ * postsProvider: {
57
+ * kind: 'feed',
58
+ * initialData: {
59
+ * prefetchedItems: myPrefetchedPosts,
60
+ * startIndex: 0,
61
+ * startMediaIndex: 0,
62
+ * },
63
+ * loadMore: async () => {
64
+ * // return next chunk of PostPlayerModel[]
65
+ * return await fetchMorePosts();
66
+ * },
67
+ * },
60
68
  * analyticsHandler: myAnalyticsHandler,
61
69
  * socialInteractionsHandler: mySocialHandler,
62
70
  * playerSettings: {
63
- * // Default locale is 'en'; set 'no' to switch to Norwegian:
64
71
  * locale: 'no',
65
72
  * disableBackground: false,
66
73
  * hideCloseButton: false,
67
74
  * showStreamsCloudWatermark: true,
75
+ * theme: 'dark',
68
76
  * },
69
77
  * on: {
70
78
  * playerClosed: () => console.log('Player closed'),
@@ -73,20 +81,17 @@ export { mapToPostPlayerModel } from '../data-loaders/mapper';
73
81
  * });
74
82
  * ```
75
83
  */
76
- export declare function openPostsPlayer(init: {
77
- postsProvider: IPostsPlayerDataProvider;
78
- mediaCenterConfig: IMediaCenterConfig;
79
- playerSettings?: PostsPlayerSettings;
80
- on?: {
81
- playerClosed?: () => void;
82
- postActivated?: (id: string) => void;
83
- };
84
- }): void;
85
84
  export declare function openPostsPlayer(init: {
86
85
  postsProvider: IPostsPlayerDataProvider;
87
86
  analyticsHandler?: IPostAnalyticsHandler;
88
87
  socialInteractionsHandler?: IPostSocialInteractionsHandler;
89
- playerSettings?: PostsPlayerSettings;
88
+ playerSettings?: {
89
+ disableBackground?: boolean;
90
+ locale?: Locale;
91
+ showStreamsCloudWatermark?: boolean;
92
+ hideCloseButton?: boolean;
93
+ theme?: 'light' | 'dark';
94
+ };
90
95
  on?: {
91
96
  playerClosed?: () => void;
92
97
  postActivated?: (id: string) => void;
@@ -115,9 +120,3 @@ export type IPostsPlayerDataProvider<TChunk extends WithId = WithId> = {
115
120
  type WithId = {
116
121
  id: string;
117
122
  };
118
- export type PostsPlayerSettings = {
119
- disableBackground?: boolean;
120
- locale?: Locale;
121
- showStreamsCloudWatermark?: boolean;
122
- hideCloseButton?: boolean;
123
- };
@@ -1,16 +1,90 @@
1
1
  import {} from '../../media-center/config/types';
2
- import { MediaCenter } from '../../media-center/media-center';
3
2
  import { CloseOrchestrator } from '../../ui/player/close-orchestrator';
4
3
  import { ModalShadowHost } from '../../ui/shadow-dom';
5
4
  import { default as PostsPlayer } from './cmp.posts-player.svelte';
6
5
  import { default as PostsPlayerProxy } from './posts-player-proxy.svelte';
7
6
  import { mount, unmount } from 'svelte';
8
7
  export { PostsPlayer };
9
- export { mapToPostPlayerModel } from '../data-loaders/mapper';
8
+ /**
9
+ * Opens the posts player modal.
10
+ *
11
+ * @param init Configuration options for the posts player.
12
+ *
13
+ * Data provider (required)
14
+ * @param {IPostsPlayerDataProvider} init.postsProvider
15
+ * Provider that supplies post items to the player.
16
+ *
17
+ * Analytics (optional)
18
+ * @param {IPostAnalyticsHandler} [init.analyticsHandler]
19
+ * Custom analytics handler for posts player events.
20
+ *
21
+ * Social interactions (optional)
22
+ * @param {IPostSocialInteractionsHandler} [init.socialInteractionsHandler]
23
+ * Handler for social interactions (like, share, etc.).
24
+ *
25
+ * Player settings (optional)
26
+ * @param {object} [init.playerSettings]
27
+ * Player UI and behavior settings.
28
+ * Fields of PostsPlayerSettings:
29
+ * - {boolean} [disableBackground]
30
+ * If true, hides the player's background image.
31
+ * - {boolean} [hideCloseButton]
32
+ * If true, hides the close button.
33
+ * Note: when true, the `CloseOrchestrator` will not allow closing via the close button.
34
+ * - {'en'|'no'} [locale='en']
35
+ * Localization for the player UI. Default is 'en'; use 'no' for Norwegian.
36
+ * - {boolean} [showStreamsCloudWatermark]
37
+ * If true, shows the StreamsCloud watermark.
38
+ * - {'light' | 'dark'} [theme]
39
+ * Optional theme for the player UI.
40
+ *
41
+ * Events (optional)
42
+ * @param {{ playerClosed?: () => void; postActivated?: (id: string) => void }} [init.on]
43
+ * Optional event handlers.
44
+ * @param {() => void} [init.on.playerClosed]
45
+ * Called after the player is fully closed (after unmount and removal from the DOM).
46
+ * @param {(id: string) => void} [init.on.postActivated]
47
+ * Called when a post becomes active (receives the post's id).
48
+ *
49
+ * @returns {void}
50
+ *
51
+ * @example
52
+ * ```ts
53
+ * import { openPostsPlayer } from '@streamscloud/embeddable/posts-player';
54
+ *
55
+ * openPostsPlayer({
56
+ * postsProvider: {
57
+ * kind: 'feed',
58
+ * initialData: {
59
+ * prefetchedItems: myPrefetchedPosts,
60
+ * startIndex: 0,
61
+ * startMediaIndex: 0,
62
+ * },
63
+ * loadMore: async () => {
64
+ * // return next chunk of PostPlayerModel[]
65
+ * return await fetchMorePosts();
66
+ * },
67
+ * },
68
+ * analyticsHandler: myAnalyticsHandler,
69
+ * socialInteractionsHandler: mySocialHandler,
70
+ * playerSettings: {
71
+ * locale: 'no',
72
+ * disableBackground: false,
73
+ * hideCloseButton: false,
74
+ * showStreamsCloudWatermark: true,
75
+ * theme: 'dark',
76
+ * },
77
+ * on: {
78
+ * playerClosed: () => console.log('Player closed'),
79
+ * postActivated: (id) => console.log('Activated post', id),
80
+ * },
81
+ * });
82
+ * ```
83
+ */
10
84
  export function openPostsPlayer(init) {
11
- const { postsProvider: dataProvider, mediaCenterConfig, analyticsHandler, socialInteractionsHandler, playerSettings, on } = init;
85
+ const { postsProvider: dataProvider, analyticsHandler, socialInteractionsHandler, playerSettings, on } = init;
12
86
  const shadowHost = new ModalShadowHost();
13
- let mounted;
87
+ let mounted = null;
14
88
  const makeCloseOrchestrator = () => new CloseOrchestrator({
15
89
  closeFn: async () => {
16
90
  await unmount(mounted);
@@ -21,37 +95,18 @@ export function openPostsPlayer(init) {
21
95
  },
22
96
  canClose: !playerSettings?.hideCloseButton
23
97
  });
24
- if (mediaCenterConfig) {
25
- mounted = mount(MediaCenter, {
26
- target: shadowHost.shadowRoot,
27
- props: {
28
- config: mediaCenterConfig,
29
- settings: playerSettings,
30
- modeProps: {
31
- mode: 'posts',
32
- props: {
33
- dataProvider,
34
- onPostActivated: on?.postActivated
35
- }
36
- },
37
- closeOrchestrator: makeCloseOrchestrator()
98
+ mounted = mount(PostsPlayerProxy, {
99
+ target: shadowHost.shadowRoot,
100
+ props: {
101
+ dataProvider,
102
+ socialInteractionsHandler,
103
+ analyticsHandler,
104
+ playerSettings,
105
+ closeOrchestrator: makeCloseOrchestrator(),
106
+ on: {
107
+ postActivated: on?.postActivated
38
108
  }
39
- });
40
- }
41
- else {
42
- mounted = mount(PostsPlayerProxy, {
43
- target: shadowHost.shadowRoot,
44
- props: {
45
- dataProvider,
46
- socialInteractionsHandler,
47
- analyticsHandler,
48
- playerSettings,
49
- closeOrchestrator: makeCloseOrchestrator(),
50
- on: {
51
- postActivated: on?.postActivated
52
- }
53
- }
54
- });
55
- }
109
+ }
110
+ });
56
111
  shadowHost.attachToBody();
57
112
  }
@@ -1,14 +1,23 @@
1
- <script lang="ts">import {} from '../../ui/player/close-orchestrator';
2
- import { WithBackground } from '../../ui/with-background';
1
+ <script lang="ts">import { Theme } from '../../core/theme';
2
+ import {} from '../../ui/player/close-orchestrator';
3
+ import { ShadowRoot } from '../../ui/shadow-dom';
3
4
  import { default as PostsPlayerView } from './posts-player-view.svelte';
5
+ import { untrack } from 'svelte';
4
6
  let { dataProvider, socialInteractionsHandler, closeOrchestrator, playerSettings, analyticsHandler, on } = $props();
5
7
  let backgroundImageUrl = $state(null);
6
8
  const handleBackgroundImagedLoaded = (url) => {
7
9
  backgroundImageUrl = url;
8
10
  };
11
+ $effect(() => {
12
+ void (playerSettings === null || playerSettings === void 0 ? void 0 : playerSettings.theme);
13
+ untrack(() => {
14
+ var _a;
15
+ Theme.set((_a = playerSettings === null || playerSettings === void 0 ? void 0 : playerSettings.theme) !== null && _a !== void 0 ? _a : 'dark');
16
+ });
17
+ });
9
18
  </script>
10
19
 
11
- <WithBackground backgroundDisabled={playerSettings?.disableBackground === true} backgroundImageUrl={backgroundImageUrl}>
20
+ <ShadowRoot backgroundDisabled={playerSettings?.disableBackground === true} backgroundImageUrl={backgroundImageUrl}>
12
21
  <PostsPlayerView
13
22
  dataProvider={{ type: 'provider', provider: dataProvider }}
14
23
  socialInteractionsHandler={socialInteractionsHandler}
@@ -16,4 +25,4 @@ const handleBackgroundImagedLoaded = (url) => {
16
25
  analyticsHandler={analyticsHandler}
17
26
  closeOrchestrator={closeOrchestrator}
18
27
  on={{ postActivated: on?.postActivated, backgroundImageLoaded: playerSettings?.disableBackground === true ? undefined : handleBackgroundImagedLoaded }} />
19
- </WithBackground>
28
+ </ShadowRoot>
@@ -12,6 +12,7 @@ type Props = {
12
12
  locale?: Locale;
13
13
  showStreamsCloudWatermark?: boolean;
14
14
  disableBackground?: boolean;
15
+ theme?: 'light' | 'dark';
15
16
  };
16
17
  on?: {
17
18
  postActivated?: (id: string) => void;
@@ -9,7 +9,7 @@
9
9
  };
10
10
  import { PostType } from '../..';
11
11
  import { ContentPlayer, ContentPlayerConfig } from '../../content-player';
12
- import { ContentPlayerSettings } from '../../content-player/content-player-settings';
12
+ import { ContentPlayerSettings } from '../../content-player/content-player-settings.svelte';
13
13
  import { preloadImage } from '../../core/image-preloader';
14
14
  import { getPostCoverImage } from '../model';
15
15
  import {} from '../../ui/player/providers';
@@ -1,4 +1,5 @@
1
1
  import type { Locale } from '../../core/locale';
2
+ import type { ThemeValue } from '../../core/theme';
2
3
  import type { IPostModel } from '..';
3
4
  import type { IPostSocialInteractionsHandler } from '../social-interactions';
4
5
  import type { ICloseOrchestrator } from '../../ui/player/close-orchestrator';
@@ -36,5 +37,5 @@ export type PostsPlayerProps = {
36
37
  export type PostPlayerSettings = {
37
38
  locale?: Locale;
38
39
  showStreamsCloudWatermark?: boolean;
39
- playerColors?: PlayerColors;
40
+ playerColors?: Record<ThemeValue, PlayerColors>;
40
41
  };