@ndla/ui 55.0.15-alpha.0 → 55.0.16-alpha.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 (36) hide show
  1. package/dist/panda.buildinfo.json +18 -13
  2. package/dist/styles.css +74 -54
  3. package/es/Article/ArticleByline.js +80 -47
  4. package/es/Article/ArticleFootNotes.js +31 -19
  5. package/es/ContentTypeBadge/ContentTypeBadgeNew.js +1 -0
  6. package/es/FrontpageArticle/FrontpageArticle.js +1 -2
  7. package/es/index.js +0 -1
  8. package/es/model/ContentType.js +3 -1
  9. package/es/styles.css +74 -54
  10. package/lib/Article/ArticleByline.d.ts +1 -3
  11. package/lib/Article/ArticleByline.js +82 -49
  12. package/lib/Article/ArticleFootNotes.js +31 -20
  13. package/lib/ContentTypeBadge/ContentTypeBadgeNew.d.ts +1 -2
  14. package/lib/ContentTypeBadge/ContentTypeBadgeNew.js +1 -0
  15. package/lib/FrontpageArticle/FrontpageArticle.js +1 -2
  16. package/lib/index.d.ts +0 -1
  17. package/lib/index.js +0 -7
  18. package/lib/model/ContentType.d.ts +1 -0
  19. package/lib/model/ContentType.js +4 -2
  20. package/lib/styles.css +74 -54
  21. package/package.json +2 -3
  22. package/src/Article/ArticleByline.tsx +82 -69
  23. package/src/Article/ArticleFootNotes.tsx +32 -36
  24. package/src/ContentTypeBadge/ContentTypeBadgeNew.tsx +3 -1
  25. package/src/FrontpageArticle/FrontpageArticle.tsx +1 -1
  26. package/src/index.ts +0 -2
  27. package/src/model/ContentType.ts +2 -0
  28. package/es/CreatedBy/CreatedBy.js +0 -73
  29. package/es/CreatedBy/index.js +0 -10
  30. package/lib/CreatedBy/CreatedBy.d.ts +0 -15
  31. package/lib/CreatedBy/CreatedBy.js +0 -78
  32. package/lib/CreatedBy/index.d.ts +0 -9
  33. package/lib/CreatedBy/index.js +0 -16
  34. package/src/CreatedBy/CreatedBy.stories.tsx +0 -36
  35. package/src/CreatedBy/CreatedBy.tsx +0 -63
  36. package/src/CreatedBy/index.ts +0 -11
package/lib/styles.css CHANGED
@@ -1,5 +1,17 @@
1
1
  @layer utilities {
2
2
  @layer compositions {
3
+ .textStyle_body\.medium {
4
+ font-family: var(--fonts-sans);
5
+ font-weight: var(--font-weights-normal);
6
+ font-size: var(--font-sizes-small);
7
+ line-height: var(--line-heights-small);
8
+ }
9
+
10
+ .textStyle_body\.medium:where([lang='zh'], [lang='zh-Hans'], [lang='zh-Hant']):not([data-pinyin]) {
11
+ font-size: calc(var(--font-sizes-small) * 1.11);
12
+ line-height: calc(var(--line-heights-small) * 1.11);
13
+ }
14
+
3
15
  .textStyle_body\.large {
4
16
  font-family: var(--fonts-sans);
5
17
  font-weight: var(--font-weights-normal);
@@ -36,18 +48,6 @@
36
48
  line-height: calc(var(--line-heights-medium) * 1.11);
37
49
  }
38
50
 
39
- .textStyle_body\.medium {
40
- font-family: var(--fonts-sans);
41
- font-weight: var(--font-weights-normal);
42
- font-size: var(--font-sizes-small);
43
- line-height: var(--line-heights-small);
44
- }
45
-
46
- .textStyle_body\.medium:where([lang='zh'], [lang='zh-Hans'], [lang='zh-Hant']):not([data-pinyin]) {
47
- font-size: calc(var(--font-sizes-small) * 1.11);
48
- line-height: calc(var(--line-heights-small) * 1.11);
49
- }
50
-
51
51
  .\[\&_a\]\:textStyle_label\.xsmall a {
52
52
  font-family: var(--fonts-sans);
53
53
  font-weight: var(--font-weights-normal);
@@ -61,6 +61,50 @@
61
61
  }
62
62
  }
63
63
 
64
+ .mbs_medium {
65
+ margin-block-start: var(--spacing-medium);
66
+ }
67
+
68
+ .pbs_xsmall {
69
+ padding-block-start: var(--spacing-xsmall);
70
+ }
71
+
72
+ .bd-t_1px_solid {
73
+ border-top: 1px solid;
74
+ }
75
+
76
+ .d_flex {
77
+ display: flex;
78
+ }
79
+
80
+ .gap_3xsmall {
81
+ gap: var(--spacing-3xsmall);
82
+ }
83
+
84
+ .w_100\% {
85
+ width: 100%;
86
+ }
87
+
88
+ .py_xsmall {
89
+ padding-block: var(--spacing-xsmall);
90
+ }
91
+
92
+ .gap_xsmall {
93
+ gap: var(--spacing-xsmall);
94
+ }
95
+
96
+ .pbs_xxlarge {
97
+ padding-block-start: var(--spacing-xxlarge);
98
+ }
99
+
100
+ .gap_medium {
101
+ gap: var(--spacing-medium);
102
+ }
103
+
104
+ .li-s_none {
105
+ list-style: none;
106
+ }
107
+
64
108
  .bd_1px_solid {
65
109
  border: 1px solid;
66
110
  }
@@ -81,10 +125,6 @@
81
125
  overflow: hidden;
82
126
  }
