@streamscloud/embeddable 7.0.0 → 7.0.2-1759149696160

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 (133) hide show
  1. package/dist/ads/ad-card/cmp.ad-card.svelte +13 -12
  2. package/dist/ads/ad-card/cmp.ad-card.svelte.d.ts +2 -2
  3. package/dist/content-player/cmp.content-player.svelte +224 -0
  4. package/dist/content-player/cmp.content-player.svelte.d.ts +33 -0
  5. package/dist/content-player/content-player-config.svelte.d.ts +49 -0
  6. package/dist/content-player/content-player-config.svelte.js +43 -0
  7. package/dist/content-player/controls-and-attachments.svelte +275 -0
  8. package/dist/content-player/controls-and-attachments.svelte.d.ts +28 -0
  9. package/dist/content-player/fade-mixins.scss +12 -0
  10. package/dist/content-player/index.d.ts +2 -0
  11. package/dist/content-player/index.js +2 -0
  12. package/dist/content-player/overview-panel.svelte +85 -0
  13. package/dist/content-player/overview-panel.svelte.d.ts +10 -0
  14. package/dist/{streams/stream-player → content-player}/ui-manager.svelte.d.ts +10 -9
  15. package/dist/content-player/ui-manager.svelte.js +68 -0
  16. package/dist/index.d.ts +0 -1
  17. package/dist/index.js +0 -1
  18. package/dist/media-center/config/internal-media-center-config.js +2 -1
  19. package/dist/media-center/config/types.d.ts +1 -1
  20. package/dist/media-center/media-center/cmp.media-center.svelte +13 -9
  21. package/dist/media-center/media-center/overview.svelte +3 -2
  22. package/dist/media-center/media-center/short-video-resources-generator.d.ts +1 -1
  23. package/dist/media-center/model/types.d.ts +12 -0
  24. package/dist/posts/attachments/cmp.attachments.svelte +50 -0
  25. package/dist/{short-videos/short-video-viewer → posts/attachments}/cmp.attachments.svelte.d.ts +3 -3
  26. package/dist/posts/attachments/index.d.ts +1 -0
  27. package/dist/posts/attachments/index.js +1 -0
  28. package/dist/{short-videos/short-video-viewer/cmp.short-video-controls.svelte → posts/controls/cmp.controls.svelte} +21 -26
  29. package/dist/posts/controls/cmp.controls.svelte.d.ts +11 -0
  30. package/dist/posts/controls/index.d.ts +1 -0
  31. package/dist/posts/controls/index.js +1 -0
  32. package/dist/posts/index.d.ts +4 -0
  33. package/dist/posts/index.js +2 -0
  34. package/dist/posts/model/types.d.ts +13 -0
  35. package/dist/posts/model/types.js +1 -0
  36. package/dist/{short-videos/short-video-viewer/cmp.attachments-horizontal.svelte → posts/post-viewer/attachments-horizontal.svelte} +2 -3
  37. package/dist/posts/post-viewer/attachments-horizontal.svelte.d.ts +13 -0
  38. package/dist/posts/post-viewer/cmp.post-viewer.svelte +120 -0
  39. package/dist/{short-videos/short-video-viewer/cmp.short-video-viewer.svelte.d.ts → posts/post-viewer/cmp.post-viewer.svelte.d.ts} +3 -2
  40. package/dist/posts/post-viewer/heading.svelte +76 -0
  41. package/dist/posts/post-viewer/heading.svelte.d.ts +9 -0
  42. package/dist/posts/post-viewer/index.d.ts +4 -0
  43. package/dist/posts/post-viewer/index.js +3 -0
  44. package/dist/posts/post-viewer/mapper.d.ts +3 -0
  45. package/dist/{short-videos/short-video-viewer → posts/post-viewer}/mapper.js +33 -17
  46. package/dist/{short-videos/short-video-viewer → posts/post-viewer}/operations.generated.d.ts +2 -2
  47. package/dist/{short-videos/short-video-viewer → posts/post-viewer}/operations.generated.js +2 -2
  48. package/dist/{short-videos/short-video-viewer → posts/post-viewer}/operations.graphql +1 -1
  49. package/dist/posts/post-viewer/post-media.svelte +20 -0
  50. package/dist/posts/post-viewer/post-media.svelte.d.ts +12 -0
  51. package/dist/{short-videos/short-video-viewer/short-video-viewer-localization.d.ts → posts/post-viewer/post-viewer-localization.d.ts} +2 -3
  52. package/dist/{short-videos/short-video-viewer/short-video-viewer-localization.js → posts/post-viewer/post-viewer-localization.js} +3 -5
  53. package/dist/{short-videos/short-video-viewer → posts/post-viewer}/types.d.ts +24 -25
  54. package/dist/{short-videos/short-video-viewer → posts/post-viewer}/ui-manager.svelte.d.ts +5 -3
  55. package/dist/{short-videos/short-video-viewer → posts/post-viewer}/ui-manager.svelte.js +11 -4
  56. package/dist/posts/post-viewer/utils.d.ts +2 -0
  57. package/dist/posts/post-viewer/utils.js +13 -0
  58. package/dist/posts/social-interactions/index.d.ts +1 -0
  59. package/dist/posts/social-interactions/index.js +1 -0
  60. package/dist/posts/social-interactions/types.d.ts +9 -0
  61. package/dist/posts/social-interactions/types.js +1 -0
  62. package/dist/products/product-card/cmp.product-card.svelte +27 -8
  63. package/dist/products/product-card/cmp.product-card.svelte.d.ts +2 -1
  64. package/dist/short-videos/short-videos-player/cmp.short-videos-player.svelte +11 -17
  65. package/dist/short-videos/short-videos-player/cmp.short-videos-player.svelte.d.ts +1 -5
  66. package/dist/short-videos/short-videos-player/index.d.ts +20 -5
  67. package/dist/short-videos/short-videos-player/internal-short-video-analytics-handler.d.ts +1 -1
  68. package/dist/short-videos/short-videos-player/internal-short-video-analytics-handler.js +1 -1
  69. package/dist/short-videos/short-videos-player/internal-short-video-player-provider.d.ts +1 -1
  70. package/dist/short-videos/short-videos-player/mapper.js +2 -2
  71. package/dist/short-videos/short-videos-player/short-videos-player-view.svelte +50 -216
  72. package/dist/short-videos/short-videos-player/short-videos-player-view.svelte.d.ts +2 -9
  73. package/dist/short-videos/short-videos-player/types.d.ts +6 -7
  74. package/dist/streams/layout/element-views/cmp.short-video-stream-element.svelte +3 -3
  75. package/dist/streams/layout/models/index.d.ts +1 -1
  76. package/dist/streams/layout/models/index.js +1 -1
  77. package/dist/streams/layout/models/mapper.d.ts +2 -2
  78. package/dist/streams/layout/models/mapper.js +6 -6
  79. package/dist/streams/stream-player/index.d.ts +25 -4
  80. package/dist/streams/stream-player/internal-stream-analytics-handler.d.ts +2 -0
  81. package/dist/streams/stream-player/internal-stream-analytics-handler.js +2 -0
  82. package/dist/streams/stream-player/stream-overview.svelte +47 -122
  83. package/dist/streams/stream-player/stream-overview.svelte.d.ts +1 -4
  84. package/dist/streams/stream-player/stream-player-buffer.svelte.d.ts +1 -1
  85. package/dist/streams/stream-player/stream-player-localization.d.ts +1 -5
  86. package/dist/streams/stream-player/stream-player-localization.js +2 -10
  87. package/dist/streams/stream-player/stream-player-view.svelte +229 -0
  88. package/dist/streams/stream-player/stream-player-view.svelte.d.ts +8 -0
  89. package/dist/streams/stream-player/types.d.ts +4 -4
  90. package/dist/ui/{player → player-slider}/cmp.player-slider.svelte.d.ts +2 -10
  91. package/dist/ui/{player → player-slider}/types.d.ts +9 -0
  92. package/dist/ui/player-slider/types.js +1 -0
  93. package/package.json +1 -1
  94. package/dist/short-videos/short-video-viewer/cmp.attachments-horizontal.svelte.d.ts +0 -13
  95. package/dist/short-videos/short-video-viewer/cmp.attachments.svelte +0 -52
  96. package/dist/short-videos/short-video-viewer/cmp.short-video-controls.svelte.d.ts +0 -19
  97. package/dist/short-videos/short-video-viewer/cmp.short-video-heading.svelte +0 -89
  98. package/dist/short-videos/short-video-viewer/cmp.short-video-heading.svelte.d.ts +0 -9
  99. package/dist/short-videos/short-video-viewer/cmp.short-video-product-card.svelte +0 -26
  100. package/dist/short-videos/short-video-viewer/cmp.short-video-product-card.svelte.d.ts +0 -16
  101. package/dist/short-videos/short-video-viewer/cmp.short-video-viewer.svelte +0 -146
  102. package/dist/short-videos/short-video-viewer/index.d.ts +0 -5
  103. package/dist/short-videos/short-video-viewer/index.js +0 -4
  104. package/dist/short-videos/short-video-viewer/mapper.d.ts +0 -3
  105. package/dist/short-videos/short-video-viewer/short-video-attachments-localization.d.ts +0 -5
  106. package/dist/short-videos/short-video-viewer/short-video-attachments-localization.js +0 -7
  107. package/dist/short-videos/short-videos-player/controls.svelte +0 -261
  108. package/dist/short-videos/short-videos-player/controls.svelte.d.ts +0 -22
  109. package/dist/short-videos/short-videos-player/fade-mixins.scss +0 -12
  110. package/dist/short-videos/short-videos-player/short-videos-player-localization.d.ts +0 -7
  111. package/dist/short-videos/short-videos-player/short-videos-player-localization.js +0 -11
  112. package/dist/short-videos/short-videos-player/ui-manager.svelte.d.ts +0 -24
  113. package/dist/short-videos/short-videos-player/ui-manager.svelte.js +0 -47
  114. package/dist/streams/cmp.stream-product-card.svelte +0 -25
  115. package/dist/streams/cmp.stream-product-card.svelte.d.ts +0 -16
  116. package/dist/streams/stream-player/controls.svelte +0 -301
  117. package/dist/streams/stream-player/controls.svelte.d.ts +0 -20
  118. package/dist/streams/stream-player/fade-mixins.scss +0 -12
  119. package/dist/streams/stream-player/stream-player.svelte +0 -393
  120. package/dist/streams/stream-player/stream-player.svelte.d.ts +0 -16
  121. package/dist/streams/stream-player/ui-manager.svelte.js +0 -63
  122. /package/dist/{streams/stream-player → content-player}/button-mixins.scss +0 -0
  123. /package/dist/{ui/player → media-center/model}/types.js +0 -0
  124. /package/dist/{short-videos/short-video-viewer → posts/post-viewer}/types.js +0 -0
  125. /package/dist/ui/{player → player-slider}/cmp.player-slider.svelte +0 -0
  126. /package/dist/ui/{player → player-slider}/index.d.ts +0 -0
  127. /package/dist/ui/{player → player-slider}/index.js +0 -0
  128. /package/dist/ui/{player → player-slider}/player-buffer.svelte.d.ts +0 -0
  129. /package/dist/ui/{player → player-slider}/player-buffer.svelte.js +0 -0
  130. /package/dist/ui/{player → player-slider}/prevent-slider-scroll.d.ts +0 -0
  131. /package/dist/ui/{player → player-slider}/prevent-slider-scroll.js +0 -0
  132. /package/dist/ui/{player → player-slider}/wheel-gestures-adapter.d.ts +0 -0
  133. /package/dist/ui/{player → player-slider}/wheel-gestures-adapter.js +0 -0
