@ndla/ui 55.0.15-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 (324) hide show
  1. package/dist/panda.buildinfo.json +125 -29
  2. package/dist/styles.css +453 -103
  3. package/es/Article/Article.js +101 -162
  4. package/es/Article/ArticleByline.js +89 -56
  5. package/es/Article/ArticleFootNotes.js +35 -23
  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 +3 -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 +7 -8
  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 -12
  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/model/ContentType.js +3 -1
  86. package/es/styles.css +453 -103
  87. package/lib/Article/Article.d.ts +9 -30
  88. package/lib/Article/Article.js +104 -164
  89. package/lib/Article/ArticleByline.d.ts +1 -3
  90. package/lib/Article/ArticleByline.js +89 -56
  91. package/lib/Article/ArticleFootNotes.js +35 -24
  92. package/lib/Article/ArticleParagraph.js +2 -2
  93. package/lib/Article/index.d.ts +2 -5
  94. package/lib/Article/index.js +18 -24
  95. package/lib/AudioPlayer/AudioPlayer.js +20 -20
  96. package/lib/AudioPlayer/Controls.js +45 -45
  97. package/lib/AudioPlayer/SpeechControl.js +8 -8
  98. package/lib/BlogPost/BlogPost.js +6 -6
  99. package/lib/Breadcrumb/Breadcrumb.js +21 -29
  100. package/lib/Breadcrumb/BreadcrumbItem.js +22 -50
  101. package/lib/Breadcrumb/HomeBreadcrumb.d.ts +1 -2
  102. package/lib/Breadcrumb/HomeBreadcrumb.js +38 -82
  103. package/lib/CampaignBlock/CampaignBlock.js +12 -12
  104. package/lib/CodeBlock/CodeBlock.js +2 -2
  105. package/lib/Concept/Concept.js +11 -11
  106. package/lib/ContactBlock/ContactBlock.d.ts +6 -7
  107. package/lib/ContactBlock/ContactBlock.js +173 -184
  108. package/lib/ContactBlock/index.d.ts +3 -3
  109. package/lib/ContactBlock/index.js +13 -11
  110. package/lib/ContentLoader/index.js +12 -12
  111. package/lib/ContentPlaceholder/ContentPlaceholder.js +3 -3
  112. package/lib/ContentTypeBadge/ContentTypeBadge.d.ts +11 -12
  113. package/lib/ContentTypeBadge/ContentTypeBadge.js +83 -80
  114. package/lib/ContentTypeBadge/ContentTypeBadgeNew.d.ts +1 -2
  115. package/lib/ContentTypeBadge/ContentTypeBadgeNew.js +3 -2
  116. package/lib/ContentTypeHero/ContentTypeHero.d.ts +15 -0
  117. package/lib/ContentTypeHero/ContentTypeHero.js +57 -0
  118. package/lib/ContentTypeHero/index.d.ts +9 -0
  119. package/lib/ContentTypeHero/index.js +12 -0
  120. package/lib/CopyParagraphButton/CopyParagraphButton.js +13 -12
  121. package/lib/Embed/AudioEmbed.js +7 -7
  122. package/lib/Embed/BrightcoveEmbed.js +8 -8
  123. package/lib/Embed/CodeEmbed.js +6 -6
  124. package/lib/Embed/ConceptEmbed.js +13 -13
  125. package/lib/Embed/ConceptListEmbed.js +9 -9
  126. package/lib/Embed/ContentLinkEmbed.js +6 -6
  127. package/lib/Embed/CopyrightEmbed.js +3 -3
  128. package/lib/Embed/EmbedErrorPlaceholder.js +5 -5
  129. package/lib/Embed/ExternalEmbed.js +5 -5
  130. package/lib/Embed/FootnoteEmbed.js +5 -5
  131. package/lib/Embed/GlossEmbed.js +11 -11
  132. package/lib/Embed/H5pEmbed.js +5 -5
  133. package/lib/Embed/IframeEmbed.js +6 -6
  134. package/lib/Embed/ImageEmbed.js +10 -10
  135. package/lib/Embed/InlineTriggerButton.js +2 -2
  136. package/lib/Embed/RelatedContentEmbed.js +5 -5
  137. package/lib/Embed/UnknownEmbed.js +3 -3
  138. package/lib/Embed/UuDisclaimerEmbed.js +6 -6
  139. package/lib/ErrorMessage/ErrorMessage.js +14 -14
  140. package/lib/ErrorMessage/ErrorResourceAccessDenied.js +6 -6
  141. package/lib/FactBox/FactBox.js +5 -5
  142. package/lib/FileList/File.js +3 -3
  143. package/lib/FileList/FileList.js +6 -6
  144. package/lib/FileList/Format.js +6 -6
  145. package/lib/FileList/PdfFile.js +5 -5
  146. package/lib/FrontpageArticle/FrontpageArticle.js +7 -8
  147. package/lib/Gloss/Gloss.js +23 -23
  148. package/lib/Gloss/GlossExample.js +9 -9
  149. package/lib/Grid/Grid.js +4 -4
  150. package/lib/KeyFigure/KeyFigure.js +5 -5
  151. package/lib/Layout/LayoutItem.d.ts +3 -7
  152. package/lib/Layout/LayoutItem.js +27 -38
  153. package/lib/Layout/OneColumn.d.ts +3 -6
  154. package/lib/Layout/OneColumn.js +36 -33
  155. package/lib/Layout/PageContainer.d.ts +3 -6
  156. package/lib/Layout/PageContainer.js +24 -32
  157. package/lib/LicenseByline/EmbedByline.js +21 -21
  158. package/lib/LicenseByline/LicenseLink.js +3 -3
  159. package/lib/LinkBlock/LinkBlock.js +8 -8
  160. package/lib/LinkBlock/LinkBlockSection.js +4 -4
  161. package/lib/Messages/MessageBox.js +11 -11
  162. package/lib/Messages/index.d.ts +1 -2
  163. package/lib/Messages/index.js +0 -7
  164. package/lib/ProgrammeCard/ProgrammeCard.js +5 -5
  165. package/lib/RelatedArticleList/RelatedArticleList.js +15 -15
  166. package/lib/ResourceBox/ResourceBox.js +9 -9
  167. package/lib/SnackBar/DefaultSnackbar.js +5 -5
  168. package/lib/SnackBar/SnackbarProvider.js +7 -7
  169. package/lib/TagSelector/TagSelector.js +17 -17
  170. package/lib/TreeStructure/AddFolderButton.js +4 -4
  171. package/lib/TreeStructure/ComboboxButton.js +7 -7
  172. package/lib/TreeStructure/FolderItem.js +13 -13
  173. package/lib/TreeStructure/FolderItems.js +6 -6
  174. package/lib/TreeStructure/TreeStructure.js +9 -9
  175. package/lib/ZendeskButton/ZendeskButton.js +2 -2
  176. package/lib/i18n/index.d.ts +1 -1
  177. package/lib/i18n/index.js +6 -0
  178. package/lib/index.d.ts +8 -15
  179. package/lib/index.js +30 -139
  180. package/lib/locale/messages-en.js +1 -1
  181. package/lib/locale/messages-nb.js +1 -1
  182. package/lib/locale/messages-nn.js +1 -1
  183. package/lib/locale/messages-se.js +1 -1
  184. package/lib/locale/messages-sma.js +1 -1
  185. package/lib/model/ContentType.d.ts +1 -0
  186. package/lib/model/ContentType.js +4 -2
  187. package/lib/styles.css +453 -103
  188. package/package.json +10 -11
  189. package/src/Article/Article.tsx +101 -229
  190. package/src/Article/ArticleByline.tsx +82 -69
  191. package/src/Article/ArticleFootNotes.tsx +32 -36
  192. package/src/Article/index.ts +3 -7
  193. package/src/Breadcrumb/Breadcrumb.tsx +20 -18
  194. package/src/Breadcrumb/BreadcrumbItem.tsx +36 -59
  195. package/src/Breadcrumb/HomeBreadcrumb.stories.tsx +0 -12
  196. package/src/Breadcrumb/HomeBreadcrumb.tsx +33 -46
  197. package/src/ContactBlock/{Contactblock.stories.tsx → ContactBlock.stories.tsx} +3 -4
  198. package/src/ContactBlock/ContactBlock.tsx +165 -199
  199. package/src/ContactBlock/index.ts +3 -3
  200. package/src/ContentTypeBadge/ContentTypeBadge.tsx +77 -77
  201. package/src/ContentTypeBadge/ContentTypeBadgeNew.tsx +3 -1
  202. package/src/ContentTypeHero/ContentTypeHero.stories.tsx +76 -0
  203. package/src/ContentTypeHero/ContentTypeHero.tsx +55 -0
  204. package/src/ContentTypeHero/index.ts +10 -0
  205. package/src/CopyParagraphButton/CopyParagraphButton.tsx +10 -3
  206. package/src/Embed/AudioEmbed.stories.tsx +6 -8
  207. package/src/Embed/BrightcoveEmbed.stories.tsx +6 -8
  208. package/src/Embed/ConceptEmbed.stories.tsx +6 -8
  209. package/src/Embed/ExternalEmbed.stories.tsx +5 -5
  210. package/src/Embed/H5pEmbed.stories.tsx +6 -8
  211. package/src/Embed/IframeEmbed.stories.tsx +6 -8
  212. package/src/Embed/ImageEmbed.stories.tsx +6 -8
  213. package/src/Embed/RelatedContentEmbed.stories.tsx +6 -8
  214. package/src/Embed/UuDisclaimerEmbed.stories.tsx +6 -8
  215. package/src/FrontpageArticle/FrontpageArticle.tsx +1 -1
  216. package/src/Layout/LayoutItem.tsx +25 -41
  217. package/src/Layout/OneColumn.tsx +33 -33
  218. package/src/Layout/PageContainer.tsx +22 -24
  219. package/src/Messages/index.ts +1 -2
  220. package/src/i18n/index.ts +1 -0
  221. package/src/index.ts +11 -35
  222. package/src/locale/messages-en.ts +1 -1
  223. package/src/locale/messages-nb.ts +1 -1
  224. package/src/locale/messages-nn.ts +1 -1
  225. package/src/locale/messages-se.ts +1 -1
  226. package/src/locale/messages-sma.ts +1 -1
  227. package/src/model/ContentType.ts +2 -0
  228. package/es/Article/ArticleHeaderWrapper.js +0 -33
  229. package/es/CreatedBy/CreatedBy.js +0 -73
  230. package/es/CreatedBy/index.js +0 -10
  231. package/es/Hero/Hero.js +0 -68
  232. package/es/Hero/HeroContent.js +0 -16
  233. package/es/Hero/index.js +0 -10
  234. package/es/LanguageSelector/LanguageSelector.js +0 -87
  235. package/es/LanguageSelector/index.js +0 -10
  236. package/es/Logo/Logo.js +0 -52
  237. package/es/Logo/SvgLogo.js +0 -54
  238. package/es/Messages/MessageBanner.js +0 -72
  239. package/es/Search/ActiveFilterContent.js +0 -40
  240. package/es/Search/ActiveFilters.js +0 -112
  241. package/es/Search/ContentTypeResult.js +0 -151
  242. package/es/Search/ContentTypeResultStyles.js +0 -51
  243. package/es/Search/IsPathToHighlight.js +0 -12
  244. package/es/Search/LoadingWrapper.js +0 -31
  245. package/es/Search/SearchField.js +0 -110
  246. package/es/Search/SearchFieldForm.js +0 -33
  247. package/es/Search/SearchResult.js +0 -185
  248. package/es/Search/SearchResultSleeve.js +0 -229
  249. package/es/Search/index.js +0 -12
  250. package/lib/Article/ArticleHeaderWrapper.d.ts +0 -14
  251. package/lib/Article/ArticleHeaderWrapper.js +0 -40
  252. package/lib/CreatedBy/CreatedBy.d.ts +0 -15
  253. package/lib/CreatedBy/CreatedBy.js +0 -78
  254. package/lib/CreatedBy/index.d.ts +0 -9
  255. package/lib/CreatedBy/index.js +0 -16
  256. package/lib/Hero/Hero.d.ts +0 -25
  257. package/lib/Hero/Hero.js +0 -83
  258. package/lib/Hero/HeroContent.d.ts +0 -12
  259. package/lib/Hero/HeroContent.js +0 -23
  260. package/lib/Hero/index.d.ts +0 -10
  261. package/lib/Hero/index.js +0 -61
  262. package/lib/LanguageSelector/LanguageSelector.d.ts +0 -15
  263. package/lib/LanguageSelector/LanguageSelector.js +0 -92
  264. package/lib/LanguageSelector/index.d.ts +0 -9
  265. package/lib/LanguageSelector/index.js +0 -13
  266. package/lib/Logo/Logo.d.ts +0 -20
  267. package/lib/Logo/Logo.js +0 -58
  268. package/lib/Logo/SvgLogo.d.ts +0 -14
  269. package/lib/Logo/SvgLogo.js +0 -62
  270. package/lib/Logo/index.d.ts +0 -9
  271. package/lib/Logo/index.js +0 -16
  272. package/lib/Messages/MessageBanner.d.ts +0 -16
  273. package/lib/Messages/MessageBanner.js +0 -77
  274. package/lib/Search/ActiveFilterContent.d.ts +0 -23
  275. package/lib/Search/ActiveFilterContent.js +0 -47
  276. package/lib/Search/ActiveFilters.d.ts +0 -19
  277. package/lib/Search/ActiveFilters.js +0 -119
  278. package/lib/Search/ContentTypeResult.d.ts +0 -29
  279. package/lib/Search/ContentTypeResult.js +0 -159
  280. package/lib/Search/ContentTypeResultStyles.d.ts +0 -45
  281. package/lib/Search/ContentTypeResultStyles.js +0 -58
  282. package/lib/Search/IsPathToHighlight.d.ts +0 -8
  283. package/lib/Search/IsPathToHighlight.js +0 -19
  284. package/lib/Search/LoadingWrapper.d.ts +0 -12
  285. package/lib/Search/LoadingWrapper.js +0 -38
  286. package/lib/Search/SearchField.d.ts +0 -25
  287. package/lib/Search/SearchField.js +0 -117
  288. package/lib/Search/SearchFieldForm.d.ts +0 -15
  289. package/lib/Search/SearchFieldForm.js +0 -41
  290. package/lib/Search/SearchResult.d.ts +0 -43
  291. package/lib/Search/SearchResult.js +0 -194
  292. package/lib/Search/SearchResultSleeve.d.ts +0 -25
  293. package/lib/Search/SearchResultSleeve.js +0 -237
  294. package/lib/Search/index.d.ts +0 -11
  295. package/lib/Search/index.js +0 -33
  296. package/src/Article/ArticleHeaderWrapper.tsx +0 -38
  297. package/src/CreatedBy/CreatedBy.stories.tsx +0 -36
  298. package/src/CreatedBy/CreatedBy.tsx +0 -63
  299. package/src/CreatedBy/index.ts +0 -11
  300. package/src/Hero/Hero.stories.tsx +0 -35
  301. package/src/Hero/Hero.tsx +0 -129
  302. package/src/Hero/HeroContent.tsx +0 -43
  303. package/src/Hero/index.ts +0 -21
  304. package/src/LanguageSelector/LanguageSelector.stories.tsx +0 -44
  305. package/src/LanguageSelector/LanguageSelector.tsx +0 -101
  306. package/src/LanguageSelector/index.ts +0 -11
  307. package/src/Logo/Logo.stories.tsx +0 -47
  308. package/src/Logo/Logo.tsx +0 -47
  309. package/src/Logo/SvgLogo.tsx +0 -48
  310. package/src/Logo/index.ts +0 -11
  311. package/src/Messages/MessageBanner.stories.tsx +0 -31
  312. package/src/Messages/MessageBanner.tsx +0 -67
  313. package/src/Search/ActiveFilterContent.tsx +0 -64
  314. package/src/Search/ActiveFilters.tsx +0 -145
  315. package/src/Search/ContentTypeResult.tsx +0 -190
  316. package/src/Search/ContentTypeResultStyles.tsx +0 -172
  317. package/src/Search/IsPathToHighlight.ts +0 -12
  318. package/src/Search/LoadingWrapper.tsx +0 -44
  319. package/src/Search/SearchField.tsx +0 -175
  320. package/src/Search/SearchFieldForm.tsx +0 -64
  321. package/src/Search/SearchResult.tsx +0 -368
  322. package/src/Search/SearchResultSleeve.tsx +0 -367
  323. package/src/Search/__tests__/Highlight-test.ts +0 -66
  324. 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.15-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,17 +33,16 @@
