@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ndla/ui",
3
- "version": "55.0.16-alpha.0",
3
+ "version": "55.0.17-alpha.0",
4
4
  "description": "UI component library for NDLA",
5
5
  "license": "GPL-3.0",
6
6
  "main": "lib/index.js",
@@ -33,16 +33,16 @@
33
33
  "types"
34
34
  ],
35
35
  "dependencies": {
36
- "@ndla/button": "^14.0.7-alpha.0",
36
+ "@ndla/button": "^14.0.8-alpha.0",
37
37
  "@ndla/core": "^5.0.1",
38
38
  "@ndla/dropdown-menu": "^1.0.38",
39
- "@ndla/forms": "^9.0.8-alpha.0",
39
+ "@ndla/forms": "^9.0.9-alpha.0",
40
40
  "@ndla/hooks": "^2.1.8",
41
- "@ndla/icons": "^7.0.8-alpha.0",
41
+ "@ndla/icons": "^7.0.9-alpha.0",
42
42
  "@ndla/licenses": "^8.0.0-alpha.0",
43
- "@ndla/modal": "^7.0.7-alpha.0",
44
- "@ndla/primitives": "^0.0.19",
45
- "@ndla/safelink": "^6.0.2-alpha.0",
43
+ "@ndla/modal": "^7.0.8-alpha.0",
44
+ "@ndla/primitives": "^0.0.20",
45
+ "@ndla/safelink": "^6.0.3-alpha.0",
46
46
  "@ndla/styled-system": "^0.0.8",
47
47
  "@ndla/tooltip": "^8.0.1",
48
48
  "@ndla/typography": "^0.4.23",
@@ -65,9 +65,9 @@
65
65
  "react-router-dom": "> 6.0.0"
66
66
  },
67
67
  "devDependencies": {
68
- "@ndla/preset-panda": "^0.0.11",
68
+ "@ndla/preset-panda": "^0.0.12",
69
69
  "@ndla/types-backend": "^0.2.86",
70
- "@ndla/types-embed": "^4.1.8",
70
+ "@ndla/types-embed": "^5.0.0-alpha.0",
71
71
  "@pandacss/dev": "^0.42.0",
72
72
  "css-loader": "^6.7.3",
73
73
  "mini-css-extract-plugin": "^2.7.5",
@@ -78,5 +78,5 @@
78
78
  "publishConfig": {
79
79
  "access": "public"
80
80
  },
81
- "gitHead": "b05b7016560891b2867811c4420041e6932003cc"
81
+ "gitHead": "557f718324916e39e3b04d6a7196679d31056e00"
82
82
  }
@@ -6,226 +6,102 @@
6
6
  *
7
7
  */
8
8
 
9
- /** @jsxImportSource @emotion/react */
10
- import { ReactNode, forwardRef, ComponentPropsWithRef, useMemo, CSSProperties } from "react";
11
- import { SerializedStyles, css } from "@emotion/react";
12
- import styled from "@emotion/styled";
13
-
14
- import { spacing, mq, breakpoints, fonts, colors, spacingUnit } from "@ndla/core";
15
- import { Heading, Text } from "@ndla/typography";
9
+ import { ReactNode } from "react";
10
+ import { Heading, Text } from "@ndla/primitives";
11
+ import { styled } from "@ndla/styled-system/jsx";
16
12
  import ArticleByline from "./ArticleByline";
17
- import ArticleHeaderWrapper from "./ArticleHeaderWrapper";
18
- import LayoutItem from "../Layout";
19
- import MessageBox from "../Messages/MessageBox";
13
+ import { ContentTypeBadgeNew } from "..";
14
+ import { ContentType } from "../ContentTypeBadge/ContentTypeBadgeNew";
20
15
  import { Article as ArticleType } from "../types";
21
16
 
