@streamscloud/embeddable 10.1.2 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/dist/ads/ad-card/cmp.ad-card.svelte +30 -10
  2. package/dist/ads/ad-card/cmp.ad-card.svelte.d.ts +7 -0
  3. package/dist/content-player/cmp.content-player.svelte +67 -142
  4. package/dist/content-player/content-player-config.svelte.d.ts +14 -10
  5. package/dist/content-player/content-player-config.svelte.js +5 -20
  6. package/dist/content-player/content-player-settings.d.ts +7 -9
  7. package/dist/content-player/content-player-settings.js +12 -4
  8. package/dist/content-player/controls-and-attachments.svelte +63 -58
  9. package/dist/content-player/overview-panel.svelte +32 -74
  10. package/dist/content-player/overview-panel.svelte.d.ts +34 -7
  11. package/dist/content-player/ui-manager.svelte.d.ts +2 -6
  12. package/dist/content-player/ui-manager.svelte.js +3 -7
  13. package/dist/media-center/config/internal-media-center-config.d.ts +7 -3
  14. package/dist/media-center/config/internal-media-center-config.js +27 -23
  15. package/dist/media-center/config/operations.generated.d.ts +23 -3
  16. package/dist/media-center/config/operations.generated.js +37 -6
  17. package/dist/media-center/config/operations.graphql +24 -4
  18. package/dist/media-center/config/types.d.ts +18 -2
  19. package/dist/media-center/media-center/cmp.media-center.svelte +213 -398
  20. package/dist/media-center/media-center/cmp.media-center.svelte.d.ts +2 -17
  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-view.svelte.d.ts +15 -0
  33. package/dist/media-center/media-center/discover/index.d.ts +2 -0
  34. package/dist/media-center/media-center/discover/index.js +2 -0
  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 +27 -0
  45. package/dist/media-center/media-center/handlers/categories-handler.svelte.js +39 -0
  46. package/dist/media-center/media-center/handlers/index.d.ts +2 -0
  47. package/dist/media-center/media-center/handlers/index.js +2 -0
  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/index.d.ts +3 -0
  51. package/dist/media-center/media-center/header-footer/index.js +3 -0
  52. package/dist/media-center/media-center/header-footer/media-center-footer.svelte +73 -0
  53. package/dist/media-center/media-center/header-footer/media-center-footer.svelte.d.ts +7 -0
  54. package/dist/media-center/media-center/header-footer/media-center-header-localization.d.ts +13 -0
  55. package/dist/media-center/media-center/header-footer/media-center-header-localization.js +46 -0
  56. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte +80 -0
  57. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte.d.ts +12 -0
  58. package/dist/media-center/media-center/header-footer/media-center-header.svelte +313 -0
  59. package/dist/media-center/media-center/header-footer/media-center-header.svelte.d.ts +12 -0
  60. package/dist/media-center/media-center/media-center-context.svelte.d.ts +68 -0
  61. package/dist/media-center/media-center/media-center-context.svelte.js +134 -0
  62. package/dist/media-center/media-center/{category-following-wrapper.svelte → menu/category-following-wrapper.svelte} +3 -2
  63. package/dist/media-center/media-center/{category-following-wrapper.svelte.d.ts → menu/category-following-wrapper.svelte.d.ts} +2 -2
  64. package/dist/media-center/media-center/menu/index.d.ts +2 -0
  65. package/dist/media-center/media-center/menu/index.js +2 -0
  66. package/dist/media-center/media-center/menu/menu-localization.d.ts +10 -0
  67. package/dist/media-center/media-center/menu/menu-localization.js +39 -0
  68. package/dist/media-center/media-center/menu/menu.svelte +353 -0
  69. package/dist/media-center/media-center/menu/menu.svelte.d.ts +14 -0
  70. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.d.ts +10 -0
  71. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.js +23 -0
  72. package/dist/media-center/media-center/moments/cmp.moments-circle.svelte +41 -0
  73. package/dist/media-center/media-center/moments/cmp.moments-circle.svelte.d.ts +7 -0
  74. package/dist/media-center/media-center/moments/index.d.ts +1 -0
  75. package/dist/media-center/media-center/moments/index.js +1 -0
  76. package/dist/media-center/media-center/streams-in-category/index.d.ts +2 -0
  77. package/dist/media-center/media-center/streams-in-category/index.js +2 -0
  78. 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} +5 -5
  79. 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
  80. package/dist/media-center/media-center/{streams-in-category-panel.svelte → streams-in-category/streams-in-category-panel.svelte} +1 -1
  81. 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
  82. package/dist/media-center/media-center/types.d.ts +44 -1
  83. package/dist/media-page/index.d.ts +121 -0
  84. package/dist/media-page/index.js +43 -0
  85. package/dist/posts/attachments/cmp.attachments.svelte +6 -3
  86. package/dist/posts/attachments/cmp.attachments.svelte.d.ts +6 -0
  87. package/dist/posts/controls/cmp.controls.svelte +51 -14
  88. package/dist/posts/controls/cmp.controls.svelte.d.ts +2 -0
  89. package/dist/posts/data-loaders/operations.generated.d.ts +4 -0
  90. package/dist/posts/data-loaders/operations.generated.js +6 -2
  91. package/dist/posts/model/types.d.ts +2 -0
  92. package/dist/posts/post-viewer/cmp.post-viewer.svelte +29 -19
  93. package/dist/posts/post-viewer/cmp.post-viewer.svelte.d.ts +4 -0
  94. package/dist/posts/post-viewer/mapper.js +2 -0
  95. package/dist/posts/post-viewer/operations.generated.d.ts +2 -0
  96. package/dist/posts/post-viewer/operations.generated.js +3 -1
  97. package/dist/posts/post-viewer/operations.graphql +2 -0
  98. package/dist/posts/post-viewer/post-texts.svelte +3 -3
  99. package/dist/posts/posts-player/cmp.posts-player.svelte +20 -6
  100. package/dist/posts/posts-player/cmp.posts-player.svelte.d.ts +18 -2
  101. package/dist/posts/posts-player/index.d.ts +18 -3
  102. package/dist/posts/posts-player/index.js +42 -89
  103. package/dist/posts/posts-player/posts-player-proxy.svelte +19 -0
  104. package/dist/posts/posts-player/posts-player-proxy.svelte.d.ts +22 -0
  105. package/dist/posts/posts-player/posts-player-view.svelte +20 -34
  106. package/dist/posts/posts-player/posts-player-view.svelte.d.ts +2 -6
  107. package/dist/posts/posts-player/types.d.ts +19 -6
  108. package/dist/products/product-card/cmp.product-card.svelte +39 -15
  109. package/dist/products/product-card/cmp.product-card.svelte.d.ts +6 -1
  110. package/dist/short-videos/short-video-card/cmp.short-video-card.svelte +160 -19
  111. package/dist/short-videos/short-video-card/cmp.short-video-card.svelte.d.ts +2 -1
  112. package/dist/short-videos/short-video-card/localization.d.ts +5 -0
  113. package/dist/short-videos/short-video-card/localization.js +13 -0
  114. package/dist/short-videos/short-video-card/types.d.ts +4 -0
  115. package/dist/short-videos/short-videos-player/index.js +26 -33
  116. package/dist/streams/data-loaders/mapper.js +0 -5
  117. package/dist/streams/data-loaders/operations.generated.d.ts +0 -12
  118. package/dist/streams/data-loaders/operations.generated.js +0 -26
  119. package/dist/streams/data-loaders/operations.graphql +0 -6
  120. package/dist/streams/layout/element-views/cmp.short-video-stream-element.svelte +2 -1
  121. package/dist/streams/layout/element-views/cmp.short-video-stream-element.svelte.d.ts +4 -0
  122. package/dist/streams/layout/element-views/cmp.stream-element.svelte +2 -2
  123. package/dist/streams/layout/element-views/cmp.text-ref-stream-element.svelte +7 -3
  124. package/dist/streams/layout/element-views/cmp.text-ref-stream-element.svelte.d.ts +2 -0
  125. package/dist/streams/layout/element-views/cmp.text-stream-element.svelte +7 -3
  126. package/dist/streams/layout/element-views/cmp.text-stream-element.svelte.d.ts +2 -0
  127. package/dist/streams/layout/element-views/price-element-view.svelte +2 -2
  128. package/dist/streams/layout/element-views/price-stream-element-localization.d.ts +1 -1
  129. package/dist/streams/layout/element-views/price-stream-element-localization.js +2 -2
  130. package/dist/streams/layout/models/mapper.js +2 -0
  131. package/dist/streams/stream-card/cmp.stream-card.svelte +5 -5
  132. package/dist/streams/streams-player/index.d.ts +21 -2
  133. package/dist/streams/streams-player/index.js +49 -24
  134. package/dist/streams/streams-player/stream-overview.svelte +6 -96
  135. package/dist/streams/streams-player/stream-overview.svelte.d.ts +0 -4
  136. package/dist/streams/streams-player/stream-player-localization.d.ts +0 -1
  137. package/dist/streams/streams-player/stream-player-localization.js +0 -6
  138. package/dist/streams/streams-player/streams-player-buffer.svelte.d.ts +1 -3
  139. package/dist/streams/streams-player/streams-player-buffer.svelte.js +2 -2
  140. package/dist/streams/streams-player/streams-player-view.svelte +25 -23
  141. package/dist/streams/streams-player/streams-player-view.svelte.d.ts +1 -5
  142. package/dist/streams/streams-player/types.d.ts +18 -8
  143. package/dist/ui/icon/cmp.icon.svelte +3 -2
  144. package/dist/ui/line-clamp/cmp.line-clamp-auto.svelte +119 -0
  145. package/dist/ui/line-clamp/cmp.line-clamp-auto.svelte.d.ts +10 -0
  146. package/dist/ui/line-clamp/cmp.line-clamp.svelte +44 -72
  147. package/dist/ui/line-clamp/cmp.line-clamp.svelte.d.ts +3 -4
  148. package/dist/ui/line-clamp/index.d.ts +1 -0
  149. package/dist/ui/line-clamp/index.js +1 -0
  150. package/dist/ui/player/button/cmp.mobile-player-buttons-group.svelte +44 -0
  151. package/dist/ui/player/button/cmp.mobile-player-buttons-group.svelte.d.ts +7 -0
  152. package/dist/ui/player/button/cmp.player-button.svelte +16 -5
  153. package/dist/ui/player/button/cmp.player-button.svelte.d.ts +3 -0
  154. package/dist/ui/player/button/cmp.player-buttons-group.svelte +27 -8
  155. package/dist/ui/player/button/cmp.player-buttons-group.svelte.d.ts +2 -0
  156. package/dist/ui/player/button/index.d.ts +1 -0
  157. package/dist/ui/player/button/index.js +1 -0
  158. package/dist/ui/player/close-orchestrator/close-orchestrator.svelte.d.ts +18 -0
  159. package/dist/ui/player/close-orchestrator/close-orchestrator.svelte.js +58 -0
  160. package/dist/ui/player/close-orchestrator/index.d.ts +2 -0
  161. package/dist/ui/player/close-orchestrator/index.js +1 -0
  162. package/dist/ui/player/close-orchestrator/types.d.ts +9 -0
  163. package/dist/ui/player/close-orchestrator/types.js +1 -0
  164. package/dist/ui/player/colors/index.d.ts +1 -0
  165. package/dist/ui/player/colors/index.js +1 -0
  166. package/dist/ui/player/colors/player-colors.d.ts +11 -0
  167. package/dist/ui/player/colors/player-colors.js +1 -0
  168. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.d.ts +2 -6
  169. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.js +11 -11
  170. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.d.ts +2 -3
  171. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.js +5 -5
  172. package/dist/ui/player/providers/default-feed-player-buffer.svelte.d.ts +3 -4
  173. package/dist/ui/player/providers/default-feed-player-buffer.svelte.js +16 -9
  174. package/dist/ui/player/providers/service.d.ts +2 -0
  175. package/dist/ui/player/providers/service.js +13 -0
  176. package/dist/ui/player/providers/types.d.ts +1 -0
  177. package/dist/ui/with-background/cmp.with-background.svelte +86 -0
  178. package/dist/ui/with-background/cmp.with-background.svelte.d.ts +10 -0
  179. package/dist/ui/with-background/index.d.ts +1 -0
  180. package/dist/ui/with-background/index.js +1 -0
  181. package/package.json +5 -1
  182. package/dist/content-player/content-player-localization.d.ts +0 -6
  183. package/dist/content-player/content-player-localization.js +0 -15
  184. package/dist/content-player/fade-mixins.scss +0 -12
  185. package/dist/content-player/header.svelte +0 -137
  186. package/dist/content-player/header.svelte.d.ts +0 -32
  187. package/dist/media-center/media-center/desktop-categories-selector.svelte +0 -132
  188. package/dist/media-center/media-center/desktop-categories-selector.svelte.d.ts +0 -12
  189. package/dist/media-center/media-center/discover-panel-handler.svelte.d.ts +0 -32
  190. package/dist/media-center/media-center/discover-panel-handler.svelte.js +0 -101
  191. package/dist/media-center/media-center/discover-panel.svelte +0 -133
  192. package/dist/media-center/media-center/discover-panel.svelte.d.ts +0 -15
  193. package/dist/media-center/media-center/media-center-handler.svelte.d.ts +0 -28
  194. package/dist/media-center/media-center/media-center-handler.svelte.js +0 -73
  195. package/dist/media-center/media-center/media-center-localization.d.ts +0 -10
  196. package/dist/media-center/media-center/media-center-localization.js +0 -39
  197. package/dist/media-center/media-center/mobile-controls-panel.svelte +0 -268
  198. package/dist/media-center/media-center/mobile-controls-panel.svelte.d.ts +0 -20
  199. package/dist/media-center/media-center/post-player-provider-generator.d.ts +0 -8
  200. package/dist/media-center/media-center/post-player-provider-generator.js +0 -32
  201. package/dist/media-center/media-center/streams-player-provider-generator.d.ts +0 -8
  202. package/dist/media-center/media-center/streams-player-provider-generator.js +0 -36
  203. package/dist/media-center/model/types.d.ts +0 -16
  204. /package/dist/media-center/{model → media-center/feed}/types.js +0 -0
