@streamscloud/embeddable 10.1.2 → 11.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 (112) hide show
  1. package/dist/ads/ad-card/cmp.ad-card.svelte +27 -7
  2. package/dist/ads/ad-card/cmp.ad-card.svelte.d.ts +5 -0
  3. package/dist/content-player/cmp.content-player.svelte +30 -40
  4. package/dist/content-player/content-player-config.svelte.d.ts +13 -2
  5. package/dist/content-player/content-player-config.svelte.js +8 -5
  6. package/dist/content-player/content-player-settings.d.ts +12 -0
  7. package/dist/content-player/content-player-settings.js +12 -0
  8. package/dist/content-player/controls-and-attachments.svelte +25 -54
  9. package/dist/content-player/header.svelte +10 -132
  10. package/dist/content-player/header.svelte.d.ts +0 -4
  11. package/dist/content-player/overview-panel.svelte +22 -72
  12. package/dist/content-player/overview-panel.svelte.d.ts +30 -7
  13. package/dist/content-player/ui-manager.svelte.d.ts +2 -4
  14. package/dist/content-player/ui-manager.svelte.js +3 -5
  15. package/dist/media-center/config/internal-media-center-config.js +2 -1
  16. package/dist/media-center/config/operations.generated.d.ts +13 -0
  17. package/dist/media-center/config/operations.generated.js +20 -0
  18. package/dist/media-center/config/operations.graphql +13 -0
  19. package/dist/media-center/config/types.d.ts +13 -0
  20. package/dist/media-center/media-center/cmp.media-center.svelte +117 -348
  21. package/dist/media-center/media-center/cmp.media-center.svelte.d.ts +3 -1
  22. package/dist/media-center/media-center/{discover-panel-handler.svelte.d.ts → discover/discover-panel-handler.svelte.d.ts} +5 -6
  23. package/dist/media-center/media-center/{discover-panel-handler.svelte.js → discover/discover-panel-handler.svelte.js} +1 -8
  24. package/dist/media-center/media-center/discover/discover-panel-localization.d.ts +19 -0
  25. package/dist/media-center/media-center/discover/discover-panel-localization.js +78 -0
  26. package/dist/media-center/media-center/{discover-panel.svelte → discover/discover-panel.svelte} +18 -9
  27. package/dist/media-center/media-center/discover/discover-panel.svelte.d.ts +15 -0
  28. package/dist/media-center/media-center/discover/index.d.ts +2 -0
  29. package/dist/media-center/media-center/discover/index.js +2 -0
  30. package/dist/media-center/media-center/handlers/categories-handler.svelte.d.ts +21 -0
  31. package/dist/media-center/media-center/handlers/categories-handler.svelte.js +36 -0
  32. package/dist/media-center/media-center/handlers/feed-handler.svelte.d.ts +6 -0
  33. package/dist/media-center/media-center/handlers/feed-handler.svelte.js +12 -0
  34. package/dist/media-center/media-center/handlers/index.d.ts +2 -0
  35. package/dist/media-center/media-center/handlers/index.js +2 -0
  36. package/dist/media-center/media-center/header-footer/index.d.ts +3 -0
  37. package/dist/media-center/media-center/header-footer/index.js +3 -0
  38. package/dist/media-center/media-center/header-footer/media-center-footer.svelte +77 -0
  39. package/dist/media-center/media-center/header-footer/media-center-footer.svelte.d.ts +7 -0
  40. package/dist/media-center/media-center/header-footer/media-center-header-localization.d.ts +12 -0
  41. package/dist/media-center/media-center/header-footer/media-center-header-localization.js +40 -0
  42. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte +91 -0
  43. package/dist/media-center/media-center/header-footer/media-center-header-mobile.svelte.d.ts +11 -0
  44. package/dist/media-center/media-center/header-footer/media-center-header.svelte +310 -0
  45. package/dist/media-center/media-center/header-footer/media-center-header.svelte.d.ts +13 -0
  46. package/dist/media-center/media-center/media-center-context.svelte.d.ts +50 -0
  47. package/dist/media-center/media-center/media-center-context.svelte.js +98 -0
  48. package/dist/media-center/media-center/{category-following-wrapper.svelte → menu/category-following-wrapper.svelte} +3 -2
  49. package/dist/media-center/media-center/{category-following-wrapper.svelte.d.ts → menu/category-following-wrapper.svelte.d.ts} +2 -2
  50. package/dist/media-center/media-center/menu/index.d.ts +2 -0
  51. package/dist/media-center/media-center/menu/index.js +2 -0
  52. package/dist/media-center/media-center/menu/menu-localization.d.ts +19 -0
  53. package/dist/media-center/media-center/menu/menu-localization.js +78 -0
  54. package/dist/media-center/media-center/menu/menu.svelte +345 -0
  55. package/dist/media-center/media-center/menu/menu.svelte.d.ts +14 -0
  56. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.d.ts +10 -0
  57. package/dist/media-center/media-center/menu/popular-streams-panel-handler.svelte.js +26 -0
  58. package/dist/media-center/media-center/providers/index.d.ts +2 -0
  59. package/dist/media-center/media-center/providers/index.js +2 -0
  60. package/dist/media-center/media-center/providers/post-player-provider-generator.d.ts +8 -0
  61. package/dist/media-center/media-center/{post-player-provider-generator.js → providers/post-player-provider-generator.js} +3 -3
  62. package/dist/media-center/media-center/{streams-player-provider-generator.d.ts → providers/streams-player-provider-generator.d.ts} +2 -2
  63. package/dist/media-center/media-center/{streams-player-provider-generator.js → providers/streams-player-provider-generator.js} +2 -2
  64. package/dist/media-center/media-center/streams-in-category/index.d.ts +2 -0
  65. package/dist/media-center/media-center/streams-in-category/index.js +2 -0
  66. package/dist/media-center/media-center/{streams-in-category-panel-handler.svelte.d.ts → streams-in-category/streams-in-category-panel-handler.svelte.d.ts} +4 -4
  67. package/dist/media-center/media-center/{streams-in-category-panel-handler.svelte.js → streams-in-category/streams-in-category-panel-handler.svelte.js} +5 -5
  68. package/dist/media-center/media-center/{streams-in-category-panel.svelte → streams-in-category/streams-in-category-panel.svelte} +1 -1
  69. package/dist/media-center/media-center/{streams-in-category-panel.svelte.d.ts → streams-in-category/streams-in-category-panel.svelte.d.ts} +1 -1
  70. package/dist/media-center/media-center/types.d.ts +1 -1
  71. package/dist/media-center/model/types.d.ts +7 -6
  72. package/dist/posts/attachments/cmp.attachments.svelte +5 -3
  73. package/dist/posts/attachments/cmp.attachments.svelte.d.ts +6 -0
  74. package/dist/posts/controls/cmp.controls.svelte +3 -3
  75. package/dist/posts/controls/cmp.controls.svelte.d.ts +2 -0
  76. package/dist/posts/post-viewer/cmp.post-viewer.svelte +3 -1
  77. package/dist/posts/post-viewer/cmp.post-viewer.svelte.d.ts +4 -0
  78. package/dist/products/product-card/cmp.product-card.svelte +35 -11
  79. package/dist/products/product-card/cmp.product-card.svelte.d.ts +5 -0
  80. package/dist/streams/data-loaders/mapper.js +0 -5
  81. package/dist/streams/data-loaders/operations.generated.d.ts +0 -12
  82. package/dist/streams/data-loaders/operations.generated.js +0 -26
  83. package/dist/streams/data-loaders/operations.graphql +0 -6
  84. package/dist/streams/layout/element-views/cmp.short-video-stream-element.svelte +2 -1
  85. package/dist/streams/layout/element-views/cmp.short-video-stream-element.svelte.d.ts +4 -0
  86. package/dist/streams/stream-card/cmp.stream-card.svelte +5 -5
  87. package/dist/streams/streams-player/index.js +1 -1
  88. package/dist/streams/streams-player/stream-overview.svelte +6 -96
  89. package/dist/streams/streams-player/stream-overview.svelte.d.ts +0 -4
  90. package/dist/streams/streams-player/stream-player-localization.d.ts +0 -1
  91. package/dist/streams/streams-player/stream-player-localization.js +0 -6
  92. package/dist/streams/streams-player/streams-player-view.svelte +0 -2
  93. package/dist/streams/streams-player/types.d.ts +0 -4
  94. package/dist/ui/icon/cmp.icon.svelte +3 -2
  95. package/dist/ui/player/button/cmp.player-button.svelte +17 -5
  96. package/dist/ui/player/button/cmp.player-button.svelte.d.ts +3 -0
  97. package/dist/ui/player/button/cmp.player-buttons-group.svelte +20 -5
  98. package/dist/ui/player/button/cmp.player-buttons-group.svelte.d.ts +2 -0
  99. package/dist/ui/player/button/types.d.ts +2 -0
  100. package/package.json +1 -1
  101. package/dist/content-player/content-player-localization.d.ts +0 -6
  102. package/dist/content-player/content-player-localization.js +0 -15
  103. package/dist/media-center/media-center/desktop-categories-selector.svelte +0 -132
  104. package/dist/media-center/media-center/desktop-categories-selector.svelte.d.ts +0 -12
  105. package/dist/media-center/media-center/discover-panel.svelte.d.ts +0 -15
  106. package/dist/media-center/media-center/media-center-handler.svelte.d.ts +0 -28
  107. package/dist/media-center/media-center/media-center-handler.svelte.js +0 -73
  108. package/dist/media-center/media-center/media-center-localization.d.ts +0 -10
  109. package/dist/media-center/media-center/media-center-localization.js +0 -39
  110. package/dist/media-center/media-center/mobile-controls-panel.svelte +0 -268
  111. package/dist/media-center/media-center/mobile-controls-panel.svelte.d.ts +0 -20
  112. package/dist/media-center/media-center/post-player-provider-generator.d.ts +0 -8
