@streamscloud/embeddable 10.1.2 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/dist/ads/ad-card/cmp.ad-card.svelte +30 -10
  2. package/dist/ads/ad-card/cmp.ad-card.svelte.d.ts +7 -0
  3. package/dist/content-player/cmp.content-player.svelte +67 -142
  4. package/dist/content-player/content-player-config.svelte.d.ts +14 -10
  5. package/dist/content-player/content-player-config.svelte.js +5 -20
  6. package/dist/content-player/content-player-settings.d.ts +7 -9
  7. package/dist/content-player/content-player-settings.js +12 -4
  8. package/dist/content-player/controls-and-attachments.svelte +63 -58
  9. package/dist/content-player/overview-panel.svelte +32 -74
  10. package/dist/content-player/overview-panel.svelte.d.ts +34 -7
  11. package/dist/content-player/ui-manager.svelte.d.ts +2 -6
  12. package/dist/content-player/ui-manager.svelte.js +3 -7
  13. package/dist/media-center/config/internal-media-center-config.d.ts +7 -3
  14. package/dist/media-center/config/internal-media-center-config.js +27 -23
  15. package/dist/media-center/config/operations.generated.d.ts +23 -3
  16. package/dist/media-center/config/operations.generated.js +37 -6
  17. package/dist/media-center/config/operations.graphql +24 -4
  18. package/dist/media-center/config/types.d.ts +18 -2
  19. package/dist/media-center/media-center/cmp.media-center.svelte +213 -398
  20. package/dist/media-center/media-center/cmp.media-center.svelte.d.ts +2 -17
  21. package/dist/media-center/media-center/discover/data-loading.d.ts +8 -0
  22. package/dist/media-center/media-center/discover/data-loading.js +35 -0
  23. package/dist/media-center/media-center/discover/discover-header-localization.d.ts +6 -0
  24. package/dist/media-center/media-center/discover/discover-header-localization.js +15 -0
  25. package/dist/media-center/media-center/discover/discover-header.svelte +214 -0
  26. package/dist/media-center/media-center/discover/discover-header.svelte.d.ts +9 -0
  27. package/dist/media-center/media-center/discover/discover-view-handler.svelte.d.ts +28 -0
  28. package/dist/media-center/media-center/discover/discover-view-handler.svelte.js +101 -0
  29. package/dist/media-center/media-center/discover/discover-view-localization.d.ts +6 -0
  30. package/dist/media-center/media-center/discover/discover-view-localization.js +15 -0
  31. package/dist/media-center/media-center/discover/discover-view.svelte +238 -0
  32. package/dist/media-center/media-center/discover/discover-view.svelte.d.ts +15 -0
  33. package/dist/media-center/media-center/discover/index.d.ts +2 -0
  34. package/dist/media-center/media-center/discover/index.js +2 -0
  35. package/dist/media-center/media-center/discover/types.svelte.d.ts +20 -0
  36. package/dist/media-center/media-center/discover/types.svelte.js +20 -0
  37. package/dist/media-center/media-center/feed/feed-handler.svelte.d.ts +50 -0
  38. package/dist/media-center/media-center/feed/feed-handler.svelte.js +84 -0
  39. package/dist/media-center/media-center/feed/feed-providers-generator.d.ts +11 -0
  40. package/dist/media-center/media-center/feed/feed-providers-generator.js +79 -0
  41. package/dist/media-center/media-center/feed/index.d.ts +1 -0
  42. package/dist/media-center/media-center/feed/index.js +1 -0
  43. package/dist/media-center/media-center/feed/types.d.ts +12 -0
  44. package/dist/media-center/media-center/handlers/categories-handler.svelte.d.ts +27 -0
  45. package/dist/media-center/media-center/handlers/categories-handler.svelte.js +39 -0
  46. package/dist/media-center/media-center/handlers/index.d.ts +2 -0
  47. package/dist/media-center/media-center/handlers/index.js +2 -0
  48. package/dist/media-center/media-center/handlers/media-center-settings-handler.svelte.d.ts +19 -0
  49. package/dist/media-center/media-center/handlers/media-center-settings-handler.svelte.js +26 -0
  50. package/dist/media-center/media-center/header-footer/index.d.ts +3 -0
  51. package/dist/media-center/media-center/header-footer/index.js +3 -0
  52. package/dist/media-center/media-center/header-footer/media-center-footer.svelte +73 -0
  53. package/dist/media-center/media-center/header-footer/media-center-footer.svelte.d.ts +7 -0
  54. package/dist/media-center/media-center/header-footer/media-center-header-localization.d.ts +13 -0
  55. package/dist/media-center/media-center/header-footer/media-center-header-localization.js +46 -0
  56. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte +80 -0
  57. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte.d.ts +12 -0
  58. package/dist/media-center/media-center/header-footer/media-center-header.svelte +313 -0
  59. package/dist/media-center/media-center/header-footer/media-center-header.svelte.d.ts +12 -0
  60. package/dist/media-center/media-center/media-center-context.svelte.d.ts +68 -0
  61. package/dist/media-center/media-center/media-center-context.svelte.js +134 -0
  62. package/dist/media-center/media-center/{category-following-wrapper.svelte → menu/category-following-wrapper.svelte} +3 -2
  63. package/dist/media-center/media-center/{category-following-wrapper.svelte.d.ts → menu/category-following-wrapper.svelte.d.ts} +2 -2
  64. package/dist/media-center/media-center/menu/index.d.ts +2 -0
  65. package/dist/media-center/media-center/menu/index.js +2 -0
  66. package/dist/media-center/media-center/menu/menu-localization.d.ts +10 -0
  67. package/dist/media-center/media-center/menu/menu-localization.js +39 -0
  68. package/dist/media-center/media-center/menu/menu.svelte +353 -0
  69. package/dist/media-center/media-center/menu/menu.svelte.d.ts +14 -0
  70. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.d.ts +10 -0
  71. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.js +23 -0
  72. package/dist/media-center/media-center/moments/cmp.moments-circle.svelte +41 -0
  73. package/dist/media-center/media-center/moments/cmp.moments-circle.svelte.d.ts +7 -0
  74. package/dist/media-center/media-center/moments/index.d.ts +1 -0
  75. package/dist/media-center/media-center/moments/index.js +1 -0
  76. package/dist/media-center/media-center/streams-in-category/index.d.ts +2 -0
  77. package/dist/media-center/media-center/streams-in-category/index.js +2 -0
  78. package/dist/media-center/media-center/{streams-in-category-panel-handler.svelte.d.ts → streams-in-category/streams-in-category-panel-handler.svelte.d.ts} +5 -5
  79. package/dist/media-center/media-center/{streams-in-category-panel-handler.svelte.js → streams-in-category/streams-in-category-panel-handler.svelte.js} +5 -5
  80. package/dist/media-center/media-center/{streams-in-category-panel.svelte → streams-in-category/streams-in-category-panel.svelte} +1 -1
  81. package/dist/media-center/media-center/{streams-in-category-panel.svelte.d.ts → streams-in-category/streams-in-category-panel.svelte.d.ts} +1 -1
  82. package/dist/media-center/media-center/types.d.ts +44 -1
  83. package/dist/media-page/index.d.ts +121 -0
  84. package/dist/media-page/index.js +43 -0
  85. package/dist/posts/attachments/cmp.attachments.svelte +6 -3
  86. package/dist/posts/attachments/cmp.attachments.svelte.d.ts +6 -0
  87. package/dist/posts/controls/cmp.controls.svelte +51 -14
  88. package/dist/posts/controls/cmp.controls.svelte.d.ts +2 -0
  89. package/dist/posts/data-loaders/operations.generated.d.ts +4 -0
  90. package/dist/posts/data-loaders/operations.generated.js +6 -2
  91. package/dist/posts/model/types.d.ts +2 -0
  92. package/dist/posts/post-viewer/cmp.post-viewer.svelte +29 -19
  93. package/dist/posts/post-viewer/cmp.post-viewer.svelte.d.ts +4 -0
  94. package/dist/posts/post-viewer/mapper.js +2 -0
  95. package/dist/posts/post-viewer/operations.generated.d.ts +2 -0
  96. package/dist/posts/post-viewer/operations.generated.js +3 -1
  97. package/dist/posts/post-viewer/operations.graphql +2 -0
  98. package/dist/posts/post-viewer/post-texts.svelte +3 -3
  99. package/dist/posts/posts-player/cmp.posts-player.svelte +20 -6
  100. package/dist/posts/posts-player/cmp.posts-player.svelte.d.ts +18 -2
  101. package/dist/posts/posts-player/index.d.ts +18 -3
  102. package/dist/posts/posts-player/index.js +42 -89
  103. package/dist/posts/posts-player/posts-player-proxy.svelte +19 -0
  104. package/dist/posts/posts-player/posts-player-proxy.svelte.d.ts +22 -0
  105. package/dist/posts/posts-player/posts-player-view.svelte +20 -34
  106. package/dist/posts/posts-player/posts-player-view.svelte.d.ts +2 -6
  107. package/dist/posts/posts-player/types.d.ts +19 -6
  108. package/dist/products/product-card/cmp.product-card.svelte +39 -15
  109. package/dist/products/product-card/cmp.product-card.svelte.d.ts +6 -1
  110. package/dist/short-videos/short-video-card/cmp.short-video-card.svelte +160 -19
  111. package/dist/short-videos/short-video-card/cmp.short-video-card.svelte.d.ts +2 -1
  112. package/dist/short-videos/short-video-card/localization.d.ts +5 -0
  113. package/dist/short-videos/short-video-card/localization.js +13 -0
  114. package/dist/short-videos/short-video-card/types.d.ts +4 -0
  115. package/dist/short-videos/short-videos-player/index.js +26 -33
  116. package/dist/streams/data-loaders/mapper.js +0 -5
  117. package/dist/streams/data-loaders/operations.generated.d.ts +0 -12
  118. package/dist/streams/data-loaders/operations.generated.js +0 -26
  119. package/dist/streams/data-loaders/operations.graphql +0 -6
  120. package/dist/streams/layout/element-views/cmp.short-video-stream-element.svelte +2 -1
  121. package/dist/streams/layout/element-views/cmp.short-video-stream-element.svelte.d.ts +4 -0
  122. package/dist/streams/layout/element-views/cmp.stream-element.svelte +2 -2
  123. package/dist/streams/layout/element-views/cmp.text-ref-stream-element.svelte +7 -3
  124. package/dist/streams/layout/element-views/cmp.text-ref-stream-element.svelte.d.ts +2 -0
  125. package/dist/streams/layout/element-views/cmp.text-stream-element.svelte +7 -3
  126. package/dist/streams/layout/element-views/cmp.text-stream-element.svelte.d.ts +2 -0
  127. package/dist/streams/layout/element-views/price-element-view.svelte +2 -2
  128. package/dist/streams/layout/element-views/price-stream-element-localization.d.ts +1 -1
  129. package/dist/streams/layout/element-views/price-stream-element-localization.js +2 -2
  130. package/dist/streams/layout/models/mapper.js +2 -0
  131. package/dist/streams/stream-card/cmp.stream-card.svelte +5 -5
  132. package/dist/streams/streams-player/index.d.ts +21 -2
  133. package/dist/streams/streams-player/index.js +49 -24
  134. package/dist/streams/streams-player/stream-overview.svelte +6 -96
  135. package/dist/streams/streams-player/stream-overview.svelte.d.ts +0 -4
  136. package/dist/streams/streams-player/stream-player-localization.d.ts +0 -1
  137. package/dist/streams/streams-player/stream-player-localization.js +0 -6
  138. package/dist/streams/streams-player/streams-player-buffer.svelte.d.ts +1 -3
  139. package/dist/streams/streams-player/streams-player-buffer.svelte.js +2 -2
  140. package/dist/streams/streams-player/streams-player-view.svelte +25 -23
  141. package/dist/streams/streams-player/streams-player-view.svelte.d.ts +1 -5
  142. package/dist/streams/streams-player/types.d.ts +18 -8
  143. package/dist/ui/icon/cmp.icon.svelte +3 -2
  144. package/dist/ui/line-clamp/cmp.line-clamp-auto.svelte +119 -0
  145. package/dist/ui/line-clamp/cmp.line-clamp-auto.svelte.d.ts +10 -0
  146. package/dist/ui/line-clamp/cmp.line-clamp.svelte +44 -72
  147. package/dist/ui/line-clamp/cmp.line-clamp.svelte.d.ts +3 -4
  148. package/dist/ui/line-clamp/index.d.ts +1 -0
  149. package/dist/ui/line-clamp/index.js +1 -0
  150. package/dist/ui/player/button/cmp.mobile-player-buttons-group.svelte +44 -0
  151. package/dist/ui/player/button/cmp.mobile-player-buttons-group.svelte.d.ts +7 -0
  152. package/dist/ui/player/button/cmp.player-button.svelte +16 -5
  153. package/dist/ui/player/button/cmp.player-button.svelte.d.ts +3 -0
  154. package/dist/ui/player/button/cmp.player-buttons-group.svelte +27 -8
  155. package/dist/ui/player/button/cmp.player-buttons-group.svelte.d.ts +2 -0
  156. package/dist/ui/player/button/index.d.ts +1 -0
  157. package/dist/ui/player/button/index.js +1 -0
  158. package/dist/ui/player/close-orchestrator/close-orchestrator.svelte.d.ts +18 -0
  159. package/dist/ui/player/close-orchestrator/close-orchestrator.svelte.js +58 -0
  160. package/dist/ui/player/close-orchestrator/index.d.ts +2 -0
  161. package/dist/ui/player/close-orchestrator/index.js +1 -0
  162. package/dist/ui/player/close-orchestrator/types.d.ts +9 -0
  163. package/dist/ui/player/close-orchestrator/types.js +1 -0
  164. package/dist/ui/player/colors/index.d.ts +1 -0
  165. package/dist/ui/player/colors/index.js +1 -0
  166. package/dist/ui/player/colors/player-colors.d.ts +11 -0
  167. package/dist/ui/player/colors/player-colors.js +1 -0
  168. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.d.ts +2 -6
  169. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.js +11 -11
  170. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.d.ts +2 -3
  171. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.js +5 -5
  172. package/dist/ui/player/providers/default-feed-player-buffer.svelte.d.ts +3 -4
  173. package/dist/ui/player/providers/default-feed-player-buffer.svelte.js +16 -9
  174. package/dist/ui/player/providers/service.d.ts +2 -0
  175. package/dist/ui/player/providers/service.js +13 -0
  176. package/dist/ui/player/providers/types.d.ts +1 -0
  177. package/dist/ui/with-background/cmp.with-background.svelte +86 -0
  178. package/dist/ui/with-background/cmp.with-background.svelte.d.ts +10 -0
  179. package/dist/ui/with-background/index.d.ts +1 -0
  180. package/dist/ui/with-background/index.js +1 -0
  181. package/package.json +5 -1
  182. package/dist/content-player/content-player-localization.d.ts +0 -6
  183. package/dist/content-player/content-player-localization.js +0 -15
  184. package/dist/content-player/fade-mixins.scss +0 -12
  185. package/dist/content-player/header.svelte +0 -137
  186. package/dist/content-player/header.svelte.d.ts +0 -32
  187. package/dist/media-center/media-center/desktop-categories-selector.svelte +0 -132
  188. package/dist/media-center/media-center/desktop-categories-selector.svelte.d.ts +0 -12
  189. package/dist/media-center/media-center/discover-panel-handler.svelte.d.ts +0 -32
  190. package/dist/media-center/media-center/discover-panel-handler.svelte.js +0 -101
  191. package/dist/media-center/media-center/discover-panel.svelte +0 -133
  192. package/dist/media-center/media-center/discover-panel.svelte.d.ts +0 -15
  193. package/dist/media-center/media-center/media-center-handler.svelte.d.ts +0 -28
  194. package/dist/media-center/media-center/media-center-handler.svelte.js +0 -73
  195. package/dist/media-center/media-center/media-center-localization.d.ts +0 -10
  196. package/dist/media-center/media-center/media-center-localization.js +0 -39
  197. package/dist/media-center/media-center/mobile-controls-panel.svelte +0 -268
  198. package/dist/media-center/media-center/mobile-controls-panel.svelte.d.ts +0 -20
  199. package/dist/media-center/media-center/post-player-provider-generator.d.ts +0 -8
  200. package/dist/media-center/media-center/post-player-provider-generator.js +0 -32
  201. package/dist/media-center/media-center/streams-player-provider-generator.d.ts +0 -8
  202. package/dist/media-center/media-center/streams-player-provider-generator.js +0 -36
  203. package/dist/media-center/model/types.d.ts +0 -16
  204. /package/dist/media-center/{model → media-center/feed}/types.js +0 -0
