@streamscloud/embeddable 12.1.0 → 12.2.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 (93) 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 +1 -0
  4. package/dist/content-player/content-player-settings.js +1 -0
  5. package/dist/content-player/controls-and-attachments.svelte +32 -2
  6. package/dist/content-player/controls-and-attachments.svelte.d.ts +1 -0
  7. package/dist/content-player/overview-panel.svelte +2 -2
  8. package/dist/content-player/ui-manager.svelte.d.ts +2 -1
  9. package/dist/content-player/ui-manager.svelte.js +2 -1
  10. package/dist/core/enums.d.ts +3 -0
  11. package/dist/core/enums.js +4 -0
  12. package/dist/core/theme/index.d.ts +1 -0
  13. package/dist/core/theme/index.js +1 -0
  14. package/dist/core/theme/theme-store.svelte.d.ts +5 -0
  15. package/dist/core/theme/theme-store.svelte.js +10 -0
  16. package/dist/media-center/media-center/cmp.media-center-proxy.svelte +59 -0
  17. package/dist/media-center/media-center/cmp.media-center-proxy.svelte.d.ts +12 -0
  18. package/dist/media-center/media-center/discover/discover-header.svelte +10 -13
  19. package/dist/media-center/media-center/discover/discover-header.svelte.d.ts +0 -2
  20. package/dist/media-center/media-center/discover/discover-view.svelte +6 -6
  21. package/dist/media-center/media-center/discover/discover-view.svelte.d.ts +0 -2
  22. package/dist/media-center/media-center/handlers/media-center-settings-handler.svelte.d.ts +2 -0
  23. package/dist/media-center/media-center/handlers/media-center-settings-handler.svelte.js +20 -1
  24. package/dist/media-center/media-center/header-footer/media-center-footer.svelte +5 -5
  25. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte +5 -4
  26. package/dist/media-center/media-center/header-footer/media-center-header.svelte +6 -8
  27. package/dist/media-center/media-center/header-footer/media-center-header.svelte.d.ts +0 -2
  28. package/dist/media-center/media-center/index.d.ts +1 -1
  29. package/dist/media-center/media-center/index.js +1 -1
  30. package/dist/media-center/media-center/media-center-context.svelte.d.ts +3 -13
  31. package/dist/media-center/media-center/media-center-context.svelte.js +11 -7
  32. package/dist/media-center/media-center/{cmp.media-center.svelte → media-center-view.svelte} +56 -107
  33. package/dist/media-center/media-center/media-center-view.svelte.d.ts +7 -0
  34. package/dist/media-center/media-center/menu/menu.svelte +27 -23
  35. package/dist/media-center/media-center/menu/menu.svelte.d.ts +0 -2
  36. package/dist/media-center/media-center/moments/cmp.moments-circle.svelte +7 -3
  37. package/dist/media-center/media-center/streams-in-category/streams-in-category-panel.svelte +2 -3
  38. package/dist/media-center/media-center/types.d.ts +1 -8
  39. package/dist/media-page/cmp.media-page.svelte +39 -0
  40. package/dist/media-page/cmp.media-page.svelte.d.ts +10 -0
  41. package/dist/media-page/index.d.ts +2 -0
  42. package/dist/media-page/index.js +3 -2
  43. package/dist/posts/attachments/cmp.attachments.svelte +1 -1
  44. package/dist/posts/controls/cmp.controls.svelte +4 -1
  45. package/dist/posts/controls/cmp.controls.svelte.d.ts +2 -0
  46. package/dist/posts/post-viewer/attachments-horizontal.svelte +4 -12
  47. package/dist/posts/post-viewer/heading.svelte +4 -4
  48. package/dist/posts/post-viewer/media/post-media.svelte +1 -1
  49. package/dist/posts/post-viewer/post-texts.svelte +2 -2
  50. package/dist/posts/posts-player/cmp.posts-player.svelte.d.ts +1 -0
  51. package/dist/posts/posts-player/index.d.ts +1 -0
  52. package/dist/posts/posts-player/index.js +2 -2
  53. package/dist/posts/posts-player/posts-player-proxy.svelte +13 -4
  54. package/dist/posts/posts-player/posts-player-proxy.svelte.d.ts +1 -0
  55. package/dist/products/product-card/cmp.product-card.svelte +4 -16
  56. package/dist/short-videos/short-video-card/cmp.short-video-card.svelte +6 -6
  57. package/dist/streams/data-loaders/streams-loader.js +6 -2
  58. package/dist/streams/stream-card/cmp.stream-card.svelte +1 -1
  59. package/dist/streams/streams-player/cmp.streams-player.svelte +42 -0
  60. package/dist/streams/streams-player/cmp.streams-player.svelte.d.ts +24 -0
  61. package/dist/streams/streams-player/index.d.ts +1 -0
  62. package/dist/streams/streams-player/index.js +5 -5
  63. package/dist/streams/streams-player/stream-overview.svelte +1 -1
  64. package/dist/streams/streams-player/streams-player-proxy.svelte +32 -0
  65. package/dist/streams/streams-player/streams-player-proxy.svelte.d.ts +26 -0
  66. package/dist/ui/button/resources/button-theme.svelte +0 -151
  67. package/dist/ui/button/resources/button-types.d.ts +0 -1
  68. package/dist/ui/button/resources/button-types.js +0 -1
  69. package/dist/ui/icon/cmp.icon.svelte +8 -28
  70. package/dist/ui/image/cmp.image-rounded.svelte +3 -10
  71. package/dist/ui/image/cmp.image-stub.svelte +1 -4
  72. package/dist/ui/image/cmp.image.svelte +1 -4
  73. package/dist/ui/loading/cmp.loading.svelte +1 -4
  74. package/dist/ui/player/button/cmp.mobile-player-buttons-group.svelte +2 -2
  75. package/dist/ui/player/button/cmp.mobile-player-buttons-group.svelte.d.ts +2 -2
  76. package/dist/ui/player/button/cmp.player-button.svelte +7 -3
  77. package/dist/ui/player/button/cmp.player-buttons-group.svelte +4 -3
  78. package/dist/ui/player/button/cmp.player-buttons-group.svelte.d.ts +2 -2
  79. package/dist/ui/player/button/index.d.ts +1 -1
  80. package/dist/ui/player/button/types.d.ts +1 -1
  81. package/dist/ui/player/colors/player-colors.d.ts +1 -0
  82. package/dist/ui/shadow-dom/cmp.shadow-root.svelte +156 -0
  83. package/dist/ui/shadow-dom/colors.scss +72 -0
  84. package/dist/ui/shadow-dom/index.d.ts +1 -0
  85. package/dist/ui/shadow-dom/index.js +1 -0
  86. package/dist/ui/shadow-dom/shadow-root-service.js +0 -4
  87. package/dist/ui/slider/cmp.slider.svelte +5 -5
  88. package/package.json +1 -1
  89. package/dist/media-center/media-center/cmp.media-center.svelte.d.ts +0 -4
  90. package/dist/ui/with-background/cmp.with-background.svelte +0 -86
  91. package/dist/ui/with-background/index.d.ts +0 -1
  92. package/dist/ui/with-background/index.js +0 -1
  93. /package/dist/ui/{with-background/cmp.with-background.svelte.d.ts → shadow-dom/cmp.shadow-root.svelte.d.ts} +0 -0