@@ -4,7 +4,7 @@ import { Image } from '../../ui/image';
4
4
  import { LineClamp } from '../../ui/line-clamp';
5
5
  import { ProportionalContainer } from '../../ui/proportional-container';
6
6
  import { ProductCardLocalization } from './product-card-localization';
7
- let { product, includeBeforeNowPrefix, trackingParams, inert = false, locale = 'en', on } = $props();
7
+ let { product, colors, includeBeforeNowPrefix, trackingParams, inert = false, locale = 'en', on } = $props();
8
8
  const localization = $derived(new ProductCardLocalization(locale));
9
9
  const shortDescriptionPresented = $derived(product.shortDescription && product.shortDescription.length > 0);
10
10
  const trackImpression = (node) => {
@@ -37,9 +37,22 @@ const onProductClicked = (event) => {
37
37
  window.open(enrichedLink, '_blank', 'noopener noreferrer');
38
38
  }
39
39
  };
40
+ const styles = $derived.by(() => {
41
+ const values = [];
42
+ if (colors === null || colors === void 0 ? void 0 : colors.background) {
43
+ values.push(`--product-card--background-color: ${colors.background}`);
44
+ }
45
+ if (colors === null || colors === void 0 ? void 0 : colors.price) {
46
+ values.push(`--product-card--price-color: ${colors.price}`);
47
+ }
48
+ if (colors === null || colors === void 0 ? void 0 : colors.salePrice) {
49
+ values.push(`--product-card--sale-price-color: ${colors.salePrice}`);
50
+ }
51
+ return values.join(';');
52
+ });
40
53
  </script>
