@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.
- package/dist/ads/ad-card/types.d.ts +1 -1
- package/dist/ads/ad-card/types.js +1 -1
- package/dist/articles/article/article-layout.svelte +32 -0
- package/dist/articles/article/article-layout.svelte.d.ts +9 -0
- package/dist/articles/article/article-section.svelte +52 -0
- package/dist/articles/article/article-section.svelte.d.ts +9 -0
- package/dist/articles/article/cmp.article.svelte +31 -0
- package/dist/articles/article/cmp.article.svelte.d.ts +8 -0
- package/dist/articles/article/facts-container.svelte +27 -0
- package/dist/articles/article/facts-container.svelte.d.ts +7 -0
- package/dist/articles/article/fields/alt-text.svelte +15 -0
- package/dist/articles/article/fields/alt-text.svelte.d.ts +6 -0
- package/dist/articles/article/fields/article-field.svelte +45 -0
- package/dist/articles/article/fields/article-field.svelte.d.ts +8 -0
- package/dist/articles/article/fields/byline-field.svelte +23 -0
- package/dist/articles/article/fields/byline-field.svelte.d.ts +8 -0
- package/dist/articles/article/fields/image-field.svelte +8 -0
- package/dist/articles/article/fields/image-field.svelte.d.ts +7 -0
- package/dist/articles/article/fields/media-field.svelte +8 -0
- package/dist/articles/article/fields/media-field.svelte.d.ts +7 -0
- package/dist/articles/article/fields/media-gallery-field.svelte +8 -0
- package/dist/articles/article/fields/media-gallery-field.svelte.d.ts +7 -0
- package/dist/articles/article/fields/rich-text-field.svelte +19 -0
- package/dist/articles/article/fields/rich-text-field.svelte.d.ts +7 -0
- package/dist/articles/article/fields/text-field.svelte +24 -0
- package/dist/articles/article/fields/text-field.svelte.d.ts +7 -0
- package/dist/articles/article/fields/types.d.ts +62 -0
- package/dist/articles/article/fields/types.js +1 -0
- package/dist/articles/article/fields/video-field.svelte +8 -0
- package/dist/articles/article/fields/video-field.svelte.d.ts +7 -0
- package/dist/articles/article/helpers.d.ts +5 -0
- package/dist/articles/article/helpers.js +27 -0
- package/dist/articles/article/index.d.ts +4 -0
- package/dist/articles/article/index.js +2 -0
- package/dist/articles/article/styles-transformer.d.ts +19 -0
- package/dist/articles/article/styles-transformer.js +36 -0
- package/dist/articles/article/types.d.ts +27 -0
- package/dist/articles/article/types.js +1 -0
- package/dist/articles/article-viewer/article-viewer-host-settings.svelte.d.ts +14 -0
- package/dist/articles/article-viewer/article-viewer-host-settings.svelte.js +11 -0
- package/dist/articles/article-viewer/article-viewer-proxy.svelte +9 -0
- package/dist/articles/article-viewer/article-viewer-proxy.svelte.d.ts +10 -0
- package/dist/articles/article-viewer/article-viewer-view.svelte +85 -0
- package/dist/articles/article-viewer/article-viewer-view.svelte.d.ts +9 -0
- package/dist/articles/article-viewer/cmp.article-viewer.svelte +34 -0
- package/dist/articles/article-viewer/cmp.article-viewer.svelte.d.ts +12 -0
- package/dist/articles/article-viewer/index.d.ts +43 -0
- package/dist/articles/article-viewer/index.js +60 -0
- package/dist/articles/article-viewer/types.d.ts +12 -0
- package/dist/articles/article-viewer/types.js +1 -0
- package/dist/core/enums.d.ts +15 -50
- package/dist/core/enums.js +1 -61
- package/dist/core/media/media-item-url.service.d.ts +1 -1
- package/dist/core/media/media-item-url.service.js +1 -3
- package/dist/core/media/types.d.ts +1 -1
- package/dist/external-api/data-providers/internal-media-center-data-provider.svelte.js +2 -3
- package/dist/external-api/data-providers/internal-short-video-player-items-provider.d.ts +1 -1
- package/dist/external-api/data-providers/internal-short-video-player-items-provider.js +1 -3
- package/dist/external-api/data-providers/mapper.d.ts +1 -1
- package/dist/external-api/data-providers/mapper.js +5 -6
- package/dist/external-api/data-providers/mocks/mock-content-management-handler.svelte.js +2 -3
- package/dist/external-api/data-providers/post-data-loaders/posts-loader.d.ts +1 -1
- package/dist/external-api/data-providers/post-data-loaders/posts-loader.js +0 -1
- package/dist/external-api/data-providers/stream-data-loaders/mapper.js +1 -2
- package/dist/external-api/data-providers/stream-data-loaders/stream-pages-loader.d.ts +1 -1
- package/dist/external-api/data-providers/stream-data-loaders/stream-pages-loader.js +1 -2
- package/dist/external-api/data-providers/stream-data-loaders/streams-loader.d.ts +1 -1
- package/dist/external-api/data-providers/stream-data-loaders/streams-loader.js +1 -2
- package/dist/media-center/config/types.d.ts +1 -1
- package/dist/media-center/config/types.js +1 -1
- package/dist/media-center/media-center/discover/data-loading.js +1 -2
- package/dist/media-center/media-center/discover/discover-view-handler.svelte.js +1 -2
- package/dist/media-center/media-center/moments/moments-feed-handler.svelte.d.ts +1 -1
- package/dist/media-center/media-center/moments/moments-feed-handler.svelte.js +2 -3
- package/dist/media-center/media-center/moments/moments-state.svelte.d.ts +1 -1
- package/dist/media-center/media-center/moments/moments-state.svelte.js +1 -3
- package/dist/media-center/media-center/posts-feed/feed-providers-generator.js +1 -2
- package/dist/media-center/media-center/posts-feed/posts-feed-handler.svelte.d.ts +1 -1
- package/dist/media-center/media-center/posts-feed/posts-feed-handler.svelte.js +1 -2
- package/dist/posts/attachments/cmp.attachments.svelte +2 -3
- package/dist/posts/model/post-model.d.ts +1 -1
- package/dist/posts/model/post-model.js +0 -1
- package/dist/posts/post-viewer/attachments-horizontal.svelte +1 -2
- package/dist/posts/post-viewer/cmp.post-viewer.svelte +2 -3
- package/dist/posts/post-viewer/mapper.js +6 -7
- package/dist/posts/posts-player/cmp.posts-player.svelte +7 -2
- package/dist/posts/posts-player/posts-player-host-settings.svelte.d.ts +20 -0
- package/dist/posts/posts-player/posts-player-host-settings.svelte.js +15 -0
- package/dist/posts/posts-player/posts-player-view.svelte +6 -7
- package/dist/products/price-helper.d.ts +1 -1
- package/dist/products/price-helper.js +3 -4
- package/dist/streams/layout/models/mapper.d.ts +1 -1
- package/dist/streams/layout/models/mapper.js +2 -6
- package/dist/streams/layout/models/stream-layout-media-item-model.d.ts +1 -1
- package/dist/streams/layout/models/stream-layout-media-item-model.js +1 -1
- package/dist/streams/layout/models/stream-layout-short-video-model.d.ts +1 -1
- package/dist/streams/layout/models/stream-layout-short-video-model.js +1 -1
- package/dist/streams/streams-player/cmp.streams-player.svelte +7 -2
- package/dist/streams/streams-player/streams-player-host-settings.svelte.d.ts +20 -0
- package/dist/streams/streams-player/streams-player-host-settings.svelte.js +15 -0
- package/dist/ui/media-item-view/cmp.media-item-view.svelte +3 -4
- package/dist/ui/media-item-view/cmp.media-item-view.svelte.d.ts +1 -1
- package/dist/ui/media-items-gallery/cmp.media-items-gallery.svelte +5 -6
- package/dist/ui/media-items-gallery/cmp.media-items-gallery.svelte.d.ts +1 -1
- package/package.json +12 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
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,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,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,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,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,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,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,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,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 {};
|