@streamscloud/embeddable 10.1.2 → 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/dist/ads/ad-card/cmp.ad-card.svelte +27 -7
  2. package/dist/ads/ad-card/cmp.ad-card.svelte.d.ts +5 -0
  3. package/dist/content-player/cmp.content-player.svelte +30 -40
  4. package/dist/content-player/content-player-config.svelte.d.ts +13 -2
  5. package/dist/content-player/content-player-config.svelte.js +8 -5
  6. package/dist/content-player/content-player-settings.d.ts +12 -0
  7. package/dist/content-player/content-player-settings.js +12 -0
  8. package/dist/content-player/controls-and-attachments.svelte +25 -54
  9. package/dist/content-player/header.svelte +10 -132
  10. package/dist/content-player/header.svelte.d.ts +0 -4
  11. package/dist/content-player/overview-panel.svelte +22 -72
  12. package/dist/content-player/overview-panel.svelte.d.ts +30 -7
  13. package/dist/content-player/ui-manager.svelte.d.ts +2 -4
  14. package/dist/content-player/ui-manager.svelte.js +3 -5
  15. package/dist/media-center/config/internal-media-center-config.js +2 -1
  16. package/dist/media-center/config/operations.generated.d.ts +13 -0
  17. package/dist/media-center/config/operations.generated.js +20 -0
  18. package/dist/media-center/config/operations.graphql +13 -0
  19. package/dist/media-center/config/types.d.ts +13 -0
  20. package/dist/media-center/media-center/cmp.media-center.svelte +117 -348
  21. package/dist/media-center/media-center/cmp.media-center.svelte.d.ts +3 -1
  22. package/dist/media-center/media-center/{discover-panel-handler.svelte.d.ts → discover/discover-panel-handler.svelte.d.ts} +5 -6
  23. package/dist/media-center/media-center/{discover-panel-handler.svelte.js → discover/discover-panel-handler.svelte.js} +1 -8
  24. package/dist/media-center/media-center/discover/discover-panel-localization.d.ts +19 -0
  25. package/dist/media-center/media-center/discover/discover-panel-localization.js +78 -0
  26. package/dist/media-center/media-center/{discover-panel.svelte → discover/discover-panel.svelte} +18 -9
  27. package/dist/media-center/media-center/discover/discover-panel.svelte.d.ts +15 -0
  28. package/dist/media-center/media-center/discover/index.d.ts +2 -0
  29. package/dist/media-center/media-center/discover/index.js +2 -0
  30. package/dist/media-center/media-center/handlers/categories-handler.svelte.d.ts +21 -0
  31. package/dist/media-center/media-center/handlers/categories-handler.svelte.js +36 -0
  32. package/dist/media-center/media-center/handlers/feed-handler.svelte.d.ts +6 -0
  33. package/dist/media-center/media-center/handlers/feed-handler.svelte.js +12 -0
  34. package/dist/media-center/media-center/handlers/index.d.ts +2 -0
  35. package/dist/media-center/media-center/handlers/index.js +2 -0
  36. package/dist/media-center/media-center/header-footer/index.d.ts +3 -0
  37. package/dist/media-center/media-center/header-footer/index.js +3 -0
  38. package/dist/media-center/media-center/header-footer/media-center-footer.svelte +77 -0
  39. package/dist/media-center/media-center/header-footer/media-center-footer.svelte.d.ts +7 -0
  40. package/dist/media-center/media-center/header-footer/media-center-header-localization.d.ts +12 -0
  41. package/dist/media-center/media-center/header-footer/media-center-header-localization.js +40 -0
  42. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte +91 -0
  43. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte.d.ts +11 -0
  44. package/dist/media-center/media-center/header-footer/media-center-header.svelte +310 -0
  45. package/dist/media-center/media-center/header-footer/media-center-header.svelte.d.ts +13 -0
  46. package/dist/media-center/media-center/media-center-context.svelte.d.ts +50 -0
  47. package/dist/media-center/media-center/media-center-context.svelte.js +98 -0
  48. package/dist/media-center/media-center/{category-following-wrapper.svelte → menu/category-following-wrapper.svelte} +3 -2
  49. package/dist/media-center/media-center/{category-following-wrapper.svelte.d.ts → menu/category-following-wrapper.svelte.d.ts} +2 -2
  50. package/dist/media-center/media-center/menu/index.d.ts +2 -0
  51. package/dist/media-center/media-center/menu/index.js +2 -0
  52. package/dist/media-center/media-center/menu/menu-localization.d.ts +19 -0
  53. package/dist/media-center/media-center/menu/menu-localization.js +78 -0
  54. package/dist/media-center/media-center/menu/menu.svelte +345 -0
  55. package/dist/media-center/media-center/menu/menu.svelte.d.ts +14 -0
  56. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.d.ts +10 -0
  57. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.js +26 -0
  58. package/dist/media-center/media-center/providers/index.d.ts +2 -0
  59. package/dist/media-center/media-center/providers/index.js +2 -0
  60. package/dist/media-center/media-center/providers/post-player-provider-generator.d.ts +8 -0
  61. package/dist/media-center/media-center/{post-player-provider-generator.js → providers/post-player-provider-generator.js} +3 -3
  62. package/dist/media-center/media-center/{streams-player-provider-generator.d.ts → providers/streams-player-provider-generator.d.ts} +2 -2
  63. package/dist/media-center/media-center/{streams-player-provider-generator.js → providers/streams-player-provider-generator.js} +2 -2
  64. package/dist/media-center/media-center/streams-in-category/index.d.ts +2 -0
  65. package/dist/media-center/media-center/streams-in-category/index.js +2 -0
  66. package/dist/media-center/media-center/{streams-in-category-panel-handler.svelte.d.ts → streams-in-category/streams-in-category-panel-handler.svelte.d.ts} +4 -4
  67. package/dist/media-center/media-center/{streams-in-category-panel-handler.svelte.js → streams-in-category/streams-in-category-panel-handler.svelte.js} +5 -5
  68. package/dist/media-center/media-center/{streams-in-category-panel.svelte → streams-in-category/streams-in-category-panel.svelte} +1 -1
  69. package/dist/media-center/media-center/{streams-in-category-panel.svelte.d.ts → streams-in-category/streams-in-category-panel.svelte.d.ts} +1 -1
  70. package/dist/media-center/media-center/types.d.ts +1 -1
  71. package/dist/media-center/model/types.d.ts +7 -6
  72. package/dist/posts/attachments/cmp.attachments.svelte +5 -3
  73. package/dist/posts/attachments/cmp.attachments.svelte.d.ts +6 -0
  74. package/dist/posts/controls/cmp.controls.svelte +3 -3
  75. package/dist/posts/controls/cmp.controls.svelte.d.ts +2 -0
  76. package/dist/posts/post-viewer/cmp.post-viewer.svelte +3 -1
  77. package/dist/posts/post-viewer/cmp.post-viewer.svelte.d.ts +4 -0
  78. package/dist/products/product-card/cmp.product-card.svelte +35 -11
  79. package/dist/products/product-card/cmp.product-card.svelte.d.ts +5 -0
  80. package/dist/streams/data-loaders/mapper.js +0 -5
  81. package/dist/streams/data-loaders/operations.generated.d.ts +0 -12
  82. package/dist/streams/data-loaders/operations.generated.js +0 -26
  83. package/dist/streams/data-loaders/operations.graphql +0 -6
  84. package/dist/streams/layout/element-views/cmp.short-video-stream-element.svelte +2 -1
  85. package/dist/streams/layout/element-views/cmp.short-video-stream-element.svelte.d.ts +4 -0
  86. package/dist/streams/stream-card/cmp.stream-card.svelte +5 -5
  87. package/dist/streams/streams-player/index.js +1 -1
  88. package/dist/streams/streams-player/stream-overview.svelte +6 -96
  89. package/dist/streams/streams-player/stream-overview.svelte.d.ts +0 -4
  90. package/dist/streams/streams-player/stream-player-localization.d.ts +0 -1
  91. package/dist/streams/streams-player/stream-player-localization.js +0 -6
  92. package/dist/streams/streams-player/streams-player-view.svelte +0 -2
  93. package/dist/streams/streams-player/types.d.ts +0 -4
  94. package/dist/ui/icon/cmp.icon.svelte +3 -2
  95. package/dist/ui/player/button/cmp.player-button.svelte +17 -5
  96. package/dist/ui/player/button/cmp.player-button.svelte.d.ts +3 -0
  97. package/dist/ui/player/button/cmp.player-buttons-group.svelte +20 -5
  98. package/dist/ui/player/button/cmp.player-buttons-group.svelte.d.ts +2 -0
  99. package/dist/ui/player/button/types.d.ts +2 -0
  100. package/package.json +1 -1
  101. package/dist/content-player/content-player-localization.d.ts +0 -6
  102. package/dist/content-player/content-player-localization.js +0 -15
  103. package/dist/media-center/media-center/desktop-categories-selector.svelte +0 -132
  104. package/dist/media-center/media-center/desktop-categories-selector.svelte.d.ts +0 -12
  105. package/dist/media-center/media-center/discover-panel.svelte.d.ts +0 -15
  106. package/dist/media-center/media-center/media-center-handler.svelte.d.ts +0 -28
  107. package/dist/media-center/media-center/media-center-handler.svelte.js +0 -73
  108. package/dist/media-center/media-center/media-center-localization.d.ts +0 -10
  109. package/dist/media-center/media-center/media-center-localization.js +0 -39
  110. package/dist/media-center/media-center/mobile-controls-panel.svelte +0 -268
  111. package/dist/media-center/media-center/mobile-controls-panel.svelte.d.ts +0 -20
  112. package/dist/media-center/media-center/post-player-provider-generator.d.ts +0 -8
