@streamscloud/embeddable 11.0.0 → 12.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/dist/ads/ad-card/cmp.ad-card.svelte +4 -4
  2. package/dist/ads/ad-card/cmp.ad-card.svelte.d.ts +2 -0
  3. package/dist/content-player/cmp.content-player.svelte +63 -128
  4. package/dist/content-player/content-player-config.svelte.d.ts +3 -10
  5. package/dist/content-player/content-player-config.svelte.js +3 -21
  6. package/dist/content-player/content-player-settings.d.ts +7 -21
  7. package/dist/content-player/content-player-settings.js +0 -4
  8. package/dist/content-player/controls-and-attachments.svelte +39 -5
  9. package/dist/content-player/overview-panel.svelte +14 -6
  10. package/dist/content-player/overview-panel.svelte.d.ts +5 -1
  11. package/dist/content-player/ui-manager.svelte.d.ts +0 -2
  12. package/dist/content-player/ui-manager.svelte.js +0 -2
  13. package/dist/media-center/config/internal-media-center-config.d.ts +7 -3
  14. package/dist/media-center/config/internal-media-center-config.js +28 -24
  15. package/dist/media-center/config/operations.generated.d.ts +36 -23
  16. package/dist/media-center/config/operations.generated.js +53 -33
  17. package/dist/media-center/config/operations.graphql +34 -21
  18. package/dist/media-center/config/types.d.ts +13 -2
  19. package/dist/media-center/media-center/cmp.media-center.svelte +195 -149
  20. package/dist/media-center/media-center/cmp.media-center.svelte.d.ts +2 -19
  21. package/dist/media-center/media-center/discover/data-loading.d.ts +8 -0
  22. package/dist/media-center/media-center/discover/data-loading.js +35 -0
  23. package/dist/media-center/media-center/discover/discover-header-localization.d.ts +6 -0
  24. package/dist/media-center/media-center/discover/discover-header-localization.js +15 -0
  25. package/dist/media-center/media-center/discover/discover-header.svelte +214 -0
  26. package/dist/media-center/media-center/discover/discover-header.svelte.d.ts +9 -0
  27. package/dist/media-center/media-center/discover/discover-view-handler.svelte.d.ts +28 -0
  28. package/dist/media-center/media-center/discover/discover-view-handler.svelte.js +101 -0
  29. package/dist/media-center/media-center/discover/discover-view-localization.d.ts +6 -0
  30. package/dist/media-center/media-center/discover/discover-view-localization.js +15 -0
  31. package/dist/media-center/media-center/discover/discover-view.svelte +238 -0
  32. package/dist/media-center/media-center/discover/{discover-panel.svelte.d.ts → discover-view.svelte.d.ts} +4 -4
  33. package/dist/media-center/media-center/discover/index.d.ts +2 -2
  34. package/dist/media-center/media-center/discover/index.js +2 -2
  35. package/dist/media-center/media-center/discover/types.svelte.d.ts +20 -0
  36. package/dist/media-center/media-center/discover/types.svelte.js +20 -0
  37. package/dist/media-center/media-center/feed/feed-handler.svelte.d.ts +50 -0
  38. package/dist/media-center/media-center/feed/feed-handler.svelte.js +84 -0
  39. package/dist/media-center/media-center/feed/feed-providers-generator.d.ts +11 -0
  40. package/dist/media-center/media-center/feed/feed-providers-generator.js +79 -0
  41. package/dist/media-center/media-center/feed/index.d.ts +1 -0
  42. package/dist/media-center/media-center/feed/index.js +1 -0
  43. package/dist/media-center/media-center/feed/types.d.ts +12 -0
  44. package/dist/media-center/media-center/handlers/categories-handler.svelte.d.ts +29 -10
  45. package/dist/media-center/media-center/handlers/categories-handler.svelte.js +25 -7
  46. package/dist/media-center/media-center/handlers/index.d.ts +2 -1
  47. package/dist/media-center/media-center/handlers/index.js +1 -1
  48. package/dist/media-center/media-center/handlers/media-center-settings-handler.svelte.d.ts +19 -0
  49. package/dist/media-center/media-center/handlers/media-center-settings-handler.svelte.js +26 -0
  50. package/dist/media-center/media-center/header-footer/media-center-footer.svelte +4 -8
  51. package/dist/media-center/media-center/header-footer/media-center-header-localization.d.ts +1 -0
  52. package/dist/media-center/media-center/header-footer/media-center-header-localization.js +6 -0
  53. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte +25 -36
  54. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte.d.ts +2 -1
  55. package/dist/media-center/media-center/header-footer/media-center-header.svelte +14 -11
  56. package/dist/media-center/media-center/header-footer/media-center-header.svelte.d.ts +1 -2
  57. package/dist/media-center/media-center/media-center-context.svelte.d.ts +31 -13
  58. package/dist/media-center/media-center/media-center-context.svelte.js +71 -35
  59. package/dist/media-center/media-center/menu/menu-localization.d.ts +2 -11
  60. package/dist/media-center/media-center/menu/menu-localization.js +6 -45
  61. package/dist/media-center/media-center/menu/menu.svelte +94 -93
  62. package/dist/media-center/media-center/menu/menu.svelte.d.ts +1 -1
  63. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.d.ts +1 -1
  64. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.js +0 -3
  65. package/dist/media-center/media-center/moments/cmp.moments-circle.svelte +41 -0
  66. package/dist/media-center/media-center/moments/cmp.moments-circle.svelte.d.ts +7 -0
  67. package/dist/media-center/media-center/moments/index.d.ts +1 -0
  68. package/dist/media-center/media-center/moments/index.js +1 -0
  69. package/dist/media-center/media-center/streams-in-category/streams-in-category-panel-handler.svelte.d.ts +1 -1
  70. package/dist/media-center/media-center/streams-in-category/streams-in-category-panel-handler.svelte.js +1 -1
  71. package/dist/media-center/media-center/types.d.ts +44 -1
  72. package/dist/media-page/index.d.ts +121 -0
  73. package/dist/media-page/index.js +43 -0
  74. package/dist/posts/attachments/cmp.attachments.svelte +1 -0
  75. package/dist/posts/controls/cmp.controls.svelte +50 -13
  76. package/dist/posts/data-loaders/operations.generated.d.ts +4 -0
  77. package/dist/posts/data-loaders/operations.generated.js +6 -2
  78. package/dist/posts/model/types.d.ts +2 -0
  79. package/dist/posts/post-viewer/cmp.post-viewer.svelte +26 -18
  80. package/dist/posts/post-viewer/mapper.js +2 -0
  81. package/dist/posts/post-viewer/operations.generated.d.ts +2 -0
  82. package/dist/posts/post-viewer/operations.generated.js +3 -1
  83. package/dist/posts/post-viewer/operations.graphql +2 -0
  84. package/dist/posts/post-viewer/post-texts.svelte +3 -3
  85. package/dist/posts/posts-player/cmp.posts-player.svelte +20 -6
  86. package/dist/posts/posts-player/cmp.posts-player.svelte.d.ts +18 -2
  87. package/dist/posts/posts-player/index.d.ts +18 -3
  88. package/dist/posts/posts-player/index.js +42 -89
  89. package/dist/posts/posts-player/posts-player-proxy.svelte +19 -0
  90. package/dist/posts/posts-player/posts-player-proxy.svelte.d.ts +22 -0
  91. package/dist/posts/posts-player/posts-player-view.svelte +20 -34
  92. package/dist/posts/posts-player/posts-player-view.svelte.d.ts +2 -6
  93. package/dist/posts/posts-player/types.d.ts +19 -6
  94. package/dist/products/product-card/cmp.product-card.svelte +5 -5
  95. package/dist/products/product-card/cmp.product-card.svelte.d.ts +1 -1
  96. package/dist/short-videos/short-video-card/cmp.short-video-card.svelte +160 -19
  97. package/dist/short-videos/short-video-card/cmp.short-video-card.svelte.d.ts +2 -1
  98. package/dist/short-videos/short-video-card/localization.d.ts +5 -0
  99. package/dist/short-videos/short-video-card/localization.js +13 -0
  100. package/dist/short-videos/short-video-card/types.d.ts +4 -0
  101. package/dist/short-videos/short-videos-player/index.js +26 -33
  102. package/dist/streams/layout/element-views/cmp.stream-element.svelte +2 -2
  103. package/dist/streams/layout/element-views/cmp.text-ref-stream-element.svelte +7 -3
  104. package/dist/streams/layout/element-views/cmp.text-ref-stream-element.svelte.d.ts +2 -0
  105. package/dist/streams/layout/element-views/cmp.text-stream-element.svelte +7 -3
  106. package/dist/streams/layout/element-views/cmp.text-stream-element.svelte.d.ts +2 -0
  107. package/dist/streams/layout/element-views/price-element-view.svelte +2 -2
  108. package/dist/streams/layout/element-views/price-stream-element-localization.d.ts +1 -1
  109. package/dist/streams/layout/element-views/price-stream-element-localization.js +2 -2
  110. package/dist/streams/layout/models/mapper.js +2 -0
  111. package/dist/streams/streams-player/index.d.ts +21 -2
  112. package/dist/streams/streams-player/index.js +49 -24
  113. package/dist/streams/streams-player/stream-overview.svelte +1 -1
  114. package/dist/streams/streams-player/streams-player-buffer.svelte.d.ts +1 -3
  115. package/dist/streams/streams-player/streams-player-buffer.svelte.js +2 -2
  116. package/dist/streams/streams-player/streams-player-view.svelte +25 -21
  117. package/dist/streams/streams-player/streams-player-view.svelte.d.ts +1 -5
  118. package/dist/streams/streams-player/types.d.ts +18 -4
  119. package/dist/ui/line-clamp/cmp.line-clamp-auto.svelte +119 -0
  120. package/dist/ui/line-clamp/cmp.line-clamp-auto.svelte.d.ts +10 -0
  121. package/dist/ui/line-clamp/cmp.line-clamp.svelte +44 -72
  122. package/dist/ui/line-clamp/cmp.line-clamp.svelte.d.ts +3 -4
  123. package/dist/ui/line-clamp/index.d.ts +1 -0
  124. package/dist/ui/line-clamp/index.js +1 -0
  125. package/dist/ui/player/button/cmp.mobile-player-buttons-group.svelte +44 -0
  126. package/dist/ui/player/button/cmp.mobile-player-buttons-group.svelte.d.ts +7 -0
  127. package/dist/ui/player/button/cmp.player-button.svelte +0 -1
  128. package/dist/ui/player/button/cmp.player-buttons-group.svelte +15 -11
  129. package/dist/ui/player/button/cmp.player-buttons-group.svelte.d.ts +1 -1
  130. package/dist/ui/player/button/index.d.ts +1 -0
  131. package/dist/ui/player/button/index.js +1 -0
  132. package/dist/ui/player/button/types.d.ts +0 -2
  133. package/dist/ui/player/close-orchestrator/close-orchestrator.svelte.d.ts +18 -0
  134. package/dist/ui/player/close-orchestrator/close-orchestrator.svelte.js +58 -0
  135. package/dist/ui/player/close-orchestrator/index.d.ts +2 -0
  136. package/dist/ui/player/close-orchestrator/index.js +1 -0
  137. package/dist/ui/player/close-orchestrator/types.d.ts +9 -0
  138. package/dist/ui/player/close-orchestrator/types.js +1 -0
  139. package/dist/ui/player/colors/index.d.ts +1 -0
  140. package/dist/ui/player/colors/index.js +1 -0
  141. package/dist/ui/player/colors/player-colors.d.ts +11 -0
  142. package/dist/ui/player/colors/player-colors.js +1 -0
  143. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.d.ts +2 -6
  144. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.js +11 -11
  145. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.d.ts +2 -3
  146. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.js +5 -5
  147. package/dist/ui/player/providers/default-feed-player-buffer.svelte.d.ts +3 -4
  148. package/dist/ui/player/providers/default-feed-player-buffer.svelte.js +16 -9
  149. package/dist/ui/player/providers/service.d.ts +2 -0
  150. package/dist/ui/player/providers/service.js +13 -0
  151. package/dist/ui/player/providers/types.d.ts +1 -0
  152. package/dist/ui/with-background/cmp.with-background.svelte +86 -0
  153. package/dist/ui/with-background/cmp.with-background.svelte.d.ts +10 -0
  154. package/dist/ui/with-background/index.d.ts +1 -0
  155. package/dist/ui/with-background/index.js +1 -0
  156. package/package.json +5 -1
  157. package/dist/content-player/fade-mixins.scss +0 -12
  158. package/dist/content-player/header.svelte +0 -15
  159. package/dist/content-player/header.svelte.d.ts +0 -28
  160. package/dist/media-center/media-center/discover/discover-panel-handler.svelte.d.ts +0 -31
  161. package/dist/media-center/media-center/discover/discover-panel-handler.svelte.js +0 -94
  162. package/dist/media-center/media-center/discover/discover-panel-localization.d.ts +0 -19
  163. package/dist/media-center/media-center/discover/discover-panel-localization.js +0 -78
  164. package/dist/media-center/media-center/discover/discover-panel.svelte +0 -142
  165. package/dist/media-center/media-center/handlers/feed-handler.svelte.d.ts +0 -6
  166. package/dist/media-center/media-center/handlers/feed-handler.svelte.js +0 -12
  167. package/dist/media-center/media-center/providers/index.d.ts +0 -2
  168. package/dist/media-center/media-center/providers/index.js +0 -2
  169. package/dist/media-center/media-center/providers/post-player-provider-generator.d.ts +0 -8
  170. package/dist/media-center/media-center/providers/post-player-provider-generator.js +0 -32
  171. package/dist/media-center/media-center/providers/streams-player-provider-generator.d.ts +0 -8
  172. package/dist/media-center/media-center/providers/streams-player-provider-generator.js +0 -36
  173. package/dist/media-center/model/types.d.ts +0 -17
  174. /package/dist/media-center/{model → media-center/feed}/types.js +0 -0