@@ -7,214 +7,90 @@
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { horizontalWheelScroll } from '../../core/actions';
11
10
  import { Utils } from '../../core/utils';
12
11
  import { default as PostsPlayerView } from '../../posts/posts-player/posts-player-view.svelte';
13
12
  import { default as StreamsPlayerView } from '../../streams/streams-player/streams-player-view.svelte';
14
- import { Icon } from '../../ui/icon';
15
13
  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';
14
+ import { WithBackground } from '../../ui/with-background';
15
+ import { DiscoverPanel } from './discover';
16
+ import { MediaCenterHeader, MediaCenterFooter, MediaCenterHeaderMobile } from './header-footer';
17
+ import { MediaCenterContext } from './media-center-context.svelte';
18
+ import { Menu } from './menu';
19
+ import { StreamsInCategoryPanel } from './streams-in-category';
30
20
  import { fade } from 'svelte/transition';
31
- const SCROLL_MASK_OFFSET = 32;
32
- 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
37
- };
38
- const handler = new MediaCenterHandler(config);
39
- const discoverHandler = new DiscoverPanelHandler(config);
40
- const streamsInCategoryHandler = new StreamsInCategoryPanelHandler(config);
41
- let mediaCenterMode = $state(playerProps.mode);
21
+ let { config, modeProps, settings, closeOrchestrator } = $props();
22
+ const context = new MediaCenterContext({
23
+ config,
24
+ closeOrchestrator,
25
+ settings,
26
+ on: {
27
+ initialized: (instance) => {
28
+ switch (modeProps.mode) {
29
+ case 'posts':
30
+ instance.playPostsFeed({
31
+ dataProvider: modeProps.props.dataProvider,
32
+ onPostActivated: modeProps.props.onPostActivated
33
+ });
34
+ break;
35
+ case 'streams':
36
+ instance.playStreamsFeed({
37
+ dataProvider: modeProps.props.dataProvider,
38
+ onStreamActivated: modeProps.props.onStreamActivated
39
+ });
40
+ break;
41
+ case 'discover':
42
+ instance.activateDiscover({ categoryId: null });
43
+ break;
44
+ default:
45
+ Utils.assertUnreachable(modeProps);
46
+ }
47
+ },
48
+ failed: () => {
49
+ console.error('Media Center initialization failed');
50
+ closeOrchestrator.requestClose();
51
+ }
52
+ }
53
+ });
42
54
  let headerHeight = $state(0);