@@ -7,214 +7,136 @@
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { horizontalWheelScroll } from '../../core/actions';
10
+ var _a;
11
11
  import { Utils } from '../../core/utils';
12
12
  import { default as PostsPlayerView } from '../../posts/posts-player/posts-player-view.svelte';
13
13
  import { default as StreamsPlayerView } from '../../streams/streams-player/streams-player-view.svelte';
14
- import { Icon } from '../../ui/icon';
15
14
  import { Loading } from '../../ui/loading';
16
- import { PlayerButton } from '../../ui/player/button';
17
- import { default as DesktopCategoriesSelector } from './desktop-categories-selector.svelte';
18
- import { DiscoverPanelHandler } from './discover-panel-handler.svelte';
19
- import { default as DiscoverPanel } from './discover-panel.svelte';
20
- import { MediaCenterHandler } from './media-center-handler.svelte';
21
- import { MediaCenterLocalization } from './media-center-localization';
22
- import { default as MobileControlsPanel } from './mobile-controls-panel.svelte';
23
- import { makePostPlayerItemsProvider } from './post-player-provider-generator';
24
- import { StreamsInCategoryPanelHandler } from './streams-in-category-panel-handler.svelte';
25
- import { default as StreamsInCategoryPanel } from './streams-in-category-panel.svelte';
26
- import { makeStreamsPlayerDataProvider } from './streams-player-provider-generator';
27
- import IconLineHorizontal3 from '@fluentui/svg-icons/icons/line_horizontal_3_20_regular.svg?raw';
28
- import IconScreenSearch from '@fluentui/svg-icons/icons/screen_search_20_regular.svg?raw';
29
- import { tick } from 'svelte';
15
+ import { DiscoverPanel } from './discover';
16
+ import { MediaCenterHeader, MediaCenterFooter, MediaCenterHeaderMobile } from './header-footer';
17
+ import { MediaCenterContext } from './media-center-context.svelte.js';
18
+ import { Menu } from './menu';
19
+ import { makePostPlayerItemsProvider, makeStreamsPlayerDataProvider } from './providers';
20
+ import { StreamsInCategoryPanel } from './streams-in-category';
30
21
  import { fade } from 'svelte/transition';