@@ -2,28 +2,29 @@
2
2
  import { Button, ButtonSize } from '../../ui/button';
3
3
  import { Image } from '../../ui/image';
4
4
  import { LineClamp } from '../../ui/line-clamp';
5
- import { onMount } from 'svelte';
6
5
  let { ad, inert = false, on } = $props();
7
- let adElement;
8
- onMount(() => {
9
- if (adElement && (on === null || on === void 0 ? void 0 : on.impression)) {
6
+ const trackImpression = (node) => {
7
+ if (on === null || on === void 0 ? void 0 : on.impression) {
10
8
  const observer = new IntersectionObserver((entries) => {
11
9
  entries.forEach((entry) => {
10
+ var _a;
12
11
  if (entry.isIntersecting && entry.intersectionRatio >= 0.5) {
13
- on.impression(ad.id);
12
+ (_a = on.impression) === null || _a === void 0 ? void 0 : _a.call(on, ad.id);
14
13
  observer.unobserve(entry.target);
15
14
  }
16
15
  });
17
16
  }, { threshold: 0.5 });
18
- observer.observe(adElement);
19
- return () => {
20
- observer.disconnect();
17
+ observer.observe(node);
18
+ return {
19
+ destroy() {
20
+ observer.disconnect();
21
+ }
21
22
  };
22
23
  }
23
- });
24
+ };
24
25
  const handleAdClick = () => {
25
- if (on === null || on === void 0 ? void 0 : on.adClick) {
26
- on.adClick(ad.id);
26
+ if (on === null || on === void 0 ? void 0 : on.click) {
27
+ on.click(ad.id);
27
28
  }
28
29
  if (ad.ctaButton) {
29
30
  window.open(ad.ctaButton.url, '_blank');
@@ -31,7 +32,7 @@ const handleAdClick = () => {
31
32
  };
32
33
  </script>
33
34
 
34
- <div class="ad-card" inert={inert} bind:this={adElement}>
35
+ <div class="ad-card" inert={inert} use:trackImpression>
35
36
  <div class="ad-card__image">
36
37
  <Image src={ad.image} alt={ad.title} />
37
38
  </div>
@@ -3,8 +3,8 @@ type Props = {
3
3
  ad: AdCardModel;
4
4
  inert?: boolean;
5
5
  on?: {
6
- adClick?: (adId: string) => void;
7
- impression?: (adId: string) => void;
6
+ click?: (id: string) => void;
7
+ impression?: (id: string) => void;
8
8
  };
9
9
  };
10
10
  declare const Cmp: import("svelte").Component<Props, {}, "">;
@@ -0,0 +1,224 @@
1
+ <script lang="ts">var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { handleEsc } from '../core/document.event-handlers';
11
+ import { PostViewer } from '../posts/post-viewer';
12
+ import { Icon } from '../ui/icon';
13
+ import { Loading } from '../ui/loading';
14
+ import { PlayerSlider } from '../ui/player-slider';
15
+ import { SpotlightLayout } from '../ui/spotlight-layout';
16
+ import { SwipeIndicator } from '../ui/swipe-indicator';
17
+ import { default as ControlsAndAttachments } from './controls-and-attachments.svelte';
18
+ import { default as OverviewPanel } from './overview-panel.svelte';
19
+ import IconDismiss from '@fluentui/svg-icons/icons/dismiss_28_regular.svg?raw';
20
+ import { onMount, untrack } from 'svelte';
21
+ let { config, nonPostItemView, overviewPanelContent } = $props();
22
+ let everTouched = $state(false);
23
+ const uiManager = config.uiManager;
24
+ onMount(() => __awaiter(void 0, void 0, void 0, function* () {
25
+ uiManager.overviewCollapsed = window && window.innerWidth < window.innerHeight;
26
+ }));
27
+ $effect(() => {
28
+ var _a;
29
+ void ((_a = config.playerBuffer) === null || _a === void 0 ? void 0 : _a.current);
30
+ untrack(() => {
31
+ if (uiManager.viewInitialized && uiManager.isMobileView) {
32
+ uiManager.overviewCollapsed = true;
33
+ }
34
+ });
35
+ });
36
+ const handleDimensionsChanged = (dimensions) => {
37
+ uiManager.setDialogDimensions({
38
+ mainViewColumnWidth: dimensions.mainSceneWidth,
39
+ viewTotalWidth: dimensions.totalWidth
40
+ });
41
+ };
42
+ const handleMediaCenterHeaderMounted = (data) => {
43
+ uiManager.setMediaCenterHeaderHeight(data.height);
44
+ };
45
+ const handleContentAreaMounted = (node) => {
46
+ const markAsTouched = () => {
47
+ everTouched = true;
48
+ node.removeEventListener('touchstart', markAsTouched);
49
+ node.removeEventListener('wheel', markAsTouched);
50
+ node.removeEventListener('click', markAsTouched);
51
+ node.removeEventListener('keypress', markAsTouched);
52
+ };
53
+ node.addEventListener('touchstart', markAsTouched);
54
+ node.addEventListener('wheel', markAsTouched);
55
+ node.addEventListener('click', markAsTouched);
56
+ node.addEventListener('keypress', markAsTouched);
57
+ };
58
+ </script>
59
+
60
+ <svelte:document onkeydown={(e) => handleEsc(e, () => config.callbacks?.close?.())} />
61
+
62
+ <div
63
+ class="content-player-container"
64
+ class:content-player-container--background-enabled={!config.disableBackground}
65
+ class:content-player-container--background-loading={!config.disableBackground && !uiManager.backgroundImageUrl}
66
+ class:content-player-container--faded={config.fadeContent}
67
+ style={uiManager.globalCssVariables}>
68
+ {#if config.mediaCenterControlsPanel}
69
+ {#snippet closeButton()}
70
+ <button type="button" class="close-button" onclick={config.callbacks?.close}>
71
+ <Icon src={IconDismiss} />
72
+ </button>
73
+ {/snippet}
74
+ <div class="content-player-container__media-center">
75
+ {@render config.mediaCenterControlsPanel({
76
+ maxItemsWidth: Math.min(uiManager.mainViewColumnWidth * 1.4, uiManager.dialogTotalWidth),
77
+ onMounted: handleMediaCenterHeaderMounted,
78
+ closeButton: config.callbacks?.close && closeButton
79
+ })}
80
+ </div>
81
+ {/if}
82
+ <div class="content-player">
83
+ {#if config.showStreamsCloudWatermark}
84
+ <div class="content-player__watermark">
85
+ <a href="https://streamscloud.com/" tabindex="-1" aria-label="none">
86
+ <img src="https://embedabble-assets.streamscloud-cdn.com/watermark.svg" alt="StreamsCloud" />
87
+ </a>
88
+ </div>
89
+ {/if}
90
+ {#if config.playerBuffer}
91
+ <SpotlightLayout ratio={9 / 16} on={{ dimensionsChanged: handleDimensionsChanged }}>
92
+ <div class="content-player__content" use:handleContentAreaMounted>
93
+ <PlayerSlider buffer={config.playerBuffer} on={config.playerSliderCallbacks}>
94
+ {#snippet children({ item })}
95
+ {@const postModel = config.itemAsPostViewerModel(item)}
96
+ {#if postModel}
97
+ <PostViewer
98
+ model={postModel}
99
+ socialInteractionsHandler={config.socialInteractionsHandler}
100
+ showAttachments={config.uiManager.showPostOverlayAttachments}
101
+ showControls={config.uiManager.showPostOverlayControls}
102
+ autoplay="on-appearance"
103
+ locale={config.locale}
104
+ on={{
105
+ progress: (progress) => config.callbacks?.videoProgress?.(item.id, postModel.id, progress),
106
+ productClick: (productId) => config.callbacks?.productClick?.(productId, postModel.id),
107
+ productImpression: (productId) => config.callbacks?.productImpression?.(productId, postModel.id),
108
+ adClick: (adId) => config.callbacks?.adClick?.(adId, postModel.id),
109
+ adImpression: (adId) => config.callbacks?.adImpression?.(adId, postModel.id)
110
+ }} />
111
+ {:else if nonPostItemView}
112
+ {@render nonPostItemView({ item })}
113
+ {/if}
114
+ {/snippet}
115
+ </PlayerSlider>
116
+ {#if uiManager.isMobileView && config.playerBuffer.loaded.length > 1 && !everTouched}
117
+ <SwipeIndicator locale={config.locale} />
118
+ {/if}
119
+ </div>
120
+ </SpotlightLayout>
121
+ {#if overviewPanelContent}
122
+ <OverviewPanel contentFaded={config.fadeContent} uiManager={uiManager}>
123
+ {@render overviewPanelContent()}
124
+ </OverviewPanel>
125
+ {/if}
126
+ <ControlsAndAttachments config={config} />
127
+ {:else}
128
+ <Loading positionFixedCenter={true} timeout={1000} />
129
+ {/if}
130
+ </div>
131
+ </div>
132
+
133
+ <style>@keyframes fadeIn {
134
+ 0% {
135
+ opacity: 1;
136
+ }
137
+ 50% {
138
+ opacity: 0.4;
139
+ }
140
+ 100% {
141
+ opacity: 1;
142
+ }
143
+ }
144
+ .content-player-container {
145
+ --content-player--elements-opacity: 1;
146
+ width: 100%;
147
+ min-width: 100%;
148
+ max-width: 100%;
149
+ height: 100%;
150
+ min-height: 100%;
151
+ max-height: 100%;
152
+ container-type: inline-size;
153
+ display: flex;
154
+ position: relative;
155
+ }
156
+ .content-player-container--background-enabled {
157
+ background-color: #c1c1c1;
158
+ background-image: var(--content-player--background-image-url);
159
+ background-size: cover;
160
+ background-blend-mode: multiply;
161
+ }
162
+ .content-player-container--background-loading {
163
+ background-color: transparent;
164
+ }
165
+ .content-player-container--faded {
166
+ --content-player--elements-opacity: 0;
167
+ }
168
+ .content-player-container__media-center {
169
+ position: absolute;
170
+ top: 0;
171
+ left: var(--content-player--overview--width);
172
+ right: var(--content-player--overview--width);
173
+ z-index: 1;
174
+ }
175
+
176
+ .content-player {
177
+ display: flex;
178
+ flex: 1;
179
+ padding: var(--content-player--padding);
180
+ backdrop-filter: blur(30px);
181
+ position: relative;
182
+ /* Set 'container-type: inline-size;' to reference container*/
183
+ }
184
+ @container (width < 576px) {
185
+ .content-player {
186
+ padding: 0;
187
+ }
188
+ }
189
+ .content-player__watermark {
190
+ position: absolute;
191
+ bottom: 5rem;
192
+ left: calc(var(--content-player--overview--width) + 5rem);
193
+ opacity: var(--content-player--elements-opacity);
194
+ transition: opacity 0.3s ease-in-out;
195
+ }
196
+ .content-player__content {
197
+ width: 100%;
198
+ height: 100%;
199
+ opacity: var(--content-player--elements-opacity);
200
+ transition: opacity 0.3s ease-in-out;
201
+ }
202
+
203
+ .close-button {
204
+ width: 3rem;
205
+ min-width: 3rem;
206
+ max-width: 3rem;
207
+ height: 3rem;
208
+ min-height: 3rem;
209
+ max-height: 3rem;
210
+ background-color: rgba(0, 0, 0, 0.6);
211
+ border: 1px solid #1c1c1c;
212
+ border-radius: 50%;
213
+ text-align: center;
214
+ --icon--color: #ffffff;
215
+ --icon--size: 1.75rem;
216
+ }
217
+ .close-button:hover {
218
+ background-color: rgba(0, 0, 0, 0.9);
219
+ transition: background-color 0.5s;
220
+ }
221
+ .close-button:disabled {
222
+ opacity: 0.5;
223
+ cursor: default;
224
+ }</style>
@@ -0,0 +1,33 @@
1
+ import type { ContentPlayerConfig } from './content-player-config.svelte';
2
+ import { type Snippet } from 'svelte';
3
+ declare class __sveltets_Render<T extends {
4
+ id: string;
5
+ }> {
6
+ props(): {
7
+ config: ContentPlayerConfig<T>;
8
+ nonPostItemView?: Snippet<[{
9
+ item: T;
10
+ }]> | undefined;
11
+ overviewPanelContent?: Snippet;
12
+ };
13
+ events(): {};
14
+ slots(): {};
15
+ bindings(): "";
16
+ exports(): {};
17
+ }
18
+ interface $$IsomorphicComponent {
19
+ new <T extends {
20
+ id: string;
21
+ }>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
22
+ $$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
23
+ } & ReturnType<__sveltets_Render<T>['exports']>;
24
+ <T extends {
25
+ id: string;
26
+ }>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
27
+ z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
28
+ }
29
+ declare const Cmp: $$IsomorphicComponent;
30
+ type Cmp<T extends {
31
+ id: string;
32
+ }> = InstanceType<typeof Cmp<T>>;
33
+ export default Cmp;
@@ -0,0 +1,49 @@
1
+ import type { Locale } from '../core/locale';
2
+ import type { MediaCenterData } from '../media-center/model/types';
3
+ import type { IPostSocialInteractionsHandler } from '../posts';
4
+ import type { PostViewerModel } from '../posts/post-viewer';
5
+ import type { IPlayerBuffer } from '../ui/player-slider';
6
+ import type { PlayerSliderCallbacks } from '../ui/player-slider/types';
7
+ import { ContentPlayerUIManager } from './ui-manager.svelte';
8
+ export declare class ContentPlayerConfig<T extends {
9
+ id: string;
10
+ }> {
11
+ playerBuffer: IPlayerBuffer<T> | null;
12
+ readonly locale: Locale;
13
+ readonly disableBackground: boolean;
14
+ readonly showStreamsCloudWatermark: boolean;
15
+ readonly callbacks: ContentPlayerCallbacks | null;
16
+ readonly playerSliderCallbacks: PlayerSliderCallbacks<T> | undefined;
17
+ readonly socialInteractionsHandler: IPostSocialInteractionsHandler | undefined;
18
+ readonly uiManager: ContentPlayerUIManager;
19
+ private _mediaCenterData;
20
+ private _mappers;
21
+ constructor(init: {
22
+ playerBuffer: IPlayerBuffer<T> | null;
23
+ mappers: ContentPlayerMappers<T>;
24
+ disableBackground?: boolean;
25
+ locale?: Locale;
26
+ showStreamsCloudWatermark?: boolean;
27
+ socialInteractionsHandler?: IPostSocialInteractionsHandler;
28
+ mediaCenterData?: MediaCenterData;
29
+ callbacks?: ContentPlayerCallbacks;
30
+ playerSliderCallbacks?: PlayerSliderCallbacks<T>;
31
+ });
32
+ get mediaCenterControlsPanel(): MediaCenterData['controlsPanel'] | null;
33
+ get playerLogo(): string | null;
34
+ get fadeContent(): boolean;
35
+ itemAsPostViewerModel: (item: T) => PostViewerModel | null;
36
+ setBackgroundImageUrl: (imageUrl: string | null) => void;
37
+ updateMediaCenterData: (data: MediaCenterData | undefined) => void;
38
+ }
39
+ export type ContentPlayerMappers<T> = {
40
+ postModelFromCurrentItem: (item: T) => PostViewerModel | null;
41
+ };
42
+ export type ContentPlayerCallbacks = {
43
+ close?: () => void;
44
+ videoProgress?: (playerItemId: string, postId: string, progress: number) => void;
45
+ productClick?: (productId: string, postId: string) => void;
46
+ productImpression?: (productId: string, postId: string) => void;
47
+ adClick?: (adId: string, postId: string) => void;
48
+ adImpression?: (adId: string, postId: string) => void;
49
+ };
@@ -0,0 +1,43 @@
1
+ import { ContentPlayerUIManager } from './ui-manager.svelte';
2
+ export class ContentPlayerConfig {
3
+ playerBuffer = $state.raw(null);
4
+ locale;
5
+ disableBackground;
6
+ showStreamsCloudWatermark;
7
+ callbacks;
8
+ playerSliderCallbacks;
9
+ socialInteractionsHandler;
10
+ uiManager = new ContentPlayerUIManager();
11
+ _mediaCenterData = $state.raw(null);
12
+ _mappers;
13
+ constructor(init) {
14
+ const { disableBackground = false, locale = 'en', showStreamsCloudWatermark = false, playerBuffer, mappers, mediaCenterData, socialInteractionsHandler, callbacks, playerSliderCallbacks } = init;
15
+ this.playerBuffer = playerBuffer;
16
+ this.locale = locale;
17
+ this.disableBackground = disableBackground;
18
+ this.showStreamsCloudWatermark = showStreamsCloudWatermark;
19
+ this._mediaCenterData = mediaCenterData || null;
20
+ this.callbacks = callbacks || null;
21
+ this.playerSliderCallbacks = playerSliderCallbacks;
22
+ this.socialInteractionsHandler = socialInteractionsHandler;
23
+ this._mappers = mappers;
24
+ }
25
+ get mediaCenterControlsPanel() {
26
+ return this._mediaCenterData?.controlsPanel || null;
27
+ }
28
+ get playerLogo() {
29
+ return this._mediaCenterData?.playerLogo || null;
30
+ }
31
+ get fadeContent() {
32
+ return this._mediaCenterData?.overlayIsActive || false;
33
+ }
34
+ itemAsPostViewerModel = (item) => {
35
+ return this._mappers.postModelFromCurrentItem(item);
36
+ };
37
+ setBackgroundImageUrl = (imageUrl) => {
38
+ this.uiManager.setBackgroundImageUrl(imageUrl);
39
+ };
40
+ updateMediaCenterData = (data) => {
41
+ this._mediaCenterData = data ?? null;
42
+ };
43
+ }
@@ -0,0 +1,275 @@
1
+ <script lang="ts">import { slideHorizontally } from '../core/transitions';
2
+ import { PostControls } from '../posts';
3
+ import { PostAttachments } from '../posts/attachments';
4
+ import { Icon } from '../ui/icon';
5
+ import { ContentPlayerConfig } from './content-player-config.svelte';
6
+ import IconChevronDown from '@fluentui/svg-icons/icons/chevron_down_28_regular.svg?raw';
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';
9
+ let { config } = $props();
10
+ const uiManager = config.uiManager;
11
+ const currentItemPostContainer = $derived.by(() => {
12
+ var _a;
13
+ if (!((_a = config.playerBuffer) === null || _a === void 0 ? void 0 : _a.current)) {
14
+ return null;
15
+ }
16
+ return config.itemAsPostViewerModel(config.playerBuffer.current);
17
+ });
18
+ const changeShowAttachments = () => {
19
+ uiManager.showAttachments = !uiManager.showAttachments;
20
+ };
21
+ const trackAttachmentsPanelSize = (node) => {
22
+ const resizeObserver = new ResizeObserver(([entry]) => {
23
+ const width = entry.contentRect.width;
24
+ uiManager.setAttachmentsPanelWidth(width);
25
+ });
26
+ resizeObserver.observe(node);
27
+ return {
28
+ destroy() {
29
+ resizeObserver.unobserve(node);
30
+ }
31
+ };
32
+ };
33
+ const trackNavigationButtonsSize = (node) => {
34
+ const resizeObserver = new ResizeObserver(([entry]) => {
35
+ const width = entry.contentRect.width;
36
+ uiManager.setNavigationButtonsBlockWidth(width);
37
+ });
38
+ resizeObserver.observe(node);
39
+ return {
40
+ destroy() {
41
+ resizeObserver.unobserve(node);
42
+ }
43
+ };
44
+ };
45
+ </script>
46
+
47
+ {#if uiManager.viewInitialized && (!uiManager.showPostOverlayAttachments || !uiManager.showPostOverlayControls)}
48
+ <div class="controls-and-attachments" class:controls-and-attachments--with-logo={!!config.playerLogo}>
49
+ {#if !uiManager.showPostOverlayControls}
50
+ <div class="controls-and-attachments__left">
51
+ {#if currentItemPostContainer}
52
+ <div class="controls-and-attachments__short-video-controls">
53
+ <PostControls
54
+ model={currentItemPostContainer}
55
+ socialInteractionsHandler={config.socialInteractionsHandler}
56
+ on={{ attachmentsClicked: changeShowAttachments }} />
57
+ </div>
58
+ {/if}
59
+ {#if config.playerBuffer}
60
+ <div class="controls-and-attachments__navigation-buttons" use:trackNavigationButtonsSize>
61
+ <button type="button" class="navigation-button" disabled={!config.playerBuffer.canLoadPrevious} onclick={config.playerBuffer.loadPrevious}>
62
+ <span class="navigation-button__icon">
63
+ <Icon src={IconChevronUp} />
64
+ </span>
65
+ </button>
66
+ <button type="button" class="navigation-button" disabled={!config.playerBuffer.canLoadNext} onclick={config.playerBuffer.loadNext}>
67
+ <span class="navigation-button__icon">
68
+ <Icon src={IconChevronDown} />
69
+ </span>
70
+ </button>
71
+ </div>
72
+ {/if}
73
+ </div>
74
+ {/if}
75
+ <div class="controls-and-attachments__right" use:trackAttachmentsPanelSize>
76
+ {#if !uiManager.showPostOverlayAttachments}
77
+ {#if config.playerLogo}
78
+ <div class="controls-and-attachments__player-logo">
79
+ <img src={config.playerLogo} class="controls-and-attachments__logo-img" alt="Player Logo" />
80
+ </div>
81
+ {/if}
82
+ {#if currentItemPostContainer && uiManager.showAttachments && (currentItemPostContainer.products.length || currentItemPostContainer.ads.length)}
83
+ <div class="controls-and-attachments__short-video-attachments" transition:slideHorizontally|local>
84
+ <PostAttachments
85
+ container={currentItemPostContainer}
86
+ locale={config.locale}
87
+ on={{
88
+ productClick: (id) => config.callbacks?.productClick?.(id, currentItemPostContainer.id),
89
+ productImpression: (id) => config.callbacks?.productImpression?.(id, currentItemPostContainer.id),
90
+ adClick: (id) => config.callbacks?.adClick?.(id, currentItemPostContainer.id),
91
+ adImpression: (id) => config.callbacks?.adImpression?.(id, currentItemPostContainer.id)
92
+ }} />
93
+ </div>
94
+ {/if}
95
+ {/if}
96
+ </div>
97
+ </div>
98
+ {/if}
99
+
100
+ {#if !config.mediaCenterControlsPanel && config.callbacks?.close}
101
+ <button type="button" class="close-button" onclick={config.callbacks.close}>
102
+ <Icon src={IconDismiss} />
103
+ </button>
104
+ {/if}
105
+
106
+ <style>@keyframes fadeIn {
107
+ 0% {
108
+ opacity: 1;
109
+ }
110
+ 50% {
111
+ opacity: 0.4;
112
+ }
113
+ 100% {
114
+ opacity: 1;
115
+ }
116
+ }
117
+ .controls-and-attachments {
118
+ position: absolute;
119
+ top: 0;
120
+ right: 0;
121
+ height: 100%;
122
+ width: var(--content-player--controls--available-space);
123
+ display: flex;
124
+ justify-content: space-between;
125
+ padding: var(--content-player--controls--padding);
126
+ container-type: inline-size;
127
+ }
128
+ .controls-and-attachments--with-logo {
129
+ padding-top: 0;
130
+ }
131
+ .controls-and-attachments__left {
132
+ display: flex;
133
+ flex-direction: column;
134
+ gap: 2.3125rem;
135
+ justify-content: flex-end;
136
+ align-items: center;
137
+ opacity: var(--content-player--elements-opacity);
138
+ transition: opacity 0.3s ease-in-out;
139
+ }
140
+ .controls-and-attachments__right {
141
+ flex: 1;
142
+ display: flex;
143
+ justify-content: space-between;
144
+ align-items: flex-end;
145
+ flex-direction: column;
146
+ overflow-x: hidden;
147
+ overflow-y: auto;
148
+ scrollbar-color: transparent transparent;
149
+ scrollbar-width: thin;
150
+ scrollbar-gutter: stable;
151
+ }
152
+ .controls-and-attachments__right::-webkit-scrollbar {
153
+ width: 3px;
154
+ height: 3px;
155
+ background: transparent;
156
+ }
157
+ .controls-and-attachments__right::-webkit-scrollbar-thumb {
158
+ background: transparent;
159
+ }
160
+ .controls-and-attachments__right:hover {
161
+ scrollbar-color: var(--custom-scrollbar-color, #7d7d7d) var(--custom-scrollbar-background, transparent);
162
+ scrollbar-width: thin;
163
+ }
164
+ .controls-and-attachments__right:hover::-webkit-scrollbar {
165
+ width: 3px;
166
+ height: 3px;
167
+ background: var(--custom-scrollbar-background, transparent);
168
+ }
169
+ .controls-and-attachments__right:hover::-webkit-scrollbar-thumb {
170
+ background: var(--custom-scrollbar-color, #7d7d7d);
171
+ }
172
+ .controls-and-attachments__short-video-controls {
173
+ gap: 2.5rem;
174
+ display: flex;
175
+ flex: 1;
176
+ min-height: 0;
177
+ flex-direction: column;
178
+ align-items: flex-start;
179
+ justify-content: flex-end;
180
+ --short-video-controls--icon--size: 1.75rem;
181
+ }
182
+ .controls-and-attachments__player-logo {
183
+ width: var(--content-player--controls--logo--max-width);
184
+ max-width: var(--content-player--controls--logo--max-width);
185
+ height: var(--content-player--controls--logo--height);
186
+ min-height: var(--content-player--controls--logo--height);
187
+ max-height: var(--content-player--controls--logo--height);
188
+ display: flex;
189
+ justify-content: center;
190
+ align-items: center;
191
+ }
192
+ .controls-and-attachments__logo-img {
193
+ width: 6.25rem;
194
+ min-width: 6.25rem;
195
+ max-width: 6.25rem;
196
+ }
197
+ .controls-and-attachments__short-video-attachments {
198
+ flex: 1;
199
+ width: var(--content-player--controls--attachments--max-width);
200
+ max-width: var(--content-player--controls--attachments--max-width);
201
+ opacity: var(--content-player--elements-opacity);
202
+ transition: opacity 0.3s ease-in-out;
203
+ }
204
+ .controls-and-attachments__navigation-buttons {
205
+ display: flex;
206
+ flex-direction: column;
207
+ gap: 1rem;
208
+ z-index: 1;
209
+ }
210
+
211
+ .close-button {
212
+ width: 3rem;
213
+ min-width: 3rem;
214
+ max-width: 3rem;
215
+ height: 3rem;
216
+ min-height: 3rem;
217
+ max-height: 3rem;
218
+ background-color: rgba(0, 0, 0, 0.6);
219
+ border: 1px solid #1c1c1c;
220
+ border-radius: 50%;
221
+ text-align: center;
222
+ --icon--color: #ffffff;
223
+ --icon--size: 1.75rem;
224
+ position: absolute;
225
+ top: 0.9375rem;
226
+ left: calc(var(--content-player--controls--close-button--left) + 0.625rem);
227
+ z-index: 1;
228
+ /* Set 'container-type: inline-size;' to reference container*/
229
+ }
230
+ .close-button:hover {
231
+ background-color: rgba(0, 0, 0, 0.9);
232
+ transition: background-color 0.5s;
233
+ }
234
+ .close-button:disabled {
235
+ opacity: 0.5;
236
+ cursor: default;
237
+ }
238
+ @container (width < 576px) {
239
+ .close-button {
240
+ left: unset;
241
+ right: 0.625rem;
242
+ }
243
+ }
244
+
245
+ .navigation-button {
246
+ --_icon-scale: 1;
247
+ width: 3rem;
248
+ min-width: 3rem;
249
+ max-width: 3rem;
250
+ height: 3rem;
251
+ min-height: 3rem;
252
+ max-height: 3rem;
253
+ background-color: rgba(0, 0, 0, 0.6);
254
+ border: 1px solid #1c1c1c;
255
+ border-radius: 50%;
256
+ text-align: center;
257
+ --icon--color: #ffffff;
258
+ --icon--size: 1.75rem;
259
+ }
260
+ .navigation-button:hover {
261
+ background-color: rgba(0, 0, 0, 0.9);
262
+ transition: background-color 0.5s;
263
+ }
264
+ .navigation-button:disabled {
265
+ opacity: 0.5;
266
+ cursor: default;
267
+ }
268
+ .navigation-button:hover:not(:disabled) {
269
+ --_icon-scale: 1.2;
270
+ }
271
+ .navigation-button__icon {
272
+ display: block;
273
+ transform: scale(var(--_icon-scale));
274
+ transition: 0.3s;
275
+ }</style>