@streamscloud/embeddable 14.0.0-rc.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.
- package/dist/core/analytics.profile-id.d.ts +5 -0
- package/dist/core/{analytics.installation-id.js → analytics.profile-id.js} +10 -20
- package/dist/external-api/data-providers/internal-media-center-analytics-handler.d.ts +14 -14
- package/dist/external-api/data-providers/internal-media-center-analytics-handler.js +19 -170
- package/dist/external-api/data-providers/internal-media-center-data-provider.svelte.js +6 -6
- package/dist/external-api/data-providers/internal-post-analytics-handler.d.ts +7 -7
- package/dist/external-api/data-providers/internal-post-analytics-handler.js +11 -72
- package/dist/external-api/data-providers/internal-stream-analytics-handler.d.ts +13 -12
- package/dist/external-api/data-providers/internal-stream-analytics-handler.js +18 -162
- package/dist/external-api/data-providers/mocks/index.d.ts +5 -0
- package/dist/external-api/data-providers/mocks/index.js +5 -0
- package/dist/{media-center/categories-following → external-api/data-providers/mocks}/mock-categories-following-handler.svelte.d.ts +1 -1
- package/dist/external-api/data-providers/mocks/mock-content-management-handler.svelte.d.ts +29 -0
- package/dist/external-api/data-providers/mocks/mock-content-management-handler.svelte.js +61 -0
- package/dist/{media-center/membership → external-api/data-providers/mocks}/mock-membership-handler.svelte.d.ts +1 -1
- package/dist/{media-center/navigation → external-api/data-providers/mocks}/mock-navigation-handler.svelte.d.ts +1 -2
- package/dist/{posts/social-interactions → external-api/data-providers/mocks}/mock-post-social-interactions-handler.svelte.d.ts +1 -2
- package/dist/{posts/social-interactions → external-api/data-providers/mocks}/mock-post-social-interactions-handler.svelte.js +17 -6
- package/dist/external-api/data-providers/mocks/operations.generated.d.ts +115 -0
- package/dist/external-api/data-providers/mocks/operations.generated.js +377 -0
- package/dist/external-api/data-providers/mocks/operations.graphql +18 -0
- package/dist/external-api/data-providers/post-data-loaders/mapper.js +3 -1
- package/dist/media-center/config/types.d.ts +7 -1
- package/dist/media-center/content-management/index.d.ts +1 -0
- package/dist/media-center/content-management/index.js +1 -0
- package/dist/media-center/content-management/types.d.ts +24 -0
- package/dist/media-center/content-management/types.js +1 -0
- package/dist/media-center/index.d.ts +2 -1
- package/dist/media-center/media-center/cmp.media-center-proxy.svelte +2 -2
- package/dist/media-center/media-center/discover/data-loading.d.ts +3 -0
- package/dist/media-center/media-center/discover/data-loading.js +13 -2
- package/dist/media-center/media-center/discover/discover-view-handler.svelte.d.ts +23 -0
- package/dist/media-center/media-center/discover/discover-view-handler.svelte.js +88 -0
- package/dist/media-center/media-center/discover/discover-view.svelte +90 -47
- package/dist/media-center/media-center/discover/discover-view.svelte.d.ts +2 -2
- package/dist/media-center/media-center/footer/media-center-footer.svelte +1 -1
- package/dist/media-center/media-center/handlers/index.d.ts +1 -0
- package/dist/media-center/media-center/handlers/index.js +1 -0
- package/dist/media-center/media-center/handlers/media-center-content-handler.svelte.d.ts +62 -0
- package/dist/media-center/media-center/handlers/media-center-content-handler.svelte.js +144 -0
- package/dist/media-center/media-center/header/media-center-header-mobile.svelte +10 -7
- package/dist/media-center/media-center/header/media-center-header.svelte +1 -1
- package/dist/media-center/media-center/media-center-context.svelte.d.ts +3 -2
- package/dist/media-center/media-center/media-center-context.svelte.js +30 -11
- package/dist/media-center/media-center/media-center-view.svelte +31 -13
- package/dist/media-center/media-center/menu/menu.svelte +16 -7
- package/dist/media-center/media-center/menu/menu.svelte.d.ts +1 -0
- package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.d.ts +7 -0
- package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.js +23 -8
- package/dist/media-center/media-center/moments/moments-feed-handler.svelte.d.ts +19 -2
- package/dist/media-center/media-center/moments/moments-feed-handler.svelte.js +51 -6
- package/dist/media-center/media-center/moments/moments-state.svelte.d.ts +2 -0
- package/dist/media-center/media-center/moments/moments-state.svelte.js +16 -1
- package/dist/media-center/media-center/posts-feed/posts-feed-handler.svelte.d.ts +24 -4
- package/dist/media-center/media-center/posts-feed/posts-feed-handler.svelte.js +90 -9
- package/dist/media-center/media-center/streams-feed/streams-feed-handler.svelte.d.ts +18 -3
- package/dist/media-center/media-center/streams-feed/streams-feed-handler.svelte.js +64 -9
- package/dist/media-center/media-center/streams-in-category/streams-in-category-panel.svelte +2 -6
- package/dist/posts/controls/index.d.ts +2 -1
- package/dist/posts/controls/index.js +2 -1
- package/dist/posts/controls/post-actions-generator.svelte.d.ts +20 -0
- package/dist/posts/controls/post-actions-generator.svelte.js +27 -0
- package/dist/posts/controls/post-actions-handler.svelte.d.ts +26 -0
- package/dist/posts/controls/post-actions-handler.svelte.js +56 -0
- package/dist/posts/index.d.ts +1 -0
- package/dist/posts/model/types.d.ts +1 -0
- package/dist/posts/post-viewer/cmp.post-viewer.svelte +6 -7
- package/dist/posts/post-viewer/cmp.post-viewer.svelte.d.ts +2 -2
- package/dist/posts/post-viewer/mapper.js +1 -0
- package/dist/posts/posts-player/cmp.posts-player.svelte +2 -1
- package/dist/posts/posts-player/cmp.posts-player.svelte.d.ts +2 -0
- package/dist/posts/posts-player/index.d.ts +2 -0
- package/dist/posts/posts-player/index.js +2 -1
- package/dist/posts/posts-player/posts-player-proxy.svelte +2 -1
- package/dist/posts/posts-player/posts-player-proxy.svelte.d.ts +3 -1
- package/dist/posts/posts-player/posts-player-view.svelte +132 -34
- package/dist/posts/posts-player/types.d.ts +13 -3
- package/dist/posts/sharing/index.d.ts +1 -0
- package/dist/posts/sharing/index.js +1 -0
- package/dist/posts/sharing/types.d.ts +5 -0
- package/dist/posts/sharing/types.js +1 -0
- package/dist/posts/social-interactions/types.d.ts +0 -1
- package/dist/streams/controls/index.d.ts +1 -0
- package/dist/streams/controls/index.js +1 -0
- package/dist/streams/controls/stream-actions-generator.svelte.d.ts +31 -0
- package/dist/streams/controls/stream-actions-generator.svelte.js +42 -0
- package/dist/streams/index.d.ts +1 -0
- package/dist/streams/index.js +1 -0
- package/dist/streams/layout/cmp.layout.svelte +4 -1
- package/dist/streams/layout/cmp.layout.svelte.d.ts +1 -0
- package/dist/streams/layout/element-views/cmp.short-video-stream-element.svelte +1 -0
- package/dist/streams/layout/models/mapper.js +1 -0
- package/dist/streams/sharing/index.d.ts +1 -0
- package/dist/streams/sharing/index.js +1 -0
- package/dist/streams/sharing/types.d.ts +5 -0
- package/dist/streams/sharing/types.js +1 -0
- package/dist/streams/stream-page-viewer/cmp.stream-page-viewer.svelte +43 -1
- package/dist/streams/stream-page-viewer/cmp.stream-page-viewer.svelte.d.ts +9 -0
- package/dist/streams/streams-player/cmp.streams-player.svelte +2 -1
- package/dist/streams/streams-player/cmp.streams-player.svelte.d.ts +2 -0
- package/dist/streams/streams-player/index.d.ts +2 -0
- package/dist/streams/streams-player/index.js +2 -1
- package/dist/streams/streams-player/streams-player-proxy.svelte +2 -1
- package/dist/streams/streams-player/streams-player-proxy.svelte.d.ts +2 -0
- package/dist/streams/streams-player/streams-player-view.svelte +150 -34
- package/dist/streams/streams-player/types.d.ts +8 -0
- package/dist/ui/button/resources/button-theme.svelte +2 -4
- package/dist/ui/card-actions/card-action-container.d.ts +2 -0
- package/dist/ui/card-actions/card-action-container.js +17 -0
- package/dist/ui/card-actions/cmp.card-action.svelte +28 -0
- package/dist/ui/card-actions/cmp.card-action.svelte.d.ts +10 -0
- package/dist/ui/card-actions/cmp.card-actions.svelte +71 -0
- package/dist/ui/card-actions/cmp.card-actions.svelte.d.ts +9 -0
- package/dist/ui/card-actions/index.d.ts +4 -0
- package/dist/ui/card-actions/index.js +3 -0
- package/dist/ui/card-actions/types.d.ts +9 -0
- package/dist/ui/card-actions/types.js +1 -0
- package/dist/ui/icon/cmp.icon.svelte +1 -1
- package/dist/ui/player/button/cmp.player-button.svelte +1 -3
- package/dist/ui/player/button/cmp.player-buttons-group.svelte +1 -3
- package/dist/ui/player/button/cmp.responsive-player-buttons-group.svelte +53 -0
- package/dist/ui/player/button/cmp.responsive-player-buttons-group.svelte.d.ts +10 -0
- package/dist/ui/player/button/index.d.ts +1 -0
- package/dist/ui/player/button/index.js +1 -0
- package/dist/{content-player → ui/player/content-player}/cmp.content-player.svelte +7 -29
- package/dist/{content-player → ui/player/content-player}/cmp.content-player.svelte.d.ts +11 -15
- package/dist/ui/player/content-player/content-player-config.svelte.d.ts +29 -0
- package/dist/ui/player/content-player/content-player-config.svelte.js +27 -0
- package/dist/{content-player → ui/player/content-player}/content-player-settings.svelte.d.ts +3 -3
- package/dist/{content-player → ui/player/content-player}/content-player-settings.svelte.js +2 -2
- package/dist/{content-player → ui/player/content-player}/controls-and-attachments.svelte +18 -65
- package/dist/{content-player → ui/player/content-player}/controls-and-attachments.svelte.d.ts +11 -14
- package/dist/{content-player → ui/player/content-player}/overview-panel.svelte +2 -4
- package/dist/{content-player → ui/player/content-player}/overview-panel.svelte.d.ts +5 -14
- package/dist/{content-player → ui/player/content-player}/ui-manager.svelte.d.ts +3 -2
- package/dist/{content-player → ui/player/content-player}/ui-manager.svelte.js +3 -2
- package/dist/ui/player/providers/chunks-player-buffer/player-chunk-item.svelte.d.ts +0 -2
- package/dist/ui/player/providers/chunks-player-buffer/player-chunk-item.svelte.js +1 -3
- package/dist/ui/player/providers/chunks-player-buffer/player-chunk.svelte.d.ts +3 -2
- package/dist/ui/player/providers/chunks-player-buffer/player-chunk.svelte.js +11 -5
- package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.d.ts +3 -0
- package/dist/ui/player/providers/chunks-player-buffer/player-chunks-manager.svelte.js +74 -8
- package/dist/ui/player/providers/default-chunks-player-buffer.svelte.d.ts +2 -0
- package/dist/ui/player/providers/default-chunks-player-buffer.svelte.js +15 -4
- package/dist/ui/player/providers/default-feed-player-buffer.svelte.d.ts +1 -0
- package/dist/ui/player/providers/default-feed-player-buffer.svelte.js +27 -5
- package/dist/ui/player/providers/types.d.ts +1 -0
- package/dist/ui/player/slider/cmp.player-slider.svelte.d.ts +5 -14
- package/dist/ui/player/slider-horizontal/cmp.slider.svelte +2 -6
- package/dist/ui/player/slider-horizontal/cmp.slider.svelte.d.ts +5 -12
- package/dist/ui/shadow-dom/cmp.shadow-root.svelte +11 -6
- package/dist/ui/shadow-dom/colors.scss +2 -0
- package/package.json +7 -3
- package/dist/content-player/content-player-config.svelte.d.ts +0 -51
- package/dist/content-player/content-player-config.svelte.js +0 -48
- package/dist/core/analytics.installation-id.d.ts +0 -5
- package/dist/external-api/data-providers/mapper.d.ts +0 -3
- package/dist/external-api/data-providers/mapper.js +0 -18
- package/dist/posts/controls/cmp.controls.svelte +0 -120
- package/dist/posts/controls/cmp.controls.svelte.d.ts +0 -16
- /package/dist/{media-center/categories-following → external-api/data-providers/mocks}/mock-categories-following-handler.svelte.js +0 -0
- /package/dist/{media-center/membership → external-api/data-providers/mocks}/mock-membership-handler.svelte.js +0 -0
- /package/dist/{media-center/navigation → external-api/data-providers/mocks}/mock-navigation-handler.svelte.js +0 -0
- /package/dist/{content-player → ui/player/content-player}/index.d.ts +0 -0
- /package/dist/{content-player → ui/player/content-player}/index.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script lang="ts">import { StreamLayoutSlot, StreamPageLayout, StreamLayoutSlotContent } from '../layout';
|
|
2
|
+
import { ResponsivePlayerButtonsGroup } from '../../ui/player/button';
|
|
2
3
|
import { StreamPageViewerLocalization } from './stream-page-viewer-localization';
|
|
3
|
-
let { page, trackingParams, locale, on } = $props();
|
|
4
|
+
let { page, trackingParams, overlayControls, locale, on } = $props();
|
|
4
5
|
const localization = $derived(new StreamPageViewerLocalization(locale));
|
|
5
6
|
</script>
|
|
6
7
|
|
|
@@ -11,5 +12,46 @@ const localization = $derived(new StreamPageViewerLocalization(locale));
|
|
|
11
12
|
<StreamLayoutSlotContent model={slot} trackingParams={trackingParams} on={on} locale={localization.elementsLocale} />
|
|
12
13
|
</StreamLayoutSlot>
|
|
13
14
|
{/each}
|
|
15
|
+
{#snippet controls()}
|
|
16
|
+
{#if overlayControls?.enabled && overlayControls.actions.length}
|
|
17
|
+
<div class="controls-panel">
|
|
18
|
+
<ResponsivePlayerButtonsGroup
|
|
19
|
+
actions={overlayControls.actions}
|
|
20
|
+
activeColor={overlayControls.colors?.active ?? null}
|
|
21
|
+
backgroundColor={overlayControls.colors?.inactive ?? null}
|
|
22
|
+
scaleEffect={true} />
|
|
23
|
+
</div>
|
|
24
|
+
{/if}
|
|
25
|
+
{/snippet}
|
|
14
26
|
</StreamPageLayout>
|
|
15
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
|
+
.controls-panel {
|
|
41
|
+
position: absolute;
|
|
42
|
+
left: auto;
|
|
43
|
+
right: 0;
|
|
44
|
+
bottom: 6.25rem;
|
|
45
|
+
gap: 2.5rem;
|
|
46
|
+
display: flex;
|
|
47
|
+
flex-direction: column;
|
|
48
|
+
justify-content: flex-end;
|
|
49
|
+
align-items: flex-end;
|
|
50
|
+
padding: 0 0.625rem;
|
|
51
|
+
/* Set 'container-type: inline-size;' to reference container*/
|
|
52
|
+
}
|
|
53
|
+
@container (width < 576px) {
|
|
54
|
+
.controls-panel {
|
|
55
|
+
padding-right: 0;
|
|
56
|
+
}
|
|
57
|
+
}</style>
|
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
import type { Locale } from '../../core/locale';
|
|
2
2
|
import { type StreamTrackingParams } from '../layout';
|
|
3
|
+
import { type PlayerButtonDef } from '../../ui/player/button';
|
|
3
4
|
import type { StreamPageViewerModel } from './types';
|
|
4
5
|
type Props = {
|
|
5
6
|
page: StreamPageViewerModel;
|
|
6
7
|
trackingParams: StreamTrackingParams;
|
|
7
8
|
locale: Locale;
|
|
9
|
+
overlayControls?: {
|
|
10
|
+
enabled: boolean;
|
|
11
|
+
colors: {
|
|
12
|
+
active: string | null;
|
|
13
|
+
inactive: string | null;
|
|
14
|
+
} | null;
|
|
15
|
+
actions: PlayerButtonDef[];
|
|
16
|
+
};
|
|
8
17
|
on?: {
|
|
9
18
|
productClick: (productId: string) => void;
|
|
10
19
|
productImpression?: (productId: string) => void;
|
|
@@ -11,7 +11,7 @@ import { CloseOrchestrator } from '../../ui/player/close-orchestrator';
|
|
|
11
11
|
import { createShadowRoot } from '../../ui/shadow-dom';
|
|
12
12
|
import { default as StreamsPlayerProxy } from './streams-player-proxy.svelte';
|
|
13
13
|
import { mount, unmount } from 'svelte';
|
|
14
|
-
let { dataProvider, postSocialInteractionsHandler, amplificationParameters, playerSettings, analyticsHandler, on } = $props();
|
|
14
|
+
let { dataProvider, postSocialInteractionsHandler, sharingHandler, amplificationParameters, playerSettings, analyticsHandler, on } = $props();
|
|
15
15
|
const initHost = (node) => {
|
|
16
16
|
const shadowRoot = createShadowRoot(node);
|
|
17
17
|
const mounted = mount(StreamsPlayerProxy, {
|
|
@@ -19,6 +19,7 @@ const initHost = (node) => {
|
|
|
19
19
|
props: {
|
|
20
20
|
dataProvider,
|
|
21
21
|
postSocialInteractionsHandler,
|
|
22
|
+
sharingHandler,
|
|
22
23
|
analyticsHandler,
|
|
23
24
|
amplificationParameters,
|
|
24
25
|
playerSettings,
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { Locale } from '../../core/locale';
|
|
2
2
|
import type { IPostSocialInteractionsHandler } from '../../posts';
|
|
3
|
+
import type { IStreamSharingHandler } from '../sharing';
|
|
3
4
|
import type { IStreamAnalyticsHandler, IStreamsPlayerDataProvider, StreamAmplificationParameters } from './types';
|
|
4
5
|
type Props = {
|
|
5
6
|
dataProvider: IStreamsPlayerDataProvider;
|
|
6
7
|
postSocialInteractionsHandler?: IPostSocialInteractionsHandler;
|
|
8
|
+
sharingHandler?: IStreamSharingHandler;
|
|
7
9
|
analyticsHandler?: IStreamAnalyticsHandler;
|
|
8
10
|
amplificationParameters?: StreamAmplificationParameters;
|
|
9
11
|
playerSettings?: {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Locale } from '../../core/locale';
|
|
2
2
|
import { type IMediaCenterDataProvider } from '../../media-center/config/types';
|
|
3
3
|
import type { IPostSocialInteractionsHandler } from '../../posts/social-interactions';
|
|
4
|
+
import type { IStreamSharingHandler } from '../sharing';
|
|
4
5
|
import type { StreamPageViewerModel } from '../stream-page-viewer/types';
|
|
5
6
|
import type { IStreamAnalyticsHandler, IStreamsPlayerDataProvider, StreamAmplificationParameters, StreamPlayerModel } from './types';
|
|
6
7
|
export { type StreamPlayerModel, type StreamPageViewerModel };
|
|
@@ -75,6 +76,7 @@ export type { IStreamsPlayerDataProvider, IStreamAnalyticsHandler, IMediaCenterD
|
|
|
75
76
|
export declare function openStreamsPlayer(init: {
|
|
76
77
|
dataProvider: IStreamsPlayerDataProvider;
|
|
77
78
|
postSocialInteractionsHandler?: IPostSocialInteractionsHandler;
|
|
79
|
+
sharingHandler?: IStreamSharingHandler;
|
|
78
80
|
analyticsHandler?: IStreamAnalyticsHandler;
|
|
79
81
|
amplificationParameters?: StreamAmplificationParameters;
|
|
80
82
|
playerSettings?: StreamsPlayerSettings;
|
|
@@ -72,7 +72,7 @@ export {};
|
|
|
72
72
|
* ```
|
|
73
73
|
*/
|
|
74
74
|
export function openStreamsPlayer(init) {
|
|
75
|
-
const { dataProvider, analyticsHandler, postSocialInteractionsHandler, amplificationParameters, playerSettings, on } = init;
|
|
75
|
+
const { dataProvider, analyticsHandler, postSocialInteractionsHandler, sharingHandler, amplificationParameters, playerSettings, on } = init;
|
|
76
76
|
const shadowHost = new ModalShadowHost();
|
|
77
77
|
let mounted = null;
|
|
78
78
|
const makeCloseOrchestrator = () => new CloseOrchestrator({
|
|
@@ -93,6 +93,7 @@ export function openStreamsPlayer(init) {
|
|
|
93
93
|
amplificationParameters,
|
|
94
94
|
playerSettings,
|
|
95
95
|
postSocialInteractionsHandler,
|
|
96
|
+
sharingHandler,
|
|
96
97
|
closeOrchestrator: makeCloseOrchestrator(),
|
|
97
98
|
on: {
|
|
98
99
|
streamActivated: (data) => {
|
|
@@ -3,7 +3,7 @@ import {} from '../../ui/player/close-orchestrator';
|
|
|
3
3
|
import { ShadowRoot } from '../../ui/shadow-dom';
|
|
4
4
|
import { default as StreamsPlayerView } from './streams-player-view.svelte';
|
|
5
5
|
import { untrack } from 'svelte';
|
|
6
|
-
let { dataProvider, postSocialInteractionsHandler, amplificationParameters, closeOrchestrator, playerSettings, analyticsHandler, on } = $props();
|
|
6
|
+
let { dataProvider, postSocialInteractionsHandler, sharingHandler, amplificationParameters, closeOrchestrator, playerSettings, analyticsHandler, on } = $props();
|
|
7
7
|
let backgroundImageUrl = $state(null);
|
|
8
8
|
const handleBackgroundImagedLoaded = (url) => {
|
|
9
9
|
backgroundImageUrl = url;
|
|
@@ -21,6 +21,7 @@ $effect(() => {
|
|
|
21
21
|
<StreamsPlayerView
|
|
22
22
|
dataProvider={{ type: 'provider', provider: dataProvider }}
|
|
23
23
|
postSocialInteractionsHandler={postSocialInteractionsHandler}
|
|
24
|
+
sharingHandler={sharingHandler}
|
|
24
25
|
analyticsHandler={analyticsHandler}
|
|
25
26
|
amplificationParameters={amplificationParameters}
|
|
26
27
|
playerSettings={playerSettings}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import type { Locale } from '../../core/locale';
|
|
2
2
|
import type { IPostSocialInteractionsHandler } from '../../posts/social-interactions';
|
|
3
|
+
import type { IStreamSharingHandler } from '../sharing';
|
|
3
4
|
import { type ICloseOrchestrator } from '../../ui/player/close-orchestrator';
|
|
4
5
|
import type { IStreamsPlayerDataProvider, IStreamAnalyticsHandler, StreamAmplificationParameters } from './types';
|
|
5
6
|
type Props = {
|
|
6
7
|
dataProvider: IStreamsPlayerDataProvider;
|
|
7
8
|
postSocialInteractionsHandler?: IPostSocialInteractionsHandler;
|
|
9
|
+
sharingHandler?: IStreamSharingHandler;
|
|
8
10
|
analyticsHandler?: IStreamAnalyticsHandler;
|
|
9
11
|
amplificationParameters?: StreamAmplificationParameters;
|
|
10
12
|
closeOrchestrator: ICloseOrchestrator;
|
|
@@ -8,18 +8,25 @@
|
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
10
|
var _a;
|
|
11
|
-
import { ContentPlayer, ContentPlayerConfig } from '../../content-player';
|
|
12
|
-
import { ContentPlayerSettings } from '../../content-player/content-player-settings.svelte';
|
|
13
11
|
import { preloadImage } from '../../core/image-preloader';
|
|
12
|
+
import { PostAttachments } from '../../posts/attachments';
|
|
13
|
+
import { PostModel } from '../../posts/model';
|
|
14
|
+
import { PostViewer } from '../../posts/post-viewer';
|
|
15
|
+
import { StreamActionsGenerator } from '../controls';
|
|
14
16
|
import { mapToPostModel } from '../layout/models';
|
|
15
17
|
import { StreamPageViewer } from '../stream-page-viewer';
|
|
18
|
+
import { IconColor } from '../../ui/icon';
|
|
19
|
+
import { ContentPlayer, ContentPlayerConfig, ContentPlayerSettings } from '../../ui/player/content-player';
|
|
16
20
|
import { default as Overview } from './stream-overview.svelte';
|
|
17
21
|
import { StreamPlayerLocalization } from './stream-player-localization';
|
|
18
22
|
import { StreamsPlayerBuffer } from './streams-player-buffer.svelte';
|
|
23
|
+
import IconDelete from '@fluentui/svg-icons/icons/delete_32_regular.svg?raw';
|
|
24
|
+
import IconEdit from '@fluentui/svg-icons/icons/edit_32_regular.svg?raw';
|
|
19
25
|
import { untrack } from 'svelte';
|
|
20
|
-
let { dataProvider, analyticsHandler, postSocialInteractionsHandler, amplificationParameters, playerSettings, closeOrchestrator, on } = $props();
|
|
26
|
+
let { dataProvider, analyticsHandler, postSocialInteractionsHandler, sharingHandler, amplificationParameters, managementActions, playerSettings, closeOrchestrator, on } = $props();
|
|
21
27
|
const localization = $derived(new StreamPlayerLocalization((_a = playerSettings === null || playerSettings === void 0 ? void 0 : playerSettings.locale) !== null && _a !== void 0 ? _a : 'en'));
|
|
22
28
|
let currentStreamModel = $state(null);
|
|
29
|
+
let mappedPostsCache = new Map();
|
|
23
30
|
let activePageId = $derived.by(() => { var _a, _b; return (_b = (_a = buffer === null || buffer === void 0 ? void 0 : buffer.current) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : ''; });
|
|
24
31
|
let buffer = $state(null);
|
|
25
32
|
let totalEngagementTimeSeconds = 0;
|
|
@@ -33,6 +40,7 @@ $effect(() => {
|
|
|
33
40
|
untrack(() => {
|
|
34
41
|
buffer = null;
|
|
35
42
|
contentPlayerConfig.playerBuffer = null;
|
|
43
|
+
mappedPostsCache = new Map();
|
|
36
44
|
initPlayerBuffer(dataProvider);
|
|
37
45
|
});
|
|
38
46
|
return () => { };
|
|
@@ -50,6 +58,9 @@ $effect(() => {
|
|
|
50
58
|
var _a;
|
|
51
59
|
if (stream) {
|
|
52
60
|
currentStreamModel = stream;
|
|
61
|
+
if (stream.organizationId) {
|
|
62
|
+
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.setOrganizationId(stream.organizationId);
|
|
63
|
+
}
|
|
53
64
|
(_a = on === null || on === void 0 ? void 0 : on.streamActivated) === null || _a === void 0 ? void 0 : _a.call(on, { id: stream.id, title: stream.title, image: stream.cover });
|
|
54
65
|
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackStreamView(stream.id);
|
|
55
66
|
startActivityTracking();
|
|
@@ -94,36 +105,8 @@ const initPlayerBuffer = (dataProvider) => __awaiter(void 0, void 0, void 0, fun
|
|
|
94
105
|
});
|
|
95
106
|
const contentPlayerConfig = new ContentPlayerConfig({
|
|
96
107
|
playerBuffer: null,
|
|
97
|
-
mappers: {
|
|
98
|
-
postModelFromCurrentItem: (item) => {
|
|
99
|
-
if (item.type === 'short-video' && item.shortVideo) {
|
|
100
|
-
return mapToPostModel(item.shortVideo);
|
|
101
|
-
}
|
|
102
|
-
return null;
|
|
103
|
-
}
|
|
104
|
-
},
|
|
105
|
-
socialInteractionsHandler: postSocialInteractionsHandler,
|
|
106
108
|
settings: new ContentPlayerSettings(playerSettings),
|
|
107
109
|
closeOrchestrator,
|
|
108
|
-
callbacks: {
|
|
109
|
-
videoProgress: (pageId, videoId, progress) => {
|
|
110
|
-
onProgress(pageId, videoId, progress);
|
|
111
|
-
},
|
|
112
|
-
productClick: (id, videoId) => {
|
|
113
|
-
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackShortVideoProductClick(id, videoId);
|
|
114
|
-
onStreamProductClick(id);
|
|
115
|
-
},
|
|
116
|
-
productImpression: (id, videoId) => {
|
|
117
|
-
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackShortVideoProductImpression(id, videoId);
|
|
118
|
-
onStreamProductImpression(id);
|
|
119
|
-
},
|
|
120
|
-
adClick: (id) => {
|
|
121
|
-
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackAdClick(id);
|
|
122
|
-
},
|
|
123
|
-
adImpression: (id) => {
|
|
124
|
-
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackAdImpression(id);
|
|
125
|
-
}
|
|
126
|
-
},
|
|
127
110
|
playerSliderCallbacks: {
|
|
128
111
|
itemActivated: (item) => onPageActivated(item),
|
|
129
112
|
itemDeactivated: (itemId) => executeWithStreamId((streamId) => {
|
|
@@ -131,6 +114,22 @@ const contentPlayerConfig = new ContentPlayerConfig({
|
|
|
131
114
|
})
|
|
132
115
|
}
|
|
133
116
|
});
|
|
117
|
+
const streamActionsGenerator = new StreamActionsGenerator({
|
|
118
|
+
postSocialInteractionsHandler,
|
|
119
|
+
sharingHandler,
|
|
120
|
+
on: { attachmentClicked: () => (contentPlayerConfig.uiManager.attachmentsCollapsed = !contentPlayerConfig.uiManager.attachmentsCollapsed) }
|
|
121
|
+
});
|
|
122
|
+
const itemAsPostModel = (item) => {
|
|
123
|
+
if (item.type !== 'short-video' || !item.shortVideo) {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
if (mappedPostsCache.has(item.shortVideo.id)) {
|
|
127
|
+
return mappedPostsCache.get(item.shortVideo.id);
|
|
128
|
+
}
|
|
129
|
+
const postModel = new PostModel(mapToPostModel(item.shortVideo));
|
|
130
|
+
mappedPostsCache.set(item.shortVideo.id, postModel);
|
|
131
|
+
return postModel;
|
|
132
|
+
};
|
|
134
133
|
const handleChangePage = (index) => {
|
|
135
134
|
if (!buffer) {
|
|
136
135
|
return;
|
|
@@ -157,6 +156,23 @@ const onPageActivated = (id) => {
|
|
|
157
156
|
}
|
|
158
157
|
}
|
|
159
158
|
};
|
|
159
|
+
const onShortVideoProgress = (pageId, videoId, progress) => {
|
|
160
|
+
onProgress(pageId, videoId, progress);
|
|
161
|
+
};
|
|
162
|
+
const onShortVideoProductClick = (id, videoId) => {
|
|
163
|
+
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackShortVideoProductClick(id, videoId);
|
|
164
|
+
onStreamProductClick(id);
|
|
165
|
+
};
|
|
166
|
+
const onShortVideoProductImpression = (id, videoId) => {
|
|
167
|
+
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackShortVideoProductImpression(id, videoId);
|
|
168
|
+
onStreamProductImpression(id);
|
|
169
|
+
};
|
|
170
|
+
const onShortVideoAdClick = (id) => {
|
|
171
|
+
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackAdClick(id);
|
|
172
|
+
};
|
|
173
|
+
const onShortVideoAdImpression = (id) => {
|
|
174
|
+
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackAdImpression(id);
|
|
175
|
+
};
|
|
160
176
|
const onStreamProductClick = (productId) => {
|
|
161
177
|
executeWithStreamId((streamId) => {
|
|
162
178
|
analyticsHandler === null || analyticsHandler === void 0 ? void 0 : analyticsHandler.trackStreamProductClicked(productId, streamId);
|
|
@@ -178,6 +194,45 @@ const executeWithStreamId = (action) => {
|
|
|
178
194
|
}
|
|
179
195
|
action(currentStreamModel.id);
|
|
180
196
|
};
|
|
197
|
+
const currentItemActions = $derived.by(() => {
|
|
198
|
+
if (!(buffer === null || buffer === void 0 ? void 0 : buffer.current) || !buffer.activeChunk) {
|
|
199
|
+
return [];
|
|
200
|
+
}
|
|
201
|
+
const result = [];
|
|
202
|
+
if (buffer.current.type === 'general') {
|
|
203
|
+
result.push(...streamActionsGenerator.getGeneralStreamPageActions({
|
|
204
|
+
streamId: buffer.activeChunk.model.id,
|
|
205
|
+
streamPageId: buffer.current.id
|
|
206
|
+
}));
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
const postModel = itemAsPostModel(buffer.current);
|
|
210
|
+
const handler = streamActionsGenerator.getPostActionsHandler({
|
|
211
|
+
model: postModel,
|
|
212
|
+
streamId: buffer.activeChunk.model.id,
|
|
213
|
+
streamPageId: buffer.current.id
|
|
214
|
+
});
|
|
215
|
+
result.push(...handler.actions);
|
|
216
|
+
}
|
|
217
|
+
if (managementActions === null || managementActions === void 0 ? void 0 : managementActions.editStream) {
|
|
218
|
+
result.push({
|
|
219
|
+
icon: IconEdit,
|
|
220
|
+
callback: () => __awaiter(void 0, void 0, void 0, function* () {
|
|
221
|
+
yield managementActions.editStream(buffer.activeChunk.model.id);
|
|
222
|
+
})
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
if (managementActions === null || managementActions === void 0 ? void 0 : managementActions.deleteStreamPage) {
|
|
226
|
+
result.push({
|
|
227
|
+
icon: IconDelete,
|
|
228
|
+
iconColor: IconColor.Red,
|
|
229
|
+
callback: () => __awaiter(void 0, void 0, void 0, function* () {
|
|
230
|
+
yield managementActions.deleteStreamPage(buffer.current.id);
|
|
231
|
+
})
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
return result;
|
|
235
|
+
});
|
|
181
236
|
//#region Activity Tracking
|
|
182
237
|
const resetInactivityTimer = () => {
|
|
183
238
|
if (!isActive) {
|
|
@@ -222,22 +277,83 @@ const stopActivityTracking = () => {
|
|
|
222
277
|
//#edregion Activity Tracking
|
|
223
278
|
</script>
|
|
224
279
|
|
|
225
|
-
|
|
226
|
-
{
|
|
280
|
+
{#snippet attachmentsView(data: { item: StreamPageViewerModel })}
|
|
281
|
+
{@const postModel = itemAsPostModel(data.item)}
|
|
282
|
+
{#if postModel}
|
|
283
|
+
<PostAttachments
|
|
284
|
+
model={postModel}
|
|
285
|
+
colors={{
|
|
286
|
+
background: contentPlayerConfig.playerColors.cardBackground,
|
|
287
|
+
price: contentPlayerConfig.playerColors.price,
|
|
288
|
+
salePrice: contentPlayerConfig.playerColors.salePrice,
|
|
289
|
+
buttonBackground: contentPlayerConfig.playerColors.cardButton
|
|
290
|
+
}}
|
|
291
|
+
trackingParams={contentPlayerConfig.trackingParams}
|
|
292
|
+
locale={contentPlayerConfig.settings.locale}
|
|
293
|
+
on={{
|
|
294
|
+
productClick: (id) => onShortVideoProductClick(id, postModel.id),
|
|
295
|
+
productImpression: (id) => onShortVideoProductImpression(id, postModel.id),
|
|
296
|
+
adClick: (id) => onShortVideoAdClick(id),
|
|
297
|
+
adImpression: (id) => onShortVideoAdImpression(id)
|
|
298
|
+
}} />
|
|
299
|
+
{/if}
|
|
300
|
+
{/snippet}
|
|
301
|
+
<ContentPlayer
|
|
302
|
+
config={contentPlayerConfig}
|
|
303
|
+
itemActions={currentItemActions}
|
|
304
|
+
attachmentsView={buffer?.current && itemAsPostModel(buffer.current)?.attachments ? attachmentsView : undefined}>
|
|
305
|
+
{#snippet itemView({ item })}
|
|
227
306
|
{#if item.type === 'general'}
|
|
228
307
|
<StreamPageViewer
|
|
229
308
|
page={item}
|
|
230
309
|
trackingParams={streamTrackingParams}
|
|
231
310
|
locale={localization.locale}
|
|
311
|
+
overlayControls={{
|
|
312
|
+
enabled: contentPlayerConfig.uiManager.showControlsOverlay,
|
|
313
|
+
colors: {
|
|
314
|
+
active: contentPlayerConfig.playerColors.button,
|
|
315
|
+
inactive: contentPlayerConfig.playerColors.buttonInactive
|
|
316
|
+
},
|
|
317
|
+
actions: buffer?.activeChunk
|
|
318
|
+
? streamActionsGenerator.getGeneralStreamPageActions({ streamId: buffer.activeChunk.model.id, streamPageId: item.id })
|
|
319
|
+
: []
|
|
320
|
+
}}
|
|
232
321
|
on={{
|
|
233
322
|
progress: (videoId, progress) => onProgress(item.id, videoId, progress),
|
|
234
323
|
productClick: (productId) => onStreamProductClick(productId),
|
|
235
324
|
productImpression: (productId) => onStreamProductImpression(productId)
|
|
236
325
|
}} />
|
|
326
|
+
{:else}
|
|
327
|
+
{@const postModel = itemAsPostModel(item)}
|
|
328
|
+
{#if postModel}
|
|
329
|
+
{@const handler = buffer?.activeChunk
|
|
330
|
+
? streamActionsGenerator.getPostActionsHandler({
|
|
331
|
+
model: postModel,
|
|
332
|
+
streamId: buffer.activeChunk.model.id,
|
|
333
|
+
streamPageId: item.id
|
|
334
|
+
})
|
|
335
|
+
: null}
|
|
336
|
+
<PostViewer
|
|
337
|
+
model={postModel}
|
|
338
|
+
controlsColors={{ active: contentPlayerConfig.playerColors.button, inactive: contentPlayerConfig.playerColors.buttonInactive }}
|
|
339
|
+
trackingParams={contentPlayerConfig.trackingParams}
|
|
340
|
+
enableAttachments={contentPlayerConfig.uiManager.showAttachmentsOverlay}
|
|
341
|
+
enableControls={contentPlayerConfig.uiManager.showControlsOverlay}
|
|
342
|
+
controlActions={handler?.actions ?? []}
|
|
343
|
+
autoplay="on-appearance"
|
|
344
|
+
locale={contentPlayerConfig.settings.locale}
|
|
345
|
+
on={{
|
|
346
|
+
progress: (progress) => onShortVideoProgress(item.id, postModel.id, progress),
|
|
347
|
+
productClick: (productId) => onShortVideoProductClick(productId, postModel.id),
|
|
348
|
+
productImpression: (productId) => onShortVideoProductImpression(productId, postModel.id),
|
|
349
|
+
adClick: (adId) => onShortVideoAdClick(adId),
|
|
350
|
+
adImpression: (adId) => onShortVideoAdImpression(adId)
|
|
351
|
+
}} />
|
|
352
|
+
{/if}
|
|
237
353
|
{/if}
|
|
238
354
|
{/snippet}
|
|
239
355
|
{#snippet overviewPanelContent()}
|
|
240
|
-
{#if
|
|
356
|
+
{#if buffer}
|
|
241
357
|
<Overview
|
|
242
358
|
buffer={buffer}
|
|
243
359
|
activePageId={activePageId}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Locale } from '../../core/locale';
|
|
2
2
|
import type { ThemeValue } from '../../core/theme';
|
|
3
3
|
import type { IPostSocialInteractionsHandler } from '../../posts/social-interactions';
|
|
4
|
+
import type { IStreamSharingHandler } from '../sharing';
|
|
4
5
|
import type { StreamPageViewerModel } from '../stream-page-viewer';
|
|
5
6
|
import type { ICloseOrchestrator } from '../../ui/player/close-orchestrator';
|
|
6
7
|
import type { PlayerColors } from '../../ui/player/colors';
|
|
@@ -24,8 +25,10 @@ export type StreamsPlayerProps = {
|
|
|
24
25
|
provider: IStreamsPlayerDataProvider;
|
|
25
26
|
};
|
|
26
27
|
postSocialInteractionsHandler?: IPostSocialInteractionsHandler;
|
|
28
|
+
sharingHandler?: IStreamSharingHandler;
|
|
27
29
|
analyticsHandler?: IStreamAnalyticsHandler;
|
|
28
30
|
amplificationParameters?: StreamAmplificationParameters;
|
|
31
|
+
managementActions?: StreamManagementActions;
|
|
29
32
|
playerSettings?: StreamsPlayerSettings;
|
|
30
33
|
closeOrchestrator: ICloseOrchestrator;
|
|
31
34
|
on?: {
|
|
@@ -51,6 +54,10 @@ export type StreamAmplificationParameters = {
|
|
|
51
54
|
campaignName: string;
|
|
52
55
|
source: string;
|
|
53
56
|
};
|
|
57
|
+
export type StreamManagementActions = {
|
|
58
|
+
editStream: ((id: string) => void) | null;
|
|
59
|
+
deleteStreamPage: ((pageId: string) => void) | null;
|
|
60
|
+
};
|
|
54
61
|
export interface IStreamsPlayerDataProvider {
|
|
55
62
|
initialData: {
|
|
56
63
|
prefetchedStreams: StreamPlayerModel[];
|
|
@@ -63,6 +70,7 @@ export interface IStreamsPlayerDataProvider {
|
|
|
63
70
|
onEndReached?: () => void;
|
|
64
71
|
}
|
|
65
72
|
export interface IStreamAnalyticsHandler {
|
|
73
|
+
setOrganizationId: (organizationId: string) => void;
|
|
66
74
|
trackStreamView: (streamId: string) => void;
|
|
67
75
|
trackStreamPageView: (pageId: string, streamId: string) => void;
|
|
68
76
|
trackStreamProductImpression: (productId: string, streamId: string) => void;
|
|
@@ -36,6 +36,7 @@ let { style = undefined, size = ButtonSize.Standard, children } = $props();
|
|
|
36
36
|
}
|
|
37
37
|
.button-theme {
|
|
38
38
|
display: contents;
|
|
39
|
+
/*Size*/
|
|
39
40
|
}
|
|
40
41
|
.button-theme--standard {
|
|
41
42
|
--button--font--color: var(--sc-mc-color--text-primary);
|
|
@@ -45,15 +46,12 @@ let { style = undefined, size = ButtonSize.Standard, children } = $props();
|
|
|
45
46
|
--button--background--disabled: #f2f2f3;
|
|
46
47
|
--button--border: 1px solid #e5e7eb;
|
|
47
48
|
}
|
|
48
|
-
:global([data-theme=
|
|
49
|
+
:global([data-theme="dark"]) .button-theme--standard {
|
|
49
50
|
--button--background--hover: #1f2937;
|
|
50
51
|
--button--background--active: #374151;
|
|
51
52
|
--button--background--disabled: #374151;
|
|
52
53
|
--button--border: 1px solid #4b5563;
|
|
53
54
|
}
|
|
54
|
-
.button-theme {
|
|
55
|
-
/*Size*/
|
|
56
|
-
}
|
|
57
55
|
.button-theme--size-standard {
|
|
58
56
|
--button--height: 2em;
|
|
59
57
|
--button--text--font-size: 0.75em;
|
|
@@ -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,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;
|