31
- const SCROLL_MASK_OFFSET = 32;
32
22
  let { config, playerProps, locale = 'en' } = $props();
33
- const localization = $derived(new MediaCenterLocalization(locale));
34
- const commonPlayerSettings = {
35
- playerSettings: playerProps.props.playerSettings,
36
- on: playerProps.props.on
23
+ const enhancedPlayerSettings = () => {
24
+ const playerSettings = playerProps.mode === 'discover' ? {} : Object.assign({}, playerProps.props.playerSettings);
25
+ playerSettings.playerColors = context.playerColors;
26
+ return playerSettings;
37
27
  };
38
- const handler = new MediaCenterHandler(config);
39
- const discoverHandler = new DiscoverPanelHandler(config);
40
- const streamsInCategoryHandler = new StreamsInCategoryPanelHandler(config);
41
- let mediaCenterMode = $state(playerProps.mode);
28
+ const commonPlayerProps = () => {
29
+ return {
30
+ playerSettings: enhancedPlayerSettings(),
31
+ on: playerProps.mode !== 'discover' ? playerProps === null || playerProps === void 0 ? void 0 : playerProps.props.on : undefined
32
+ };
33
+ };
34
+ const mapToMediaCenterMode = (propsMode) => {
35
+ switch (propsMode) {
36
+ case 'posts':
37
+ return 'posts-feed';
38
+ case 'streams':
39
+ return 'streams-feed';
40
+ case 'discover':
41
+ return 'discover';
42
+ default:
43
+ return Utils.assertUnreachable(propsMode);
44
+ }
45
+ };
46
+ let mediaCenterMode = $state(mapToMediaCenterMode(playerProps.mode));
47
+ const context = new MediaCenterContext({
48
+ config,
49
+ followingHandler: (_a = config === null || config === void 0 ? void 0 : config.handlers) === null || _a === void 0 ? void 0 : _a.categoriesFollowingHandler,
50
+ on: {
51
+ initialized: () => {
52
+ switch (mediaCenterMode) {
53
+ case 'posts-feed':
54
+ context.activateFeed({ categoryId: null });
55
+ break;
56
+ case 'streams-feed':
57
+ context.activateFeed({ categoryId: null });
58
+ break;
59
+ case 'discover':
60
+ context.activateDiscover();
61
+ break;
62
+ default:
63
+ Utils.assertUnreachable(mediaCenterMode);
64
+ }
65
+ }
66
+ }
67
+ });
42
68
  let headerHeight = $state(0);
43
69
  let computedPlayerProps = $state.raw(playerProps);
44
70
  let isMobileView = $state(false);
45
- const overlayActivated = $derived(discoverHandler.activated || streamsInCategoryHandler.activated);
46
- let mobileControlsPanelActive = $state(false);
47
- let extraMobileControlsPanelActions = $state.raw([]);
48
- let scrollAreaRef = $state(null);
71
+ let closeFn = $state.raw(null);
49
72
  const selectCategory = (categoryId) => __awaiter(void 0, void 0, void 0, function* () {
50
- var _a, _b, _c;
51
- const selectedCategoryData = handler.getCategoryData(categoryId);
52
- if (!config || !selectedCategoryData) {
73
+ var _a, _b;
74
+ if (!config) {
53
75
  return;
54
76
  }
55
- hideMobileControlsPanel();
56
77
  switch (mediaCenterMode) {
57
- case 'posts':
58
- if (handler.selectedCategoryId === categoryId) {
59
- discoverHandler.deactivate();
78
+ case 'posts-feed':
79
+ if (context.categoriesHandler.selectedCategoryId === categoryId) {
80
+ context.activateFeed();
60
81
  return;
61
82
  }
62
- handler.selectedCategoryId = categoryId;
63
83
  computedPlayerProps = {
64
84
  mode: 'posts',
65
- props: Object.assign({ dataProvider: makePostPlayerItemsProvider({ 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)
85
+ props: Object.assign({ dataProvider: makePostPlayerItemsProvider({ 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 }, commonPlayerProps())
66
86
  };
67
- discoverHandler.deactivate();
87
+ context.activateFeed({ categoryId });
68
88
  break;
69
- case 'stream':
70
- if (handler.selectedCategoryId === categoryId) {
71
- discoverHandler.deactivate();
72
- streamsInCategoryHandler.deactivate();
73
- handler.selectedCategoryId = null;
74
- return;
75
- }
76
- handler.selectedCategoryId = categoryId;
77
- discoverHandler.deactivate();
78
- streamsInCategoryHandler.activate(selectedCategoryData);
89
+ case 'streams-feed':
90
+ context.tryActivateStreamsInCategory(categoryId);
91
+ break;
92
+ case 'discover':
93
+ console.warn('Apply category filter for discover mode is not implemented yet');
79
94
  break;
80
95
  default:
81
96
  Utils.assertUnreachable(mediaCenterMode);
82
97
  }
83
- // Scroll to selected category if it's hidden
84
- yield scrollToSelectedCategory((_c = selectedCategoryData.parentId) !== null && _c !== void 0 ? _c : selectedCategoryData.id);
85
- });
86
- /**
87
- * Scrolls the scroll area to make the selected category button visible
88
- * @param categoryId - ID of the selected category
89
- */
90
- const scrollToSelectedCategory = (categoryId) => __awaiter(void 0, void 0, void 0, function* () {
91
- if (!scrollAreaRef) {
92
- return;
93
- }
94
- // Wait for DOM to update with the new active state
95
- yield tick();
96
- // Find the selected category button element
97
- const selectedButton = scrollAreaRef.querySelector(`[id="${categoryId}"]`);
98
- if (!selectedButton) {
99
- return;
100
- }
101
- // Get scroll area and button dimensions
102
- const scrollAreaRect = scrollAreaRef.getBoundingClientRect();
103
- const buttonRect = selectedButton.getBoundingClientRect();
104
- // Calculate button position relative to scroll area
105
- const buttonLeftRelative = buttonRect.left - scrollAreaRect.left + scrollAreaRef.scrollLeft;
106
- const buttonRightRelative = buttonLeftRelative + buttonRect.width;
107
- // Calculate visible area boundaries (accounting for mask gradients)
108
- const hasLeftMask = scrollAreaRef.scrollLeft > 0;
109
- const hasRightMask = scrollAreaRef.scrollLeft < scrollAreaRef.scrollWidth - scrollAreaRect.width - 1;
110
- const visibleLeft = scrollAreaRef.scrollLeft + (hasLeftMask ? SCROLL_MASK_OFFSET : 0);
111
- const visibleRight = scrollAreaRef.scrollLeft + scrollAreaRect.width - (hasRightMask ? SCROLL_MASK_OFFSET : 0);
112
- // Check if button is hidden or partially hidden
113
- const isHiddenLeft = buttonLeftRelative < visibleLeft;
114
- const isHiddenRight = buttonRightRelative > visibleRight;
115
- if (isHiddenLeft) {
116
- const targetScroll = buttonLeftRelative - SCROLL_MASK_OFFSET;
117
- scrollAreaRef.scrollTo({
118
- left: targetScroll,
119
- behavior: 'smooth'
120
- });
121
- }
122
- else if (isHiddenRight) {
123
- const targetScroll = buttonRightRelative - scrollAreaRect.width + SCROLL_MASK_OFFSET;
124
- scrollAreaRef.scrollTo({
125
- left: targetScroll,
126
- behavior: 'smooth'
127
- });
128
- }
129
98
  });
130
99
  const activateSelectedShortVideoPlayer = (shortVideo) => {
131
100
  var _a, _b;
132
101
  if (!config) {
133
102
  return;
134
103
  }
135
- mediaCenterMode = 'posts';
104
+ mediaCenterMode = 'posts-feed';
136
105
  computedPlayerProps = {
137
106
  mode: 'posts',
138
- props: Object.assign({ dataProvider: makePostPlayerItemsProvider({ 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)
107
+ props: Object.assign({ dataProvider: makePostPlayerItemsProvider({ 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 }, commonPlayerProps())
139
108
  };
140
- handler.selectedCategoryId = null;
141
- discoverHandler.deactivate();
142
- streamsInCategoryHandler.deactivate();
109
+ context.activateFeed({ categoryId: null });
143
110
  };
144
111
  const activateSelectedStreamPlayer = (stream) => {
145
112
  var _a, _b;
146
113
  if (!config) {
147
114
  return;
148
115
  }
149
- mediaCenterMode = 'stream';
116
+ mediaCenterMode = 'streams-feed';
150
117
  computedPlayerProps = {
151
- mode: 'stream',
152
- props: Object.assign({ dataProvider: makeStreamsPlayerDataProvider({ config, prefetchedStreams: [stream] }), 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)
118
+ mode: 'streams',
119
+ props: Object.assign({ dataProvider: makeStreamsPlayerDataProvider({ config, prefetchedStreams: [stream] }), analyticsHandler: (_a = config.handlers) === null || _a === void 0 ? void 0 : _a.analyticsHandler, postSocialInteractionsHandler: (_b = config.handlers) === null || _b === void 0 ? void 0 : _b.socialInteractionsHandler }, commonPlayerProps())
153
120
  };
154
- handler.selectedCategoryId = null;
155
- discoverHandler.deactivate();
156
- streamsInCategoryHandler.deactivate();
121
+ context.activateFeed({ categoryId: null });
157
122
  };
158
123
  const activateSelectedStreamOfCategoryPlayer = (id, prefetchedStreams, categoryId) => {
159
124
  var _a, _b;
160
125
  if (!config) {
161
126
  return;
162
127
  }
163
- mediaCenterMode = 'stream';
128
+ mediaCenterMode = 'streams-feed';
164
129
  computedPlayerProps = {
165
- mode: 'stream',
166
- props: Object.assign({ dataProvider: makeStreamsPlayerDataProvider({ config, prefetchedStreams: prefetchedStreams, initialStreamId: id, categoryId }), 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)
130
+ mode: 'streams',
131
+ props: Object.assign({ dataProvider: makeStreamsPlayerDataProvider({ config, prefetchedStreams: prefetchedStreams, initialStreamId: id, categoryId }), analyticsHandler: (_a = config.handlers) === null || _a === void 0 ? void 0 : _a.analyticsHandler, postSocialInteractionsHandler: (_b = config.handlers) === null || _b === void 0 ? void 0 : _b.socialInteractionsHandler }, commonPlayerProps())
167
132
  };
168
- handler.selectedCategoryId = null;
169
- discoverHandler.deactivate();
170
- streamsInCategoryHandler.deactivate();
171
- };
172
- const toggleDiscover = () => __awaiter(void 0, void 0, void 0, function* () {
173
- hideMobileControlsPanel();
174
- streamsInCategoryHandler.deactivate();
175
- yield discoverHandler.toggle();
176
- });
177
- const handleExternalActionExecuted = () => {
178
- hideMobileControlsPanel();
179
- discoverHandler.deactivate();
180
- streamsInCategoryHandler.deactivate();
181
- };
182
- const showMobileControlsPanel = () => {
183
- mobileControlsPanelActive = true;
133
+ context.activateFeed();
184
134
  };
185
- const hideMobileControlsPanel = () => {
186
- mobileControlsPanelActive = false;
135
+ const onHeaderHeightChanged = (height) => {
136
+ headerHeight = height;
187
137
  };
188
- const handleScrollingAreaScroll = (e) => {
189
- const target = e.target;
190
- updateScrollShadows(target);
191
- };
192
- const updateScrollShadows = (scrollArea) => {
193
- const { scrollLeft, scrollWidth, clientWidth } = scrollArea;
194
- const scrollHasLeft = scrollLeft > 0;
195
- const scrollHasRight = scrollLeft < scrollWidth - clientWidth - 1;
196
- scrollArea.classList.toggle('has-left-mask', scrollHasLeft && !scrollHasRight);
197
- scrollArea.classList.toggle('has-right-mask', scrollHasRight && !scrollHasLeft);
198
- scrollArea.classList.toggle('has-both-masks', scrollHasRight && scrollHasLeft);
199
- };
200
- const onScrollMounted = (node) => {
201
- scrollAreaRef = node;
202
- scrollAreaRef.style.setProperty('--scroll-area--mask-offset', `${SCROLL_MASK_OFFSET}px`);
203
- const scrollResizeObserver = new ResizeObserver(() => {
204
- updateScrollShadows(node);
205
- });
206
- scrollResizeObserver === null || scrollResizeObserver === void 0 ? void 0 : scrollResizeObserver.observe(node);
207
- return {
208
- destroy: () => {
209
- scrollResizeObserver === null || scrollResizeObserver === void 0 ? void 0 : scrollResizeObserver.disconnect();
210
- }
211
- };
212
- };
213
- const onHeaderHeightChanged = (data) => {
214
- headerHeight = data.height;
215
- };
216
- const onExtraActionsForMobileControlsPanelDetermined = (actions) => {
217
- extraMobileControlsPanelActions = actions;
138
+ const handlePlayerInitialized = (data) => {
139
+ closeFn = data.closePlayerFn;
218
140
  };
219
141
  const onWidthAnchorMounted = (node) => {
220
142
  const resizeObserver = new ResizeObserver(() => {
@@ -229,82 +151,49 @@ const onWidthAnchorMounted = (node) => {
229
151
  };
230
152
  </script>
231
153
 
232
- {#if handler.initializing}
154
+ {#if context.initializing}
233
155
  <Loading positionFixedCenter={true} timeout={600} />
234
156
  {:else}
235
- {#snippet controlsPanel()}
157
+ {#snippet mobileFooter()}
158
+ <MediaCenterFooter context={context} />
159
+ {/snippet}
160
+ {#snippet header()}
236
161
  {#if !isMobileView}
237
- <div class="media-center-controls-panel">
238
- <DesktopCategoriesSelector
239
- handler={handler}
240
- followingHandler={config?.handlers?.categoriesFollowingHandler}
241
- on={{ categorySelected: selectCategory }} />
242
- <button
243
- type="button"
244
- class="media-center-controls-panel__button"
245
- class:media-center-controls-panel__button--active={discoverHandler.activated}
246
- onclick={toggleDiscover}>
247
- <span class="media-center-controls-panel__button-icon" class:media-center-controls-panel__button-icon--active={discoverHandler.activated}>
248
- <Icon src={IconScreenSearch} />
249
- </span>
250
- <span class="media-center-controls-panel__button-value">
251
- {localization.discoverButton}
252
- </span>
253
- </button>
254
- <div class="media-center-controls-panel__scroll-area" use:onScrollMounted use:horizontalWheelScroll onscroll={handleScrollingAreaScroll}>
255
- {#each handler.categories as category (category.id)}
256
- <button
257
- type="button"
258
- id={category.id}
259
- class="media-center-controls-panel__button"
260
- class:media-center-controls-panel__button--active={!discoverHandler.activated && handler.controlsPanelSelectedCategory?.id === category.id}
261
- data-child-name={(!discoverHandler.activated &&
262
- handler.controlsPanelSelectedCategory?.id === category.id &&
263
- handler.controlsPanelSelectedCategory?.childName) ||
264
- undefined}
265
- title={category.name}
266
- onclick={() => selectCategory(category.id)}>
267
- <span class="media-center-controls-panel__button-value">
268
- {category.name}
269
- </span>
270
- </button>
271
- {/each}
272
- </div>
273
- </div>
162
+ <MediaCenterHeader context={context} closeFn={closeFn} locale={locale} on={{ headerHeightChanged: onHeaderHeightChanged }} />
274
163
  {:else}
275
- <div class="media-center-mobile-controls-trigger">
276
- <PlayerButton icon={IconLineHorizontal3} on={{ click: showMobileControlsPanel }} />
277
- </div>
164
+ <MediaCenterHeaderMobile context={context} closeFn={closeFn} on={{ headerHeightChanged: onHeaderHeightChanged }} />
278
165
  {/if}
279
166
  {/snippet}
280
167
  {#if computedPlayerProps.mode === 'posts'}
281
168
  <PostsPlayerView
282
169
  {...computedPlayerProps.props}
170
+ playerSettings={enhancedPlayerSettings()}
283
171
  mediaCenterData={{
284
- controlsPanel: handler.categories.length ? controlsPanel : undefined,
285
- playerLogo: handler.logo,
286
- overlayIsActive: overlayActivated,
287
- callbacks: { onHeaderHeightChanged, onExtraActionsForMobileControlsPanelDetermined }
172
+ header: context.mediaCenterEffective ? header : undefined,
173
+ mobileFooter: isMobileView ? mobileFooter : undefined,
174
+ overlayIsActive: context.overlayIsActive,
175
+ callbacks: { onPlayerInitialized: handlePlayerInitialized }
288
176
  }} />
289
- {:else if computedPlayerProps.mode === 'stream'}
177
+ {:else if computedPlayerProps.mode === 'streams'}
290
178
  <StreamsPlayerView
291
179
  {...computedPlayerProps.props}
180
+ playerSettings={enhancedPlayerSettings()}
292
181
  mediaCenterData={{
293
- controlsPanel: handler.categories.length ? controlsPanel : undefined,
294
- playerLogo: handler.logo,
295
- overlayIsActive: overlayActivated,
296
- callbacks: { onHeaderHeightChanged, onExtraActionsForMobileControlsPanelDetermined }
182
+ header: context.mediaCenterEffective ? header : undefined,
183
+ mobileFooter: isMobileView ? mobileFooter : undefined,
184
+ overlayIsActive: context.overlayIsActive,
185
+ callbacks: { onPlayerInitialized: handlePlayerInitialized }
297
186
  }} />
298
187
  {/if}
299
- {#if discoverHandler.loading || streamsInCategoryHandler.loading}
188
+ {#if context.loading}
300
189
  <Loading positionFixedCenter={true} timeout={600} />
301
190
  {/if}
302
191
 
303
- {#if discoverHandler.active}
304
- <div class="media-center-overlay" style={`top:${headerHeight}px`} transition:fade={{ duration: 300 }}>
192
+ {#if context.discoverHandler.active}
193
+ <div class="media-center-overlay" class:media-center-overlay--mobile={isMobileView} style={`top:${headerHeight}px`} transition:fade={{ duration: 300 }}>
305
194
  <DiscoverPanel
306
- handler={discoverHandler}
307
- localization={localization}
195
+ context={context}
196
+ locale={locale}
308
197
  on={{
309
198
  shortVideoSelected: (shortVideo) => activateSelectedShortVideoPlayer(shortVideo),
310
199
  streamSelected: (stream) => activateSelectedStreamPlayer(stream)
@@ -312,24 +201,18 @@ const onWidthAnchorMounted = (node) => {
312
201
  </div>
313
202
  {/if}
314
203
 
315
- {#if streamsInCategoryHandler.active}
316
- <div class="media-center-overlay" style={`top:${headerHeight}px`} transition:fade={{ duration: 300 }}>
204
+ {#if context.streamsInCategoryHandler.active}
205
+ <div class="media-center-overlay" class:media-center-overlay--mobile={isMobileView} style={`top:${headerHeight}px`} transition:fade={{ duration: 300 }}>
317
206
  <StreamsInCategoryPanel
318
- handler={streamsInCategoryHandler}
207
+ handler={context.streamsInCategoryHandler}
319
208
  on={{ streamSelected: (id, categoryId, streams) => activateSelectedStreamOfCategoryPlayer(id, streams, categoryId) }} />
320
209
  </div>
321
210
  {/if}
322
211
 
323
- {#if mobileControlsPanelActive && isMobileView}
324
- <div class="mobile-controls-panel-overlay" onclick={hideMobileControlsPanel} onkeydown={() => {}} role="none">
325
- <div class="mobile-controls-panel-overlay__panel">
326
- <MobileControlsPanel
327
- mediaCenterHandler={handler}
328
- discoverHandler={discoverHandler}
329
- followingHandler={config?.handlers?.categoriesFollowingHandler}
330
- localization={localization}
331
- extraActions={extraMobileControlsPanelActions}
332
- on={{ categorySelected: selectCategory, toggleDiscover, externalActionExecuted: handleExternalActionExecuted }} />
212
+ {#if context.menuActive}
213
+ <div class="menu-overlay" class:menu-overlay--mobile={isMobileView} onclick={context.hideMenu} onkeydown={() => {}} role="none">
214
+ <div class="menu-overlay__panel">
215
+ <Menu context={context} locale={locale} on={{ categorySelected: selectCategory, streamSelected: activateSelectedStreamPlayer }} />
333
216
  </div>
334
217
  </div>
335
218
  {/if}
@@ -347,113 +230,6 @@ const onWidthAnchorMounted = (node) => {
347
230
  opacity: 1;
348
231
  }
349
232
  }
350
- .media-center-controls-panel {
351
- max-width: 100%;
352
- display: flex;
353
- align-items: center;
354
- gap: 0.75rem;
355
- pointer-events: auto;
356
- /* Set 'container-type: inline-size;' to reference container*/
357
- }
358
- @container (width < 576px) {
359
- .media-center-controls-panel {
360
- display: none;
361
- }
362
- }
363
- .media-center-controls-panel__scroll-area {
364
- pointer-events: auto;
365
- position: relative;
366
- flex: 1 1 auto;
367
- max-width: 100%;
368
- min-width: 0;
369
- overflow-x: auto;
370
- overflow-y: hidden;
371
- display: flex;
372
- align-items: center;
373
- gap: 0.75rem;
374
- flex-wrap: nowrap;
375
- mask-image: none;
376
- scrollbar-width: none;
377
- padding: 0.5rem 0.625rem;
378
- padding-left: 0;
379
- --_scroll-area--mask-offset--left: var(--scroll-area--mask-offset);
380
- --_scroll-area--mask-offset--right: calc(100% - var(--scroll-area--mask-offset));
381
- }
382
- :global(.media-center-controls-panel__scroll-area.has-left-mask) {
383
- mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0, rgb(0, 0, 0) var(--_scroll-area--mask-offset--left), rgb(0, 0, 0) 100%);
384
- }
385
- :global(.media-center-controls-panel__scroll-area.has-right-mask) {
386
- mask-image: linear-gradient(to right, rgb(0, 0, 0) 0, rgb(0, 0, 0) var(--_scroll-area--mask-offset--right), rgba(0, 0, 0, 0) 100%);
387
- }
388
- :global(.media-center-controls-panel__scroll-area.has-both-masks) {
389
- mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0, rgb(0, 0, 0) var(--_scroll-area--mask-offset--left), rgb(0, 0, 0) var(--_scroll-area--mask-offset--right), rgba(0, 0, 0, 0) 100%);
390
- }
391
- .media-center-controls-panel__button {
392
- position: relative;
393
- pointer-events: auto;
394
- padding: 0.5rem 1.5rem;
395
- display: flex;
396
- gap: 0.375rem;
397
- justify-content: center;
398
- align-items: center;
399
- max-width: 9.375rem;
400
- flex: 0 0 auto;
401
- min-width: auto;
402
- width: auto;
403
- white-space: nowrap;
404
- border-radius: 0.875rem;
405
- background-color: rgba(0, 0, 0, 0.6);
406
- color: #f2f2f2;
407
- transition: background 0.3s ease-in-out;
408
- -webkit-user-drag: none;
409
- user-select: none;
410
- }
411
- .media-center-controls-panel__button :global([contenteditable]) {
412
- user-select: text;
413
- }
414
- .media-center-controls-panel__button--active {
415
- background-color: rgba(255, 255, 255, 0.9);
416
- color: #000000;
417
- }
418
- .media-center-controls-panel__button:hover:not(.media-center-controls-panel__button--active) {
419
- background-color: rgba(0, 0, 0, 0.9);
420
- }
421
- .media-center-controls-panel__button[data-child-name]:not([data-child-name=""])::after {
422
- content: attr(data-child-name);
423
- position: absolute;
424
- right: -0.625rem;
425
- top: 100%;
426
- transform: translateY(-50%);
427
- max-width: 100%;
428
- overflow: hidden;
429
- text-overflow: ellipsis;
430
- white-space: nowrap;
431
- padding: 0.25rem 0.625rem;
432
- font-size: 0.5rem;
433
- line-height: 1;
434
- border-radius: 100vw;
435
- background-color: #1f2937;
436
- color: #ffffff;
437
- pointer-events: none;
438
- }
439
- .media-center-controls-panel__button-icon {
440
- --icon--size: 1.0625rem;
441
- --icon--color: #ffffff;
442
- line-height: 0;
443
- }
444
- .media-center-controls-panel__button-icon--active {
445
- --icon--color: #000000;
446
- }
447
- .media-center-controls-panel__button-value {
448
- font-size: 0.875rem;
449
- line-height: 1.0625rem;
450
- text-overflow: ellipsis;
451
- width: 100%;
452
- white-space: nowrap;
453
- overflow: hidden;
454
- min-width: 0;
455
- }
456
-
457
233
  .media-center-overlay {
458
234
  position: absolute;
459
235
  inset: 0;
@@ -484,28 +260,21 @@ const onWidthAnchorMounted = (node) => {
484
260
  scrollbar-width: thin;
485
261
  }
486
262
  }
487
- @media (max-width: 576px) {
488
- .media-center-overlay {
489
- top: 5rem !important;
490
- }
491
- }
492
-
493
- .media-center-mobile-controls-trigger {
494
- position: absolute;
495
- top: 0.9375rem;
496
- left: 0.625rem;
497
- z-index: 1;
498
- }
499
263
 
500
- .mobile-controls-panel-overlay {
264
+ .menu-overlay {
501
265
  display: block;
502
266
  position: absolute;
503
267
  inset: 0;
268
+ right: auto;
504
269
  container-type: inline-size;
505
270
  z-index: 1;
506
271
  }
507
- .mobile-controls-panel-overlay__panel {
508
- width: 80%;
272
+ .menu-overlay--mobile {
273
+ right: 0;
274
+ bottom: 6.25rem;
275
+ }
276
+ .menu-overlay__panel {
277
+ width: 17.5rem;
509
278
  height: 100%;
510
279
  max-height: 100%;
511
280
  }</style>
@@ -6,8 +6,10 @@ type PlayerProps = {
6
6
  mode: 'posts';
7
7
  props: PostPlayerProps;
8
8
  } | {
9
- mode: 'stream';
9
+ mode: 'streams';
10
10
  props: StreamsPlayerProps;
11
+ } | {
12
+ mode: 'discover';
11
13
  };
12
14
  type Props = {
13
15
  config: IMediaCenterConfig | null;
@@ -1,8 +1,8 @@
1
- import type { TrackingParams } from '../../marketing-tracking';
2
- import type { IMediaCenterConfig } from '..';
3
- import type { PostPlayerModel } from '../../posts/posts-player';
4
- import type { ProductCardModel } from '../../products/product-card';
5
- import type { StreamPlayerModel } from '../../streams/streams-player';
1
+ import type { TrackingParams } from '../../../marketing-tracking';
2
+ import type { IMediaCenterConfig } from '../../config/types';
3
+ import type { PostPlayerModel } from '../../../posts/posts-player/types';
4
+ import type { ProductCardModel } from '../../../products/product-card';
5
+ import type { StreamPlayerModel } from '../../../streams/streams-player/types';
6
6
  export declare class DiscoverPanelHandler {
7
7
  private readonly config;
8
8
  private _activated;
@@ -18,7 +18,6 @@ export declare class DiscoverPanelHandler {
18
18
  get loading(): boolean;
19
19
  activate: () => Promise<void>;
20
20
  deactivate: () => void;
21
- toggle: () => Promise<void>;
22
21
  private _uniqueById;
23
22
  }
24
23
  type ShortVideoSectionItemType = {
@@ -1,4 +1,4 @@
1
- import { PostType } from '../../core/enums';
1
+ import { PostType } from '../../../core/enums';
2
2
  export class DiscoverPanelHandler {
3
3
  config;
4
4
  _activated = $state(false);
@@ -80,13 +80,6 @@ export class DiscoverPanelHandler {
80
80
  deactivate = () => {
81
81
  this._activated = false;
82
82
  };
83
- toggle = async () => {
84
- if (this._activated) {
85
- this.deactivate();
86
- return;
87
- }
88
- await this.activate();
89
- };
90
83
  _uniqueById = (arr) => {
91
84
  const seen = new Set();
92
85
  const res = [];
@@ -0,0 +1,19 @@
1
+ import { type Locale } from '../../../core/locale';
2
+ export declare class DiscoverPanelLocalization {
3
+ buttons: {
4
+ cart: string;
5
+ discover: string;
6
+ feed: string;
7
+ login: string;
8
+ moments: string;
9
+ webpage: string;
10
+ };
11
+ shortVideosSectionTitle: string;
12
+ interestsSectionTitle: string;
13
+ latestStreamsSectionTitle: string;
14
+ popularStreamsSectionTitle: string;
15
+ overviewLabel: string;
16
+ membersLabel: (count: number) => string;
17
+ locale: Locale;
18
+ constructor(locale: Locale);
19
+ }