@streamscloud/embeddable 13.3.0 → 14.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 (145) hide show
  1. package/dist/external-api/data-providers/internal-media-center-data-provider.svelte.js +6 -6
  2. package/dist/external-api/data-providers/mocks/index.d.ts +5 -0
  3. package/dist/external-api/data-providers/mocks/index.js +5 -0
  4. package/dist/{media-center/categories-following → external-api/data-providers/mocks}/mock-categories-following-handler.svelte.d.ts +1 -1
  5. package/dist/external-api/data-providers/mocks/mock-content-management-handler.svelte.d.ts +29 -0
  6. package/dist/external-api/data-providers/mocks/mock-content-management-handler.svelte.js +61 -0
  7. package/dist/{media-center/membership → external-api/data-providers/mocks}/mock-membership-handler.svelte.d.ts +1 -1
  8. package/dist/{media-center/navigation → external-api/data-providers/mocks}/mock-navigation-handler.svelte.d.ts +1 -2
  9. package/dist/{posts/social-interactions → external-api/data-providers/mocks}/mock-post-social-interactions-handler.svelte.d.ts +1 -2
  10. package/dist/{posts/social-interactions → external-api/data-providers/mocks}/mock-post-social-interactions-handler.svelte.js +17 -6
  11. package/dist/external-api/data-providers/mocks/operations.generated.d.ts +115 -0
  12. package/dist/external-api/data-providers/mocks/operations.generated.js +377 -0
  13. package/dist/external-api/data-providers/mocks/operations.graphql +18 -0
  14. package/dist/media-center/config/types.d.ts +7 -1
  15. package/dist/media-center/content-management/index.d.ts +1 -0
  16. package/dist/media-center/content-management/index.js +1 -0
  17. package/dist/media-center/content-management/types.d.ts +24 -0
  18. package/dist/media-center/content-management/types.js +1 -0
  19. package/dist/media-center/index.d.ts +2 -1
  20. package/dist/media-center/media-center/cmp.media-center-proxy.svelte +2 -2
  21. package/dist/media-center/media-center/discover/data-loading.d.ts +3 -0
  22. package/dist/media-center/media-center/discover/data-loading.js +13 -2
  23. package/dist/media-center/media-center/discover/discover-view-handler.svelte.d.ts +23 -0
  24. package/dist/media-center/media-center/discover/discover-view-handler.svelte.js +88 -0
  25. package/dist/media-center/media-center/discover/discover-view.svelte +79 -14
  26. package/dist/media-center/media-center/discover/discover-view.svelte.d.ts +2 -2
  27. package/dist/media-center/media-center/footer/media-center-footer.svelte +1 -1
  28. package/dist/media-center/media-center/handlers/index.d.ts +1 -0
  29. package/dist/media-center/media-center/handlers/index.js +1 -0
  30. package/dist/media-center/media-center/handlers/media-center-content-handler.svelte.d.ts +62 -0
  31. package/dist/media-center/media-center/handlers/media-center-content-handler.svelte.js +144 -0
  32. package/dist/media-center/media-center/header/media-center-header-mobile.svelte +10 -7
  33. package/dist/media-center/media-center/header/media-center-header.svelte +1 -1
  34. package/dist/media-center/media-center/media-center-context.svelte.d.ts +3 -2
  35. package/dist/media-center/media-center/media-center-context.svelte.js +30 -11
  36. package/dist/media-center/media-center/media-center-view.svelte +31 -13
  37. package/dist/media-center/media-center/menu/menu.svelte +13 -2
  38. package/dist/media-center/media-center/menu/menu.svelte.d.ts +1 -0
  39. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.d.ts +7 -0
  40. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.js +23 -8
  41. package/dist/media-center/media-center/moments/moments-feed-handler.svelte.d.ts +19 -2
  42. package/dist/media-center/media-center/moments/moments-feed-handler.svelte.js +51 -6
  43. package/dist/media-center/media-center/moments/moments-state.svelte.d.ts +2 -0
  44. package/dist/media-center/media-center/moments/moments-state.svelte.js +16 -1
  45. package/dist/media-center/media-center/posts-feed/posts-feed-handler.svelte.d.ts +24 -4
  46. package/dist/media-center/media-center/posts-feed/posts-feed-handler.svelte.js +90 -9
  47. package/dist/media-center/media-center/streams-feed/streams-feed-handler.svelte.d.ts +18 -3
  48. package/dist/media-center/media-center/streams-feed/streams-feed-handler.svelte.js +64 -9
  49. package/dist/posts/controls/index.d.ts +2 -1
  50. package/dist/posts/controls/index.js +2 -1
  51. package/dist/posts/controls/post-actions-generator.svelte.d.ts +20 -0
  52. package/dist/posts/controls/post-actions-generator.svelte.js +27 -0
  53. package/dist/posts/controls/post-actions-handler.svelte.d.ts +26 -0
  54. package/dist/posts/controls/post-actions-handler.svelte.js +56 -0
  55. package/dist/posts/index.d.ts +1 -0
  56. package/dist/posts/model/types.d.ts +1 -0
  57. package/dist/posts/post-viewer/cmp.post-viewer.svelte +6 -7
  58. package/dist/posts/post-viewer/cmp.post-viewer.svelte.d.ts +2 -2
  59. package/dist/posts/post-viewer/mapper.js +1 -0
  60. package/dist/posts/posts-player/cmp.posts-player.svelte +2 -1
  61. package/dist/posts/posts-player/cmp.posts-player.svelte.d.ts +2 -0
  62. package/dist/posts/posts-player/index.d.ts +2 -0
  63. package/dist/posts/posts-player/index.js +2 -1
  64. package/dist/posts/posts-player/posts-player-proxy.svelte +2 -1
  65. package/dist/posts/posts-player/posts-player-proxy.svelte.d.ts +3 -1
  66. package/dist/posts/posts-player/posts-player-view.svelte +127 -32
  67. package/dist/posts/posts-player/types.d.ts +8 -0
  68. package/dist/posts/sharing/index.d.ts +1 -0
  69. package/dist/posts/sharing/index.js +1 -0
  70. package/dist/posts/sharing/types.d.ts +5 -0
  71. package/dist/posts/sharing/types.js +1 -0
  72. package/dist/posts/social-interactions/types.d.ts +0 -1
  73. package/dist/streams/controls/index.d.ts +1 -0
  74. package/dist/streams/controls/index.js +1 -0
  75. package/dist/streams/controls/stream-actions-generator.svelte.d.ts +31 -0
  76. package/dist/streams/controls/stream-actions-generator.svelte.js +42 -0
  77. package/dist/streams/index.d.ts +1 -0
  78. package/dist/streams/index.js +1 -0
  79. package/dist/streams/layout/cmp.layout.svelte +4 -1
  80. package/dist/streams/layout/cmp.layout.svelte.d.ts +1 -0
  81. package/dist/streams/layout/element-views/cmp.short-video-stream-element.svelte +1 -0
  82. package/dist/streams/layout/models/mapper.js +1 -0
  83. package/dist/streams/sharing/index.d.ts +1 -0
  84. package/dist/streams/sharing/index.js +1 -0
  85. package/dist/streams/sharing/types.d.ts +5 -0
  86. package/dist/streams/sharing/types.js +1 -0
  87. package/dist/streams/stream-page-viewer/cmp.stream-page-viewer.svelte +43 -1
  88. package/dist/streams/stream-page-viewer/cmp.stream-page-viewer.svelte.d.ts +9 -0
  89. package/dist/streams/streams-player/cmp.streams-player.svelte +2 -1
  90. package/dist/streams/streams-player/cmp.streams-player.svelte.d.ts +2 -0
  91. package/dist/streams/streams-player/index.d.ts +2 -0
  92. package/dist/streams/streams-player/index.js +2 -1
  93. package/dist/streams/streams-player/streams-player-proxy.svelte +2 -1
  94. package/dist/streams/streams-player/streams-player-proxy.svelte.d.ts +2 -0
  95. package/dist/streams/streams-player/streams-player-view.svelte +147 -34
  96. package/dist/streams/streams-player/types.d.ts +7 -0
  97. package/dist/ui/card-actions/card-action-container.d.ts +2 -0
  98. package/dist/ui/card-actions/card-action-container.js +17 -0
  99. package/dist/ui/card-actions/cmp.card-action.svelte +28 -0
  100. package/dist/ui/card-actions/cmp.card-action.svelte.d.ts +10 -0
  101. package/dist/ui/card-actions/cmp.card-actions.svelte +71 -0
  102. package/dist/ui/card-actions/cmp.card-actions.svelte.d.ts +9 -0
  103. package/dist/ui/card-actions/index.d.ts +4 -0
  104. package/dist/ui/card-actions/index.js +3 -0
  105. package/dist/ui/card-actions/types.d.ts +9 -0
  106. package/dist/ui/card-actions/types.js +1 -0
  107. package/dist/ui/player/button/cmp.responsive-player-buttons-group.svelte +53 -0
  108. package/dist/ui/player/button/cmp.responsive-player-buttons-group.svelte.d.ts +10 -0
  109. package/dist/ui/player/button/index.d.ts +1 -0
  110. package/dist/ui/player/button/index.js +1 -0
  111. package/dist/{content-player → ui/player/content-player}/cmp.content-player.svelte +7 -29
  112. package/dist/{content-player → ui/player/content-player}/cmp.content-player.svelte.d.ts +6 -1
  113. package/dist/ui/player/content-player/content-player-config.svelte.d.ts +29 -0
  114. package/dist/ui/player/content-player/content-player-config.svelte.js +27 -0
  115. package/dist/{content-player → ui/player/content-player}/content-player-settings.svelte.d.ts +3 -3
  116. package/dist/{content-player → ui/player/content-player}/content-player-settings.svelte.js +2 -2
  117. package/dist/{content-player → ui/player/content-player}/controls-and-attachments.svelte +18 -65
  118. package/dist/{content-player → ui/player/content-player}/controls-and-attachments.svelte.d.ts +6 -0
  119. package/dist/{content-player → ui/player/content-player}/overview-panel.svelte +1 -1
  120. package/dist/{content-player → ui/player/content-player}/ui-manager.svelte.d.ts +3 -2
  121. package/dist/{content-player → ui/player/content-player}/ui-manager.svelte.js +3 -2
  122. package/dist/ui/player/providers/chunks-player-buffer/player-chunk-item.svelte.d.ts +0 -2
  123. package/dist/ui/player/providers/chunks-player-buffer/player-chunk-item.svelte.js +1 -3
  124. package/dist/ui/player/providers/chunks-player-buffer/player-chunk.svelte.d.ts +3 -2
  125. package/dist/ui/player/providers/chunks-player-buffer/player-chunk.svelte.js +11 -5
  126. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.d.ts +3 -0
  127. package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.js +74 -8
  128. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.d.ts +2 -0
  129. package/dist/ui/player/providers/default-chunks-player-buffer.svelte.js +15 -4
  130. package/dist/ui/player/providers/default-feed-player-buffer.svelte.d.ts +1 -0
  131. package/dist/ui/player/providers/default-feed-player-buffer.svelte.js +27 -5
  132. package/dist/ui/player/providers/types.d.ts +1 -0
  133. package/dist/ui/shadow-dom/cmp.shadow-root.svelte +9 -4
  134. package/dist/ui/shadow-dom/colors.scss +2 -0
  135. package/package.json +6 -2
  136. package/dist/content-player/content-player-config.svelte.d.ts +0 -51
  137. package/dist/content-player/content-player-config.svelte.js +0 -48
  138. package/dist/posts/controls/cmp.controls.svelte +0 -120
  139. package/dist/posts/controls/cmp.controls.svelte.d.ts +0 -16
  140. /package/dist/{media-center/categories-following → external-api/data-providers/mocks}/mock-categories-following-handler.svelte.js +0 -0
  141. /package/dist/{media-center/membership → external-api/data-providers/mocks}/mock-membership-handler.svelte.js +0 -0
  142. /package/dist/{media-center/navigation → external-api/data-providers/mocks}/mock-navigation-handler.svelte.js +0 -0
  143. /package/dist/{content-player → ui/player/content-player}/index.d.ts +0 -0
  144. /package/dist/{content-player → ui/player/content-player}/index.js +0 -0
  145. /package/dist/{content-player → ui/player/content-player}/overview-panel.svelte.d.ts +0 -0
