@streamscloud/embeddable 16.3.2 → 17.0.0-1775767961522

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 (33) hide show
  1. package/dist/ads/ad-card/cmp.ad-card.svelte +11 -9
  2. package/dist/feed-player/cmp.close-button.svelte +40 -0
  3. package/dist/feed-player/cmp.close-button.svelte.d.ts +19 -0
  4. package/dist/feed-player/cmp.feed-player.svelte +514 -0
  5. package/dist/feed-player/cmp.feed-player.svelte.d.ts +14 -0
  6. package/dist/feed-player/feed-player-localization.d.ts +16 -0
  7. package/dist/feed-player/feed-player-localization.js +70 -0
  8. package/dist/feed-player/index.d.ts +3 -0
  9. package/dist/feed-player/index.js +2 -0
  10. package/dist/feed-player/sidebar/article-tab.svelte +98 -0
  11. package/dist/feed-player/sidebar/article-tab.svelte.d.ts +19 -0
  12. package/dist/feed-player/sidebar/information-tab.svelte +98 -0
  13. package/dist/feed-player/sidebar/information-tab.svelte.d.ts +26 -0
  14. package/dist/feed-player/sidebar/playlist-tab.svelte +114 -0
  15. package/dist/feed-player/sidebar/playlist-tab.svelte.d.ts +19 -0
  16. package/dist/feed-player/sidebar/post-card.svelte +127 -0
  17. package/dist/feed-player/sidebar/post-card.svelte.d.ts +24 -0
  18. package/dist/feed-player/sidebar/recommended-tab.svelte +160 -0
  19. package/dist/feed-player/sidebar/recommended-tab.svelte.d.ts +19 -0
  20. package/dist/feed-player/sidebar/sidebar-panel.svelte +76 -0
  21. package/dist/feed-player/sidebar/sidebar-panel.svelte.d.ts +27 -0
  22. package/dist/feed-player/sidebar/sidebar-tab-bar.svelte +45 -0
  23. package/dist/feed-player/sidebar/sidebar-tab-bar.svelte.d.ts +20 -0
  24. package/dist/feed-player/sidebar/types.d.ts +4 -0
  25. package/dist/feed-player/sidebar/types.js +1 -0
  26. package/dist/feed-player/types.d.ts +65 -0
  27. package/dist/feed-player/types.js +1 -0
  28. package/dist/posts/attachments/cmp.attachments.svelte +7 -2
  29. package/dist/posts/post-viewer/cmp.post-viewer.svelte +10 -7
  30. package/dist/posts/posts-player/posts-player-view.svelte +2 -0
  31. package/dist/products/product-card/cmp.product-card.svelte +16 -12
  32. package/dist/streams/streams-player/streams-player-view.svelte +2 -0
  33. package/package.json +5 -1
