@ndla/ui 55.0.16-alpha.0 → 55.0.17-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 (305) hide show
  1. package/dist/panda.buildinfo.json +114 -23
  2. package/dist/styles.css +411 -81
  3. package/es/Article/Article.js +101 -162
  4. package/es/Article/ArticleByline.js +23 -23
  5. package/es/Article/ArticleFootNotes.js +8 -8
  6. package/es/Article/ArticleParagraph.js +2 -2
  7. package/es/Article/index.js +3 -5
  8. package/es/AudioPlayer/AudioPlayer.js +20 -20
  9. package/es/AudioPlayer/Controls.js +45 -45
  10. package/es/AudioPlayer/SpeechControl.js +8 -8
  11. package/es/BlogPost/BlogPost.js +6 -6
  12. package/es/Breadcrumb/Breadcrumb.js +19 -29
  13. package/es/Breadcrumb/BreadcrumbItem.js +20 -49
  14. package/es/Breadcrumb/HomeBreadcrumb.js +36 -82
  15. package/es/CampaignBlock/CampaignBlock.js +12 -12
  16. package/es/CodeBlock/CodeBlock.js +2 -2
  17. package/es/Concept/Concept.js +11 -11
  18. package/es/ContactBlock/ContactBlock.js +170 -185
  19. package/es/ContactBlock/index.js +3 -3
  20. package/es/ContentLoader/index.js +12 -12
  21. package/es/ContentPlaceholder/ContentPlaceholder.js +3 -3
  22. package/es/ContentTypeBadge/ContentTypeBadge.js +81 -80
  23. package/es/ContentTypeBadge/ContentTypeBadgeNew.js +2 -2
  24. package/es/ContentTypeHero/ContentTypeHero.js +50 -0
  25. package/es/{Logo → ContentTypeHero}/index.js +2 -3
  26. package/es/CopyParagraphButton/CopyParagraphButton.js +13 -12
  27. package/es/Embed/AudioEmbed.js +7 -7
  28. package/es/Embed/BrightcoveEmbed.js +8 -8
  29. package/es/Embed/CodeEmbed.js +6 -6
  30. package/es/Embed/ConceptEmbed.js +13 -13
  31. package/es/Embed/ConceptListEmbed.js +9 -9
  32. package/es/Embed/ContentLinkEmbed.js +6 -6
  33. package/es/Embed/CopyrightEmbed.js +3 -3
  34. package/es/Embed/EmbedErrorPlaceholder.js +5 -5
  35. package/es/Embed/ExternalEmbed.js +5 -5
  36. package/es/Embed/FootnoteEmbed.js +5 -5
  37. package/es/Embed/GlossEmbed.js +11 -11
  38. package/es/Embed/H5pEmbed.js +5 -5
  39. package/es/Embed/IframeEmbed.js +6 -6
  40. package/es/Embed/ImageEmbed.js +10 -10
  41. package/es/Embed/InlineTriggerButton.js +2 -2
  42. package/es/Embed/RelatedContentEmbed.js +5 -5
  43. package/es/Embed/UnknownEmbed.js +3 -3
  44. package/es/Embed/UuDisclaimerEmbed.js +6 -6
  45. package/es/ErrorMessage/ErrorMessage.js +14 -14
  46. package/es/ErrorMessage/ErrorResourceAccessDenied.js +6 -6
  47. package/es/FactBox/FactBox.js +5 -5
  48. package/es/FileList/File.js +3 -3
  49. package/es/FileList/FileList.js +6 -6
  50. package/es/FileList/Format.js +6 -6
  51. package/es/FileList/PdfFile.js +5 -5
  52. package/es/FrontpageArticle/FrontpageArticle.js +6 -6
  53. package/es/Gloss/Gloss.js +23 -23
  54. package/es/Gloss/GlossExample.js +9 -9
  55. package/es/Grid/Grid.js +4 -4
  56. package/es/KeyFigure/KeyFigure.js +5 -5
  57. package/es/Layout/LayoutItem.js +25 -37
  58. package/es/Layout/OneColumn.js +33 -31
  59. package/es/Layout/PageContainer.js +21 -30
  60. package/es/LicenseByline/EmbedByline.js +21 -21
  61. package/es/LicenseByline/LicenseLink.js +3 -3
  62. package/es/LinkBlock/LinkBlock.js +8 -8
  63. package/es/LinkBlock/LinkBlockSection.js +4 -4
  64. package/es/Messages/MessageBox.js +11 -11
  65. package/es/Messages/index.js +1 -2
  66. package/es/ProgrammeCard/ProgrammeCard.js +5 -5
  67. package/es/RelatedArticleList/RelatedArticleList.js +15 -15
  68. package/es/ResourceBox/ResourceBox.js +9 -9
  69. package/es/SnackBar/DefaultSnackbar.js +5 -5
  70. package/es/SnackBar/SnackbarProvider.js +7 -7
  71. package/es/TagSelector/TagSelector.js +17 -17
  72. package/es/TreeStructure/AddFolderButton.js +4 -4
  73. package/es/TreeStructure/ComboboxButton.js +7 -7
  74. package/es/TreeStructure/FolderItem.js +13 -13
  75. package/es/TreeStructure/FolderItems.js +6 -6
  76. package/es/TreeStructure/TreeStructure.js +9 -9
  77. package/es/ZendeskButton/ZendeskButton.js +2 -2
  78. package/es/i18n/index.js +1 -1
  79. package/es/index.js +5 -11
  80. package/es/locale/messages-en.js +1 -1
  81. package/es/locale/messages-nb.js +1 -1
  82. package/es/locale/messages-nn.js +1 -1
  83. package/es/locale/messages-se.js +1 -1
  84. package/es/locale/messages-sma.js +1 -1
  85. package/es/styles.css +411 -81
  86. package/lib/Article/Article.d.ts +9 -30
  87. package/lib/Article/Article.js +104 -164
  88. package/lib/Article/ArticleByline.js +23 -23
  89. package/lib/Article/ArticleFootNotes.js +8 -8
  90. package/lib/Article/ArticleParagraph.js +2 -2
  91. package/lib/Article/index.d.ts +2 -5
  92. package/lib/Article/index.js +18 -24
  93. package/lib/AudioPlayer/AudioPlayer.js +20 -20
  94. package/lib/AudioPlayer/Controls.js +45 -45
  95. package/lib/AudioPlayer/SpeechControl.js +8 -8
  96. package/lib/BlogPost/BlogPost.js +6 -6
  97. package/lib/Breadcrumb/Breadcrumb.js +21 -29
  98. package/lib/Breadcrumb/BreadcrumbItem.js +22 -50
  99. package/lib/Breadcrumb/HomeBreadcrumb.d.ts +1 -2
  100. package/lib/Breadcrumb/HomeBreadcrumb.js +38 -82
  101. package/lib/CampaignBlock/CampaignBlock.js +12 -12
  102. package/lib/CodeBlock/CodeBlock.js +2 -2
  103. package/lib/Concept/Concept.js +11 -11
  104. package/lib/ContactBlock/ContactBlock.d.ts +6 -7
  105. package/lib/ContactBlock/ContactBlock.js +173 -184
  106. package/lib/ContactBlock/index.d.ts +3 -3
  107. package/lib/ContactBlock/index.js +13 -11
  108. package/lib/ContentLoader/index.js +12 -12
  109. package/lib/ContentPlaceholder/ContentPlaceholder.js +3 -3
  110. package/lib/ContentTypeBadge/ContentTypeBadge.d.ts +11 -12
  111. package/lib/ContentTypeBadge/ContentTypeBadge.js +83 -80
  112. package/lib/ContentTypeBadge/ContentTypeBadgeNew.js +2 -2
  113. package/lib/ContentTypeHero/ContentTypeHero.d.ts +15 -0
  114. package/lib/ContentTypeHero/ContentTypeHero.js +57 -0
  115. package/lib/ContentTypeHero/index.d.ts +9 -0
  116. package/lib/ContentTypeHero/index.js +12 -0
  117. package/lib/CopyParagraphButton/CopyParagraphButton.js +13 -12
  118. package/lib/Embed/AudioEmbed.js +7 -7
  119. package/lib/Embed/BrightcoveEmbed.js +8 -8
  120. package/lib/Embed/CodeEmbed.js +6 -6
  121. package/lib/Embed/ConceptEmbed.js +13 -13
  122. package/lib/Embed/ConceptListEmbed.js +9 -9
  123. package/lib/Embed/ContentLinkEmbed.js +6 -6
  124. package/lib/Embed/CopyrightEmbed.js +3 -3
  125. package/lib/Embed/EmbedErrorPlaceholder.js +5 -5
  126. package/lib/Embed/ExternalEmbed.js +5 -5
  127. package/lib/Embed/FootnoteEmbed.js +5 -5
  128. package/lib/Embed/GlossEmbed.js +11 -11
  129. package/lib/Embed/H5pEmbed.js +5 -5
  130. package/lib/Embed/IframeEmbed.js +6 -6
  131. package/lib/Embed/ImageEmbed.js +10 -10
  132. package/lib/Embed/InlineTriggerButton.js +2 -2
  133. package/lib/Embed/RelatedContentEmbed.js +5 -5
  134. package/lib/Embed/UnknownEmbed.js +3 -3
  135. package/lib/Embed/UuDisclaimerEmbed.js +6 -6
  136. package/lib/ErrorMessage/ErrorMessage.js +14 -14
  137. package/lib/ErrorMessage/ErrorResourceAccessDenied.js +6 -6
  138. package/lib/FactBox/FactBox.js +5 -5
  139. package/lib/FileList/File.js +3 -3
  140. package/lib/FileList/FileList.js +6 -6
  141. package/lib/FileList/Format.js +6 -6
  142. package/lib/FileList/PdfFile.js +5 -5
  143. package/lib/FrontpageArticle/FrontpageArticle.js +6 -6
  144. package/lib/Gloss/Gloss.js +23 -23
  145. package/lib/Gloss/GlossExample.js +9 -9
  146. package/lib/Grid/Grid.js +4 -4
  147. package/lib/KeyFigure/KeyFigure.js +5 -5
  148. package/lib/Layout/LayoutItem.d.ts +3 -7
  149. package/lib/Layout/LayoutItem.js +27 -38
  150. package/lib/Layout/OneColumn.d.ts +3 -6
  151. package/lib/Layout/OneColumn.js +36 -33
  152. package/lib/Layout/PageContainer.d.ts +3 -6
  153. package/lib/Layout/PageContainer.js +24 -32
  154. package/lib/LicenseByline/EmbedByline.js +21 -21
  155. package/lib/LicenseByline/LicenseLink.js +3 -3
  156. package/lib/LinkBlock/LinkBlock.js +8 -8
  157. package/lib/LinkBlock/LinkBlockSection.js +4 -4
  158. package/lib/Messages/MessageBox.js +11 -11
  159. package/lib/Messages/index.d.ts +1 -2
  160. package/lib/Messages/index.js +0 -7
  161. package/lib/ProgrammeCard/ProgrammeCard.js +5 -5
  162. package/lib/RelatedArticleList/RelatedArticleList.js +15 -15
  163. package/lib/ResourceBox/ResourceBox.js +9 -9
  164. package/lib/SnackBar/DefaultSnackbar.js +5 -5
  165. package/lib/SnackBar/SnackbarProvider.js +7 -7
  166. package/lib/TagSelector/TagSelector.js +17 -17
  167. package/lib/TreeStructure/AddFolderButton.js +4 -4
  168. package/lib/TreeStructure/ComboboxButton.js +7 -7
  169. package/lib/TreeStructure/FolderItem.js +13 -13
  170. package/lib/TreeStructure/FolderItems.js +6 -6
  171. package/lib/TreeStructure/TreeStructure.js +9 -9
  172. package/lib/ZendeskButton/ZendeskButton.js +2 -2
  173. package/lib/i18n/index.d.ts +1 -1
  174. package/lib/i18n/index.js +6 -0
  175. package/lib/index.d.ts +8 -14
  176. package/lib/index.js +30 -132
  177. package/lib/locale/messages-en.js +1 -1
  178. package/lib/locale/messages-nb.js +1 -1
  179. package/lib/locale/messages-nn.js +1 -1
  180. package/lib/locale/messages-se.js +1 -1
  181. package/lib/locale/messages-sma.js +1 -1
  182. package/lib/styles.css +411 -81
  183. package/package.json +10 -10
  184. package/src/Article/Article.tsx +101 -229
  185. package/src/Article/index.ts +3 -7
  186. package/src/Breadcrumb/Breadcrumb.tsx +20 -18
  187. package/src/Breadcrumb/BreadcrumbItem.tsx +36 -59
  188. package/src/Breadcrumb/HomeBreadcrumb.stories.tsx +0 -12
  189. package/src/Breadcrumb/HomeBreadcrumb.tsx +33 -46
  190. package/src/ContactBlock/{Contactblock.stories.tsx → ContactBlock.stories.tsx} +3 -4
  191. package/src/ContactBlock/ContactBlock.tsx +165 -199
  192. package/src/ContactBlock/index.ts +3 -3
  193. package/src/ContentTypeBadge/ContentTypeBadge.tsx +77 -77
  194. package/src/ContentTypeHero/ContentTypeHero.stories.tsx +76 -0
  195. package/src/ContentTypeHero/ContentTypeHero.tsx +55 -0
  196. package/src/ContentTypeHero/index.ts +10 -0
  197. package/src/CopyParagraphButton/CopyParagraphButton.tsx +10 -3
  198. package/src/Embed/AudioEmbed.stories.tsx +6 -8
  199. package/src/Embed/BrightcoveEmbed.stories.tsx +6 -8
  200. package/src/Embed/ConceptEmbed.stories.tsx +6 -8
  201. package/src/Embed/ExternalEmbed.stories.tsx +5 -5
  202. package/src/Embed/H5pEmbed.stories.tsx +6 -8
  203. package/src/Embed/IframeEmbed.stories.tsx +6 -8
  204. package/src/Embed/ImageEmbed.stories.tsx +6 -8
  205. package/src/Embed/RelatedContentEmbed.stories.tsx +6 -8
  206. package/src/Embed/UuDisclaimerEmbed.stories.tsx +6 -8
  207. package/src/Layout/LayoutItem.tsx +25 -41
  208. package/src/Layout/OneColumn.tsx +33 -33
  209. package/src/Layout/PageContainer.tsx +22 -24
  210. package/src/Messages/index.ts +1 -2
  211. package/src/i18n/index.ts +1 -0
  212. package/src/index.ts +11 -33
  213. package/src/locale/messages-en.ts +1 -1
  214. package/src/locale/messages-nb.ts +1 -1
  215. package/src/locale/messages-nn.ts +1 -1
  216. package/src/locale/messages-se.ts +1 -1
  217. package/src/locale/messages-sma.ts +1 -1
  218. package/es/Article/ArticleHeaderWrapper.js +0 -33
  219. package/es/Hero/Hero.js +0 -68
  220. package/es/Hero/HeroContent.js +0 -16
  221. package/es/Hero/index.js +0 -10
  222. package/es/LanguageSelector/LanguageSelector.js +0 -87
  223. package/es/LanguageSelector/index.js +0 -10
  224. package/es/Logo/Logo.js +0 -52
  225. package/es/Logo/SvgLogo.js +0 -54
  226. package/es/Messages/MessageBanner.js +0 -72
  227. package/es/Search/ActiveFilterContent.js +0 -40
  228. package/es/Search/ActiveFilters.js +0 -112
  229. package/es/Search/ContentTypeResult.js +0 -151
  230. package/es/Search/ContentTypeResultStyles.js +0 -51
  231. package/es/Search/IsPathToHighlight.js +0 -12
  232. package/es/Search/LoadingWrapper.js +0 -31
  233. package/es/Search/SearchField.js +0 -110
  234. package/es/Search/SearchFieldForm.js +0 -33
  235. package/es/Search/SearchResult.js +0 -185
  236. package/es/Search/SearchResultSleeve.js +0 -229
  237. package/es/Search/index.js +0 -12
  238. package/lib/Article/ArticleHeaderWrapper.d.ts +0 -14
  239. package/lib/Article/ArticleHeaderWrapper.js +0 -40
  240. package/lib/Hero/Hero.d.ts +0 -25
  241. package/lib/Hero/Hero.js +0 -83
  242. package/lib/Hero/HeroContent.d.ts +0 -12
  243. package/lib/Hero/HeroContent.js +0 -23
  244. package/lib/Hero/index.d.ts +0 -10
  245. package/lib/Hero/index.js +0 -61
  246. package/lib/LanguageSelector/LanguageSelector.d.ts +0 -15
  247. package/lib/LanguageSelector/LanguageSelector.js +0 -92
  248. package/lib/LanguageSelector/index.d.ts +0 -9
  249. package/lib/LanguageSelector/index.js +0 -13
  250. package/lib/Logo/Logo.d.ts +0 -20
  251. package/lib/Logo/Logo.js +0 -58
  252. package/lib/Logo/SvgLogo.d.ts +0 -14
  253. package/lib/Logo/SvgLogo.js +0 -62
  254. package/lib/Logo/index.d.ts +0 -9
  255. package/lib/Logo/index.js +0 -16
  256. package/lib/Messages/MessageBanner.d.ts +0 -16
  257. package/lib/Messages/MessageBanner.js +0 -77
  258. package/lib/Search/ActiveFilterContent.d.ts +0 -23
  259. package/lib/Search/ActiveFilterContent.js +0 -47
  260. package/lib/Search/ActiveFilters.d.ts +0 -19
  261. package/lib/Search/ActiveFilters.js +0 -119
  262. package/lib/Search/ContentTypeResult.d.ts +0 -29
  263. package/lib/Search/ContentTypeResult.js +0 -159
  264. package/lib/Search/ContentTypeResultStyles.d.ts +0 -45
  265. package/lib/Search/ContentTypeResultStyles.js +0 -58
  266. package/lib/Search/IsPathToHighlight.d.ts +0 -8
  267. package/lib/Search/IsPathToHighlight.js +0 -19
  268. package/lib/Search/LoadingWrapper.d.ts +0 -12
  269. package/lib/Search/LoadingWrapper.js +0 -38
  270. package/lib/Search/SearchField.d.ts +0 -25
  271. package/lib/Search/SearchField.js +0 -117
  272. package/lib/Search/SearchFieldForm.d.ts +0 -15
  273. package/lib/Search/SearchFieldForm.js +0 -41
  274. package/lib/Search/SearchResult.d.ts +0 -43
  275. package/lib/Search/SearchResult.js +0 -194
  276. package/lib/Search/SearchResultSleeve.d.ts +0 -25
  277. package/lib/Search/SearchResultSleeve.js +0 -237
  278. package/lib/Search/index.d.ts +0 -11
  279. package/lib/Search/index.js +0 -33
  280. package/src/Article/ArticleHeaderWrapper.tsx +0 -38
  281. package/src/Hero/Hero.stories.tsx +0 -35
  282. package/src/Hero/Hero.tsx +0 -129
  283. package/src/Hero/HeroContent.tsx +0 -43
  284. package/src/Hero/index.ts +0 -21
  285. package/src/LanguageSelector/LanguageSelector.stories.tsx +0 -44
  286. package/src/LanguageSelector/LanguageSelector.tsx +0 -101
  287. package/src/LanguageSelector/index.ts +0 -11
  288. package/src/Logo/Logo.stories.tsx +0 -47
  289. package/src/Logo/Logo.tsx +0 -47
  290. package/src/Logo/SvgLogo.tsx +0 -48
  291. package/src/Logo/index.ts +0 -11
  292. package/src/Messages/MessageBanner.stories.tsx +0 -31
  293. package/src/Messages/MessageBanner.tsx +0 -67
  294. package/src/Search/ActiveFilterContent.tsx +0 -64
  295. package/src/Search/ActiveFilters.tsx +0 -145
  296. package/src/Search/ContentTypeResult.tsx +0 -190
  297. package/src/Search/ContentTypeResultStyles.tsx +0 -172
  298. package/src/Search/IsPathToHighlight.ts +0 -12
  299. package/src/Search/LoadingWrapper.tsx +0 -44
  300. package/src/Search/SearchField.tsx +0 -175
  301. package/src/Search/SearchFieldForm.tsx +0 -64
  302. package/src/Search/SearchResult.tsx +0 -368
  303. package/src/Search/SearchResultSleeve.tsx +0 -367
  304. package/src/Search/__tests__/Highlight-test.ts +0 -66
  305. package/src/Search/index.ts +0 -14
