@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
@@ -10,13 +10,18 @@ import IconReOrderDotsHorizontal from '@fluentui/svg-icons/icons/re_order_dots_h
10
10
  import IconScreenSearch from '@fluentui/svg-icons/icons/screen_search_20_regular.svg?raw';
11
11
  import IconSearch from '@fluentui/svg-icons/icons/search_20_regular.svg?raw';
12
12
  const SCROLL_MASK_OFFSET = 32;
13
- let { context, locale = 'en', on } = $props();
14
- const localization = $derived(new MediaCenterHeaderLocalization(locale));
13
+ const HEADER_CONTENT_MAX_WIDTH = 1180;
14
+ const HEADER_SIDE_SPACER_MIN_WIDTH = 30;
15
+ let { context, on, dynamicActions } = $props();
16
+ const localization = $derived(new MediaCenterHeaderLocalization(context.locale));
17
+ let headerRef = $state(null);
15
18
  let scrollAreaRef = $state(null);
16
19
  const headerMounted = (node) => {
20
+ headerRef = node;
17
21
  const heightResizeObserver = new ResizeObserver(() => {
18
22
  const headerHeight = node.clientHeight;
19
23
  on.headerHeightChanged(headerHeight);
24
+ calcHeaderGridProportions();
20
25
  });
21
26
  heightResizeObserver.observe(node);
22
27
  return {
@@ -26,6 +31,62 @@ const headerMounted = (node) => {
26
31
  }
27
32
  };
28
33
  };
