@streamscloud/embeddable 10.1.2 → 11.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 (112) hide show
  1. package/dist/ads/ad-card/cmp.ad-card.svelte +27 -7
  2. package/dist/ads/ad-card/cmp.ad-card.svelte.d.ts +5 -0
  3. package/dist/content-player/cmp.content-player.svelte +30 -40
  4. package/dist/content-player/content-player-config.svelte.d.ts +13 -2
  5. package/dist/content-player/content-player-config.svelte.js +8 -5
  6. package/dist/content-player/content-player-settings.d.ts +12 -0
  7. package/dist/content-player/content-player-settings.js +12 -0
  8. package/dist/content-player/controls-and-attachments.svelte +25 -54
  9. package/dist/content-player/header.svelte +10 -132
  10. package/dist/content-player/header.svelte.d.ts +0 -4
  11. package/dist/content-player/overview-panel.svelte +22 -72
  12. package/dist/content-player/overview-panel.svelte.d.ts +30 -7
  13. package/dist/content-player/ui-manager.svelte.d.ts +2 -4
  14. package/dist/content-player/ui-manager.svelte.js +3 -5
  15. package/dist/media-center/config/internal-media-center-config.js +2 -1
  16. package/dist/media-center/config/operations.generated.d.ts +13 -0
  17. package/dist/media-center/config/operations.generated.js +20 -0
  18. package/dist/media-center/config/operations.graphql +13 -0
  19. package/dist/media-center/config/types.d.ts +13 -0
  20. package/dist/media-center/media-center/cmp.media-center.svelte +117 -348
  21. package/dist/media-center/media-center/cmp.media-center.svelte.d.ts +3 -1
  22. package/dist/media-center/media-center/{discover-panel-handler.svelte.d.ts → discover/discover-panel-handler.svelte.d.ts} +5 -6
  23. package/dist/media-center/media-center/{discover-panel-handler.svelte.js → discover/discover-panel-handler.svelte.js} +1 -8
  24. package/dist/media-center/media-center/discover/discover-panel-localization.d.ts +19 -0
  25. package/dist/media-center/media-center/discover/discover-panel-localization.js +78 -0
  26. package/dist/media-center/media-center/{discover-panel.svelte → discover/discover-panel.svelte} +18 -9
  27. package/dist/media-center/media-center/discover/discover-panel.svelte.d.ts +15 -0
  28. package/dist/media-center/media-center/discover/index.d.ts +2 -0
  29. package/dist/media-center/media-center/discover/index.js +2 -0
  30. package/dist/media-center/media-center/handlers/categories-handler.svelte.d.ts +21 -0
  31. package/dist/media-center/media-center/handlers/categories-handler.svelte.js +36 -0
  32. package/dist/media-center/media-center/handlers/feed-handler.svelte.d.ts +6 -0
  33. package/dist/media-center/media-center/handlers/feed-handler.svelte.js +12 -0
  34. package/dist/media-center/media-center/handlers/index.d.ts +2 -0
  35. package/dist/media-center/media-center/handlers/index.js +2 -0
  36. package/dist/media-center/media-center/header-footer/index.d.ts +3 -0
  37. package/dist/media-center/media-center/header-footer/index.js +3 -0
  38. package/dist/media-center/media-center/header-footer/media-center-footer.svelte +77 -0
  39. package/dist/media-center/media-center/header-footer/media-center-footer.svelte.d.ts +7 -0
  40. package/dist/media-center/media-center/header-footer/media-center-header-localization.d.ts +12 -0
  41. package/dist/media-center/media-center/header-footer/media-center-header-localization.js +40 -0
  42. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte +91 -0
  43. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte.d.ts +11 -0
  44. package/dist/media-center/media-center/header-footer/media-center-header.svelte +310 -0
  45. package/dist/media-center/media-center/header-footer/media-center-header.svelte.d.ts +13 -0
  46. package/dist/media-center/media-center/media-center-context.svelte.d.ts +50 -0
  47. package/dist/media-center/media-center/media-center-context.svelte.js +98 -0
  48. package/dist/media-center/media-center/{category-following-wrapper.svelte → menu/category-following-wrapper.svelte} +3 -2
  49. package/dist/media-center/media-center/{category-following-wrapper.svelte.d.ts → menu/category-following-wrapper.svelte.d.ts} +2 -2
  50. package/dist/media-center/media-center/menu/index.d.ts +2 -0
  51. package/dist/media-center/media-center/menu/index.js +2 -0
  52. package/dist/media-center/media-center/menu/menu-localization.d.ts +19 -0
  53. package/dist/media-center/media-center/menu/menu-localization.js +78 -0
  54. package/dist/media-center/media-center/menu/menu.svelte +345 -0
  55. package/dist/media-center/media-center/menu/menu.svelte.d.ts +14 -0
  56. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.d.ts +10 -0
  57. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.js +26 -0
  58. package/dist/media-center/media-center/providers/index.d.ts +2 -0
  59. package/dist/media-center/media-center/providers/index.js +2 -0
  60. package/dist/media-center/media-center/providers/post-player-provider-generator.d.ts +8 -0
  61. package/dist/media-center/media-center/{post-player-provider-generator.js → providers/post-player-provider-generator.js} +3 -3
  62. package/dist/media-center/media-center/{streams-player-provider-generator.d.ts → providers/streams-player-provider-generator.d.ts} +2 -2
  63. package/dist/media-center/media-center/{streams-player-provider-generator.js → providers/streams-player-provider-generator.js} +2 -2
  64. package/dist/media-center/media-center/streams-in-category/index.d.ts +2 -0
  65. package/dist/media-center/media-center/streams-in-category/index.js +2 -0
  66. package/dist/media-center/media-center/{streams-in-category-panel-handler.svelte.d.ts → streams-in-category/streams-in-category-panel-handler.svelte.d.ts} +4 -4
  67. package/dist/media-center/media-center/{streams-in-category-panel-handler.svelte.js → streams-in-category/streams-in-category-panel-handler.svelte.js} +5 -5
  68. package/dist/media-center/media-center/{streams-in-category-panel.svelte → streams-in-category/streams-in-category-panel.svelte} +1 -1
  69. package/dist/media-center/media-center/{streams-in-category-panel.svelte.d.ts → streams-in-category/streams-in-category-panel.svelte.d.ts} +1 -1
  70. package/dist/media-center/media-center/types.d.ts +1 -1
  71. package/dist/media-center/model/types.d.ts +7 -6
  72. package/dist/posts/attachments/cmp.attachments.svelte +5 -3
  73. package/dist/posts/attachments/cmp.attachments.svelte.d.ts +6 -0
  74. package/dist/posts/controls/cmp.controls.svelte +3 -3
  75. package/dist/posts/controls/cmp.controls.svelte.d.ts +2 -0
  76. package/dist/posts/post-viewer/cmp.post-viewer.svelte +3 -1
  77. package/dist/posts/post-viewer/cmp.post-viewer.svelte.d.ts +4 -0
  78. package/dist/products/product-card/cmp.product-card.svelte +35 -11
  79. package/dist/products/product-card/cmp.product-card.svelte.d.ts +5 -0
  80. package/dist/streams/data-loaders/mapper.js +0 -5
  81. package/dist/streams/data-loaders/operations.generated.d.ts +0 -12
  82. package/dist/streams/data-loaders/operations.generated.js +0 -26
  83. package/dist/streams/data-loaders/operations.graphql +0 -6
  84. package/dist/streams/layout/element-views/cmp.short-video-stream-element.svelte +2 -1
  85. package/dist/streams/layout/element-views/cmp.short-video-stream-element.svelte.d.ts +4 -0
  86. package/dist/streams/stream-card/cmp.stream-card.svelte +5 -5
  87. package/dist/streams/streams-player/index.js +1 -1
  88. package/dist/streams/streams-player/stream-overview.svelte +6 -96
  89. package/dist/streams/streams-player/stream-overview.svelte.d.ts +0 -4
  90. package/dist/streams/streams-player/stream-player-localization.d.ts +0 -1
  91. package/dist/streams/streams-player/stream-player-localization.js +0 -6
  92. package/dist/streams/streams-player/streams-player-view.svelte +0 -2
  93. package/dist/streams/streams-player/types.d.ts +0 -4
  94. package/dist/ui/icon/cmp.icon.svelte +3 -2
  95. package/dist/ui/player/button/cmp.player-button.svelte +17 -5
  96. package/dist/ui/player/button/cmp.player-button.svelte.d.ts +3 -0
  97. package/dist/ui/player/button/cmp.player-buttons-group.svelte +20 -5
  98. package/dist/ui/player/button/cmp.player-buttons-group.svelte.d.ts +2 -0
  99. package/dist/ui/player/button/types.d.ts +2 -0
  100. package/package.json +1 -1
  101. package/dist/content-player/content-player-localization.d.ts +0 -6
  102. package/dist/content-player/content-player-localization.js +0 -15
  103. package/dist/media-center/media-center/desktop-categories-selector.svelte +0 -132
  104. package/dist/media-center/media-center/desktop-categories-selector.svelte.d.ts +0 -12
  105. package/dist/media-center/media-center/discover-panel.svelte.d.ts +0 -15
  106. package/dist/media-center/media-center/media-center-handler.svelte.d.ts +0 -28
  107. package/dist/media-center/media-center/media-center-handler.svelte.js +0 -73
  108. package/dist/media-center/media-center/media-center-localization.d.ts +0 -10
  109. package/dist/media-center/media-center/media-center-localization.js +0 -39
  110. package/dist/media-center/media-center/mobile-controls-panel.svelte +0 -268
  111. package/dist/media-center/media-center/mobile-controls-panel.svelte.d.ts +0 -20
  112. package/dist/media-center/media-center/post-player-provider-generator.d.ts +0 -8