83
127
 
84
- .d_flex {
85
- display: flex;
86
- }
87
-
88
128
  .flex_1_0_auto {
89
129
  flex: 1 0 auto;
90
130
  }
@@ -97,18 +137,10 @@
97
137
  height: var(--sizes-surface-4xsmall);
98
138
  }
99
139
 
100
- .gap_xsmall {
101
- gap: var(--spacing-xsmall);
102
- }
103
-
104
140
  .p_xsmall {
105
141
  padding: var(--spacing-xsmall);
106
142
  }
107
143
 
108
- .w_100\% {
109
- width: 100%;
110
- }
111
-
112
144
  .bd-bs_1px_solid {
113
145
  border-block-start: 1px solid;
114
146
  }
@@ -134,10 +166,6 @@
134
166
  background: var(--colors-background-default);
135
167
  }
136
168
 
137
- .py_xsmall {
138
- padding-block: var(--spacing-xsmall);
139
- }
140
-
141
169
  .px_medium {
142
170
  padding-inline: var(--spacing-medium);
143
171
  }
@@ -214,10 +242,6 @@
214
242
  color: var(--colors-text-default);
215
243
  }
216
244
 
217
- .gap_medium {
218
- gap: var(--spacing-medium);
219
- }
220
-
221
245
  .h_100\% {
222
246
  height: 100%;
223
247
  }
@@ -411,10 +435,6 @@
411
435
  padding-block: var(--spacing-small);
412
436
  }
413
437
 
414
- .bd-t_1px_solid {
415
- border-top: 1px solid;
416
- }
417
-
418
438
  .bg_surface\.default {
419
439
  background: var(--colors-surface-default);
420
440
  }
@@ -443,10 +463,6 @@
443
463
  color: var(--colors-icon-strong);
444
464
  }
445
465
 
446
- .li-s_none {
447
- list-style: none;
448
- }
449
-
450
466
  .d_grid {
451
467
  display: grid;
452
468
  }
@@ -459,22 +475,34 @@
459
475
  aspect-ratio: 1/1;
460
476
  }
461
477
 