34
+ const handleCloseButtonMounted = (_) => {
35
+ calcHeaderGridProportions();
36
+ };
37
+ const handleDynamicActionsMounted = (node) => {
38
+ const resizeObserver = new ResizeObserver(() => {
39
+ calcHeaderGridProportions();
40
+ });
41
+ resizeObserver.observe(node);
42
+ return {
43
+ destroy: () => {
44
+ resizeObserver.disconnect();
45
+ }
46
+ };
47
+ };
48
+ const calcHeaderGridProportions = () => {
49
+ if (!headerRef) {
50
+ return;
51
+ }
52
+ const children = Array.from(headerRef.children);
53
+ if (children.length !== 3) {
54
+ console.warn('Media Center header structure is unexpected. Cannot calculate grid proportions.');
55
+ return;
56
+ }
57
+ const headerWidth = headerRef.clientWidth;
58
+ const minRequiredSpacerWidth = Math.max(HEADER_SIDE_SPACER_MIN_WIDTH, (headerWidth - HEADER_CONTENT_MAX_WIDTH) / 2);
59
+ const calcSpacerMinWidth = (container) => {
60
+ container.style.width = ``;
61
+ const children = Array.from(container.children);
62
+ const { paddingLeft, paddingRight } = window.getComputedStyle(container);
63
+ const paddingsWidth = parseFloat(paddingLeft) + parseFloat(paddingRight);
64
+ if (children.length === 0) {
65
+ return paddingsWidth;
66
+ }
67
+ const containerRect = container.getBoundingClientRect();
68
+ let minLeft = Infinity;
69
+ let maxRight = -Infinity;
70
+ children.forEach((child) => {
71
+ const rect = child.getBoundingClientRect();
72
+ const relativeLeft = rect.left - containerRect.left;
73
+ const relativeRight = rect.right - containerRect.left;
74
+ minLeft = Math.min(minLeft, relativeLeft);
75
+ maxRight = Math.max(maxRight, relativeRight);
76
+ });
77
+ return maxRight - minLeft + paddingsWidth;
78
+ };
79
+ const leftSpacer = children[0];
80
+ const leftSpacerMinWidth = calcSpacerMinWidth(leftSpacer);
81
+ const adjustedLeftSpacerMinWidth = Math.max(leftSpacerMinWidth, minRequiredSpacerWidth);
82
+ const rightSpacer = children[2];
83
+ const rightSpacerMinWidth = calcSpacerMinWidth(rightSpacer);
84
+ const adjustedRightSpacerMinWidth = Math.max(rightSpacerMinWidth, minRequiredSpacerWidth);
85
+ const content = children[1];
86
+ leftSpacer.style.width = `${adjustedLeftSpacerMinWidth}px`;
87
+ rightSpacer.style.width = `${adjustedRightSpacerMinWidth}px`;
88
+ content.style.width = `${headerWidth - adjustedLeftSpacerMinWidth - adjustedRightSpacerMinWidth}px`;
89
+ };
29
90
  const onScrollMounted = (node) => {
30
91
  scrollAreaRef = node;
31
92
  scrollAreaRef.style.setProperty('--scroll-area--mask-offset', `${SCROLL_MASK_OFFSET}px`);
@@ -52,23 +113,26 @@ const updateScrollShadows = (scrollArea) => {
52
113
  scrollArea.classList.toggle('has-both-masks', scrollHasRight && scrollHasLeft);
53
114
  };
54
115
  const styles = $derived.by(() => {
55
- var _a, _b;
56
116
  const values = [];
57
- if ((_a = context.playerColors) === null || _a === void 0 ? void 0 : _a.button) {
58
- values.push(`--media-center-header--button-color: ${context.playerColors.button}`);
117
+ if (context.mediaCenterColors.button) {
118
+ values.push(`--media-center-header--button-color: ${context.mediaCenterColors.button}`);
119
+ }
120
+ if (context.mediaCenterColors.buttonInactive) {
121
+ values.push(`--media-center-header--button-color--inactive: ${context.mediaCenterColors.buttonInactive}`);
59
122
  }
60
- if ((_b = context.playerColors) === null || _b === void 0 ? void 0 : _b.buttonInactive) {
61
- values.push(`--media-center-header--button-color--inactive: ${context.playerColors.buttonInactive}`);
123
+ if (context.mediaCenterColors.brand) {
124
+ values.push(`--media-center-header--button-indicator: ${context.mediaCenterColors.brand}`);
62
125
  }
63
126
  return values.join(';');
64
127
  });
65
128
  </script>
66
129
 
67
130
  <div class="media-center-header-container" use:headerMounted>
131
+ <div class="spacer"></div>
68
132
  <div class="media-center-header" style={styles}>
69
- {#if context.targetData?.logo}
133
+ {#if context.model?.logo}
70
134
  <div class="media-center-header__logo-wrap">
71
- <img src={context.targetData.logo} class="media-center-header__logo" alt={context.targetData?.name} />
135
+ <img src={context.model.logo} class="media-center-header__logo" alt={context.model?.name} />
72
136
  </div>
73
137
  {/if}
74
138
  <button type="button" class="control-button control-button--trigger" class:control-button--active={context.menuActive} onclick={context.toggleMenu}>
@@ -106,7 +170,12 @@ const styles = $derived.by(() => {
106
170
  {localization.buttons.cart}
107
171
  </span>
108
172
  </button>
109
- <button type="button" class="control-button" class:control-button--active={false} onclick={() => ({})}>
173
+ <button
174
+ type="button"
175
+ class="control-button"
176
+ class:control-button--active={context.momentsFeedHandler.active}
177
+ class:control-button--indicator={context.momentsFeedHandler.hasUnwatchedMoments}
178
+ onclick={() => context.playMoments()}>
110
179
  <span class="control-button__value">
111
180
  {localization.buttons.moments}
112
181
  </span>
@@ -138,16 +207,25 @@ const styles = $derived.by(() => {
138
207
  </div>
139
208
  </div>
140
209
  </div>
141
- {#if context.closeOrchestrator.closeTriggerVisible}
142
- <div class="close-button">
143
- <PlayerButton
144
- icon={IconDismiss}
145
- zoom={0.8}
146
- activeColor={context.playerColors?.button ?? null}
147
- inactiveColor={context.playerColors?.buttonInactive ?? null}
148
- on={{ click: context.closeOrchestrator.requestClose }} />
149
- </div>
150
- {/if}
210
+ <div class="spacer spacer--right">
211
+ {#if dynamicActions}
212
+ <div class="dynamic-actions" use:handleDynamicActionsMounted>
213
+ <div class="dynamic-actions__content">
214
+ {@render dynamicActions()}
215
+ </div>
216
+ </div>
217
+ {/if}
218
+ {#if context.closeOrchestrator.closeTriggerVisible}
219
+ <div class="close-button" use:handleCloseButtonMounted>
220
+ <PlayerButton
221
+ icon={IconDismiss}
222
+ zoom={0.8}
223
+ activeColor={context.mediaCenterColors.button}
224
+ inactiveColor={context.mediaCenterColors.buttonInactive}
225
+ on={{ click: context.closeOrchestrator.requestClose }} />
226
+ </div>
227
+ {/if}
228
+ </div>
151
229
  </div>
152
230
 
153
231
  <style>@keyframes fadeIn {
@@ -162,24 +240,30 @@ const styles = $derived.by(() => {
162
240
  }
163
241
  }
164
242
  .media-center-header-container {
165
- padding-top: 2.1875rem;
166
- padding-inline: 4.375rem;
167
- pointer-events: none;
168
243
  z-index: 1;
169
244
  display: flex;
170
- justify-content: center;
171
245
  position: relative;
172
246
  }
173
247
 
248
+ .spacer {
249
+ flex: 1 1 auto;
250
+ display: flex;
251
+ padding-inline: 0.9375rem;
252
+ gap: 0.9375rem;
253
+ }
254
+ .spacer--right {
255
+ justify-content: flex-end;
256
+ }
257
+
174
258
  .media-center-header {
175
- --_media-center-header--button-color: var(--media-center-header--button-color, rgb(from #000000 r g b / 95%));
259
+ --_media-center-header--button-color: var(--media-center-header--button-color, var(--sc-mc-color--button-player));
176
260
  --_media-center-header--button-color--inactive: var(
177
261
  --media-center-header--button-color--inactive,
178
- rgb(from var(--_media-center-header--button-color, #000000) r g b / 60%)
262
+ rgb(from var(--_media-center-header--button-color, var(--sc-mc-color--button-player)) r g b / 60%)
179
263
  );
264
+ --_media-center-header--button-indicator: var(--media-center-header--button-indicator, var(--sc-mc-color--icon-success));
265
+ padding-top: 2.1875rem;
180
266
  width: 73.75rem;
181
- max-width: 100%;
182
- margin: 0 auto;
183
267
  display: flex;
184
268
  align-items: center;
185
269
  gap: 1.5rem;
@@ -264,7 +348,7 @@ const styles = $derived.by(() => {
264
348
  border-radius: 0.875rem;
265
349
  background-color: var(--_media-center-header--button-color--inactive);
266
350
  border-color: var(--_media-center-header--button-color);
267
- color: #f2f2f2;
351
+ color: var(--sc-mc-color--text-inactive);
268
352
  transition: background 0.3s ease-in-out;
269
353
  -webkit-user-drag: none;
270
354
  user-select: none;
@@ -278,21 +362,30 @@ const styles = $derived.by(() => {
278
362
  }
279
363
  .control-button--active {
280
364
  background-color: var(--_media-center-header--button-color);
281
- color: #ffffff;
365
+ color: var(--sc-mc-color--text-white);
366
+ }
367
+ .control-button--indicator::after {
368
+ content: "";
369
+ position: absolute;
370
+ top: 0rem;
371
+ right: 0rem;
372
+ width: 0.875rem;
373
+ height: 0.875rem;
374
+ transform: translate(20%, -20%);
375
+ background-color: var(--_media-center-header--button-indicator);
376
+ border-radius: 50%;
282
377
  }
283
378
  .control-button:hover:not(.control-button--active) {
284
379
  background-color: var(--_media-center-header--button-color);
285
380
  }
286
381
  .control-button__icon {
287
382
  --icon--size: 1rem;
288
- --icon--color: #f2f2f2;
289
383
  line-height: 0;
290
384
  }
291
385
  .control-button__icon--trigger {
292
386
  --icon--size: 1.5rem;
293
387
  }
294
388
  .control-button__icon--active {
295
- --icon--color: #ffffff;
296
389
  --icon--stroke-width: 0.2;
297
390
  }
298
391
  .control-button__value {
@@ -305,9 +398,19 @@ const styles = $derived.by(() => {
305
398
  min-width: 0;
306
399
  }
307
400
 
401
+ .dynamic-actions {
402
+ display: flex;
403
+ padding-top: 2.1875rem;
404
+ }
405
+ .dynamic-actions__content {
406
+ display: flex;
407
+ justify-content: center;
408
+ }
409
+
308
410
  .close-button {
309
- position: absolute;
310
- top: 0.9375rem;
311
- right: 1.25rem;
411
+ justify-self: flex-end;
412
+ flex-shrink: 0;
413
+ padding-block: 0.9375rem;
414
+ padding-right: 0.3125rem;
312
415
  z-index: 1;
313
416
  }</style>
@@ -1,11 +1,11 @@
1
- import type { Locale } from '../../../core/locale';
2
1
  import type { MediaCenterContext } from '../media-center-context.svelte';
2
+ import type { Snippet } from 'svelte';
3
3
  type Props = {
4
4
  context: MediaCenterContext;
5
- locale?: Locale;
6
5
  on: {
7
6
  headerHeightChanged: (height: number) => void;
8
7
  };
8
+ dynamicActions?: Snippet;
9
9
  };
10
10
  declare const MediaCenterHeader: import("svelte").Component<Props, {}, "">;
11
11
  type MediaCenterHeader = ReturnType<typeof MediaCenterHeader>;
@@ -1 +1,2 @@
1
- export { default as MediaCenter } from './cmp.media-center.svelte';
1
+ export { default as MediaCenterProxy } from './cmp.media-center-proxy.svelte';
2
+ export { MediaCenterSettings } from './media-center-settings.svelte';
@@ -1 +1,2 @@
1
- export { default as MediaCenter } from './cmp.media-center.svelte';
1
+ export { default as MediaCenterProxy } from './cmp.media-center-proxy.svelte';
2
+ export { MediaCenterSettings } from './media-center-settings.svelte';
@@ -1,12 +1,13 @@
1
- import type { IContentCategoryFollowingHandler } from '../categories-following/types';
2
- import type { IMediaCenterConfig } from '../config/types';
1
+ import type { IMediaCenterDataProvider } from '../config/types';
3
2
  import type { ICloseOrchestrator } from '../../ui/player/close-orchestrator';
4
3
  import { DiscoverViewHandler } from './discover';
5
4
  import { FeedHandler } from './feed';
6
5
  import { CategoriesHandler, MediaCenterSettingsHandler } from './handlers';
6
+ import type { MediaCenterSettings } from './media-center-settings.svelte';
7
7
  import { PopularStreamsPanelHandler } from './menu';
8
+ import { MomentsFeedHandler } from './moments';
8
9
  import { StreamsInCategoryPanelHandler } from './streams-in-category';
9
- import type { MediaCenterMode, MediaCenterSettings } from './types';
10
+ import type { MediaCenterMode } from './types';
10
11
  export declare class MediaCenterContext {
11
12
  initializing: boolean;
12
13
  initialized: boolean;
@@ -14,32 +15,21 @@ export declare class MediaCenterContext {
14
15
  menuActive: boolean;
15
16
  categoriesHandler: CategoriesHandler;
16
17
  feedHandler: FeedHandler;
18
+ momentsFeedHandler: MomentsFeedHandler;
17
19
  discoverHandler: DiscoverViewHandler;
18
20
  popularStreamsHandler: PopularStreamsPanelHandler;
19
21
  streamsInCategoryHandler: StreamsInCategoryPanelHandler;
20
- categoryFollowingHandler: IContentCategoryFollowingHandler | null;
21
22
  settingsHandler: MediaCenterSettingsHandler;
22
23
  closeOrchestrator: ICloseOrchestrator;
23
- private _mediaCenterConfig;
24
+ private _dataProvider;
24
25
  constructor(data: {
25
- config: IMediaCenterConfig;
26
+ dataProvider: IMediaCenterDataProvider;
26
27
  closeOrchestrator: ICloseOrchestrator;
27
- settings?: MediaCenterSettings;
28
+ settings: MediaCenterSettings;
28
29
  on: MediaCenterContextInitializationCallbacks;
29
30
  });
30
- get targetData(): import("../config/types").MediaCenterTargetDataModel | null;
31
- get playerColors(): {
32
- brand: string | null;
33
- button: string | null;
34
- buttonInactive: string | null;
35
- cardButton: string | null;
36
- cardBackground: string | null;
37
- menuBackground: string | null;
38
- playerBackground: string | null;
39
- price: string | null;
40
- salePrice: string | null;
41
- sidebarBackground: string | null;
42
- } | null;
31
+ get model(): import("../config/types").MediaCenterModel | null;
32
+ get mediaCenterColors(): import("../../ui/player/colors").PlayerColors;
43
33
  get loading(): boolean;
44
34
  get overlayIsActive(): boolean;
45
35
  get backgroundWrapperProps(): {
@@ -48,6 +38,11 @@ export declare class MediaCenterContext {
48
38
  backgroundColor?: string | null;
49
39
  };
50
40
  get feedPlayerProps(): import("./types").PlayerProps | null;
41
+ get momentsPlayerProps(): import("../../posts/posts-player/types").PostsPlayerProps | null;
42
+ get membershipHandler(): import("..").IMediaCenterMembershipHandler | null;
43
+ get navigationHandler(): import("..").IMediaCenterNavigationHandler | null;
44
+ get categoriesFollowingHandler(): import("..").IContentCategoryFollowingHandler | null;
45
+ get locale(): import("../../core/locale").Locale;
51
46
  toggleMenu: () => void;
52
47
  showMenu: () => void;
53
48
  hideMenu: () => void;
@@ -56,6 +51,7 @@ export declare class MediaCenterContext {
56
51
  }) => Promise<void>;
57
52
  playPostsFeed: (options: Parameters<FeedHandler["activatePostsFeed"]>[0]) => Promise<void>;
58
53
  playStreamsFeed: (options: Parameters<FeedHandler["activateStreamsFeed"]>[0]) => Promise<void>;
54
+ playMoments: () => Promise<void>;
59
55
  playRootFeed: () => Promise<void>;
60
56
  tryActivateStreamsInCategory: (categoryId: string) => Promise<void>;
61
57
  private deactivateOtherThanFeed;
@@ -2,6 +2,7 @@ import { DiscoverViewHandler } from './discover';
2
2
  import { FeedHandler } from './feed';
3
3
  import { CategoriesHandler, MediaCenterSettingsHandler } from './handlers';
4
4
  import { PopularStreamsPanelHandler } from './menu';
5
+ import { MomentsFeedHandler } from './moments';
5
6
  import { StreamsInCategoryPanelHandler } from './streams-in-category';
6
7
  export class MediaCenterContext {
7
8
  initializing = $state(true);
@@ -10,35 +11,50 @@ export class MediaCenterContext {
10
11
  if (this.discoverHandler.activated) {
11
12
  return 'discover';
12
13
  }
14
+ if (this.momentsFeedHandler.active) {
15
+ return 'moments';
16
+ }
13
17
  return 'feed';
14
18
  });
15
19
  menuActive = $state(false);
16
- categoriesHandler = new CategoriesHandler();
20
+ categoriesHandler;
17
21
  feedHandler;
22
+ momentsFeedHandler;
18
23
  discoverHandler;
19
24
  popularStreamsHandler;
20
25
  streamsInCategoryHandler;
21
- categoryFollowingHandler = $state.raw(null);
22
26
  settingsHandler;
23
27
  closeOrchestrator;
24
- _mediaCenterConfig = $state.raw(null);
28
+ _dataProvider;
25
29
  constructor(data) {
26
- const { config, closeOrchestrator, settings, on } = data;
30
+ const { dataProvider, closeOrchestrator, settings, on } = data;
31
+ this._dataProvider = dataProvider;
27
32
  this.closeOrchestrator = closeOrchestrator;
28
33
  this.closeOrchestrator.setCloseTriggerAttached(true);
29
- this.settingsHandler = new MediaCenterSettingsHandler(settings);
30
- this.feedHandler = new FeedHandler({ config, mediaCenterSettingsHandler: this.settingsHandler, closeOrchestrator });
31
- this.discoverHandler = new DiscoverViewHandler(config);
32
- this.popularStreamsHandler = new PopularStreamsPanelHandler(config);
33
- this.streamsInCategoryHandler = new StreamsInCategoryPanelHandler(config);
34
- this.categoryFollowingHandler = config.handlers?.categoriesFollowingHandler ?? null;
35
- this.init(config, on);
34
+ this.settingsHandler = new MediaCenterSettingsHandler({ settings, dataProvider });
35
+ this.feedHandler = new FeedHandler({
36
+ dataProvider,
37
+ mediaCenterSettingsHandler: this.settingsHandler,
38
+ closeOrchestrator,
39
+ onPlayerReachedEnd: () => this.activateDiscover({ categoryId: this.categoriesHandler.selectedCategoryId })
40
+ });
41
+ this.categoriesHandler = new CategoriesHandler(dataProvider);
42
+ this.discoverHandler = new DiscoverViewHandler(dataProvider);
43
+ this.popularStreamsHandler = new PopularStreamsPanelHandler(dataProvider);
44
+ this.streamsInCategoryHandler = new StreamsInCategoryPanelHandler(dataProvider);
45
+ this.momentsFeedHandler = new MomentsFeedHandler({
46
+ dataProvider,
47
+ mediaCenterSettingsHandler: this.settingsHandler,
48
+ closeOrchestrator,
49
+ onPlayerReachedEnd: () => this.activateDiscover({ categoryId: this.categoriesHandler.selectedCategoryId })
50
+ });
51
+ this.init(dataProvider, on);
36
52
  }
37
- get targetData() {
38
- return this._mediaCenterConfig?.targetData || null;
53
+ get model() {
54
+ return this._dataProvider.model;
39
55
  }
40
- get playerColors() {
41
- return this._mediaCenterConfig?.playerColors || null;
56
+ get mediaCenterColors() {
57
+ return this.settingsHandler.actualMediaCenterColors;
42
58
  }
43
59
  get loading() {
44
60
  return this.discoverHandler.loading || this.streamsInCategoryHandler.loading;
@@ -52,6 +68,21 @@ export class MediaCenterContext {
52
68
  get feedPlayerProps() {
53
69
  return this.feedHandler.feedPlayerProps;
54
70
  }
71
+ get momentsPlayerProps() {
72
+ return this.momentsFeedHandler.momentsPlayerProps;
73
+ }
74
+ get membershipHandler() {
75
+ return this._dataProvider.handlers?.membershipHandler || null;
76
+ }
77
+ get navigationHandler() {
78
+ return this._dataProvider.handlers?.navigationHandler || null;
79
+ }
80
+ get categoriesFollowingHandler() {
81
+ return this._dataProvider.handlers?.categoriesFollowingHandler || null;
82
+ }
83
+ get locale() {
84
+ return this.settingsHandler.locale;
85
+ }
55
86
  toggleMenu = () => {
56
87
  if (this.menuActive) {
57
88
  this.hideMenu();
@@ -71,6 +102,7 @@ export class MediaCenterContext {
71
102
  this.settingsHandler.updateBackgroundImageUrl('not-applicable');
72
103
  this.hideMenu();
73
104
  this.feedHandler.deactivate();
105
+ this.momentsFeedHandler.deactivate();
74
106
  this.streamsInCategoryHandler.deactivate();
75
107
  this.categoriesHandler.selectedCategoryId = options.categoryId;
76
108
  const childCategories = this.categoriesHandler.allCategories.filter((c) => c.parentId === this.categoriesHandler.selectedCategoryId);
@@ -89,6 +121,16 @@ export class MediaCenterContext {
89
121
  this.categoriesHandler.selectedCategoryId = options.filter?.categoryId ?? null;
90
122
  this.feedHandler.activateStreamsFeed(options);
91
123
  };
124
+ playMoments = async () => {
125
+ if (!this.momentsFeedHandler.hasMoments) {
126
+ return;
127
+ }
128
+ this.hideMenu();
129
+ this.feedHandler.deactivate();
130
+ this.discoverHandler.deactivate();
131
+ this.streamsInCategoryHandler.deactivate();
132
+ this.momentsFeedHandler.activateMoments();
133
+ };
92
134
  playRootFeed = async () => {
93
135
  this.deactivateOtherThanFeed();
94
136
  this.categoriesHandler.selectedCategoryId = null;
@@ -104,23 +146,23 @@ export class MediaCenterContext {
104
146
  await this.streamsInCategoryHandler.activate(selectedCategoryData);
105
147
  this.hideMenu();
106
148
  this.feedHandler.deactivate();
149
+ this.momentsFeedHandler.deactivate();
107
150
  this.discoverHandler.deactivate();
108
151
  this.categoriesHandler.selectedCategoryId = categoryId;
109
152
  };
110
153
  deactivateOtherThanFeed = () => {
111
154
  this.hideMenu();
155
+ this.momentsFeedHandler.deactivate();
112
156
  this.discoverHandler.deactivate();
113
157
  this.streamsInCategoryHandler.deactivate();
114
158
  };
115
159
  init = async (config, on) => {
116
160
  try {
117
- this._mediaCenterConfig = await config.getConfig();
118
- if (!this._mediaCenterConfig) {
161
+ const configModel = await config.fetchModel();
162
+ if (!configModel) {
119
163
  on.failed();
120
164
  return;
121
165
  }
122
- this.categoriesHandler.init({ categories: this._mediaCenterConfig.contentCategories, tagAssociations: this._mediaCenterConfig.categoryTagAssociations });
123
- this.settingsHandler.updatePlayerColors(this._mediaCenterConfig.playerColors);
124
166
  on.initialized(this);
125
167
  this.initialized = true;
126
168
  }
@@ -0,0 +1,11 @@
1
+ import type { Locale } from '../../core/locale';
2
+ import type { ThemeValue } from '../../core/theme';
3
+ import type { IMediaCenterSettings } from './types';
4
+ export declare class MediaCenterSettings {
5
+ locale: Locale;
6
+ showStreamsCloudWatermark: boolean;
7
+ disableBackground: boolean;
8
+ theme: ThemeValue;
9
+ constructor(init: IMediaCenterSettings | undefined);
10
+ patch: (data: Partial<IMediaCenterSettings> | undefined) => void;
11
+ }
@@ -0,0 +1,23 @@
1
+ export class MediaCenterSettings {
2
+ locale = $state('en');
3
+ showStreamsCloudWatermark = $state(true);
4
+ disableBackground = $state(false);
5
+ theme = $state('dark');
6
+ constructor(init) {
7
+ this.patch(init);
8
+ }
9
+ patch = (data) => {
10
+ if (data?.locale !== undefined) {
11
+ this.locale = data.locale;
12
+ }
13
+ if (data?.showStreamsCloudWatermark !== undefined) {
14
+ this.showStreamsCloudWatermark = data.showStreamsCloudWatermark;
15
+ }
16
+ if (data?.disableBackground !== undefined) {
17
+ this.disableBackground = data.disableBackground;
18
+ }
19
+ if (data?.theme !== undefined) {
20
+ this.theme = data.theme;
21
+ }
22
+ };
23
+ }