@@ -4,17 +4,18 @@ import { StreamCard } from '../../../streams/stream-card';
4
4
  import { Icon } from '../../../ui/icon';
5
5
  import { ImageRound } from '../../../ui/image';
6
6
  import { LineClamp } from '../../../ui/line-clamp';
7
+ import { MomentsCircle } from '../moments';
7
8
  import { default as ButtonWrapper } from './category-following-wrapper.svelte';
8
9
  import { MenuLocalization } from './menu-localization';
9
10
  import IconChevronDownFilled from '@fluentui/svg-icons/icons/chevron_down_20_filled.svg?raw';
10
11
  import IconChevronRightFilled from '@fluentui/svg-icons/icons/chevron_right_20_filled.svg?raw';
11
12
  import { slide } from 'svelte/transition';
12
- let { context, locale, on } = $props();
13
+ let { context, locale = 'en', on } = $props();
13
14
  const localization = $derived(new MenuLocalization(locale));
14
15
  const target = $derived.by(() => context.targetData);
15
16
  const generateCategoriesMap = () => {
16
17
  const expanded = {};
17
- context.categoriesHandler.categories.forEach((c) => {
18
+ context.categoriesHandler.categoriesGrouped.forEach((c) => {
18
19
  const isSelfSelected = context.categoriesHandler.selectedCategoryId === c.id;
19
20
  const hasSelectedChild = c.children.some((ch) => ch.id === context.categoriesHandler.selectedCategoryId);
20
21
  expanded[c.id] = isSelfSelected || hasSelectedChild;
@@ -27,14 +28,11 @@ const handleCategoryExpaned = (e, categoryId) => {
27
28
  categoriesExpandedMap[categoryId] = !categoriesExpandedMap[categoryId];
28
29
  };
29
30
  const styles = $derived.by(() => {
30
- var _a, _b;
31
+ var _a;
31
32
  const values = [];
32
33
  if ((_a = context.playerColors) === null || _a === void 0 ? void 0 : _a.menuBackground) {
33
34
  values.push(`--media-center-menu--background-color: ${context.playerColors.menuBackground}`);
34
35
  }
35
- if ((_b = context.playerColors) === null || _b === void 0 ? void 0 : _b.brand) {
36
- values.push(`--media-center-menu--brand-color: ${context.playerColors.brand}`);
37
- }
38
36
  return values.join(';');
39
37
  });
40
38
  </script>
@@ -43,16 +41,16 @@ const styles = $derived.by(() => {
43
41
  {#if target}
44
42
  <div class="media-center-target">
45
43
  <div class="media-center-target__image">
46
- <ImageRound src={target.image} />
44
+ <MomentsCircle context={context} />
47
45
  </div>
48
46
  <div class="media-center-target__info">
49
47
  <div class="media-center-target__name">
50
- <LineClamp maxLines={1}>
48
+ <LineClamp maxLines={1} locale={locale}>
51
49
  {target.name}
52
50
  </LineClamp>
53
51
  </div>
54
52
  {#if target.membersCount}
55
- <LineClamp maxLines={1}>
53
+ <LineClamp maxLines={1} locale={locale}>
56
54
  <div class="media-center-target__members">
57
55
  <span class="media-center-target__members-count">
58
56
  {compactNumber(target.membersCount, { locale: localization.locale })}
@@ -71,61 +69,58 @@ const styles = $derived.by(() => {
71
69
  {localization.interestsSectionTitle}
72
70
  </div>
73
71
  <div class="media-center-menu__tree">
74
- {#each context.categoriesHandler.categories as category (category.id)}
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>
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">
82
+ {context.mediaCenterMode === 'discover' ? localization.discoverLabel : localization.feedLabel}
83
+ </div>
84
+ </div>
85
+ </div>
86
+ </div>
87
+ {#snippet categoryItem(category: { type: 'main'; value: MediaCenterCategoryModel } | { type: 'child'; value: MediaCenterSubCategoryModel })}
88
+ <div class="menu-item" class:menu-item--child={category.type === 'child'}>
89
+ <div class="menu-item__value" onclick={() => on.categorySelected(category.value.id)} onkeydown={() => {}} role="button" tabindex="0">
90
+ <div class="menu-item__image">
91
+ <ImageRound src={category.value.image} noBorders={true} />
92
+ </div>
93
+ <div class="menu-item__text" class:menu-item__text--active={context.categoriesHandler.selectedCategoryId === category.value.id}>
94
+ {category.value.name}
90
95
  </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>
96
+ {#if category.value.tag}
97
+ <div class="menu-item__tag" style="background-color: {category.value.tag.backgroundColor}; color: {category.value.tag.fontColor};">
98
+ {category.value.tag.text}
99
+ </div>
100
+ {/if}
104
101
  </div>
102
+ <ButtonWrapper categoryId={category.value.id} followingHandler={context.categoryFollowingHandler} invertedOrientation={true}>
103
+ <button
104
+ type="button"
105
+ class="menu-item__collapser"
106
+ class:menu-item__collapser--hidden={category.type === 'child' || !category.value.children.length}
107
+ onclick={(e) => handleCategoryExpaned(e, category.value.id)}>
108
+ {#if categoriesExpandedMap[category.value.id]}
109
+ <Icon src={IconChevronDownFilled} />
110
+ {:else}
111
+ <Icon src={IconChevronRightFilled} />
112
+ {/if}
113
+ </button>
114
+ </ButtonWrapper>
115
+ </div>
116
+ {/snippet}
117
+ {#each context.categoriesHandler.categoriesGrouped as category (category.id)}
118
+ <div class="media-center-menu__tree-item">
119
+ {@render categoryItem({ type: 'main', value: category })}
105
120
  {#if categoriesExpandedMap[category.id]}
106
121
  <div class="media-center-menu__tree-item" transition:slide|local>
107
122
  {#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>
123
+ {@render categoryItem({ type: 'child', value: subcategory })}
129
124
  {/each}
130
125
  </div>
131
126
  {/if}
@@ -161,7 +156,6 @@ const styles = $derived.by(() => {
161
156
  }
162
157
  .media-center-menu {
163
158
  --_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
159
  background: var(--_media-center-menu--background-color);
166
160
  height: 100%;
167
161
  min-height: 100%;
@@ -213,19 +207,19 @@ const styles = $derived.by(() => {
213
207
  .media-center-menu__section-title {
214
208
  font-size: 1.125rem;
215
209
  line-height: 1.75rem;
216
- font-weight: 600;
210
+ font-weight: 500;
217
211
  color: #ffffff;
218
212
  }
219
213
  .media-center-menu__tree {
220
214
  display: flex;
221
215
  flex-direction: column;
222
216
  flex: 1;
223
- gap: 1rem;
217
+ gap: 0.5rem;
224
218
  }
225
219
  .media-center-menu__tree-item {
226
220
  display: flex;
227
221
  flex-direction: column;
228
- gap: 0.5rem;
222
+ gap: 0.25rem;
229
223
  }
230
224
  .media-center-menu__popular-streams-section {
231
225
  display: flex;
@@ -241,63 +235,73 @@ const styles = $derived.by(() => {
241
235
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
242
236
  }
243
237
 
244
- .selector-item {
238
+ .menu-item {
245
239
  display: flex;
246
240
  -webkit-user-drag: none;
247
241
  user-select: none;
248
242
  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;
243
+ --_menu-item--text--font-size: 0.9375rem;
244
+ --_menu-item--image--size: 1.5rem;
252
245
  }
253
- .selector-item :global([contenteditable]) {
246
+ .menu-item :global([contenteditable]) {
254
247
  user-select: text;
255
248
  }
256
- .selector-item--child {
249
+ .menu-item--child {
257
250
  height: 2.125rem;
258
251
  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;
252
+ --_menu-item--text--font-size: 0.875rem;
253
+ --_menu-item--image--size: 1.375rem;
262
254
  }
263
- .selector-item__value {
255
+ .menu-item__value {
264
256
  display: flex;
265
257
  align-items: center;
266
258
  flex: 1;
267
- gap: 0.75rem;
268
259
  min-width: 0;
269
260
  cursor: pointer;
270
261
  }
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);
262
+ .menu-item__image {
263
+ width: var(--_menu-item--image--size);
264
+ min-width: var(--_menu-item--image--size);
265
+ max-width: var(--_menu-item--image--size);
266
+ height: var(--_menu-item--image--size);
267
+ min-height: var(--_menu-item--image--size);
268
+ max-height: var(--_menu-item--image--size);
269
+ margin-right: 0.75rem;
278
270
  }
279
- .selector-item__text {
280
- flex: 1;
271
+ .menu-item__text {
281
272
  max-width: 100%;
282
273
  color: #ffffff;
283
- font-size: var(--_selector-item--text--font-size);
284
- font-weight: var(--_selector-item--text--font-weight);
274
+ font-size: var(--_menu-item--text--font-size);
275
+ font-weight: 400;
285
276
  text-align: left;
286
277
  text-overflow: ellipsis;
287
278
  width: 100%;
288
279
  white-space: nowrap;
289
280
  overflow: hidden;
290
- transition: text-shadow 120ms ease;
291
281
  }
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;
282
+ .menu-item__text {
283
+ width: max-content;
284
+ }
285
+ .menu-item__text:hover, .menu-item__text--active {
286
+ font-weight: 600;
287
+ letter-spacing: -0.5px;
288
+ }
289
+ .menu-item__tag {
290
+ height: min-content;
291
+ width: min-content;
292
+ border-radius: 0.25rem;
293
+ padding: 0.3125rem 0.375rem;
294
+ font-size: 0.5rem;
295
+ font-weight: 600;
296
+ margin-top: -1rem;
297
+ margin-left: 0.25rem;
294
298
  }
295
- .selector-item__collapser {
299
+ .menu-item__collapser {
296
300
  --icon--color: #ffffff;
297
301
  --icon--size: 1rem;
298
302
  padding: 0.5rem;
299
303
  }
300
- .selector-item__collapser--hidden {
304
+ .menu-item__collapser--hidden {
301
305
  visibility: hidden;
302
306
  }
303
307
 
@@ -313,9 +317,6 @@ const styles = $derived.by(() => {
313
317
  height: 3.5rem;
314
318
  min-height: 3.5rem;
315
319
  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
  }
320
321
  .media-center-target__info {
321
322
  display: flex;
@@ -3,7 +3,7 @@ import type { StreamPlayerModel } from '../../../streams/streams-player';
3
3
  import type { MediaCenterContext } from '../media-center-context.svelte';
4
4
  type Props = {
5
5
  context: MediaCenterContext;
6
- locale: Locale;
6
+ locale?: Locale;
7
7
  on: {
8
8
  categorySelected: (categoryId: string) => void;
9
9
  streamSelected: (stream: StreamPlayerModel) => void;
@@ -4,7 +4,7 @@ export declare class PopularStreamsPanelHandler {
4
4
  private readonly config;
5
5
  private _state;
6
6
  private _streams;
7
- constructor(config: IMediaCenterConfig | null);
7
+ constructor(config: IMediaCenterConfig);
8
8
  get streamSectionItems(): StreamPlayerModel[];
9
9
  init: () => Promise<void>;
10
10
  }
@@ -9,9 +9,6 @@ export class PopularStreamsPanelHandler {
9
9
  return this._streams;
10
10
  }
11
11
  init = async () => {
12
- if (!this.config) {
13
- return;
14
- }
15
12
  if (this._state === 'not-initialized') {
16
13
  this._state = 'loading';
17
14
  try {
@@ -0,0 +1,41 @@
1
+ <script lang="ts">import { ImageRound } from '../../../ui/image';
2
+ let { context } = $props();
3
+ const styles = $derived.by(() => {
4
+ var _a;
5
+ const values = [];
6
+ if ((_a = context.playerColors) === null || _a === void 0 ? void 0 : _a.brand) {
7
+ values.push(`--moments-circle--brand-color: ${context.playerColors.brand}`);
8
+ }
9
+ return values.join(';');
10
+ });
11
+ </script>
12
+
13
+ <div class="moments-circle" style={styles}>
14
+ {#if context.targetData}
15
+ <ImageRound src={context.targetData.image} />
16
+ {/if}
17
+ </div>
18
+
19
+ <style>@keyframes fadeIn {
20
+ 0% {
21
+ opacity: 1;
22
+ }
23
+ 50% {
24
+ opacity: 0.4;
25
+ }
26
+ 100% {
27
+ opacity: 1;
28
+ }
29
+ }
30
+ .moments-circle {
31
+ --_moments-circle--brand-color: var(--moments-circle--brand-color, #00b8d8);
32
+ width: 6.25%rem;
33
+ min-width: 6.25%rem;
34
+ max-width: 6.25%rem;
35
+ height: 6.25%rem;
36
+ min-height: 6.25%rem;
37
+ max-height: 6.25%rem;
38
+ --image--rounded--inner--border-width: 1px;
39
+ --image--rounded--outer--border-color: var(--_moments-circle--brand-color);
40
+ --image--rounded--outer--border-width: 2px;
41
+ }</style>
@@ -0,0 +1,7 @@
1
+ import type { MediaCenterContext } from '../media-center-context.svelte';
2
+ type Props = {
3
+ context: MediaCenterContext;
4
+ };
5
+ declare const Cmp: import("svelte").Component<Props, {}, "">;
6
+ type Cmp = ReturnType<typeof Cmp>;
7
+ export default Cmp;
@@ -0,0 +1 @@
1
+ export { default as MomentsCircle } from './cmp.moments-circle.svelte';
@@ -0,0 +1 @@
1
+ export { default as MomentsCircle } from './cmp.moments-circle.svelte';
@@ -8,7 +8,7 @@ export declare class StreamsInCategoryPanelHandler {
8
8
  private _categoryId;
9
9
  private _categoryName;
10
10
  private _streams;
11
- constructor(config: IMediaCenterConfig | null);
11
+ constructor(config: IMediaCenterConfig);
12
12
  get streamSectionItems(): StreamPlayerModel[];
13
13
  get categoryId(): string;
14
14
  get categoryName(): string;
@@ -27,7 +27,7 @@ export class StreamsInCategoryPanelHandler {
27
27
  return this._activated && this._state === 'loading';
28
28
  }
29
29
  activate = async (categoryData) => {
30
- if (!this.config || !categoryData) {
30
+ if (!categoryData || this.categoryId === categoryData.id) {
31
31
  return;
32
32
  }
33
33
  this._activated = true;
@@ -1,7 +1,50 @@
1
- export type MediaCenterMode = 'streams-feed' | 'posts-feed' | 'discover';
1
+ import type { Locale } from '../../core/locale';
2
+ import type { IMediaCenterConfig } from '../config/types';
3
+ import type { PostPlayerModel, PostsPlayerProps } from '../../posts/posts-player/types';
4
+ import type { IStreamsPlayerDataProvider, StreamAmplificationParameters, StreamsPlayerProps } from '../../streams/streams-player/types';
5
+ import type { ICloseOrchestrator } from '../../ui/player/close-orchestrator';
6
+ import type { IPlayerDataProvider } from '../../ui/player/providers';
7
+ export type MediaCenterMode = 'feed' | 'discover';
2
8
  export type MediaCenterCategoryData = {
3
9
  id: string;
4
10
  name: string;
5
11
  parentId: string | undefined;
6
12
  parentName: string | undefined;
7
13
  };
14
+ export type MediaCenterProps = {
15
+ config: IMediaCenterConfig;
16
+ settings?: MediaCenterSettings;
17
+ modeProps: MediaCenterModeProps;
18
+ closeOrchestrator: ICloseOrchestrator;
19
+ };
20
+ export type MediaCenterModeProps = {
21
+ mode: 'posts';
22
+ props: {
23
+ dataProvider: IPlayerDataProvider<PostPlayerModel>;
24
+ onPostActivated?: (id: string) => void;
25
+ };
26
+ } | {
27
+ mode: 'streams';
28
+ props: {
29
+ dataProvider: IStreamsPlayerDataProvider;
30
+ amplificationParameters?: StreamAmplificationParameters;
31
+ onStreamActivated?: (data: {
32
+ title: string;
33
+ image: string | null;
34
+ }) => void;
35
+ };
36
+ } | {
37
+ mode: 'discover';
38
+ };
39
+ export type PlayerProps = {
40
+ type: 'posts';
41
+ props: PostsPlayerProps;
42
+ } | {
43
+ type: 'streams';
44
+ props: StreamsPlayerProps;
45
+ };
46
+ export type MediaCenterSettings = {
47
+ locale?: Locale;
48
+ showStreamsCloudWatermark?: boolean;
49
+ disableBackground?: boolean;
50
+ };
@@ -0,0 +1,121 @@
1
+ import type { Locale } from '../core/locale';
2
+ import { type IMediaCenterConfig } from '../media-center/config/types';
3
+ export type { IMediaCenterConfig };
4
+ export { mapToPostPlayerModel } from '../posts/data-loaders/mapper';
5
+ /**
6
+ * Opens the media page modal.
7
+ *
8
+ * Two overloads (mutually exclusive; enforced by TypeScript):
9
+ * - Config mode: openMediaPageModal({ mediaCenterConfig, viewerSettings?, on? })
10
+ * - Internal config mode: openMediaPageModal({ id, initiator, graphqlOrigin?, viewerSettings?, on? })
11
+ *
12
+ * @param init Configuration options.
13
+ *
14
+ * Config mode (overload 1)
15
+ * @param {IMediaCenterConfig} init.mediaCenterConfig
16
+ * Configuration for the media center.
17
+ *
18
+ * Internal config mode (overload 2)
19
+ * @param {string} init.id
20
+ * Media page ID, used to construct an internal media-center config.
21
+ * @param {string} init.initiator
22
+ * Initiator identifier (used for tracking/analytics and GraphQL).
23
+ * @param {string} [init.graphqlOrigin]
24
+ * Optional GraphQL origin (base URL). If omitted, the default origin is determined internally.
25
+ *
26
+ * Common (optional)
27
+ * @param {MediaPageViewerSettings} [init.viewerSettings]
28
+ * Viewer UI and behavior settings.
29
+ *
30
+ * Fields of MediaPageViewerSettings:
31
+ * - {boolean} [disableBackground]
32
+ * If true , hides the viewer background image.
33
+ * - {Locale} [locale='en']
34
+ * Localization for the viewer UI. Supported values: 'en' | 'no'.
35
+ * If omitted, the default locale 'en' is used.
36
+ * - {boolean} [showStreamsCloudWatermark]
37
+ * If true, shows the StreamsCloud watermark.
38
+ * - {boolean} [hideCloseButton]
39
+ * If true, hides the close button.
40
+ *
41
+ * Events
42
+ * @param {{ closed?: () => void }} [init.on]
43
+ * Optional event handlers.
44
+ * @param {() => void} [init.on.closed]
45
+ * Called after the modal is fully closed (after unmount and removal from the DOM).
46
+ *
47
+ * Notes
48
+ * - If neither mediaCenterConfig nor id is specified, a warning is shown and the modal is not opened.
49
+ *
50
+ * @returns {void}
51
+ *
52
+ * @example <caption>Config mode</caption>
53
+ * ```ts
54
+ * import {
55
+ * openMediaPageModal,
56
+ * type IMediaCenterConfig,
57
+ * } from '@streamscloud/embeddable/media-page';
58
+ *
59
+ * const mediaCenterConfig: IMediaCenterConfig = {
60
+ * // ...your media center configuration
61
+ * };
62
+ *
63
+ * openMediaPageModal({
64
+ * mediaCenterConfig,
65
+ * viewerSettings: {
66
+ * // Locale defaults to 'en'; set 'no' to switch to Norwegian:
67
+ * locale: 'no',
68
+ * disableBackground: false,
69
+ * hideCloseButton: false,
70
+ * showStreamsCloudWatermark: true,
71
+ * },
72
+ * on: {
73
+ * closed: () => console.log('Media page modal closed'),
74
+ * },
75
+ * });
76
+ * ```
77
+ *
78
+
79
+
80
+ * @example <caption>Internal config mode</caption>
81
+ * ```ts
82
+ * import { openMediaPageModal } from '@streamscloud/embeddable/media-page';
83
+ *
84
+ * openMediaPageModal({
85
+ * id: 'media-page-123',
86
+ * initiator: 'marketing-campaign',
87
+ * graphqlOrigin: 'https://api.example.com',
88
+ * viewerSettings: {
89
+ * locale: 'en',
90
+ * disableBackground: true,
91
+ * hideCloseButton: false,
92
+ * showStreamsCloudWatermark: false,
93
+ * },
94
+ * on: {
95
+ * closed: () => console.log('Media page modal closed'),
96
+ * },
97
+ * });
98
+ * ```
99
+ */
100
+ export declare function openMediaPageModal(init: {
101
+ mediaCenterConfig: IMediaCenterConfig;
102
+ viewerSettings?: MediaPageViewerSettings;
103
+ on?: {
104
+ closed?: () => void;
105
+ };
106
+ }): void;
107
+ export declare function openMediaPageModal(init: {
108
+ id: string;
109
+ initiator: string;
110
+ graphqlOrigin?: string;
111
+ viewerSettings?: MediaPageViewerSettings;
112
+ on?: {
113
+ closed?: () => void;
114
+ };
115
+ }): void;
116
+ export type MediaPageViewerSettings = {
117
+ disableBackground?: boolean;
118
+ locale?: Locale;
119
+ showStreamsCloudWatermark?: boolean;
120
+ hideCloseButton?: boolean;
121
+ };
@@ -0,0 +1,43 @@
1
+ import { toastrWarning } from '../core/toastr';
2
+ import { InternalMediaCenterConfig } from '../media-center/config/internal-media-center-config';
3
+ import {} from '../media-center/config/types';
4
+ import { MediaCenter } from '../media-center/media-center';
5
+ import { CloseOrchestrator } from '../ui/player/close-orchestrator';
6
+ import { ModalShadowHost } from '../ui/shadow-dom';
7
+ import { mount, unmount } from 'svelte';
8
+ export { mapToPostPlayerModel } from '../posts/data-loaders/mapper';
9
+ export function openMediaPageModal(init) {
10
+ const { id, graphqlOrigin, initiator, viewerSettings, on } = init;
11
+ let mediaCenterConfig = init.mediaCenterConfig;
12
+ if (!mediaCenterConfig && id) {
13
+ mediaCenterConfig = new InternalMediaCenterConfig({ mediaPageId: id, graphqlOrigin, initiator });
14
+ }
15
+ if (!mediaCenterConfig) {
16
+ toastrWarning('Config is not specified.');
17
+ return;
18
+ }
19
+ const shadowHost = new ModalShadowHost();
20
+ let mounted = null;
21
+ const makeCloseOrchestrator = () => new CloseOrchestrator({
22
+ closeFn: async () => {
23
+ await unmount(mounted);
24
+ shadowHost.remove();
25
+ if (on?.closed) {
26
+ on.closed();
27
+ }
28
+ },
29
+ canClose: !viewerSettings?.hideCloseButton
30
+ });
31
+ mounted = mount(MediaCenter, {
32
+ target: shadowHost.shadowRoot,
33
+ props: {
34
+ config: mediaCenterConfig,
35
+ settings: viewerSettings,
36
+ modeProps: {
37
+ mode: 'discover'
38
+ },
39
+ closeOrchestrator: makeCloseOrchestrator()
40
+ }
41
+ });
42
+ shadowHost.attachToBody();
43
+ }
@@ -22,6 +22,7 @@ const trackingParams = $derived.by(() => {
22
22
  ad={ad}
23
23
  colors={colors}
24
24
  trackingParams={trackingParams}
25
+ locale={locale}
25
26
  on={{
26
27
  click: on?.adClick,
27
28
  impression: on?.adImpression