@@ -1,27 +1,112 @@
1
- <script lang="ts">import { Icon } from '../../ui/icon';
1
+ <script lang="ts">import { toPriceRepresentation } from '../../products/price-helper';
2
+ import { Icon } from '../../ui/icon';
2
3
  import { ImageRounded } from '../../ui/image';
3
4
  import { LineClamp } from '../../ui/line-clamp';
4
5
  import { ProportionalContainer } from '../../ui/proportional-container';
6
+ import { TimeAgo } from '../../ui/time-ago';
7
+ import { ShortVideoCardLocalization } from './localization';
5
8
  import IconPhone from '@fluentui/svg-icons/icons/phone_20_regular.svg?raw';
6
- let { shortVideo, aspectRatio = 9 / 16, on } = $props();
9
+ import IconShoppingBag from '@fluentui/svg-icons/icons/shopping_bag_20_regular.svg?raw';
10
+ const ADJUST_TEXT_SIZE = false;
11
+ let { shortVideo, locale, on } = $props();
12
+ const localization = new ShortVideoCardLocalization(locale);
13
+ const adjustTextSize = (node) => {
14
+ if (!ADJUST_TEXT_SIZE) {
15
+ return;
16
+ }
17
+ const isOverflown = ({ clientHeight, scrollHeight }) => scrollHeight > clientHeight;
18
+ const resizeObserver = new ResizeObserver(() => {
19
+ node.style.fontSize = '';
20
+ const { fontSize } = window.getComputedStyle(node);
21
+ const originalFontSize = parseFloat(fontSize);
22
+ const maxSize = originalFontSize * 2;
23
+ let i = originalFontSize;
24
+ let overflow = false;
25
+ while (!overflow && i < maxSize) {
26
+ node.style.fontSize = `${i}px`;
27
+ overflow = isOverflown(node);
28
+ if (!overflow) {
29
+ i += 1;
30
+ }
31
+ }
32
+ node.style.fontSize = `${i - 1}px`;
33
+ });
34
+ resizeObserver.observe(node);
35
+ return {
36
+ destroy() {
37
+ resizeObserver.disconnect();
38
+ }
39
+ };
40
+ };
7
41
  </script>