@@ -0,0 +1,160 @@
1
+ <script lang="ts">import { ProductCard } from '../../products/product-card';
2
+ import { FeedPlayerLocalization } from '../feed-player-localization';
3
+ import { default as PostCard } from './post-card.svelte';
4
+ import { Image } from '@streamscloud/kit/ui/image';
5
+ import { untrack } from 'svelte';
6
+ const { handler, currentPostId, trackingParams } = $props();
7
+ const localization = new FeedPlayerLocalization();
8
+ let data = $state.raw(null);
9
+ $effect(() => {
10
+ const postId = currentPostId;
11
+ untrack(() => {
12
+ data = null;
13
+ handler.getRecommendations(postId).then((result) => {
14
+ data = result;
15
+ });
16
+ });
17
+ });
18
+ </script>
19
+
20
+ {#if data}
21
+ <div class="recommended-tab">
22
+ {#if data.relatedPosts.length}
23
+ <div class="recommended-tab__section">
24
+ <div class="recommended-tab__section-title">{localization.relatedPosts}</div>
25
+ <div class="recommended-tab__posts">
26
+ {#each data.relatedPosts as post (post.id)}
27
+ <PostCard post={post} thumbnailWidth={82} thumbnailHeight={146} thumbnailRadius={6} on={{ click: () => handler.onPostSelect?.(post.id) }} />
28
+ {/each}
29
+ </div>
30
+ </div>
31
+ {/if}
32
+
33
+ {#if data.suggestedPlaylists.length}
34
+ <div class="recommended-tab__section">
35
+ <div class="recommended-tab__section-title">{localization.suggestedPlaylist}</div>
36
+ <div class="recommended-tab__playlists">
37
+ {#each data.suggestedPlaylists as playlist (playlist.id)}
38
+ <div class="recommended-tab__playlist-card">
39
+ <div class="recommended-tab__playlist-thumbnail">
40
+ <Image src={playlist.thumbnailUrl} />
41
+ </div>
42
+ <div class="recommended-tab__playlist-info">
43
+ <div class="recommended-tab__playlist-name">{playlist.name}</div>
44
+ <div class="recommended-tab__playlist-count">{localization.postsCount(playlist.postsCount)}</div>
45
+ <div class="recommended-tab__playlist-link" onclick={() => handler.onPlaylistSelect?.(playlist.id)} onkeydown={() => {}} role="none">
46
+ {localization.showList}
47
+ </div>
48
+ </div>
49
+ </div>
50
+ {/each}
51
+ </div>
52
+ </div>
53
+ {/if}
54
+
55
+ {#if data.suggestedProducts.length}
56
+ <div class="recommended-tab__section">
57
+ <div class="recommended-tab__section-title">{localization.suggestedProducts}</div>
58
+ <div class="recommended-tab__products">
59
+ {#each data.suggestedProducts as product (product.id)}
60
+ <div class="recommended-tab__product-wrapper">
61
+ <ProductCard product={product} trackingParams={trackingParams} on={{ click: handler.onProductSelect, buy: handler.onProductBuy }} />
62
+ </div>
63
+ {/each}
64
+ </div>
65
+ </div>
66
+ {/if}
67
+ </div>
68
+ {/if}
69
+
70
+ <!--
71
+ @component
72
+ Recommended tab — shows related posts, suggested playlists, and suggested products.
73
+
74
+ ### CSS Custom Properties
75
+ | Property | Description | Default |
76
+ |---|---|---|
77
+ | `--recommended-tab--section-gap` | Gap between sections | `24px` |
78
+ | `--recommended-tab--link-color` | "Show list" link color | `#144ab0` |
79
+ -->
80
+
81
+ <style>.recommended-tab {
82
+ --_recommended-tab--background: var(--recommended-tab--background, rgba(255, 255, 255, 0.8));
83
+ --_recommended-tab--border-color: var(--recommended-tab--border-color, #f9fafb);
84
+ --_recommended-tab--section-gap: var(--recommended-tab--section-gap, 1.5rem);
85
+ --_recommended-tab--link-color: var(--recommended-tab--link-color, #144ab0);
86
+ display: flex;
87
+ flex-direction: column;
88
+ gap: var(--_recommended-tab--section-gap);
89
+ background: var(--_recommended-tab--background);
90
+ border: 1px solid var(--_recommended-tab--border-color);
91
+ padding: 1rem 1rem 1.5rem;
92
+ min-height: 100%;
93
+ }
94
+ .recommended-tab__section {
95
+ display: flex;
96
+ flex-direction: column;
97
+ gap: 0.5rem;
98
+ }
99
+ .recommended-tab__section-title {
100
+ font-size: 1rem;
101
+ font-weight: 500;
102
+ }
103
+ .recommended-tab__posts {
104
+ display: flex;
105
+ flex-direction: column;
106
+ gap: 0.75rem;
107
+ }
108
+ .recommended-tab__playlists {
109
+ display: flex;
110
+ flex-direction: column;
111
+ gap: 0.75rem;
112
+ }
113
+ .recommended-tab__playlist-card {
114
+ display: flex;
115
+ gap: 1rem;
116
+ align-items: flex-end;
117
+ background: white;
118
+ border-radius: 0.375rem;
119
+ overflow: hidden;
120
+ }
121
+ .recommended-tab__playlist-thumbnail {
122
+ flex-shrink: 0;
123
+ width: 6.0625rem;
124
+ height: 9.125rem;
125
+ --sc-kit--image--object-fit: cover;
126
+ --sc-kit--image--border-radius: 0.25rem;
127
+ }
128
+ .recommended-tab__playlist-info {
129
+ display: flex;
130
+ flex-direction: column;
131
+ gap: 0.25rem;
132
+ padding: 0.5rem 0;
133
+ min-width: 0;
134
+ height: 9.125rem;
135
+ }
136
+ .recommended-tab__playlist-name {
137
+ font-size: 0.875rem;
138
+ font-weight: 600;
139
+ }
140
+ .recommended-tab__playlist-count {
141
+ font-size: 0.75rem;
142
+ font-weight: 400;
143
+ color: #999;
144
+ flex: 1;
145
+ }
146
+ .recommended-tab__playlist-link {
147
+ font-size: 0.75rem;
148
+ font-weight: 500;
149
+ color: var(--_recommended-tab--link-color);
150
+ cursor: pointer;
151
+ }
152
+ .recommended-tab__products {
153
+ display: flex;
154
+ gap: 0.75rem;
155
+ overflow-x: auto;
156
+ scrollbar-width: none;
157
+ }
158
+ .recommended-tab__product-wrapper {
159
+ flex: 0 0 10.0625rem;
160
+ }</style>
@@ -0,0 +1,19 @@
1
+ import type { TrackingParams } from '../../marketing-tracking';
2
+ import type { IFeedPlayerRecommendedHandler } from '../types';
3
+ type Props = {
4
+ handler: IFeedPlayerRecommendedHandler;
5
+ currentPostId: string;
6
+ trackingParams: TrackingParams;
7
+ };
8
+ /**
9
+ * Recommended tab — shows related posts, suggested playlists, and suggested products.
10
+ *
11
+ * ### CSS Custom Properties
12
+ * | Property | Description | Default |
13
+ * |---|---|---|
14
+ * | `--recommended-tab--section-gap` | Gap between sections | `24px` |
15
+ * | `--recommended-tab--link-color` | "Show list" link color | `#144ab0` |
16
+ */
17
+ declare const RecommendedTab: import("svelte").Component<Props, {}, "">;
18
+ type RecommendedTab = ReturnType<typeof RecommendedTab>;
19
+ export default RecommendedTab;
@@ -0,0 +1,76 @@
1
+ <script lang="ts">import { ProductCard } from '../../products/product-card';
2
+ import { default as ArticleTab } from './article-tab.svelte';
3
+ import { default as InformationTab } from './information-tab.svelte';
4
+ import { default as PlaylistTab } from './playlist-tab.svelte';
5
+ import { default as RecommendedTab } from './recommended-tab.svelte';
6
+ import { default as SidebarTabBar } from './sidebar-tab-bar.svelte';
7
+ const selectedProduct = $derived.by(() => {
8
+ if (!selectedProductId || !model.attachments) {
9
+ return null;
10
+ }
11
+ return model.attachments.products.find((p) => p.id === selectedProductId) ?? null;
12
+ });
13
+ let { tabs, activeTabId, model, trackingParams, selectedProductId, recommendedHandler, playlistHandler, on } = $props();
14
+ </script>
15
+
16
+ <div class="sidebar-panel">
17
+ {#if tabs.length > 1}
18
+ <SidebarTabBar tabs={tabs} activeTabId={activeTabId} on={{ tabChange: on.tabChange }} />
19
+ {/if}
20
+
21
+ <div class="sidebar-panel__content">
22
+ {#if activeTabId === 'information'}
23
+ <InformationTab
24
+ model={model}
25
+ trackingParams={trackingParams}
26
+ selectedProductId={selectedProductId}
27
+ on={{
28
+ productImpression: on.productImpression,
29
+ productBuy: on.productBuy,
30
+ productSelect: on.productSelect,
31
+ adClick: on.adClick,
32
+ adImpression: on.adImpression
33
+ }} />
34
+ {:else if activeTabId === 'product' && selectedProduct}
35
+ <div class="sidebar-panel__product">
36
+ <ProductCard
37
+ product={selectedProduct}
38
+ trackingParams={trackingParams}
39
+ on={{
40
+ click: on.productClick,
41
+ buy: on.productBuy
42
+ }} />
43
+ </div>
44
+ {:else if activeTabId === 'article'}
45
+ <ArticleTab model={model} on={{ readMore: on.articleReadMore }} />
46
+ {:else if activeTabId === 'recommended' && recommendedHandler}
47
+ <RecommendedTab
48
+ handler={recommendedHandler}
49
+ currentPostId={model.id}
50
+ trackingParams={trackingParams} />
51
+ {:else if activeTabId === 'playlist' && playlistHandler}
52
+ <PlaylistTab handler={playlistHandler} activePostId={model.id} on={{ postActivate: on.postActivate }} />
53
+ {/if}
54
+ </div>
55
+ </div>
56
+
57
+ <style>.sidebar-panel {
58
+ display: flex;
59
+ flex-direction: column;
60
+ gap: 1rem;
61
+ height: 100%;
62
+ overflow: hidden;
63
+ }
64
+ .sidebar-panel__content {
65
+ flex: 1;
66
+ min-height: 0;
67
+ overflow-y: auto;
68
+ overflow-x: hidden;
69
+ overscroll-behavior: contain;
70
+ scrollbar-width: none;
71
+ border-radius: 0.5rem;
72
+ }
73
+ .sidebar-panel__product {
74
+ padding: 0.75rem;
75
+ --product-card--aspect-ratio: auto;
76
+ }</style>
@@ -0,0 +1,27 @@
1
+ import type { TrackingParams } from '../../marketing-tracking';
2
+ import type { PostModel } from '../../posts/model';
3
+ import type { IFeedPlayerPlaylistHandler, IFeedPlayerRecommendedHandler } from '../types';
4
+ import type { SidebarTab } from './types';
5
+ type Props = {
6
+ tabs: SidebarTab[];
7
+ activeTabId: string;
8
+ model: PostModel;
9
+ trackingParams: TrackingParams;
10
+ selectedProductId: string | null;
11
+ recommendedHandler?: IFeedPlayerRecommendedHandler;
12
+ playlistHandler?: IFeedPlayerPlaylistHandler;
13
+ on: {
14
+ tabChange: (id: string) => void;
15
+ productClick?: (productId: string) => void;
16
+ productImpression?: (productId: string) => void;
17
+ productBuy?: (productId: string) => void;
18
+ productSelect?: (productId: string) => void;
19
+ adClick?: (adId: string) => void;
20
+ adImpression?: (adId: string) => void;
21
+ articleReadMore?: (articleId: string) => void;
22
+ postActivate?: (postId: string) => void;
23
+ };
24
+ };
25
+ declare const SidebarPanel: import("svelte").Component<Props, {}, "">;
26
+ type SidebarPanel = ReturnType<typeof SidebarPanel>;
27
+ export default SidebarPanel;
@@ -0,0 +1,45 @@
1
+ <script lang="ts">let { tabs, activeTabId, on } = $props();
2
+ export {};
3
+ </script>
4
+
5
+ <div class="sidebar-tab-bar">
6
+ {#each tabs as tab (tab.id)}
7
+ <button type="button" class="sidebar-tab-bar__tab" class:sidebar-tab-bar__tab--active={tab.id === activeTabId} onclick={() => on.tabChange(tab.id)}>
8
+ {tab.label}
9
+ </button>
10
+ {/each}
11
+ </div>
12
+
13
+ <!--
14
+ @component
15
+ Tab bar for the feed player sidebar.
16
+
17
+ ### CSS Custom Properties
18
+ | Property | Description | Default |
19
+ |---|---|---|
20
+ | `--sidebar-tab-bar--color` | Inactive tab text color | `#9ca3af` |
21
+ | `--sidebar-tab-bar--color-active` | Active tab text color | `currentColor` |
22
+ -->
23
+
24
+ <style>.sidebar-tab-bar {
25
+ --_sidebar-tab-bar--color: var(--sidebar-tab-bar--color, #9ca3af);
26
+ --_sidebar-tab-bar--color-active: var(--sidebar-tab-bar--color-active, currentColor);
27
+ display: flex;
28
+ gap: 2.25rem;
29
+ flex-shrink: 0;
30
+ }
31
+ .sidebar-tab-bar__tab {
32
+ font-size: 0.75rem;
33
+ font-weight: 400;
34
+ line-height: 1rem;
35
+ color: var(--_sidebar-tab-bar--color);
36
+ background: none;
37
+ border: none;
38
+ padding: 0;
39
+ cursor: pointer;
40
+ white-space: nowrap;
41
+ }
42
+ .sidebar-tab-bar__tab--active {
43
+ font-weight: 500;
44
+ color: var(--_sidebar-tab-bar--color-active);
45
+ }</style>
@@ -0,0 +1,20 @@
1
+ import type { SidebarTab } from './types';
2
+ type Props = {
3
+ tabs: SidebarTab[];
4
+ activeTabId: string;
5
+ on: {
6
+ tabChange: (id: string) => void;
7
+ };
8
+ };
9
+ /**
10
+ * Tab bar for the feed player sidebar.
11
+ *
12
+ * ### CSS Custom Properties
13
+ * | Property | Description | Default |
14
+ * |---|---|---|
15
+ * | `--sidebar-tab-bar--color` | Inactive tab text color | `#9ca3af` |
16
+ * | `--sidebar-tab-bar--color-active` | Active tab text color | `currentColor` |
17
+ */
18
+ declare const SidebarTabBar: import("svelte").Component<Props, {}, "">;
19
+ type SidebarTabBar = ReturnType<typeof SidebarTabBar>;
20
+ export default SidebarTabBar;
@@ -0,0 +1,4 @@
1
+ export type SidebarTab = {
2
+ id: string;
3
+ label: string;
4
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,65 @@
1
+ import type { TrackingParams } from '../marketing-tracking';
2
+ import type { IPostModel } from '../posts/model';
3
+ import type { IPostAnalyticsHandler } from '../posts/posts-player';
4
+ import type { IPostSharingHandler } from '../posts/sharing';
5
+ import type { IPostSocialInteractionsHandler } from '../posts/social-interactions';
6
+ import type { ProductCardModel } from '../products/product-card';
7
+ import type { AppLocaleValue } from '@streamscloud/kit/core/locale';
8
+ import type { IPlayerDataProvider } from '@streamscloud/kit/ui/player/providers';
9
+ import type { Snippet } from 'svelte';
10
+ export type FeedPlayerPostPreview = {
11
+ id: string;
12
+ thumbnailUrl: string | null;
13
+ title: string;
14
+ description: string | null;
15
+ displayDate: string;
16
+ viewsCount: number;
17
+ durationSeconds: number | null;
18
+ };
19
+ export type FeedPlayerSuggestedPlaylist = {
20
+ id: string;
21
+ name: string;
22
+ postsCount: number;
23
+ thumbnailUrl: string | null;
24
+ };
25
+ export type FeedPlayerRecommendedData = {
26
+ relatedPosts: FeedPlayerPostPreview[];
27
+ suggestedPlaylists: FeedPlayerSuggestedPlaylist[];
28
+ suggestedProducts: ProductCardModel[];
29
+ };
30
+ export interface IFeedPlayerRecommendedHandler {
31
+ getRecommendations: (postId: string) => Promise<FeedPlayerRecommendedData>;
32
+ onPostSelect?: (postId: string) => void;
33
+ onPlaylistSelect?: (playlistId: string) => void;
34
+ onProductSelect?: (productId: string) => void;
35
+ onProductBuy?: (productId: string) => void;
36
+ }
37
+ export type FeedPlayerPlaylistData = {
38
+ name: string;
39
+ updatedAt: string;
40
+ posts: FeedPlayerPostPreview[];
41
+ };
42
+ export interface IFeedPlayerPlaylistHandler {
43
+ getPlaylist: () => Promise<FeedPlayerPlaylistData>;
44
+ }
45
+ export type FeedPlayerProps = {
46
+ dataProvider: IPlayerDataProvider<IPostModel>;
47
+ socialInteractionsHandler?: IPostSocialInteractionsHandler;
48
+ sharingHandler?: IPostSharingHandler;
49
+ analyticsHandler?: IPostAnalyticsHandler;
50
+ recommendedHandler?: IFeedPlayerRecommendedHandler;
51
+ playlistHandler?: IFeedPlayerPlaylistHandler;
52
+ trackingParams?: TrackingParams;
53
+ settings?: FeedPlayerSettings;
54
+ header?: Snippet;
55
+ on?: {
56
+ postActivated?: (id: string) => void;
57
+ productBuy?: (productId: string) => void;
58
+ articleReadMore?: (articleId: string) => void;
59
+ closed?: () => void;
60
+ };
61
+ };
62
+ export type FeedPlayerSettings = {
63
+ locale?: AppLocaleValue;
64
+ background?: 'solid' | 'glass' | 'transparent';
65
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -44,11 +44,16 @@ const trackingParams = $derived.by(() => {
44
44
 
45
45
  <style>.post-attachments {
46
46
  --_post-attachments--gap: var(--post-attachments--gap, 1.875rem);
47
+ --ad-card--background-color: var(--sc-player--card-background);
48
+ --ad-card--price-color: var(--sc-player--price);
49
+ --ad-card--text--primary: var(--sc-mc-color--text-primary);
50
+ --ad-card--text-secondary: var(--sc-mc-color--text-secondary);
47
51
  --product-card--background-color: var(--sc-player--card-background);
52
+ --product-card--button--background: var(--sc-player--card-button);
53
+ --product-card--button--color: var(--sc-mc-color--text-primary);
48
54
  --product-card--price-color: var(--sc-player--price);
49
55
  --product-card--sale-price-color: var(--sc-player--sale-price);
50
- --ad-card--background-color: var(--sc-player--card-background);
51
- --ad-card--price-color: var(--sc-player--price);
56
+ --product-card--text-secondary: var(--sc-mc-color--text-secondary);
52
57
  display: flex;
53
58
  flex-direction: column;
54
59
  gap: var(--_post-attachments--gap);
@@ -14,13 +14,14 @@ $effect(() => {
14
14
  uiManager.enableControls = enableControls;
15
15
  });
16
16
  const trackingParams = $derived.by(() => {
17
- if (externalTrackingParams || externalTrackingParams === false) {
18
- return externalTrackingParams;
17
+ if (externalTrackingParams === false) {
18
+ return false;
19
19
  }
20
- if (model.postType === 'SHORT_VIDEO') {
21
- return { shortVideoId: model.id };
20
+ const shortVideoId = model.postType === 'SHORT_VIDEO' ? model.id : undefined;
21
+ if (!externalTrackingParams && !shortVideoId) {
22
+ return false;
22
23
  }
23
- return false;
24
+ return { ...externalTrackingParams, shortVideoId };
24
25
  });
25
26
  const viewerMounted = (node) => {
26
27
  const resizeObserver = new ResizeObserver(() => {
@@ -97,6 +98,8 @@ const variables = $derived.by(() => {
97
98
  </div>
98
99
 
99
100
  <style>.post-viewer {
101
+ --_post-viewer--button--color: var(--post-viewer--button--color, light-dark(#272727, #000000));
102
+ --_post-viewer--button--color--inactive: var(--post-viewer--button--color--inactive, rgb(from var(--_post-viewer--button--color) r g b / 60%));
100
103
  width: 100%;
101
104
  min-width: 100%;
102
105
  max-width: 100%;
@@ -115,8 +118,8 @@ const variables = $derived.by(() => {
115
118
  }
116
119
  }
117
120
  .post-viewer__controls-panel {
118
- --sc-kit--player-button--color: var(--sc-player--button);
119
- --sc-kit--player-button--color--inactive: var(--sc-player--button-inactive);
121
+ --sc-kit--player-button--color: var(--_post-viewer--button--color);
122
+ --sc-kit--player-button--color--inactive: var(--_post-viewer--button--color--inactive);
120
123
  position: absolute;
121
124
  left: auto;
122
125
  right: 0;
@@ -188,4 +188,6 @@ const currentItemActions = $derived.by(() => {
188
188
  display: contents;
189
189
  --sc-kit--player-button--color: var(--sc-player--button);
190
190
  --sc-kit--player-button--color--inactive: var(--sc-player--button-inactive);
191
+ --post-viewer--button--color: var(--sc-player--button);
192
+ --post-viewer--button--color--inactive: var(--sc-player--button-inactive);
191
193
  }</style>
@@ -46,7 +46,7 @@ const onBuyClicked = (event) => {
46
46
  };
47
47
  </script>
48
48
 
49
- <div class="product-card" class:product-card--with-buy={!!on?.buy} inert={inert} use:trackImpression>
49
+ <div class="product-card" class:product-card--with-buy={!!on?.buy} use:trackImpression>
50
50
  <ProportionalContainer ratio={1}>
51
51
  <Image src={product.image} />
52
52
  </ProportionalContainer>
@@ -84,10 +84,12 @@ const onBuyClicked = (event) => {
84
84
  {/if}
85
85
  </div>
86
86
 
87
- {#if enrichedLink}
88
- <a href={enrichedLink.href} onclick={onProductClicked} target="_blank" rel="noopener noreferrer" class="product-card__link" aria-label="none">&nbsp;</a>
89
- {:else if on?.click}
90
- <button type="button" onclick={onProductClicked} class="product-card__link" aria-label="none">&nbsp;</button>
87
+ {#if !inert}
88
+ {#if enrichedLink}
89
+ <a href={enrichedLink.href} onclick={onProductClicked} target="_blank" rel="noopener noreferrer" class="product-card__link" aria-label="none">&nbsp;</a>
90
+ {:else if on?.click}
91
+ <button type="button" onclick={onProductClicked} class="product-card__link" aria-label="none">&nbsp;</button>
92
+ {/if}
91
93
  {/if}
92
94
  </div>
93
95
 
@@ -96,8 +98,11 @@ const onBuyClicked = (event) => {
96
98
  --_product-card--border-radius: var(--product-card--border-radius, 0.5rem);
97
99
  --_product-card--background-color: var(--product-card--background-color, rgb(from light-dark(#ffffff, #000000) r g b / 90%));
98
100
  --_product-card--border-color: var(--product-card--border-color, light-dark(#f2f2f2, #000000));
101
+ --_product-card--button--background: var(--product-card--button--background, light-dark(#f9fafb, #1f2937));
102
+ --_product-card--button--color: var(--product-card--button--color, #9ca3af);
99
103
  --_product-card--price-color: var(--product-card--price-color, inherit);
100
104
  --_product-card--sale-price-color: var(--product-card--sale-price-color, inherit);
105
+ --_product-card--text-secondary: var(--product-card--text-secondary, light-dark(#6b7280, #d1d5db));
101
106
  --product-price-color: var(--_product-card--price-color);
102
107
  --product-price--sale--color: var(--_product-card--sale-price-color);
103
108
  --sc-kit--image--border-radius: 0.25rem;
@@ -169,7 +174,7 @@ const onBuyClicked = (event) => {
169
174
  }
170
175
  .product-card__description {
171
176
  font-weight: 400;
172
- color: var(--sc-mc-color--text-secondary);
177
+ color: var(--_product-card--text-secondary);
173
178
  font-size: 0.9375rem;
174
179
  line-height: 1.375rem;
175
180
  min-height: 1.375rem;
@@ -195,11 +200,10 @@ const onBuyClicked = (event) => {
195
200
  position: relative;
196
201
  z-index: 1;
197
202
  margin-top: 0.625rem;
198
- --sc-kit--button--background: light-dark(
199
- var(--sc-player--light--card-button, #f2f2f2),
200
- var(--sc-player--dark--card-button, #2e2e2e)
201
- );
202
- --sc-kit--button--font--color: var(--sc-mc-color--text-primary);
203
+ --sc-kit--button--background: var(--_product-card--button--background);
204
+ --sc-kit--button--font--color: var(--_product-card--button--color);
205
+ --sc-kit--button--text--font-size: 0.75rem;
206
+ --sc-kit--button--icon--font-size: 1rem;
203
207
  /* Set 'container-type: inline-size;' to reference container*/
204
208
  }
205
209
  @container (width < 230px) {
@@ -215,7 +219,7 @@ const onBuyClicked = (event) => {
215
219
  .product-price {
216
220
  --_product-price--color: var(--product-price-color);
217
221
  --_product-price--sale--color: var(--product-price--sale--color);
218
- --_product-price--before--color: var(--sc-mc-color--text-secondary);
222
+ --_product-price--before--color: var(--_product-card--text-secondary);
219
223
  --_product-price--before--font-size: 0.75em;
220
224
  --_product-price--font-size: 1.875em;
221
225
  --_product-price--gap: 0.375em;
@@ -405,6 +405,8 @@ const stopActivityTracking = () => {
405
405
  display: contents;
406
406
  --sc-kit--player-button--color: var(--sc-player--button);
407
407
  --sc-kit--player-button--color--inactive: var(--sc-player--button-inactive);
408
+ --post-viewer--button--color: var(--sc-player--button);
409
+ --post-viewer--button--color--inactive: var(--sc-player--button-inactive);
408
410
  --player--overview-panel--background: var(--sc-player--sidebar-background);
409
411
  }
410
412
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@streamscloud/embeddable",
3
- "version": "16.3.2",
3
+ "version": "17.0.0-1775767961522",
4
4
  "author": "StreamsCloud",
5
5
  "repository": {
6
6
  "type": "git",
@@ -42,6 +42,10 @@
42
42
  "types": "./dist/external-api/index.d.ts",
43
43
  "svelte": "./dist/external-api/index.js"
44
44
  },
45
+ "./feed-player": {
46
+ "types": "./dist/feed-player/index.d.ts",
47
+ "svelte": "./dist/feed-player/index.js"
48
+ },
45
49
  "./media-center": {
46
50
  "types": "./dist/media-center/index.d.ts",
47
51
  "svelte": "./dist/media-center/index.js"