@streamscloud/embeddable 16.0.6 → 16.0.7-1772032565273

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 (105) hide show
  1. package/dist/ads/ad-card/types.d.ts +1 -1
  2. package/dist/ads/ad-card/types.js +1 -1
  3. package/dist/articles/article/article-layout.svelte +32 -0
  4. package/dist/articles/article/article-layout.svelte.d.ts +9 -0
  5. package/dist/articles/article/article-section.svelte +52 -0
  6. package/dist/articles/article/article-section.svelte.d.ts +9 -0
  7. package/dist/articles/article/cmp.article.svelte +31 -0
  8. package/dist/articles/article/cmp.article.svelte.d.ts +8 -0
  9. package/dist/articles/article/facts-container.svelte +27 -0
  10. package/dist/articles/article/facts-container.svelte.d.ts +7 -0
  11. package/dist/articles/article/fields/alt-text.svelte +15 -0
  12. package/dist/articles/article/fields/alt-text.svelte.d.ts +6 -0
  13. package/dist/articles/article/fields/article-field.svelte +45 -0
  14. package/dist/articles/article/fields/article-field.svelte.d.ts +8 -0
  15. package/dist/articles/article/fields/byline-field.svelte +23 -0
  16. package/dist/articles/article/fields/byline-field.svelte.d.ts +8 -0
  17. package/dist/articles/article/fields/image-field.svelte +8 -0
  18. package/dist/articles/article/fields/image-field.svelte.d.ts +7 -0
  19. package/dist/articles/article/fields/media-field.svelte +8 -0
  20. package/dist/articles/article/fields/media-field.svelte.d.ts +7 -0
  21. package/dist/articles/article/fields/media-gallery-field.svelte +8 -0
  22. package/dist/articles/article/fields/media-gallery-field.svelte.d.ts +7 -0
  23. package/dist/articles/article/fields/rich-text-field.svelte +19 -0
  24. package/dist/articles/article/fields/rich-text-field.svelte.d.ts +7 -0
  25. package/dist/articles/article/fields/text-field.svelte +24 -0
  26. package/dist/articles/article/fields/text-field.svelte.d.ts +7 -0
  27. package/dist/articles/article/fields/types.d.ts +62 -0
  28. package/dist/articles/article/fields/types.js +1 -0
  29. package/dist/articles/article/fields/video-field.svelte +8 -0
  30. package/dist/articles/article/fields/video-field.svelte.d.ts +7 -0
  31. package/dist/articles/article/helpers.d.ts +5 -0
  32. package/dist/articles/article/helpers.js +27 -0
  33. package/dist/articles/article/index.d.ts +4 -0
  34. package/dist/articles/article/index.js +2 -0
  35. package/dist/articles/article/styles-transformer.d.ts +19 -0
  36. package/dist/articles/article/styles-transformer.js +36 -0
  37. package/dist/articles/article/types.d.ts +27 -0
  38. package/dist/articles/article/types.js +1 -0
  39. package/dist/articles/article-viewer/article-viewer-host-settings.svelte.d.ts +14 -0
  40. package/dist/articles/article-viewer/article-viewer-host-settings.svelte.js +11 -0
  41. package/dist/articles/article-viewer/article-viewer-proxy.svelte +9 -0
  42. package/dist/articles/article-viewer/article-viewer-proxy.svelte.d.ts +10 -0
  43. package/dist/articles/article-viewer/article-viewer-view.svelte +85 -0
  44. package/dist/articles/article-viewer/article-viewer-view.svelte.d.ts +9 -0
  45. package/dist/articles/article-viewer/cmp.article-viewer.svelte +34 -0
  46. package/dist/articles/article-viewer/cmp.article-viewer.svelte.d.ts +12 -0
  47. package/dist/articles/article-viewer/index.d.ts +43 -0
  48. package/dist/articles/article-viewer/index.js +60 -0
  49. package/dist/articles/article-viewer/types.d.ts +12 -0
  50. package/dist/articles/article-viewer/types.js +1 -0
  51. package/dist/core/enums.d.ts +15 -50
  52. package/dist/core/enums.js +1 -61
  53. package/dist/core/media/media-item-url.service.d.ts +1 -1
  54. package/dist/core/media/media-item-url.service.js +1 -3
  55. package/dist/core/media/types.d.ts +1 -1
  56. package/dist/external-api/data-providers/internal-media-center-data-provider.svelte.js +2 -3
  57. package/dist/external-api/data-providers/internal-short-video-player-items-provider.d.ts +1 -1
  58. package/dist/external-api/data-providers/internal-short-video-player-items-provider.js +1 -3
  59. package/dist/external-api/data-providers/mapper.d.ts +1 -1
  60. package/dist/external-api/data-providers/mapper.js +5 -6
  61. package/dist/external-api/data-providers/mocks/mock-content-management-handler.svelte.js +2 -3
  62. package/dist/external-api/data-providers/post-data-loaders/posts-loader.d.ts +1 -1
  63. package/dist/external-api/data-providers/post-data-loaders/posts-loader.js +0 -1
  64. package/dist/external-api/data-providers/stream-data-loaders/mapper.js +1 -2
  65. package/dist/external-api/data-providers/stream-data-loaders/stream-pages-loader.d.ts +1 -1
  66. package/dist/external-api/data-providers/stream-data-loaders/stream-pages-loader.js +1 -2
  67. package/dist/external-api/data-providers/stream-data-loaders/streams-loader.d.ts +1 -1
  68. package/dist/external-api/data-providers/stream-data-loaders/streams-loader.js +1 -2
  69. package/dist/media-center/config/types.d.ts +1 -1
  70. package/dist/media-center/config/types.js +1 -1
  71. package/dist/media-center/media-center/discover/data-loading.js +1 -2
  72. package/dist/media-center/media-center/discover/discover-view-handler.svelte.js +1 -2
  73. package/dist/media-center/media-center/moments/moments-feed-handler.svelte.d.ts +1 -1
  74. package/dist/media-center/media-center/moments/moments-feed-handler.svelte.js +2 -3
  75. package/dist/media-center/media-center/moments/moments-state.svelte.d.ts +1 -1
  76. package/dist/media-center/media-center/moments/moments-state.svelte.js +1 -3
  77. package/dist/media-center/media-center/posts-feed/feed-providers-generator.js +1 -2
  78. package/dist/media-center/media-center/posts-feed/posts-feed-handler.svelte.d.ts +1 -1
  79. package/dist/media-center/media-center/posts-feed/posts-feed-handler.svelte.js +1 -2
  80. package/dist/posts/attachments/cmp.attachments.svelte +2 -3
  81. package/dist/posts/model/post-model.d.ts +1 -1
  82. package/dist/posts/model/post-model.js +0 -1
  83. package/dist/posts/post-viewer/attachments-horizontal.svelte +1 -2
  84. package/dist/posts/post-viewer/cmp.post-viewer.svelte +2 -3
  85. package/dist/posts/post-viewer/mapper.js +6 -7
  86. package/dist/posts/posts-player/cmp.posts-player.svelte +7 -2
  87. package/dist/posts/posts-player/posts-player-host-settings.svelte.d.ts +20 -0
  88. package/dist/posts/posts-player/posts-player-host-settings.svelte.js +15 -0
  89. package/dist/posts/posts-player/posts-player-view.svelte +6 -7
  90. package/dist/products/price-helper.d.ts +1 -1
  91. package/dist/products/price-helper.js +3 -4
  92. package/dist/streams/layout/models/mapper.d.ts +1 -1
  93. package/dist/streams/layout/models/mapper.js +2 -6
  94. package/dist/streams/layout/models/stream-layout-media-item-model.d.ts +1 -1
  95. package/dist/streams/layout/models/stream-layout-media-item-model.js +1 -1
  96. package/dist/streams/layout/models/stream-layout-short-video-model.d.ts +1 -1
  97. package/dist/streams/layout/models/stream-layout-short-video-model.js +1 -1
  98. package/dist/streams/streams-player/cmp.streams-player.svelte +7 -2
  99. package/dist/streams/streams-player/streams-player-host-settings.svelte.d.ts +20 -0
  100. package/dist/streams/streams-player/streams-player-host-settings.svelte.js +15 -0
  101. package/dist/ui/media-item-view/cmp.media-item-view.svelte +3 -4
  102. package/dist/ui/media-item-view/cmp.media-item-view.svelte.d.ts +1 -1
  103. package/dist/ui/media-items-gallery/cmp.media-items-gallery.svelte +5 -6
  104. package/dist/ui/media-items-gallery/cmp.media-items-gallery.svelte.d.ts +1 -1
  105. package/package.json +12 -3