43
- let computedPlayerProps = $state.raw(playerProps);
44
55
  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);
49
56
  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) {
53
- return;
54
- }
55
- hideMobileControlsPanel();
56
- switch (mediaCenterMode) {
57
- case 'posts':
58
- if (handler.selectedCategoryId === categoryId) {
59
- discoverHandler.deactivate();
57
+ switch (context.mediaCenterMode) {
58
+ case 'feed':
59
+ if (!context.feedPlayerProps) {
60
60
  return;
61
61
  }
62
- handler.selectedCategoryId = categoryId;
63
- computedPlayerProps = {
64
- 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)
66
- };
67
- discoverHandler.deactivate();
68
- break;
69
- case 'stream':
70
- if (handler.selectedCategoryId === categoryId) {
71
- discoverHandler.deactivate();
72
- streamsInCategoryHandler.deactivate();
73
- handler.selectedCategoryId = null;
74
- return;
62
+ switch (context.feedPlayerProps.type) {
63
+ case 'posts':
64
+ if (context.categoriesHandler.selectedCategoryId === categoryId) {
65
+ return;
66
+ }
67
+ context.playPostsFeed({ filter: { categoryId } });
68
+ break;
69
+ case 'streams':
70
+ context.tryActivateStreamsInCategory(categoryId);
71
+ return;
72
+ default:
73
+ Utils.assertUnreachable(context.feedPlayerProps);
75
74
  }
76
- handler.selectedCategoryId = categoryId;
77
- discoverHandler.deactivate();
78
- streamsInCategoryHandler.activate(selectedCategoryData);
75
+ break;
76
+ case 'discover':
77
+ context.activateDiscover({ categoryId });
79
78
  break;
80
79
  default:
81
- Utils.assertUnreachable(mediaCenterMode);
82
- }
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
- });
80
+ Utils.assertUnreachable(context.mediaCenterMode);
128
81
  }