8
42
 
9
43
  <div class="short-video-card">
10
44
  <div class="short-video-card__media">
11
- <ProportionalContainer ratio={aspectRatio}>
45
+ <ProportionalContainer ratio={2 / 3}>
12
46
  <ImageRounded src={shortVideo.cover} alt="" noBorders={true} />
13
47
  </ProportionalContainer>
14
48
 
15
49
  <div class="short-video-card__media-icons">
16
- <Icon src={IconPhone}></Icon>
50
+ <Icon src={shortVideo.products.length ? IconShoppingBag : IconPhone}></Icon>
17
51
  </div>
18
52
  </div>
19
53
 
20
- {#if shortVideo.text}
21
- <div class="short-video-card__text">
22
- <LineClamp value={shortVideo.text} maxLines={2} enableShowMore={false} />
54
+ <div class="short-video-card__info">
55
+ <div class="short-video-card__meta">
56
+ <span><TimeAgo date={shortVideo.displayDate} locale={locale} /></span>
57
+ {#if shortVideo.viewsCount}
58
+ <span>&middot;</span>
59
+ <span>{localization.viewsLabel(shortVideo.viewsCount)}</span>
60
+ {/if}
23
61
  </div>
24
- {/if}
62
+
63
+ <div class="short-video-card__text" use:adjustTextSize>
64
+ {#if shortVideo.text}
65
+ {shortVideo.text}
66
+ {/if}
67
+ </div>
68
+
69
+ <div class="short-video-card__products">
70
+ {#snippet productView(product: IPostProductCardModel)}
71
+ <div class="product-card">
72
+ <ProportionalContainer ratio={4 / 5}>
73
+ <ImageRounded src={product.image} alt={product.title} noBorders={true} />
74
+ </ProportionalContainer>
75
+
76
+ <div class="product-card__info">
77
+ <div class="product-card__title">
78
+ <LineClamp maxLines={1} enableShowMore={false} locale={locale}>{product.title}</LineClamp>
79
+ </div>
80
+ <div class="product-card__price">
81
+ <LineClamp maxLines={1} locale={locale}>
82
+ <span>
83
+ {toPriceRepresentation({
84
+ amount: product.salePrice || product.price,
85
+ currency: product.currency,
86
+ options: { currencyMode: 'none' }
87
+ })}
88
+ </span>
89
+ {#if product.salePrice}
90
+ &nbsp;
91
+ <span
92
+ >{toPriceRepresentation({
93
+ amount: product.price,
94
+ currency: product.currency,
95
+ options: { currencyMode: 'none' }
96
+ })}
97
+ </span>
98
+ {/if}
99
+ </LineClamp>
100
+ </div>
101
+ </div>
102
+ </div>
103
+ {/snippet}
104
+
105
+ {#each shortVideo.products as product (product.id)}
106
+ {@render productView(product)}
107
+ {/each}
108
+ </div>
109
+ </div>
25
110
 
26
111
  {#if on?.click}
27
112
  <button type="button" onclick={on.click} class="short-video-card__link" aria-label="none">&nbsp;</button>
@@ -44,13 +129,12 @@ let { shortVideo, aspectRatio = 9 / 16, on } = $props();
44
129
  overflow: hidden;
45
130
  container-type: inline-size;
46
131
  width: 100%;
47
- border-radius: 0.375rem;
48
132
  }
49
133
  .short-video-card__media {
50
134
  display: flex;
51
135
  align-items: center;
52
136
  justify-content: center;
53
- --image--rounded--outer--border-radius: 1%;
137
+ --image--rounded--outer--border-radius: 0.5rem;
54
138
  }
55
139
  .short-video-card__media-icons {
56
140
  position: absolute;
@@ -63,17 +147,45 @@ let { shortVideo, aspectRatio = 9 / 16, on } = $props();
63
147
  --icon--color: #ffffff;
64
148
  --icon--filter: drop-shadow(1px 1px 0 rgba(0, 0, 0, 0.2));
65
149
  }
150
+ .short-video-card__info {
151
+ margin-top: clamp(0.4375rem, 3.6cqi, 0.625rem);
152
+ display: flex;
153
+ flex-direction: column;
154
+ gap: clamp(0.4375rem, 3.6cqi, 0.625rem);
155
+ }
156
+ .short-video-card__meta {
157
+ font-size: clamp(0.625rem, 4.3cqi, 0.75rem);
158
+ font-weight: 500;
159
+ color: #999999;
160
+ display: flex;
161
+ align-items: center;
162
+ gap: 0.25rem;
163
+ }
66
164
  .short-video-card__text {
67
- position: absolute;
68
- bottom: 0;
69
- left: 0;
70
- right: 0;
71
- background: linear-gradient(0deg, rgba(0, 0, 0, 0.9) 30%, rgba(0, 0, 0, 0.01) 100%);
72
165
  color: #ffffff;
73
- font-size: 0.75rem;
74
- font-weight: 400;
75
- padding: 0.75rem 0.75rem;
76
- padding-top: 2.5rem;
166
+ --min-font: 0.75rem;
167
+ --max-font: 0.9375rem;
168
+ --line-height: 1.2;
169
+ font-size: clamp(var(--min-font), 5.4cqi, var(--max-font));
170
+ line-height: var(--line-height);
171
+ font-weight: 500;
172
+ height: clamp(var(--min-font) * var(--line-height) * 2 - 1px, 5.4cqi * var(--line-height) * 2 - 1px, var(--max-font) * var(--line-height) * 2 - 1px);
173
+ white-space: pre-line;
174
+ word-break: break-word;
175
+ display: -webkit-box;
176
+ overflow: hidden;
177
+ -webkit-box-orient: vertical;
178
+ line-clamp: 2;
179
+ -webkit-line-clamp: 2;
180
+ text-overflow: ellipsis;
181
+ }
182
+ .short-video-card__products {
183
+ display: grid;
184
+ grid-template-columns: repeat(3, minmax(0, 1fr));
185
+ gap: clamp(0.625rem, 5cqi, 0.875rem);
186
+ }
187
+ .short-video-card__products > :nth-child(n+4) {
188
+ display: none;
77
189
  }
78
190
  .short-video-card__link {
79
191
  position: absolute;
@@ -81,4 +193,33 @@ let { shortVideo, aspectRatio = 9 / 16, on } = $props();
81
193
  left: 0;
82
194
  width: 100%;
83
195
  height: 100%;
196
+ }
197
+
198
+ .product-card {
199
+ --image--rounded--outer--border-radius: 0.375rem;
200
+ container-type: inline-size;
201
+ }
202
+ .product-card__info {
203
+ display: flex;
204
+ flex-direction: column;
205
+ color: #ffffff;
206
+ font-size: clamp(0.5rem, 2.9cqi, 0.5rem);
207
+ line-height: clamp(0.75rem, 4.3cqi, 0.75rem);
208
+ font-weight: 500;
209
+ /* Set 'container-type: inline-size;' to reference container*/
210
+ }
211
+ @container (width < 60px) {
212
+ .product-card__info {
213
+ display: none;
214
+ }
215
+ }
216
+ .product-card__title {
217
+ font-weight: 500;
218
+ }
219
+ .product-card__price {
220
+ font-weight: 600;
221
+ }
222
+ .product-card__price span:nth-child(2) {
223
+ color: #999999;
224
+ text-decoration: line-through;
84
225
  }</style>
@@ -1,7 +1,8 @@
1
+ import type { Locale } from '../../core/locale';
1
2
  import type { ShortVideoCardModel } from './types';
2
3
  type Props = {
3
4
  shortVideo: ShortVideoCardModel;
4
- aspectRatio?: number;
5
+ locale: Locale;
5
6
  on?: {
6
7
  click?: () => void;
7
8
  };
@@ -0,0 +1,5 @@
1
+ import { type Locale } from '../../core/locale';
2
+ export declare class ShortVideoCardLocalization {
3
+ viewsLabel: (count: number) => string;
4
+ constructor(locale: Locale);
5
+ }
@@ -0,0 +1,13 @@
1
+ import {} from '../../core/locale';
2
+ export class ShortVideoCardLocalization {
3
+ viewsLabel;
4
+ constructor(locale) {
5
+ this.viewsLabel = loc.viewsLabel[locale];
6
+ }
7
+ }
8
+ const loc = {
9
+ viewsLabel: {
10
+ en: (count) => `${count} view${count !== 1 ? 's' : ''}`,
11
+ no: (count) => `${count} visning${count !== 1 ? 'er' : ''}`
12
+ }
13
+ };
@@ -1,5 +1,9 @@
1
+ import type { IPostProductCardModel } from '../../posts/model';
1
2
  export type ShortVideoCardModel = {
2
3
  id: string;
3
4
  text: string | null;
4
5
  cover: string;
6
+ displayDate: string;
7
+ viewsCount: number;
8
+ products: IPostProductCardModel[];
5
9
  };
@@ -1,10 +1,8 @@
1
1
  import { InternalMediaCenterConfig } from '../../media-center/config/internal-media-center-config';
2
2
  import {} from '../../media-center/config/types';
3
- import { MediaCenter } from '../../media-center/media-center';
4
3
  import { InternalPostAnalyticsHandler } from '../../posts/handlers';
4
+ import { openPostsPlayer } from '../../posts/posts-player';
5
5
  import { InternalShortVideoPlayerItemsProvider } from '../data-providers';
6
- import { ModalShadowHost } from '../../ui/shadow-dom';
7
- import { mount, unmount } from 'svelte';
8
6
  /**
9
7
  * Opens the short videos player modal.
10
8
  *
@@ -71,35 +69,30 @@ import { mount, unmount } from 'svelte';
71
69
  export async function openShortVideosPlayer(init) {
72
70
  const { ids, graphqlOrigin, initialId, initiator, playerSettings, on } = init;
73
71
  const dataProvider = new InternalShortVideoPlayerItemsProvider({ ids, graphqlOrigin, initialId, initiator });
74
- const mediaCenterConfig = init.mediaPageId ? new InternalMediaCenterConfig(init.mediaPageId, graphqlOrigin) : undefined;
72
+ const mediaCenterConfig = init.mediaPageId ? new InternalMediaCenterConfig({ mediaPageId: init.mediaPageId, graphqlOrigin, initiator }) : undefined;
75
73
  const analyticsHandler = new InternalPostAnalyticsHandler(graphqlOrigin);
76
- const shadowHost = new ModalShadowHost();
77
- const mounted = mount(MediaCenter, {
78
- target: shadowHost.shadowRoot,
79
- props: {
80
- config: mediaCenterConfig || null,
81
- playerProps: {
82
- mode: 'posts',
83
- props: {
84
- dataProvider,
85
- analyticsHandler,
86
- playerSettings: {
87
- hideCloseButton: playerSettings?.hideCloseButton,
88
- locale: playerSettings?.locale,
89
- showStreamsCloudWatermark: true
90
- },
91
- on: {
92
- playerClosed: async () => {
93
- await unmount(mounted);
94
- shadowHost.remove();
95
- if (on?.playerClosed) {
96
- on.playerClosed();
97
- }
98
- }
99
- }
100
- }
101
- }
102
- }
103
- });
104
- shadowHost.attachToBody();
74
+ if (mediaCenterConfig) {
75
+ openPostsPlayer({
76
+ postsProvider: dataProvider,
77
+ mediaCenterConfig,
78
+ playerSettings: {
79
+ hideCloseButton: playerSettings?.hideCloseButton,
80
+ locale: playerSettings?.locale,
81
+ showStreamsCloudWatermark: true
82
+ },
83
+ on
84
+ });
85
+ }
86
+ else {
87
+ openPostsPlayer({
88
+ postsProvider: dataProvider,
89
+ analyticsHandler,
90
+ playerSettings: {
91
+ hideCloseButton: playerSettings?.hideCloseButton,
92
+ locale: playerSettings?.locale,
93
+ showStreamsCloudWatermark: true
94
+ },
95
+ on
96
+ });
97
+ }
105
98
  }
@@ -1,6 +1,5 @@
1
1
  import { ProfileType } from '../../core/enums';
2
2
  export const mapToStreamPlayerModel = (payload) => {
3
- const headerDataProvider = payload.availableFrom ?? payload.ownerProfile;
4
3
  return {
5
4
  id: payload.id,
6
5
  title: payload.title,
@@ -9,10 +8,6 @@ export const mapToStreamPlayerModel = (payload) => {
9
8
  createdAt: payload.createdAt,
10
9
  publishedAt: payload.publishedAt,
11
10
  organizationId: payload.ownerProfile.type === ProfileType.Organization ? payload.ownerProfile.id : null,
12
- header: {
13
- name: headerDataProvider.name,
14
- image: headerDataProvider.image
15
- },
16
11
  pagesCount: payload.pagesCount
17
12
  };
18
13
  };
@@ -17,15 +17,9 @@ export type GetStreamsQuery = {
17
17
  url: string;
18
18
  } | null;
19
19
  ownerProfile: {
20
- image: string | null;
21
- name: string;
22
20
  id: string;
23
21
  type: SchemaTypes.ProfileType;
24
22
  };
25
- availableFrom: {
26
- image: string;
27
- name: string;
28
- } | null;
29
23
  }>;
30
24
  };
31
25
  };
@@ -57,15 +51,9 @@ export type StreamPlayerPayloadFragment = {
57
51
  url: string;
58
52
  } | null;
59
53
  ownerProfile: {
60
- image: string | null;
61
- name: string;
62
54
  id: string;
63
55
  type: SchemaTypes.ProfileType;
64
56
  };
65
- availableFrom: {
66
- image: string;
67
- name: string;
68
- } | null;
69
57
  };
70
58
  export declare const StreamPlayerPayloadFragmentDoc: DocumentNode<StreamPlayerPayloadFragment, unknown>;
71
59
  export declare const GetStreamsDocument: DocumentNode<GetStreamsQuery, GetStreamsQueryVariables>;
@@ -24,24 +24,11 @@ export const StreamPlayerPayloadFragmentDoc = {
24
24
  selectionSet: {
25
25
  kind: 'SelectionSet',
26
26
  selections: [
27
- { kind: 'Field', name: { kind: 'Name', value: 'image' } },
28
- { kind: 'Field', name: { kind: 'Name', value: 'name' } },
29
27
  { kind: 'Field', name: { kind: 'Name', value: 'id' } },
30
28
  { kind: 'Field', name: { kind: 'Name', value: 'type' } }
31
29
  ]
32
30
  }
33
31
  },
34
- {
35
- kind: 'Field',
36
- name: { kind: 'Name', value: 'availableFrom' },
37
- selectionSet: {
38
- kind: 'SelectionSet',
39
- selections: [
40
- { kind: 'Field', name: { kind: 'Name', value: 'image' } },
41
- { kind: 'Field', name: { kind: 'Name', value: 'name' } }
42
- ]
43
- }
44
- },
45
32
  { kind: 'Field', name: { kind: 'Name', value: 'pagesCount' } }
46
33
  ]
47
34
  }
@@ -108,24 +95,11 @@ export const GetStreamsDocument = {
108
95
  selectionSet: {
109
96
  kind: 'SelectionSet',
110
97
  selections: [
111
- { kind: 'Field', name: { kind: 'Name', value: 'image' } },
112
- { kind: 'Field', name: { kind: 'Name', value: 'name' } },
113
98
  { kind: 'Field', name: { kind: 'Name', value: 'id' } },
114
99
  { kind: 'Field', name: { kind: 'Name', value: 'type' } }
115
100
  ]
116
101
  }
117
102
  },
118
- {
119
- kind: 'Field',
120
- name: { kind: 'Name', value: 'availableFrom' },
121
- selectionSet: {
122
- kind: 'SelectionSet',
123
- selections: [
124
- { kind: 'Field', name: { kind: 'Name', value: 'image' } },
125
- { kind: 'Field', name: { kind: 'Name', value: 'name' } }
126
- ]
127
- }
128
- },
129
103
  { kind: 'Field', name: { kind: 'Name', value: 'pagesCount' } }
130
104
  ]
131
105
  }
@@ -27,14 +27,8 @@ fragment StreamPlayerPayloadFragment on Stream {
27
27
  url
28
28
  }
29
29
  ownerProfile {
30
- image
31
- name
32
30
  id
33
31
  type
34
32
  }
35
- availableFrom {
36
- image
37
- name
38
- }
39
33
  pagesCount
40
34
  }
@@ -2,12 +2,13 @@
2
2
  import { PostViewer } from '../../../posts/post-viewer';
3
3
  import { ShortVideoStreamElementLocalization } from './short-video-stream-element-localization';
4
4
  import { mapToPostModel } from '../models';
5
- let { data, trackingParams, locale, on } = $props();
5
+ let { data, trackingParams, locale, controlsColors = null, on } = $props();
6
6
  const localization = $derived(new ShortVideoStreamElementLocalization(locale));
7
7
  </script>
8
8
 
9
9
  <PostViewer
10
10
  model={new PostModel(mapToPostModel(data))}
11
+ controlsColors={controlsColors}
11
12
  trackingParams={trackingParams ? { streamId: trackingParams.streamId, campaignId: trackingParams.campaignId } : false}
12
13
  autoplay={false}
13
14
  enableControls={false}
@@ -5,6 +5,10 @@ type Props = {
5
5
  data: StreamLayoutShortVideoModel;
6
6
  trackingParams: StreamTrackingParams;
7
7
  locale: Locale;
8
+ controlsColors?: {
9
+ active: string | null;
10
+ inactive: string | null;
11
+ } | null;
8
12
  on?: {
9
13
  progress?: (progress: number) => void;
10
14
  };
@@ -70,9 +70,9 @@ const productModel = $derived.by(() => {
70
70
  {:else if model.type === StreamElementType.Stock}
71
71
  <StockStreamElementView model={model} locale={locale} />
72
72
  {:else if model.type === StreamElementType.Text}
73
- <TextStreamElementView model={model} />
73
+ <TextStreamElementView model={model} locale={locale} />
74
74
  {:else if model.type === StreamElementType.TextRef && data}
75
- <TextRefStreamElementView model={model} data={data} />
75
+ <TextRefStreamElementView model={model} data={data} locale={locale} />
76
76
  {:else if model.type === StreamElementType.WebView}
77
77
  <WebViewStreamElementView model={model} />
78
78
  {/if}
@@ -1,7 +1,7 @@
1
- <script lang="ts">import { LineClamp } from '../../../ui/line-clamp';
1
+ <script lang="ts">import { LineClamp, LineClampAuto } from '../../../ui/line-clamp';
2
2
  import { getStringValueByKey } from './data-by-key-accessor';
3
3
  import { generateTextStyles } from '../styles-transformer';
4
- let { model, data } = $props();
4
+ let { model, data, locale } = $props();
5
5
  const value = $derived.by(() => {
6
6
  const values = [];
7
7
  const value = getStringValueByKey(data, model.key);
@@ -19,5 +19,9 @@ const value = $derived.by(() => {
19
19
  </script>
20
20
 
21
21
  <div class="text-ref-stream-element" style={generateTextStyles(model.styles)}>
22
- <LineClamp value={value} maxLines={model.styles?.maxLines || 'auto'} />
22
+ {#if model.styles?.maxLines}
23
+ <LineClamp maxLines={model.styles?.maxLines} locale={locale}>{value}</LineClamp>
24
+ {:else}
25
+ <LineClampAuto locale={locale}>{value}</LineClampAuto>
26
+ {/if}
23
27
  </div>
@@ -1,8 +1,10 @@
1
+ import type { Locale } from '../../../core/locale';
1
2
  import type { TextRefStreamElementModel } from '../elements';
2
3
  import type { StreamSlotDataRef } from '../slot-data-ref';
3
4
  type Props = {
4
5
  model: TextRefStreamElementModel;
5
6
  data: StreamSlotDataRef;
7
+ locale: Locale;
6
8
  };
7
9
  declare const Cmp: import("svelte").Component<Props, {}, "">;
8
10
  type Cmp = ReturnType<typeof Cmp>;
@@ -1,11 +1,15 @@
1
- <script lang="ts">import { LineClamp } from '../../../ui/line-clamp';
1
+ <script lang="ts">import { LineClamp, LineClampAuto } from '../../../ui/line-clamp';
2
2
  import { generateTextStyles } from '../styles-transformer';
3
- let { model, placeholder } = $props();
3
+ let { model, locale, placeholder } = $props();
4
4
  </script>
5
5
 
6
6
  <div class="text-stream-element" style={generateTextStyles(model.styles)}>
7
7
  {#if model.value}
8
- <LineClamp value={model.value} maxLines={model.styles?.maxLines || 'auto'} />
8
+ {#if model.styles?.maxLines}
9
+ <LineClamp maxLines={model.styles?.maxLines} locale={locale}>{model.value}</LineClamp>
10
+ {:else}
11
+ <LineClampAuto locale={locale}>{model.value}</LineClampAuto>
12
+ {/if}
9
13
  {:else if placeholder}
10
14
  {@render placeholder()}
11
15
  {/if}
@@ -1,8 +1,10 @@
1
+ import type { Locale } from '../../../core/locale';
1
2
  import type { TextStreamElementModel } from '../elements';
2
3
  import type { Snippet } from 'svelte';
3
4
  type Props = {
4
5
  model: TextStreamElementModel;
5
6
  placeholder?: Snippet;
7
+ locale: Locale;
6
8
  };
7
9
  declare const Cmp: import("svelte").Component<Props, {}, "">;
8
10
  type Cmp = ReturnType<typeof Cmp>;
@@ -138,12 +138,12 @@ $effect(() => {
138
138
  {/if}
139
139
  {#if model.textAfter}
140
140
  <div class="price-stream-element__text-after" style={textAfterCustomStyles}>
141
- <LineClamp value={model.textAfter} maxLines={1} />
141
+ <LineClamp maxLines={1} locale={localization.locale}>{model.textAfter}</LineClamp>
142
142
  </div>
143
143
  {/if}
144
144
  </div>
145
145
  {#if model.stock}
146
- <StockElementView model={model.stock} heightOverrideDdu={stockElementHeight} locale={localization.stockLocalization} />
146
+ <StockElementView model={model.stock} heightOverrideDdu={stockElementHeight} locale={localization.locale} />
147
147
  {/if}
148
148
  </div>
149
149
 
@@ -2,6 +2,6 @@ import { type Locale } from '../../../core/locale';
2
2
  export declare class PriceStreamElementLocalization {
3
3
  saveValue: (value: string | number) => string;
4
4
  beforeValue: (value: string) => string;
5
- stockLocalization: Locale;
5
+ locale: Locale;
6
6
  constructor(locale: Locale);
7
7
  }
@@ -2,11 +2,11 @@ import {} from '../../../core/locale';
2
2
  export class PriceStreamElementLocalization {
3
3
  saveValue;
4
4
  beforeValue;
5
- stockLocalization;
5
+ locale;
6
6
  constructor(locale) {
7
7
  this.saveValue = loc.saveValue[locale];
8
8
  this.beforeValue = loc.beforeValue[locale];
9
- this.stockLocalization = locale;
9
+ this.locale = locale;
10
10
  }
11
11
  }
12
12
  const loc = {
@@ -13,6 +13,8 @@ export const mapToPostModel = (model) => {
13
13
  kicker: null,
14
14
  title: null,
15
15
  text: model.text,
16
+ viewsCount: model.header?.postViewsCount ?? 0,
17
+ displayDate: model.header?.postDisplayDate ?? '',
16
18
  heading: model.header && {
17
19
  image: model.header.sourceImage,
18
20
  name: model.header.sourceName,
@@ -55,25 +55,25 @@ let { stream, aspectRatio = 9 / 16, on } = $props();
55
55
  bottom: 0;
56
56
  left: 0;
57
57
  right: 0;
58
- height: 2.5rem;
58
+ height: clamp(1.75rem, 20cqi, 2.5rem);
59
+ padding-inline: clamp(0.5rem, 6cqi, 0.75rem);
59
60
  background: rgba(0, 0, 0, 0.8);
60
61
  color: #ffffff;
61
- padding: 0 0.75rem;
62
62
  display: flex;
63
63
  flex-direction: column;
64
64
  align-content: center;
65
65
  justify-content: center;
66
66
  }
67
67
  .stream-card__title {
68
- font-size: 0.875rem;
69
- font-weight: 500;
68
+ font-size: clamp(0.5rem, 7cqi, 0.875rem);
69
+ font-weight: 600;
70
70
  white-space: nowrap;
71
71
  overflow: hidden;
72
72
  text-overflow: ellipsis;
73
73
  text-align: center;
74
74
  }
75
75
  .stream-card__sub-title {
76
- font-size: 0.625rem;
76
+ font-size: clamp(0.4375rem, 5cqi, 0.625rem);
77
77
  font-weight: 400;
78
78
  white-space: nowrap;
79
79
  overflow: hidden;