@@ -20,7 +20,7 @@ export declare class MediaCenterContext {
20
20
  categoryFollowingHandler: IContentCategoryFollowingHandler | null;
21
21
  settingsHandler: MediaCenterSettingsHandler;
22
22
  closeOrchestrator: ICloseOrchestrator;
23
- private _mediaCenterConfig;
23
+ private _targetData;
24
24
  constructor(data: {
25
25
  config: IMediaCenterConfig;
26
26
  closeOrchestrator: ICloseOrchestrator;
@@ -28,18 +28,7 @@ export declare class MediaCenterContext {
28
28
  on: MediaCenterContextInitializationCallbacks;
29
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 playerColors(): import("../../ui/player/colors").PlayerColors | undefined;
43
32
  get loading(): boolean;
44
33
  get overlayIsActive(): boolean;
45
34
  get backgroundWrapperProps(): {
@@ -48,6 +37,7 @@ export declare class MediaCenterContext {
48
37
  backgroundColor?: string | null;
49
38
  };
50
39
  get feedPlayerProps(): import("./types").PlayerProps | null;
40
+ get locale(): import("../../core/locale").Locale;
51
41
  toggleMenu: () => void;
52
42
  showMenu: () => void;
53
43
  hideMenu: () => void;
@@ -21,7 +21,7 @@ export class MediaCenterContext {
21
21
  categoryFollowingHandler = $state.raw(null);
22
22
  settingsHandler;
23
23
  closeOrchestrator;
24
- _mediaCenterConfig = $state.raw(null);
24
+ _targetData = $state.raw(null);
25
25
  constructor(data) {
26
26
  const { config, closeOrchestrator, settings, on } = data;
27
27
  this.closeOrchestrator = closeOrchestrator;
@@ -35,10 +35,10 @@ export class MediaCenterContext {
35
35
  this.init(config, on);
36
36
  }
37
37
  get targetData() {
38
- return this._mediaCenterConfig?.targetData || null;
38
+ return this._targetData;
39
39
  }
40
40
  get playerColors() {
41
- return this._mediaCenterConfig?.playerColors || null;
41
+ return this.settingsHandler.playerSettings.playerColors;
42
42
  }
43
43
  get loading() {
44
44
  return this.discoverHandler.loading || this.streamsInCategoryHandler.loading;
@@ -52,6 +52,9 @@ export class MediaCenterContext {
52
52
  get feedPlayerProps() {
53
53
  return this.feedHandler.feedPlayerProps;
54
54
  }
55
+ get locale() {
56
+ return this.settingsHandler.locale;
57
+ }
55
58
  toggleMenu = () => {
56
59
  if (this.menuActive) {
57
60
  this.hideMenu();
@@ -114,13 +117,14 @@ export class MediaCenterContext {
114
117
  };
115
118
  init = async (config, on) => {
116
119
  try {
117
- this._mediaCenterConfig = await config.getConfig();
118
- if (!this._mediaCenterConfig) {
120
+ const configModel = await config.getConfig();
121
+ if (!configModel) {
119
122
  on.failed();
120
123
  return;
121
124
  }
122
- this.categoriesHandler.init({ categories: this._mediaCenterConfig.contentCategories, tagAssociations: this._mediaCenterConfig.categoryTagAssociations });
123
- this.settingsHandler.updatePlayerColors(this._mediaCenterConfig.playerColors);
125
+ this.categoriesHandler.init({ categories: configModel.contentCategories, tagAssociations: configModel.categoryTagAssociations });
126
+ this.settingsHandler.updatePlayerColors(configModel.playerColors);
127
+ this._targetData = configModel.targetData;
124
128
  on.initialized(this);
125
129
  this.initialized = true;
126
130
  }
@@ -11,46 +11,13 @@ import { Utils } from '../../core/utils';
11
11
  import { default as PostsPlayerView } from '../../posts/posts-player/posts-player-view.svelte';
12
12
  import { default as StreamsPlayerView } from '../../streams/streams-player/streams-player-view.svelte';
13
13
  import { Loading } from '../../ui/loading';
14
- import { WithBackground } from '../../ui/with-background';
15
14
  import { DiscoverPanel } from './discover';
16
15
  import { MediaCenterHeader, MediaCenterFooter, MediaCenterHeaderMobile } from './header-footer';
17
16
  import { MediaCenterContext } from './media-center-context.svelte';
18
17
  import { Menu } from './menu';
19
18
  import { StreamsInCategoryPanel } from './streams-in-category';
20
19
  import { fade } from 'svelte/transition';
21
- let { config, modeProps, settings, closeOrchestrator } = $props();
22
- const context = new MediaCenterContext({
23
- config,
24
- closeOrchestrator,
25
- settings,
26
- on: {
27
- initialized: (instance) => {
28
- switch (modeProps.mode) {
29
- case 'posts':
30
- instance.playPostsFeed({
31
- dataProvider: modeProps.props.dataProvider,
32
- onPostActivated: modeProps.props.onPostActivated
33
- });
34
- break;
35
- case 'streams':
36
- instance.playStreamsFeed({
37
- dataProvider: modeProps.props.dataProvider,
38
- onStreamActivated: modeProps.props.onStreamActivated
39
- });
40
- break;
41
- case 'discover':
42
- instance.activateDiscover({ categoryId: null });
43
- break;
44
- default:
45
- Utils.assertUnreachable(modeProps);
46
- }
47
- },
48
- failed: () => {
49
- console.error('Media Center initialization failed');
50
- closeOrchestrator.requestClose();
51
- }
52
- }
53
- });
20
+ let { context } = $props();
54
21
  let headerHeight = $state(0);
55
22
  let isMobileView = $state(false);
56
23
  const selectCategory = (categoryId) => __awaiter(void 0, void 0, void 0, function* () {
@@ -108,7 +75,7 @@ const swipeToOpen = (node) => {
108
75
  let startY = 0;
109
76
  let isTracking = false;
110
77
  let hasOpened = false;
111
- let threshold = 60;
78
+ let threshold = 50;
112
79
  const MIN_DISTANCE = 10;
113
80
  function handleTouchStart(e) {
114
81
  if (e.touches.length !== 1) {
@@ -159,67 +126,59 @@ const swipeToOpen = (node) => {
159
126
  };
160
127
  </script>
161
128
 
162
- {#if context.initializing}
163
- <Loading positionFixedCenter={true} timeout={600} />
164
- {:else if !context.initialized}
165
- Not initialized placeholder
166
- {:else}
167
- <WithBackground {...context.backgroundWrapperProps}>
168
- <div class="media-center" use:onWidthAnchorMounted>
169
- {#if !isMobileView}
170
- <MediaCenterHeader context={context} locale={settings?.locale} on={{ headerHeightChanged: onHeaderHeightChanged }} />
171
- {:else}
172
- <MediaCenterHeaderMobile context={context} on={{ headerHeightChanged: onHeaderHeightChanged }} />
173
- {/if}
174
-
175
- <div class="media-center__content-container">
176
- {#if context.mediaCenterMode === 'feed' && context.feedPlayerProps}
177
- <div class="media-center__content" class:media-center__content--faded={context.overlayIsActive} transition:fade={{ duration: 300 }}>
178
- {#if context.feedPlayerProps.type === 'posts'}
179
- <PostsPlayerView {...context.feedPlayerProps.props} />
180
- {:else if context.feedPlayerProps.type === 'streams'}
181
- <StreamsPlayerView {...context.feedPlayerProps.props} />
182
- {/if}
183
- </div>
184
- {:else if context.mediaCenterMode === 'discover'}
185
- <div class="media-center__content" transition:fade={{ duration: 300 }}>
186
- <DiscoverPanel
187
- context={context}
188
- locale={settings?.locale}
189
- on={{
190
- shortVideoSelected: (shortVideo) => activateSelectedShortVideoPlayer(shortVideo),
191
- streamSelected: (stream) => activateSelectedStreamPlayer(stream)
192
- }} />
193
- </div>
194
- {/if}
195
- </div>
196
- {#if context.loading}
197
- <Loading positionFixedCenter={true} timeout={600} />
198
- {/if}
129
+ <div class="media-center" use:onWidthAnchorMounted>
130
+ <div class="media-center__header-and-content">
131
+ {#if !isMobileView}
132
+ <MediaCenterHeader context={context} on={{ headerHeightChanged: onHeaderHeightChanged }} />
133
+ {:else}
134
+ <MediaCenterHeaderMobile context={context} on={{ headerHeightChanged: onHeaderHeightChanged }} />
135
+ {/if}
199
136
 
200
- {#if context.streamsInCategoryHandler.active}
201
- <div class="media-center-overlay" class:media-center-overlay--mobile={isMobileView} style={`top:${headerHeight}px`} transition:fade={{ duration: 300 }}>
202
- <StreamsInCategoryPanel
203
- handler={context.streamsInCategoryHandler}
204
- on={{ streamSelected: (id, categoryId, streams) => activateSelectedStreamOfCategoryPlayer(id, streams, categoryId) }} />
137
+ <div class="media-center__content-container" use:swipeToOpen>
138
+ {#if context.mediaCenterMode === 'feed' && context.feedPlayerProps}
139
+ <div class="media-center__content" class:media-center__content--faded={context.overlayIsActive} transition:fade={{ duration: 300 }}>
140
+ {#if context.feedPlayerProps.type === 'posts'}
141
+ <PostsPlayerView {...context.feedPlayerProps.props} />
142
+ {:else if context.feedPlayerProps.type === 'streams'}
143
+ <StreamsPlayerView {...context.feedPlayerProps.props} />
144
+ {/if}
145
+ </div>
146
+ {:else if context.mediaCenterMode === 'discover'}
147
+ <div class="media-center__content" transition:fade={{ duration: 300 }}>
148
+ <DiscoverPanel
149
+ context={context}
150
+ on={{
151
+ shortVideoSelected: (shortVideo) => activateSelectedShortVideoPlayer(shortVideo),
152
+ streamSelected: (stream) => activateSelectedStreamPlayer(stream)
153
+ }} />
205
154
  </div>
206
155
  {/if}
156
+ </div>
207
157
 
208
- {#if context.menuActive}
209
- <div class="menu-overlay" class:menu-overlay--mobile={isMobileView} onclick={context.hideMenu} onkeydown={() => {}} role="none">
210
- <div class="menu-overlay__panel">
211
- <Menu context={context} locale={settings?.locale} on={{ categorySelected: selectCategory, streamSelected: activateSelectedStreamPlayer }} />
212
- </div>
158
+ {#if context.menuActive}
159
+ <div class="menu-overlay" class:menu-overlay--mobile={isMobileView} onclick={context.hideMenu} onkeydown={() => {}} role="none">
160
+ <div class="menu-overlay__panel">
161
+ <Menu context={context} on={{ categorySelected: selectCategory, streamSelected: activateSelectedStreamPlayer }} />
213
162
  </div>
214
- {:else}
215
- <div class="menu-swipe-area" use:swipeToOpen>&nbsp;</div>
216
- {/if}
217
- {#if isMobileView}
218
- <MediaCenterFooter context={context} />
219
- {/if}
163
+ </div>
164
+ {/if}
165
+ </div>
166
+ {#if context.loading}
167
+ <Loading positionFixedCenter={true} timeout={600} />
168
+ {/if}
169
+
170
+ {#if context.streamsInCategoryHandler.active}
171
+ <div class="media-center-overlay" class:media-center-overlay--mobile={isMobileView} style={`top:${headerHeight}px`} transition:fade={{ duration: 300 }}>
172
+ <StreamsInCategoryPanel
173
+ handler={context.streamsInCategoryHandler}
174
+ on={{ streamSelected: (id, categoryId, streams) => activateSelectedStreamOfCategoryPlayer(id, streams, categoryId) }} />
220
175
  </div>
221
- </WithBackground>
222
- {/if}
176
+ {/if}
177
+
178
+ {#if isMobileView}
179
+ <MediaCenterFooter context={context} />
180
+ {/if}
181
+ </div>
223
182
 
224
183
  <style>@keyframes fadeIn {
225
184
  0% {
@@ -243,6 +202,13 @@ const swipeToOpen = (node) => {
243
202
  flex-direction: column;
244
203
  position: relative;
245
204
  }
205
+ .media-center__header-and-content {
206
+ display: flex;
207
+ flex-direction: column;
208
+ flex: 1;
209
+ min-height: 0;
210
+ position: relative;
211
+ }
246
212
  .media-center__content-container {
247
213
  flex: 1;
248
214
  min-height: 0;
@@ -301,26 +267,9 @@ const swipeToOpen = (node) => {
301
267
  }
302
268
  .menu-overlay--mobile {
303
269
  right: 0;
304
- bottom: 6.25rem;
305
270
  }
306
271
  .menu-overlay__panel {
307
272
  width: 17.5rem;
308
273
  height: 100%;
309
274
  max-height: 100%;
310
- }
311
-
312
- .menu-swipe-area {
313
- display: none;
314
- position: absolute;
315
- top: 0;
316
- left: 0;
317
- width: 1.875rem;
318
- height: 100%;
319
- z-index: 1;
320
- /* Set 'container-type: inline-size;' to reference container*/
321
- }
322
- @container (width < 576px) {
323
- .menu-swipe-area {
324
- display: block;
325
- }
326
275
  }</style>
@@ -0,0 +1,7 @@
1
+ import { MediaCenterContext } from './media-center-context.svelte';
2
+ type Props = {
3
+ context: MediaCenterContext;
4
+ };
5
+ declare const MediaCenterView: import("svelte").Component<Props, {}, "">;
6
+ type MediaCenterView = ReturnType<typeof MediaCenterView>;
7
+ export default MediaCenterView;
@@ -10,8 +10,8 @@ import { MenuLocalization } from './menu-localization';
10
10
  import IconChevronDownFilled from '@fluentui/svg-icons/icons/chevron_down_20_filled.svg?raw';
11
11
  import IconChevronRightFilled from '@fluentui/svg-icons/icons/chevron_right_20_filled.svg?raw';
12
12
  import { slide } from 'svelte/transition';
13
- let { context, locale = 'en', on } = $props();
14
- const localization = $derived(new MenuLocalization(locale));
13
+ let { context, on } = $props();
14
+ const localization = $derived(new MenuLocalization(context.locale));
15
15
  const target = $derived.by(() => context.targetData);
16
16
  const generateCategoriesMap = () => {
17
17
  const expanded = {};
@@ -45,12 +45,12 @@ const styles = $derived.by(() => {
45
45
  </div>
46
46
  <div class="media-center-target__info">
47
47
  <div class="media-center-target__name">
48
- <LineClamp maxLines={1} locale={locale}>
48
+ <LineClamp maxLines={1} locale={context.locale}>
49
49
  {target.name}
50
50
  </LineClamp>
51
51
  </div>
52
52
  {#if target.membersCount}
53
- <LineClamp maxLines={1} locale={locale}>
53
+ <LineClamp maxLines={1} locale={context.locale}>
54
54
  <div class="media-center-target__members">
55
55
  <span class="media-center-target__members-count">
56
56
  {compactNumber(target.membersCount, { locale: localization.locale })}
@@ -70,22 +70,19 @@ const styles = $derived.by(() => {
70
70
  </div>
71
71
  <div class="media-center-menu__tree">
72
72
  <div class="media-center-menu__tree-item">
73
- <div class="menu-item">
74
- <div class="menu-item__value">
75
- <div
76
- class="menu-item__text"
77
- class:menu-item__text--active={!context.categoriesHandler.selectedCategoryId}
78
- onclick={() => context.playRootFeed()}
79
- onkeydown={() => {}}
80
- role="button"
81
- tabindex="0">
73
+ <div class="menu-item" class:menu-item--active={!context.categoriesHandler.selectedCategoryId}>
74
+ <div class="menu-item__value" onclick={() => context.playRootFeed()} onkeydown={() => {}} role="button" tabindex="0">
75
+ <div class="menu-item__text" class:menu-item__text--active={!context.categoriesHandler.selectedCategoryId}>
82
76
  {context.mediaCenterMode === 'discover' ? localization.discoverLabel : localization.feedLabel}
83
77
  </div>
84
78
  </div>
85
79
  </div>
86
80
  </div>
87
81
  {#snippet categoryItem(category: { type: 'main'; value: MediaCenterCategoryModel } | { type: 'child'; value: MediaCenterSubCategoryModel })}
88
- <div class="menu-item" class:menu-item--child={category.type === 'child'}>
82
+ <div
83
+ class="menu-item"
84
+ class:menu-item--child={category.type === 'child'}
85
+ class:menu-item--active={context.categoriesHandler.selectedCategoryId === category.value.id}>
89
86
  <div class="menu-item__value" onclick={() => on.categorySelected(category.value.id)} onkeydown={() => {}} role="button" tabindex="0">
90
87
  <div class="menu-item__image">
91
88
  <ImageRound src={category.value.image} noBorders={true} />
@@ -155,7 +152,8 @@ const styles = $derived.by(() => {
155
152
  }
156
153
  }
157
154
  .media-center-menu {
158
- --_media-center-menu--background-color: var(--media-center-menu--background-color, rgb(from #000000 r g b / 95%));
155
+ --_media-center-menu--background-color: var(--media-center-menu--background-color, rgb(from var(--sc-mc-color--bg-panel) r g b / 95%));
156
+ --_media-center-menu--items--padding-inline: 0.625rem;
159
157
  background: var(--_media-center-menu--background-color);
160
158
  height: 100%;
161
159
  min-height: 100%;
@@ -167,8 +165,7 @@ const styles = $derived.by(() => {
167
165
  gap: 1.25rem;
168
166
  flex-direction: column;
169
167
  min-height: 0;
170
- padding: 0.9375rem 1.25rem;
171
- padding-right: 0.75rem;
168
+ padding: 0.9375rem 0.375rem;
172
169
  border-radius: 0 1rem 1rem 0;
173
170
  }
174
171
  .media-center-menu__content {
@@ -208,7 +205,8 @@ const styles = $derived.by(() => {
208
205
  font-size: 1.125rem;
209
206
  line-height: 1.75rem;
210
207
  font-weight: 500;
211
- color: #ffffff;
208
+ color: var(--sc-mc-color--text-primary);
209
+ padding-inline: var(--_media-center-menu--items--padding-inline);
212
210
  }
213
211
  .media-center-menu__tree {
214
212
  display: flex;
@@ -227,7 +225,7 @@ const styles = $derived.by(() => {
227
225
  flex-direction: column;
228
226
  gap: 1rem;
229
227
  padding-top: 1.25rem;
230
- padding-right: 0.5rem;
228
+ padding-inline: var(--_media-center-menu--items--padding-inline);
231
229
  }
232
230
  .media-center-menu__popular-streams {
233
231
  display: grid;
@@ -240,12 +238,17 @@ const styles = $derived.by(() => {
240
238
  -webkit-user-drag: none;
241
239
  user-select: none;
242
240
  height: 2.25rem;
241
+ padding-left: var(--_media-center-menu--items--padding-inline);
243
242
  --_menu-item--text--font-size: 0.9375rem;
244
243
  --_menu-item--image--size: 1.5rem;
245
244
  }
246
245
  .menu-item :global([contenteditable]) {
247
246
  user-select: text;
248
247
  }
248
+ .menu-item--active {
249
+ background-color: hsl(from var(--_media-center-menu--background-color) h s calc(l + 5)/alpha);
250
+ border-radius: 0.25rem;
251
+ }
249
252
  .menu-item--child {
250
253
  height: 2.125rem;
251
254
  padding-left: 1.25rem;
@@ -270,7 +273,7 @@ const styles = $derived.by(() => {
270
273
  }
271
274
  .menu-item__text {
272
275
  max-width: 100%;
273
- color: #ffffff;
276
+ color: var(--sc-mc-color--text-primary);
274
277
  font-size: var(--_menu-item--text--font-size);
275
278
  font-weight: 400;
276
279
  text-align: left;
@@ -297,7 +300,7 @@ const styles = $derived.by(() => {
297
300
  margin-left: 0.25rem;
298
301
  }
299
302
  .menu-item__collapser {
300
- --icon--color: #ffffff;
303
+ --icon--color: var(--sc-mc-color--text-primary);
301
304
  --icon--size: 1rem;
302
305
  padding: 0.5rem;
303
306
  }
@@ -309,6 +312,7 @@ const styles = $derived.by(() => {
309
312
  display: flex;
310
313
  align-items: center;
311
314
  gap: 0.9375rem;
315
+ padding-inline: var(--_media-center-menu--items--padding-inline);
312
316
  }
313
317
  .media-center-target__image {
314
318
  width: 3.5rem;
@@ -321,7 +325,7 @@ const styles = $derived.by(() => {
321
325
  .media-center-target__info {
322
326
  display: flex;
323
327
  flex-direction: column;
324
- color: #ffffff;
328
+ color: var(--sc-mc-color--text-primary);
325
329
  }
326
330
  .media-center-target__name {
327
331
  font-size: 1.125rem;
@@ -342,5 +346,5 @@ const styles = $derived.by(() => {
342
346
  font-size: 0.75rem;
343
347
  line-height: 1;
344
348
  font-weight: 400;
345
- color: #d1d5db;
349
+ color: var(--sc-mc-color--text-secondary);
346
350
  }</style>
@@ -1,9 +1,7 @@
1
- import type { Locale } from '../../../core/locale';
2
1
  import type { StreamPlayerModel } from '../../../streams/streams-player';
3
2
  import type { MediaCenterContext } from '../media-center-context.svelte';
4
3
  type Props = {
5
4
  context: MediaCenterContext;
6
- locale?: Locale;
7
5
  on: {
8
6
  categorySelected: (categoryId: string) => void;
9
7
  streamSelected: (stream: StreamPlayerModel) => void;
@@ -1,4 +1,5 @@
1
- <script lang="ts">import { ImageRound } from '../../../ui/image';
1
+ <script lang="ts">import { Theme } from '../../../core/theme';
2
+ import { ImageRound } from '../../../ui/image';
2
3
  let { context } = $props();
3
4
  const styles = $derived.by(() => {
4
5
  var _a;
@@ -8,9 +9,12 @@ const styles = $derived.by(() => {
8
9
  }
9
10
  return values.join(';');
10
11
  });
12
+ const handleClick = () => {
13
+ Theme.toggle();
14
+ };
11
15
  </script>
12
16
 
13
- <div class="moments-circle" style={styles}>
17
+ <div class="moments-circle" style={styles} onclick={handleClick} onkeydown={() => {}} role="none">
14
18
  {#if context.targetData}
15
19
  <ImageRound src={context.targetData.image} />
16
20
  {/if}
@@ -28,7 +32,7 @@ const styles = $derived.by(() => {
28
32
  }
29
33
  }
30
34
  .moments-circle {
31
- --_moments-circle--brand-color: var(--moments-circle--brand-color, #00b8d8);
35
+ --_moments-circle--brand-color: var(--moments-circle--brand-color, var(--sc-mc-color--border-brand));
32
36
  width: 6.25%rem;
33
37
  min-width: 6.25%rem;
34
38
  max-width: 6.25%rem;
@@ -63,8 +63,7 @@ let { handler, on } = $props();
63
63
  font-size: 1.125rem;
64
64
  line-height: 1.75rem;
65
65
  font-weight: 500;
66
- color: #ffffff;
67
- 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);
66
+ color: var(--sc-mc-color--text-primary);
68
67
  }
69
68
  .streams-in-category__section-header::before {
70
69
  content: "";
@@ -72,7 +71,7 @@ let { handler, on } = $props();
72
71
  width: 0.3125rem;
73
72
  height: 1.625rem;
74
73
  border-radius: 0.125rem;
75
- background: #5a8dec;
74
+ background: var(--sc-mc-color--border-brand);
76
75
  }
77
76
  .streams-in-category__section-content {
78
77
  --product-card--aspect-ratio: 9/16;
@@ -1,8 +1,6 @@
1
1
  import type { Locale } from '../../core/locale';
2
- import type { IMediaCenterConfig } from '../config/types';
3
2
  import type { PostPlayerModel, PostsPlayerProps } from '../../posts/posts-player/types';
4
3
  import type { IStreamsPlayerDataProvider, StreamAmplificationParameters, StreamsPlayerProps } from '../../streams/streams-player/types';
5
- import type { ICloseOrchestrator } from '../../ui/player/close-orchestrator';
6
4
  import type { IPlayerDataProvider } from '../../ui/player/providers';
7
5
  export type MediaCenterMode = 'feed' | 'discover';
8
6
  export type MediaCenterCategoryData = {
@@ -11,12 +9,6 @@ export type MediaCenterCategoryData = {
11
9
  parentId: string | undefined;
12
10
  parentName: string | undefined;
13
11
  };
14
- export type MediaCenterProps = {
15
- config: IMediaCenterConfig;
16
- settings?: MediaCenterSettings;
17
- modeProps: MediaCenterModeProps;
18
- closeOrchestrator: ICloseOrchestrator;
19
- };
20
12
  export type MediaCenterModeProps = {
21
13
  mode: 'posts';
22
14
  props: {
@@ -47,4 +39,5 @@ export type MediaCenterSettings = {
47
39
  locale?: Locale;
48
40
  showStreamsCloudWatermark?: boolean;
49
41
  disableBackground?: boolean;
42
+ theme?: 'light' | 'dark';
50
43
  };
@@ -0,0 +1,39 @@
1
+ <script lang="ts">var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { MediaCenterProxy } from '../media-center/media-center';
11
+ import { CloseOrchestrator } from '../ui/player/close-orchestrator';
12
+ import { createShadowRoot } from '../ui/shadow-dom';
13
+ import { mount, unmount } from 'svelte';
14
+ let { config, settings, modeProps } = $props();
15
+ const initHost = (node) => {
16
+ const shadowRoot = createShadowRoot(node);
17
+ const mounted = mount(MediaCenterProxy, {
18
+ target: shadowRoot,
19
+ props: {
20
+ config,
21
+ settings,
22
+ modeProps,
23
+ closeOrchestrator: new CloseOrchestrator({
24
+ closeFn: () => __awaiter(void 0, void 0, void 0, function* () {
25
+ yield unmount(mounted);
26
+ }),
27
+ canClose: false
28
+ })
29
+ }
30
+ });
31
+ return {
32
+ destroy: () => {
33
+ unmount(mounted);
34
+ }
35
+ };
36
+ };
37
+ </script>
38
+
39
+ <div class="streams-player-host" use:initHost></div>
@@ -0,0 +1,10 @@
1
+ import type { IMediaCenterConfig } from '../media-center';
2
+ import type { MediaCenterModeProps, MediaCenterSettings } from '../media-center/media-center/types';
3
+ type Props = {
4
+ config: IMediaCenterConfig;
5
+ settings?: MediaCenterSettings;
6
+ modeProps: MediaCenterModeProps;
7
+ };
8
+ declare const Cmp: import("svelte").Component<Props, {}, "">;
9
+ type Cmp = ReturnType<typeof Cmp>;
10
+ export default Cmp;
@@ -1,5 +1,6 @@
1
1
  import type { Locale } from '../core/locale';
2
2
  import { type IMediaCenterConfig } from '../media-center/config/types';
3
+ export { default as MediaPage } from './cmp.media-page.svelte';
3
4
  export type { IMediaCenterConfig };
4
5
  export { mapToPostPlayerModel } from '../posts/data-loaders/mapper';
5
6
  /**
@@ -118,4 +119,5 @@ export type MediaPageViewerSettings = {
118
119
  locale?: Locale;
119
120
  showStreamsCloudWatermark?: boolean;
120
121
  hideCloseButton?: boolean;
122
+ theme?: 'light' | 'dark';
121
123
  };
@@ -1,10 +1,11 @@
1
1
  import { toastrWarning } from '../core/toastr';
2
2
  import { InternalMediaCenterConfig } from '../media-center/config/internal-media-center-config';
3
3
  import {} from '../media-center/config/types';
4
- import { MediaCenter } from '../media-center/media-center';
4
+ import { MediaCenterProxy } from '../media-center/media-center';
5
5
  import { CloseOrchestrator } from '../ui/player/close-orchestrator';
6
6
  import { ModalShadowHost } from '../ui/shadow-dom';
7
7
  import { mount, unmount } from 'svelte';
8
+ export { default as MediaPage } from './cmp.media-page.svelte';
8
9
  export { mapToPostPlayerModel } from '../posts/data-loaders/mapper';
9
10
  export function openMediaPageModal(init) {
10
11
  const { id, graphqlOrigin, initiator, viewerSettings, on } = init;
@@ -28,7 +29,7 @@ export function openMediaPageModal(init) {
28
29
  },
29
30
  canClose: !viewerSettings?.hideCloseButton
30
31
  });
31
- mounted = mount(MediaCenter, {
32
+ mounted = mount(MediaCenterProxy, {
32
33
  target: shadowHost.shadowRoot,
33
34
  props: {
34
35
  config: mediaCenterConfig,
@@ -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(() => {