129
82
  });
130
83
  const activateSelectedShortVideoPlayer = (shortVideo) => {
131
- var _a, _b;
132
- if (!config) {
133
- return;
134
- }
135
- mediaCenterMode = 'posts';
136
- computedPlayerProps = {
137
- 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)
139
- };
140
- handler.selectedCategoryId = null;
141
- discoverHandler.deactivate();
142
- streamsInCategoryHandler.deactivate();
84
+ context.playPostsFeed({ filter: { prefetchedItems: [shortVideo] } });
143
85
  };
144
86
  const activateSelectedStreamPlayer = (stream) => {
145
- var _a, _b;
146
- if (!config) {
147
- return;
148
- }
149
- mediaCenterMode = 'stream';
150
- 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)
153
- };
154
- handler.selectedCategoryId = null;
155
- discoverHandler.deactivate();
156
- streamsInCategoryHandler.deactivate();
87
+ context.playStreamsFeed({ filter: { prefetchedStreams: [stream] } });
157
88
  };
158
89
  const activateSelectedStreamOfCategoryPlayer = (id, prefetchedStreams, categoryId) => {
159
- var _a, _b;
160
- if (!config) {
161
- return;
162
- }
163
- mediaCenterMode = 'stream';
164
- 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)
167
- };
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;
184
- };
185
- const hideMobileControlsPanel = () => {
186
- mobileControlsPanelActive = false;
90
+ context.playStreamsFeed({ filter: { categoryId, prefetchedStreams, initialStreamId: id } });
187
91
  };
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;
92
+ const onHeaderHeightChanged = (height) => {
93
+ headerHeight = height;
218
94
  };
