@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
@@ -0,0 +1,134 @@
1
+ import { DiscoverViewHandler } from './discover';
2
+ import { FeedHandler } from './feed';
3
+ import { CategoriesHandler, MediaCenterSettingsHandler } from './handlers';
4
+ import { PopularStreamsPanelHandler } from './menu';
5
+ import { StreamsInCategoryPanelHandler } from './streams-in-category';
6
+ export class MediaCenterContext {
7
+ initializing = $state(true);
8
+ initialized = $state(false);
9
+ mediaCenterMode = $derived.by(() => {
10
+ if (this.discoverHandler.activated) {
11
+ return 'discover';
12
+ }
13
+ return 'feed';
14
+ });
15
+ menuActive = $state(false);
16
+ categoriesHandler = new CategoriesHandler();
17
+ feedHandler;
18
+ discoverHandler;
19
+ popularStreamsHandler;
20
+ streamsInCategoryHandler;
21
+ categoryFollowingHandler = $state.raw(null);
22
+ settingsHandler;
23
+ closeOrchestrator;
24
+ _mediaCenterConfig = $state.raw(null);
25
+ constructor(data) {
26
+ const { config, closeOrchestrator, settings, on } = data;
27
+ this.closeOrchestrator = closeOrchestrator;
28
+ this.closeOrchestrator.setCloseTriggerAttached(true);
29
+ this.settingsHandler = new MediaCenterSettingsHandler(settings);
30
+ this.feedHandler = new FeedHandler({ config, mediaCenterSettingsHandler: this.settingsHandler, closeOrchestrator });
31
+ this.discoverHandler = new DiscoverViewHandler(config);
32
+ this.popularStreamsHandler = new PopularStreamsPanelHandler(config);
33
+ this.streamsInCategoryHandler = new StreamsInCategoryPanelHandler(config);
34
+ this.categoryFollowingHandler = config.handlers?.categoriesFollowingHandler ?? null;
35
+ this.init(config, on);
36
+ }
37
+ get targetData() {
38
+ return this._mediaCenterConfig?.targetData || null;
39
+ }
40
+ get playerColors() {
41
+ return this._mediaCenterConfig?.playerColors || null;
42
+ }
43
+ get loading() {
44
+ return this.discoverHandler.loading || this.streamsInCategoryHandler.loading;
45
+ }
46
+ get overlayIsActive() {
47
+ return this.streamsInCategoryHandler.activated;
48
+ }
49
+ get backgroundWrapperProps() {
50
+ return this.settingsHandler.backgroundWrapperProps;
51
+ }
52
+ get feedPlayerProps() {
53
+ return this.feedHandler.feedPlayerProps;
54
+ }
55
+ toggleMenu = () => {
56
+ if (this.menuActive) {
57
+ this.hideMenu();
58
+ }
59
+ else {
60
+ this.showMenu();
61
+ }
62
+ };
63
+ showMenu = () => {
64
+ this.menuActive = true;
65
+ this.popularStreamsHandler.init();
66
+ };
67
+ hideMenu = () => {
68
+ this.menuActive = false;
69
+ };
70
+ activateDiscover = async (options) => {
71
+ this.settingsHandler.updateBackgroundImageUrl('not-applicable');
72
+ this.hideMenu();
73
+ this.feedHandler.deactivate();
74
+ this.streamsInCategoryHandler.deactivate();
75
+ this.categoriesHandler.selectedCategoryId = options.categoryId;
76
+ const childCategories = this.categoriesHandler.allCategories.filter((c) => c.parentId === this.categoriesHandler.selectedCategoryId);
77
+ await this.discoverHandler.activate({
78
+ activeCategoryId: this.categoriesHandler.selectedCategoryId,
79
+ childCategories: childCategories.map((c) => ({ id: c.id, name: c.name }))
80
+ });
81
+ };
82
+ playPostsFeed = async (options) => {
83
+ this.deactivateOtherThanFeed();
84
+ this.categoriesHandler.selectedCategoryId = options.filter?.categoryId ?? null;
85
+ this.feedHandler.activatePostsFeed(options);
86
+ };
87
+ playStreamsFeed = async (options) => {
88
+ this.deactivateOtherThanFeed();
89
+ this.categoriesHandler.selectedCategoryId = options.filter?.categoryId ?? null;
90
+ this.feedHandler.activateStreamsFeed(options);
91
+ };
92
+ playRootFeed = async () => {
93
+ this.deactivateOtherThanFeed();
94
+ this.categoriesHandler.selectedCategoryId = null;
95
+ if (this.feedPlayerProps?.type === 'streams') {
96
+ this.feedHandler.activateStreamsFeed({});
97
+ }
98
+ else {
99
+ this.feedHandler.activatePostsFeed({});
100
+ }
101
+ };
102
+ tryActivateStreamsInCategory = async (categoryId) => {
103
+ const selectedCategoryData = this.categoriesHandler.getCategoryData(categoryId);
104
+ await this.streamsInCategoryHandler.activate(selectedCategoryData);
105
+ this.hideMenu();
106
+ this.feedHandler.deactivate();
107
+ this.discoverHandler.deactivate();
108
+ this.categoriesHandler.selectedCategoryId = categoryId;
109
+ };
110
+ deactivateOtherThanFeed = () => {
111
+ this.hideMenu();
112
+ this.discoverHandler.deactivate();
113
+ this.streamsInCategoryHandler.deactivate();
114
+ };
115
+ init = async (config, on) => {
116
+ try {
117
+ this._mediaCenterConfig = await config.getConfig();
118
+ if (!this._mediaCenterConfig) {
119
+ on.failed();
120
+ return;
121
+ }
122
+ this.categoriesHandler.init(this._mediaCenterConfig.contentCategories);
123
+ this.settingsHandler.updatePlayerColors(this._mediaCenterConfig.playerColors);
124
+ on.initialized(this);
125
+ this.initialized = true;
126
+ }
127
+ catch {
128
+ on.failed();
129
+ }
130
+ finally {
131
+ this.initializing = false;
132
+ }
133
+ };
134
+ }
@@ -7,7 +7,7 @@
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { Icon } from '../../ui/icon';
10
+ import { Icon } from '../../../ui/icon';
11
11
  import IconStarFilled from '@fluentui/svg-icons/icons/star_20_filled.svg?raw';