462
- .bd-c_stroke\.default {
463
- border-color: var(--colors-stroke-default);
478
+ .bd-c_stroke\.subtle {
479
+ border-color: var(--colors-stroke-subtle);
464
480
  }
465
481
 
466
- .ai_center {
467
- align-items: center;
482
+ .flex-d_column-reverse {
483
+ flex-direction: column-reverse;
468
484
  }
469
485
 
470
- .ai_flex-start {
471
- align-items: flex-start;
486
+ .jc_space-between {
487
+ justify-content: space-between;
488
+ }
489
+
490
+ .ai_center {
491
+ align-items: center;
472
492
  }
473
493
 
474
494
  .flex-d_column {
475
495
  flex-direction: column;
476
496
  }
477
497
 
498
+ .bd-c_stroke\.default {
499
+ border-color: var(--colors-stroke-default);
500
+ }
501
+
502
+ .ai_flex-start {
503
+ align-items: flex-start;
504
+ }
505
+
478
506
  .as_flex-start {
479
507
  align-self: flex-start;
480
508
  }
@@ -487,10 +515,6 @@
487
515
  background-color: var(--colors-background-default);
488
516
  }
489
517
 
490
- .bd-c_stroke\.subtle {
491
- border-color: var(--colors-stroke-subtle);
492
- }
493
-
494
518
  .trs-dur_fast {
495
519
  --transition-duration: var(--durations-fast);
496
520
  transition-duration: var(--durations-fast);
@@ -620,10 +644,6 @@
620
644
  bottom: calc(var(--spacing-medium) * -1);
621
645
  }
622
646
 
623
- .jc_space-between {
624
- justify-content: space-between;
625
- }
626
-
627
647
  .font-style_italic {
628
648
  font-style: italic;
629
649
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ndla/ui",
3
- "version": "55.0.15-alpha.0",
3
+ "version": "55.0.16-alpha.0",
4
4
  "description": "UI component library for NDLA",
5
5
  "license": "GPL-3.0",
6
6
  "main": "lib/index.js",
@@ -33,7 +33,6 @@
33
33
  "types"
34
34
  ],
35
35
  "dependencies": {
36
- "@ndla/accordion": "^5.0.7-alpha.0",
37
36
  "@ndla/button": "^14.0.7-alpha.0",
38
37
  "@ndla/core": "^5.0.1",
39
38
  "@ndla/dropdown-menu": "^1.0.38",
@@ -79,5 +78,5 @@
79
78
  "publishConfig": {
80
79
  "access": "public"
81
80
  },
82
- "gitHead": "3675a902b9f44f5afb37c648038b8d90f1ccd7d0"
81
+ "gitHead": "b05b7016560891b2867811c4420041e6932003cc"
83
82
  }
@@ -10,44 +10,54 @@ import { TFunction } from "i18next";
10
10
  import { ReactNode, useCallback, useEffect, useState } from "react";
11
11
  import { useTranslation } from "react-i18next";
12
12
  import { useLocation } from "react-router-dom";
13
- import styled from "@emotion/styled";
14
- import { AccordionRoot, AccordionHeader, AccordionContent, AccordionItem } from "@ndla/accordion";
15
- import { breakpoints, colors, fonts, mq, spacing } from "@ndla/core";
13
+ import { ChevronDown } from "@ndla/icons/common";
16
14
  import { getLicenseByAbbreviation } from "@ndla/licenses";
15
+ import {
16
+ AccordionItem,
17
+ AccordionItemContent,
18
+ AccordionItemIndicator,
19
+ AccordionItemTrigger,
20
+ AccordionRoot,
21
+ Heading,
22
+ } from "@ndla/primitives";
23
+ import { styled } from "@ndla/styled-system/jsx";
17
24
  import ArticleFootNotes from "./ArticleFootNotes";
18
25
  import { LicenseLink } from "../LicenseByline/LicenseLink";
19
26
  import { FootNote } from "../types";
20
27
 
21
- const Wrapper = styled.div`
22
- margin-top: ${spacing.normal};
23
- padding-top: ${spacing.normal};
24
- padding-bottom: ${spacing.xsmall};
25
- border-top: 1px solid ${colors.brand.greyLight};
26
- ${fonts.sizes("16px", "24px")};
27
- font-family: ${fonts.sans};
28
- color: ${colors.brand.greyDark};
29
- `;
30
-
31
- const TextWrapper = styled.div`
32
- display: flex;
33
- justify-content: space-between;
34
- width: 100%;
35
- padding-bottom: ${spacing.mediumlarge};
36
- ${mq.range({ until: breakpoints.tabletWide })} {
37
- flex-direction: column;
38
- flex-direction: column-reverse;
39
- gap: ${spacing.xsmall};
40
- }
41
- &[data-learning-path="true"] {
42
- flex-direction: column;
43
- flex-direction: column-reverse;
44
- gap: ${spacing.xsmall};
45
- }
46
- `;
47
-
48
- const PrimaryContributorsWrapper = styled.span`
49
- margin-left: ${spacing.xxsmall};
50
- `;
28
+ const Wrapper = styled("div", {
29
+ base: {
30
+ // TODO: Figure out if we want to remove this margin. It's only here to add some gap between the article content and the byline.
31
+ marginBlockStart: "medium",
32
+ paddingBlockStart: "xsmall",
33
+ borderTop: "1px solid",
34
+ borderColor: "stroke.subtle",
35
+ },
36
+ });
37
+
38
+ // TODO: This is designed with 24px of inline padding. If you do this, most bylines will break into two lines.
39
+ // Should reconsider.
40
+ const TextWrapper = styled("div", {
41
+ base: {
42
+ display: "flex",
43
+ flexDirection: "column-reverse",
44
+ gap: "3xsmall",
45
+ width: "100%",
46
+ justifyContent: "space-between",
47
+ paddingBlock: "xsmall",
48
+ textStyle: "body.medium",
49
+ },
50
+ variants: {
51
+ learningpath: {
52
+ true: {},
53
+ false: {
54
+ tabletWide: {
55
+ flexDirection: "row",
56
+ },
57
+ },
58
+ },
59
+ },
60
+ });
51
61
 
52
62
  type AuthorProps = {
53
63
  name: string;
@@ -57,8 +67,6 @@ type SupplierProps = {
57
67
  name: string;
58
68
  };
59
69
 
60
- type AccordionHeaderVariants = "white" | "blue";
61
-
62
70
  type Props = {
63
71
  authors?: AuthorProps[];
64
72
  suppliers?: SupplierProps[];
@@ -67,7 +75,6 @@ type Props = {
67
75
  licenseBox?: ReactNode;
68
76
  locale?: string;
69
77
  footnotes?: FootNote[];
70
- accordionHeaderVariant?: AccordionHeaderVariants;
71
78
  displayByline?: boolean;
72
79
  bylineType?: "article" | "learningPath";
73
80
  };
@@ -96,27 +103,18 @@ const getSuppliersText = (suppliers: SupplierProps[], t: TFunction) => {
96
103
  });
97
104
  };
98
105
 
99
- const LicenseWrapper = styled.div`
100
- display: flex;
101
- gap: ${spacing.small};
102
- padding-right: ${spacing.xsmall};
103
- `;
106
+ const LicenseWrapper = styled("div", {
107
+ base: {
108
+ display: "flex",
109
+ gap: "xsmall",
110
+ },
111
+ });
104
112
 
105
- const StyledAccordionHeader = styled(AccordionHeader)`
106
- background-color: ${colors.brand.lightest};
107
- ${fonts.sizes("16px", "29px")};
108
- font-weight: ${fonts.weight.semibold};
109
-
110
- &[data-background-color="white"][data-state="closed"] {
111
- background-color: ${colors.background.default};
112
- }
113
- `;
114
-
115
- const StyledAccordionContent = styled(AccordionContent)`
116
- &[data-background-color="white"] {
117
- background-color: ${colors.background.default};
118
- }
119
- `;
113
+ const StyledAccordionRoot = styled(AccordionRoot, {
114
+ base: {
115
+ paddingBlockStart: "xxlarge",
116
+ },
117
+ });
120
118
 
121
119
  const refRegexp = /note\d/;
122
120
  const footnotesAccordionId = "footnotes";
@@ -129,7 +127,6 @@ const ArticleByline = ({
129
127
  licenseBox,
130
128
  published,
131
129
  locale,
132
- accordionHeaderVariant = "blue",
133
130
  displayByline = true,
134
131
  bylineType = "article",
135
132
  }: Props) => {
@@ -167,18 +164,18 @@ const ArticleByline = ({
167
164
  return (
168
165
  <Wrapper>
169
166
  {displayByline && (
170
- <TextWrapper data-learning-path={bylineType === "learningPath"}>
167
+ <TextWrapper learningpath={bylineType === "learningPath"}>
171
168
  <LicenseWrapper>
172
169
  {license && <LicenseLink license={license} />}
173
170
  {showPrimaryContributors && (
174
- <PrimaryContributorsWrapper>
171
+ <span>
175
172
  {authors.length > 0 &&
176
173
  `${t("article.authorsLabel", {
177
174
  names: renderContributors(authors, t),
178
175
  interpolation: { escapeValue: false },
179
176
  })}. `}
180
177
  {getSuppliersText(suppliers, t)}
181
- </PrimaryContributorsWrapper>
178
+ </span>
182
179
  )}
183
180
  </LicenseWrapper>
184
181
  <div>
@@ -186,25 +183,41 @@ const ArticleByline = ({
186
183
  </div>
187
184
  </TextWrapper>
188
185
  )}
189
- <AccordionRoot type="multiple" onValueChange={setOpenAccordions} value={openAccordions}>
186
+ <StyledAccordionRoot
187
+ multiple
188
+ value={openAccordions}
189
+ onValueChange={(details) => setOpenAccordions(details.value)}
190
+ >
190
191
  {licenseBox && (
191
192
  <AccordionItem value={accordionItemValue}>
192
- <StyledAccordionHeader headingLevel="h2" data-background-color={accordionHeaderVariant}>
193
- {t("article.useContent")}
194
- </StyledAccordionHeader>
195
- <StyledAccordionContent data-background-color={accordionHeaderVariant}>{licenseBox}</StyledAccordionContent>
193
+ <AccordionItemTrigger>
194
+ <Heading asChild consumeCss textStyle="label.medium" fontWeight="bold">
195
+ <h2>{t("article.useContent")}</h2>
196
+ </Heading>
197
+ <AccordionItemIndicator asChild>
198
+ <ChevronDown />
199
+ </AccordionItemIndicator>
200
+ </AccordionItemTrigger>
201
+ <AccordionItemContent>{licenseBox}</AccordionItemContent>
196
202
  </AccordionItem>
197
203
  )}
198
204
 
199
205
  {!!footnotes?.length && (
200
206
  <AccordionItem value={footnotesAccordionId}>
201
- <StyledAccordionHeader headingLevel="h2">{t("article.footnotes")}</StyledAccordionHeader>
202
- <StyledAccordionContent forceMount data-background-color={accordionHeaderVariant}>
207
+ <AccordionItemTrigger>
208
+ <Heading asChild consumeCss textStyle="label.medium" fontWeight="bold">
209
+ <h2>{t("article.footnotes")}</h2>
210
+ </Heading>
211
+ <AccordionItemIndicator asChild>
212
+ <ChevronDown />
213
+ </AccordionItemIndicator>
214
+ </AccordionItemTrigger>
215
+ <AccordionItemContent>
203
216
  <ArticleFootNotes footNotes={footnotes} />
204
- </StyledAccordionContent>
217
+ </AccordionItemContent>
205
218
  </AccordionItem>
206
219
  )}
207
- </AccordionRoot>
220
+ </StyledAccordionRoot>
208
221
  </Wrapper>
209
222
  );
210
223
  };
@@ -6,8 +6,8 @@
6
6
  *
7
7
  */
8
8
 
9
- import styled from "@emotion/styled";
10
- import { colors, spacing } from "@ndla/core";
9
+ import { Text } from "@ndla/primitives";
10
+ import { styled } from "@ndla/styled-system/jsx";
11
11
  import { FootNote as FootNoteType } from "../types";
12
12
 
13
13
  const citeDetailString = (description: string | undefined) => (description ? `${description}. ` : "");
@@ -16,36 +16,32 @@ type FootNoteProps = {
16
16
  footNote: FootNoteType;
17
17
  };
18
18
 
19
- const Cite = styled.cite`
20
- display: flex;
21
- gap: ${spacing.small};
22
- a {
23
- box-shadow: none;
24
- text-decoration: underline;
25
- text-underline-offset: ${spacing.xxsmall};
26
- &:hover,
27
- &:focus-visible {
28
- text-decoration: none;
29
- }
30
- }
31
- `;
19
+ const StyledCite = styled("cite", {
20
+ base: {
21
+ display: "flex",
22
+ alignItems: "center",
23
+ gap: "xsmall",
24
+ },
25
+ });
32
26
 
33
27
  const FootNote = ({ footNote }: FootNoteProps) => (
34
28
  <li>
35
- <Cite id={`note${footNote.ref}`}>
36
- <a href={`#ref${footNote.ref}`} target="_self">
37
- {footNote.ref}
38
- </a>
39
- {`«${footNote.title}». ${footNote.authors.join(" ")}. ${citeDetailString(footNote.edition)}${citeDetailString(
40
- footNote.publisher,
41
- )}${footNote.year}. `}
42
- {footNote.url ? (
43
- <a href={footNote.url}>
44
- {footNote.url}
45
- {"."}
29
+ <Text id={`note${footNote.ref}`} asChild consumeCss textStyle="body.medium">
30
+ <StyledCite>
31
+ <a href={`#ref${footNote.ref}`} target="_self">
32
+ {footNote.ref}
46
33
  </a>
47
- ) : null}
48
- </Cite>
34
+ {`«${footNote.title}». ${footNote.authors.join(" ")}. ${citeDetailString(footNote.edition)}${citeDetailString(
35
+ footNote.publisher,
36
+ )}${footNote.year}. `}
37
+ {footNote.url ? (
38
+ <a href={footNote.url}>
39
+ {footNote.url}
40
+ {"."}
41
+ </a>
42
+ ) : null}
43
+ </StyledCite>
44
+ </Text>
49
45
  </li>
50
46
  );
51
47
 
@@ -53,14 +49,14 @@ type ArticleFootNotesProps = {
53
49
  footNotes: Array<FootNoteType>;
54
50
  };
55
51
 
56
- const FootnoteList = styled.ol`
57
- margin: 0;
58
- display: flex;
59
- flex-direction: column;
60
- list-style: none;
61
- padding: ${spacing.small};
62
- color: ${colors.text.light};
63
- `;
52
+ const FootnoteList = styled("ol", {
53
+ base: {
54
+ display: "flex",
55
+ flexDirection: "column",
56
+ gap: "medium",
57
+ listStyle: "none",
58
+ },
59
+ });
64
60
 
65
61
  const ArticleFootNotes = ({ footNotes }: ArticleFootNotesProps) => (
66
62
  <FootnoteList>
@@ -15,7 +15,7 @@ export interface ContentTypeBadgeProps extends Omit<BadgeProps, "colorTheme"> {
15
15
  contentType: ContentType | undefined;
16
16
  }
17
17
 
18
- type ContentType =
18
+ export type ContentType =
19
19
  | typeof contentTypes.SUBJECT_MATERIAL
20
20
  | typeof contentTypes.TASKS_AND_ACTIVITIES
21
21
  | typeof contentTypes.ASSESSMENT_RESOURCES
@@ -30,6 +30,7 @@ type ContentType =
30
30
  | typeof contentTypes.AUDIO
31
31
  | typeof contentTypes.VIDEO
32
32
  | typeof contentTypes.MISSING
33
+ | typeof contentTypes.PODCAST
33
34
  // This allows for us to fallback to string without getting a ts error, while still keeping intellisense
34
35
  | (string & {});
35
36
 
@@ -49,6 +50,7 @@ export const contentTypeToBadgeVariantMap: Record<ContentType, BadgeVariant> = {
49
50
  // TODO: Verify resourceEmbedTypeMapping colors
50
51
  [contentTypes.IMAGE]: "brand1",
51
52
  [contentTypes.AUDIO]: "brand1",
53
+ [contentTypes.PODCAST]: "brand1",
52
54
  [contentTypes.VIDEO]: "brand1",
53
55
  [contentTypes.MISSING]: "neutral",
54
56
  };
@@ -79,7 +79,7 @@ export const FrontpageArticle = ({ article, id, isWide, licenseBox, lang }: Prop
79
79
  {introduction}
80
80
  </Text>
81
81
  {content}
82
- <ArticleByline accordionHeaderVariant={"white"} licenseBox={licenseBox} displayByline={false} />
82
+ <ArticleByline licenseBox={licenseBox} displayByline={false} />
83
83
  </StyledArticle>
84
84
  );
85
85
  };
package/src/index.ts CHANGED
@@ -85,8 +85,6 @@ export { SearchFieldForm } from "./Search/SearchFieldForm";
85
85
 
86
86
  export { default as resourceTypeColor } from "./utils/resourceTypeColor";
87
87
 
88
- export { default as CreatedBy } from "./CreatedBy";
89
-
90
88
  export { MessageBox, MessageBanner } from "./Messages";
91
89
 
92
90
  export { ResourceBox } from "./ResourceBox";
@@ -20,6 +20,7 @@ export const MISSING = "missing";
20
20
  export const IMAGE = "image";
21
21
  export const VIDEO = "video";
22
22
  export const AUDIO = "audio";
23
+ export const PODCAST = "podcast";
23
24
 
24
25
  export const contentTypes = {
25
26
  SUBJECT_MATERIAL,
@@ -71,4 +72,5 @@ export const resourceEmbedTypeMapping: Record<string, string> = {
71
72
  video: "video",
72
73
  concept: "concept",
73
74
  audio: "audio",
75
+ podcast: "podcast",
74
76
  };