219
95
  const onWidthAnchorMounted = (node) => {
220
96
  const resizeObserver = new ResizeObserver(() => {
@@ -227,113 +103,122 @@ const onWidthAnchorMounted = (node) => {
227
103
  }
228
104
  };
229
105
  };
106
+ const swipeToOpen = (node) => {
107
+ let startX = 0;
108
+ let startY = 0;
109
+ let isTracking = false;
110
+ let hasOpened = false;
111
+ let threshold = 60;
112
+ const MIN_DISTANCE = 10;
113
+ function handleTouchStart(e) {
114
+ if (e.touches.length !== 1) {
115
+ return;
116
+ }
117
+ const touch = e.touches[0];
118
+ startX = touch.clientX;
119
+ startY = touch.clientY;
120
+ isTracking = true;
121
+ hasOpened = false;
122
+ }
123
+ function handleTouchMove(e) {
124
+ if (!isTracking || hasOpened) {
125
+ return;
126
+ }
127
+ const touch = e.touches[0];
128
+ const dx = touch.clientX - startX;
129
+ const dy = touch.clientY - startY;
130
+ if (Math.abs(dx) < MIN_DISTANCE && Math.abs(dy) < MIN_DISTANCE) {
131
+ return;
132
+ }
133
+ if (Math.abs(dy) > Math.abs(dx)) {
134
+ isTracking = false;
135
+ return;
136
+ }
137
+ if (dx < 0) {
138
+ isTracking = false;
139
+ return;
140
+ }
141
+ if (dx > threshold) {
142
+ hasOpened = true;
143
+ context.showMenu();
144
+ }
145
+ }
146
+ function handleTouchEnd() {
147
+ isTracking = false;
148
+ }
149
+ node.addEventListener('touchstart', handleTouchStart, { passive: true });
150
+ node.addEventListener('touchmove', handleTouchMove, { passive: true });
151
+ node.addEventListener('touchend', handleTouchEnd);
152
+ return {
153
+ destroy() {
154
+ node.removeEventListener('touchstart', handleTouchStart);
155
+ node.removeEventListener('touchmove', handleTouchMove);
156
+ node.removeEventListener('touchend', handleTouchEnd);
157
+ }
158
+ };
159
+ };
230
160
  </script>
231
161
 
232
- {#if handler.initializing}
162
+ {#if context.initializing}
233
163
  <Loading positionFixedCenter={true} timeout={600} />
164
+ {:else if !context.initialized}
165
+ Not initialized placeholder
234
166
  {:else}
235
- {#snippet controlsPanel()}
236
- {#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>
274
- {:else}
275
- <div class="media-center-mobile-controls-trigger">
276
- <PlayerButton icon={IconLineHorizontal3} on={{ click: showMobileControlsPanel }} />
277
- </div>
278
- {/if}
279
- {/snippet}
280
- {#if computedPlayerProps.mode === 'posts'}
281
- <PostsPlayerView
282
- {...computedPlayerProps.props}
283
- mediaCenterData={{
284
- controlsPanel: handler.categories.length ? controlsPanel : undefined,
285
- playerLogo: handler.logo,
286
- overlayIsActive: overlayActivated,
287
- callbacks: { onHeaderHeightChanged, onExtraActionsForMobileControlsPanelDetermined }
288
- }} />
289
- {:else if computedPlayerProps.mode === 'stream'}
290
- <StreamsPlayerView
291
- {...computedPlayerProps.props}
292
- mediaCenterData={{
293
- controlsPanel: handler.categories.length ? controlsPanel : undefined,
294
- playerLogo: handler.logo,
295
- overlayIsActive: overlayActivated,
296
- callbacks: { onHeaderHeightChanged, onExtraActionsForMobileControlsPanelDetermined }
297
- }} />
298
- {/if}
299
- {#if discoverHandler.loading || streamsInCategoryHandler.loading}
300
- <Loading positionFixedCenter={true} timeout={600} />
301
- {/if}
167
+ <WithBackground {...context.backgroundWrapperProps}>
168
+ <div class="media-center" use:onWidthAnchorMounted>
169
+ {#if !isMobileView}
170
+ <MediaCenterHeader context={context} locale={settings?.locale} on={{ headerHeightChanged: onHeaderHeightChanged }} />
171
+ {:else}
172
+ <MediaCenterHeaderMobile context={context} on={{ headerHeightChanged: onHeaderHeightChanged }} />
173
+ {/if}
302
174
 
303
- {#if discoverHandler.active}
304
- <div class="media-center-overlay" style={`top:${headerHeight}px`} transition:fade={{ duration: 300 }}>
305
- <DiscoverPanel
306
- handler={discoverHandler}
307
- localization={localization}
308
- on={{
309
- shortVideoSelected: (shortVideo) => activateSelectedShortVideoPlayer(shortVideo),
310
- streamSelected: (stream) => activateSelectedStreamPlayer(stream)
311
- }} />
312
- </div>
313
- {/if}
175
+ <div class="media-center__content-container">
176
+ {#if context.mediaCenterMode === 'feed' && context.feedPlayerProps}
177
+ <div class="media-center__content" class:media-center__content--faded={context.overlayIsActive} transition:fade={{ duration: 300 }}>
178
+ {#if context.feedPlayerProps.type === 'posts'}
179
+ <PostsPlayerView {...context.feedPlayerProps.props} />
180
+ {:else if context.feedPlayerProps.type === 'streams'}
181
+ <StreamsPlayerView {...context.feedPlayerProps.props} />
182
+ {/if}
183
+ </div>
184
+ {:else if context.mediaCenterMode === 'discover'}
185
+ <div class="media-center__content" transition:fade={{ duration: 300 }}>
186
+ <DiscoverPanel
187
+ context={context}
188
+ locale={settings?.locale}
189
+ on={{
190
+ shortVideoSelected: (shortVideo) => activateSelectedShortVideoPlayer(shortVideo),
191
+ streamSelected: (stream) => activateSelectedStreamPlayer(stream)
192
+ }} />
193
+ </div>
194
+ {/if}
195
+ </div>
196
+ {#if context.loading}
197
+ <Loading positionFixedCenter={true} timeout={600} />
198
+ {/if}
314
199
 
315
- {#if streamsInCategoryHandler.active}
316
- <div class="media-center-overlay" style={`top:${headerHeight}px`} transition:fade={{ duration: 300 }}>
317
- <StreamsInCategoryPanel
318
- handler={streamsInCategoryHandler}
319
- on={{ streamSelected: (id, categoryId, streams) => activateSelectedStreamOfCategoryPlayer(id, streams, categoryId) }} />
320
- </div>
321
- {/if}
200
+ {#if context.streamsInCategoryHandler.active}
201
+ <div class="media-center-overlay" class:media-center-overlay--mobile={isMobileView} style={`top:${headerHeight}px`} transition:fade={{ duration: 300 }}>
202
+ <StreamsInCategoryPanel
203
+ handler={context.streamsInCategoryHandler}
204
+ on={{ streamSelected: (id, categoryId, streams) => activateSelectedStreamOfCategoryPlayer(id, streams, categoryId) }} />
205
+ </div>
206
+ {/if}
322
207
 
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 }} />
333
- </div>
208
+ {#if context.menuActive}
209
+ <div class="menu-overlay" class:menu-overlay--mobile={isMobileView} onclick={context.hideMenu} onkeydown={() => {}} role="none">
210
+ <div class="menu-overlay__panel">
211
+ <Menu context={context} locale={settings?.locale} on={{ categorySelected: selectCategory, streamSelected: activateSelectedStreamPlayer }} />
212
+ </div>
213
+ </div>
214
+ {:else}
215
+ <div class="menu-swipe-area" use:swipeToOpen>&nbsp;</div>
216
+ {/if}
217
+ {#if isMobileView}
218
+ <MediaCenterFooter context={context} />
219
+ {/if}
334
220
  </div>
335
- {/if}
336
- <div class="media-center-width-anchor" use:onWidthAnchorMounted></div>
221
+ </WithBackground>
337
222
  {/if}
338
223
 
339
224
  <style>@keyframes fadeIn {
@@ -347,111 +232,32 @@ const onWidthAnchorMounted = (node) => {
347
232
  opacity: 1;
348
233
  }
349
234
  }
350
- .media-center-controls-panel {
235
+ .media-center {
236
+ width: 100%;
237
+ min-width: 100%;
351
238
  max-width: 100%;
239
+ height: 100%;
240
+ min-height: 100%;
241
+ max-height: 100%;
352
242
  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;
243
+ flex-direction: column;
365
244
  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
245
  }
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 {
246
+ .media-center__content-container {
247
+ flex: 1;
248
+ min-height: 0;
392
249
  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
250
  }
421
- .media-center-controls-panel__button[data-child-name]:not([data-child-name=""])::after {
422
- content: attr(data-child-name);
251
+ .media-center__content {
423
252
  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;
253
+ inset: 0;
254
+ min-height: 0;
255
+ display: flex;
256
+ flex-direction: column;
446
257
  }
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;
258
+ .media-center__content--faded {
259
+ opacity: 0;
260
+ transition: opacity 0.3s ease-in-out;
455
261
  }
456
262
 
457
263
  .media-center-overlay {
@@ -484,28 +290,37 @@ const onWidthAnchorMounted = (node) => {
484
290
  scrollbar-width: thin;
485
291
  }
486
292
  }
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
293
 
500
- .mobile-controls-panel-overlay {
294
+ .menu-overlay {
501
295
  display: block;
502
296
  position: absolute;
503
297
  inset: 0;
298
+ right: auto;
504
299
  container-type: inline-size;
505
300
  z-index: 1;
506
301
  }
507
- .mobile-controls-panel-overlay__panel {
508
- width: 80%;
302
+ .menu-overlay--mobile {
303
+ right: 0;
304
+ bottom: 6.25rem;
305
+ }
306
+ .menu-overlay__panel {
307
+ width: 17.5rem;
509
308
  height: 100%;
510
309
  max-height: 100%;
310
+ }
311
+
312
+ .menu-swipe-area {
313
+ display: none;
314
+ position: absolute;
315
+ top: 0;
316
+ left: 0;
317
+ width: 1.875rem;
318
+ height: 100%;
319
+ z-index: 1;
320
+ /* Set 'container-type: inline-size;' to reference container*/
321
+ }
322
+ @container (width < 576px) {
323
+ .menu-swipe-area {
324
+ display: block;
325
+ }
511
326
  }</style>