22
- export type ArticleModifier =
23
- | "clean"
24
- | "in-topic"
25
- | "subject-material"
26
- | "assessment-resources"
27
- | "tasks-and-activities"
28
- | "concept"
29
- | "source-material";
30
-
31
- interface ArticleWrapperProps extends ComponentPropsWithRef<"article"> {
32
- modifier?: ArticleModifier;
33
- }
34
-
35
- const StyledArticle = styled.article`
36
- font-family: ${fonts.serif};
37
- background: ${colors.white};
38
- margin-top: ${spacing.large};
39
- margin-right: auto;
40
- margin-bottom: ${spacing.normal};
41
- margin-left: auto;
42
- overflow-wrap: break-word;
43
- ${fonts.sizes("18px", "29px")};
44
- position: relative;
45
-
46
- mjx-stretchy-v > mjx-ext > mjx-c {
47
- transform: scaleY(100) translateY(0.075em);
48
- }
49
-
50
- > section > p {
51
- &:not([class]) {
52
- margin-bottom: 29px;
53
- }
54
- }
55
-
56
- ${mq.range({ from: breakpoints.tablet })} {
57
- ${fonts.sizes("18px", "29px")}; //This is probably not needed, but it's here to be sure.
58
-
59
- > section > p {
60
- &:not([class]) {
61
- margin-bottom: 35px;
62
- }
63
- }
64
- padding: 0 ${spacing.normal} ${spacing.normal};
65
- margin-bottom: ${spacing.large};
66
- margin-top: -${spacingUnit * 6}px;
67
- padding-top: ${spacing.xlarge};
68
- }
69
- ${mq.range({ from: breakpoints.desktop })} {
70
- padding-bottom: ${spacing.large};
71
- margin-bottom: ${spacing.large};
72
- }
73
-
74
- &::after {
75
- content: "";
76
- display: table;
77
- clear: both;
78
- }
79
-
80
- p {
81
- margin-top: 0;
82
- }
83
- `;
84
-
85
- // Make sure to wrap modifiers in & {} to avoid specificity issues
86
- const articleModifiers: Partial<Record<ArticleModifier, SerializedStyles>> = {
87
- clean: css`
88
- & {
89
- margin-top: ${spacing.normal} !important;
90
- padding: ${spacing.small} !important;
91
- ${mq.range({ from: breakpoints.tablet })} {
92
- padding: 0 !important;
93
- }
94
- border: none;
95
- }
96
- `,
97
- "in-topic": css`
98
- & {
99
- margin-top: 0 !important;
100
- padding: 0 !important;
101
- padding-left: ${spacing.medium} !important;
102
- }
103
- `,
104
- };
105
-
106
- const borderCss = css`
107
- ${mq.range({ from: breakpoints.tablet })} {
108
- border: 2px solid var(--color);
109
- }
110
- `;
111
-
112
- export const ArticleWrapper = forwardRef<HTMLElement, ArticleWrapperProps>(({ children, modifier, ...rest }, ref) => {
113
- const borderColor = useMemo(() => {
114
- let color = undefined;
115
- if (modifier === "subject-material") {
116
- color = colors.subjectMaterial.light;
117
- } else if (modifier === "assessment-resources") {
118
- color = colors.assessmentResource.background;
119
- } else if (modifier === "tasks-and-activities") {
120
- color = colors.tasksAndActivities.background;
121
- } else if (modifier === "concept") {
122
- color = colors.concept.light;
123
- } else if (modifier === "source-material") {
124
- color = colors.sourceMaterial.light;
125
- }
126
- if (color) {
127
- return { "--color": color } as CSSProperties;
128
- }
129
- return undefined;
130
- }, [modifier]);
131
-
132
- return (
133
- <StyledArticle
134
- css={[borderColor ? borderCss : undefined, modifier ? articleModifiers[modifier] : undefined]}
135
- style={borderColor}
136
- {...rest}
137
- ref={ref}
138
- >
139
- {children}
140
- </StyledArticle>
141
- );
17
+ export const ArticleContent = styled("section", {
18
+ base: {
19
+ width: "100%",
20
+ },
142
21
  });
143
22
 
144
- type ArticleTitleProps = {
145
- icon?: ReactNode;
146
- label?: string;
147
- children: ReactNode;
148
- id: string;
149
- lang?: string;
150
- };
151
-
152
- const TitleLabelText = styled(Text)`
153
- color: #757575;
154
- text-transform: uppercase;
155
- font-family: ${fonts.sans};
156
- `;
157
-
158
- const ArticleTitleWrapper = styled.div`
159
- display: flex;
160
- gap: ${spacing.normal};
161
- align-items: flex-start;
162
- h1 {
163
- overflow-wrap: anywhere;
164
- }
165
- padding-bottom: ${spacing.medium};
166
- [data-badge] {
167
- flex-shrink: 0;
168
- }
169
- `;
170
-
171
- export const ArticleTitle = ({ children, icon, label, id, lang }: ArticleTitleProps) => (
172
- <ArticleTitleWrapper>
173
- {icon}
174
- <hgroup>
175
- {!!label && (
176
- <TitleLabelText textStyle="meta-text-medium" margin="none">
177
- {label}
178
- </TitleLabelText>
179
- )}
180
- <Heading element="h1" margin="none" headingStyle="h1-resource" id={id} tabIndex={-1} lang={lang}>
181
- {children}
182
- </Heading>
183
- </hgroup>
184
- </ArticleTitleWrapper>
185
- );
23
+ export const ArticleWrapper = styled("article", {
24
+ base: {
25
+ display: "flex",
26
+ flexDirection: "column",
27
+ color: "text.default",
28
+ gap: "xxlarge",
29
+ background: "surface.default",
30
+ paddingBlock: "xsmall",
31
+ paddingInline: "8%",
32
+ alignItems: "center",
33
+ width: "100%",
34
+ overflowWrap: "break-word",
35
+ position: "relative",
36
+ tablet: {
37
+ paddingBlock: "medium",
38
+ },
39
+ desktop: {
40
+ paddingBlock: "xxlarge",
41
+ },
42
+ "& mjx-stretchy-v > mjx-ext > mjx-c": {
43
+ transform: "scaleY(100) translateY(0.075em)",
44
+ },
45
+ _after: {
46
+ content: "",
47
+ display: "table",
48
+ clear: "both",
49
+ },
50
+ },
51
+ });
186
52
 
187
- type ArticleIntroductionProps = {
188
- children: ReactNode;
189
- lang?: string;
190
- };
53
+ const ArticleTitleWrapper = styled("hgroup", {
54
+ base: {
55
+ display: "flex",
56
+ width: "100%",
57
+ flexDirection: "column",
58
+ alignItems: "flex-start",
59
+ gap: "xsmall",
60
+ "& h1": {
61
+ overflowWrap: "anywhere",
62
+ },
63
+ },
64
+ });
191
65
 
192
- export const ArticleIntroduction = ({ children, lang }: ArticleIntroductionProps) => {
193
- if (children) {
194
- return (
195
- <Text textStyle="ingress" element="div" lang={lang}>
196
- {children}
197
- </Text>
198
- );
199
- }
200
- return null;
201
- };
66
+ const ArticleFavoritesButtonWrapper = styled("div", {
67
+ base: {
68
+ position: "absolute",
69
+ right: "8%",
70
+ top: "xsmall",
71
+ tablet: {
72
+ top: "medium",
73
+ },
74
+ desktop: {
75
+ top: "xxlarge",
76
+ },
77
+ },
78
+ });
202
79
 
203
- type Messages = {
204
- label: string;
205
- messageBox?: string;
206
- };
207
- const MSGboxWrapper = styled.div`
208
- margin-bottom: 50px;
209
- `;
80
+ export const ArticleHeader = styled("header", {
81
+ base: {
82
+ display: "flex",
83
+ flexDirection: "column",
84
+ gap: "medium",
85
+ alignItems: "flex-start",
86
+ width: "100%",
87
+ },
88
+ });
210
89
 
211
- const ArticleFavoritesButtonWrapper = styled.div`
212
- display: flex;
213
- justify-content: flex-end;
214
- transform: translate(${spacing.xsmall}, -${spacing.normal});
215
- ${mq.range({ from: breakpoints.tablet })} {
216
- transform: translate(${spacing.normal}, -${spacing.medium});
217
- }
218
- `;
90
+ export const ArticleFooter = styled("footer", {
91
+ base: {
92
+ display: "flex",
93
+ flexDirection: "column",
94
+ gap: "xxlarge",
95
+ width: "100%",
96
+ },
97
+ });
219
98
 
220
99
  type Props = {
221
100
  heartButton?: ReactNode;
222
101
  article: ArticleType;
223
- icon?: ReactNode;
224
102
  licenseBox?: ReactNode;
225
- modifier?: ArticleModifier;
103
+ contentType?: ContentType;
226
104
  children?: ReactNode;
227
- messages: Messages;
228
- messageBoxLinks?: [];
229
105
  competenceGoals?: ReactNode;
230
106
  id: string;
231
107
  lang?: string;
@@ -233,11 +109,8 @@ type Props = {
233
109
 
234
110
  export const Article = ({
235
111
  article,
236
- icon,
112
+ contentType,
237
113
  licenseBox,
238
- modifier,
239
- messages,
240
- messageBoxLinks,
241
114
  children,
242
115
  competenceGoals,
243
116
  id,
@@ -250,23 +123,24 @@ export const Article = ({
250
123
  copyright?.creators.length || copyright?.rightsholders.length ? copyright.creators : copyright?.processors;
251
124
 
252
125
  return (
253
- <ArticleWrapper modifier={modifier} data-ndla-article="">
254
- <LayoutItem layout="center">
255
- {messages.messageBox && (
256
- <MSGboxWrapper>
257
- <MessageBox links={messageBoxLinks}>{messages.messageBox}</MessageBox>
258
- </MSGboxWrapper>
259
- )}
260
- <ArticleHeaderWrapper competenceGoals={competenceGoals}>
261
- {heartButton ? <ArticleFavoritesButtonWrapper>{heartButton}</ArticleFavoritesButtonWrapper> : null}
262
- <ArticleTitle id={id} icon={icon} label={messages.label} lang={lang}>
126
+ <ArticleWrapper data-ndla-article="">
127
+ <ArticleHeader>
128
+ <ArticleTitleWrapper>
129
+ {!!contentType && <ContentTypeBadgeNew contentType={contentType} />}
130
+ {!!heartButton && <ArticleFavoritesButtonWrapper>{heartButton}</ArticleFavoritesButtonWrapper>}
131
+ <Heading textStyle="heading.large" id={id} tabIndex={-1} lang={lang}>
263
132
  {title}
264
- </ArticleTitle>
265
- <ArticleIntroduction lang={lang}>{introduction}</ArticleIntroduction>
266
- </ArticleHeaderWrapper>
267
- </LayoutItem>
268
- <LayoutItem layout="center">{content}</LayoutItem>
269
- <LayoutItem layout="center">
133
+ </Heading>
134
+ </ArticleTitleWrapper>
135
+ {!!introduction && (
136
+ <Text lang={lang} textStyle="body.xlarge" asChild consumeCss>
137
+ <div>{introduction}</div>
138
+ </Text>
139
+ )}
140
+ {competenceGoals}
141
+ </ArticleHeader>
142
+ <ArticleContent>{content}</ArticleContent>
143
+ <ArticleFooter>
270
144
  <ArticleByline
271
145
  footnotes={footNotes}
272
146
  authors={authors}
@@ -275,10 +149,8 @@ export const Article = ({
275
149
  license={copyright?.license?.license ?? ""}
276
150
  licenseBox={licenseBox}
277
151
  />
278
- </LayoutItem>
279
- <LayoutItem layout="extend">{children}</LayoutItem>
152
+ {children}
153
+ </ArticleFooter>
280
154
  </ArticleWrapper>
281
155
  );
282
156
  };
283
-
284
- export default Article;
@@ -6,14 +6,10 @@
6
6
  *
7
7
  */
8
8
 
9
- import Article, { ArticleTitle, ArticleIntroduction, ArticleWrapper } from "./Article";
10
9
  import ArticleByline from "./ArticleByline";
11
10
  import ArticleFootNotes from "./ArticleFootNotes";
12
- import ArticleHeaderWrapper from "./ArticleHeaderWrapper";
13
11
 
14
- export { ArticleByline, ArticleFootNotes, ArticleHeaderWrapper, ArticleTitle, ArticleIntroduction, ArticleWrapper };
15
- export { ArticleParagraph } from "./ArticleParagraph";
16
-
17
- export type { ArticleModifier } from "./Article";
12
+ export { Article, ArticleContent, ArticleWrapper, ArticleHeader, ArticleFooter } from "./Article";
18
13
 
19
- export default Article;
14
+ export { ArticleByline, ArticleFootNotes };
15
+ export { ArticleParagraph } from "./ArticleParagraph";
@@ -6,9 +6,9 @@
6
6
  *
7
7
  */
8
8
 
9
- import { ReactNode, useRef } from "react";
9
+ import { ReactNode } from "react";
10
10
  import { useTranslation } from "react-i18next";
11
- import styled from "@emotion/styled";
11
+ import { styled } from "@ndla/styled-system/jsx";
12
12
  import BreadcrumbItem, { IndexedBreadcrumbItem, SimpleBreadcrumbItem } from "./BreadcrumbItem";
13
13
 
14
14
  interface Props {
@@ -19,26 +19,28 @@ interface Props {
19
19
  renderSeparator?: (item: IndexedBreadcrumbItem, totalCount: number) => ReactNode;
20
20
  }
21
21
 
22
- const BreadcrumbNav = styled.nav``;
23
-
24
- const StyledList = styled.ol`
25
- display: inline-block;
26
- padding-left: 0;
27
- margin-bottom: 0;
28
- margin-top: 0;
29
- list-style: none;
30
- `;
22
+ const StyledList = styled("ol", {
23
+ base: {
24
+ display: "flex",
25
+ flexWrap: "wrap",
26
+ alignItems: "center",
27
+ listStyle: "none",
28
+ gap: "xsmall",
29
+ mobileDown: {
30
+ alignItems: "flex-start",
31
+ justifyContent: "center",
32
+ flexDirection: "column",
33
+ gap: "xxsmall",
34
+ },
35
+ },
36
+ });
31
37
 
32
38
  const Breadcrumb = ({ items, renderItem, renderSeparator, collapseFirst, collapseLast = true }: Props) => {
33
39
  const { t } = useTranslation();
34
- const olRef = useRef<any>();
35
- const containerRef = useRef<HTMLDivElement>(null);
36
- // No idiomatic way of dealing with sets of refs yet
37
- // See: https://github.com/facebook/react/issues/14072#issuecomment-446777406
38
40
 
39
41
  return (
40
- <BreadcrumbNav ref={containerRef} aria-label={t("breadcrumb.breadcrumb")}>
41
- <StyledList ref={olRef}>
42
+ <nav aria-label={t("breadcrumb.breadcrumb")}>
43
+ <StyledList>
42
44
  {items.map((item, index) => (
43
45
  <BreadcrumbItem
44
46
  renderItem={renderItem}
@@ -60,7 +62,7 @@ const Breadcrumb = ({ items, renderItem, renderSeparator, collapseFirst, collaps
60
62
  />
61
63
  ))}
62
64
  </StyledList>
63
- </BreadcrumbNav>
65
+ </nav>
64
66
  );
65
67
  };
66
68
 
@@ -7,10 +7,9 @@
7
7
  */
8
8
 
9
9
  import { useRef, useImperativeHandle, ReactNode, forwardRef } from "react";
10
- import styled from "@emotion/styled";
11
- import { mq, spacing, breakpoints } from "@ndla/core";
12
10
  import { ChevronRight } from "@ndla/icons/common";
13
11
  import { SafeLink } from "@ndla/safelink";
12
+ import { styled } from "@ndla/styled-system/jsx";
14
13
 
15
14
  export interface SimpleBreadcrumbItem {
16
15
  to: string | Partial<Location>;
@@ -26,35 +25,17 @@ export interface BreadcrumbRenderProps {
26
25
  totalCount: number;
27
26
  }
28
27
 
29
- interface AutoCollapseProps {
30
- autoCollapse?: boolean;
31
- }
32
-
33
- const StyledListItem = styled.li<AutoCollapseProps>`
34
- padding: 0;
35
- display: inline-flex;
36
- align-items: center;
37
- :before {
38
- display: none;
39
- }
40
- ${mq.range({ until: breakpoints.tablet })} {
41
- display: block;
42
- }
43
- `;
44
-
45
- const CollapseContainer = styled.div`
46
- display: inline-block;
47
- color: inherit;
48
- `;
49
-
50
- const StyledChevron = styled(ChevronRight)`
51
- margin: ${spacing.xxsmall};
52
- color: inherit;
53
- `;
54
-
55
- const StyledSafeLink = styled(SafeLink)`
56
- color: inherit;
57
- `;
28
+ const StyledListItem = styled("li", {
29
+ base: {
30
+ display: "flex",
31
+ color: "inherit",
32
+ gap: "4xsmall",
33
+ alignItems: "flex-end",
34
+ tabletDown: {
35
+ display: "block",
36
+ },
37
+ },
38
+ });
58
39
 
59
40
  interface Props {
60
41
  item: IndexedBreadcrumbItem;
@@ -64,35 +45,31 @@ interface Props {
64
45
  renderSeparator?: (item: IndexedBreadcrumbItem, totalCount: number) => ReactNode;
65
46
  }
66
47
 
67
- const BreadcrumbItem = forwardRef<any, Props>(
68
- ({ renderItem, renderSeparator, item, totalCount, autoCollapse }, ref) => {
69
- const liRef = useRef<any>();
48
+ const BreadcrumbItem = forwardRef<any, Props>(({ renderItem, renderSeparator, item, totalCount }, ref) => {
49
+ const liRef = useRef<any>();
70
50
 
71
- useImperativeHandle(ref, () => ({
72
- setMaxWidth: (maxWidth: number) => {
73
- liRef.current.children[0].style.maxWidth = maxWidth;
74
- },
75
- }));
51
+ useImperativeHandle(ref, () => ({
52
+ setMaxWidth: (maxWidth: number) => {
53
+ liRef.current.children[0].style.maxWidth = maxWidth;
54
+ },
55
+ }));
76
56
 
77
- const { to, name, index } = item;
78
- const isLast = index === totalCount - 1;
79
- return (
80
- <StyledListItem ref={liRef} autoCollapse={autoCollapse} aria-current={isLast ? "page" : undefined}>
81
- <CollapseContainer>
82
- {renderItem ? (
83
- renderItem(item, totalCount)
84
- ) : isLast ? (
85
- <span>{name}</span>
86
- ) : (
87
- <StyledSafeLink to={to}>
88
- <span>{name}</span>
89
- </StyledSafeLink>
90
- )}
91
- </CollapseContainer>
92
- {renderSeparator ? renderSeparator(item, totalCount) : !isLast && <StyledChevron />}
93
- </StyledListItem>
94
- );
95
- },
96
- );
57
+ const { to, name, index } = item;
58
+ const isLast = index === totalCount - 1;
59
+ return (
60
+ <StyledListItem ref={liRef} aria-current={isLast ? "page" : undefined}>
61
+ {renderItem ? (
62
+ renderItem(item, totalCount)
63
+ ) : isLast ? (
64
+ <span>{name}</span>
65
+ ) : (
66
+ <SafeLink to={to}>
67
+ <span>{name}</span>
68
+ </SafeLink>
69
+ )}
70
+ {renderSeparator ? renderSeparator(item, totalCount) : !isLast && <ChevronRight />}
71
+ </StyledListItem>
72
+ );
73
+ });
97
74
 
98
75
  export default BreadcrumbItem;
@@ -7,7 +7,6 @@
7
7
  */
8
8
 
9
9
  import { Meta, StoryObj } from "@storybook/react";
10
- import { colors } from "@ndla/core";
11
10
  import HomeBreadcrumb from "./HomeBreadcrumb";
12
11
 
13
12
  const items = [
@@ -42,14 +41,3 @@ export default {
42
41
  } as Meta<typeof HomeBreadcrumb>;
43
42
 
44
43
  export const Default: StoryObj<typeof HomeBreadcrumb> = {};
45
-
46
- export const Light: StoryObj<typeof HomeBreadcrumb> = {
47
- args: { light: true },
48
- decorators: [
49
- (Story) => (
50
- <div style={{ backgroundColor: colors.brand.primary }}>
51
- <Story />
52
- </div>
53
- ),
54
- ],
55
- };