@@ -0,0 +1,345 @@
1
+ <script lang="ts">import { slideHorizontally } from '../../../core/transitions';
2
+ import { compactNumber } from '../../../core/utils/compact-number';
3
+ import { StreamCard } from '../../../streams/stream-card';
4
+ import { Icon } from '../../../ui/icon';
5
+ import { ImageRound } from '../../../ui/image';
6
+ import { LineClamp } from '../../../ui/line-clamp';
7
+ import { default as ButtonWrapper } from './category-following-wrapper.svelte';
8
+ import { MenuLocalization } from './menu-localization';
9
+ import IconChevronDownFilled from '@fluentui/svg-icons/icons/chevron_down_20_filled.svg?raw';
10
+ import IconChevronRightFilled from '@fluentui/svg-icons/icons/chevron_right_20_filled.svg?raw';
11
+ import { slide } from 'svelte/transition';
12
+ let { context, locale, on } = $props();
13
+ const localization = $derived(new MenuLocalization(locale));
14
+ const target = $derived.by(() => context.targetData);
15
+ const generateCategoriesMap = () => {
16
+ const expanded = {};
17
+ context.categoriesHandler.categories.forEach((c) => {
18
+ const isSelfSelected = context.categoriesHandler.selectedCategoryId === c.id;
19
+ const hasSelectedChild = c.children.some((ch) => ch.id === context.categoriesHandler.selectedCategoryId);
20
+ expanded[c.id] = isSelfSelected || hasSelectedChild;
21
+ });
22
+ return expanded;
23
+ };
24
+ const categoriesExpandedMap = $state(generateCategoriesMap());
25
+ const handleCategoryExpaned = (e, categoryId) => {
26
+ e.stopPropagation();
27
+ categoriesExpandedMap[categoryId] = !categoriesExpandedMap[categoryId];
28
+ };
29
+ const styles = $derived.by(() => {
30
+ var _a, _b;
31
+ const values = [];
32
+ if ((_a = context.playerColors) === null || _a === void 0 ? void 0 : _a.menuBackground) {
33
+ values.push(`--media-center-menu--background-color: ${context.playerColors.menuBackground}`);
34
+ }
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
+ return values.join(';');
39
+ });
40
+ </script>
41
+
42
+ <div class="media-center-menu" transition:slideHorizontally|local style={styles} onclick={(e) => e.stopPropagation()} onkeydown={() => {}} role="none">
43
+ {#if target}
44
+ <div class="media-center-target">
45
+ <div class="media-center-target__image">
46
+ <ImageRound src={target.image} />
47
+ </div>
48
+ <div class="media-center-target__info">
49
+ <div class="media-center-target__name">
50
+ <LineClamp maxLines={1}>
51
+ {target.name}
52
+ </LineClamp>
53
+ </div>
54
+ {#if target.membersCount}
55
+ <LineClamp maxLines={1}>
56
+ <div class="media-center-target__members">
57
+ <span class="media-center-target__members-count">
58
+ {compactNumber(target.membersCount, { locale: localization.locale })}
59
+ </span>
60
+ <span class="media-center-target__members-label">
61
+ {localization.membersLabel(target.membersCount)}
62
+ </span>
63
+ </div>
64
+ </LineClamp>
65
+ {/if}
66
+ </div>
67
+ </div>
68
+ {/if}
69
+ <div class="media-center-menu__content">
70
+ <div class="media-center-menu__section-title">
71
+ {localization.interestsSectionTitle}
72
+ </div>
73
+ <div class="media-center-menu__tree">
74
+ {#each context.categoriesHandler.categories as category (category.id)}
75
+ <div class="media-center-menu__tree-item">
76
+ <div class="selector-item">
77
+ <div class="selector-item__value">
78
+ <div class="selector-item__image">
79
+ <ImageRound src={category.image} noBorders={true} />
80
+ </div>
81
+ <div
82
+ class="selector-item__text"
83
+ class:selector-item__text--active={!context.discoverHandler.activated && context.categoriesHandler.selectedCategoryId === category.id}
84
+ onclick={() => on.categorySelected(category.id)}
85
+ onkeydown={() => {}}
86
+ role="button"
87
+ tabindex="0">
88
+ {category.name}
89
+ </div>
90
+ </div>
91
+ <ButtonWrapper categoryId={category.id} followingHandler={context.categoryFollowingHandler} invertedOrientation={true}>
92
+ <button
93
+ type="button"
94
+ class="selector-item__collapser"
95
+ class:selector-item__collapser--hidden={!category.children.length}
96
+ onclick={(e) => handleCategoryExpaned(e, category.id)}>
97
+ {#if categoriesExpandedMap[category.id]}
98
+ <Icon src={IconChevronDownFilled} />
99
+ {:else}
100
+ <Icon src={IconChevronRightFilled} />
101
+ {/if}
102
+ </button>
103
+ </ButtonWrapper>
104
+ </div>
105
+ {#if categoriesExpandedMap[category.id]}
106
+ <div class="media-center-menu__tree-item" transition:slide|local>
107
+ {#each category.children as subcategory (subcategory.id)}
108
+ <div class="selector-item selector-item--child">
109
+ <div class="selector-item__value">
110
+ <div class="selector-item__image">
111
+ <ImageRound src={subcategory.image} noBorders={true} />
112
+ </div>
113
+ <div
114
+ class="selector-item__text"
115
+ class:selector-item__text--active={!context.discoverHandler.activated && context.categoriesHandler.selectedCategoryId === subcategory.id}
116
+ onclick={() => on.categorySelected(subcategory.id)}
117
+ onkeydown={() => {}}
118
+ role="button"
119
+ tabindex="0">
120
+ {subcategory.name}
121
+ </div>
122
+ </div>
123
+ <ButtonWrapper categoryId={subcategory.id} followingHandler={context.categoryFollowingHandler} invertedOrientation={true}>
124
+ <button type="button" class="selector-item__collapser selector-item__collapser--hidden">
125
+ <Icon src={IconChevronRightFilled} />
126
+ </button>
127
+ </ButtonWrapper>
128
+ </div>
129
+ {/each}
130
+ </div>
131
+ {/if}
132
+ </div>
133
+ {/each}
134
+ </div>
135
+
136
+ {#if context.popularStreamsHandler.streamSectionItems.length > 0}
137
+ <div class="media-center-menu__popular-streams-section">
138
+ <div class="media-center-menu__section-title">
139
+ {localization.popularStreamsSectionTitle}
140
+ </div>
141
+ <div class="media-center-menu__popular-streams">
142
+ {#each context.popularStreamsHandler.streamSectionItems as item (item.id)}
143
+ <StreamCard stream={item} on={{ click: () => on.streamSelected(item) }}></StreamCard>
144
+ {/each}
145
+ </div>
146
+ </div>
147
+ {/if}
148
+ </div>
149
+ </div>
150
+
151
+ <style>@keyframes fadeIn {
152
+ 0% {
153
+ opacity: 1;
154
+ }
155
+ 50% {
156
+ opacity: 0.4;
157
+ }
158
+ 100% {
159
+ opacity: 1;
160
+ }
161
+ }
162
+ .media-center-menu {
163
+ --_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
+ background: var(--_media-center-menu--background-color);
166
+ height: 100%;
167
+ min-height: 100%;
168
+ max-height: 100%;
169
+ width: 100%;
170
+ min-width: 100%;
171
+ max-width: 100%;
172
+ display: flex;
173
+ gap: 1.25rem;
174
+ flex-direction: column;
175
+ min-height: 0;
176
+ padding: 0.9375rem 1.25rem;
177
+ padding-right: 0.75rem;
178
+ border-radius: 0 1rem 1rem 0;
179
+ }
180
+ .media-center-menu__content {
181
+ display: flex;
182
+ flex: 1;
183
+ gap: 1rem;
184
+ flex-direction: column;
185
+ overflow: hidden;
186
+ overflow-y: auto;
187
+ overscroll-behavior: contain;
188
+ --_cross-browser-scrollbar--thumb-color: transparent;
189
+ --_cross-browser-scrollbar--track-color: transparent;
190
+ }
191
+ .media-center-menu__content:hover {
192
+ --_cross-browser-scrollbar--thumb-color: var(--scrollbar--thumb-color, #7d7d7d);
193
+ --_cross-browser-scrollbar--track-color: var(--scrollbar--track-color, transparent);
194
+ }
195
+ .media-center-menu__content::-webkit-scrollbar {
196
+ width: 6px;
197
+ height: 6px;
198
+ }
199
+ .media-center-menu__content::-webkit-scrollbar-track {
200
+ background: var(--_cross-browser-scrollbar--track-color);
201
+ border-radius: 100vw;
202
+ }
203
+ .media-center-menu__content::-webkit-scrollbar-thumb {
204
+ background: var(--_cross-browser-scrollbar--thumb-color);
205
+ border-radius: 100vw;
206
+ }
207
+ @supports (scrollbar-color: transparent transparent) {
208
+ .media-center-menu__content {
209
+ scrollbar-color: var(--_cross-browser-scrollbar--thumb-color) var(--_cross-browser-scrollbar--track-color);
210
+ scrollbar-width: thin;
211
+ }
212
+ }
213
+ .media-center-menu__section-title {
214
+ font-size: 1.125rem;
215
+ line-height: 1.75rem;
216
+ font-weight: 600;
217
+ color: #ffffff;
218
+ }
219
+ .media-center-menu__tree {
220
+ display: flex;
221
+ flex-direction: column;
222
+ flex: 1;
223
+ gap: 1rem;
224
+ }
225
+ .media-center-menu__tree-item {
226
+ display: flex;
227
+ flex-direction: column;
228
+ gap: 0.5rem;
229
+ }
230
+ .media-center-menu__popular-streams-section {
231
+ display: flex;
232
+ margin-top: auto;
233
+ flex-direction: column;
234
+ gap: 1rem;
235
+ padding-top: 1.25rem;
236
+ padding-right: 0.5rem;
237
+ }
238
+ .media-center-menu__popular-streams {
239
+ display: grid;
240
+ gap: 1rem;
241
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
242
+ }
243
+
244
+ .selector-item {
245
+ display: flex;
246
+ -webkit-user-drag: none;
247
+ user-select: none;
248
+ height: 2.25rem;
249
+ --_selector-item--text--font-size: 0.9375rem;
250
+ --_selector-item--text--font-weight: 600;
251
+ --_selector-item--image--size: 1.5rem;
252
+ }
253
+ .selector-item :global([contenteditable]) {
254
+ user-select: text;
255
+ }
256
+ .selector-item--child {
257
+ height: 2.125rem;
258
+ padding-left: 1.25rem;
259
+ --_selector-item--text--font-size: 0.875rem;
260
+ --_selector-item--text--font-weight: 500;
261
+ --_selector-item--image--size: 1.375rem;
262
+ }
263
+ .selector-item__value {
264
+ display: flex;
265
+ align-items: center;
266
+ flex: 1;
267
+ gap: 0.75rem;
268
+ min-width: 0;
269
+ cursor: pointer;
270
+ }
271
+ .selector-item__image {
272
+ width: var(--_selector-item--image--size);
273
+ min-width: var(--_selector-item--image--size);
274
+ max-width: var(--_selector-item--image--size);
275
+ height: var(--_selector-item--image--size);
276
+ min-height: var(--_selector-item--image--size);
277
+ max-height: var(--_selector-item--image--size);
278
+ }
279
+ .selector-item__text {
280
+ flex: 1;
281
+ max-width: 100%;
282
+ color: #ffffff;
283
+ font-size: var(--_selector-item--text--font-size);
284
+ font-weight: var(--_selector-item--text--font-weight);
285
+ text-align: left;
286
+ text-overflow: ellipsis;
287
+ width: 100%;
288
+ white-space: nowrap;
289
+ overflow: hidden;
290
+ transition: text-shadow 120ms ease;
291
+ }
292
+ .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;
294
+ }
295
+ .selector-item__collapser {
296
+ --icon--color: #ffffff;
297
+ --icon--size: 1rem;
298
+ padding: 0.5rem;
299
+ }
300
+ .selector-item__collapser--hidden {
301
+ visibility: hidden;
302
+ }
303
+
304
+ .media-center-target {
305
+ display: flex;
306
+ align-items: center;
307
+ gap: 0.9375rem;
308
+ }
309
+ .media-center-target__image {
310
+ width: 3.5rem;
311
+ min-width: 3.5rem;
312
+ max-width: 3.5rem;
313
+ height: 3.5rem;
314
+ min-height: 3.5rem;
315
+ 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
+ }
320
+ .media-center-target__info {
321
+ display: flex;
322
+ flex-direction: column;
323
+ color: #ffffff;
324
+ }
325
+ .media-center-target__name {
326
+ font-size: 1.125rem;
327
+ line-height: 1.75rem;
328
+ font-weight: 600;
329
+ }
330
+ .media-center-target__members {
331
+ display: flex;
332
+ align-items: flex-end;
333
+ gap: 0.5rem;
334
+ }
335
+ .media-center-target__members-count {
336
+ font-size: 0.9375rem;
337
+ line-height: 1;
338
+ font-weight: 500;
339
+ }
340
+ .media-center-target__members-label {
341
+ font-size: 0.75rem;
342
+ line-height: 1;
343
+ font-weight: 400;
344
+ color: #d1d5db;
345
+ }</style>
@@ -0,0 +1,14 @@
1
+ import type { Locale } from '../../../core/locale';
2
+ import type { StreamPlayerModel } from '../../../streams/streams-player';
3
+ import type { MediaCenterContext } from '../media-center-context.svelte';
4
+ type Props = {
5
+ context: MediaCenterContext;
6
+ locale: Locale;
7
+ on: {
8
+ categorySelected: (categoryId: string) => void;
9
+ streamSelected: (stream: StreamPlayerModel) => void;
10
+ };
11
+ };
12
+ declare const Menu: import("svelte").Component<Props, {}, "">;
13
+ type Menu = ReturnType<typeof Menu>;
14
+ export default Menu;
@@ -0,0 +1,10 @@
1
+ import type { IMediaCenterConfig } from '../..';
2
+ import type { StreamPlayerModel } from '../../../streams/streams-player/types';
3
+ export declare class PopularStreamsPanelHandler {
4
+ private readonly config;
5
+ private _state;
6
+ private _streams;
7
+ constructor(config: IMediaCenterConfig | null);
8
+ get streamSectionItems(): StreamPlayerModel[];
9
+ init: () => Promise<void>;
10
+ }
@@ -0,0 +1,26 @@
1
+ export class PopularStreamsPanelHandler {
2
+ config;
3
+ _state = $state('not-initialized');
4
+ _streams = $state.raw([]);
5
+ constructor(config) {
6
+ this.config = config;
7
+ }
8
+ get streamSectionItems() {
9
+ return this._streams;
10
+ }
11
+ init = async () => {
12
+ if (!this.config) {
13
+ return;
14
+ }
15
+ if (this._state === 'not-initialized') {
16
+ this._state = 'loading';
17
+ try {
18
+ const streamsResponse = await this.config.streamPlayer.getStreamsCursor({ filter: {}, limit: 2 });
19
+ this._streams = streamsResponse.items;
20
+ }
21
+ finally {
22
+ this._state = 'ready';
23
+ }
24
+ }
25
+ };
26
+ }
@@ -0,0 +1,2 @@
1
+ export { makePostPlayerItemsProvider } from './post-player-provider-generator';
2
+ export { makeStreamsPlayerDataProvider } from './streams-player-provider-generator';
@@ -0,0 +1,2 @@
1
+ export { makePostPlayerItemsProvider } from './post-player-provider-generator';
2
+ export { makeStreamsPlayerDataProvider } from './streams-player-provider-generator';
@@ -0,0 +1,8 @@
1
+ import type { IMediaCenterConfig } from '../../config/types';
2
+ import type { PostPlayerModel } from '../../../posts/posts-player/types';
3
+ import type { IFeedPlayerDataProvider } from '../../../ui/player/providers';
4
+ export declare const makePostPlayerItemsProvider: (data: {
5
+ config: IMediaCenterConfig;
6
+ categoryId?: string;
7
+ prefetchedItems?: PostPlayerModel[];
8
+ }) => IFeedPlayerDataProvider<PostPlayerModel>;
@@ -1,6 +1,6 @@
1
- import { ContinuationToken } from '../../core/continuation-token';
2
- import { CursorDataLoader } from '../../core/data-loaders';
3
- import { PostType } from '../../core/enums';
1
+ import { ContinuationToken } from '../../../core/continuation-token';
2
+ import { CursorDataLoader } from '../../../core/data-loaders';
3
+ import { PostType } from '../../../core/enums';
4
4
  export const makePostPlayerItemsProvider = (data) => {
5
5
  const { config, categoryId, prefetchedItems = [] } = data;
6
6
  const loader = new CursorDataLoader({
@@ -1,5 +1,5 @@
1
- import type { IStreamsPlayerDataProvider, StreamPlayerModel } from '../../streams/streams-player/types';
2
- import type { IMediaCenterConfig } from '../config/types';
1
+ import type { IMediaCenterConfig } from '../../config/types';
2
+ import type { IStreamsPlayerDataProvider, StreamPlayerModel } from '../../../streams/streams-player/types';
3
3
  export declare const makeStreamsPlayerDataProvider: (data: {
4
4
  config: IMediaCenterConfig;
5
5
  initialStreamId?: string;
@@ -1,5 +1,5 @@
1
- import { ContinuationToken } from '../../core/continuation-token';
2
- import { CursorDataLoader } from '../../core/data-loaders';
1
+ import { ContinuationToken } from '../../../core/continuation-token';
2
+ import { CursorDataLoader } from '../../../core/data-loaders';
3
3
  export const makeStreamsPlayerDataProvider = (data) => {
4
4
  const { config, categoryId, prefetchedStreams: initialPrefetchedStreams = [], initialStreamId } = data;
5
5
  const loader = new CursorDataLoader({
@@ -0,0 +1,2 @@
1
+ export { default as StreamsInCategoryPanel } from './streams-in-category-panel.svelte';
2
+ export { StreamsInCategoryPanelHandler } from './streams-in-category-panel-handler.svelte';
@@ -0,0 +1,2 @@
1
+ export { default as StreamsInCategoryPanel } from './streams-in-category-panel.svelte';
2
+ export { StreamsInCategoryPanelHandler } from './streams-in-category-panel-handler.svelte';
@@ -1,6 +1,6 @@
1
- import type { IMediaCenterConfig } from '../../short-videos/short-videos-player';
2
- import type { StreamPlayerModel } from '../../streams/streams-player';
3
- import type { MediaCenterCategoryData } from './types';
1
+ import type { IMediaCenterConfig } from '../../../short-videos/short-videos-player';
2
+ import type { StreamPlayerModel } from '../../../streams/streams-player';
3
+ import type { MediaCenterCategoryData } from '../types';
4
4
  export declare class StreamsInCategoryPanelHandler {
5
5
  private readonly config;
6
6
  private _activated;
@@ -15,6 +15,6 @@ export declare class StreamsInCategoryPanelHandler {
15
15
  get activated(): boolean;
16
16
  get active(): boolean;
17
17
  get loading(): boolean;
18
- activate: (category: MediaCenterCategoryData) => Promise<void>;
18
+ activate: (categoryData: MediaCenterCategoryData | null) => Promise<void>;
19
19
  deactivate: () => void;
20
20
  }
@@ -26,16 +26,16 @@ export class StreamsInCategoryPanelHandler {
26
26
  get loading() {
27
27
  return this._activated && this._state === 'loading';
28
28
  }
29
- activate = async (category) => {
30
- if (!this.config) {
29
+ activate = async (categoryData) => {
30
+ if (!this.config || !categoryData) {
31
31
  return;
32
32
  }
33
33
  this._activated = true;
34
34
  this._state = 'loading';
35
35
  try {
36
- const streamsResponse = await this.config.streamPlayer.getStreamsCursor({ filter: { categoryId: category.id }, limit: 5 });
37
- this._categoryName = category.parentName ? `${category.parentName} - ${category.name}` : category.name;
38
- this._categoryId = category.id;
36
+ const streamsResponse = await this.config.streamPlayer.getStreamsCursor({ filter: { categoryId: categoryData.id }, limit: 5 });
37
+ this._categoryName = categoryData.parentName ? `${categoryData.parentName} - ${categoryData.name}` : categoryData.name;
38
+ this._categoryId = categoryData.id;
39
39
  this._streams = streamsResponse.items;
40
40
  }
41
41
  finally {
@@ -1,4 +1,4 @@
1
- <script lang="ts">import { StreamCard } from '../../streams/stream-card';
1
+ <script lang="ts">import { StreamCard } from '../../../streams/stream-card';
2
2
  import { StreamsInCategoryPanelHandler } from './streams-in-category-panel-handler.svelte';
3
3
  let { handler, on } = $props();
4
4
  </script>
@@ -1,4 +1,4 @@
1
- import type { StreamPlayerModel } from '../../streams/streams-player';
1
+ import type { StreamPlayerModel } from '../../../streams/streams-player/types';
2
2
  import { StreamsInCategoryPanelHandler } from './streams-in-category-panel-handler.svelte';
3
3
  type Props = {
4
4
  handler: StreamsInCategoryPanelHandler;
@@ -1,4 +1,4 @@
1
- export type MediaCenterMode = 'stream' | 'posts';
1
+ export type MediaCenterMode = 'streams-feed' | 'posts-feed' | 'discover';
2
2
  export type MediaCenterCategoryData = {
3
3
  id: string;
4
4
  name: string;
@@ -1,15 +1,16 @@
1
1
  import type { Snippet } from 'svelte';
2
2
  export type MediaCenterData = {
3
- controlsPanel?: Snippet;
4
- playerLogo: string | null;
3
+ header?: Snippet;
4
+ mobileFooter?: Snippet;
5
5
  overlayIsActive: boolean;
6
6
  callbacks: {
7
- onHeaderHeightChanged: (data: {
8
- height: number;
9
- }) => void;
10
- onExtraActionsForMobileControlsPanelDetermined: (actions: ExtraActionDefinition[]) => void;
7
+ onPlayerInitialized: (data: MediaCenterPlayerInitializedData) => void;
11
8
  };
12
9
  };
10
+ export type MediaCenterPlayerInitializedData = {
11
+ extraActionsForMobilePanel: ExtraActionDefinition[];
12
+ closePlayerFn: (() => void) | null;
13
+ };
13
14
  export type ExtraActionDefinition = {
14
15
  name: string;
15
16
  callback: () => void;
@@ -2,7 +2,7 @@
2
2
  import { AdCard } from '../../ads/ad-card';
3
3
  import { PostModel } from '../model';
4
4
  import { ProductCard } from '../../products/product-card';
5
- let { model, trackingParams: externalTrackingParams, locale = 'en', on } = $props();
5
+ let { model, colors, trackingParams: externalTrackingParams, locale = 'en', on } = $props();
6
6
  const trackingParams = $derived.by(() => {
7
7
  if (externalTrackingParams || externalTrackingParams === false) {
8
8
  return externalTrackingParams;
@@ -15,11 +15,12 @@ const trackingParams = $derived.by(() => {
15
15
  </script>
16
16
 
17
17
  {#if model.attachments}
18
- <div class="post-attachments">
18
+ <div class="post-attachments" data-theme="dark">
19
19
  {#if model.attachments.ads.length}
20
20
  {#each model.attachments.ads as ad (ad.id)}
21
21
  <AdCard
22
22
  ad={ad}
23
+ colors={colors}
23
24
  trackingParams={trackingParams}
24
25
  on={{
25
26
  click: on?.adClick,
@@ -32,6 +33,7 @@ const trackingParams = $derived.by(() => {
32
33
  {#each model.attachments.products as product (product.id)}
33
34
  <ProductCard
34
35
  product={product}
36
+ colors={colors}
35
37
  trackingParams={trackingParams}
36
38
  locale={locale}
37
39
  on={{
@@ -55,7 +57,7 @@ const trackingParams = $derived.by(() => {
55
57
  }
56
58
  }
57
59
  .post-attachments {
58
- --_post-attachments--gap: var(--post-attachments--gap, 2.75rem);
60
+ --_post-attachments--gap: var(--post-attachments--gap, 1.875rem);
59
61
  display: flex;
60
62
  flex-direction: column;
61
63
  gap: var(--_post-attachments--gap);
@@ -3,6 +3,12 @@ import type { TrackingParams } from '../../marketing-tracking';
3
3
  import { PostModel } from '../model';
4
4
  type Props = {
5
5
  model: PostModel;
6
+ colors: {
7
+ background?: string | null;
8
+ price?: string | null;
9
+ salePrice?: string | null;
10
+ buttonBackground?: string | null;
11
+ };
6
12
  trackingParams: TrackingParams | null;
7
13
  locale?: Locale;
8
14
  on?: {
@@ -16,7 +16,7 @@ import IconShare from '@fluentui/svg-icons/icons/share_28_regular.svg?raw';
16
16
  import IconShoppingBag from '@fluentui/svg-icons/icons/shopping_bag_28_regular.svg?raw';
17
17
  import IconSpeaker2 from '@fluentui/svg-icons/icons/speaker_2_28_regular.svg?raw';
18
18
  import IconSpeakerMute from '@fluentui/svg-icons/icons/speaker_mute_28_regular.svg?raw';
19
- let { model, socialInteractionsHandler, on } = $props();
19
+ let { model, activeColor, inactiveColor, socialInteractionsHandler, on } = $props();
20
20
  const showSocialInteractions = $derived(!!socialInteractionsHandler && model.enableSocialInteractions);
21
21
  let isLikedStore = $state.raw({
22
22
  get isLiked() {
@@ -73,8 +73,8 @@ const refreshIsLiked = () => __awaiter(void 0, void 0, void 0, function* () {
73
73
 
74
74
  {#if actions.length > 0}
75
75
  {#if actions.length === 1}
76
- <PlayerButton scaleEffect={true} icon={actions[0].icon} on={{ click: actions[0].callback }} />
76
+ <PlayerButton scaleEffect={true} activeColor={activeColor} inactiveColor={inactiveColor} icon={actions[0].icon} on={{ click: actions[0].callback }} />
77
77
  {:else}
78
- <PlayerButtonsGroup scaleEffect={true} actions={actions} />
78
+ <PlayerButtonsGroup scaleEffect={true} borderColor={activeColor} backgroundColor={inactiveColor} actions={actions} />
79
79
  {/if}
80
80
  {/if}
@@ -2,6 +2,8 @@ import type { PostModel } from '../model';
2
2
  import type { IPostSocialInteractionsHandler } from '../social-interactions';
3
3
  type Props = {
4
4
  model: PostModel;
5
+ activeColor: string | null;
6
+ inactiveColor: string | null;
5
7
  socialInteractionsHandler?: IPostSocialInteractionsHandler;
6
8
  on?: {
7
9
  attachmentsClicked?: () => void;
@@ -7,7 +7,7 @@ import { default as PostMedia } from './media/post-media.svelte';
7
7
  import { default as Texts } from './post-texts.svelte';
8
8
  import { PostViewerLocalization } from './post-viewer-localization';
9
9
  import { PostViewerUiManager } from './ui-manager.svelte';
10
- let { model, socialInteractionsHandler, trackingParams: externalTrackingParams, enableAttachments = true, enableControls = true, autoplay = 'on-appearance', locale = 'en', on } = $props();
10
+ let { model, socialInteractionsHandler, trackingParams: externalTrackingParams, controlsColors = null, enableAttachments = true, enableControls = true, autoplay = 'on-appearance', locale = 'en', on } = $props();
11
11
  const localization = $derived(new PostViewerLocalization(locale));
12
12
  const uiManager = new PostViewerUiManager();
13
13
  $effect(() => {
@@ -81,6 +81,8 @@ const variables = $derived.by(() => {
81
81
  <div class="post-viewer__controls-panel" use:trackControlsPanelSize>
82
82
  <PostControls
83
83
  model={model}
84
+ activeColor={controlsColors?.active ?? null}
85
+ inactiveColor={controlsColors?.inactive ?? null}
84
86
  socialInteractionsHandler={socialInteractionsHandler}
85
87
  on={{ attachmentsClicked: () => (uiManager.canShowAttachments = !uiManager.canShowAttachments) }} />
86
88
  </div>
@@ -8,6 +8,10 @@ type Props = {
8
8
  trackingParams: TrackingParams | null | false;
9
9
  enableAttachments?: boolean;
10
10
  enableControls?: boolean;
11
+ controlsColors: {
12
+ active: string | null;
13
+ inactive: string | null;
14
+ } | null;
11
15
  autoplay?: true | false | 'on-appearance';
12
16
  locale?: Locale;
13
17
  on?: {