@streamscloud/embeddable 11.0.0 → 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 (174) hide show
  1. package/dist/ads/ad-card/cmp.ad-card.svelte +4 -4
  2. package/dist/ads/ad-card/cmp.ad-card.svelte.d.ts +2 -0
  3. package/dist/content-player/cmp.content-player.svelte +63 -128
  4. package/dist/content-player/content-player-config.svelte.d.ts +3 -10
  5. package/dist/content-player/content-player-config.svelte.js +3 -21
  6. package/dist/content-player/content-player-settings.d.ts +7 -21
  7. package/dist/content-player/content-player-settings.js +0 -4
  8. package/dist/content-player/controls-and-attachments.svelte +39 -5
  9. package/dist/content-player/overview-panel.svelte +14 -6
  10. package/dist/content-player/overview-panel.svelte.d.ts +5 -1
  11. package/dist/content-player/ui-manager.svelte.d.ts +0 -2
  12. package/dist/content-player/ui-manager.svelte.js +0 -2
  13. package/dist/media-center/config/internal-media-center-config.d.ts +7 -3
  14. package/dist/media-center/config/internal-media-center-config.js +27 -24
  15. package/dist/media-center/config/operations.generated.d.ts +10 -3
  16. package/dist/media-center/config/operations.generated.js +17 -6
  17. package/dist/media-center/config/operations.graphql +11 -4
  18. package/dist/media-center/config/types.d.ts +5 -2
  19. package/dist/media-center/media-center/cmp.media-center.svelte +195 -149
  20. package/dist/media-center/media-center/cmp.media-center.svelte.d.ts +2 -19
  21. package/dist/media-center/media-center/discover/data-loading.d.ts +8 -0
  22. package/dist/media-center/media-center/discover/data-loading.js +35 -0
  23. package/dist/media-center/media-center/discover/discover-header-localization.d.ts +6 -0
  24. package/dist/media-center/media-center/discover/discover-header-localization.js +15 -0
  25. package/dist/media-center/media-center/discover/discover-header.svelte +214 -0
  26. package/dist/media-center/media-center/discover/discover-header.svelte.d.ts +9 -0
  27. package/dist/media-center/media-center/discover/discover-view-handler.svelte.d.ts +28 -0
  28. package/dist/media-center/media-center/discover/discover-view-handler.svelte.js +101 -0
  29. package/dist/media-center/media-center/discover/discover-view-localization.d.ts +6 -0
  30. package/dist/media-center/media-center/discover/discover-view-localization.js +15 -0
  31. package/dist/media-center/media-center/discover/discover-view.svelte +238 -0
  32. package/dist/media-center/media-center/discover/{discover-panel.svelte.d.ts → discover-view.svelte.d.ts} +4 -4
  33. package/dist/media-center/media-center/discover/index.d.ts +2 -2
  34. package/dist/media-center/media-center/discover/index.js +2 -2
  35. package/dist/media-center/media-center/discover/types.svelte.d.ts +20 -0
  36. package/dist/media-center/media-center/discover/types.svelte.js +20 -0
  37. package/dist/media-center/media-center/feed/feed-handler.svelte.d.ts +50 -0
  38. package/dist/media-center/media-center/feed/feed-handler.svelte.js +84 -0
  39. package/dist/media-center/media-center/feed/feed-providers-generator.d.ts +11 -0
  40. package/dist/media-center/media-center/feed/feed-providers-generator.js +79 -0
  41. package/dist/media-center/media-center/feed/index.d.ts +1 -0
  42. package/dist/media-center/media-center/feed/index.js +1 -0
  43. package/dist/media-center/media-center/feed/types.d.ts +12 -0
  44. package/dist/media-center/media-center/handlers/categories-handler.svelte.d.ts +9 -3
  45. package/dist/media-center/media-center/handlers/categories-handler.svelte.js +7 -4
  46. package/dist/media-center/media-center/handlers/index.d.ts +1 -1
  47. package/dist/media-center/media-center/handlers/index.js +1 -1
  48. package/dist/media-center/media-center/handlers/media-center-settings-handler.svelte.d.ts +19 -0
  49. package/dist/media-center/media-center/handlers/media-center-settings-handler.svelte.js +26 -0
  50. package/dist/media-center/media-center/header-footer/media-center-footer.svelte +3 -7
  51. package/dist/media-center/media-center/header-footer/media-center-header-localization.d.ts +1 -0
  52. package/dist/media-center/media-center/header-footer/media-center-header-localization.js +6 -0
  53. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte +25 -36
  54. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte.d.ts +2 -1
  55. package/dist/media-center/media-center/header-footer/media-center-header.svelte +14 -11
  56. package/dist/media-center/media-center/header-footer/media-center-header.svelte.d.ts +1 -2
  57. package/dist/media-center/media-center/media-center-context.svelte.d.ts +31 -13
  58. package/dist/media-center/media-center/media-center-context.svelte.js +71 -35
  59. package/dist/media-center/media-center/menu/menu-localization.d.ts +2 -11
  60. package/dist/media-center/media-center/menu/menu-localization.js +6 -45
  61. package/dist/media-center/media-center/menu/menu.svelte +31 -23
  62. package/dist/media-center/media-center/menu/menu.svelte.d.ts +1 -1
  63. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.d.ts +1 -1
  64. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.js +0 -3
  65. package/dist/media-center/media-center/moments/cmp.moments-circle.svelte +41 -0
  66. package/dist/media-center/media-center/moments/cmp.moments-circle.svelte.d.ts +7 -0
  67. package/dist/media-center/media-center/moments/index.d.ts +1 -0
  68. package/dist/media-center/media-center/moments/index.js +1 -0
  69. package/dist/media-center/media-center/streams-in-category/streams-in-category-panel-handler.svelte.d.ts +1 -1
  70. package/dist/media-center/media-center/streams-in-category/streams-in-category-panel-handler.svelte.js +1 -1
  71. package/dist/media-center/media-center/types.d.ts +44 -1
  72. package/dist/media-page/index.d.ts +121 -0
  73. package/dist/media-page/index.js +43 -0
  74. package/dist/posts/attachments/cmp.attachments.svelte +1 -0
  75. package/dist/posts/controls/cmp.controls.svelte +50 -13
  76. package/dist/posts/data-loaders/operations.generated.d.ts +4 -0
  77. package/dist/posts/data-loaders/operations.generated.js +6 -2
  78. package/dist/posts/model/types.d.ts +2 -0
  79. package/dist/posts/post-viewer/cmp.post-viewer.svelte +26 -18
  80. package/dist/posts/post-viewer/mapper.js +2 -0
  81. package/dist/posts/post-viewer/operations.generated.d.ts +2 -0
  82. package/dist/posts/post-viewer/operations.generated.js +3 -1
  83. package/dist/posts/post-viewer/operations.graphql +2 -0
  84. package/dist/posts/post-viewer/post-texts.svelte +3 -3
  85. package/dist/posts/posts-player/cmp.posts-player.svelte +20 -6
  86. package/dist/posts/posts-player/cmp.posts-player.svelte.d.ts +18 -2
  87. package/dist/posts/posts-player/index.d.ts +18 -3
  88. package/dist/posts/posts-player/index.js +42 -89
  89. package/dist/posts/posts-player/posts-player-proxy.svelte +19 -0
  90. package/dist/posts/posts-player/posts-player-proxy.svelte.d.ts +22 -0
  91. package/dist/posts/posts-player/posts-player-view.svelte +20 -34
  92. package/dist/posts/posts-player/posts-player-view.svelte.d.ts +2 -6
  93. package/dist/posts/posts-player/types.d.ts +19 -6
  94. package/dist/products/product-card/cmp.product-card.svelte +5 -5
  95. package/dist/products/product-card/cmp.product-card.svelte.d.ts +1 -1
  96. package/dist/short-videos/short-video-card/cmp.short-video-card.svelte +160 -19
  97. package/dist/short-videos/short-video-card/cmp.short-video-card.svelte.d.ts +2 -1
  98. package/dist/short-videos/short-video-card/localization.d.ts +5 -0
  99. package/dist/short-videos/short-video-card/localization.js +13 -0
  100. package/dist/short-videos/short-video-card/types.d.ts +4 -0
  101. package/dist/short-videos/short-videos-player/index.js +26 -33
  102. package/dist/streams/layout/element-views/cmp.stream-element.svelte +2 -2
  103. package/dist/streams/layout/element-views/cmp.text-ref-stream-element.svelte +7 -3
  104. package/dist/streams/layout/element-views/cmp.text-ref-stream-element.svelte.d.ts +2 -0
  105. package/dist/streams/layout/element-views/cmp.text-stream-element.svelte +7 -3
  106. package/dist/streams/layout/element-views/cmp.text-stream-element.svelte.d.ts +2 -0
  107. package/dist/streams/layout/element-views/price-element-view.svelte +2 -2
  108. package/dist/streams/layout/element-views/price-stream-element-localization.d.ts +1 -1
  109. package/dist/streams/layout/element-views/price-stream-element-localization.js +2 -2
  110. package/dist/streams/layout/models/mapper.js +2 -0
  111. package/dist/streams/streams-player/index.d.ts +21 -2
  112. package/dist/streams/streams-player/index.js +49 -24
  113. package/dist/streams/streams-player/stream-overview.svelte +1 -1
  114. package/dist/streams/streams-player/streams-player-buffer.svelte.d.ts +1 -3
  115. package/dist/streams/streams-player/streams-player-buffer.svelte.js +2 -2
  116. package/dist/streams/streams-player/streams-player-view.svelte +25 -21
  117. package/dist/streams/streams-player/streams-player-view.svelte.d.ts +1 -5
  118. package/dist/streams/streams-player/types.d.ts +18 -4
  119. package/dist/ui/line-clamp/cmp.line-clamp-auto.svelte +119 -0
  120. package/dist/ui/line-clamp/cmp.line-clamp-auto.svelte.d.ts +10 -0
  121. package/dist/ui/line-clamp/cmp.line-clamp.svelte +44 -72
  122. package/dist/ui/line-clamp/cmp.line-clamp.svelte.d.ts +3 -4
  123. package/dist/ui/line-clamp/index.d.ts +1 -0
  124. package/dist/ui/line-clamp/index.js +1 -0
  125. package/dist/ui/player/button/cmp.mobile-player-buttons-group.svelte +44 -0
  126. package/dist/ui/player/button/cmp.mobile-player-buttons-group.svelte.d.ts +7 -0
  127. package/dist/ui/player/button/cmp.player-button.svelte +0 -1
  128. package/dist/ui/player/button/cmp.player-buttons-group.svelte +15 -11
  129. package/dist/ui/player/button/cmp.player-buttons-group.svelte.d.ts +1 -1
  130. package/dist/ui/player/button/index.d.ts +1 -0
  131. package/dist/ui/player/button/index.js +1 -0
  132. package/dist/ui/player/button/types.d.ts +0 -2
  133. package/dist/ui/player/close-orchestrator/close-orchestrator.svelte.d.ts +18 -0
  134. package/dist/ui/player/close-orchestrator/close-orchestrator.svelte.js +58 -0
  135. package/dist/ui/player/close-orchestrator/index.d.ts +2 -0
  136. package/dist/ui/player/close-orchestrator/index.js +1 -0
  137. package/dist/ui/player/close-orchestrator/types.d.ts +9 -0
  138. package/dist/ui/player/close-orchestrator/types.js +1 -0
  139. package/dist/ui/player/colors/index.d.ts +1 -0
  140. package/dist/ui/player/colors/index.js +1 -0
  141. package/dist/ui/player/colors/player-colors.d.ts +11 -0
  142. package/dist/ui/player/colors/player-colors.js +1 -0
  143. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.d.ts +2 -6
  144. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.js +11 -11
  145. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.d.ts +2 -3
  146. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.js +5 -5
  147. package/dist/ui/player/providers/default-feed-player-buffer.svelte.d.ts +3 -4
  148. package/dist/ui/player/providers/default-feed-player-buffer.svelte.js +16 -9
  149. package/dist/ui/player/providers/service.d.ts +2 -0
  150. package/dist/ui/player/providers/service.js +13 -0
  151. package/dist/ui/player/providers/types.d.ts +1 -0
  152. package/dist/ui/with-background/cmp.with-background.svelte +86 -0
  153. package/dist/ui/with-background/cmp.with-background.svelte.d.ts +10 -0
  154. package/dist/ui/with-background/index.d.ts +1 -0
  155. package/dist/ui/with-background/index.js +1 -0
  156. package/package.json +5 -1
  157. package/dist/content-player/fade-mixins.scss +0 -12
  158. package/dist/content-player/header.svelte +0 -15
  159. package/dist/content-player/header.svelte.d.ts +0 -28
  160. package/dist/media-center/media-center/discover/discover-panel-handler.svelte.d.ts +0 -31
  161. package/dist/media-center/media-center/discover/discover-panel-handler.svelte.js +0 -94
  162. package/dist/media-center/media-center/discover/discover-panel-localization.d.ts +0 -19
  163. package/dist/media-center/media-center/discover/discover-panel-localization.js +0 -78
  164. package/dist/media-center/media-center/discover/discover-panel.svelte +0 -142
  165. package/dist/media-center/media-center/handlers/feed-handler.svelte.d.ts +0 -6
  166. package/dist/media-center/media-center/handlers/feed-handler.svelte.js +0 -12
  167. package/dist/media-center/media-center/providers/index.d.ts +0 -2
  168. package/dist/media-center/media-center/providers/index.js +0 -2
  169. package/dist/media-center/media-center/providers/post-player-provider-generator.d.ts +0 -8
  170. package/dist/media-center/media-center/providers/post-player-provider-generator.js +0 -32
  171. package/dist/media-center/media-center/providers/streams-player-provider-generator.d.ts +0 -8
  172. package/dist/media-center/media-center/providers/streams-player-provider-generator.js +0 -36
  173. package/dist/media-center/model/types.d.ts +0 -17
  174. /package/dist/media-center/{model → media-center/feed}/types.js +0 -0
