@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,7 +4,7 @@ import { toPriceRepresentation } from '../../products/price-helper';
4
4
  import { Button, ButtonSize } from '../../ui/button';
5
5
  import { Image } from '../../ui/image';
6
6
  import { LineClamp } from '../../ui/line-clamp';
7
- let { ad, colors, trackingParams, inert = false, on } = $props();
7
+ let { ad, colors, locale, trackingParams, inert = false, on } = $props();
8
8
  const trackImpression = (node) => {
9
9
  if (on === null || on === void 0 ? void 0 : on.impression) {
10
10
  const observer = new IntersectionObserver((entries) => {
@@ -53,12 +53,12 @@ const styles = $derived.by(() => {
53
53
  <div class="ad-card__content">
54
54
  {#if ad.title}
55
55
  <div class="ad-card__title">
56
- <LineClamp value={ad.title} maxLines={2} />
56
+ <LineClamp maxLines={2} locale={locale}>{ad.title}</LineClamp>
57
57
  </div>
58
58
  {/if}
59
59
  {#if ad.description}
60
60
  <div class="ad-card__description">
61
- <LineClamp value={ad.description} maxLines={2} />
61
+ <LineClamp maxLines={2} locale={locale}>{ad.description}</LineClamp>
62
62
  </div>
63
63
  {/if}
64
64
  </div>
@@ -79,7 +79,7 @@ const styles = $derived.by(() => {
79
79
  size={ButtonSize.Standard}
80
80
  on={{ click: handleAdClick }}
81
81
  --button--font--size="1em"
82
- --button--font--color={ad.ctaButton.textColor}
82
+ --button--font--color={colors?.buttonBackground ? '#FFFFFF' : ad.ctaButton.textColor}
83
83
  --button--background={colors?.buttonBackground ?? ad.ctaButton.background}
84
84
  --button--min-width="100%">
85
85
  <span class="ad-card__button-text">{ad.ctaButton.text}</span>
@@ -1,3 +1,4 @@
1
+ import type { Locale } from '../../core/locale';
1
2
  import { type TrackingParams } from '../../marketing-tracking';
2
3
  import type { AdCardModel } from './types';
3
4
  type Props = {
@@ -8,6 +9,7 @@ type Props = {
8
9
  price?: string | null;
9
10
  buttonBackground?: string | null;
10
11
  };
12
+ locale: Locale;
11
13
  inert?: boolean;
12
14
  on?: {
13
15
  click?: (id: string) => void;
@@ -4,11 +4,15 @@ import { Loading } from '../ui/loading';
4
4
  import { PlayerSlider } from '../ui/player/slider';
5
5
  import { SwipeIndicator } from '../ui/swipe-indicator';
6
6
  import { default as ControlsAndAttachments } from './controls-and-attachments.svelte';
7
- import { default as Header } from './header.svelte';
8
7
  import { default as OverviewPanel } from './overview-panel.svelte';
9
8
  import {} from 'svelte';
10
9
  let { config, nonPostItemView, overviewPanelContent } = $props();
11
10
  let everTouched = $state(false);
11
+ let overviewPosition = $state({
12
+ top: 0,
13
+ bottom: 0,
14
+ right: 0
15
+ });
12
16
  const uiManager = config.uiManager;
13
17
  const handleContentPlayerMounted = (node) => {
14
18
  const markAsTouched = () => {
@@ -75,6 +79,12 @@ const handleSliderMounted = (node) => {
75
79
  node.style.setProperty('--_content-player--content--height', height);
76
80
  node.style.setProperty('--_content-player--content--margin', margin);
77
81
  uiManager.contentViewWidth = contentWidthNumber;
82
+ const verticalIndent = uiManager.isMobileView ? 0 : 13;
83
+ overviewPosition = {
84
+ top: verticalIndent,
85
+ bottom: verticalIndent,
86
+ right: (playerWidth - contentWidthNumber) / 2 + contentWidthNumber
87
+ };
78
88
  });
79
89
  resizeObserver.observe(node);
80
90
  return {
@@ -83,103 +93,66 @@ const handleSliderMounted = (node) => {
83
93
  }
84
94
  };
85
95
  };
86
- const styles = $derived.by(() => {
87
- const values = [`--_content-player--watermark--left-indent: ${uiManager.safeAreaSize}px`];
88
- if (uiManager.backgroundImageUrl) {
89
- values.push(`--_content-player--background-image-url: url(${uiManager.backgroundImageUrl})`);
90
- }
91
- if (config.playerColors.playerBackground) {
92
- values.push(`--content-player-container--background: ${config.playerColors.playerBackground}`);
93
- }
94
- return values.join(';');
95
- });
96
96
  </script>
97
97
 
98
98
  <svelte:document
99
99
  onkeydown={(e) => {
100
- if (config.settings.enableCloseButton) {
101
- handleEsc(e, () => config.callbacks?.close?.());
100
+ if (config.closeOrchestrator.closeTriggerVisible) {
101
+ handleEsc(e, () => config.closeOrchestrator.requestClose());
102
102
  }
103
103
  }} />
104
104
 
105
- <svelte:head>
106
- <meta name="theme-color" content="#242424" />
107
- <meta name="color-scheme" content="dark" />
108
- <meta name="mobile-web-app-capable" content="yes" />
109
- <meta name="apple-mobile-web-app-capable" content="yes" />
110
- <meta name="apple-mobile-web-app-status-bar-style" content="black" />
111
-
112
- <style>
113
- html,
114
- body {
115
- background-color: #242424;
116
- color-scheme: dark;
117
- }
118
- </style>
119
- </svelte:head>
120
-
121
- <div
122
- class="content-player-container"
123
- class:content-player-container--background-enabled={!config.settings.disableBackground}
124
- class:content-player-container--background-loading={!config.settings.disableBackground && !uiManager.backgroundImageUrl}
125
- class:content-player-container--faded={config.fadeContent}
126
- style={styles}>
127
- <Header config={config} />
128
- <div class="content-player" use:handleContentPlayerMounted>
129
- {#if config.settings.showStreamsCloudWatermark}
130
- <div class="content-player__watermark">
131
- <a href="https://streamscloud.com/" tabindex="-1" aria-label="none">
132
- <img src="https://embedabble-assets.streamscloud-cdn.com/watermark.svg" alt="StreamsCloud" />
133
- </a>
134
- </div>
135
- {/if}
136
- {#if config.playerBuffer}
137
- <div class="content-player__slider" use:handleSliderMounted>
138
- <PlayerSlider buffer={config.playerBuffer} on={config.playerSliderCallbacks}>
139
- {#snippet children({ item })}
140
- {@const postModel = config.itemAsPostViewerModel(item)}
141
- <div class="content-player__content">
142
- {#if overviewPanelContent}
143
- <OverviewPanel config={config} contentFaded={config.fadeContent} uiManager={uiManager}>
144
- {@render overviewPanelContent()}
145
- </OverviewPanel>
146
- {/if}
105
+ <div class="content-player" use:handleContentPlayerMounted>
106
+ {#if config.settings.showStreamsCloudWatermark}
107
+ <div class="content-player__watermark">
108
+ <a href="https://streamscloud.com/" tabindex="-1" aria-label="none">
109
+ <img src="https://embedabble-assets.streamscloud-cdn.com/watermark.svg" alt="StreamsCloud" />
110
+ </a>
111
+ </div>
112
+ {/if}
113
+ {#if config.playerBuffer}
114
+ <div class="content-player__slider" use:handleSliderMounted>
115
+ <PlayerSlider buffer={config.playerBuffer} on={config.playerSliderCallbacks}>
116
+ {#snippet children({ item })}
117
+ {@const postModel = config.itemAsPostViewerModel(item)}
118
+ <div class="content-player__content">
119
+ {#if postModel}
120
+ <PostViewer
121
+ model={postModel}
122
+ controlsColors={{ active: config.playerColors.button, inactive: config.playerColors.buttonInactive }}
123
+ trackingParams={config.trackingParams}
124
+ socialInteractionsHandler={config.socialInteractionsHandler}
125
+ enableAttachments={config.uiManager.showPostOverlayAttachments}
126
+ enableControls={config.uiManager.showPostOverlayControls}
127
+ autoplay="on-appearance"
128
+ locale={config.settings.locale}
129
+ on={{
130
+ progress: (progress) => config.callbacks?.videoProgress?.(item.id, postModel.id, progress),
131
+ productClick: (productId) => config.callbacks?.productClick?.(productId, postModel.id),
132
+ productImpression: (productId) => config.callbacks?.productImpression?.(productId, postModel.id),
133
+ adClick: (adId) => config.callbacks?.adClick?.(adId, postModel.id),
134
+ adImpression: (adId) => config.callbacks?.adImpression?.(adId, postModel.id)
135
+ }} />
136
+ {:else if nonPostItemView}
137
+ {@render nonPostItemView({ item })}
138
+ {/if}
147
139
 
148
- {#if postModel}
149
- <PostViewer
150
- model={postModel}
151
- controlsColors={{ active: config.playerColors.button, inactive: config.playerColors.buttonInactive }}
152
- trackingParams={config.trackingParams}
153
- socialInteractionsHandler={config.socialInteractionsHandler}
154
- enableAttachments={config.uiManager.showPostOverlayAttachments}
155
- enableControls={config.uiManager.showPostOverlayControls}
156
- autoplay="on-appearance"
157
- locale={config.settings.locale}
158
- on={{
159
- progress: (progress) => config.callbacks?.videoProgress?.(item.id, postModel.id, progress),
160
- productClick: (productId) => config.callbacks?.productClick?.(productId, postModel.id),
161
- productImpression: (productId) => config.callbacks?.productImpression?.(productId, postModel.id),
162
- adClick: (adId) => config.callbacks?.adClick?.(adId, postModel.id),
163
- adImpression: (adId) => config.callbacks?.adImpression?.(adId, postModel.id)
164
- }} />
165
- {:else if nonPostItemView}
166
- {@render nonPostItemView({ item })}
167
- {/if}
140
+ {#if uiManager.isMobileView && config.playerBuffer && config.playerBuffer.loaded.length > 1 && !everTouched}
141
+ <SwipeIndicator locale={config.settings.locale} />
142
+ {/if}
143
+ </div>
144
+ {/snippet}
145
+ </PlayerSlider>
146
+ {#if overviewPanelContent && config.playerBuffer.loaded.length > 0}
147
+ <OverviewPanel config={config} position={overviewPosition} uiManager={uiManager}>
148
+ {@render overviewPanelContent()}
149
+ </OverviewPanel>
150
+ {/if}
151
+ </div>
168
152
 
169
- {#if uiManager.isMobileView && config.playerBuffer && config.playerBuffer.loaded.length > 1 && !everTouched}
170
- <SwipeIndicator locale={config.settings.locale} />
171
- {/if}
172
- </div>
173
- {/snippet}
174
- </PlayerSlider>
175
- </div>
176
- <ControlsAndAttachments config={config} />
177
- {:else}
178
- <Loading positionFixedCenter={true} timeout={1000} />
179
- {/if}
180
- </div>
181
- {#if config.mediaCenterMobileFooter}
182
- {@render config.mediaCenterMobileFooter()}
153
+ <ControlsAndAttachments config={config} />
154
+ {:else}
155
+ <Loading positionFixedCenter={true} timeout={1000} />
183
156
  {/if}
184
157
  </div>
185
158
 
@@ -194,40 +167,6 @@ const styles = $derived.by(() => {
194
167
  opacity: 1;
195
168
  }
196
169
  }
197
- .content-player-container {
198
- --_content-player-container--background: var(--content-player-container--background);
199
- --content-player--elements-opacity: 1;
200
- width: 100%;
201
- min-width: 100%;
202
- max-width: 100%;
203
- height: 100%;
204
- min-height: 100%;
205
- max-height: 100%;
206
- container-type: inline-size;
207
- display: flex;
208
- flex-direction: column;
209
- position: relative;
210
- }
211
- .content-player-container:before {
212
- content: "";
213
- position: absolute;
214
- inset: 0;
215
- backdrop-filter: blur(30px);
216
- background-color: var(--_content-player-container--background);
217
- }
218
- .content-player-container--background-enabled {
219
- background-color: #c1c1c1;
220
- background-image: var(--_content-player--background-image-url);
221
- background-size: cover;
222
- background-blend-mode: multiply;
223
- }
224
- .content-player-container--background-loading {
225
- background-color: transparent;
226
- }
227
- .content-player-container--faded {
228
- --content-player--elements-opacity: 0;
229
- }
230
-
231
170
  .content-player {
232
171
  display: flex;
233
172
  flex: 1;
@@ -252,17 +191,13 @@ const styles = $derived.by(() => {
252
191
  .content-player__watermark {
253
192
  position: absolute;
254
193
  bottom: 5rem;
255
- left: var(--_content-player--watermark--left-indent);
256
- opacity: var(--content-player--elements-opacity);
257
- transition: opacity 0.3s ease-in-out;
194
+ left: 4.375rem;
258
195
  }
259
196
  .content-player__content {
260
197
  width: var(--_content-player--content--width, 100%);
261
198
  height: var(--_content-player--content--height, 100%);
262
199
  margin: var(--_content-player--content--margin, 0);
263
200
  position: relative;
264
- opacity: var(--content-player--elements-opacity);
265
- transition: opacity 0.3s ease-in-out;
266
201
  display: flex;
267
202
  justify-content: center;
268
203
  align-items: center;
@@ -1,6 +1,6 @@
1
- import type { MediaCenterData } from '../media-center/model/types';
2
1
  import { type IPostModel, PostModel } from '../posts/model';
3
2
  import type { IPostSocialInteractionsHandler } from '../posts/social-interactions';
3
+ import type { ICloseOrchestrator } from '../ui/player/close-orchestrator';
4
4
  import type { IPlayerBuffer } from '../ui/player/providers';
5
5
  import type { PlayerSliderCallbacks } from '../ui/player/slider/types';
6
6
  import { ContentPlayerSettings } from './content-player-settings';
@@ -13,8 +13,8 @@ export declare class ContentPlayerConfig<T extends {
13
13
  readonly callbacks: ContentPlayerCallbacks | null;
14
14
  readonly playerSliderCallbacks: PlayerSliderCallbacks | undefined;
15
15
  readonly socialInteractionsHandler: IPostSocialInteractionsHandler | undefined;
16
+ readonly closeOrchestrator: ICloseOrchestrator;
16
17
  readonly uiManager: ContentPlayerUIManager;
17
- private _mediaCenterData;
18
18
  private _trackingParams;
19
19
  private _mappers;
20
20
  private mappedPostsCache;
@@ -22,14 +22,12 @@ export declare class ContentPlayerConfig<T extends {
22
22
  playerBuffer: IPlayerBuffer<T> | null;
23
23
  mappers: ContentPlayerMappers<T>;
24
24
  socialInteractionsHandler?: IPostSocialInteractionsHandler;
25
- mediaCenterData?: MediaCenterData;
26
25
  settings?: ContentPlayerSettings;
27
26
  callbacks?: ContentPlayerCallbacks;
28
27
  playerSliderCallbacks?: PlayerSliderCallbacks;
29
28
  trackingParams?: ContentPlayerTrackingParams | null;
29
+ closeOrchestrator: ICloseOrchestrator;
30
30
  });
31
- get mediaCenterHeader(): MediaCenterData['header'] | null;
32
- get mediaCenterMobileFooter(): MediaCenterData['mobileFooter'] | null;
33
31
  get playerColors(): {
34
32
  brand: string | null;
35
33
  button: string | null;
@@ -41,21 +39,16 @@ export declare class ContentPlayerConfig<T extends {
41
39
  salePrice: string | null;
42
40
  sidebarBackground: string | null;
43
41
  };
44
- get mediaCenterCallbacks(): MediaCenterData['callbacks'] | null;
45
- get fadeContent(): boolean;
46
42
  get trackingParams(): ContentPlayerConfig<T>['_trackingParams'];
47
43
  itemAsPostViewerModel: (item: T & {
48
44
  mediaIndex?: number;
49
45
  }) => PostModel | null;
50
- setBackgroundImageUrl: (imageUrl: string | null) => void;
51
- updateMediaCenterData: (data: MediaCenterData | undefined) => void;
52
46
  updateTrackingParams: (data: ContentPlayerTrackingParams | null) => void;
53
47
  }
54
48
  export type ContentPlayerMappers<T> = {
55
49
  postModelFromCurrentItem: (item: T) => IPostModel | null;
56
50
  };
57
51
  export type ContentPlayerCallbacks = {
58
- close?: () => void;
59
52
  videoProgress?: (playerItemId: string, postId: string, progress: number) => void;
60
53
  productClick?: (productId: string, postId: string) => void;
61
54
  productImpression?: (productId: string, postId: string) => void;
@@ -7,37 +7,25 @@ export class ContentPlayerConfig {
7
7
  callbacks;
8
8
  playerSliderCallbacks;
9
9
  socialInteractionsHandler;
10
+ closeOrchestrator;
10
11
  uiManager = new ContentPlayerUIManager();
11
- _mediaCenterData = $state.raw(null);
12
12
  _trackingParams = $state.raw(null);
13
13
  _mappers;
14
14
  mappedPostsCache = new Map();
15
15
  constructor(init) {
16
- const { playerBuffer, trackingParams, mappers, socialInteractionsHandler, mediaCenterData, settings, callbacks, playerSliderCallbacks } = init;
16
+ const { playerBuffer, trackingParams, mappers, socialInteractionsHandler, settings, callbacks, playerSliderCallbacks, closeOrchestrator } = init;
17
17
  this.playerBuffer = playerBuffer;
18
18
  this._trackingParams = trackingParams ?? null;
19
19
  this.settings = settings || new ContentPlayerSettings();
20
- this._mediaCenterData = mediaCenterData || null;
21
20
  this.callbacks = callbacks || null;
22
21
  this.playerSliderCallbacks = playerSliderCallbacks;
23
22
  this.socialInteractionsHandler = socialInteractionsHandler;
23
+ this.closeOrchestrator = closeOrchestrator;
24
24
  this._mappers = mappers;
25
25
  }
26
- get mediaCenterHeader() {
27
- return this._mediaCenterData?.header || null;
28
- }
29
- get mediaCenterMobileFooter() {
30
- return this._mediaCenterData?.mobileFooter || null;
31
- }
32
26
  get playerColors() {
33
27
  return this.settings.playerColors;
34
28
  }
35
- get mediaCenterCallbacks() {
36
- return this._mediaCenterData?.callbacks || null;
37
- }
38
- get fadeContent() {
39
- return this._mediaCenterData?.overlayIsActive || false;
40
- }
41
29
  get trackingParams() {
42
30
  return this._trackingParams;
43
31
  }
@@ -54,12 +42,6 @@ export class ContentPlayerConfig {
54
42
  this.mappedPostsCache.set(item.id, postModel);
55
43
  return postModel;
56
44
  };
57
- setBackgroundImageUrl = (imageUrl) => {
58
- this.uiManager.backgroundImageUrl = imageUrl;
59
- };
60
- updateMediaCenterData = (data) => {
61
- this._mediaCenterData = data ?? null;
62
- };
63
45
  updateTrackingParams = (data) => {
64
46
  this._trackingParams = data ?? null;
65
47
  };
@@ -1,26 +1,12 @@
1
1
  import type { Locale } from '../core/locale';
2
+ import type { PlayerColors } from '../ui/player/colors';
2
3
  export declare class ContentPlayerSettings {
3
- disableBackground: boolean;
4
- enableCloseButton: boolean;
5
4
  locale: Locale;
6
5
  showStreamsCloudWatermark: boolean;
7
- playerColors: NonNullable<IContentPlayerSettingsInitializer['playerColors']>;
8
- constructor(init?: IContentPlayerSettingsInitializer);
9
- }
10
- export interface IContentPlayerSettingsInitializer {
11
- disableBackground?: boolean;
12
- hideCloseButton?: boolean;
13
- locale?: Locale;
14
- showStreamsCloudWatermark?: boolean;
15
- playerColors?: {
16
- brand: string | null;
17
- button: string | null;
18
- buttonInactive: string | null;
19
- cardButton: string | null;
20
- cardBackground: string | null;
21
- playerBackground: string | null;
22
- price: string | null;
23
- salePrice: string | null;
24
- sidebarBackground: string | null;
25
- } | null;
6
+ playerColors: NonNullable<PlayerColors>;
7
+ constructor(init?: {
8
+ locale?: Locale;
9
+ showStreamsCloudWatermark?: boolean;
10
+ playerColors?: PlayerColors;
11
+ });
26
12
  }
@@ -1,6 +1,4 @@
1
1
  export class ContentPlayerSettings {
2
- disableBackground = false;
3
- enableCloseButton = true;
4
2
  locale = 'en';
5
3
  showStreamsCloudWatermark = false;
6
4
  playerColors = {
@@ -16,8 +14,6 @@ export class ContentPlayerSettings {
16
14
  };
17
15
  constructor(init) {
18
16
  if (init) {
19
- this.disableBackground = init.disableBackground ?? this.disableBackground;
20
- this.enableCloseButton = init.hideCloseButton !== undefined ? !init.hideCloseButton : this.enableCloseButton;
21
17
  this.locale = init.locale ?? this.locale;
22
18
  this.showStreamsCloudWatermark = init.showStreamsCloudWatermark ?? this.showStreamsCloudWatermark;
23
19
  this.playerColors = init?.playerColors ?? this.playerColors;
@@ -5,9 +5,11 @@ import { PlayerButton } from '../ui/player/button';
5
5
  import { ContentPlayerConfig } from './content-player-config.svelte';
6
6
  import IconChevronDown from '@fluentui/svg-icons/icons/chevron_down_28_regular.svg?raw';
7
7
  import IconChevronUp from '@fluentui/svg-icons/icons/chevron_up_28_regular.svg?raw';
8
+ import IconDismiss from '@fluentui/svg-icons/icons/dismiss_28_regular.svg?raw';
8
9
  let { config } = $props();
9
10
  const uiManager = config.uiManager;
10
11
  let attachmentsCollapsed = $state(false);
12
+ let closeButtonAreaHeight = $state(0);
11
13
  const currentItemPostContainer = $derived.by(() => {
12
14
  var _a;
13
15
  if (!((_a = config.playerBuffer) === null || _a === void 0 ? void 0 : _a.current)) {
@@ -30,9 +32,26 @@ const trackAttachmentsPanelSize = (node) => {
30
32
  }
31
33
  };
32
34
  };
35
+ const handleCloseButtonMounted = (node) => {
36
+ const resizeObserver = new ResizeObserver(([entry]) => {
37
+ const height = entry.target.getBoundingClientRect().height;
38
+ closeButtonAreaHeight = height;
39
+ });
40
+ resizeObserver.observe(node);
41
+ return {
42
+ destroy() {
43
+ resizeObserver.disconnect();
44
+ closeButtonAreaHeight = 0;
45
+ }
46
+ };
47
+ };
48
+ const showCloseButton = $derived.by(() => {
49
+ return config.closeOrchestrator.closeTriggerVisible && !config.closeOrchestrator.closeTriggerAttached;
50
+ });
33
51
  const variables = $derived.by(() => {
34
52
  const values = [
35
53
  `--_controls-and-attachments--attachments--max-width: ${uiManager.attachmentsMaxWidth}px`,
54
+ `--_controls-and-attachments--spacing-top: ${closeButtonAreaHeight}px`,
36
55
  `--_controls-and-attachments--width: ${uiManager.sidePanelsMaxWidth}px`
37
56
  ];
38
57
  return values.join(';');
@@ -100,6 +119,17 @@ const variables = $derived.by(() => {
100
119
  </div>
101
120
  {/if}
102
121
 
122
+ {#if showCloseButton}
123
+ <div class="close-button" use:handleCloseButtonMounted>
124
+ <PlayerButton
125
+ icon={IconDismiss}
126
+ zoom={0.8}
127
+ activeColor={config.playerColors.button ?? null}
128
+ inactiveColor={config.playerColors.buttonInactive ?? null}
129
+ on={{ click: config.closeOrchestrator.requestClose }} />
130
+ </div>
131
+ {/if}
132
+
103
133
  <style>@keyframes fadeIn {
104
134
  0% {
105
135
  opacity: 1;
@@ -119,7 +149,7 @@ const variables = $derived.by(() => {
119
149
  width: var(--_controls-and-attachments--width);
120
150
  display: flex;
121
151
  justify-content: space-between;
122
- padding: 0.625rem 0 1.875rem 0;
152
+ padding: calc(0.625rem + var(--_controls-and-attachments--spacing-top)) 0 1.875rem 0;
123
153
  pointer-events: none;
124
154
  }
125
155
  .controls-and-attachments__spacer {
@@ -135,8 +165,6 @@ const variables = $derived.by(() => {
135
165
  gap: 2.3125rem;
136
166
  justify-content: flex-end;
137
167
  align-items: center;
138
- opacity: var(--content-player--elements-opacity);
139
- transition: opacity 0.3s ease-in-out;
140
168
  }
141
169
  .controls-and-attachments__right {
142
170
  flex: 1;
@@ -151,8 +179,6 @@ const variables = $derived.by(() => {
151
179
  pointer-events: auto;
152
180
  overflow-x: hidden;
153
181
  overflow-y: auto;
154
- opacity: var(--content-player--elements-opacity);
155
- transition: opacity 0.3s ease-in-out;
156
182
  scrollbar-width: none;
157
183
  }
158
184
  .controls-and-attachments__navigation-buttons {
@@ -163,4 +189,12 @@ const variables = $derived.by(() => {
163
189
  }
164
190
  .controls-and-attachments__navigation-buttons--invisible {
165
191
  visibility: hidden;
192
+ }
193
+
194
+ .close-button {
195
+ position: absolute;
196
+ top: 0;
197
+ right: 0;
198
+ padding-block: 0.9375rem;
199
+ padding-right: 1.25rem;
166
200
  }</style>
@@ -1,10 +1,15 @@
1
1
  <script lang="ts">import { slideHorizontally } from '../core/transitions';
2
- let { config, contentFaded, uiManager, children } = $props();
2
+ let { config, uiManager, position, children } = $props();
3
3
  const handlePanelClick = (e) => {
4
4
  e.stopPropagation();
5
5
  };
6
6
  const styles = $derived.by(() => {
7
- const values = [`--overview-panel--width: ${uiManager.overviewMaxWidth}px`];
7
+ const values = [
8
+ `--overview-panel--width: ${uiManager.overviewMaxWidth}px`,
9
+ `--overview-panel--top: ${position.top}px`,
10
+ `--overview-panel--bottom: ${position.bottom}px`,
11
+ `--overview-panel--right: ${position.right}px`
12
+ ];
8
13
  if (config.playerColors.sidebarBackground) {
9
14
  values.push(`--overview-panel--background: ${config.playerColors.sidebarBackground}`);
10
15
  }
@@ -17,7 +22,7 @@ const styles = $derived.by(() => {
17
22
 
18
23
  <!--Double `if` for correct behavior of slideHorizontally-->
19
24
  {#if uiManager.viewInitialized}
20
- {#if !uiManager.overviewCollapsed && !contentFaded}
25
+ {#if !uiManager.overviewCollapsed}
21
26
  <div class="overview-panel" style={styles} transition:slideHorizontally|local onclick={handlePanelClick} onkeydown={() => {}} role="none">
22
27
  <div class="overview-panel__content" onclick={(e) => e.stopPropagation()} onkeydown={() => {}} role="none">
23
28
  {@render children()}
@@ -40,14 +45,17 @@ const styles = $derived.by(() => {
40
45
  .overview-panel {
41
46
  --_overview-panel--background: var(--overview-panel--background, #1c1c1c);
42
47
  --_overview-panel--width: var(--overview-panel--width);
48
+ --_overview-panel--top: var(--overview-panel--top);
49
+ --_overview-panel--bottom: var(--overview-panel--bottom);
50
+ --_overview-panel--right: var(--overview-panel--right);
43
51
  --brand-color: var(--overview-panel--brand-color);
44
52
  width: var(--_overview-panel--width);
45
53
  min-width: var(--_overview-panel--width);
46
54
  max-width: var(--_overview-panel--width);
47
55
  position: absolute;
48
- top: 0;
49
- right: calc(100% - 0.375rem);
50
- bottom: 0;
56
+ top: var(--_overview-panel--top);
57
+ right: var(--_overview-panel--right);
58
+ bottom: var(--_overview-panel--bottom);
51
59
  z-index: 0;
52
60
  border-radius: 0.5rem 0 0 0.5rem;
53
61
  background: var(--_overview-panel--background);
@@ -7,7 +7,11 @@ declare class __sveltets_Render<T extends {
7
7
  props(): {
8
8
  config: ContentPlayerConfig<T>;
9
9
  uiManager: ContentPlayerUIManager;
10
- contentFaded: boolean;
10
+ position: {
11
+ top: number;
12
+ bottom: number;
13
+ right: number;
14
+ };
11
15
  children: Snippet;
12
16
  };
13
17
  events(): {};
@@ -6,10 +6,8 @@ export declare class ContentPlayerUIManager {
6
6
  playerTotalWidth: number;
7
7
  contentViewWidth: number;
8
8
  readonly sidePanelsMaxWidth: number;
9
- readonly safeAreaSize = 70;
10
9
  readonly isMobileView: boolean;
11
10
  readonly viewInitialized: boolean;
12
- backgroundImageUrl: string | null;
13
11
  showPostOverlayAttachments: boolean;
14
12
  showPostOverlayControls: boolean;
15
13
  }
@@ -9,10 +9,8 @@ export class ContentPlayerUIManager {
9
9
  playerTotalWidth = $state(0);
10
10
  contentViewWidth = $state(0);
11
11
  sidePanelsMaxWidth = $derived.by(() => (this.playerTotalWidth - this.contentViewWidth) / 2);
12
- safeAreaSize = SAFE_AREA_SIZE;
13
12
  isMobileView = $derived.by(() => this.playerTotalWidth <= 576);
14
13
  viewInitialized = $derived.by(() => !!this.playerTotalWidth && !!this.contentViewWidth);
15
- backgroundImageUrl = $state(null);
16
14
  showPostOverlayAttachments = $derived.by(() => this.viewInitialized && this.attachmentsWidth < ATTACHMENTS_MAX_WIDTH + 10);
17
15
  showPostOverlayControls = $derived.by(() => this.viewInitialized && this.sidePanelsMaxWidth < SAFE_AREA_SIZE);
18
16
  }
@@ -1,10 +1,14 @@
1
1
  import type { IMediaCenterConfig } from './types';
2
2
  export declare class InternalMediaCenterConfig implements IMediaCenterConfig {
3
- private readonly mediaPageId;
4
3
  postsPlayer: IMediaCenterConfig['postsPlayer'];
5
4
  streamPlayer: IMediaCenterConfig['streamPlayer'];
6
5
  handlers: IMediaCenterConfig['handlers'];
7
- private graphql;
8
- constructor(mediaPageId: string, graphqlOrigin?: string, testingStuff?: boolean);
9
6
  getConfig: IMediaCenterConfig['getConfig'];
7
+ private graphql;
8
+ constructor(input: {
9
+ mediaPageId: string;
10
+ initiator?: string;
11
+ graphqlOrigin?: string;
12
+ testingStuff?: boolean;
13
+ });
10
14
  }