@streamscloud/embeddable 12.0.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 (101) 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/config/internal-media-center-config.js +13 -12
  17. package/dist/media-center/config/operations.generated.d.ts +36 -30
  18. package/dist/media-center/config/operations.generated.js +53 -44
  19. package/dist/media-center/config/operations.graphql +34 -28
  20. package/dist/media-center/config/types.d.ts +8 -0
  21. package/dist/media-center/media-center/cmp.media-center-proxy.svelte +59 -0
  22. package/dist/media-center/media-center/cmp.media-center-proxy.svelte.d.ts +12 -0
  23. package/dist/media-center/media-center/discover/discover-header.svelte +10 -13
  24. package/dist/media-center/media-center/discover/discover-header.svelte.d.ts +0 -2
  25. package/dist/media-center/media-center/discover/discover-view.svelte +6 -6
  26. package/dist/media-center/media-center/discover/discover-view.svelte.d.ts +0 -2
  27. package/dist/media-center/media-center/handlers/categories-handler.svelte.d.ts +25 -12
  28. package/dist/media-center/media-center/handlers/categories-handler.svelte.js +18 -3
  29. package/dist/media-center/media-center/handlers/index.d.ts +1 -0
  30. package/dist/media-center/media-center/handlers/media-center-settings-handler.svelte.d.ts +2 -0
  31. package/dist/media-center/media-center/handlers/media-center-settings-handler.svelte.js +20 -1
  32. package/dist/media-center/media-center/header-footer/media-center-footer.svelte +6 -6
  33. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte +5 -4
  34. package/dist/media-center/media-center/header-footer/media-center-header.svelte +6 -8
  35. package/dist/media-center/media-center/header-footer/media-center-header.svelte.d.ts +0 -2
  36. package/dist/media-center/media-center/index.d.ts +1 -1
  37. package/dist/media-center/media-center/index.js +1 -1
  38. package/dist/media-center/media-center/media-center-context.svelte.d.ts +3 -13
  39. package/dist/media-center/media-center/media-center-context.svelte.js +11 -7
  40. package/dist/media-center/media-center/{cmp.media-center.svelte → media-center-view.svelte} +56 -107
  41. package/dist/media-center/media-center/media-center-view.svelte.d.ts +7 -0
  42. package/dist/media-center/media-center/menu/menu.svelte +92 -95
  43. package/dist/media-center/media-center/menu/menu.svelte.d.ts +0 -2
  44. package/dist/media-center/media-center/moments/cmp.moments-circle.svelte +7 -3
  45. package/dist/media-center/media-center/streams-in-category/streams-in-category-panel.svelte +2 -3
  46. package/dist/media-center/media-center/types.d.ts +1 -8
  47. package/dist/media-page/cmp.media-page.svelte +39 -0
  48. package/dist/media-page/cmp.media-page.svelte.d.ts +10 -0
  49. package/dist/media-page/index.d.ts +2 -0
  50. package/dist/media-page/index.js +3 -2
  51. package/dist/posts/attachments/cmp.attachments.svelte +1 -1
  52. package/dist/posts/controls/cmp.controls.svelte +4 -1
  53. package/dist/posts/controls/cmp.controls.svelte.d.ts +2 -0
  54. package/dist/posts/post-viewer/attachments-horizontal.svelte +4 -12
  55. package/dist/posts/post-viewer/heading.svelte +4 -4
  56. package/dist/posts/post-viewer/media/post-media.svelte +1 -1
  57. package/dist/posts/post-viewer/post-texts.svelte +2 -2
  58. package/dist/posts/posts-player/cmp.posts-player.svelte.d.ts +1 -0
  59. package/dist/posts/posts-player/index.d.ts +1 -0
  60. package/dist/posts/posts-player/index.js +2 -2
  61. package/dist/posts/posts-player/posts-player-proxy.svelte +13 -4
  62. package/dist/posts/posts-player/posts-player-proxy.svelte.d.ts +1 -0
  63. package/dist/products/product-card/cmp.product-card.svelte +4 -16
  64. package/dist/short-videos/short-video-card/cmp.short-video-card.svelte +6 -6
  65. package/dist/streams/data-loaders/streams-loader.js +6 -2
  66. package/dist/streams/stream-card/cmp.stream-card.svelte +1 -1
  67. package/dist/streams/streams-player/cmp.streams-player.svelte +42 -0
  68. package/dist/streams/streams-player/cmp.streams-player.svelte.d.ts +24 -0
  69. package/dist/streams/streams-player/index.d.ts +1 -0
  70. package/dist/streams/streams-player/index.js +5 -5
  71. package/dist/streams/streams-player/stream-overview.svelte +1 -1
  72. package/dist/streams/streams-player/streams-player-proxy.svelte +32 -0
  73. package/dist/streams/streams-player/streams-player-proxy.svelte.d.ts +26 -0
  74. package/dist/ui/button/resources/button-theme.svelte +0 -151
  75. package/dist/ui/button/resources/button-types.d.ts +0 -1
  76. package/dist/ui/button/resources/button-types.js +0 -1
  77. package/dist/ui/icon/cmp.icon.svelte +8 -28
  78. package/dist/ui/image/cmp.image-rounded.svelte +3 -10
  79. package/dist/ui/image/cmp.image-stub.svelte +1 -4
  80. package/dist/ui/image/cmp.image.svelte +1 -4
  81. package/dist/ui/loading/cmp.loading.svelte +1 -4
  82. package/dist/ui/player/button/cmp.mobile-player-buttons-group.svelte +2 -2
  83. package/dist/ui/player/button/cmp.mobile-player-buttons-group.svelte.d.ts +2 -2
  84. package/dist/ui/player/button/cmp.player-button.svelte +7 -3
  85. package/dist/ui/player/button/cmp.player-buttons-group.svelte +4 -3
  86. package/dist/ui/player/button/cmp.player-buttons-group.svelte.d.ts +2 -2
  87. package/dist/ui/player/button/index.d.ts +1 -1
  88. package/dist/ui/player/button/types.d.ts +1 -1
  89. package/dist/ui/player/colors/player-colors.d.ts +1 -0
  90. package/dist/ui/shadow-dom/cmp.shadow-root.svelte +156 -0
  91. package/dist/ui/shadow-dom/colors.scss +72 -0
  92. package/dist/ui/shadow-dom/index.d.ts +1 -0
  93. package/dist/ui/shadow-dom/index.js +1 -0
  94. package/dist/ui/shadow-dom/shadow-root-service.js +0 -4
  95. package/dist/ui/slider/cmp.slider.svelte +5 -5
  96. package/package.json +1 -1
  97. package/dist/media-center/media-center/cmp.media-center.svelte.d.ts +0 -4
  98. package/dist/ui/with-background/cmp.with-background.svelte +0 -86
  99. package/dist/ui/with-background/index.d.ts +0 -1
  100. package/dist/ui/with-background/index.js +0 -1
  101. /package/dist/ui/{with-background/cmp.with-background.svelte.d.ts → shadow-dom/cmp.shadow-root.svelte.d.ts} +0 -0