@@ -10,7 +10,7 @@ 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, closeFn, on } = $props();
13
+ let { context, locale = 'en', on } = $props();
14
14
  const localization = $derived(new MediaCenterHeaderLocalization(locale));
15
15
  let scrollAreaRef = $state(null);
16
16
  const headerMounted = (node) => {
@@ -66,9 +66,9 @@ const styles = $derived.by(() => {
66
66
 
67
67
  <div class="media-center-header-container" use:headerMounted>
68
68
  <div class="media-center-header" style={styles}>
69
- {#if context.logo}
69
+ {#if context.targetData?.logo}
70
70
  <div class="media-center-header__logo-wrap">
71
- <img src={context.logo} class="media-center-header__logo" alt={context.targetData?.name} />
71
+ <img src={context.targetData.logo} class="media-center-header__logo" alt={context.targetData?.name} />
72
72
  </div>
73
73
  {/if}
74
74
  <button type="button" class="control-button control-button--trigger" class:control-button--active={context.menuActive} onclick={context.toggleMenu}>
@@ -78,7 +78,7 @@ const styles = $derived.by(() => {
78
78
  </button>
79
79
  <div class="media-center-header__scroll-area" use:onScrollMounted use:horizontalWheelScroll onscroll={handleScrollingAreaScroll}>
80
80
  <div class="media-center-header__scroll-area-block">
81
- <button type="button" class="control-button" class:control-button--active={context.feedHandler.active} onclick={() => context.activateFeed()}>
81
+ <button type="button" class="control-button" class:control-button--active={context.feedHandler.active} onclick={() => context.playRootFeed()}>
82
82
  <span class="control-button__icon" class:control-button__icon--active={context.feedHandler.active}>
83
83
  <Icon src={IconPhone} />
84
84
  </span>
@@ -86,7 +86,11 @@ const styles = $derived.by(() => {
86
86
  {localization.buttons.feed}
87
87
  </span>
88
88
  </button>
89
- <button type="button" class="control-button" class:control-button--active={context.discoverHandler.activated} onclick={context.activateDiscover}>
89
+ <button
90
+ type="button"
91
+ class="control-button"
92
+ class:control-button--active={context.discoverHandler.activated}
93
+ onclick={() => context.activateDiscover({ categoryId: null })}>
90
94
  <span class="control-button__icon" class:control-button__icon--active={context.discoverHandler.activated}>
91
95
  <Icon src={IconScreenSearch} />
92
96
  </span>
@@ -134,14 +138,14 @@ const styles = $derived.by(() => {
134
138
  </div>
135
139
  </div>
136
140
  </div>
137
- {#if closeFn}
141
+ {#if context.closeOrchestrator.closeTriggerVisible}
138
142
  <div class="close-button">
139
143
  <PlayerButton
140
144
  icon={IconDismiss}
141
145
  zoom={0.8}
142
146
  activeColor={context.playerColors?.button ?? null}
143
147
  inactiveColor={context.playerColors?.buttonInactive ?? null}
144
- on={{ click: closeFn }} />
148
+ on={{ click: context.closeOrchestrator.requestClose }} />
145
149
  </div>
146
150
  {/if}
147
151
  </div>
@@ -192,10 +196,11 @@ const styles = $derived.by(() => {
192
196
  display: flex;
193
197
  align-items: center;
194
198
  justify-content: center;
195
- height: 3.125rem;
199
+ height: 2.9375rem;
196
200
  max-width: 11.25rem;
197
201
  min-width: 0;
198
202
  overflow: hidden;
203
+ flex-shrink: 0;
199
204
  }
200
205
  .media-center-header__logo {
201
206
  width: auto;
@@ -217,8 +222,7 @@ const styles = $derived.by(() => {
217
222
  flex-wrap: nowrap;
218
223
  mask-image: none;
219
224
  scrollbar-width: none;
220
- padding: 0.5rem 0.625rem;
221
- padding-left: 0;
225
+ padding-block: 0.5rem;
222
226
  --_scroll-area--mask-offset--left: var(--scroll-area--mask-offset);
223
227
  --_scroll-area--mask-offset--right: calc(100% - var(--scroll-area--mask-offset));
224
228
  }
@@ -275,7 +279,6 @@ const styles = $derived.by(() => {
275
279
  .control-button--active {
276
280
  background-color: var(--_media-center-header--button-color);
277
281
  color: #ffffff;
278
- text-shadow: 0.001em 0 0 currentColor, -0.001em 0 0 currentColor, 0 0.001em 0 currentColor, 0 -0.001em 0 currentColor;
279
282
  }
280
283
  .control-button:hover:not(.control-button--active) {
281
284
  background-color: var(--_media-center-header--button-color);
@@ -2,8 +2,7 @@ import type { Locale } from '../../../core/locale';
2
2
  import type { MediaCenterContext } from '../media-center-context.svelte';
3
3
  type Props = {
4
4
  context: MediaCenterContext;
5
- locale: Locale;
6
- closeFn: (() => void) | null;
5
+ locale?: Locale;
7
6
  on: {
8
7
  headerHeightChanged: (height: number) => void;
9
8
  };
@@ -1,28 +1,32 @@
1
1
  import type { IContentCategoryFollowingHandler } from '../categories-following/types';
2
2
  import type { IMediaCenterConfig } from '../config/types';
3
- import { DiscoverPanelHandler } from './discover';
4
- import { CategoriesHandler, FeedHandler } from './handlers';
3
+ import type { ICloseOrchestrator } from '../../ui/player/close-orchestrator';
4
+ import { DiscoverViewHandler } from './discover';
5
+ import { FeedHandler } from './feed';
6
+ import { CategoriesHandler, MediaCenterSettingsHandler } from './handlers';
5
7
  import { PopularStreamsPanelHandler } from './menu';
6
8
  import { StreamsInCategoryPanelHandler } from './streams-in-category';
9
+ import type { MediaCenterMode, MediaCenterSettings } from './types';
7
10
  export declare class MediaCenterContext {
8
11
  initializing: boolean;
12
+ initialized: boolean;
13
+ readonly mediaCenterMode: MediaCenterMode;
9
14
  menuActive: boolean;
10
15
  categoriesHandler: CategoriesHandler;
11
16
  feedHandler: FeedHandler;
12
- discoverHandler: DiscoverPanelHandler;
17
+ discoverHandler: DiscoverViewHandler;
13
18
  popularStreamsHandler: PopularStreamsPanelHandler;
14
19
  streamsInCategoryHandler: StreamsInCategoryPanelHandler;
15
20
  categoryFollowingHandler: IContentCategoryFollowingHandler | null;
21
+ settingsHandler: MediaCenterSettingsHandler;
22
+ closeOrchestrator: ICloseOrchestrator;
16
23
  private _mediaCenterConfig;
17
24
  constructor(data: {
18
- config: IMediaCenterConfig | null;
19
- followingHandler: IContentCategoryFollowingHandler | null | undefined;
20
- on: {
21
- initialized: () => void;
22
- };
25
+ config: IMediaCenterConfig;
26
+ closeOrchestrator: ICloseOrchestrator;
27
+ settings?: MediaCenterSettings;
28
+ on: MediaCenterContextInitializationCallbacks;
23
29
  });
24
- get mediaCenterEffective(): boolean;
25
- get logo(): string | null;
26
30
  get targetData(): import("../config/types").MediaCenterTargetDataModel | null;
27
31
  get playerColors(): {
28
32
  brand: string | null;
@@ -38,13 +42,27 @@ export declare class MediaCenterContext {
38
42
  } | null;
39
43
  get loading(): boolean;
40
44
  get overlayIsActive(): boolean;
45
+ get backgroundWrapperProps(): {
46
+ backgroundDisabled: boolean;
47
+ backgroundImageUrl: string | null;
48
+ backgroundColor?: string | null;
49
+ };
50
+ get feedPlayerProps(): import("./types").PlayerProps | null;
41
51
  toggleMenu: () => void;
42
52
  showMenu: () => void;
43
53
  hideMenu: () => void;
44
- activateDiscover: () => Promise<void>;
45
- activateFeed: (options?: {
46
- categoryId?: string | null;
54
+ activateDiscover: (options: {
55
+ categoryId: string | null;
47
56
  }) => Promise<void>;
57
+ playPostsFeed: (options: Parameters<FeedHandler["activatePostsFeed"]>[0]) => Promise<void>;
58
+ playStreamsFeed: (options: Parameters<FeedHandler["activateStreamsFeed"]>[0]) => Promise<void>;
59
+ playRootFeed: () => Promise<void>;
48
60
  tryActivateStreamsInCategory: (categoryId: string) => Promise<void>;
61
+ private deactivateOtherThanFeed;
49
62
  private init;
50
63
  }
64
+ type MediaCenterContextInitializationCallbacks = {
65
+ initialized: (instance: MediaCenterContext) => void;
66
+ failed: () => void;
67
+ };
68
+ export {};
@@ -1,30 +1,38 @@
1
- import { DiscoverPanelHandler } from './discover';
2
- import { CategoriesHandler, FeedHandler } from './handlers';
1
+ import { DiscoverViewHandler } from './discover';
2
+ import { FeedHandler } from './feed';
3
+ import { CategoriesHandler, MediaCenterSettingsHandler } from './handlers';
3
4
  import { PopularStreamsPanelHandler } from './menu';
4
5
  import { StreamsInCategoryPanelHandler } from './streams-in-category';
5
6
  export class MediaCenterContext {
6
7
  initializing = $state(true);
8
+ initialized = $state(false);
9
+ mediaCenterMode = $derived.by(() => {
10
+ if (this.discoverHandler.activated) {
11
+ return 'discover';
12
+ }
13
+ return 'feed';
14
+ });
7
15
  menuActive = $state(false);
8
16
  categoriesHandler = new CategoriesHandler();
9
- feedHandler = new FeedHandler();
17
+ feedHandler;
10
18
  discoverHandler;
11
19
  popularStreamsHandler;
12
20
  streamsInCategoryHandler;
13
21
  categoryFollowingHandler = $state.raw(null);
22
+ settingsHandler;
23
+ closeOrchestrator;
14
24
  _mediaCenterConfig = $state.raw(null);
15
25
  constructor(data) {
16
- const { config, followingHandler, on } = data;
17
- this.discoverHandler = new DiscoverPanelHandler(config);
26
+ const { config, closeOrchestrator, settings, on } = data;
27
+ this.closeOrchestrator = closeOrchestrator;
28
+ 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);
18
32
  this.popularStreamsHandler = new PopularStreamsPanelHandler(config);
19
33
  this.streamsInCategoryHandler = new StreamsInCategoryPanelHandler(config);
20
- this.categoryFollowingHandler = followingHandler || null;
21
- this.init(config, on.initialized);
22
- }
23
- get mediaCenterEffective() {
24
- return !this.initializing && this.categoriesHandler.categories.length > 0;
25
- }
26
- get logo() {
27
- return this._mediaCenterConfig?.logo || null;
34
+ this.categoryFollowingHandler = config.handlers?.categoriesFollowingHandler ?? null;
35
+ this.init(config, on);
28
36
  }
29
37
  get targetData() {
30
38
  return this._mediaCenterConfig?.targetData || null;
@@ -36,7 +44,13 @@ export class MediaCenterContext {
36
44
  return this.discoverHandler.loading || this.streamsInCategoryHandler.loading;
37
45
  }
38
46
  get overlayIsActive() {
39
- return this.discoverHandler.activated || this.streamsInCategoryHandler.activated;
47
+ return this.streamsInCategoryHandler.activated;
48
+ }
49
+ get backgroundWrapperProps() {
50
+ return this.settingsHandler.backgroundWrapperProps;
51
+ }
52
+ get feedPlayerProps() {
53
+ return this.feedHandler.feedPlayerProps;
40
54
  }
41
55
  toggleMenu = () => {
42
56
  if (this.menuActive) {
@@ -53,26 +67,39 @@ export class MediaCenterContext {
53
67
  hideMenu = () => {
54
68
  this.menuActive = false;
55
69
  };
56
- activateDiscover = async () => {
70
+ activateDiscover = async (options) => {
71
+ this.settingsHandler.updateBackgroundImageUrl('not-applicable');
57
72
  this.hideMenu();
58
73
  this.feedHandler.deactivate();
59
74
  this.streamsInCategoryHandler.deactivate();
60
- await this.discoverHandler.activate();
75
+ this.categoriesHandler.selectedCategoryId = options.categoryId;
76
+ const childCategories = this.categoriesHandler.allCategories.filter((c) => c.parentId === this.categoriesHandler.selectedCategoryId);
77
+ await this.discoverHandler.activate({
78
+ activeCategoryId: this.categoriesHandler.selectedCategoryId,
79
+ childCategories: childCategories.map((c) => ({ id: c.id, name: c.name }))
80
+ });
61
81
  };
62
- activateFeed = async (options) => {
63
- this.hideMenu();
64
- this.feedHandler.activate();
65
- this.discoverHandler.deactivate();
66
- this.streamsInCategoryHandler.deactivate();
67
- if (options?.categoryId !== undefined) {
68
- this.categoriesHandler.selectedCategoryId = options.categoryId;
82
+ playPostsFeed = async (options) => {
83
+ this.deactivateOtherThanFeed();
84
+ this.categoriesHandler.selectedCategoryId = options.filter?.categoryId ?? null;
85
+ this.feedHandler.activatePostsFeed(options);
86
+ };
87
+ playStreamsFeed = async (options) => {
88
+ this.deactivateOtherThanFeed();
89
+ this.categoriesHandler.selectedCategoryId = options.filter?.categoryId ?? null;
90
+ this.feedHandler.activateStreamsFeed(options);
91
+ };
92
+ playRootFeed = async () => {
93
+ this.deactivateOtherThanFeed();
94
+ this.categoriesHandler.selectedCategoryId = null;
95
+ if (this.feedPlayerProps?.type === 'streams') {
96
+ this.feedHandler.activateStreamsFeed({});
97
+ }
98
+ else {
99
+ this.feedHandler.activatePostsFeed({});
69
100
  }
70
101
  };
71
102
  tryActivateStreamsInCategory = async (categoryId) => {
72
- if (this.categoriesHandler.selectedCategoryId === categoryId) {
73
- this.activateFeed({ categoryId: null });
74
- return;
75
- }
76
103
  const selectedCategoryData = this.categoriesHandler.getCategoryData(categoryId);
77
104
  await this.streamsInCategoryHandler.activate(selectedCategoryData);
78
105
  this.hideMenu();
@@ -80,19 +107,28 @@ export class MediaCenterContext {
80
107
  this.discoverHandler.deactivate();
81
108
  this.categoriesHandler.selectedCategoryId = categoryId;
82
109
  };
83
- init = async (config, onInitilized) => {
84
- if (!config) {
85
- this.initializing = false;
86
- onInitilized();
87
- return;
88
- }
110
+ deactivateOtherThanFeed = () => {
111
+ this.hideMenu();
112
+ this.discoverHandler.deactivate();
113
+ this.streamsInCategoryHandler.deactivate();
114
+ };
115
+ init = async (config, on) => {
89
116
  try {
90
117
  this._mediaCenterConfig = await config.getConfig();
91
- this.categoriesHandler.init(this._mediaCenterConfig?.contentCategories || []);
118
+ if (!this._mediaCenterConfig) {
119
+ on.failed();
120
+ return;
121
+ }
122
+ this.categoriesHandler.init(this._mediaCenterConfig.contentCategories);
123
+ this.settingsHandler.updatePlayerColors(this._mediaCenterConfig.playerColors);
124
+ on.initialized(this);
125
+ this.initialized = true;
126
+ }
127
+ catch {
128
+ on.failed();
92
129
  }
93
130
  finally {
94
131
  this.initializing = false;
95
- onInitilized();
96
132
  }
97
133
  };
98
134
  }
@@ -1,18 +1,9 @@
1
1
  import { type Locale } from '../../../core/locale';
2
2
  export declare class MenuLocalization {
3
- buttons: {
4
- cart: string;
5
- discover: string;
6
- feed: string;
7
- login: string;
8
- moments: string;
9
- webpage: string;
10
- };
11
- shortVideosSectionTitle: string;
12
3
  interestsSectionTitle: string;
13
- latestStreamsSectionTitle: string;
14
4
  popularStreamsSectionTitle: string;
15
- overviewLabel: string;
5
+ discoverLabel: string;
6
+ feedLabel: string;
16
7
  membersLabel: (count: number) => string;
17
8
  locale: Locale;
18
9
  constructor(locale: Locale);
@@ -1,76 +1,37 @@
1
1
  import {} from '../../../core/locale';
2
2
  export class MenuLocalization {
3
- buttons;
4
- shortVideosSectionTitle;
5
3
  interestsSectionTitle;
6
- latestStreamsSectionTitle;
7
4
  popularStreamsSectionTitle;
8
- overviewLabel;
5
+ discoverLabel;
6
+ feedLabel;
9
7
  membersLabel;
10
8
  locale;
11
9
  constructor(locale) {
12
- this.shortVideosSectionTitle = loc.shortVideosSectionTitle[locale];
13
10
  this.interestsSectionTitle = loc.interestsSectionTitle[locale];
14
- this.latestStreamsSectionTitle = loc.streamsSectionTitle[locale];
15
11
  this.popularStreamsSectionTitle = loc.popularStreamsSectionTitle[locale];
16
- this.overviewLabel = loc.overviewLabel[locale];
17
- this.buttons = {
18
- cart: loc.cartButton[locale],
19
- discover: loc.discoverButton[locale],
20
- feed: loc.feedButton[locale],
21
- login: loc.loginButton[locale],
22
- moments: loc.momentsButton[locale],
23
- webpage: loc.webpageButton[locale]
24
- };
12
+ this.discoverLabel = loc.discoverLabel[locale];
13
+ this.feedLabel = loc.feedLabel[locale];
25
14
  this.membersLabel = loc.membersLabel[locale];
26
15
  this.locale = locale;
27
16
  }
28
17
  }
29
18
  const loc = {
30
- shortVideosSectionTitle: {
31
- en: 'Popular Short Videos',
32
- no: 'Populære korte videoer'
33
- },
34
19
  popularStreamsSectionTitle: {
35
20
  en: 'Popular Streams',
36
21
  no: 'Populære Streams'
37
22
  },
38
- streamsSectionTitle: {
39
- en: 'Latest Streams',
40
- no: 'Siste Streams'
41
- },
42
23
  interestsSectionTitle: {
43
24
  en: 'Interest Channels',
44
25
  no: 'Interessekanaler'
45
26
  },
46
- overviewLabel: {
47
- en: 'Overview',
48
- no: 'Oversikt'
49
- },
50
- discoverButton: {
27
+ discoverLabel: {
51
28
  en: 'Discover',
52
29
  no: 'Oppdag'
53
30
  },
54
- feedButton: {
31
+ feedLabel: {
55
32
  en: 'Feed',
56
33
  no: 'Feed'
57
34
  },
58
- cartButton: {
59
- en: 'Cart',
60
- no: 'Handlekurv'
61
- },
62
- loginButton: {
63
- en: 'Login',
64
- no: 'Logg inn'
65
- },
66
- momentsButton: {
67
- en: 'Moments',
68
- no: 'Øyeblikk'
69
- },
70
- webpageButton: {
71
- en: 'Webpage',
72
- no: 'Nettside'
73
- },
74
35
  membersLabel: {
75
36
  en: (count) => (count === 1 ? `Member` : `Members`),
76
37
  no: (count) => (count === 1 ? `Medlem` : `Medlemmer`)
@@ -4,17 +4,18 @@ import { StreamCard } from '../../../streams/stream-card';
4
4
  import { Icon } from '../../../ui/icon';
5
5
  import { ImageRound } from '../../../ui/image';
6
6
  import { LineClamp } from '../../../ui/line-clamp';
7
+ import { MomentsCircle } from '../moments';
7
8
  import { default as ButtonWrapper } from './category-following-wrapper.svelte';
8
9
  import { MenuLocalization } from './menu-localization';
9
10
  import IconChevronDownFilled from '@fluentui/svg-icons/icons/chevron_down_20_filled.svg?raw';
10
11
  import IconChevronRightFilled from '@fluentui/svg-icons/icons/chevron_right_20_filled.svg?raw';
11
12
  import { slide } from 'svelte/transition';
12
- let { context, locale, on } = $props();
13
+ let { context, locale = 'en', on } = $props();
13
14
  const localization = $derived(new MenuLocalization(locale));
14
15
  const target = $derived.by(() => context.targetData);
15
16
  const generateCategoriesMap = () => {
16
17
  const expanded = {};
17
- context.categoriesHandler.categories.forEach((c) => {
18
+ context.categoriesHandler.categoriesGrouped.forEach((c) => {
18
19
  const isSelfSelected = context.categoriesHandler.selectedCategoryId === c.id;
19
20
  const hasSelectedChild = c.children.some((ch) => ch.id === context.categoriesHandler.selectedCategoryId);
20
21
  expanded[c.id] = isSelfSelected || hasSelectedChild;
@@ -27,14 +28,11 @@ const handleCategoryExpaned = (e, categoryId) => {
27
28
  categoriesExpandedMap[categoryId] = !categoriesExpandedMap[categoryId];
28
29
  };
29
30
  const styles = $derived.by(() => {
30
- var _a, _b;
31
+ var _a;
31
32
  const values = [];
32
33
  if ((_a = context.playerColors) === null || _a === void 0 ? void 0 : _a.menuBackground) {
33
34
  values.push(`--media-center-menu--background-color: ${context.playerColors.menuBackground}`);
34
35
  }
35
- if ((_b = context.playerColors) === null || _b === void 0 ? void 0 : _b.brand) {
36
- values.push(`--media-center-menu--brand-color: ${context.playerColors.brand}`);
37
- }
38
36
  return values.join(';');
39
37
  });
40
38
  </script>
@@ -43,16 +41,16 @@ const styles = $derived.by(() => {
43
41
  {#if target}
44
42
  <div class="media-center-target">
45
43
  <div class="media-center-target__image">
46
- <ImageRound src={target.image} />
44
+ <MomentsCircle context={context} />
47
45
  </div>
48
46
  <div class="media-center-target__info">
49
47
  <div class="media-center-target__name">
50
- <LineClamp maxLines={1}>
48
+ <LineClamp maxLines={1} locale={locale}>
51
49
  {target.name}
52
50
  </LineClamp>
53
51
  </div>
54
52
  {#if target.membersCount}
55
- <LineClamp maxLines={1}>
53
+ <LineClamp maxLines={1} locale={locale}>
56
54
  <div class="media-center-target__members">
57
55
  <span class="media-center-target__members-count">
58
56
  {compactNumber(target.membersCount, { locale: localization.locale })}
@@ -71,7 +69,22 @@ const styles = $derived.by(() => {
71
69
  {localization.interestsSectionTitle}
72
70
  </div>
73
71
  <div class="media-center-menu__tree">
74
- {#each context.categoriesHandler.categories as category (category.id)}
72
+ <div class="media-center-menu__tree-item">
73
+ <div class="selector-item">
74
+ <div class="selector-item__value">
75
+ <div
76
+ class="selector-item__text"
77
+ class:selector-item__text--active={!context.categoriesHandler.selectedCategoryId}
78
+ onclick={() => context.playRootFeed()}
79
+ onkeydown={() => {}}
80
+ role="button"
81
+ tabindex="0">
82
+ {context.mediaCenterMode === 'discover' ? localization.discoverLabel : localization.feedLabel}
83
+ </div>
84
+ </div>
85
+ </div>
86
+ </div>
87
+ {#each context.categoriesHandler.categoriesGrouped as category (category.id)}
75
88
  <div class="media-center-menu__tree-item">
76
89
  <div class="selector-item">
77
90
  <div class="selector-item__value">
@@ -80,7 +93,7 @@ const styles = $derived.by(() => {
80
93
  </div>
81
94
  <div
82
95
  class="selector-item__text"
83
- class:selector-item__text--active={!context.discoverHandler.activated && context.categoriesHandler.selectedCategoryId === category.id}
96
+ class:selector-item__text--active={context.categoriesHandler.selectedCategoryId === category.id}
84
97
  onclick={() => on.categorySelected(category.id)}
85
98
  onkeydown={() => {}}
86
99
  role="button"
@@ -112,7 +125,7 @@ const styles = $derived.by(() => {
112
125
  </div>
113
126
  <div
114
127
  class="selector-item__text"
115
- class:selector-item__text--active={!context.discoverHandler.activated && context.categoriesHandler.selectedCategoryId === subcategory.id}
128
+ class:selector-item__text--active={context.categoriesHandler.selectedCategoryId === subcategory.id}
116
129
  onclick={() => on.categorySelected(subcategory.id)}
117
130
  onkeydown={() => {}}
118
131
  role="button"
@@ -161,7 +174,6 @@ const styles = $derived.by(() => {
161
174
  }
162
175
  .media-center-menu {
163
176
  --_media-center-menu--background-color: var(--media-center-menu--background-color, rgb(from #000000 r g b / 95%));
164
- --_media-center-menu--brand-color: var(--media-center-menu--brand-color, #00b8d8);
165
177
  background: var(--_media-center-menu--background-color);
166
178
  height: 100%;
167
179
  min-height: 100%;
@@ -213,19 +225,19 @@ const styles = $derived.by(() => {
213
225
  .media-center-menu__section-title {
214
226
  font-size: 1.125rem;
215
227
  line-height: 1.75rem;
216
- font-weight: 600;
228
+ font-weight: 500;
217
229
  color: #ffffff;
218
230
  }
219
231
  .media-center-menu__tree {
220
232
  display: flex;
221
233
  flex-direction: column;
222
234
  flex: 1;
223
- gap: 1rem;
235
+ gap: 0.5rem;
224
236
  }
225
237
  .media-center-menu__tree-item {
226
238
  display: flex;
227
239
  flex-direction: column;
228
- gap: 0.5rem;
240
+ gap: 0.25rem;
229
241
  }
230
242
  .media-center-menu__popular-streams-section {
231
243
  display: flex;
@@ -247,7 +259,6 @@ const styles = $derived.by(() => {
247
259
  user-select: none;
248
260
  height: 2.25rem;
249
261
  --_selector-item--text--font-size: 0.9375rem;
250
- --_selector-item--text--font-weight: 600;
251
262
  --_selector-item--image--size: 1.5rem;
252
263
  }
253
264
  .selector-item :global([contenteditable]) {
@@ -257,7 +268,6 @@ const styles = $derived.by(() => {
257
268
  height: 2.125rem;
258
269
  padding-left: 1.25rem;
259
270
  --_selector-item--text--font-size: 0.875rem;
260
- --_selector-item--text--font-weight: 500;
261
271
  --_selector-item--image--size: 1.375rem;
262
272
  }
263
273
  .selector-item__value {
@@ -281,7 +291,7 @@ const styles = $derived.by(() => {
281
291
  max-width: 100%;
282
292
  color: #ffffff;
283
293
  font-size: var(--_selector-item--text--font-size);
284
- font-weight: var(--_selector-item--text--font-weight);
294
+ font-weight: 400;
285
295
  text-align: left;
286
296
  text-overflow: ellipsis;
287
297
  width: 100%;
@@ -290,7 +300,8 @@ const styles = $derived.by(() => {
290
300
  transition: text-shadow 120ms ease;
291
301
  }
292
302
  .selector-item__text:hover, .selector-item__text--active {
293
- text-shadow: 0.001em 0 0 currentColor, -0.001em 0 0 currentColor, 0 0.001em 0 currentColor, 0 -0.001em 0 currentColor;
303
+ font-weight: 600;
304
+ letter-spacing: -0.5px;
294
305
  }
295
306
  .selector-item__collapser {
296
307
  --icon--color: #ffffff;
@@ -313,9 +324,6 @@ const styles = $derived.by(() => {
313
324
  height: 3.5rem;
314
325
  min-height: 3.5rem;
315
326
  max-height: 3.5rem;
316
- --image--rounded--inner--border-width: 1px;
317
- --image--rounded--outer--border-color: var(--_media-center-menu--brand-color);
318
- --image--rounded--outer--border-width: 2px;
319
327
  }
320
328
  .media-center-target__info {
321
329
  display: flex;
@@ -3,7 +3,7 @@ import type { StreamPlayerModel } from '../../../streams/streams-player';
3
3
  import type { MediaCenterContext } from '../media-center-context.svelte';
4
4
  type Props = {
5
5
  context: MediaCenterContext;
6
- locale: Locale;
6
+ locale?: Locale;
7
7
  on: {
8
8
  categorySelected: (categoryId: string) => void;
9
9
  streamSelected: (stream: StreamPlayerModel) => void;
@@ -4,7 +4,7 @@ export declare class PopularStreamsPanelHandler {
4
4
  private readonly config;
5
5
  private _state;
6
6
  private _streams;
7
- constructor(config: IMediaCenterConfig | null);
7
+ constructor(config: IMediaCenterConfig);
8
8
  get streamSectionItems(): StreamPlayerModel[];
9
9
  init: () => Promise<void>;
10
10
  }
@@ -9,9 +9,6 @@ export class PopularStreamsPanelHandler {
9
9
  return this._streams;
10
10
  }
11
11
  init = async () => {
12
- if (!this.config) {
13
- return;
14
- }
15
12
  if (this._state === 'not-initialized') {
16
13
  this._state = 'loading';
17
14
  try {