@@ -0,0 +1,17 @@
1
+ export const cardActionContainer = (node) => {
2
+ const handleHover = () => {
3
+ node.style.setProperty('--card-actions--opacity', '1');
4
+ };
5
+ const handleHoverOut = () => {
6
+ node.style.setProperty('--card-actions--opacity', '');
7
+ };
8
+ node.addEventListener('mouseenter', handleHover);
9
+ node.addEventListener('mouseleave', handleHoverOut);
10
+ node.style.position = 'relative';
11
+ return {
12
+ destroy() {
13
+ node.removeEventListener('mouseenter', handleHover);
14
+ node.removeEventListener('mouseleave', handleHoverOut);
15
+ }
16
+ };
17
+ };
@@ -0,0 +1,28 @@
1
+ <script lang="ts">import { Icon, IconColor } from '../icon';
2
+ let { action, on } = $props();
3
+ </script>
4
+
5
+ <button
6
+ type="button"
7
+ class="card-action"
8
+ title={action.title ?? ''}
9
+ onclick={(e) => {
10
+ if (!action.propagateClickEvent) {
11
+ e.stopPropagation();
12
+ }
13
+
14
+ action.callback?.();
15
+ on?.click?.();
16
+ }}>
17
+ <Icon src={action.icon} color={action.iconColor ?? IconColor.Text} />
18
+ </button>
19
+
20
+ <style>.card-action {
21
+ --_card-action--padding: var(--card-action-padding, 0.3125em);
22
+ padding: var(--_card-action--padding);
23
+ transition: transform 0.3s;
24
+ line-height: 0;
25
+ }
26
+ .card-action:hover {
27
+ transform: scale(1.2);
28
+ }</style>
@@ -0,0 +1,10 @@
1
+ import type { CardActionModel } from './types';
2
+ type Props = {
3
+ action: CardActionModel;
4
+ on?: {
5
+ click?: () => void;
6
+ };
7
+ };
8
+ declare const Cmp: import("svelte").Component<Props, {}, "">;
9
+ type Cmp = ReturnType<typeof Cmp>;
10
+ export default Cmp;
@@ -0,0 +1,71 @@
1
+ <script lang="ts">import { Dropdown } from '../dropdown';
2
+ import CardAction from './cmp.card-action.svelte';
3
+ import IconMoreVertical from '@fluentui/svg-icons/icons/more_vertical_20_regular.svg?raw';
4
+ let { actions, dropdownPosition = 'bottom-start' } = $props();
5
+ let toggleDropdown = $state.raw(null);
6
+ let closeDropdown = () => {
7
+ if (toggleDropdown) {
8
+ toggleDropdown(false);
9
+ }
10
+ };
11
+ </script>
12
+
13
+ {#if actions.length}
14
+ <div class="card-actions">
15
+ <Dropdown position={dropdownPosition} on={{ mounted: (v) => (toggleDropdown = v.toggleOpen) }}>
16
+ {#snippet trigger()}
17
+ <CardAction action={{ icon: IconMoreVertical, propagateClickEvent: true }} />
18
+ {/snippet}
19
+
20
+ <div class="card-actions__dropdown-content">
21
+ {#each actions as action (action)}
22
+ <CardAction action={action} on={{ click: closeDropdown }} />
23
+ {/each}
24
+ </div>
25
+ </Dropdown>
26
+ </div>
27
+ {/if}
28
+
29
+ <style>@keyframes fadeIn {
30
+ 0% {
31
+ opacity: 1;
32
+ }
33
+ 50% {
34
+ opacity: 0.4;
35
+ }
36
+ 100% {
37
+ opacity: 1;
38
+ }
39
+ }
40
+ .card-actions {
41
+ --_card-actions--opacity: var(--card-actions--opacity, 0);
42
+ --_card-actions--top-offset: var(--card-actions--top-offset, 0.3125em);
43
+ --_card-actions--left-offset: var(--card-actions--left-offset, 0.3125em);
44
+ --_card-actions--right-offset: var(--card-actions--right-offset, auto);
45
+ position: absolute;
46
+ top: var(--_card-actions--top-offset);
47
+ right: var(--_card-actions--right-offset);
48
+ left: var(--_card-actions--left-offset);
49
+ --icon--stroke-width: 0.3;
50
+ opacity: var(--_card-actions--opacity);
51
+ transition: opacity ease-in-out 0.4s;
52
+ display: flex;
53
+ background: var(--sc-mc-color--bg-card-action);
54
+ border-radius: 0.1875em;
55
+ }
56
+ .card-actions__dropdown-content {
57
+ padding: 0 0.3125em;
58
+ background: var(--sc-mc-color--bg-card-action);
59
+ }
60
+ @media (any-hover: none) {
61
+ .card-actions {
62
+ opacity: 1;
63
+ }
64
+ }
65
+
66
+ :global(.card-actions-container) {
67
+ position: relative;
68
+ }
69
+ :global(.card-actions-container):hover .card-actions {
70
+ opacity: 1;
71
+ }</style>
@@ -0,0 +1,9 @@
1
+ import { type DropdownPosition } from '../dropdown';
2
+ import type { CardActionModel } from './types';
3
+ type Props = {
4
+ actions: CardActionModel[];
5
+ dropdownPosition?: DropdownPosition;
6
+ };
7
+ declare const Cmp: import("svelte").Component<Props, {}, "">;
8
+ type Cmp = ReturnType<typeof Cmp>;
9
+ export default Cmp;
@@ -0,0 +1,4 @@
1
+ export { default as CardActions } from './cmp.card-actions.svelte';
2
+ export { default as CardAction } from './cmp.card-action.svelte';
3
+ export { cardActionContainer } from './card-action-container';
4
+ export type { CardActionModel } from './types';
@@ -0,0 +1,3 @@
1
+ export { default as CardActions } from './cmp.card-actions.svelte';
2
+ export { default as CardAction } from './cmp.card-action.svelte';
3
+ export { cardActionContainer } from './card-action-container';
@@ -0,0 +1,9 @@
1
+ import { IconColor } from '../icon';
2
+ export type CardActionModel = {
3
+ icon: string;
4
+ title?: string;
5
+ iconColor?: IconColor;
6
+ callback?: () => void | Promise<void>;
7
+ disabled?: boolean;
8
+ propagateClickEvent?: boolean;
9
+ };
@@ -0,0 +1 @@
1
+ import { IconColor } from '../icon';
@@ -0,0 +1,53 @@
1
+ <script lang="ts">import { MobilePlayerButtonsGroup, PlayerButtonsGroup, PlayerButton } from './';
2
+ let { scaleEffect = false, activeColor, backgroundColor, actions } = $props();
3
+ </script>
4
+
5
+ <div class="desktop-controls">
6
+ {#if actions.length > 0}
7
+ {#if actions.length === 1}
8
+ <PlayerButton
9
+ scaleEffect={scaleEffect}
10
+ activeColor={activeColor}
11
+ inactiveColor={backgroundColor}
12
+ icon={actions[0].icon}
13
+ on={{ click: actions[0].callback }} />
14
+ {:else}
15
+ <PlayerButtonsGroup scaleEffect={scaleEffect} activeColor={activeColor} backgroundColor={backgroundColor} actions={actions} />
16
+ {/if}
17
+ {/if}
18
+ </div>
19
+
20
+ <div class="mobile-controls">
21
+ <MobilePlayerButtonsGroup actions={actions} />
22
+ </div>
23
+
24
+ <style>@keyframes fadeIn {
25
+ 0% {
26
+ opacity: 1;
27
+ }
28
+ 50% {
29
+ opacity: 0.4;
30
+ }
31
+ 100% {
32
+ opacity: 1;
33
+ }
34
+ }
35
+ .desktop-controls {
36
+ display: contents;
37
+ /* Set 'container-type: inline-size;' to reference container*/
38
+ }
39
+ @container (width < 576px) {
40
+ .desktop-controls {
41
+ display: none;
42
+ }
43
+ }
44
+
45
+ .mobile-controls {
46
+ display: none;
47
+ /* Set 'container-type: inline-size;' to reference container*/
48
+ }
49
+ @container (width < 576px) {
50
+ .mobile-controls {
51
+ display: contents;
52
+ }
53
+ }</style>
@@ -0,0 +1,10 @@
1
+ import { type PlayerButtonDef } from './';
2
+ type Props = {
3
+ activeColor: string | null;
4
+ backgroundColor: string | null;
5
+ actions: PlayerButtonDef[];
6
+ scaleEffect?: boolean;
7
+ };
8
+ declare const Cmp: import("svelte").Component<Props, {}, "">;
9
+ type Cmp = ReturnType<typeof Cmp>;
10
+ export default Cmp;
@@ -1,4 +1,5 @@
1
1
  export { default as PlayerButton } from './cmp.player-button.svelte';
2
2
  export { default as PlayerButtonsGroup } from './cmp.player-buttons-group.svelte';
3
3
  export { default as MobilePlayerButtonsGroup } from './cmp.mobile-player-buttons-group.svelte';
4
+ export { default as ResponsivePlayerButtonsGroup } from './cmp.responsive-player-buttons-group.svelte';
4
5
  export type { PlayerButtonDef } from './types';
@@ -1,3 +1,4 @@
1
1
  export { default as PlayerButton } from './cmp.player-button.svelte';
2
2
  export { default as PlayerButtonsGroup } from './cmp.player-buttons-group.svelte';
3
3
  export { default as MobilePlayerButtonsGroup } from './cmp.mobile-player-buttons-group.svelte';
4
+ export { default as ResponsivePlayerButtonsGroup } from './cmp.responsive-player-buttons-group.svelte';
@@ -1,12 +1,11 @@
1
- <script lang="ts">import { handleEsc } from '../core/document.event-handlers';
2
- import { PostViewer } from '../posts/post-viewer';
3
- import { Loading } from '../ui/loading';
4
- import { PlayerSlider } from '../ui/player/slider';
5
- import { SwipeIndicator } from '../ui/swipe-indicator';
1
+ <script lang="ts">import { handleEsc } from '../../../core/document.event-handlers';
2
+ import { Loading } from '../../loading';
3
+ import { PlayerSlider } from '../slider';
4
+ import { SwipeIndicator } from '../../swipe-indicator';
6
5
  import { default as ControlsAndAttachments } from './controls-and-attachments.svelte';
7
6
  import { default as OverviewPanel } from './overview-panel.svelte';
8
7
  import {} from 'svelte';
9
- let { config, nonPostItemView, overviewPanelContent } = $props();
8
+ let { config, itemActions, itemView, attachmentsView, overviewPanelContent } = $props();
10
9
  let everTouched = $state(false);
11
10
  let overviewPosition = $state({
12
11
  top: 0,
@@ -114,29 +113,8 @@ const handleSliderMounted = (node) => {
114
113
  <div class="content-player__slider" use:handleSliderMounted>
115
114
  <PlayerSlider buffer={config.playerBuffer} on={config.playerSliderCallbacks}>
116
115
  {#snippet children({ item })}
117
- {@const postModel = config.itemAsPostViewerModel(item)}
118
116
  <div class="content-player__content">
119
- {#if postModel}
120
- <PostViewer
121
- model={postModel}
122
- controlsColors={{ active: config.playerColors.button, inactive: config.playerColors.buttonInactive }}
123
- trackingParams={config.trackingParams}
124
- socialInteractionsHandler={config.socialInteractionsHandler}
125
- enableAttachments={config.uiManager.showPostOverlayAttachments}
126
- enableControls={config.uiManager.showPostOverlayControls}
127
- autoplay="on-appearance"
128
- locale={config.settings.locale}
129
- on={{
130
- progress: (progress) => config.callbacks?.videoProgress?.(item.id, postModel.id, progress),
131
- productClick: (productId) => config.callbacks?.productClick?.(productId, postModel.id),
132
- productImpression: (productId) => config.callbacks?.productImpression?.(productId, postModel.id),
133
- adClick: (adId) => config.callbacks?.adClick?.(adId, postModel.id),
134
- adImpression: (adId) => config.callbacks?.adImpression?.(adId, postModel.id)
135
- }} />
136
- {:else if nonPostItemView}
137
- {@render nonPostItemView({ item })}
138
- {/if}
139
-
117
+ {@render itemView({ item })}
140
118
  {#if uiManager.isMobileView && config.playerBuffer && config.playerBuffer.loaded.length > 1 && !everTouched}
141
119
  <SwipeIndicator locale={config.settings.locale} />
142
120
  {/if}
@@ -150,7 +128,7 @@ const handleSliderMounted = (node) => {
150
128
  {/if}
151
129
  </div>
152
130
 
153
- <ControlsAndAttachments config={config} hasOverview={!!overviewPanelContent} />
131
+ <ControlsAndAttachments config={config} hasOverview={!!overviewPanelContent} itemActions={itemActions} attachmentsView={attachmentsView} />
154
132
  {:else}
155
133
  <Loading positionFixedCenter={true} timeout={1000} />
156
134
  {/if}
@@ -1,3 +1,4 @@
1
+ import type { PlayerButtonDef } from '../button';
1
2
  import type { ContentPlayerConfig } from './content-player-config.svelte';
2
3
  import { type Snippet } from 'svelte';
3
4
  declare class __sveltets_Render<T extends {
@@ -5,7 +6,11 @@ declare class __sveltets_Render<T extends {
5
6
  }> {
6
7
  props(): {
7
8
  config: ContentPlayerConfig<T>;
8
- nonPostItemView?: Snippet<[{
9
+ itemActions: PlayerButtonDef[];
10
+ itemView: Snippet<[{
11
+ item: T;
12
+ }]>;
13
+ attachmentsView?: Snippet<[{
9
14
  item: T;
10
15
  }]> | undefined;
11
16
  overviewPanelContent?: Snippet;
@@ -0,0 +1,29 @@
1
+ import type { ICloseOrchestrator } from '../close-orchestrator';
2
+ import type { IPlayerBuffer } from '../providers';
3
+ import type { PlayerSliderCallbacks } from '../slider/types';
4
+ import { ContentPlayerSettings } from './content-player-settings.svelte';
5
+ import { ContentPlayerUIManager } from './ui-manager.svelte';
6
+ export declare class ContentPlayerConfig<T extends {
7
+ id: string;
8
+ }> {
9
+ playerBuffer: IPlayerBuffer<T> | null;
10
+ readonly settings: ContentPlayerSettings;
11
+ readonly playerSliderCallbacks: PlayerSliderCallbacks | undefined;
12
+ readonly closeOrchestrator: ICloseOrchestrator;
13
+ readonly uiManager: ContentPlayerUIManager;
14
+ private _trackingParams;
15
+ constructor(init: {
16
+ playerBuffer: IPlayerBuffer<T> | null;
17
+ settings?: ContentPlayerSettings;
18
+ playerSliderCallbacks?: PlayerSliderCallbacks;
19
+ trackingParams?: ContentPlayerTrackingParams | null;
20
+ closeOrchestrator: ICloseOrchestrator;
21
+ });
22
+ get playerColors(): import("../colors").PlayerColors;
23
+ get trackingParams(): ContentPlayerConfig<T>['_trackingParams'];
24
+ updateTrackingParams: (data: ContentPlayerTrackingParams | null) => void;
25
+ }
26
+ export type ContentPlayerTrackingParams = {
27
+ streamId?: string;
28
+ campaignId?: string;
29
+ } | false;
@@ -0,0 +1,27 @@
1
+ import { ContentPlayerSettings } from './content-player-settings.svelte';
2
+ import { ContentPlayerUIManager } from './ui-manager.svelte';
3
+ export class ContentPlayerConfig {
4
+ playerBuffer = $state.raw(null);
5
+ settings;
6
+ playerSliderCallbacks;
7
+ closeOrchestrator;
8
+ uiManager = new ContentPlayerUIManager();
9
+ _trackingParams = $state.raw(null);
10
+ constructor(init) {
11
+ const { playerBuffer, trackingParams, settings, playerSliderCallbacks, closeOrchestrator } = init;
12
+ this.playerBuffer = playerBuffer;
13
+ this._trackingParams = trackingParams ?? null;
14
+ this.settings = settings || new ContentPlayerSettings();
15
+ this.playerSliderCallbacks = playerSliderCallbacks;
16
+ this.closeOrchestrator = closeOrchestrator;
17
+ }
18
+ get playerColors() {
19
+ return this.settings.playerColors;
20
+ }
21
+ get trackingParams() {
22
+ return this._trackingParams;
23
+ }
24
+ updateTrackingParams = (data) => {
25
+ this._trackingParams = data ?? null;
26
+ };
27
+ }
@@ -1,6 +1,6 @@
1
- import type { Locale } from '../core/locale';
2
- import { type ThemeValue } from '../core/theme';
3
- import { PlayerColors } from '../ui/player/colors';
1
+ import type { Locale } from '../../../core/locale';
2
+ import { type ThemeValue } from '../../../core/theme';
3
+ import { PlayerColors } from '../colors';
4
4
  export declare class ContentPlayerSettings {
5
5
  locale: Locale;
6
6
  showStreamsCloudWatermark: boolean;
@@ -1,5 +1,5 @@
1
- import { Theme } from '../core/theme';
2
- import { PlayerColors } from '../ui/player/colors';
1
+ import { Theme } from '../../../core/theme';
2
+ import { PlayerColors } from '../colors';
3
3
  export class ContentPlayerSettings {
4
4
  locale = $state('en');
5
5
  showStreamsCloudWatermark = $state(false);
@@ -1,28 +1,17 @@
1
- <script lang="ts">import { slideHorizontally } from '../core/transitions';
2
- import { PostAttachments } from '../posts/attachments';
3
- import { PostControls } from '../posts/controls';
4
- import { IconColor } from '../ui/icon';
5
- import { PlayerButton, PlayerButtonsGroup } from '../ui/player/button';
1
+ <script lang="ts">import { slideHorizontally } from '../../../core/transitions';
2
+ import { PlayerButton, ResponsivePlayerButtonsGroup } from '../button';
6
3
  import { ContentPlayerConfig } from './content-player-config.svelte';
7
4
  import IconCalendarWeekNumbers from '@fluentui/svg-icons/icons/calendar_week_numbers_24_regular.svg?raw';
8
5
  import IconChevronDown from '@fluentui/svg-icons/icons/chevron_down_28_regular.svg?raw';
9
6
  import IconChevronUp from '@fluentui/svg-icons/icons/chevron_up_28_regular.svg?raw';
10
7
  import IconDismiss from '@fluentui/svg-icons/icons/dismiss_28_regular.svg?raw';
11
- let { config, hasOverview } = $props();
8
+ let { config, hasOverview, itemActions, attachmentsView } = $props();
12
9
  const uiManager = config.uiManager;
13
- let attachmentsCollapsed = $state(false);
14
10
  let closeButtonAreaHeight = $state(0);
15
- const currentItemPostContainer = $derived.by(() => {
16
- var _a;
17
- if (!((_a = config.playerBuffer) === null || _a === void 0 ? void 0 : _a.current)) {
18
- return null;
19
- }
20
- return config.itemAsPostViewerModel(config.playerBuffer.current);
21
- });
22
- const extraActions = $derived.by(() => {
23
- const actions = [];
11
+ const allActions = $derived.by(() => {
12
+ const actions = [...itemActions];
24
13
  if (hasOverview && uiManager.overviewCanBeShown) {
25
- actions.push({
14
+ actions.unshift({
26
15
  icon: IconCalendarWeekNumbers,
27
16
  callback: () => {
28
17
  uiManager.overviewCollapsed = !uiManager.overviewCollapsed;
@@ -31,9 +20,6 @@ const extraActions = $derived.by(() => {
31
20
  }
32
21
  return actions;
33
22
  });
34
- const changeShowAttachments = () => {
35
- attachmentsCollapsed = !attachmentsCollapsed;
36
- };
37
23
  const trackAttachmentsPanelSize = (node) => {
38
24
  const resizeObserver = new ResizeObserver(([entry]) => {
39
25
  uiManager.attachmentsWidth = entry.contentRect.width;
@@ -72,34 +58,16 @@ const variables = $derived.by(() => {
72
58
  });
73
59
  </script>
74
60
 
75
- {#if !uiManager.showPostOverlayControls}
61
+ {#if !uiManager.showControlsOverlay}
76
62
  <div class="controls-and-attachments" style={variables}>
77
63
  <div class="controls-and-attachments__spacer">&nbsp;</div>
78
64
  <div class="controls-and-attachments__left">
79
- {#if currentItemPostContainer}
80
- <PostControls
81
- model={currentItemPostContainer}
82
- activeColor={config.playerColors.button}
83
- inactiveColor={config.playerColors.buttonInactive}
84
- socialInteractionsHandler={config.socialInteractionsHandler}
85
- extraActions={extraActions}
86
- on={{ attachmentsClicked: changeShowAttachments }} />
87
- {:else if extraActions.length}
88
- {#if extraActions.length === 1}
89
- <PlayerButton
90
- scaleEffect={true}
91
- activeColor={config.playerColors.button}
92
- inactiveColor={config.playerColors.buttonInactive}
93
- icon={extraActions[0].icon}
94
- on={{ click: extraActions[0].callback }} />
95
- {:else}
96
- <PlayerButtonsGroup
97
- scaleEffect={true}
98
- activeColor={config.playerColors.button}
99
- backgroundColor={config.playerColors.buttonInactive}
100
- actions={extraActions} />
101
- {/if}
102
- {/if}
65
+ <ResponsivePlayerButtonsGroup
66
+ actions={allActions}
67
+ scaleEffect={true}
68
+ activeColor={config.playerColors.button}
69
+ backgroundColor={config.playerColors.buttonInactive} />
70
+
103
71
  {#if config.playerBuffer}
104
72
  <div
105
73
  class="controls-and-attachments__navigation-buttons"
@@ -122,25 +90,10 @@ const variables = $derived.by(() => {
122
90
  {/if}
123
91
  </div>
124
92
  <div class="controls-and-attachments__right" use:trackAttachmentsPanelSize>
125
- {#if !uiManager.showPostOverlayAttachments}
126
- {#if currentItemPostContainer && !attachmentsCollapsed && currentItemPostContainer.attachments}
127
- <div class="controls-and-attachments__post-attachments" transition:slideHorizontally|local>
128
- <PostAttachments
129
- model={currentItemPostContainer}
130
- colors={{
131
- background: config.playerColors.cardBackground,
132
- price: config.playerColors.price,
133
- salePrice: config.playerColors.salePrice,
134
- buttonBackground: config.playerColors.cardButton
135
- }}
136
- trackingParams={config.trackingParams}
137
- locale={config.settings.locale}
138
- on={{
139
- productClick: (id) => config.callbacks?.productClick?.(id, currentItemPostContainer.id),
140
- productImpression: (id) => config.callbacks?.productImpression?.(id, currentItemPostContainer.id),
141
- adClick: (id) => config.callbacks?.adClick?.(id, currentItemPostContainer.id),
142
- adImpression: (id) => config.callbacks?.adImpression?.(id, currentItemPostContainer.id)
143
- }} />
93
+ {#if !uiManager.showAttachmentsOverlay}
94
+ {#if attachmentsView && config.playerBuffer?.current && !config.uiManager.attachmentsCollapsed}
95
+ <div class="controls-and-attachments__attachments" transition:slideHorizontally|local>
96
+ {@render attachmentsView({ item: config.playerBuffer.current })}
144
97
  </div>
145
98
  {/if}
146
99
  {/if}
@@ -202,7 +155,7 @@ const variables = $derived.by(() => {
202
155
  align-items: flex-end;
203
156
  flex-direction: column;
204
157
  }
205
- .controls-and-attachments__post-attachments {
158
+ .controls-and-attachments__attachments {
206
159
  flex: 1 1 auto;
207
160
  width: var(--_controls-and-attachments--attachments--max-width);
208
161
  max-width: var(--_controls-and-attachments--attachments--max-width);
@@ -1,10 +1,16 @@
1
+ import { type PlayerButtonDef } from '../button';
1
2
  import { ContentPlayerConfig } from './content-player-config.svelte';
3
+ import type { Snippet } from 'svelte';
2
4
  declare class __sveltets_Render<T extends {
3
5
  id: string;
4
6
  }> {
5
7
  props(): {
6
8
  config: ContentPlayerConfig<T>;
7
9
  hasOverview: boolean;
10
+ itemActions: PlayerButtonDef[];
11
+ attachmentsView?: Snippet<[{
12
+ item: T;
13
+ }]> | undefined;
8
14
  };
9
15
  events(): {};
10
16
  slots(): {};
@@ -1,4 +1,4 @@
1
- <script lang="ts">import { slideHorizontally } from '../core/transitions';
1
+ <script lang="ts">import { slideHorizontally } from '../../../core/transitions';
2
2
  let { config, uiManager, position, children } = $props();
3
3
  const handlePanelClick = (e) => {
4
4
  e.stopPropagation();
@@ -2,6 +2,7 @@ export declare class ContentPlayerUIManager {
2
2
  overviewCollapsed: boolean;
3
3
  readonly overviewCanBeShown: boolean;
4
4
  readonly overviewMaxWidth = 150;
5
+ attachmentsCollapsed: boolean;
5
6
  attachmentsWidth: number;
6
7
  readonly attachmentsMaxWidth = 176;
7
8
  playerTotalWidth: number;
@@ -9,6 +10,6 @@ export declare class ContentPlayerUIManager {
9
10
  readonly sidePanelsMaxWidth: number;
10
11
  readonly isMobileView: boolean;
11
12
  readonly viewInitialized: boolean;
12
- showPostOverlayAttachments: boolean;
13
- showPostOverlayControls: boolean;
13
+ showAttachmentsOverlay: boolean;
14
+ showControlsOverlay: boolean;
14
15
  }
@@ -5,6 +5,7 @@ export class ContentPlayerUIManager {
5
5
  overviewCollapsed = $state(true);
6
6
  overviewCanBeShown = $derived.by(() => this.overviewMaxWidth <= this.sidePanelsMaxWidth);
7
7
  overviewMaxWidth = OVERLAY_MAX_WIDTH;
8
+ attachmentsCollapsed = $state(false);
8
9
  attachmentsWidth = $state(0);
9
10
  attachmentsMaxWidth = ATTACHMENTS_MAX_WIDTH;
10
11
  playerTotalWidth = $state(0);
@@ -12,6 +13,6 @@ export class ContentPlayerUIManager {
12
13
  sidePanelsMaxWidth = $derived.by(() => (this.playerTotalWidth - this.contentViewWidth) / 2);
13
14
  isMobileView = $derived.by(() => this.playerTotalWidth <= 576);
14
15
  viewInitialized = $derived.by(() => !!this.playerTotalWidth && !!this.contentViewWidth);
15
- showPostOverlayAttachments = $derived.by(() => this.viewInitialized && this.attachmentsWidth < ATTACHMENTS_MAX_WIDTH + 10);
16
- showPostOverlayControls = $derived.by(() => this.viewInitialized && this.sidePanelsMaxWidth < SAFE_AREA_SIZE);
16
+ showAttachmentsOverlay = $derived.by(() => this.viewInitialized && this.attachmentsWidth < ATTACHMENTS_MAX_WIDTH + 10);
17
+ showControlsOverlay = $derived.by(() => this.viewInitialized && this.sidePanelsMaxWidth < SAFE_AREA_SIZE);
17
18
  }
@@ -2,10 +2,8 @@ import type { WithId } from '../types';
2
2
  export declare class PlayerChunkItem<T extends WithId> {
3
3
  model: T;
4
4
  chunkId: string;
5
- indexWithinChunk: number;
6
5
  constructor(init: {
7
6
  model: T;
8
- indexWithinChunk: number;
9
7
  chunkId: string;
10
8
  });
11
9
  }
@@ -1,11 +1,9 @@
1
1
  export class PlayerChunkItem {
2
2
  model;
3
3
  chunkId;
4
- indexWithinChunk;
5
4
  constructor(init) {
6
- const { model, indexWithinChunk, chunkId } = init;
5
+ const { model, chunkId } = init;
7
6
  this.model = model;
8
- this.indexWithinChunk = indexWithinChunk;
9
7
  this.chunkId = chunkId;
10
8
  }
11
9
  }
@@ -4,7 +4,6 @@ export declare class PlayerChunk<TItem extends WithId, TChunk extends WithId> {
4
4
  readonly model: TChunk;
5
5
  readonly items: TItem[];
6
6
  readonly chunkItems: PlayerChunkItem<TItem>[];
7
- readonly chunkIndex: number;
8
7
  readonly activeChunkItem: PlayerChunkItem<TItem>;
9
8
  readonly isEmpty: boolean;
10
9
  isFullyLoaded: boolean;
@@ -14,7 +13,6 @@ export declare class PlayerChunk<TItem extends WithId, TChunk extends WithId> {
14
13
  private _itemsLoader;
15
14
  constructor(data: {
16
15
  chunk: TChunk;
17
- chunkIndex: number;
18
16
  provider: {
19
17
  loadChunkItems: (chunkId: string, continuationToken: string | null | undefined) => Promise<{
20
18
  items: TItem[];
@@ -25,7 +23,10 @@ export declare class PlayerChunk<TItem extends WithId, TChunk extends WithId> {
25
23
  onChunkFullyLoaded: (chunk: PlayerChunk<TItem, TChunk>) => void;
26
24
  };
27
25
  });
26
+ get isLoading(): boolean;
27
+ get activeItemIndex(): number;
28
28
  loadMore: () => Promise<TItem[]>;
29
29
  setActiveItemIndex: (index: number, warmUp?: boolean) => Promise<void>;
30
+ mutateChunkItems: (items: PlayerChunkItem<TItem>[]) => void;
30
31
  warmUp: () => Promise<void>;
31
32
  }