@@ -1,4 +1,4 @@
1
- import { AdType, type Currency } from '../../core/enums';
1
+ import type { AdType, Currency } from '../../core/enums';
2
2
  export type AdCardModel = {
3
3
  id: string;
4
4
  type: AdType;
@@ -1 +1 @@
1
- import { AdType } from '../../core/enums';
1
+ export {};
@@ -0,0 +1,32 @@
1
+ <script lang="ts">import ArticleField from './fields/article-field.svelte';
2
+ import { fieldIsFilled } from './helpers';
3
+ import { generatePaddingsCssVar } from './styles-transformer';
4
+ let { layout, metadata } = $props();
5
+ const filledFields = $derived(layout.fields.filter(fieldIsFilled));
6
+ const styles = $derived.by(() => {
7
+ if (!layout.styles) {
8
+ return '';
9
+ }
10
+ const mobileStyles = generatePaddingsCssVar({ styles: layout.styles, mobileView: true });
11
+ const desktopStyles = generatePaddingsCssVar({ styles: layout.styles, mobileView: false });
12
+ return `--_article-layout--padding--desktop:${desktopStyles};--_article-layout--padding--mobile:${mobileStyles};`;
13
+ });
14
+ </script>
15
+
16
+ <div class="article-layout" style={styles}>
17
+ {#each filledFields as field (field.id)}
18
+ <ArticleField field={field} metadata={metadata} />
19
+ {/each}
20
+ </div>
21
+
22
+ <style>.article-layout {
23
+ display: flex;
24
+ flex-direction: column;
25
+ padding: var(--_article-layout--padding--desktop);
26
+ /* Set 'container-type: inline-size;' to reference container*/
27
+ }
28
+ @container (width < 576px) {
29
+ .article-layout {
30
+ padding: var(--_article-layout--padding--mobile);
31
+ }
32
+ }</style>
@@ -0,0 +1,9 @@
1
+ import type { FieldMetadata } from './fields/types';
2
+ import type { ArticleLayoutModel } from './types';
3
+ type Props = {
4
+ layout: ArticleLayoutModel;
5
+ metadata: FieldMetadata;
6
+ };
7
+ declare const ArticleLayout: import("svelte").Component<Props, {}, "">;
8
+ type ArticleLayout = ReturnType<typeof ArticleLayout>;
9
+ export default ArticleLayout;
@@ -0,0 +1,52 @@
1
+ <script lang="ts">import ArticleLayout from './article-layout.svelte';
2
+ import FactsContainer from './facts-container.svelte';
3
+ import { layoutIsFilled } from './helpers';
4
+ import { generatePaddingsCssVar } from './styles-transformer';
5
+ import { HtmlHelper } from '@streamscloud/kit/core/utils';
6
+ import { HtmlBlock } from '@streamscloud/kit/ui/html-block';
7
+ let { section, metadata } = $props();
8
+ const filledLayouts = $derived(section.layouts.filter(layoutIsFilled));
9
+ const styles = $derived.by(() => {
10
+ if (!section.styles) {
11
+ return '';
12
+ }
13
+ const mobileStyles = generatePaddingsCssVar({ styles: section.styles, mobileView: true });
14
+ const desktopStyles = generatePaddingsCssVar({ styles: section.styles, mobileView: false });
15
+ return `--_article-section--padding--desktop:${desktopStyles};--_article-section--padding--mobile:${mobileStyles};`;
16
+ });
17
+ const sectionFactsText = $derived(section.facts ? HtmlHelper.sanitizeHtml(section.facts) : null);
18
+ </script>
19
+
20
+ <div class="article-section" style={styles}>
21
+ <div class="article-section__layouts">
22
+ {#each filledLayouts as layout (layout.id)}
23
+ <ArticleLayout layout={layout} metadata={metadata} />
24
+ {/each}
25
+ </div>
26
+ {#if sectionFactsText}
27
+ <FactsContainer>
28
+ <HtmlBlock>
29
+ {@html sectionFactsText}
30
+ </HtmlBlock>
31
+ </FactsContainer>
32
+ {/if}
33
+ </div>
34
+
35
+ <style>.article-section {
36
+ display: flex;
37
+ gap: 2.5rem;
38
+ padding: var(--_article-section--padding--desktop);
39
+ }
40
+ .article-section__layouts {
41
+ flex: 1;
42
+ display: flex;
43
+ flex-direction: column;
44
+ }
45
+ .article-section {
46
+ /* Set 'container-type: inline-size;' to reference container*/
47
+ }
48
+ @container (width < 576px) {
49
+ .article-section {
50
+ padding: var(--_article-section--padding--mobile);
51
+ }
52
+ }</style>
@@ -0,0 +1,9 @@
1
+ import type { FieldMetadata } from './fields/types';
2
+ import type { ArticleSectionModel } from './types';
3
+ type Props = {
4
+ section: ArticleSectionModel;
5
+ metadata: FieldMetadata;
6
+ };
7
+ declare const ArticleSection: import("svelte").Component<Props, {}, "">;
8
+ type ArticleSection = ReturnType<typeof ArticleSection>;
9
+ export default ArticleSection;
@@ -0,0 +1,31 @@
1
+ <script lang="ts">import ArticleSection from './article-section.svelte';
2
+ import { sectionIsFilled } from './helpers';
3
+ let { sections, metadata } = $props();
4
+ const filledSections = $derived(sections.filter(sectionIsFilled));
5
+ const fieldMetadata = $derived({ displayDate: metadata.displayDate });
6
+ </script>
7
+
8
+ <div class="article-container">
9
+ <div class="article">
10
+ {#each filledSections as section (section.id)}
11
+ <ArticleSection section={section} metadata={fieldMetadata} />
12
+ {/each}
13
+ </div>
14
+ </div>
15
+
16
+ <style>.article-container {
17
+ --_article--min-height: var(--article--min-height, 0);
18
+ --_article--background: var(--article--background, light-dark(#ffffff, #2e2e2e));
19
+ --_article--text-color: var(--article--text-color);
20
+ container-type: inline-size;
21
+ min-height: var(--_article--min-height);
22
+ }
23
+
24
+ .article {
25
+ --article-field--text-color: var(--_article--text-color);
26
+ min-height: var(--_article--min-height);
27
+ background: var(--_article--background);
28
+ padding-bottom: 6.25rem;
29
+ display: flex;
30
+ flex-direction: column;
31
+ }</style>
@@ -0,0 +1,8 @@
1
+ import type { ArticleMetadata, ArticleSectionModel } from './types';
2
+ type Props = {
3
+ sections: ArticleSectionModel[];
4
+ metadata: ArticleMetadata;
5
+ };
6
+ declare const Cmp: import("svelte").Component<Props, {}, "">;
7
+ type Cmp = ReturnType<typeof Cmp>;
8
+ export default Cmp;
@@ -0,0 +1,27 @@
1
+ <script lang="ts">let { children } = $props();
2
+ export {};
3
+ </script>
4
+
5
+ <div class="facts-container">
6
+ {@render children()}
7
+ </div>
8
+
9
+ <style>.facts-container {
10
+ --_facts-container--color: var(--facts-container--color, var(--article-field--text-color));
11
+ color: var(--_facts-container--color);
12
+ border: 1px solid light-dark(#d1d5db, #4b5563);
13
+ border-radius: 0.25rem;
14
+ font-size: 0.8125rem;
15
+ width: 12.5rem;
16
+ height: max-content;
17
+ padding: 1rem;
18
+ position: relative;
19
+ }
20
+ .facts-container::before {
21
+ content: " ";
22
+ position: absolute;
23
+ top: -0.125rem;
24
+ left: 0.625rem;
25
+ width: 1.25rem;
26
+ border-bottom: 2px solid light-dark(#144ab0, #5a8dec);
27
+ }</style>
@@ -0,0 +1,7 @@
1
+ import type { Snippet } from 'svelte';
2
+ type Props = {
3
+ children: Snippet;
4
+ };
5
+ declare const FactsContainer: import("svelte").Component<Props, {}, "">;
6
+ type FactsContainer = ReturnType<typeof FactsContainer>;
7
+ export default FactsContainer;
@@ -0,0 +1,15 @@
1
+ <script lang="ts">let { value } = $props();
2
+ </script>
3
+
4
+ {#if value}
5
+ <div class="alt-text">{value}</div>
6
+ {/if}
7
+
8
+ <style>.alt-text {
9
+ font-size: 0.875rem;
10
+ line-height: 1.25rem;
11
+ padding: 0.625rem 3.75rem 0;
12
+ white-space: normal;
13
+ overflow-wrap: break-word;
14
+ text-align: center;
15
+ }</style>
@@ -0,0 +1,6 @@
1
+ type Props = {
2
+ value: string | null;
3
+ };
4
+ declare const AltText: import("svelte").Component<Props, {}, "">;
5
+ type AltText = ReturnType<typeof AltText>;
6
+ export default AltText;
@@ -0,0 +1,45 @@
1
+ <script lang="ts">import BylineField from './byline-field.svelte';
2
+ import ImageField from './image-field.svelte';
3
+ import MediaField from './media-field.svelte';
4
+ import MediaGalleryField from './media-gallery-field.svelte';
5
+ import RichTextField from './rich-text-field.svelte';
6
+ import TextField from './text-field.svelte';
7
+ import VideoField from './video-field.svelte';
8
+ import { generateMarginsCssVar } from '../styles-transformer';
9
+ let { field, metadata } = $props();
10
+ const styles = $derived.by(() => {
11
+ const mobileStyles = generateMarginsCssVar({ styles: field.styles, mobileView: true });
12
+ const desktopStyles = generateMarginsCssVar({ styles: field.styles, mobileView: false });
13
+ return `--_article-field--margin--desktop:${desktopStyles};--_article-field--margin--mobile:${mobileStyles};`;
14
+ });
15
+ </script>
16
+
17
+ <div class="article-field" style={styles}>
18
+ {#if field.fieldData.type === 'BYLINE'}
19
+ <BylineField field={field} metadata={metadata} />
20
+ {:else if field.fieldData.type === 'IMAGE'}
21
+ <ImageField field={field} />
22
+ {:else if field.fieldData.type === 'MEDIA'}
23
+ <MediaField field={field} />
24
+ {:else if field.fieldData.type === 'MEDIA_GALLERY'}
25
+ <MediaGalleryField field={field} />
26
+ {:else if field.fieldData.type === 'RICH_TEXT'}
27
+ <RichTextField field={field} />
28
+ {:else if field.fieldData.type === 'TEXT'}
29
+ <TextField field={field} />
30
+ {:else if field.fieldData.type === 'VIDEO'}
31
+ <VideoField field={field} />
32
+ {/if}
33
+ </div>
34
+
35
+ <style>.article-field {
36
+ display: flex;
37
+ flex-direction: column;
38
+ margin: var(--_article-field--margin--desktop);
39
+ /* Set 'container-type: inline-size;' to reference container*/
40
+ }
41
+ @container (width < 576px) {
42
+ .article-field {
43
+ margin: var(--_article-field--margin--mobile);
44
+ }
45
+ }</style>
@@ -0,0 +1,8 @@
1
+ import type { ArticleFieldModel, FieldMetadata } from './types';
2
+ type Props = {
3
+ field: ArticleFieldModel;
4
+ metadata: FieldMetadata;
5
+ };
6
+ declare const ArticleField: import("svelte").Component<Props, {}, "">;
7
+ type ArticleField = ReturnType<typeof ArticleField>;
8
+ export default ArticleField;
@@ -0,0 +1,23 @@
1
+ <script lang="ts">import { TimeAgo } from '@streamscloud/kit/ui/time-ago';
2
+ let { field, metadata } = $props();
3
+ const fieldData = $derived(field.fieldData.bylineData);
4
+ </script>
5
+
6
+ <div class="byline-field">
7
+ <div class="byline-field__author">{fieldData.authorName}</div>
8
+ <div class="byline-field__metadata">
9
+ <TimeAgo date={metadata.displayDate} />
10
+ </div>
11
+ </div>
12
+
13
+ <style>.byline-field {
14
+ --_byline-field--text-color: var(--article-field--text-color);
15
+ }
16
+ .byline-field__author {
17
+ font-size: 0.875em;
18
+ color: var(--_byline-field--text-color);
19
+ }
20
+ .byline-field__metadata {
21
+ font-size: 0.75em;
22
+ color: light-dark(#9ca3af, #d1d5db);
23
+ }</style>
@@ -0,0 +1,8 @@
1
+ import type { ArticleFieldModel, FieldMetadata } from './types';
2
+ type Props = {
3
+ field: ArticleFieldModel;
4
+ metadata: FieldMetadata;
5
+ };
6
+ declare const BylineField: import("svelte").Component<Props, {}, "">;
7
+ type BylineField = ReturnType<typeof BylineField>;
8
+ export default BylineField;
@@ -0,0 +1,8 @@
1
+ <script lang="ts">import { MediaItemView } from '../../../ui/media-item-view';
2
+ import AltText from './alt-text.svelte';
3
+ let { field } = $props();
4
+ const fieldData = $derived(field.fieldData.imageData);
5
+ </script>
6
+
7
+ <MediaItemView media={fieldData.image} ratio={fieldData.preferredMediaFormat} />
8
+ <AltText value={fieldData.altText} />
@@ -0,0 +1,7 @@
1
+ import type { ArticleFieldModel } from './types';
2
+ type Props = {
3
+ field: ArticleFieldModel;
4
+ };
5
+ declare const ImageField: import("svelte").Component<Props, {}, "">;
6
+ type ImageField = ReturnType<typeof ImageField>;
7
+ export default ImageField;
@@ -0,0 +1,8 @@
1
+ <script lang="ts">import { MediaItemView } from '../../../ui/media-item-view';
2
+ import AltText from './alt-text.svelte';
3
+ let { field } = $props();
4
+ const fieldData = $derived(field.fieldData.mediaData);
5
+ </script>
6
+
7
+ <MediaItemView media={fieldData.media} ratio={fieldData.preferredMediaFormat} />
8
+ <AltText value={fieldData.altText} />
@@ -0,0 +1,7 @@
1
+ import type { ArticleFieldModel } from './types';
2
+ type Props = {
3
+ field: ArticleFieldModel;
4
+ };
5
+ declare const MediaField: import("svelte").Component<Props, {}, "">;
6
+ type MediaField = ReturnType<typeof MediaField>;
7
+ export default MediaField;
@@ -0,0 +1,8 @@
1
+ <script lang="ts">import { MediaItemsGallery } from '../../../ui/media-items-gallery';
2
+ import AltText from './alt-text.svelte';
3
+ let { field } = $props();
4
+ const fieldData = $derived(field.fieldData.mediaGalleryData);
5
+ </script>
6
+
7
+ <MediaItemsGallery media={fieldData.media ?? []} singleImageRatio={fieldData.preferredMediaFormat} />
8
+ <AltText value={fieldData.altText} />
@@ -0,0 +1,7 @@
1
+ import type { ArticleFieldModel } from './types';
2
+ type Props = {
3
+ field: ArticleFieldModel;
4
+ };
5
+ declare const MediaGalleryField: import("svelte").Component<Props, {}, "">;
6
+ type MediaGalleryField = ReturnType<typeof MediaGalleryField>;
7
+ export default MediaGalleryField;
@@ -0,0 +1,19 @@
1
+ <script lang="ts">import { HtmlHelper } from '@streamscloud/kit/core/utils';
2
+ import { HtmlBlock } from '@streamscloud/kit/ui/html-block';
3
+ let { field } = $props();
4
+ const fieldData = $derived(field.fieldData.richTextData);
5
+ const fieldDataText = $derived(fieldData.text ? HtmlHelper.sanitizeHtml(fieldData.text) : null);
6
+ </script>
7
+
8
+ {#if fieldDataText}
9
+ <div class="rich-text-field" style:font-size={`${fieldData.textSize}em`}>
10
+ <HtmlBlock>
11
+ {@html fieldDataText}
12
+ </HtmlBlock>
13
+ </div>
14
+ {/if}
15
+
16
+ <style>.rich-text-field {
17
+ --_rich-text-field--text-color: var(--article-field--text-color);
18
+ color: var(--_rich-text-field--text-color);
19
+ }</style>
@@ -0,0 +1,7 @@
1
+ import type { ArticleFieldModel } from './types';
2
+ type Props = {
3
+ field: ArticleFieldModel;
4
+ };
5
+ declare const RichTextField: import("svelte").Component<Props, {}, "">;
6
+ type RichTextField = ReturnType<typeof RichTextField>;
7
+ export default RichTextField;
@@ -0,0 +1,24 @@
1
+ <script lang="ts">let { field } = $props();
2
+ const fieldData = $derived(field.fieldData.textData);
3
+ export {};
4
+ </script>
5
+
6
+ <div
7
+ class="text-field"
8
+ style:font-size={`${fieldData.textSize}em`}
9
+ class:text-field--semi-bold={fieldData.textWeight === 'SEMI_BOLD'}
10
+ class:text-field--bold={fieldData.textWeight === 'BOLD'}>
11
+ {fieldData.text}
12
+ </div>
13
+
14
+ <style>.text-field {
15
+ --_text-field--text-color: var(--article-field--text-color);
16
+ color: var(--_text-field--text-color);
17
+ line-height: 1.2;
18
+ }
19
+ .text-field--semi-bold {
20
+ font-weight: 500;
21
+ }
22
+ .text-field--bold {
23
+ font-weight: 700;
24
+ }</style>
@@ -0,0 +1,7 @@
1
+ import type { ArticleFieldModel } from './types';
2
+ type Props = {
3
+ field: ArticleFieldModel;
4
+ };
5
+ declare const TextField: import("svelte").Component<Props, {}, "">;
6
+ type TextField = ReturnType<typeof TextField>;
7
+ export default TextField;
@@ -0,0 +1,62 @@
1
+ import type { ArticleFieldType, GalleryFieldMode, MediaFormat, TextFieldMode, TextFieldWeight } from '../../../core/enums';
2
+ import type { MediaItemModel, MediaItemWithMetadataModel } from '../../../core/media';
3
+ export type FieldMetadata = {
4
+ displayDate: string;
5
+ };
6
+ export type ArticleFieldModel = {
7
+ id: string;
8
+ name: string;
9
+ description: string | null;
10
+ styles: ArticleFieldStylesModel | null;
11
+ fieldData: ArticleFieldDataModel;
12
+ };
13
+ export type ArticleFieldStylesModel = {
14
+ marginTop: number | null;
15
+ marginBottom: number | null;
16
+ marginLeft: number | null;
17
+ marginRight: number | null;
18
+ };
19
+ export type ArticleFieldDataModel = {
20
+ type: ArticleFieldType;
21
+ bylineData?: BylineFieldDataModel | null;
22
+ imageData?: ImageFieldDataModel | null;
23
+ mediaData?: MediaFieldDataModel | null;
24
+ mediaGalleryData?: MediaGalleryFieldDataModel | null;
25
+ richTextData?: RichTextFieldDataModel | null;
26
+ textData?: TextFieldDataModel | null;
27
+ videoData?: VideoFieldDataModel | null;
28
+ };
29
+ export type BylineFieldDataModel = {
30
+ authorName: string | null;
31
+ };
32
+ export type ImageFieldDataModel = {
33
+ image: MediaItemModel | null;
34
+ preferredMediaFormat: MediaFormat;
35
+ altText: string | null;
36
+ };
37
+ export type MediaFieldDataModel = {
38
+ media: MediaItemModel | null;
39
+ preferredMediaFormat: MediaFormat;
40
+ altText: string | null;
41
+ };
42
+ export type MediaGalleryFieldDataModel = {
43
+ media: MediaItemWithMetadataModel[] | null;
44
+ galleryMode: GalleryFieldMode;
45
+ preferredMediaFormat: MediaFormat;
46
+ altText: string | null;
47
+ };
48
+ export type RichTextFieldDataModel = {
49
+ text: string | null;
50
+ textSize: number;
51
+ };
52
+ export type TextFieldDataModel = {
53
+ text: string | null;
54
+ textMode: TextFieldMode;
55
+ textSize: number;
56
+ textWeight: TextFieldWeight;
57
+ };
58
+ export type VideoFieldDataModel = {
59
+ video: MediaItemModel | null;
60
+ preferredMediaFormat: MediaFormat;
61
+ altText: string | null;
62
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ <script lang="ts">import { MediaItemView } from '../../../ui/media-item-view';
2
+ import AltText from './alt-text.svelte';
3
+ let { field } = $props();
4
+ const fieldData = $derived(field.fieldData.videoData);
5
+ </script>
6
+
7
+ <MediaItemView media={fieldData.video} ratio={fieldData.preferredMediaFormat} />
8
+ <AltText value={fieldData.altText} />
@@ -0,0 +1,7 @@
1
+ import type { ArticleFieldModel } from './types';
2
+ type Props = {
3
+ field: ArticleFieldModel;
4
+ };
5
+ declare const VideoField: import("svelte").Component<Props, {}, "">;
6
+ type VideoField = ReturnType<typeof VideoField>;
7
+ export default VideoField;
@@ -0,0 +1,5 @@
1
+ import type { ArticleFieldModel } from './fields/types';
2
+ import type { ArticleLayoutModel, ArticleSectionModel } from './types';
3
+ export declare const fieldIsFilled: (field: ArticleFieldModel) => boolean;
4
+ export declare const layoutIsFilled: (layout: ArticleLayoutModel) => boolean;
5
+ export declare const sectionIsFilled: (section: ArticleSectionModel) => boolean;
@@ -0,0 +1,27 @@
1
+ export const fieldIsFilled = (field) => {
2
+ const { fieldData } = field;
3
+ switch (fieldData.type) {
4
+ case 'BYLINE':
5
+ return !!fieldData.bylineData?.authorName;
6
+ case 'IMAGE':
7
+ return !!fieldData.imageData?.image?.url;
8
+ case 'MEDIA':
9
+ return !!fieldData.mediaData?.media?.url;
10
+ case 'MEDIA_GALLERY':
11
+ return !!fieldData.mediaGalleryData?.media?.length;
12
+ case 'RICH_TEXT':
13
+ return !!fieldData.richTextData?.text;
14
+ case 'TEXT':
15
+ return !!fieldData.textData?.text;
16
+ case 'VIDEO':
17
+ return !!fieldData.videoData?.video?.url;
18
+ default:
19
+ return false;
20
+ }
21
+ };
22
+ export const layoutIsFilled = (layout) => {
23
+ return layout.fields.some(fieldIsFilled);
24
+ };
25
+ export const sectionIsFilled = (section) => {
26
+ return section.layouts.some(layoutIsFilled) || !!section.facts;
27
+ };
@@ -0,0 +1,4 @@
1
+ export { default as Article } from './cmp.article.svelte';
2
+ export { fieldIsFilled, layoutIsFilled, sectionIsFilled } from './helpers';
3
+ export type { ArticleLayoutModel, ArticleLayoutStylesModel, ArticleMetadata, ArticleSectionModel, ArticleSectionStylesModel } from './types';
4
+ export type { ArticleFieldDataModel, ArticleFieldModel, ArticleFieldStylesModel, BylineFieldDataModel, FieldMetadata, ImageFieldDataModel, MediaFieldDataModel, MediaGalleryFieldDataModel, RichTextFieldDataModel, TextFieldDataModel, VideoFieldDataModel } from './fields/types';
@@ -0,0 +1,2 @@
1
+ export { default as Article } from './cmp.article.svelte';
2
+ export { fieldIsFilled, layoutIsFilled, sectionIsFilled } from './helpers';
@@ -0,0 +1,19 @@
1
+ export declare const generatePaddingsCssVar: (data: {
2
+ styles: {
3
+ paddingTop?: number | null;
4
+ paddingBottom?: number | null;
5
+ paddingLeft?: number | null;
6
+ paddingRight?: number | null;
7
+ };
8
+ mobileView: boolean;
9
+ }) => string;
10
+ export declare const generateMarginsCssVar: (data: {
11
+ styles: {
12
+ marginTop?: number | null;
13
+ marginBottom?: number | null;
14
+ marginLeft?: number | null;
15
+ marginRight?: number | null;
16
+ } | null;
17
+ mobileView: boolean;
18
+ useFallbackIfMissing?: boolean;
19
+ }) => string;
@@ -0,0 +1,36 @@
1
+ export const generatePaddingsCssVar = (data) => {
2
+ const indents = parsePaddingValues(data);
3
+ const paddings = [indents.top, indents.right, indents.bottom, indents.left];
4
+ return paddings.map((p) => p + 'rem').join(' ');
5
+ };
6
+ const parsePaddingValues = (data) => {
7
+ const { styles, mobileView } = data;
8
+ const verticalScaleFactor = mobileView ? 0.7 : 1;
9
+ const horizontalScaleFactor = mobileView ? 0.3 : 1;
10
+ return {
11
+ top: styles.paddingTop ? styles.paddingTop * verticalScaleFactor : 0,
12
+ right: styles.paddingRight ? styles.paddingRight * horizontalScaleFactor : 0,
13
+ bottom: styles.paddingBottom ? styles.paddingBottom * verticalScaleFactor : 0,
14
+ left: styles.paddingLeft ? styles.paddingLeft * horizontalScaleFactor : 0
15
+ };
16
+ };
17
+ export const generateMarginsCssVar = (data) => {
18
+ const indents = parseMarginValues(data);
19
+ const margins = [indents.top, indents.right, indents.bottom, indents.left];
20
+ return margins.map((p) => p + 'rem').join(' ');
21
+ };
22
+ const parseMarginValues = (data) => {
23
+ const { styles, useFallbackIfMissing = true, mobileView } = data;
24
+ if (!styles && !useFallbackIfMissing) {
25
+ return { top: 0, right: 0, bottom: 0, left: 0 };
26
+ }
27
+ const parsedStyles = styles || { marginBottom: 0.875 };
28
+ const verticalScaleFactor = mobileView ? 0.7 : 1;
29
+ const horizontalScaleFactor = mobileView ? 0.3 : 1;
30
+ return {
31
+ top: 'marginTop' in parsedStyles && parsedStyles.marginTop ? parsedStyles.marginTop * verticalScaleFactor : 0,
32
+ right: 'marginRight' in parsedStyles && parsedStyles.marginRight ? parsedStyles.marginRight * horizontalScaleFactor : 0,
33
+ bottom: 'marginBottom' in parsedStyles && parsedStyles.marginBottom ? parsedStyles.marginBottom * verticalScaleFactor : 0,
34
+ left: 'marginLeft' in parsedStyles && parsedStyles.marginLeft ? parsedStyles.marginLeft * horizontalScaleFactor : 0
35
+ };
36
+ };
@@ -0,0 +1,27 @@
1
+ import type { ArticleFieldModel } from './fields/types';
2
+ export type ArticleMetadata = {
3
+ displayDate: string;
4
+ };
5
+ export type ArticleSectionModel = {
6
+ id: string;
7
+ styles: ArticleSectionStylesModel | null;
8
+ layouts: ArticleLayoutModel[];
9
+ facts: string | null;
10
+ };
11
+ export type ArticleSectionStylesModel = {
12
+ paddingTop: number | null;
13
+ paddingBottom: number | null;
14
+ paddingLeft: number | null;
15
+ paddingRight: number | null;
16
+ };
17
+ export type ArticleLayoutModel = {
18
+ id: string;
19
+ styles: ArticleLayoutStylesModel | null;
20
+ fields: ArticleFieldModel[];
21
+ };
22
+ export type ArticleLayoutStylesModel = {
23
+ paddingTop: number | null;
24
+ paddingBottom: number | null;
25
+ paddingLeft: number | null;
26
+ paddingRight: number | null;
27
+ };
@@ -0,0 +1 @@
1
+ export {};