33
33
  "types"
34
34
  ],
35
35
  "dependencies": {
36
- "@ndla/accordion": "^5.0.7-alpha.0",
37
- "@ndla/button": "^14.0.7-alpha.0",
36
+ "@ndla/button": "^14.0.8-alpha.0",
38
37
  "@ndla/core": "^5.0.1",
39
38
  "@ndla/dropdown-menu": "^1.0.38",
40
- "@ndla/forms": "^9.0.8-alpha.0",
39
+ "@ndla/forms": "^9.0.9-alpha.0",
41
40
  "@ndla/hooks": "^2.1.8",
42
- "@ndla/icons": "^7.0.8-alpha.0",
41
+ "@ndla/icons": "^7.0.9-alpha.0",
43
42
  "@ndla/licenses": "^8.0.0-alpha.0",
44
- "@ndla/modal": "^7.0.7-alpha.0",
45
- "@ndla/primitives": "^0.0.19",
46
- "@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",
47
46
  "@ndla/styled-system": "^0.0.8",
48
47
  "@ndla/tooltip": "^8.0.1",
49
48
  "@ndla/typography": "^0.4.23",
@@ -66,9 +65,9 @@
66
65
  "react-router-dom": "> 6.0.0"
67
66
  },
68
67
  "devDependencies": {
69
- "@ndla/preset-panda": "^0.0.11",
68
+ "@ndla/preset-panda": "^0.0.12",
70
69
  "@ndla/types-backend": "^0.2.86",
71
- "@ndla/types-embed": "^4.1.8",
70
+ "@ndla/types-embed": "^5.0.0-alpha.0",
72
71
  "@pandacss/dev": "^0.42.0",
73
72
  "css-loader": "^6.7.3",
74
73
  "mini-css-extract-plugin": "^2.7.5",
@@ -79,5 +78,5 @@
79
78
  "publishConfig": {
80
79
  "access": "public"
81
80
  },
82
- "gitHead": "3675a902b9f44f5afb37c648038b8d90f1ccd7d0"
81
+ "gitHead": "557f718324916e39e3b04d6a7196679d31056e00"
83
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;
@@ -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
  };