12
12
  import IconStar from '@fluentui/svg-icons/icons/star_20_regular.svg?raw';
13
13
  import { onMount } from 'svelte';
@@ -32,7 +32,8 @@ const handleToggleFollow = (e) => __awaiter(void 0, void 0, void 0, function* ()
32
32
  });
33
33
  </script>
34
34
 
35
- {#if !followingHandler}
35
+ <!--Disabled following logic. for future references-->
36
+ {#if !followingHandler || true}
36
37
  {@render children()}
37
38
  {:else}
38
39
  <div class="desktop-category-following-wrapper" class:desktop-category-following-wrapper--inverted-orientation={invertedOrientation}>
@@ -1,8 +1,8 @@
1
- import type { IContentCategoryFollowingHandler } from '..';
1
+ import type { MediaCenterContext } from '../media-center-context.svelte';
2
2
  import { type Snippet } from 'svelte';
3
3
  type Props = {
4
4
  categoryId: string;
5
- followingHandler?: IContentCategoryFollowingHandler;
5
+ followingHandler?: MediaCenterContext['categoryFollowingHandler'];
6
6
  children: Snippet;
7
7
  invertedOrientation?: boolean;
8
8
  };
@@ -0,0 +1,2 @@
1
+ export { default as Menu } from './menu.svelte';
2
+ export { PopularStreamsPanelHandler } from './popular-streams-panel-handler.svelte';
@@ -0,0 +1,2 @@
1
+ export { default as Menu } from './menu.svelte';
2
+ export { PopularStreamsPanelHandler } from './popular-streams-panel-handler.svelte';
@@ -0,0 +1,10 @@
1
+ import { type Locale } from '../../../core/locale';
2
+ export declare class MenuLocalization {
3
+ interestsSectionTitle: string;
4
+ popularStreamsSectionTitle: string;
5
+ discoverLabel: string;
6
+ feedLabel: string;
7
+ membersLabel: (count: number) => string;
8
+ locale: Locale;
9
+ constructor(locale: Locale);
10
+ }
@@ -0,0 +1,39 @@
1
+ import {} from '../../../core/locale';
2
+ export class MenuLocalization {
3
+ interestsSectionTitle;
4
+ popularStreamsSectionTitle;
5
+ discoverLabel;
6
+ feedLabel;
7
+ membersLabel;
8
+ locale;
9
+ constructor(locale) {
10
+ this.interestsSectionTitle = loc.interestsSectionTitle[locale];
11
+ this.popularStreamsSectionTitle = loc.popularStreamsSectionTitle[locale];
12
+ this.discoverLabel = loc.discoverLabel[locale];
13
+ this.feedLabel = loc.feedLabel[locale];
14
+ this.membersLabel = loc.membersLabel[locale];
15
+ this.locale = locale;
16
+ }
17
+ }
18
+ const loc = {
19
+ popularStreamsSectionTitle: {
20
+ en: 'Popular Streams',
21
+ no: 'Populære Streams'
22
+ },
23
+ interestsSectionTitle: {
24
+ en: 'Interest Channels',
25
+ no: 'Interessekanaler'
26
+ },
27
+ discoverLabel: {
28
+ en: 'Discover',
29
+ no: 'Oppdag'
30
+ },
31
+ feedLabel: {
32
+ en: 'Feed',
33
+ no: 'Feed'
34
+ },
35
+ membersLabel: {
36
+ en: (count) => (count === 1 ? `Member` : `Members`),
37
+ no: (count) => (count === 1 ? `Medlem` : `Medlemmer`)
38
+ }
39
+ };
@@ -0,0 +1,353 @@
1
+ <script lang="ts">import { slideHorizontally } from '../../../core/transitions';
2
+ import { compactNumber } from '../../../core/utils/compact-number';
3
+ import { StreamCard } from '../../../streams/stream-card';
4
+ import { Icon } from '../../../ui/icon';
5
+ import { ImageRound } from '../../../ui/image';
6
+ import { LineClamp } from '../../../ui/line-clamp';
7
+ import { MomentsCircle } from '../moments';
8
+ import { default as ButtonWrapper } from './category-following-wrapper.svelte';
9
+ import { MenuLocalization } from './menu-localization';
10
+ import IconChevronDownFilled from '@fluentui/svg-icons/icons/chevron_down_20_filled.svg?raw';
11
+ import IconChevronRightFilled from '@fluentui/svg-icons/icons/chevron_right_20_filled.svg?raw';
12
+ import { slide } from 'svelte/transition';
13
+ let { context, locale = 'en', on } = $props();
14
+ const localization = $derived(new MenuLocalization(locale));
15
+ const target = $derived.by(() => context.targetData);
16
+ const generateCategoriesMap = () => {
17
+ const expanded = {};
18
+ context.categoriesHandler.categoriesGrouped.forEach((c) => {
19
+ const isSelfSelected = context.categoriesHandler.selectedCategoryId === c.id;
20
+ const hasSelectedChild = c.children.some((ch) => ch.id === context.categoriesHandler.selectedCategoryId);
21
+ expanded[c.id] = isSelfSelected || hasSelectedChild;
22
+ });
23
+ return expanded;
24
+ };
25
+ const categoriesExpandedMap = $state(generateCategoriesMap());
26
+ const handleCategoryExpaned = (e, categoryId) => {
27
+ e.stopPropagation();
28
+ categoriesExpandedMap[categoryId] = !categoriesExpandedMap[categoryId];
29
+ };
30
+ const styles = $derived.by(() => {
31
+ var _a;
32
+ const values = [];
33
+ if ((_a = context.playerColors) === null || _a === void 0 ? void 0 : _a.menuBackground) {
34
+ values.push(`--media-center-menu--background-color: ${context.playerColors.menuBackground}`);
35
+ }
36
+ return values.join(';');
37
+ });
38
+ </script>
39
+
40
+ <div class="media-center-menu" transition:slideHorizontally|local style={styles} onclick={(e) => e.stopPropagation()} onkeydown={() => {}} role="none">
41
+ {#if target}
42
+ <div class="media-center-target">
43
+ <div class="media-center-target__image">
44
+ <MomentsCircle context={context} />
45
+ </div>
46
+ <div class="media-center-target__info">
47
+ <div class="media-center-target__name">
48
+ <LineClamp maxLines={1} locale={locale}>
49
+ {target.name}
50
+ </LineClamp>
51
+ </div>
52
+ {#if target.membersCount}
53
+ <LineClamp maxLines={1} locale={locale}>
54
+ <div class="media-center-target__members">
55
+ <span class="media-center-target__members-count">
56
+ {compactNumber(target.membersCount, { locale: localization.locale })}
57
+ </span>
58
+ <span class="media-center-target__members-label">
59
+ {localization.membersLabel(target.membersCount)}
60
+ </span>
61
+ </div>
62
+ </LineClamp>
63
+ {/if}
64
+ </div>
65
+ </div>
66
+ {/if}
67
+ <div class="media-center-menu__content">
68
+ <div class="media-center-menu__section-title">
69
+ {localization.interestsSectionTitle}
70
+ </div>
71
+ <div class="media-center-menu__tree">
72
+ <div class="media-center-menu__tree-item">
73
+ <div class="selector-item">
74
+ <div class="selector-item__value">
75
+ <div
76
+ class="selector-item__text"
77
+ class:selector-item__text--active={!context.categoriesHandler.selectedCategoryId}
78
+ onclick={() => context.playRootFeed()}
79
+ onkeydown={() => {}}
80
+ role="button"
81
+ tabindex="0">
82
+ {context.mediaCenterMode === 'discover' ? localization.discoverLabel : localization.feedLabel}
83
+ </div>
84
+ </div>
85
+ </div>
86
+ </div>
87
+ {#each context.categoriesHandler.categoriesGrouped as category (category.id)}
88
+ <div class="media-center-menu__tree-item">
89
+ <div class="selector-item">
90
+ <div class="selector-item__value">
91
+ <div class="selector-item__image">
92
+ <ImageRound src={category.image} noBorders={true} />
93
+ </div>
94
+ <div
95
+ class="selector-item__text"
96
+ class:selector-item__text--active={context.categoriesHandler.selectedCategoryId === category.id}
97
+ onclick={() => on.categorySelected(category.id)}
98
+ onkeydown={() => {}}
99
+ role="button"
100
+ tabindex="0">
101
+ {category.name}
102
+ </div>
103
+ </div>
104
+ <ButtonWrapper categoryId={category.id} followingHandler={context.categoryFollowingHandler} invertedOrientation={true}>
105
+ <button
106
+ type="button"
107
+ class="selector-item__collapser"
108
+ class:selector-item__collapser--hidden={!category.children.length}
109
+ onclick={(e) => handleCategoryExpaned(e, category.id)}>
110
+ {#if categoriesExpandedMap[category.id]}
111
+ <Icon src={IconChevronDownFilled} />
112
+ {:else}
113
+ <Icon src={IconChevronRightFilled} />
114
+ {/if}
115
+ </button>
116
+ </ButtonWrapper>
117
+ </div>
118
+ {#if categoriesExpandedMap[category.id]}
119
+ <div class="media-center-menu__tree-item" transition:slide|local>
120
+ {#each category.children as subcategory (subcategory.id)}
121
+ <div class="selector-item selector-item--child">
122
+ <div class="selector-item__value">
123
+ <div class="selector-item__image">
124
+ <ImageRound src={subcategory.image} noBorders={true} />
125
+ </div>
126
+ <div
127
+ class="selector-item__text"
128
+ class:selector-item__text--active={context.categoriesHandler.selectedCategoryId === subcategory.id}
129
+ onclick={() => on.categorySelected(subcategory.id)}
130
+ onkeydown={() => {}}
131
+ role="button"
132
+ tabindex="0">
133
+ {subcategory.name}
134
+ </div>
135
+ </div>
136
+ <ButtonWrapper categoryId={subcategory.id} followingHandler={context.categoryFollowingHandler} invertedOrientation={true}>
137
+ <button type="button" class="selector-item__collapser selector-item__collapser--hidden">
138
+ <Icon src={IconChevronRightFilled} />
139
+ </button>
140
+ </ButtonWrapper>
141
+ </div>
142
+ {/each}
143
+ </div>
144
+ {/if}
145
+ </div>
146
+ {/each}
147
+ </div>
148
+
149
+ {#if context.popularStreamsHandler.streamSectionItems.length > 0}
150
+ <div class="media-center-menu__popular-streams-section">
151
+ <div class="media-center-menu__section-title">
152
+ {localization.popularStreamsSectionTitle}
153
+ </div>
154
+ <div class="media-center-menu__popular-streams">
155
+ {#each context.popularStreamsHandler.streamSectionItems as item (item.id)}
156
+ <StreamCard stream={item} on={{ click: () => on.streamSelected(item) }}></StreamCard>
157
+ {/each}
158
+ </div>
159
+ </div>
160
+ {/if}
161
+ </div>
162
+ </div>
163
+
164
+ <style>@keyframes fadeIn {
165
+ 0% {
166
+ opacity: 1;
167
+ }
168
+ 50% {
169
+ opacity: 0.4;
170
+ }
171
+ 100% {
172
+ opacity: 1;
173
+ }
174
+ }
175
+ .media-center-menu {
176
+ --_media-center-menu--background-color: var(--media-center-menu--background-color, rgb(from #000000 r g b / 95%));
177
+ background: var(--_media-center-menu--background-color);
178
+ height: 100%;
179
+ min-height: 100%;
180
+ max-height: 100%;
181
+ width: 100%;
182
+ min-width: 100%;
183
+ max-width: 100%;
184
+ display: flex;
185
+ gap: 1.25rem;
186
+ flex-direction: column;
187
+ min-height: 0;
188
+ padding: 0.9375rem 1.25rem;
189
+ padding-right: 0.75rem;
190
+ border-radius: 0 1rem 1rem 0;
191
+ }
192
+ .media-center-menu__content {
193
+ display: flex;
194
+ flex: 1;
195
+ gap: 1rem;
196
+ flex-direction: column;
197
+ overflow: hidden;
198
+ overflow-y: auto;
199
+ overscroll-behavior: contain;
200
+ --_cross-browser-scrollbar--thumb-color: transparent;
201
+ --_cross-browser-scrollbar--track-color: transparent;
202
+ }
203
+ .media-center-menu__content:hover {
204
+ --_cross-browser-scrollbar--thumb-color: var(--scrollbar--thumb-color, #7d7d7d);
205
+ --_cross-browser-scrollbar--track-color: var(--scrollbar--track-color, transparent);
206
+ }
207
+ .media-center-menu__content::-webkit-scrollbar {
208
+ width: 6px;
209
+ height: 6px;
210
+ }
211
+ .media-center-menu__content::-webkit-scrollbar-track {
212
+ background: var(--_cross-browser-scrollbar--track-color);
213
+ border-radius: 100vw;
214
+ }
215
+ .media-center-menu__content::-webkit-scrollbar-thumb {
216
+ background: var(--_cross-browser-scrollbar--thumb-color);
217
+ border-radius: 100vw;
218
+ }
219
+ @supports (scrollbar-color: transparent transparent) {
220
+ .media-center-menu__content {
221
+ scrollbar-color: var(--_cross-browser-scrollbar--thumb-color) var(--_cross-browser-scrollbar--track-color);
222
+ scrollbar-width: thin;
223
+ }
224
+ }
225
+ .media-center-menu__section-title {
226
+ font-size: 1.125rem;
227
+ line-height: 1.75rem;
228
+ font-weight: 500;
229
+ color: #ffffff;
230
+ }
231
+ .media-center-menu__tree {
232
+ display: flex;
233
+ flex-direction: column;
234
+ flex: 1;
235
+ gap: 0.5rem;
236
+ }
237
+ .media-center-menu__tree-item {
238
+ display: flex;
239
+ flex-direction: column;
240
+ gap: 0.25rem;
241
+ }
242
+ .media-center-menu__popular-streams-section {
243
+ display: flex;
244
+ margin-top: auto;
245
+ flex-direction: column;
246
+ gap: 1rem;
247
+ padding-top: 1.25rem;
248
+ padding-right: 0.5rem;
249
+ }
250
+ .media-center-menu__popular-streams {
251
+ display: grid;
252
+ gap: 1rem;
253
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
254
+ }
255
+
256
+ .selector-item {
257
+ display: flex;
258
+ -webkit-user-drag: none;
259
+ user-select: none;
260
+ height: 2.25rem;
261
+ --_selector-item--text--font-size: 0.9375rem;
262
+ --_selector-item--image--size: 1.5rem;
263
+ }
264
+ .selector-item :global([contenteditable]) {
265
+ user-select: text;
266
+ }
267
+ .selector-item--child {
268
+ height: 2.125rem;
269
+ padding-left: 1.25rem;
270
+ --_selector-item--text--font-size: 0.875rem;
271
+ --_selector-item--image--size: 1.375rem;
272
+ }
273
+ .selector-item__value {
274
+ display: flex;
275
+ align-items: center;
276
+ flex: 1;
277
+ gap: 0.75rem;
278
+ min-width: 0;
279
+ cursor: pointer;
280
+ }
281
+ .selector-item__image {
282
+ width: var(--_selector-item--image--size);
283
+ min-width: var(--_selector-item--image--size);
284
+ max-width: var(--_selector-item--image--size);
285
+ height: var(--_selector-item--image--size);
286
+ min-height: var(--_selector-item--image--size);
287
+ max-height: var(--_selector-item--image--size);
288
+ }
289
+ .selector-item__text {
290
+ flex: 1;
291
+ max-width: 100%;
292
+ color: #ffffff;
293
+ font-size: var(--_selector-item--text--font-size);
294
+ font-weight: 400;
295
+ text-align: left;
296
+ text-overflow: ellipsis;
297
+ width: 100%;
298
+ white-space: nowrap;
299
+ overflow: hidden;
300
+ transition: text-shadow 120ms ease;
301
+ }
302
+ .selector-item__text:hover, .selector-item__text--active {
303
+ font-weight: 600;
304
+ letter-spacing: -0.5px;
305
+ }
306
+ .selector-item__collapser {
307
+ --icon--color: #ffffff;
308
+ --icon--size: 1rem;
309
+ padding: 0.5rem;
310
+ }
311
+ .selector-item__collapser--hidden {
312
+ visibility: hidden;
313
+ }
314
+
315
+ .media-center-target {
316
+ display: flex;
317
+ align-items: center;
318
+ gap: 0.9375rem;
319
+ }
320
+ .media-center-target__image {
321
+ width: 3.5rem;
322
+ min-width: 3.5rem;
323
+ max-width: 3.5rem;
324
+ height: 3.5rem;
325
+ min-height: 3.5rem;
326
+ max-height: 3.5rem;
327
+ }
328
+ .media-center-target__info {
329
+ display: flex;
330
+ flex-direction: column;
331
+ color: #ffffff;
332
+ }
333
+ .media-center-target__name {
334
+ font-size: 1.125rem;
335
+ line-height: 1.75rem;
336
+ font-weight: 600;
337
+ }
338
+ .media-center-target__members {
339
+ display: flex;
340
+ align-items: flex-end;
341
+ gap: 0.5rem;
342
+ }
343
+ .media-center-target__members-count {
344
+ font-size: 0.9375rem;
345
+ line-height: 1;
346
+ font-weight: 500;
347
+ }
348
+ .media-center-target__members-label {
349
+ font-size: 0.75rem;
350
+ line-height: 1;
351
+ font-weight: 400;
352
+ color: #d1d5db;
353
+ }</style>
@@ -0,0 +1,14 @@
1
+ import type { Locale } from '../../../core/locale';
2
+ import type { StreamPlayerModel } from '../../../streams/streams-player';
3
+ import type { MediaCenterContext } from '../media-center-context.svelte';
4
+ type Props = {
5
+ context: MediaCenterContext;
6
+ locale?: Locale;
7
+ on: {
8
+ categorySelected: (categoryId: string) => void;
9
+ streamSelected: (stream: StreamPlayerModel) => void;
10
+ };
11
+ };
12
+ declare const Menu: import("svelte").Component<Props, {}, "">;
13
+ type Menu = ReturnType<typeof Menu>;
14
+ export default Menu;
@@ -0,0 +1,10 @@
1
+ import type { IMediaCenterConfig } from '../..';
2
+ import type { StreamPlayerModel } from '../../../streams/streams-player/types';
3
+ export declare class PopularStreamsPanelHandler {
4
+ private readonly config;
5
+ private _state;
6
+ private _streams;
7
+ constructor(config: IMediaCenterConfig);
8
+ get streamSectionItems(): StreamPlayerModel[];
9
+ init: () => Promise<void>;
10
+ }
@@ -0,0 +1,23 @@
1
+ export class PopularStreamsPanelHandler {
2
+ config;
3
+ _state = $state('not-initialized');
4
+ _streams = $state.raw([]);
5
+ constructor(config) {
6
+ this.config = config;
7
+ }
8
+ get streamSectionItems() {
9
+ return this._streams;
10
+ }
11
+ init = async () => {
12
+ if (this._state === 'not-initialized') {
13
+ this._state = 'loading';
14
+ try {
15
+ const streamsResponse = await this.config.streamPlayer.getStreamsCursor({ filter: {}, limit: 2 });
16
+ this._streams = streamsResponse.items;
17
+ }
18
+ finally {
19
+ this._state = 'ready';
20
+ }
21
+ }
22
+ };
23
+ }
@@ -0,0 +1,41 @@
1
+ <script lang="ts">import { ImageRound } from '../../../ui/image';
2
+ let { context } = $props();
3
+ const styles = $derived.by(() => {
4
+ var _a;
5
+ const values = [];
6
+ if ((_a = context.playerColors) === null || _a === void 0 ? void 0 : _a.brand) {
7
+ values.push(`--moments-circle--brand-color: ${context.playerColors.brand}`);
8
+ }
9
+ return values.join(';');
10
+ });
11
+ </script>
12
+
13
+ <div class="moments-circle" style={styles}>
14
+ {#if context.targetData}
15
+ <ImageRound src={context.targetData.image} />
16
+ {/if}
17
+ </div>
18
+
19
+ <style>@keyframes fadeIn {
20
+ 0% {
21
+ opacity: 1;
22
+ }
23
+ 50% {
24
+ opacity: 0.4;
25
+ }
26
+ 100% {
27
+ opacity: 1;
28
+ }
29
+ }
30
+ .moments-circle {
31
+ --_moments-circle--brand-color: var(--moments-circle--brand-color, #00b8d8);
32
+ width: 6.25%rem;
33
+ min-width: 6.25%rem;
34
+ max-width: 6.25%rem;
35
+ height: 6.25%rem;
36
+ min-height: 6.25%rem;
37
+ max-height: 6.25%rem;
38
+ --image--rounded--inner--border-width: 1px;
39
+ --image--rounded--outer--border-color: var(--_moments-circle--brand-color);
40
+ --image--rounded--outer--border-width: 2px;
41
+ }</style>
@@ -0,0 +1,7 @@
1
+ import type { MediaCenterContext } from '../media-center-context.svelte';
2
+ type Props = {
3
+ context: MediaCenterContext;
4
+ };
5
+ declare const Cmp: import("svelte").Component<Props, {}, "">;
6
+ type Cmp = ReturnType<typeof Cmp>;
7
+ export default Cmp;
@@ -0,0 +1 @@
1
+ export { default as MomentsCircle } from './cmp.moments-circle.svelte';
@@ -0,0 +1 @@
1
+ export { default as MomentsCircle } from './cmp.moments-circle.svelte';