@streamscloud/embeddable 7.2.0-1759186013783 → 7.3.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.
@@ -95,7 +95,12 @@ const handleContentPlayerMounted = (node) => {
95
95
  };
96
96
  </script>
97
97
 
98
- <svelte:document onkeydown={(e) => handleEsc(e, () => config.callbacks?.close?.())} />
98
+ <svelte:document
99
+ onkeydown={(e) => {
100
+ if (config.enableCloseButton) {
101
+ handleEsc(e, () => config.callbacks?.close?.());
102
+ }
103
+ }} />
99
104
 
100
105
  <div
101
106
  class="content-player-container"
@@ -113,7 +118,7 @@ const handleContentPlayerMounted = (node) => {
113
118
  {@render config.mediaCenterControlsPanel({
114
119
  maxItemsWidth: Math.min(uiManager.contentViewWidth * 1.4, uiManager.playerTotalWidth),
115
120
  onMounted: handleMediaCenterHeaderMounted,
116
- closeButton: config.callbacks?.close && closeButton
121
+ closeButton: config.enableCloseButton && config.callbacks?.close ? closeButton : undefined
117
122
  })}
118
123
  </div>
119
124
  {/if}
@@ -11,6 +11,7 @@ export declare class ContentPlayerConfig<T extends {
11
11
  playerBuffer: IPlayerBuffer<T> | null;
12
12
  readonly locale: Locale;
13
13
  readonly disableBackground: boolean;
14
+ readonly enableCloseButton: boolean;
14
15
  readonly showStreamsCloudWatermark: boolean;
15
16
  readonly callbacks: ContentPlayerCallbacks | null;
16
17
  readonly playerSliderCallbacks: PlayerSliderCallbacks<T> | undefined;
@@ -22,6 +23,7 @@ export declare class ContentPlayerConfig<T extends {
22
23
  playerBuffer: IPlayerBuffer<T> | null;
23
24
  mappers: ContentPlayerMappers<T>;
24
25
  disableBackground?: boolean;
26
+ enableCloseButton?: boolean;
25
27
  locale?: Locale;
26
28
  showStreamsCloudWatermark?: boolean;
27
29
  socialInteractionsHandler?: IPostSocialInteractionsHandler;
@@ -3,6 +3,7 @@ export class ContentPlayerConfig {
3
3
  playerBuffer = $state.raw(null);
4
4
  locale;
5
5
  disableBackground;
6
+ enableCloseButton;
6
7
  showStreamsCloudWatermark;
7
8
  callbacks;
8
9
  playerSliderCallbacks;
@@ -11,11 +12,12 @@ export class ContentPlayerConfig {
11
12
  _mediaCenterData = $state.raw(null);
12
13
  _mappers;
13
14
  constructor(init) {
14
- const { disableBackground = false, locale = 'en', showStreamsCloudWatermark = false, playerBuffer, mappers, mediaCenterData, socialInteractionsHandler, callbacks, playerSliderCallbacks } = init;
15
+ const { playerBuffer, mappers, disableBackground = false, enableCloseButton = true, locale = 'en', showStreamsCloudWatermark = false, mediaCenterData, socialInteractionsHandler, callbacks, playerSliderCallbacks } = init;
15
16
  this.playerBuffer = playerBuffer;
16
17
  this.locale = locale;
17
18
  this.disableBackground = disableBackground;
18
19
  this.showStreamsCloudWatermark = showStreamsCloudWatermark;
20
+ this.enableCloseButton = enableCloseButton;
19
21
  this._mediaCenterData = mediaCenterData || null;
20
22
  this.callbacks = callbacks || null;
21
23
  this.playerSliderCallbacks = playerSliderCallbacks;
@@ -97,7 +97,7 @@ const trackNavigationButtonsSize = (node) => {
97
97
  </div>
98
98
  {/if}
99
99
 
100
- {#if !config.mediaCenterControlsPanel && config.callbacks?.close}
100
+ {#if !config.mediaCenterControlsPanel && config.enableCloseButton && config.callbacks?.close}
101
101
  <button type="button" class="close-button" onclick={config.callbacks.close}>
102
102
  <Icon src={IconDismiss} />
103
103
  </button>
@@ -145,29 +145,31 @@ const trackNavigationButtonsSize = (node) => {
145
145
  flex-direction: column;
146
146
  overflow-x: hidden;
147
147
  overflow-y: auto;
148
- scrollbar-color: transparent transparent;
149
- scrollbar-width: thin;
150
148
  scrollbar-gutter: stable;
149
+ --_cross-browser-scrollbar--thumb-color: transparent;
150
+ --_cross-browser-scrollbar--track-color: transparent;
151
+ }
152
+ .controls-and-attachments__right:hover {
153
+ --_cross-browser-scrollbar--thumb-color: var(--scrollbar--thumb-color, #7d7d7d);
154
+ --_cross-browser-scrollbar--track-color: var(--scrollbar--track-color, transparent);
151
155
  }
152
156
  .controls-and-attachments__right::-webkit-scrollbar {
153
- width: 3px;
154
- height: 3px;
155
- background: transparent;
157
+ width: 6px;
158
+ height: 6px;
156
159
  }
157
- .controls-and-attachments__right::-webkit-scrollbar-thumb {
158
- background: transparent;
160
+ .controls-and-attachments__right::-webkit-scrollbar-track {
161
+ background: var(--_cross-browser-scrollbar--track-color);
162
+ border-radius: 100vw;
159
163
  }
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);
164
+ .controls-and-attachments__right::-webkit-scrollbar-thumb {
165
+ background: var(--_cross-browser-scrollbar--thumb-color);
166
+ border-radius: 100vw;
168
167
  }
169
- .controls-and-attachments__right:hover::-webkit-scrollbar-thumb {
170
- background: var(--custom-scrollbar-color, #7d7d7d);
168
+ @supports (scrollbar-color: transparent transparent) {
169
+ .controls-and-attachments__right {
170
+ scrollbar-color: var(--_cross-browser-scrollbar--thumb-color) var(--_cross-browser-scrollbar--track-color);
171
+ scrollbar-width: thin;
172
+ }
171
173
  }
172
174
  .controls-and-attachments__post-controls {
173
175
  gap: 2.5rem;
@@ -0,0 +1,19 @@
1
+ import type { IShortVideoAnalyticsHandler } from '../../short-videos/short-videos-player/types';
2
+ import type { IStreamAnalyticsHandler } from '../../streams/stream-player/types';
3
+ export declare class InternalMediaCenterAnalyticsHandler implements IShortVideoAnalyticsHandler, IStreamAnalyticsHandler {
4
+ constructor(graphqlOrigin: string | undefined);
5
+ setOrganizationId: (organizationId: string) => void;
6
+ trackStreamView: (streamId: string) => void;
7
+ trackStreamPageView: (pageId: string, streamId: string) => void;
8
+ trackStreamEngagementTime: (streamId: string, engagementTime: number) => void;
9
+ trackStreamScrollDepth: (streamId: string, scrollDepth: number) => void;
10
+ trackStreamProductImpression: (productId: string, streamId: string) => void;
11
+ trackStreamProductClicked: (productId: string, streamId: string) => void;
12
+ reportPageVideoViews: (videoId: string, streamId: string) => void;
13
+ trackShortVideoView: (videoId: string) => void;
14
+ trackShortVideoProductImpression: (productId: string, videoId: string) => void;
15
+ trackShortVideoProductClick: (productId: string, videoId: string) => void;
16
+ trackShortVideoProgress: (pageId: string, videoId: string, progress: number, streamId: string) => void;
17
+ trackAdClick: (adId: string) => void;
18
+ trackAdImpression: (adId: string) => void;
19
+ }
@@ -0,0 +1,23 @@
1
+ import { getOrCreateProfileId } from '../../core/analytics.profile-id';
2
+ import { constructGraphQLUrl } from '../../core/graphql';
3
+ import { AppEventsTracker } from '@streamscloud/streams-analytics-collector';
4
+ export class InternalMediaCenterAnalyticsHandler {
5
+ constructor(graphqlOrigin) {
6
+ AppEventsTracker.setEndpoint(constructGraphQLUrl(graphqlOrigin));
7
+ AppEventsTracker.setProfileId(getOrCreateProfileId());
8
+ }
9
+ setOrganizationId = (organizationId) => AppEventsTracker.setOrganizationId(organizationId);
10
+ trackStreamView = (streamId) => AppEventsTracker.trackStreamView(streamId);
11
+ trackStreamPageView = (pageId, streamId) => AppEventsTracker.trackStreamPageView(pageId, streamId);
12
+ trackStreamEngagementTime = (streamId, engagementTime) => AppEventsTracker.trackStreamEngagementTime(streamId, engagementTime);
13
+ trackStreamScrollDepth = (streamId, scrollDepth) => AppEventsTracker.trackStreamScrollDepth(streamId, scrollDepth);
14
+ trackStreamProductImpression = (productId, streamId) => AppEventsTracker.trackStreamProductImpression(productId, streamId);
15
+ trackStreamProductClicked = (productId, streamId) => AppEventsTracker.trackStreamProductClicked(productId, streamId);
16
+ reportPageVideoViews = (videoId, streamId) => AppEventsTracker.reportPageVideoViews(videoId, streamId);
17
+ trackShortVideoView = (videoId) => AppEventsTracker.trackShortVideoView(videoId);
18
+ trackShortVideoProductImpression = (productId, videoId) => AppEventsTracker.trackShortVideoProductImpression(productId, videoId);
19
+ trackShortVideoProductClick = (productId, videoId) => AppEventsTracker.trackShortVideoProductClick(productId, videoId);
20
+ trackShortVideoProgress = (pageId, videoId, progress, streamId) => AppEventsTracker.trackShortVideoProgress(pageId, videoId, progress, streamId);
21
+ trackAdClick = (adId) => AppEventsTracker.trackAdClick(adId);
22
+ trackAdImpression = (adId) => AppEventsTracker.trackAdImpression(adId);
23
+ }
@@ -3,6 +3,7 @@ export declare class InternalMediaCenterConfig implements IMediaCenterConfig {
3
3
  private readonly mediaPageId;
4
4
  shortVideosPlayer: IMediaCenterConfig['shortVideosPlayer'];
5
5
  streamPlayer: IMediaCenterConfig['streamPlayer'];
6
+ handlers: IMediaCenterConfig['handlers'];
6
7
  private graphql;
7
8
  constructor(mediaPageId: string, graphqlOrigin?: string);
8
9
  getSettings: IMediaCenterConfig['getSettings'];
@@ -1,14 +1,14 @@
1
1
  import { PostType, Status, StreamStatus } from '../../core/enums';
2
2
  import { createLocalGQLClient } from '../../core/graphql';
3
- import { InternalShortVideoAnalyticsHandler } from '../../short-videos/short-videos-player/internal-short-video-analytics-handler';
4
3
  import { mapToShortVideoPlayerModel } from '../../short-videos/short-videos-player/mapper';
5
- import { InternalStreamAnalyticsHandler } from '../../streams/stream-player/internal-stream-analytics-handler';
6
4
  import { InternalStreamPlayerDataProvider } from '../../streams/stream-player/internal-stream-player-data-provider';
5
+ import { InternalMediaCenterAnalyticsHandler } from './internal-media-center-analytics-handler';
7
6
  import { GetMediaPageSettingsDocument, GetShortVideosDocument, GetStreamsDocument } from './operations.generated';
8
7
  export class InternalMediaCenterConfig {
9
8
  mediaPageId;
10
9
  shortVideosPlayer;
11
10
  streamPlayer;
11
+ handlers;
12
12
  graphql;
13
13
  constructor(mediaPageId, graphqlOrigin) {
14
14
  this.mediaPageId = mediaPageId;
@@ -35,9 +35,7 @@ export class InternalMediaCenterConfig {
35
35
  items: posts.map(mapToShortVideoPlayerModel),
36
36
  continuationToken: payload.data?.shortVideos?.continuationToken || null
37
37
  };
38
- },
39
- socialInteractionsHandler: undefined,
40
- analyticsHandler: new InternalShortVideoAnalyticsHandler(graphqlOrigin)
38
+ }
41
39
  };
42
40
  this.streamPlayer = {
43
41
  getStreamsCursor: async ({ filter, limit, continuationToken }) => {
@@ -62,9 +60,10 @@ export class InternalMediaCenterConfig {
62
60
  continuationToken: payload.data?.streams?.continuationToken ?? null
63
61
  };
64
62
  },
65
- streamPlayerDataProvider: new InternalStreamPlayerDataProvider({ graphql: this.graphql }),
66
- socialInteractionsHandler: undefined,
67
- analyticsHandler: new InternalStreamAnalyticsHandler(graphqlOrigin)
63
+ streamPlayerDataProvider: new InternalStreamPlayerDataProvider({ graphql: this.graphql })
64
+ };
65
+ this.handlers = {
66
+ analyticsHandler: new InternalMediaCenterAnalyticsHandler(graphqlOrigin)
68
67
  };
69
68
  }
70
69
  getSettings = async () => {
@@ -3,6 +3,10 @@ import type { IShortVideoAnalyticsHandler, ShortVideoPlayerModel } from '../../s
3
3
  import type { IStreamPlayerDataProvider, IStreamAnalyticsHandler } from '../../streams/stream-player/types';
4
4
  export interface IMediaCenterConfig {
5
5
  getSettings: () => Promise<MediaCenterSettings | null>;
6
+ handlers?: {
7
+ analyticsHandler?: IShortVideoAnalyticsHandler & IStreamAnalyticsHandler;
8
+ socialInteractionsHandler?: IPostSocialInteractionsHandler;
9
+ };
6
10
  shortVideosPlayer: {
7
11
  getShortVideosCursor: (input: {
8
12
  filter: {
@@ -15,8 +19,6 @@ export interface IMediaCenterConfig {
15
19
  items: ShortVideoPlayerModel[];
16
20
  continuationToken: string | null;
17
21
  }>;
18
- socialInteractionsHandler?: IPostSocialInteractionsHandler;
19
- analyticsHandler?: IShortVideoAnalyticsHandler;
20
22
  };
21
23
  streamPlayer: {
22
24
  getStreamsCursor: (input: {
@@ -31,8 +33,6 @@ export interface IMediaCenterConfig {
31
33
  continuationToken: string | null;
32
34
  }>;
33
35
  streamPlayerDataProvider: IStreamPlayerDataProvider;
34
- socialInteractionsHandler?: IPostSocialInteractionsHandler;
35
- analyticsHandler?: IStreamAnalyticsHandler;
36
36
  };
37
37
  }
38
38
  export type MediaCenterSettings = {
@@ -27,6 +27,7 @@ let { config, playerProps, locale = 'en' } = $props();
27
27
  const localization = $derived(new MediaCenterLocalization(locale));
28
28
  const commonPlayerSettings = {
29
29
  disableBackground: playerProps.props.disableBackground,
30
+ enableCloseButton: playerProps.props.enableCloseButton,
30
31
  locale: playerProps.props.locale,
31
32
  showStreamsCloudWatermark: playerProps.props.showStreamsCloudWatermark,
32
33
  on: playerProps.props.on
@@ -69,7 +70,7 @@ onDestroy(() => {
69
70
  scrollResizeObserver === null || scrollResizeObserver === void 0 ? void 0 : scrollResizeObserver.disconnect();
70
71
  });
71
72
  const selectCategory = (categoryId) => __awaiter(void 0, void 0, void 0, function* () {
72
- var _a;
73
+ var _a, _b, _c;
73
74
  if (!config) {
74
75
  return;
75
76
  }
@@ -82,7 +83,7 @@ const selectCategory = (categoryId) => __awaiter(void 0, void 0, void 0, functio
82
83
  selectedCategoryId = categoryId;
83
84
  computedPlayerProps = {
84
85
  mode: MediaCenterMode.ShortVideos,
85
- props: Object.assign({ dataProvider: makeShortVideosProvider({ config, categoryId }), socialInteractionsHandler: config.shortVideosPlayer.socialInteractionsHandler, analyticsHandler: config.shortVideosPlayer.analyticsHandler }, commonPlayerSettings)
86
+ props: Object.assign({ dataProvider: makeShortVideosProvider({ config, categoryId }), socialInteractionsHandler: (_a = config.handlers) === null || _a === void 0 ? void 0 : _a.socialInteractionsHandler, analyticsHandler: (_b = config.handlers) === null || _b === void 0 ? void 0 : _b.analyticsHandler }, commonPlayerSettings)
86
87
  };
87
88
  overviewOpened = false;
88
89
  break;
@@ -102,12 +103,12 @@ const selectCategory = (categoryId) => __awaiter(void 0, void 0, void 0, functio
102
103
  streamsInCategoryData = {
103
104
  loading: false,
104
105
  data: {
105
- categoryName: ((_a = categories.find((c) => c.id === categoryId)) === null || _a === void 0 ? void 0 : _a.name) || '',
106
+ categoryName: ((_c = categories.find((c) => c.id === categoryId)) === null || _c === void 0 ? void 0 : _c.name) || '',
106
107
  streams: streamsResponse.items
107
108
  }
108
109
  };
109
110
  }
110
- catch (_b) {
111
+ catch (_d) {
111
112
  streamsInCategoryData = { loading: false, data: { categoryName: '', streams: [] } };
112
113
  }
113
114
  break;
@@ -116,26 +117,28 @@ const selectCategory = (categoryId) => __awaiter(void 0, void 0, void 0, functio
116
117
  }
117
118
  });
118
119
  const activateSelectedShortVideoPlayer = (shortVideo) => {
120
+ var _a, _b;
119
121
  if (!config) {
120
122
  return;
121
123
  }
122
124
  mediaCenterMode = MediaCenterMode.ShortVideos;
123
125
  computedPlayerProps = {
124
126
  mode: MediaCenterMode.ShortVideos,
125
- props: Object.assign({ dataProvider: makeShortVideosProvider({ config, prefetchedItems: [shortVideo] }), socialInteractionsHandler: config.shortVideosPlayer.socialInteractionsHandler, analyticsHandler: config.shortVideosPlayer.analyticsHandler }, commonPlayerSettings)
127
+ props: Object.assign({ dataProvider: makeShortVideosProvider({ config, prefetchedItems: [shortVideo] }), socialInteractionsHandler: (_a = config.handlers) === null || _a === void 0 ? void 0 : _a.socialInteractionsHandler, analyticsHandler: (_b = config.handlers) === null || _b === void 0 ? void 0 : _b.analyticsHandler }, commonPlayerSettings)
126
128
  };
127
129
  selectedCategoryId = null;
128
130
  overviewOpened = false;
129
131
  streamsInCategoryOpened = false;
130
132
  };
131
133
  const activateSelectedStreamPlayer = (id) => {
134
+ var _a, _b;
132
135
  if (!config) {
133
136
  return;
134
137
  }
135
138
  mediaCenterMode = MediaCenterMode.Stream;
136
139
  computedPlayerProps = {
137
140
  mode: MediaCenterMode.Stream,
138
- props: Object.assign({ streamId: id, dataProvider: config.streamPlayer.streamPlayerDataProvider, analyticsHandler: config.streamPlayer.analyticsHandler, postSocialInteractionsHandler: config.streamPlayer.socialInteractionsHandler }, commonPlayerSettings)
141
+ props: Object.assign({ streamId: id, dataProvider: config.streamPlayer.streamPlayerDataProvider, analyticsHandler: (_a = config.handlers) === null || _a === void 0 ? void 0 : _a.analyticsHandler, postSocialInteractionsHandler: (_b = config.handlers) === null || _b === void 0 ? void 0 : _b.socialInteractionsHandler }, commonPlayerSettings)
139
142
  };
140
143
  selectedCategoryId = null;
141
144
  overviewOpened = false;
@@ -362,21 +365,31 @@ const onScrollMounted = (node) => {
362
365
  min-width: 0;
363
366
  overflow-x: auto;
364
367
  overflow-y: hidden;
365
- scrollbar-color: var(--custom-scrollbar-color, #7d7d7d) var(--custom-scrollbar-background, transparent);
366
- scrollbar-width: none;
367
368
  display: flex;
368
369
  align-items: center;
369
370
  gap: 0.75rem;
370
371
  flex-wrap: nowrap;
371
372
  mask-image: none;
373
+ --_cross-browser-scrollbar--thumb-color: none;
374
+ --_cross-browser-scrollbar--track-color: var(--scrollbar--track-color, transparent);
372
375
  }
373
376
  .media-center__scroll::-webkit-scrollbar {
374
- width: 0;
375
- height: 0;
376
- background: var(--custom-scrollbar-background, transparent);
377
+ width: 6px;
378
+ height: 6px;
379
+ }
380
+ .media-center__scroll::-webkit-scrollbar-track {
381
+ background: var(--_cross-browser-scrollbar--track-color);
382
+ border-radius: 100vw;
377
383
  }
378
384
  .media-center__scroll::-webkit-scrollbar-thumb {
379
- background: var(--custom-scrollbar-color, #7d7d7d);
385
+ background: var(--_cross-browser-scrollbar--thumb-color);
386
+ border-radius: 100vw;
387
+ }
388
+ @supports (scrollbar-color: transparent transparent) {
389
+ .media-center__scroll {
390
+ scrollbar-color: var(--_cross-browser-scrollbar--thumb-color) var(--_cross-browser-scrollbar--track-color);
391
+ scrollbar-width: thin;
392
+ }
380
393
  }
381
394
  .media-center__scroll--has-left {
382
395
  mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0, rgb(0, 0, 0) 32px, rgb(0, 0, 0) 100%);
@@ -487,28 +500,30 @@ const onScrollMounted = (node) => {
487
500
  inset: 0;
488
501
  container-type: inline-size;
489
502
  overflow-y: auto;
490
- scrollbar-color: transparent transparent;
491
- scrollbar-width: thin;
503
+ --_cross-browser-scrollbar--thumb-color: transparent;
504
+ --_cross-browser-scrollbar--track-color: transparent;
492
505
  }
493
- .media-center-overview::-webkit-scrollbar {
494
- width: 3px;
495
- height: 3px;
496
- background: transparent;
506
+ .media-center-overview:hover {
507
+ --_cross-browser-scrollbar--thumb-color: var(--scrollbar--thumb-color, #7d7d7d);
508
+ --_cross-browser-scrollbar--track-color: var(--scrollbar--track-color, transparent);
497
509
  }
498
- .media-center-overview::-webkit-scrollbar-thumb {
499
- background: transparent;
510
+ .media-center-overview::-webkit-scrollbar {
511
+ width: 6px;
512
+ height: 6px;
500
513
  }
501
- .media-center-overview:hover {
502
- scrollbar-color: var(--custom-scrollbar-color, #7d7d7d) var(--custom-scrollbar-background, transparent);
503
- scrollbar-width: thin;
514
+ .media-center-overview::-webkit-scrollbar-track {
515
+ background: var(--_cross-browser-scrollbar--track-color);
516
+ border-radius: 100vw;
504
517
  }
505
- .media-center-overview:hover::-webkit-scrollbar {
506
- width: 3px;
507
- height: 3px;
508
- background: var(--custom-scrollbar-background, transparent);
518
+ .media-center-overview::-webkit-scrollbar-thumb {
519
+ background: var(--_cross-browser-scrollbar--thumb-color);
520
+ border-radius: 100vw;
509
521
  }
510
- .media-center-overview:hover::-webkit-scrollbar-thumb {
511
- background: var(--custom-scrollbar-color, #7d7d7d);
522
+ @supports (scrollbar-color: transparent transparent) {
523
+ .media-center-overview {
524
+ scrollbar-color: var(--_cross-browser-scrollbar--thumb-color) var(--_cross-browser-scrollbar--track-color);
525
+ scrollbar-width: thin;
526
+ }
512
527
  }
513
528
  @media (max-width: 576px) {
514
529
  .media-center-overview {
@@ -155,16 +155,26 @@ $effect(() => {
155
155
  justify-content: flex-start;
156
156
  overflow-x: auto;
157
157
  padding: 0 var(--post-viewer--attachments-horizontal--padding-horizontal);
158
- scrollbar-color: var(--custom-scrollbar-color, #7d7d7d) var(--custom-scrollbar-background, transparent);
159
- scrollbar-width: none;
158
+ --_cross-browser-scrollbar--thumb-color: none;
159
+ --_cross-browser-scrollbar--track-color: var(--scrollbar--track-color, transparent);
160
160
  }
161
161
  .attachments-horizontal::-webkit-scrollbar {
162
- width: 0;
163
- height: 0;
164
- background: var(--custom-scrollbar-background, transparent);
162
+ width: 6px;
163
+ height: 6px;
164
+ }
165
+ .attachments-horizontal::-webkit-scrollbar-track {
166
+ background: var(--_cross-browser-scrollbar--track-color);
167
+ border-radius: 100vw;
165
168
  }
166
169
  .attachments-horizontal::-webkit-scrollbar-thumb {
167
- background: var(--custom-scrollbar-color, #7d7d7d);
170
+ background: var(--_cross-browser-scrollbar--thumb-color);
171
+ border-radius: 100vw;
172
+ }
173
+ @supports (scrollbar-color: transparent transparent) {
174
+ .attachments-horizontal {
175
+ scrollbar-color: var(--_cross-browser-scrollbar--thumb-color) var(--_cross-browser-scrollbar--track-color);
176
+ scrollbar-width: thin;
177
+ }
168
178
  }
169
179
  .attachments-horizontal__item {
170
180
  position: relative;
@@ -95,6 +95,7 @@ export declare function openShortVideosPlayer(init: {
95
95
  analyticsHandler?: IShortVideoAnalyticsHandler;
96
96
  socialInteractionsHandler?: IPostSocialInteractionsHandler;
97
97
  disableBackground?: boolean;
98
+ hideCloseButton?: boolean;
98
99
  locale?: Locale;
99
100
  showStreamsCloudWatermark?: boolean;
100
101
  on?: {
@@ -109,6 +110,7 @@ export declare function openShortVideosPlayer(init: {
109
110
  initialId?: string;
110
111
  mediaPageId?: string;
111
112
  disableBackground?: boolean;
113
+ hideCloseButton?: boolean;
112
114
  locale?: Locale;
113
115
  showStreamsCloudWatermark?: boolean;
114
116
  on?: {
@@ -12,7 +12,7 @@ import { mount, unmount } from 'svelte';
12
12
  export { ShortVideosPlayer };
13
13
  export { mapToShortVideoPlayerModel };
14
14
  export function openShortVideosPlayer(init) {
15
- const { shortVideosProvider, ids, graphqlOrigin, initialId, initiator, socialInteractionsHandler, disableBackground, locale, showStreamsCloudWatermark } = init;
15
+ const { shortVideosProvider, ids, graphqlOrigin, initialId, initiator, socialInteractionsHandler, disableBackground, hideCloseButton, locale, showStreamsCloudWatermark, on } = init;
16
16
  let dataProvider = shortVideosProvider;
17
17
  if (!dataProvider && ids) {
18
18
  dataProvider = new InternalShortVideoPlayerProvider({ ids, graphqlOrigin, initialId, initiator });
@@ -41,6 +41,7 @@ export function openShortVideosPlayer(init) {
41
41
  dataProvider,
42
42
  socialInteractionsHandler,
43
43
  disableBackground,
44
+ enableCloseButton: !hideCloseButton,
44
45
  locale,
45
46
  showStreamsCloudWatermark,
46
47
  analyticsHandler,
@@ -48,15 +49,11 @@ export function openShortVideosPlayer(init) {
48
49
  playerClosed: async () => {
49
50
  await unmount(mounted);
50
51
  shadowHost.remove();
51
- if (init.on?.playerClosed) {
52
- init.on.playerClosed();
52
+ if (on?.playerClosed) {
53
+ on.playerClosed();
53
54
  }
54
55
  },
55
- videoActivated: (id) => {
56
- if (init.on?.videoActivated) {
57
- init.on.videoActivated(id);
58
- }
59
- }
56
+ videoActivated: on?.videoActivated
60
57
  }
61
58
  }
62
59
  }
@@ -13,7 +13,7 @@ import { getPostCoverImage } from '../../posts/post-viewer';
13
13
  import { PlayerBuffer } from '../../ui/player-slider';
14
14
  import { InternalShortVideoPlayerProvider } from './internal-short-video-player-provider';
15
15
  import { untrack } from 'svelte';
16
- let { dataProvider, socialInteractionsHandler, locale = 'en', showStreamsCloudWatermark, disableBackground, analyticsHandler, on, mediaCenterData } = $props();
16
+ let { dataProvider, socialInteractionsHandler, disableBackground, enableCloseButton, locale = 'en', showStreamsCloudWatermark, analyticsHandler, on, mediaCenterData } = $props();
17
17
  $effect(() => {
18
18
  void dataProvider;
19
19
  untrack(() => {
@@ -43,6 +43,7 @@ const contentPlayerConfig = new ContentPlayerConfig({
43
43
  postModelFromCurrentItem: (item) => item
44
44
  },
45
45
  disableBackground,
46
+ enableCloseButton,
46
47
  locale,
47
48
  showStreamsCloudWatermark,
48
49
  socialInteractionsHandler,
@@ -18,6 +18,7 @@ export type ShortVideoPlayerProps = {
18
18
  socialInteractionsHandler?: IPostSocialInteractionsHandler;
19
19
  analyticsHandler?: IShortVideoAnalyticsHandler;
20
20
  disableBackground?: boolean;
21
+ enableCloseButton?: boolean;
21
22
  locale?: Locale;
22
23
  showStreamsCloudWatermark?: boolean;
23
24
  on?: {
@@ -96,6 +96,7 @@ export declare function openStreamPlayer(init: {
96
96
  postSocialInteractionsHandler?: IPostSocialInteractionsHandler;
97
97
  analyticsHandler?: IStreamAnalyticsHandler;
98
98
  disableBackground?: boolean;
99
+ hideCloseButton?: boolean;
99
100
  locale?: Locale;
100
101
  showStreamsCloudWatermark?: boolean;
101
102
  on?: {
@@ -112,6 +113,7 @@ export declare function openStreamPlayer(init: {
112
113
  graphqlOrigin?: string;
113
114
  mediaPageId?: string;
114
115
  disableBackground?: boolean;
116
+ hideCloseButton?: boolean;
115
117
  locale?: Locale;
116
118
  showStreamsCloudWatermark?: boolean;
117
119
  on?: {
@@ -9,7 +9,7 @@ import { mapToStreamPlayerModel } from './mapper';
9
9
  import { mount, unmount } from 'svelte';
10
10
  export { mapToStreamPlayerModel };
11
11
  export function openStreamPlayer(init) {
12
- const { streamId, graphqlOrigin, locale, showStreamsCloudWatermark, postSocialInteractionsHandler, initiator } = init;
12
+ const { streamId, graphqlOrigin, disableBackground, hideCloseButton, locale, showStreamsCloudWatermark, postSocialInteractionsHandler, initiator, on } = init;
13
13
  const dataProvider = init.dataProvider ?? new InternalStreamPlayerDataProvider({ graphqlOrigin, initiator });
14
14
  if (!dataProvider) {
15
15
  toastrWarning('Data provider is not specified.');
@@ -35,6 +35,8 @@ export function openStreamPlayer(init) {
35
35
  streamId,
36
36
  dataProvider,
37
37
  analyticsHandler,
38
+ disableBackground,
39
+ enableCloseButton: !hideCloseButton,
38
40
  locale,
39
41
  showStreamsCloudWatermark,
40
42
  postSocialInteractionsHandler,
@@ -47,8 +49,8 @@ export function openStreamPlayer(init) {
47
49
  playerClosed: async () => {
48
50
  await unmount(mounted);
49
51
  shadowHost.remove();
50
- if (init.on?.playerClosed) {
51
- init.on.playerClosed();
52
+ if (on?.playerClosed) {
53
+ on.playerClosed();
52
54
  }
53
55
  }
54
56
  }
@@ -97,30 +97,31 @@ let { model, buffer, activePageId, on, localization } = $props();
97
97
  justify-content: center;
98
98
  overflow-y: auto;
99
99
  overscroll-behavior: contain;
100
- scrollbar-color: transparent transparent;
101
- scrollbar-width: thin;
102
- --custom-scrollbar-background: transparent;
103
100
  padding: 0.9375rem 0.9375rem 0;
101
+ --_cross-browser-scrollbar--thumb-color: transparent;
102
+ --_cross-browser-scrollbar--track-color: transparent;
103
+ }
104
+ .stream-overview-pages:hover {
105
+ --_cross-browser-scrollbar--thumb-color: var(--scrollbar--thumb-color, #7d7d7d);
106
+ --_cross-browser-scrollbar--track-color: var(--scrollbar--track-color, transparent);
104
107
  }
105
108
  .stream-overview-pages::-webkit-scrollbar {
106
- width: 3px;
107
- height: 3px;
108
- background: transparent;
109
+ width: 6px;
110
+ height: 6px;
109
111
  }
110
- .stream-overview-pages::-webkit-scrollbar-thumb {
111
- background: transparent;
112
+ .stream-overview-pages::-webkit-scrollbar-track {
113
+ background: var(--_cross-browser-scrollbar--track-color);
114
+ border-radius: 100vw;
112
115
  }
113
- .stream-overview-pages:hover {
114
- scrollbar-color: var(--custom-scrollbar-color, #7d7d7d) var(--custom-scrollbar-background, transparent);
115
- scrollbar-width: thin;
116
- }
117
- .stream-overview-pages:hover::-webkit-scrollbar {
118
- width: 3px;
119
- height: 3px;
120
- background: var(--custom-scrollbar-background, transparent);
116
+ .stream-overview-pages::-webkit-scrollbar-thumb {
117
+ background: var(--_cross-browser-scrollbar--thumb-color);
118
+ border-radius: 100vw;
121
119
  }
122
- .stream-overview-pages:hover::-webkit-scrollbar-thumb {
123
- background: var(--custom-scrollbar-color, #7d7d7d);
120
+ @supports (scrollbar-color: transparent transparent) {
121
+ .stream-overview-pages {
122
+ scrollbar-color: var(--_cross-browser-scrollbar--thumb-color) var(--_cross-browser-scrollbar--track-color);
123
+ scrollbar-width: thin;
124
+ }
124
125
  }
125
126
  .stream-overview-pages__grid {
126
127
  display: flex;
@@ -16,7 +16,7 @@ import { default as Overview } from './stream-overview.svelte';
16
16
  import { StreamPlayerBuffer } from './stream-player-buffer.svelte';
17
17
  import { StreamPlayerLocalization } from './stream-player-localization';
18
18
  import { untrack } from 'svelte';
19
- let { streamId, dataProvider, analyticsHandler, locale = 'en', showStreamsCloudWatermark, postSocialInteractionsHandler, on, mediaCenterData } = $props();
19
+ let { streamId, dataProvider, analyticsHandler, disableBackground, enableCloseButton, locale = 'en', showStreamsCloudWatermark, postSocialInteractionsHandler, on, mediaCenterData } = $props();
20
20
  const localization = $derived(new StreamPlayerLocalization(locale));
21
21
  let currentStreamModel = $state(null);
22
22
  let activePageId = $derived.by(() => { var _a, _b; return (_b = (_a = buffer === null || buffer === void 0 ? void 0 : buffer.current) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : ''; });
@@ -35,7 +35,6 @@ $effect(() => {
35
35
  initNewStream(streamId);
36
36
  });
37
37
  return () => {
38
- console.warn('finalize');
39
38
  stopActivityTracking();
40
39
  if (currentStreamModel) {
41
40
  analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackStreamEngagementTime(currentStreamModel.id, totalEngagementTimeSeconds);
@@ -91,7 +90,8 @@ const contentPlayerConfig = new ContentPlayerConfig({
91
90
  return null;
92
91
  }
93
92
  },
94
- disableBackground: false,
93
+ disableBackground,
94
+ enableCloseButton,
95
95
  locale,
96
96
  showStreamsCloudWatermark,
97
97
  socialInteractionsHandler: postSocialInteractionsHandler,
@@ -21,6 +21,7 @@ export type StreamPlayerProps = {
21
21
  postSocialInteractionsHandler?: IPostSocialInteractionsHandler;
22
22
  analyticsHandler?: IStreamAnalyticsHandler;
23
23
  disableBackground?: boolean;
24
+ enableCloseButton?: boolean;
24
25
  locale?: Locale;
25
26
  showStreamsCloudWatermark?: boolean;
26
27
  on?: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@streamscloud/embeddable",
3
- "version": "7.2.0-1759186013783",
3
+ "version": "7.3.0",
4
4
  "author": "StreamsCloud",
5
5
  "repository": {
6
6
  "type": "git",