@@ -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,75 +70,54 @@ 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="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">
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
- {#each context.categoriesHandler.categoriesGrouped as category (category.id)}
88
- <div class="media-center-menu__tree-item">
89
- <div class="selector-item">
90
- <div class="selector-item__value">
91
- <div class="selector-item__image">
92
- <ImageRound src={category.image} noBorders={true} />
93
- </div>
94
- <div
95
- class="selector-item__text"
96
- class:selector-item__text--active={context.categoriesHandler.selectedCategoryId === category.id}
97
- onclick={() => on.categorySelected(category.id)}
98
- onkeydown={() => {}}
99
- role="button"
100
- tabindex="0">
101
- {category.name}
102
- </div>
81
+ {#snippet categoryItem(category: { type: 'main'; value: MediaCenterCategoryModel } | { type: 'child'; value: MediaCenterSubCategoryModel })}
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}>
86
+ <div class="menu-item__value" onclick={() => on.categorySelected(category.value.id)} onkeydown={() => {}} role="button" tabindex="0">
87
+ <div class="menu-item__image">
88
+ <ImageRound src={category.value.image} noBorders={true} />
103
89
  </div>
104
- <ButtonWrapper categoryId={category.id} followingHandler={context.categoryFollowingHandler} invertedOrientation={true}>
105
- <button
106
- type="button"
107
- class="selector-item__collapser"
108
- class:selector-item__collapser--hidden={!category.children.length}
109
- onclick={(e) => handleCategoryExpaned(e, category.id)}>
110
- {#if categoriesExpandedMap[category.id]}
111
- <Icon src={IconChevronDownFilled} />
112
- {:else}
113
- <Icon src={IconChevronRightFilled} />
114
- {/if}
115
- </button>
116
- </ButtonWrapper>
90
+ <div class="menu-item__text" class:menu-item__text--active={context.categoriesHandler.selectedCategoryId === category.value.id}>
91
+ {category.value.name}
92
+ </div>
93
+ {#if category.value.tag}
94
+ <div class="menu-item__tag" style="background-color: {category.value.tag.backgroundColor}; color: {category.value.tag.fontColor};">
95
+ {category.value.tag.text}
96
+ </div>
97
+ {/if}
117
98
  </div>
99
+ <ButtonWrapper categoryId={category.value.id} followingHandler={context.categoryFollowingHandler} invertedOrientation={true}>
100
+ <button
101
+ type="button"
102
+ class="menu-item__collapser"
103
+ class:menu-item__collapser--hidden={category.type === 'child' || !category.value.children.length}
104
+ onclick={(e) => handleCategoryExpaned(e, category.value.id)}>
105
+ {#if categoriesExpandedMap[category.value.id]}
106
+ <Icon src={IconChevronDownFilled} />
107
+ {:else}
108
+ <Icon src={IconChevronRightFilled} />
109
+ {/if}
110
+ </button>
111
+ </ButtonWrapper>
112
+ </div>
113
+ {/snippet}
114
+ {#each context.categoriesHandler.categoriesGrouped as category (category.id)}
115
+ <div class="media-center-menu__tree-item">
116
+ {@render categoryItem({ type: 'main', value: category })}
118
117
  {#if categoriesExpandedMap[category.id]}
119
118
  <div class="media-center-menu__tree-item" transition:slide|local>
120
119
  {#each category.children as subcategory (subcategory.id)}
121
- <div class="selector-item selector-item--child">
122
- <div class="selector-item__value">
123
- <div class="selector-item__image">
124
- <ImageRound src={subcategory.image} noBorders={true} />
125
- </div>
126
- <div
127
- class="selector-item__text"
128
- class:selector-item__text--active={context.categoriesHandler.selectedCategoryId === subcategory.id}
129
- onclick={() => on.categorySelected(subcategory.id)}
130
- onkeydown={() => {}}
131
- role="button"
132
- tabindex="0">
133
- {subcategory.name}
134
- </div>
135
- </div>
136
- <ButtonWrapper categoryId={subcategory.id} followingHandler={context.categoryFollowingHandler} invertedOrientation={true}>
137
- <button type="button" class="selector-item__collapser selector-item__collapser--hidden">
138
- <Icon src={IconChevronRightFilled} />
139
- </button>
140
- </ButtonWrapper>
141
- </div>
120
+ {@render categoryItem({ type: 'child', value: subcategory })}
142
121
  {/each}
143
122
  </div>
144
123
  {/if}
@@ -173,7 +152,8 @@ const styles = $derived.by(() => {
173
152
  }
174
153
  }
175
154
  .media-center-menu {
176
- --_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;
177
157
  background: var(--_media-center-menu--background-color);
178
158
  height: 100%;
179
159
  min-height: 100%;
@@ -185,8 +165,7 @@ const styles = $derived.by(() => {
185
165
  gap: 1.25rem;
186
166
  flex-direction: column;
187
167
  min-height: 0;
188
- padding: 0.9375rem 1.25rem;
189
- padding-right: 0.75rem;
168
+ padding: 0.9375rem 0.375rem;
190
169
  border-radius: 0 1rem 1rem 0;
191
170
  }
192
171
  .media-center-menu__content {
@@ -226,7 +205,8 @@ const styles = $derived.by(() => {
226
205
  font-size: 1.125rem;
227
206
  line-height: 1.75rem;
228
207
  font-weight: 500;
229
- color: #ffffff;
208
+ color: var(--sc-mc-color--text-primary);
209
+ padding-inline: var(--_media-center-menu--items--padding-inline);
230
210
  }
231
211
  .media-center-menu__tree {
232
212
  display: flex;
@@ -245,7 +225,7 @@ const styles = $derived.by(() => {
245
225
  flex-direction: column;
246
226
  gap: 1rem;
247
227
  padding-top: 1.25rem;
248
- padding-right: 0.5rem;
228
+ padding-inline: var(--_media-center-menu--items--padding-inline);
249
229
  }
250
230
  .media-center-menu__popular-streams {
251
231
  display: grid;
@@ -253,62 +233,78 @@ const styles = $derived.by(() => {
253
233
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
254
234
  }
255
235
 
256
- .selector-item {
236
+ .menu-item {
257
237
  display: flex;
258
238
  -webkit-user-drag: none;
259
239
  user-select: none;
260
240
  height: 2.25rem;
261
- --_selector-item--text--font-size: 0.9375rem;
262
- --_selector-item--image--size: 1.5rem;
241
+ padding-left: var(--_media-center-menu--items--padding-inline);
242
+ --_menu-item--text--font-size: 0.9375rem;
243
+ --_menu-item--image--size: 1.5rem;
263
244
  }
264
- .selector-item :global([contenteditable]) {
245
+ .menu-item :global([contenteditable]) {
265
246
  user-select: text;
266
247
  }
267
- .selector-item--child {
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
+ }
252
+ .menu-item--child {
268
253
  height: 2.125rem;
269
254
  padding-left: 1.25rem;
270
- --_selector-item--text--font-size: 0.875rem;
271
- --_selector-item--image--size: 1.375rem;
255
+ --_menu-item--text--font-size: 0.875rem;
256
+ --_menu-item--image--size: 1.375rem;
272
257
  }
273
- .selector-item__value {
258
+ .menu-item__value {
274
259
  display: flex;
275
260
  align-items: center;
276
261
  flex: 1;
277
- gap: 0.75rem;
278
262
  min-width: 0;
279
263
  cursor: pointer;
280
264
  }
281
- .selector-item__image {
282
- width: var(--_selector-item--image--size);
283
- min-width: var(--_selector-item--image--size);
284
- max-width: var(--_selector-item--image--size);
285
- height: var(--_selector-item--image--size);
286
- min-height: var(--_selector-item--image--size);
287
- max-height: var(--_selector-item--image--size);
265
+ .menu-item__image {
266
+ width: var(--_menu-item--image--size);
267
+ min-width: var(--_menu-item--image--size);
268
+ max-width: var(--_menu-item--image--size);
269
+ height: var(--_menu-item--image--size);
270
+ min-height: var(--_menu-item--image--size);
271
+ max-height: var(--_menu-item--image--size);
272
+ margin-right: 0.75rem;
288
273
  }
289
- .selector-item__text {
290
- flex: 1;
274
+ .menu-item__text {
291
275
  max-width: 100%;
292
- color: #ffffff;
293
- font-size: var(--_selector-item--text--font-size);
276
+ color: var(--sc-mc-color--text-primary);
277
+ font-size: var(--_menu-item--text--font-size);
294
278
  font-weight: 400;
295
279
  text-align: left;
296
280
  text-overflow: ellipsis;
297
281
  width: 100%;
298
282
  white-space: nowrap;
299
283
  overflow: hidden;
300
- transition: text-shadow 120ms ease;
301
284
  }
302
- .selector-item__text:hover, .selector-item__text--active {
285
+ .menu-item__text {
286
+ width: max-content;
287
+ }
288
+ .menu-item__text:hover, .menu-item__text--active {
303
289
  font-weight: 600;
304
290
  letter-spacing: -0.5px;
305
291
  }
306
- .selector-item__collapser {
307
- --icon--color: #ffffff;
292
+ .menu-item__tag {
293
+ height: min-content;
294
+ width: min-content;
295
+ border-radius: 0.25rem;
296
+ padding: 0.3125rem 0.375rem;
297
+ font-size: 0.5rem;
298
+ font-weight: 600;
299
+ margin-top: -1rem;
300
+ margin-left: 0.25rem;
301
+ }
302
+ .menu-item__collapser {
303
+ --icon--color: var(--sc-mc-color--text-primary);
308
304
  --icon--size: 1rem;
309
305
  padding: 0.5rem;
310
306
  }
311
- .selector-item__collapser--hidden {
307
+ .menu-item__collapser--hidden {
312
308
  visibility: hidden;
313
309
  }
314
310
 
@@ -316,6 +312,7 @@ const styles = $derived.by(() => {
316
312
  display: flex;
317
313
  align-items: center;
318
314
  gap: 0.9375rem;
315
+ padding-inline: var(--_media-center-menu--items--padding-inline);
319
316
  }
320
317
  .media-center-target__image {
321
318
  width: 3.5rem;
@@ -328,7 +325,7 @@ const styles = $derived.by(() => {
328
325
  .media-center-target__info {
329
326
  display: flex;
330
327
  flex-direction: column;
331
- color: #ffffff;
328
+ color: var(--sc-mc-color--text-primary);
332
329
  }
333
330
  .media-center-target__name {
334
331
  font-size: 1.125rem;
@@ -349,5 +346,5 @@ const styles = $derived.by(() => {
349
346
  font-size: 0.75rem;
350
347
  line-height: 1;
351
348
  font-weight: 400;
352
- color: #d1d5db;
349
+ color: var(--sc-mc-color--text-secondary);
353
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;