41
54
 
42
- <div class="product-card" inert={inert} use:trackImpression>
55
+ <div class="product-card" inert={inert} use:trackImpression style={styles}>
43
56
  <ProportionalContainer ratio={1}>
44
57
  <Image src={product.image} />
45
58
  </ProportionalContainer>
@@ -63,7 +76,7 @@ const onProductClicked = (event) => {
63
76
  {toPriceRepresentation({ amount: product.price, currency: product.currency })}
64
77
  {/if}
65
78
  </div>
66
- <div class="product-price__price product-price__price--sale">
79
+ <div class="product-price__price" class:product-price__price--sale={product.salePrice}>
67
80
  {toPriceRepresentation({ amount: product.salePrice ?? product.price, currency: product.currency })}
68
81
  </div>
69
82
  </div>
@@ -90,6 +103,12 @@ const onProductClicked = (event) => {
90
103
  .product-card {
91
104
  --_product-card--aspect-ratio: var(--product-card--aspect-ratio, 10/16);
92
105
  --_product-card--border-radius: var(--product-card--border-radius, 0.5rem);
106
+ --_product-card--background-color: var(--product-card--background-color, rgb(from #ffffff r g b/90%));
107
+ --_product-card--border-color: var(--product-card--background-color, #f2f2f3);
108
+ --_product-card--price-color: var(--product-card--price-color, inherit);
109
+ --_product-card--sale-price-color: var(--product-card--sale-price-color, inherit);
110
+ --product-price-color: var(--_product-card--price-color);
111
+ --product-price--sale--color: var(--_product-card--sale-price-color);
93
112
  --image--border-radius: 0.25rem;
94
113
  --image--object-fit: contain;
95
114
  --image--width: auto;
@@ -102,17 +121,17 @@ const onProductClicked = (event) => {
102
121
  container-type: inline-size;
103
122
  aspect-ratio: var(--_product-card--aspect-ratio);
104
123
  color: #000000;
105
- background-color: rgba(255, 255, 255, 0.9);
106
- border: 1px solid #f2f2f3;
124
+ background-color: var(--_product-card--background-color);
125
+ border: 1px solid var(--_product-card--border-color);
107
126
  border-radius: var(--_product-card--border-radius);
108
127
  padding: 0.75rem 0.75rem 1.125rem;
109
128
  justify-content: space-between;
110
129
  /* Set 'container-type: inline-size;' to reference container*/
111
130
  }
112
131
  :global([data-theme="dark"]) .product-card {
113
- background-color: rgba(18, 18, 18, 0.9);
132
+ --_product-card--background-color: var(--product-card--background-color, rgb(from #121212 r g b/90%));
133
+ --_product-card--border-color: var(--product-card--background-color, #1e1e1e);
114
134
  color: #ffffff;
115
- border-color: #1e1e1e;
116
135
  }
117
136
  @container (width < 230px) {
118
137
  .product-card {
@@ -196,19 +215,18 @@ const onProductClicked = (event) => {
196
215
  }
197
216
 
198
217
  .product-price {
199
- --_product-price--align: right;
218
+ --_product-price--color: var(--product-price-color);
219
+ --_product-price--sale--color: var(--product-price--sale--color);
200
220
  --_product-price--before--color: #6b7280;
201
221
  --_product-price--before--font-size: 0.75em;
202
- --_product-price--color: inherit;
203
222
  --_product-price--font-size: 1.875em;
204
223
  --_product-price--gap: 0.375em;
205
- --_product-price--min-height: 2.40625rem;
224
+ --_product-price--align: right;
206
225
  width: 100%;
207
226
  display: flex;
208
227
  flex-direction: column;
209
228
  justify-items: end;
210
229
  gap: var(--_product-price--gap);
211
- min-height: var(--_product-price--min-height);
212
230
  /* Set 'container-type: inline-size;' to reference container*/
213
231
  }
214
232
  @container (width < 230px) {
@@ -218,6 +236,9 @@ const onProductClicked = (event) => {
218
236
  --_product-price--gap: 0.25rem;
219
237
  }
220
238
  }
239
+ :global([data-theme="dark"]) .product-price {
240
+ --_product-price--before--color: #d1d5db;
241
+ }
221
242
  .product-price__before-price {
222
243
  width: 100%;
223
244
  color: var(--_product-price--before--color);
@@ -243,4 +264,7 @@ const onProductClicked = (event) => {
243
264
  width: 100%;
244
265
  white-space: nowrap;
245
266
  overflow: hidden;
267
+ }
268
+ .product-price__price--sale {
269
+ color: var(--_product-price--sale--color);
246
270
  }</style>
@@ -3,6 +3,11 @@ import { type TrackingParams } from '../../marketing-tracking';
3
3
  import type { ProductCardModel } from './types';
4
4
  type Props = {
5
5
  product: ProductCardModel;
6
+ colors: {
7
+ background?: string | null;
8
+ price?: string | null;
9
+ salePrice?: string | null;
10
+ };
6
11
  locale?: Locale;
7
12
  includeBeforeNowPrefix?: boolean;
8
13
  inert?: boolean;
@@ -1,6 +1,5 @@
1
1
  import { ProfileType } from '../../core/enums';
2
2
  export const mapToStreamPlayerModel = (payload) => {
3
- const headerDataProvider = payload.availableFrom ?? payload.ownerProfile;
4
3
  return {
5
4
  id: payload.id,
6
5
  title: payload.title,
@@ -9,10 +8,6 @@ export const mapToStreamPlayerModel = (payload) => {
9
8
  createdAt: payload.createdAt,
10
9
  publishedAt: payload.publishedAt,
11
10
  organizationId: payload.ownerProfile.type === ProfileType.Organization ? payload.ownerProfile.id : null,
12
- header: {
13
- name: headerDataProvider.name,
14
- image: headerDataProvider.image
15
- },
16
11
  pagesCount: payload.pagesCount
17
12
  };
18
13
  };
@@ -17,15 +17,9 @@ export type GetStreamsQuery = {
17
17
  url: string;
18
18
  } | null;
19
19
  ownerProfile: {
20
- image: string | null;
21
- name: string;
22
20
  id: string;
23
21
  type: SchemaTypes.ProfileType;
24
22
  };
25
- availableFrom: {
26
- image: string;
27
- name: string;
28
- } | null;
29
23
  }>;
30
24
  };
31
25
  };
@@ -57,15 +51,9 @@ export type StreamPlayerPayloadFragment = {
57
51
  url: string;
58
52
  } | null;
59
53
  ownerProfile: {
60
- image: string | null;
61
- name: string;
62
54
  id: string;
63
55
  type: SchemaTypes.ProfileType;
64
56
  };
65
- availableFrom: {
66
- image: string;
67
- name: string;
68
- } | null;
69
57
  };
70
58
  export declare const StreamPlayerPayloadFragmentDoc: DocumentNode<StreamPlayerPayloadFragment, unknown>;
71
59
  export declare const GetStreamsDocument: DocumentNode<GetStreamsQuery, GetStreamsQueryVariables>;
@@ -24,24 +24,11 @@ export const StreamPlayerPayloadFragmentDoc = {
24
24
  selectionSet: {
25
25
  kind: 'SelectionSet',
26
26
  selections: [
27
- { kind: 'Field', name: { kind: 'Name', value: 'image' } },
28
- { kind: 'Field', name: { kind: 'Name', value: 'name' } },
29
27
  { kind: 'Field', name: { kind: 'Name', value: 'id' } },
30
28
  { kind: 'Field', name: { kind: 'Name', value: 'type' } }
31
29
  ]
32
30
  }
33
31
  },
34
- {
35
- kind: 'Field',
36
- name: { kind: 'Name', value: 'availableFrom' },
37
- selectionSet: {
38
- kind: 'SelectionSet',
39
- selections: [
40
- { kind: 'Field', name: { kind: 'Name', value: 'image' } },
41
- { kind: 'Field', name: { kind: 'Name', value: 'name' } }
42
- ]
43
- }
44
- },
45
32
  { kind: 'Field', name: { kind: 'Name', value: 'pagesCount' } }
46
33
  ]
47
34
  }
@@ -108,24 +95,11 @@ export const GetStreamsDocument = {
108
95
  selectionSet: {
109
96
  kind: 'SelectionSet',
110
97
  selections: [
111
- { kind: 'Field', name: { kind: 'Name', value: 'image' } },
112
- { kind: 'Field', name: { kind: 'Name', value: 'name' } },
113
98
  { kind: 'Field', name: { kind: 'Name', value: 'id' } },
114
99
  { kind: 'Field', name: { kind: 'Name', value: 'type' } }
115
100
  ]
116
101
  }
117
102
  },
118
- {
119
- kind: 'Field',
120
- name: { kind: 'Name', value: 'availableFrom' },
121
- selectionSet: {
122
- kind: 'SelectionSet',
123
- selections: [
124
- { kind: 'Field', name: { kind: 'Name', value: 'image' } },
125
- { kind: 'Field', name: { kind: 'Name', value: 'name' } }
126
- ]
127
- }
128
- },
129
103
  { kind: 'Field', name: { kind: 'Name', value: 'pagesCount' } }
130
104
  ]
131
105
  }
@@ -27,14 +27,8 @@ fragment StreamPlayerPayloadFragment on Stream {
27
27
  url
28
28
  }
29
29
  ownerProfile {
30
- image
31
- name
32
30
  id
33
31
  type
34
32
  }
35
- availableFrom {
36
- image
37
- name
38
- }
39
33
  pagesCount
40
34
  }
@@ -2,12 +2,13 @@
2
2
  import { PostViewer } from '../../../posts/post-viewer';
3
3
  import { ShortVideoStreamElementLocalization } from './short-video-stream-element-localization';
4
4
  import { mapToPostModel } from '../models';
5
- let { data, trackingParams, locale, on } = $props();
5
+ let { data, trackingParams, locale, controlsColors = null, on } = $props();
6
6
  const localization = $derived(new ShortVideoStreamElementLocalization(locale));
7
7
  </script>
8
8
 
9
9
  <PostViewer
10
10
  model={new PostModel(mapToPostModel(data))}
11
+ controlsColors={controlsColors}
11
12
  trackingParams={trackingParams ? { streamId: trackingParams.streamId, campaignId: trackingParams.campaignId } : false}
12
13
  autoplay={false}
13
14
  enableControls={false}
@@ -5,6 +5,10 @@ type Props = {
5
5
  data: StreamLayoutShortVideoModel;
6
6
  trackingParams: StreamTrackingParams;
7
7
  locale: Locale;
8
+ controlsColors?: {
9
+ active: string | null;
10
+ inactive: string | null;
11
+ } | null;
8
12
  on?: {
9
13
  progress?: (progress: number) => void;
10
14
  };
@@ -55,25 +55,25 @@ let { stream, aspectRatio = 9 / 16, on } = $props();
55
55
  bottom: 0;
56
56
  left: 0;
57
57
  right: 0;
58
- height: 2.5rem;
58
+ height: clamp(1.75rem, 20cqi, 2.5rem);
59
+ padding-inline: clamp(0.5rem, 6cqi, 0.75rem);
59
60
  background: rgba(0, 0, 0, 0.8);
60
61
  color: #ffffff;
61
- padding: 0 0.75rem;
62
62
  display: flex;
63
63
  flex-direction: column;
64
64
  align-content: center;
65
65
  justify-content: center;
66
66
  }
67
67
  .stream-card__title {
68
- font-size: 0.875rem;
69
- font-weight: 500;
68
+ font-size: clamp(0.5rem, 7cqi, 0.875rem);
69
+ font-weight: 600;
70
70
  white-space: nowrap;
71
71
  overflow: hidden;
72
72
  text-overflow: ellipsis;
73
73
  text-align: center;
74
74
  }
75
75
  .stream-card__sub-title {
76
- font-size: 0.625rem;
76
+ font-size: clamp(0.4375rem, 5cqi, 0.625rem);
77
77
  font-weight: 400;
78
78
  white-space: nowrap;
79
79
  overflow: hidden;
@@ -33,7 +33,7 @@ export function openStreamsPlayer(init) {
33
33
  props: {
34
34
  config: mediaCenterConfig || null,
35
35
  playerProps: {
36
- mode: 'stream',
36
+ mode: 'streams',
37
37
  props: {
38
38
  dataProvider,
39
39
  analyticsHandler,
@@ -1,47 +1,9 @@
1
- <script lang="ts">import { Image, ImageRound } from '../../ui/image';
1
+ <script lang="ts">import { Image } from '../../ui/image';
2
2
  import { InfiniteScrolling } from '../../ui/infinite-scrolling';
3
- import { LineClamp } from '../../ui/line-clamp';
4
3
  import { ProportionalContainer } from '../../ui/proportional-container';
5
- import { TimeAgo } from '../../ui/time-ago';
6
- import { StreamPlayerLocalization } from './stream-player-localization';
7
- let { model, buffer, activePageId, on, localization } = $props();
4
+ let { buffer, activePageId, on } = $props();
8
5
  </script>
9
6
 
10
- <div class="stream-overview-info">
11
- <div class="stream-overview-owner">
12
- <div class="stream-overview-owner__image">
13
- <ImageRound src={model.header.image} />
14
- </div>
15
- <div class="stream-overview-owner__body">
16
- <div class="stream-overview-owner__name">
17
- <LineClamp maxLines={1}>
18
- {model.header.name}
19
- </LineClamp>
20
- </div>
21
- <div class="stream-overview-owner__meta">
22
- <LineClamp maxLines={1}>
23
- <TimeAgo date={model.publishedAt || model.createdAt} locale={localization.locale} />
24
- </LineClamp>
25
- </div>
26
- </div>
27
- </div>
28
- <div class="stream-overview-info__title">
29
- <LineClamp maxLines={2}>
30
- {model.title}
31
- </LineClamp>
32
- </div>
33
- {#if model.subTitle}
34
- <div class="stream-overview-info__subtitle">
35
- <LineClamp maxLines={3}>
36
- {model.subTitle}
37
- </LineClamp>
38
- </div>
39
- {/if}
40
- <div class="stream-overview-info__pages">
41
- {localization.pagesCount(model.pagesCount)}
42
- </div>
43
- </div>
44
-
45
7
  <div class="stream-overview-pages">
46
8
  {#if buffer.activeChunk}
47
9
  <InfiniteScrolling loadMore={buffer.activeChunk.loadMore}>
@@ -73,34 +35,14 @@ let { model, buffer, activePageId, on, localization } = $props();
73
35
  opacity: 1;
74
36
  }
75
37
  }
76
- .stream-overview-info {
77
- padding: 1rem;
78
- }
79
- .stream-overview-info__title {
80
- font-size: 1.125rem;
81
- line-height: 1.55;
82
- font-weight: 600;
83
- color: #ffffff;
84
- }
85
- .stream-overview-info__subtitle {
86
- font-size: 0.875rem;
87
- color: #ffffff;
88
- }
89
- .stream-overview-info__pages {
90
- font-size: 0.625rem;
91
- line-height: 1;
92
- font-weight: 400;
93
- letter-spacing: -0.0125rem;
94
- color: #999999;
95
- }
96
-
97
38
  .stream-overview-pages {
98
39
  display: flex;
99
40
  flex: 1;
100
41
  justify-content: center;
101
42
  overflow-y: auto;
102
43
  overscroll-behavior: contain;
103
- padding: 0.9375rem 0.9375rem 0;
44
+ padding-block: 0.9375rem 0;
45
+ padding-inline: 0.9375rem 1.3125rem;
104
46
  --_cross-browser-scrollbar--thumb-color: transparent;
105
47
  --_cross-browser-scrollbar--track-color: transparent;
106
48
  }
@@ -137,7 +79,7 @@ let { model, buffer, activePageId, on, localization } = $props();
137
79
  .stream-overview-pages__grid {
138
80
  display: grid;
139
81
  width: 100%;
140
- grid-template-columns: repeat(auto-fill, minmax(7.5rem, 1fr));
82
+ grid-template-columns: repeat(auto-fill, minmax(6.25rem, 1fr));
141
83
  gap: 1.25rem;
142
84
  }
143
85
  }
@@ -153,37 +95,5 @@ let { model, buffer, activePageId, on, localization } = $props();
153
95
  }
154
96
  }
155
97
  .stream-overview-pages__page--active {
156
- outline: 2px solid #5a8dec;
157
- }
158
-
159
- .stream-overview-owner {
160
- display: flex;
161
- gap: 0.5rem;
162
- margin-bottom: 0.5rem;
163
- }
164
- .stream-overview-owner__image {
165
- width: 2rem;
166
- min-width: 2rem;
167
- max-width: 2rem;
168
- height: 2rem;
169
- min-height: 2rem;
170
- max-height: 2rem;
171
- --image--rounded--inner--border-width: 0;
172
- --image--rounded--outer--border-color: #f2f2f3;
173
- --image--rounded--outer--border-width: 1px;
174
- }
175
- .stream-overview-owner__body {
176
- display: flex;
177
- flex-direction: column;
178
- justify-content: center;
179
- color: #ffffff;
180
- }
181
- .stream-overview-owner__name {
182
- font-size: 0.75rem;
183
- font-weight: 500;
184
- letter-spacing: -0.015625rem;
185
- }
186
- .stream-overview-owner__meta {
187
- font-size: 0.625rem;
188
- letter-spacing: -0.0125rem;
98
+ outline: 2px solid var(--brand-color, #5a8dec);
189
99
  }</style>
@@ -1,11 +1,7 @@
1
- import { StreamPlayerLocalization } from './stream-player-localization';
2
1
  import type { StreamsPlayerBuffer } from './streams-player-buffer.svelte';
3
- import type { StreamPlayerModel } from './types';
4
2
  type Props = {
5
- model: StreamPlayerModel;
6
3
  buffer: StreamsPlayerBuffer;
7
4
  activePageId: string;
8
- localization: StreamPlayerLocalization;
9
5
  on: {
10
6
  setCurrentItem: (index: number) => void;
11
7
  };
@@ -1,7 +1,6 @@
1
1
  import { type Locale } from '../../core/locale';
2
2
  export declare class StreamPlayerLocalization {
3
3
  streamNotFound: string;
4
- pagesCount: (count: number) => string;
5
4
  locale: Locale;
6
5
  constructor(locale: Locale);
7
6
  }
@@ -1,11 +1,9 @@
1
1
  import {} from '../../core/locale';
2
2
  export class StreamPlayerLocalization {
3
3
  streamNotFound;
4
- pagesCount;
5
4
  locale;
6
5
  constructor(locale) {
7
6
  this.streamNotFound = loc.streamNotFound[locale];
8
- this.pagesCount = loc.pagesCount[locale];
9
7
  this.locale = locale;
10
8
  }
11
9
  }
@@ -13,9 +11,5 @@ const loc = {
13
11
  streamNotFound: {
14
12
  en: 'Stream not found',
15
13
  no: 'Stream ikke funnet'
16
- },
17
- pagesCount: {
18
- en: (count) => (count === 1 ? '1 page' : `${count} pages`),
19
- no: (count) => (count === 1 ? '1 side' : `${count} sider`)
20
14
  }
21
15
  };
@@ -238,10 +238,8 @@ const stopActivityTracking = () => {
238
238
  {#snippet overviewPanelContent()}
239
239
  {#if contentPlayerConfig.playerBuffer && buffer && currentStreamModel}
240
240
  <Overview
241
- model={currentStreamModel}
242
241
  buffer={buffer}
243
242
  activePageId={activePageId}
244
- localization={localization}
245
243
  on={{
246
244
  setCurrentItem: handleChangePage
247
245
  }} />
@@ -9,10 +9,6 @@ export type StreamPlayerModel = {
9
9
  createdAt: string;
10
10
  publishedAt: string | null;
11
11
  organizationId: string | null;
12
- header: {
13
- image: string | null;
14
- name: string;
15
- };
16
12
  pagesCount: number;
17
13
  };
18
14
  export type StreamsPlayerProps = {
@@ -30,6 +30,7 @@ let { src, color = null } = $props();
30
30
  .icon {
31
31
  --_icon--color: var(--icon--color);
32
32
  --_icon--size: var(--icon--size, 1.25em);
33
+ --_icon--stroke-color: var(--icon--stroke-color);
33
34
  --_icon--stroke-width: var(--icon--stroke-width, 0);
34
35
  --_icon--filter: var(--icon--filter, none);
35
36
  display: contents;
@@ -89,10 +90,10 @@ let { src, color = null } = $props();
89
90
  max-width: var(--_icon--size);
90
91
  }
91
92
  .icon :global(path) {
92
- stroke: var(--_icon--color);
93
+ stroke: var(--_icon--stroke-color, var(--_icon--color));
93
94
  stroke-width: var(--_icon--stroke-width);
94
95
  }
95
96
  :global([data-theme="dark"]) .icon :global(path) {
96
- stroke: var(--_icon--color);
97
+ stroke: var(--_icon--stroke-color, var(--_icon--color));
97
98
  stroke-width: var(--_icon--stroke-width);
98
99
  }</style>
@@ -1,8 +1,18 @@
1
1
  <script lang="ts">import { Icon, IconColor } from '../../icon';
2
- let { icon, iconColor, scaleEffect = false, disabled = false, on } = $props();
2
+ let { icon, activeColor, inactiveColor, iconColor, scaleEffect = false, disabled = false, zoom = 1, on } = $props();
3
+ const styles = $derived.by(() => {
4
+ const values = [`zoom: ${zoom}`];
5
+ if (activeColor) {
6
+ values.push(`--player-button--color: ${activeColor}`);
7
+ }
8
+ if (inactiveColor) {
9
+ values.push(`--player-button--color--inactive: ${inactiveColor}`);
10
+ }
11
+ return values.join(';');
12
+ });
3
13
  </script>
4
14
 
5
- <button type="button" class="player-button" class:player-button--scale-effect={scaleEffect} disabled={disabled} onclick={on.click}>
15
+ <button type="button" class="player-button" style={styles} class:player-button--scale-effect={scaleEffect} disabled={disabled} onclick={on.click}>
6
16
  <span class="player-button__icon">
7
17
  <Icon src={icon} color={iconColor} />
8
18
  </span>
@@ -20,22 +30,24 @@ let { icon, iconColor, scaleEffect = false, disabled = false, on } = $props();
20
30
  }
21
31
  }
22
32
  .player-button {
33
+ --_player-button--color: var(--player-button--color, rgb(from #000000 r g b / 95%));
34
+ --_player-button--color--inactive: var(--player-button--color--inactive, rgb(from var(--_player-button--color, #000000) r g b / 60%));
23
35
  --_player-button--icon-scale: 1;
24
36
  pointer-events: auto;
25
37
  padding: 0.625rem;
26
38
  display: flex;
27
39
  justify-content: center;
28
40
  align-items: center;
29
- background-color: rgba(0, 0, 0, 0.6);
41
+ background-color: var(--_player-button--color--inactive);
30
42
  transition: background-color 0.5s;
31
- border: 1px solid #1c1c1c;
43
+ border: 1px solid var(--_player-button--color);
32
44
  border-radius: 50%;
33
45
  --icon--color: #ffffff;
34
46
  --icon--size: 1.75rem;
35
47
  /* Set 'container-type: inline-size;' to reference container*/
36
48
  }
37
49
  .player-button:hover:not(:disabled) {
38
- background-color: rgba(0, 0, 0, 0.9);
50
+ background-color: var(--_player-button--color);
39
51
  }
40
52
  .player-button:disabled {
41
53
  opacity: 0.5;
@@ -1,9 +1,12 @@
1
1
  import { IconColor } from '../../icon';
2
2
  type Props = {
3
3
  icon: string;
4
+ activeColor: string | null;
5
+ inactiveColor: string | null;
4
6
  iconColor?: IconColor;
5
7
  disabled?: boolean;
6
8
  scaleEffect?: boolean;
9
+ zoom?: number;
7
10
  on: {
8
11
  click: () => void;
9
12
  };
@@ -1,11 +1,21 @@
1
1
  <script lang="ts">import { Icon } from '../../icon';
2
- let { scaleEffect = false, actions } = $props();
2
+ let { scaleEffect = false, borderColor, backgroundColor, actions } = $props();
3
+ const styles = $derived.by(() => {
4
+ const values = [];
5
+ if (borderColor) {
6
+ values.push(`--player-buttons-group--border-color: ${borderColor}`);
7
+ }
8
+ if (backgroundColor) {
9
+ values.push(`--player-buttons-group--background-color: ${backgroundColor}`);
10
+ }
11
+ return values.join(';');
12
+ });
3
13
  </script>
4
14
 
5
- <div class="player-buttons-group">
15
+ <div class="player-buttons-group" style={styles}>
6
16
  {#each actions as action (action.icon)}
7
17
  <button type="button" class="player-buttons-group__action" class:player-buttons-group__action--scale-effect={scaleEffect} onclick={action.callback}>
8
- <span class="player-buttons-group__action-icon">
18
+ <span class="player-buttons-group__action-icon" style={`--icon--stroke-width:${action.iconStrokeWidth}; --icon--stroke-color:${action.iconStrokeColor}`}>
9
19
  <Icon src={action.icon} color={action.iconColor} />
10
20
  </span>
11
21
  </button>
@@ -24,14 +34,19 @@ let { scaleEffect = false, actions } = $props();
24
34
  }
25
35
  }
26
36
  .player-buttons-group {
37
+ --_player-buttons-group--border-color: var(--player-buttons-group--border-color, rgb(from #000000 r g b / 95%));
38
+ --_player-buttons-group--background-color: var(
39
+ --player-buttons-group--background-color,
40
+ rgb(from var(--_player-buttons-group--border-color, #000000) r g b / 60%)
41
+ );
27
42
  cursor: pointer;
28
43
  display: flex;
29
44
  flex-direction: column;
30
45
  justify-content: center;
31
46
  gap: 1.125rem;
32
- border: 1px solid #1c1c1c;
47
+ border: 1px solid var(--_player-buttons-group--border-color);
33
48
  border-radius: 1.25rem;
34
- background: rgba(0, 0, 0, 0.6);
49
+ background: var(--_player-buttons-group--background-color);
35
50
  padding: 1rem 0.625rem;
36
51
  pointer-events: auto;
37
52
  /* Set 'container-type: inline-size;' to reference container*/
@@ -1,5 +1,7 @@
1
1
  import type { PlayerButtonsGroupAction } from './types';
2
2
  type Props = {
3
+ borderColor: string | null;
4
+ backgroundColor: string | null;
3
5
  actions: PlayerButtonsGroupAction[];
4
6
  scaleEffect?: boolean;
5
7
  };
@@ -2,5 +2,7 @@ import { IconColor } from '../../icon';
2
2
  export type PlayerButtonsGroupAction = {
3
3
  icon: string;
4
4
  iconColor?: IconColor;
5
+ iconStrokeColor?: string;
6
+ iconStrokeWidth?: string;
5
7
  callback: () => void;
6
8
  };