@@ -6,12 +6,9 @@
6
6
  *
7
7
  */
8
8
 
9
- /** @jsxImportSource @emotion/react */
10
- import { CSSProperties, ComponentProps, useMemo } from "react";
9
+ import { CSSProperties, ComponentPropsWithoutRef, useMemo } from "react";
11
10
 
12
- import { css } from "@emotion/react";
13
- import styled from "@emotion/styled";
14
- import { breakpoints, colors, mq } from "@ndla/core";
11
+ import { colors } from "@ndla/core";
15
12
  import { Minus, MenuBook } from "@ndla/icons/action";
16
13
  import { Audio } from "@ndla/icons/common";
17
14
  import {
@@ -24,12 +21,12 @@ import {
24
21
  SubjectMaterial,
25
22
  TasksAndActivities,
26
23
  } from "@ndla/icons/contentType";
27
-
28
24
  import { Concept, Media, Video } from "@ndla/icons/editor";
25
+ import { styled } from "@ndla/styled-system/jsx";
29
26
 
30
27
  import * as contentTypes from "../model/ContentType";
31
28
 
32
- interface Props extends ComponentProps<"div"> {
29
+ interface Props extends ComponentPropsWithoutRef<"div"> {
33
30
  size?: "xx-small" | "x-small" | "small" | "large";
34
31
  type: string;
35
32
  title?: string;
@@ -38,62 +35,74 @@ interface Props extends ComponentProps<"div"> {
38
35
  className?: string;
39
36
  }
40
37
 
41
- const sizes = {
42
- "xx-small": css`
43
- width: 20px;
44
- height: 20px;
45
- border: 1px solid;
46
- svg {
47
- width: 10px;
48
- height: 10x;
49
- }
50
- `,
51
- "x-small": css`
52
- width: 20px;
53
- height: 20px;
54
- border: 1px solid;
55
- ${mq.range({ from: breakpoints.tablet })} {
56
- height: 26px;
57
- width: 26px;
58
- }
59
- svg {
60
- width: 10px;
61
- height: 10x;
62
- ${mq.range({ from: breakpoints.tablet })} {
63
- width: 12px;
64
- height: 12px;
65
- }
66
- }
67
- `,
68
- small: "",
69
- large: css`
70
- width: 50px;
71
- height: 50px;
72
- svg {
73
- width: 25px;
74
- height: 25px;
75
- }
76
- `,
77
- } as const;
78
-
79
- const BaseContentTypeBadge = styled.div`
80
- display: inline-flex;
81
- align-items: center;
82
- justify-content: center;
83
- border-radius: 100%;
84
- width: 34px;
85
- height: 34px;
86
- color: var(--icon-color);
87
- `;
88
-
89
- const borderStyle = css`
90
- border: 2px solid;
91
- border-color: var(--icon-color);
92
- `;
93
-
94
- const backgroundStyle = css`
95
- background-color: var(--background-color);
96
- `;
38
+ const StyledContentTypeBadge = styled("div", {
39
+ base: {
40
+ display: "inline-flex",
41
+ alignItems: "center",
42
+ justifyContent: "center",
43
+ borderRadius: "100%",
44
+ color: "var(--icon-color)",
45
+ },
46
+ defaultVariants: {
47
+ size: "small",
48
+ border: true,
49
+ background: false,
50
+ },
51
+ variants: {
52
+ size: {
53
+ "xx-small": {
54
+ width: "20px",
55
+ height: "20px",
56
+ border: "1px solid",
57
+ "& svg": {
58
+ width: "10px",
59
+ height: "10px",
60
+ },
61
+ },
62
+ "x-small": {
63
+ width: "20px",
64
+ height: "20px",
65
+ border: "1px solid",
66
+ tablet: {
67
+ height: "26px",
68
+ width: "26px",
69
+ },
70
+ "& svg": {
71
+ width: "10px",
72
+ height: "10px",
73
+ tablet: {
74
+ width: "12px",
75
+ height: "12px",
76
+ },
77
+ },
78
+ },
79
+ small: {
80
+ width: "34px",
81
+ height: "34px",
82
+ },
83
+ large: {
84
+ width: "50px",
85
+ height: "50px",
86
+ "& svg": {
87
+ width: "25px",
88
+ height: "25px",
89
+ },
90
+ },
91
+ },
92
+ border: {
93
+ true: {
94
+ border: "2px solid",
95
+ borderColor: "var(--icon-color)",
96
+ },
97
+ false: {},
98
+ },
99
+ background: {
100
+ true: {
101
+ backgroundColor: "var(--background-color)",
102
+ },
103
+ },
104
+ },
105
+ });
97
106
 
98
107
  const iconMap = {
99
108
  [contentTypes.SUBJECT_MATERIAL]: {
@@ -185,21 +194,12 @@ export const ContentTypeBadge = ({
185
194
  return { Icon: fromMap.icon, style };
186
195
  }, [type]);
187
196
 
188
- const cssStyles = useMemo(() => {
189
- const styles = [sizes[size]];
190
- if (background) {
191
- styles.push(backgroundStyle);
192
- }
193
- if (border) {
194
- styles.push(borderStyle);
195
- }
196
- return styles;
197
- }, [background, border, size]);
198
-
199
197
  return (
200
- <BaseContentTypeBadge
201
- css={cssStyles}
198
+ <StyledContentTypeBadge
202
199
  title={title}
200
+ background={background}
201
+ size={size}
202
+ border={border}
203
203
  style={style}
204
204
  aria-label={title}
205
205
  className={className}
@@ -208,7 +208,7 @@ export const ContentTypeBadge = ({
208
208
  {...rest}
209
209
  >
210
210
  <Icon />
211
- </BaseContentTypeBadge>
211
+ </StyledContentTypeBadge>
212
212
  );
213
213
  };
214
214
 
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Copyright (c) 2024-present, NDLA.
3
+ *
4
+ * This source code is licensed under the GPLv3 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ */
8
+
9
+ import { Meta, StoryFn } from "@storybook/react";
10
+ import { HeroBackground, HeroContent, Text } from "@ndla/primitives";
11
+ import { styled } from "@ndla/styled-system/jsx";
12
+ import { ContentTypeHero } from "./ContentTypeHero";
13
+ import { OneColumn } from "../Layout";
14
+
15
+ /**
16
+ * A thin wrapper around the `Hero` component that automatically assigns a variant based on the provided content type
17
+ */
18
+ export default {
19
+ title: "Components/ContentTypeHero",
20
+ component: ContentTypeHero,
21
+ tags: ["autodocs"],
22
+ parameters: {
23
+ inlineStories: true,
24
+ layout: "fullscreen",
25
+ },
26
+ args: {
27
+ contentType: "audio",
28
+ },
29
+ } as Meta<typeof ContentTypeHero>;
30
+
31
+ export const HeroStory: StoryFn<typeof ContentTypeHero> = ({ ...args }) => (
32
+ <ContentTypeHero {...args}>
33
+ <HeroBackground />
34
+ <OneColumn>
35
+ <HeroContent>Hello</HeroContent>
36
+
37
+ <styled.div css={{ background: "surface.default", padding: "medium" }}>
38
+ <Text>
39
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam ut orci a lectus pellentesque porta. Integer
40
+ tellus nunc, lobortis non enim quis, interdum porttitor orci. Suspendisse sit amet sapien at dolor venenatis
41
+ malesuada ut ac turpis. Quisque bibendum ultrices urna, nec sodales dui feugiat vel. Proin dapibus dolor ut
42
+ metus dignissim euismod. Aliquam erat volutpat. Donec vestibulum lectus a accumsan aliquet. Maecenas suscipit
43
+ urna vel neque viverra, sit amet viverra orci fermentum. Pellentesque ac lacus malesuada, imperdiet nisi et,
44
+ scelerisque nulla. Phasellus commodo justo et purus fermentum, eu vulputate mauris auctor.
45
+ </Text>
46
+ <Text>
47
+ Nunc sodales placerat ex ac accumsan. Phasellus a mollis lorem. Maecenas in dictum nisl, ut auctor massa. Sed
48
+ vitae ipsum eget mi sodales tristique non sed est. Praesent nec hendrerit massa. In egestas venenatis
49
+ pharetra. Vivamus rutrum magna vel elit malesuada imperdiet. Nunc cursus, metus a tempor auctor, ante nunc
50
+ ornare mauris, ut blandit eros lacus ut massa. Ut eu velit at arcu vestibulum commodo. Pellentesque ac quam
51
+ facilisis, scelerisque augue fermentum, commodo magna. Ut mauris est, fermentum sit amet pretium a, tempor
52
+ mattis dolor. In vitae finibus nibh. In sit amet vestibulum quam. Etiam sed venenatis eros. Fusce massa
53
+ tellus, pharetra ut dui a, vulputate suscipit felis. Phasellus id velit at purus tristique lobortis.
54
+ </Text>
55
+ <Text>
56
+ Duis non tempus tortor, non aliquet turpis. Sed aliquet et tellus non viverra. Nam luctus eros orci, porttitor
57
+ sollicitudin neque placerat sed. Quisque laoreet lorem et augue commodo, nec maximus justo dapibus. Nullam
58
+ condimentum ex leo. Morbi rhoncus tortor quis ex volutpat, id aliquam arcu eleifend. Interdum et malesuada
59
+ fames ac ante ipsum primis in faucibus. Pellentesque neque justo, rhoncus a nisi in, pretium dapibus felis. Ut
60
+ convallis est et dui placerat, vitae ultricies eros gravida.
61
+ </Text>
62
+ <Text>
63
+ In metus ex, iaculis ac feugiat eget, dignissim in augue. Proin nec ultricies nisi, id elementum ex. Aenean id
64
+ massa quis turpis cursus vulputate. Nam eget turpis iaculis, molestie libero vel, commodo purus. Phasellus
65
+ luctus ipsum in libero venenatis, quis auctor justo fringilla. Donec vel mauris non justo feugiat sodales in
66
+ in orci. Vestibulum fringilla consequat erat. Interdum et malesuada fames ac ante ipsum primis in faucibus.
67
+ Morbi condimentum, justo a dictum venenatis, ante libero gravida enim, et blandit tellus urna ac purus. Nunc
68
+ sed orci sit amet lorem malesuada tincidunt. Duis non dictum leo. Suspendisse eget dui vel risus dictum
69
+ faucibus ac ut mauris. Fusce facilisis at erat a dignissim.
70
+ </Text>
71
+ </styled.div>
72
+ </OneColumn>
73
+ </ContentTypeHero>
74
+ );
75
+
76
+ HeroStory.storyName = "Hero";
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Copyright (c) 2024-present, NDLA.
3
+ *
4
+ * This source code is licensed under the GPLv3 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ */
8
+
9
+ import { forwardRef } from "react";
10
+ import { Hero, HeroProps, HeroVariant } from "@ndla/primitives";
11
+ import { ContentType } from "../ContentTypeBadge/ContentTypeBadgeNew";
12
+ import * as contentTypes from "../model/ContentType";
13
+
14
+ // TODO: Figure out what to do with frontpage articles. If anything...
15
+ // Also, verify all of these colors.
16
+ export const contentTypeToHeroMap: Record<ContentType, HeroVariant> = {
17
+ [contentTypes.SUBJECT_MATERIAL]: "primary",
18
+ [contentTypes.TASKS_AND_ACTIVITIES]: "brand2Strong",
19
+ [contentTypes.ASSESSMENT_RESOURCES]: "brand2",
20
+ // This will never happen
21
+ [contentTypes.SUBJECT]: "primary",
22
+ [contentTypes.SOURCE_MATERIAL]: "brand1",
23
+ // This will never happen
24
+ [contentTypes.LEARNING_PATH]: "primary",
25
+ // TODO: This needs a color
26
+ [contentTypes.TOPIC]: "neutral",
27
+ // TODO: This is just taken from thin air.
28
+ [contentTypes.MULTIDISCIPLINARY_TOPIC]: "brand4",
29
+ [contentTypes.CONCEPT]: "brand1Subtle",
30
+ // TODO: No clue what this'll be. Maybe unused?
31
+ [contentTypes.EXTERNAL]: "primary",
32
+ [contentTypes.IMAGE]: "primary",
33
+ [contentTypes.AUDIO]: "primary",
34
+ [contentTypes.PODCAST]: "primary",
35
+ [contentTypes.VIDEO]: "primary",
36
+ [contentTypes.MISSING]: "neutral",
37
+ };
38
+
39
+ export interface ContentTypeHeroProps extends HeroProps {
40
+ contentType: ContentType | undefined;
41
+ }
42
+
43
+ export const ContentTypeHero = forwardRef<HTMLDivElement, ContentTypeHeroProps>(
44
+ ({ contentType, children, ...props }, ref) => {
45
+ return (
46
+ <Hero
47
+ variant={contentTypeToHeroMap[contentType ?? "missing"] ?? contentTypeToHeroMap["missing"]}
48
+ {...props}
49
+ ref={ref}
50
+ >
51
+ {children}
52
+ </Hero>
53
+ );
54
+ },
55
+ );
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Copyright (c) 2024-present, NDLA.
3
+ *
4
+ * This source code is licensed under the GPLv3 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ */
8
+
9
+ export { ContentTypeHero } from "./ContentTypeHero";
10
+ export type { ContentTypeHeroProps } from "./ContentTypeHero";
@@ -16,6 +16,12 @@ import { copyTextToClipboard } from "@ndla/util";
16
16
 
17
17
  const ContainerDiv = styled.div`
18
18
  position: relative;
19
+ &:hover {
20
+ [data-copy-button] {
21
+ opacity: 1;
22
+ cursor: pointer;
23
+ }
24
+ }
19
25
  `;
20
26
  const IconButton = styled.button`
21
27
  position: absolute;
@@ -33,8 +39,9 @@ const IconButton = styled.button`
33
39
  height: 30px;
34
40
  }
35
41
 
36
- ${ContainerDiv}:hover &,
37
- &:focus, &:focus-visible, &:active {
42
+ &:focus,
43
+ &:focus-visible,
44
+ &:active {
38
45
  cursor: pointer;
39
46
  opacity: 1;
40
47
  }
@@ -71,7 +78,7 @@ const CopyParagraphButton = ({ children, copyText, lang }: Props) => {
71
78
  return (
72
79
  <ContainerDiv>
73
80
  <Tooltip tooltip={tooltip}>
74
- <IconButton onClick={onCopyClick} aria-label={`${tooltip}: ${copyText}`}>
81
+ <IconButton data-copy-button="" onClick={onCopyClick} aria-label={`${tooltip}: ${copyText}`}>
75
82
  <Link />
76
83
  </IconButton>
77
84
  </Tooltip>
@@ -9,8 +9,8 @@
9
9
  import { Meta, StoryObj } from "@storybook/react";
10
10
  import { AudioEmbedData, AudioMeta } from "@ndla/types-embed";
11
11
  import AudioEmbed from "./AudioEmbed";
12
- import { ArticleWrapper } from "../Article";
13
- import LayoutItem, { OneColumn } from "../Layout";
12
+ import { ArticleContent, ArticleWrapper } from "../Article";
13
+ import { OneColumn } from "../Layout";
14
14
 
15
15
  const embedData: AudioEmbedData = {
16
16
  resource: "audio",
@@ -188,12 +188,10 @@ const meta: Meta<typeof AudioEmbed> = {
188
188
  decorators: [
189
189
  (Story) => (
190
190
  <OneColumn>
191
- <ArticleWrapper modifier="clean">
192
- <LayoutItem layout="center">
193
- <section>
194
- <Story />
195
- </section>
196
- </LayoutItem>
191
+ <ArticleWrapper>
192
+ <ArticleContent>
193
+ <Story />
194
+ </ArticleContent>
197
195
  </ArticleWrapper>
198
196
  </OneColumn>
199
197
  ),
@@ -9,8 +9,8 @@
9
9
  import { Meta, StoryObj } from "@storybook/react";
10
10
  import { BrightcoveData, BrightcoveEmbedData, BrightcoveMetaData } from "@ndla/types-embed";
11
11
  import BrightcoveEmbed from "./BrightcoveEmbed";
12
- import { ArticleWrapper } from "../Article";
13
- import LayoutItem, { OneColumn } from "../Layout";
12
+ import { ArticleContent, ArticleWrapper } from "../Article";
13
+ import { OneColumn } from "../Layout";
14
14
 
15
15
  const embedData: BrightcoveEmbedData = {
16
16
  resource: "brightcove",
@@ -158,12 +158,10 @@ const meta: Meta<typeof BrightcoveEmbed> = {
158
158
  decorators: [
159
159
  (Story) => (
160
160
  <OneColumn>
161
- <ArticleWrapper modifier="clean">
162
- <LayoutItem layout="center">
163
- <section>
164
- <Story />
165
- </section>
166
- </LayoutItem>
161
+ <ArticleWrapper>
162
+ <ArticleContent>
163
+ <Story />
164
+ </ArticleContent>
167
165
  </ArticleWrapper>
168
166
  </OneColumn>
169
167
  ),
@@ -9,8 +9,8 @@
9
9
  import { Meta, StoryObj } from "@storybook/react";
10
10
  import { ConceptData, ConceptEmbedData } from "@ndla/types-embed";
11
11
  import { ConceptEmbed } from "./ConceptEmbed";
12
- import { ArticleWrapper } from "../Article";
13
- import LayoutItem, { OneColumn } from "../Layout";
12
+ import { ArticleContent, ArticleWrapper } from "../Article";
13
+ import { OneColumn } from "../Layout";
14
14
 
15
15
  const blockEmbedData: ConceptEmbedData = {
16
16
  contentId: "35",
@@ -150,12 +150,10 @@ const meta: Meta<typeof ConceptEmbed> = {
150
150
  decorators: [
151
151
  (Story) => (
152
152
  <OneColumn>
153
- <ArticleWrapper modifier="clean">
154
- <LayoutItem layout="center">
155
- <section>
156
- <Story />
157
- </section>
158
- </LayoutItem>
153
+ <ArticleWrapper>
154
+ <ArticleContent>
155
+ <Story />
156
+ </ArticleContent>
159
157
  </ArticleWrapper>
160
158
  </OneColumn>
161
159
  ),
@@ -9,8 +9,8 @@
9
9
  import { Meta, StoryObj } from "@storybook/react";
10
10
  import { OembedEmbedData, OembedData } from "@ndla/types-embed";
11
11
  import ExternalEmbed from "./ExternalEmbed";
12
- import { ArticleWrapper } from "../Article";
13
- import LayoutItem, { OneColumn } from "../Layout";
12
+ import { ArticleWrapper, ArticleContent } from "../Article";
13
+ import { OneColumn } from "../Layout";
14
14
 
15
15
  const embedData: OembedEmbedData = {
16
16
  resource: "external",
@@ -56,12 +56,12 @@ const meta: Meta<typeof ExternalEmbed> = {
56
56
  decorators: [
57
57
  (Story) => (
58
58
  <OneColumn>
59
- <ArticleWrapper modifier="clean">
60
- <LayoutItem layout="center">
59
+ <ArticleWrapper>
60
+ <ArticleContent>
61
61
  <section>
62
62
  <Story />
63
63
  </section>
64
- </LayoutItem>
64
+ </ArticleContent>
65
65
  </ArticleWrapper>
66
66
  </OneColumn>
67
67
  ),
@@ -9,8 +9,8 @@
9
9
  import { Meta, StoryObj } from "@storybook/react";
10
10
  import { H5pEmbedData, H5pData } from "@ndla/types-embed";
11
11
  import H5pEmbed from "./H5pEmbed";
12
- import { ArticleWrapper } from "../Article";
13
- import LayoutItem, { OneColumn } from "../Layout";
12
+ import { ArticleWrapper, ArticleContent } from "../Article";
13
+ import { OneColumn } from "../Layout";
14
14
 
15
15
  const embedData: H5pEmbedData = {
16
16
  resource: "h5p",
@@ -53,12 +53,10 @@ const meta: Meta<typeof H5pEmbed> = {
53
53
  decorators: [
54
54
  (Story) => (
55
55
  <OneColumn>
56
- <ArticleWrapper modifier="clean">
57
- <LayoutItem layout="center">
58
- <section>
59
- <Story />
60
- </section>
61
- </LayoutItem>
56
+ <ArticleWrapper>
57
+ <ArticleContent>
58
+ <Story />
59
+ </ArticleContent>
62
60
  </ArticleWrapper>
63
61
  </OneColumn>
64
62
  ),
@@ -9,8 +9,8 @@
9
9
  import { Meta, StoryObj } from "@storybook/react";
10
10
  import { IframeData, IframeEmbedData } from "@ndla/types-embed";
11
11
  import IframeEmbed from "./IframeEmbed";
12
- import { ArticleWrapper } from "../Article";
13
- import LayoutItem, { OneColumn } from "../Layout";
12
+ import { ArticleWrapper, ArticleContent } from "../Article";
13
+ import { OneColumn } from "../Layout";
14
14
 
15
15
  const embedData: IframeEmbedData = {
16
16
  width: "708px",
@@ -28,12 +28,10 @@ const meta: Meta<typeof IframeEmbed> = {
28
28
  decorators: [
29
29
  (Story) => (
30
30
  <OneColumn>
31
- <ArticleWrapper modifier="clean">
32
- <LayoutItem layout="center">
33
- <section>
34
- <Story />
35
- </section>
36
- </LayoutItem>
31
+ <ArticleWrapper>
32
+ <ArticleContent>
33
+ <Story />
34
+ </ArticleContent>
37
35
  </ArticleWrapper>
38
36
  </OneColumn>
39
37
  ),
@@ -14,9 +14,9 @@ import { styled } from "@ndla/styled-system/jsx";
14
14
  import { IImageMetaInformationV3 } from "@ndla/types-backend/image-api";
15
15
  import { ImageEmbedData } from "@ndla/types-embed";
16
16
  import ImageEmbed from "./ImageEmbed";
17
- import { ArticleWrapper } from "../Article";
17
+ import { ArticleWrapper, ArticleContent } from "../Article";
18
18
  import { Grid } from "../Grid";
19
- import LayoutItem, { OneColumn } from "../Layout";
19
+ import { OneColumn } from "../Layout";
20
20
 
21
21
  const embedData: ImageEmbedData = {
22
22
  resource: "image",
@@ -98,12 +98,10 @@ const meta: Meta<typeof ImageEmbed> = {
98
98
  decorators: [
99
99
  (Story) => (
100
100
  <OneColumn>
101
- <ArticleWrapper modifier="clean">
102
- <LayoutItem layout="center">
103
- <section>
104
- <Story />
105
- </section>
106
- </LayoutItem>
101
+ <ArticleWrapper>
102
+ <ArticleContent>
103
+ <Story />
104
+ </ArticleContent>
107
105
  </ArticleWrapper>
108
106
  </OneColumn>
109
107
  ),
@@ -9,8 +9,8 @@
9
9
  import { Meta, StoryObj } from "@storybook/react";
10
10
  import { RelatedContentMetaData } from "@ndla/types-embed";
11
11
  import RelatedContentEmbed from "./RelatedContentEmbed";
12
- import { ArticleWrapper } from "../Article";
13
- import LayoutItem, { OneColumn } from "../Layout";
12
+ import { ArticleWrapper, ArticleContent } from "../Article";
13
+ import { OneColumn } from "../Layout";
14
14
  import RelatedArticleList from "../RelatedArticleList";
15
15
 
16
16
  const filmResourceMeta: RelatedContentMetaData = {
@@ -368,12 +368,10 @@ const meta: Meta<typeof RelatedContentEmbed> = {
368
368
  decorators: [
369
369
  (Story) => (
370
370
  <OneColumn>
371
- <ArticleWrapper modifier="clean">
372
- <LayoutItem layout="center">
373
- <section>
374
- <Story />
375
- </section>
376
- </LayoutItem>
371
+ <ArticleWrapper>
372
+ <ArticleContent>
373
+ <Story />
374
+ </ArticleContent>
377
375
  </ArticleWrapper>
378
376
  </OneColumn>
379
377
  ),
@@ -12,10 +12,10 @@ import { UuDisclaimerEmbedData } from "@ndla/types-embed";
12
12
  import H5pEmbed from "./H5pEmbed";
13
13
  import IframeEmbed from "./IframeEmbed";
14
14
  import UuDisclaimerEmbed from "./UuDisclaimerEmbed";
15
- import { ArticleWrapper } from "../Article";
15
+ import { ArticleWrapper, ArticleContent } from "../Article";
16
16
  import CopyParagraphButton from "../CopyParagraphButton";
17
17
  import FactBox from "../FactBox";
18
- import LayoutItem, { OneColumn } from "../Layout";
18
+ import { OneColumn } from "../Layout";
19
19
 
20
20
  const embedData: UuDisclaimerEmbedData = {
21
21
  resource: "uu-disclaimer",
@@ -30,12 +30,10 @@ const meta: Meta<typeof UuDisclaimerEmbed> = {
30
30
  decorators: [
31
31
  (Story) => (
32
32
  <OneColumn>
33
- <ArticleWrapper modifier="clean">
34
- <LayoutItem layout="center">
35
- <section>
36
- <Story />
37
- </section>
38
- </LayoutItem>
33
+ <ArticleWrapper>
34
+ <ArticleContent>
35
+ <Story />
36
+ </ArticleContent>
39
37
  </ArticleWrapper>
40
38
  </OneColumn>
41
39
  ),