@ndla/ui 55.0.13-alpha.0 → 55.0.14-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 (297) hide show
  1. package/dist/panda.buildinfo.json +120 -1
  2. package/dist/styles.css +511 -0
  3. package/es/Article/ArticleParagraph.js +11 -13
  4. package/es/CampaignBlock/CampaignBlock.js +103 -68
  5. package/es/Concept/Concept.js +69 -0
  6. package/es/ContentTypeBadge/ContentTypeBadgeNew.js +48 -0
  7. package/es/Embed/AudioEmbed.js +1 -2
  8. package/es/Embed/BrightcoveEmbed.js +13 -24
  9. package/es/Embed/ConceptEmbed.js +57 -301
  10. package/es/Embed/ConceptListEmbed.js +18 -24
  11. package/es/Embed/ContentLinkEmbed.js +10 -10
  12. package/es/Embed/CopyrightEmbed.js +4 -21
  13. package/es/Embed/ExternalEmbed.js +10 -18
  14. package/es/Embed/FootnoteEmbed.js +11 -8
  15. package/es/Embed/GlossEmbed.js +68 -0
  16. package/es/Embed/H5pEmbed.js +19 -19
  17. package/es/Embed/IframeEmbed.js +9 -6
  18. package/es/Embed/InlineTriggerButton.js +70 -0
  19. package/es/Embed/UnknownEmbed.js +9 -9
  20. package/es/Embed/UuDisclaimerEmbed.js +14 -25
  21. package/es/Embed/index.js +1 -3
  22. package/es/ErrorMessage/ErrorMessage.js +41 -22
  23. package/es/ErrorMessage/ErrorResourceAccessDenied.js +8 -6
  24. package/es/FactBox/FactBox.js +118 -47
  25. package/es/FileList/PdfFile.js +23 -5
  26. package/es/Gloss/Gloss.js +116 -86
  27. package/es/Gloss/GlossExample.js +49 -51
  28. package/es/LinkBlock/LinkBlock.js +61 -33
  29. package/es/LinkBlock/LinkBlockSection.js +9 -6
  30. package/es/Logo/Logo.js +1 -30
  31. package/es/RelatedArticleList/RelatedArticleList.js +70 -87
  32. package/es/ResourceBox/ResourceBox.js +65 -37
  33. package/es/TagSelector/TagSelector.js +124 -131
  34. package/es/i18n/index.js +2 -1
  35. package/es/i18n/useComponentTranslations.js +83 -0
  36. package/es/index.js +4 -11
  37. package/es/locale/messages-en.js +30 -4
  38. package/es/locale/messages-nb.js +30 -4
  39. package/es/locale/messages-nn.js +30 -4
  40. package/es/locale/messages-se.js +30 -4
  41. package/es/locale/messages-sma.js +30 -4
  42. package/es/model/ContentType.js +3 -0
  43. package/es/styles.css +511 -0
  44. package/lib/Article/ArticleParagraph.js +12 -14
  45. package/lib/CampaignBlock/CampaignBlock.d.ts +2 -2
  46. package/lib/CampaignBlock/CampaignBlock.js +106 -68
  47. package/lib/Concept/Concept.d.ts +18 -0
  48. package/lib/Concept/Concept.js +75 -0
  49. package/lib/ContentTypeBadge/ContentTypeBadgeNew.d.ts +17 -0
  50. package/lib/ContentTypeBadge/ContentTypeBadgeNew.js +56 -0
  51. package/lib/Embed/AudioEmbed.js +2 -3
  52. package/lib/Embed/BrightcoveEmbed.d.ts +1 -2
  53. package/lib/Embed/BrightcoveEmbed.js +16 -25
  54. package/lib/Embed/ConceptEmbed.d.ts +15 -21
  55. package/lib/Embed/ConceptEmbed.js +58 -301
  56. package/lib/Embed/ConceptListEmbed.js +21 -26
  57. package/lib/Embed/ContentLinkEmbed.js +10 -11
  58. package/lib/Embed/CopyrightEmbed.js +6 -22
  59. package/lib/Embed/ExternalEmbed.d.ts +1 -2
  60. package/lib/Embed/ExternalEmbed.js +13 -19
  61. package/lib/Embed/FootnoteEmbed.js +11 -9
  62. package/lib/Embed/GlossEmbed.d.ts +13 -0
  63. package/lib/Embed/GlossEmbed.js +76 -0
  64. package/lib/Embed/H5pEmbed.d.ts +1 -2
  65. package/lib/Embed/H5pEmbed.js +21 -19
  66. package/lib/Embed/IframeEmbed.d.ts +1 -2
  67. package/lib/Embed/IframeEmbed.js +11 -8
  68. package/lib/Embed/InlineTriggerButton.d.ts +11 -0
  69. package/lib/Embed/InlineTriggerButton.js +76 -0
  70. package/lib/Embed/UnknownEmbed.js +9 -10
  71. package/lib/Embed/UuDisclaimerEmbed.js +16 -26
  72. package/lib/Embed/index.d.ts +2 -3
  73. package/lib/Embed/index.js +2 -9
  74. package/lib/ErrorMessage/ErrorMessage.js +40 -23
  75. package/lib/ErrorMessage/ErrorResourceAccessDenied.js +7 -6
  76. package/lib/FactBox/FactBox.d.ts +0 -1
  77. package/lib/FactBox/FactBox.js +119 -46
  78. package/lib/FileList/PdfFile.js +23 -5
  79. package/lib/Gloss/Gloss.d.ts +10 -2
  80. package/lib/Gloss/Gloss.js +116 -85
  81. package/lib/Gloss/GlossExample.d.ts +3 -5
  82. package/lib/Gloss/GlossExample.js +49 -52
  83. package/lib/LinkBlock/LinkBlock.js +62 -34
  84. package/lib/LinkBlock/LinkBlockSection.js +9 -7
  85. package/lib/Logo/Logo.d.ts +1 -3
  86. package/lib/Logo/Logo.js +2 -30
  87. package/lib/RelatedArticleList/RelatedArticleList.d.ts +4 -4
  88. package/lib/RelatedArticleList/RelatedArticleList.js +74 -90
  89. package/lib/ResourceBox/ResourceBox.js +64 -37
  90. package/lib/TagSelector/TagSelector.d.ts +27 -12
  91. package/lib/TagSelector/TagSelector.js +126 -131
  92. package/lib/i18n/index.d.ts +1 -0
  93. package/lib/i18n/index.js +20 -1
  94. package/lib/i18n/useComponentTranslations.d.ts +14 -0
  95. package/lib/i18n/useComponentTranslations.js +93 -0
  96. package/lib/index.d.ts +5 -14
  97. package/lib/index.js +70 -89
  98. package/lib/locale/messages-en.d.ts +26 -0
  99. package/lib/locale/messages-en.js +30 -4
  100. package/lib/locale/messages-nb.d.ts +26 -0
  101. package/lib/locale/messages-nb.js +30 -4
  102. package/lib/locale/messages-nn.d.ts +26 -0
  103. package/lib/locale/messages-nn.js +30 -4
  104. package/lib/locale/messages-se.d.ts +26 -0
  105. package/lib/locale/messages-se.js +30 -4
  106. package/lib/locale/messages-sma.d.ts +26 -0
  107. package/lib/locale/messages-sma.js +30 -4
  108. package/lib/model/ContentType.d.ts +3 -0
  109. package/lib/model/ContentType.js +4 -1
  110. package/lib/styles.css +511 -0
  111. package/package.json +11 -13
  112. package/src/Article/ArticleParagraph.tsx +11 -9
  113. package/src/CampaignBlock/CampaignBlock.tsx +92 -55
  114. package/src/Concept/Concept.stories.tsx +142 -0
  115. package/src/Concept/Concept.tsx +73 -0
  116. package/src/ContentTypeBadge/ContentTypeBadgeNew.stories.tsx +70 -0
  117. package/src/ContentTypeBadge/ContentTypeBadgeNew.tsx +69 -0
  118. package/src/Embed/AudioEmbed.tsx +2 -2
  119. package/src/Embed/BrightcoveEmbed.stories.tsx +0 -3
  120. package/src/Embed/BrightcoveEmbed.tsx +17 -19
  121. package/src/Embed/ConceptEmbed.stories.tsx +1 -105
  122. package/src/Embed/ConceptEmbed.tsx +60 -385
  123. package/src/Embed/ConceptListEmbed.tsx +20 -19
  124. package/src/Embed/ContentLinkEmbed.tsx +8 -10
  125. package/src/Embed/CopyrightEmbed.tsx +1 -11
  126. package/src/Embed/ExternalEmbed.tsx +14 -17
  127. package/src/Embed/FootnoteEmbed.stories.tsx +2 -5
  128. package/src/Embed/FootnoteEmbed.tsx +13 -16
  129. package/src/Embed/GlossEmbed.stories.tsx +140 -0
  130. package/src/Embed/GlossEmbed.tsx +64 -0
  131. package/src/Embed/H5pEmbed.tsx +22 -16
  132. package/src/Embed/IframeEmbed.tsx +12 -6
  133. package/src/Embed/InlineTriggerButton.tsx +72 -0
  134. package/src/Embed/UnknownEmbed.tsx +6 -7
  135. package/src/Embed/UuDisclaimerEmbed.stories.tsx +4 -4
  136. package/src/Embed/UuDisclaimerEmbed.tsx +17 -25
  137. package/src/Embed/index.ts +2 -3
  138. package/src/ErrorMessage/ErrorMessage.tsx +40 -29
  139. package/src/ErrorMessage/ErrorResourceAccessDenied.tsx +8 -6
  140. package/src/FactBox/FactBox.tsx +115 -115
  141. package/src/FactBox/Factbox.stories.tsx +43 -27
  142. package/src/FileList/FileList.stories.tsx +6 -1
  143. package/src/FileList/PdfFile.tsx +22 -5
  144. package/src/Gloss/Gloss.stories.tsx +107 -1
  145. package/src/Gloss/Gloss.tsx +143 -156
  146. package/src/Gloss/GlossExample.tsx +51 -77
  147. package/src/LinkBlock/LinkBlock.stories.tsx +8 -10
  148. package/src/LinkBlock/LinkBlock.tsx +54 -59
  149. package/src/LinkBlock/LinkBlockSection.tsx +9 -12
  150. package/src/Logo/Logo.stories.tsx +0 -1
  151. package/src/Logo/Logo.tsx +2 -30
  152. package/src/RelatedArticleList/RelatedArticleList.tsx +69 -88
  153. package/src/ResourceBox/ResourceBox.tsx +63 -59
  154. package/src/TagSelector/TagSelector.stories.tsx +92 -68
  155. package/src/TagSelector/TagSelector.tsx +161 -126
  156. package/src/i18n/index.ts +5 -0
  157. package/src/i18n/useComponentTranslations.ts +72 -0
  158. package/src/index.ts +23 -18
  159. package/src/locale/messages-en.ts +28 -2
  160. package/src/locale/messages-nb.ts +28 -2
  161. package/src/locale/messages-nn.ts +28 -2
  162. package/src/locale/messages-se.ts +28 -2
  163. package/src/locale/messages-sma.ts +28 -2
  164. package/src/model/ContentType.ts +3 -0
  165. package/es/DefinitionList/DefinitionDescription.js +0 -28
  166. package/es/DefinitionList/DefinitionTerm.js +0 -28
  167. package/es/DefinitionList/index.js +0 -10
  168. package/es/Embed/conceptComponents.js +0 -155
  169. package/es/ExpandableBox/ExpandableBox.js +0 -29
  170. package/es/ExpandableBox/index.js +0 -9
  171. package/es/Figure/Figure.js +0 -73
  172. package/es/Figure/index.js +0 -9
  173. package/es/FramedContent/FramedContent.js +0 -28
  174. package/es/FramedContent/index.js +0 -10
  175. package/es/Image/Image.js +0 -99
  176. package/es/Image/ImageLink.js +0 -39
  177. package/es/Image/index.js +0 -12
  178. package/es/LetterFilter/LetterFilter.js +0 -54
  179. package/es/LetterFilter/alphabet.js +0 -9
  180. package/es/LetterFilter/index.js +0 -10
  181. package/es/Notion/Notion.js +0 -76
  182. package/es/Notion/NotionImage.js +0 -46
  183. package/es/Notion/index.js +0 -9
  184. package/es/Table/Table.js +0 -141
  185. package/es/Table/index.js +0 -11
  186. package/es/TagSelector/Control.js +0 -28
  187. package/es/TagSelector/DropdownIndicator.js +0 -60
  188. package/es/TagSelector/Input.js +0 -22
  189. package/es/TagSelector/Menu.js +0 -27
  190. package/es/TagSelector/MenuList.js +0 -28
  191. package/es/TagSelector/Option.js +0 -60
  192. package/es/TagSelector/SelectContainer.js +0 -27
  193. package/es/TagSelector/ValueButton.js +0 -53
  194. package/es/TagSelector/ariaMessages.js +0 -94
  195. package/es/TagSelector/index.js +0 -10
  196. package/es/TagSelector/types.js +0 -1
  197. package/lib/DefinitionList/DefinitionDescription.d.ts +0 -10
  198. package/lib/DefinitionList/DefinitionDescription.js +0 -35
  199. package/lib/DefinitionList/DefinitionTerm.d.ts +0 -10
  200. package/lib/DefinitionList/DefinitionTerm.js +0 -35
  201. package/lib/DefinitionList/index.d.ts +0 -9
  202. package/lib/DefinitionList/index.js +0 -20
  203. package/lib/Embed/conceptComponents.d.ts +0 -40
  204. package/lib/Embed/conceptComponents.js +0 -163
  205. package/lib/ExpandableBox/ExpandableBox.d.ts +0 -15
  206. package/lib/ExpandableBox/ExpandableBox.js +0 -37
  207. package/lib/ExpandableBox/index.d.ts +0 -8
  208. package/lib/ExpandableBox/index.js +0 -18
  209. package/lib/Figure/Figure.d.ts +0 -16
  210. package/lib/Figure/Figure.js +0 -81
  211. package/lib/Figure/index.d.ts +0 -9
  212. package/lib/Figure/index.js +0 -13
  213. package/lib/FramedContent/FramedContent.d.ts +0 -12
  214. package/lib/FramedContent/FramedContent.js +0 -35
  215. package/lib/FramedContent/index.d.ts +0 -9
  216. package/lib/FramedContent/index.js +0 -16
  217. package/lib/Image/Image.d.ts +0 -38
  218. package/lib/Image/Image.js +0 -105
  219. package/lib/Image/ImageLink.d.ts +0 -18
  220. package/lib/Image/ImageLink.js +0 -44
  221. package/lib/Image/index.d.ts +0 -12
  222. package/lib/Image/index.js +0 -30
  223. package/lib/LetterFilter/LetterFilter.d.ts +0 -14
  224. package/lib/LetterFilter/LetterFilter.js +0 -61
  225. package/lib/LetterFilter/alphabet.d.ts +0 -8
  226. package/lib/LetterFilter/alphabet.js +0 -15
  227. package/lib/LetterFilter/index.d.ts +0 -9
  228. package/lib/LetterFilter/index.js +0 -16
  229. package/lib/Notion/Notion.d.ts +0 -20
  230. package/lib/Notion/Notion.js +0 -82
  231. package/lib/Notion/NotionImage.d.ts +0 -13
  232. package/lib/Notion/NotionImage.js +0 -54
  233. package/lib/Notion/index.d.ts +0 -8
  234. package/lib/Notion/index.js +0 -13
  235. package/lib/Table/Table.d.ts +0 -19
  236. package/lib/Table/Table.js +0 -145
  237. package/lib/Table/index.d.ts +0 -10
  238. package/lib/Table/index.js +0 -23
  239. package/lib/TagSelector/Control.d.ts +0 -11
  240. package/lib/TagSelector/Control.js +0 -35
  241. package/lib/TagSelector/DropdownIndicator.d.ts +0 -11
  242. package/lib/TagSelector/DropdownIndicator.js +0 -64
  243. package/lib/TagSelector/Input.d.ts +0 -12
  244. package/lib/TagSelector/Input.js +0 -29
  245. package/lib/TagSelector/Menu.d.ts +0 -12
  246. package/lib/TagSelector/Menu.js +0 -34
  247. package/lib/TagSelector/MenuList.d.ts +0 -16
  248. package/lib/TagSelector/MenuList.js +0 -35
  249. package/lib/TagSelector/Option.d.ts +0 -12
  250. package/lib/TagSelector/Option.js +0 -67
  251. package/lib/TagSelector/SelectContainer.d.ts +0 -11
  252. package/lib/TagSelector/SelectContainer.js +0 -34
  253. package/lib/TagSelector/ValueButton.d.ts +0 -20
  254. package/lib/TagSelector/ValueButton.js +0 -60
  255. package/lib/TagSelector/ariaMessages.d.ts +0 -16
  256. package/lib/TagSelector/ariaMessages.js +0 -101
  257. package/lib/TagSelector/index.d.ts +0 -11
  258. package/lib/TagSelector/index.js +0 -13
  259. package/lib/TagSelector/types.d.ts +0 -11
  260. package/lib/TagSelector/types.js +0 -5
  261. package/src/DefinitionList/DefinitionDescription.tsx +0 -26
  262. package/src/DefinitionList/DefinitionTerm.tsx +0 -26
  263. package/src/DefinitionList/index.tsx +0 -10
  264. package/src/Embed/conceptComponents.tsx +0 -293
  265. package/src/ExpandableBox/ExpandableBox.stories.tsx +0 -41
  266. package/src/ExpandableBox/ExpandableBox.tsx +0 -23
  267. package/src/ExpandableBox/index.ts +0 -9
  268. package/src/Figure/Figure.tsx +0 -167
  269. package/src/Figure/index.ts +0 -11
  270. package/src/FramedContent/FramedContent.stories.tsx +0 -152
  271. package/src/FramedContent/FramedContent.tsx +0 -26
  272. package/src/FramedContent/index.ts +0 -10
  273. package/src/Image/Image.stories.tsx +0 -61
  274. package/src/Image/Image.tsx +0 -147
  275. package/src/Image/ImageLink.tsx +0 -37
  276. package/src/Image/index.ts +0 -14
  277. package/src/LetterFilter/LetterFilter.stories.tsx +0 -29
  278. package/src/LetterFilter/LetterFilter.tsx +0 -78
  279. package/src/LetterFilter/alphabet.ts +0 -39
  280. package/src/LetterFilter/index.ts +0 -11
  281. package/src/Notion/Notion.tsx +0 -96
  282. package/src/Notion/NotionImage.tsx +0 -64
  283. package/src/Notion/index.ts +0 -9
  284. package/src/Table/Table.stories.tsx +0 -738
  285. package/src/Table/Table.tsx +0 -284
  286. package/src/Table/index.ts +0 -12
  287. package/src/TagSelector/Control.tsx +0 -34
  288. package/src/TagSelector/DropdownIndicator.tsx +0 -55
  289. package/src/TagSelector/Input.tsx +0 -31
  290. package/src/TagSelector/Menu.tsx +0 -38
  291. package/src/TagSelector/MenuList.tsx +0 -30
  292. package/src/TagSelector/Option.tsx +0 -58
  293. package/src/TagSelector/SelectContainer.tsx +0 -31
  294. package/src/TagSelector/ValueButton.tsx +0 -47
  295. package/src/TagSelector/ariaMessages.ts +0 -96
  296. package/src/TagSelector/index.ts +0 -14
  297. package/src/TagSelector/types.ts +0 -12
@@ -7,6 +7,7 @@
7
7
  */
8
8
 
9
9
  import { Meta, StoryObj } from "@storybook/react";
10
+ import { ExpandableBox, ExpandableBoxSummary, FramedContent } from "@ndla/primitives";
10
11
  import { UuDisclaimerEmbedData } from "@ndla/types-embed";
11
12
  import H5pEmbed from "./H5pEmbed";
12
13
  import IframeEmbed from "./IframeEmbed";
@@ -14,7 +15,6 @@ import UuDisclaimerEmbed from "./UuDisclaimerEmbed";
14
15
  import { ArticleWrapper } from "../Article";
15
16
  import CopyParagraphButton from "../CopyParagraphButton";
16
17
  import FactBox from "../FactBox";
17
- import FramedContent from "../FramedContent";
18
18
  import LayoutItem, { OneColumn } from "../Layout";
19
19
 
20
20
  const embedData: UuDisclaimerEmbedData = {
@@ -143,10 +143,10 @@ export const WithHtml: StoryObj<typeof UuDisclaimerEmbed> = {
143
143
  children: (
144
144
  <>
145
145
  <p>Dette er html med en ekspanderboks</p>
146
- <details>
147
- <summary>Tittel</summary>
146
+ <ExpandableBox>
147
+ <ExpandableBoxSummary>Tittel</ExpandableBoxSummary>
148
148
  <p>innhold</p>
149
- </details>
149
+ </ExpandableBox>
150
150
  </>
151
151
  ),
152
152
  },
@@ -8,36 +8,28 @@
8
8
 
9
9
  import { ReactNode } from "react";
10
10
  import { useTranslation } from "react-i18next";
11
- import styled from "@emotion/styled";
12
- import { fonts, spacing } from "@ndla/core";
13
11
  import { InformationOutline } from "@ndla/icons/common";
12
+ import { MessageBox } from "@ndla/primitives";
14
13
  import { SafeLink } from "@ndla/safelink";
14
+ import { styled } from "@ndla/styled-system/jsx";
15
15
  import { UuDisclaimerMetaData } from "@ndla/types-embed";
16
- import { MessageBox } from "../Messages";
16
+
17
17
  interface Props {
18
18
  embed: UuDisclaimerMetaData;
19
19
  children?: ReactNode;
20
20
  }
21
21
 
22
- const StyledMessageBox = styled(MessageBox)`
23
- display: flex;
24
- flex-align: center;
25
- `;
26
-
27
- const Disclaimer = styled.div`
28
- display: flow;
29
- ${fonts.sizes("18px", "24px")};
30
- user-select: none;
31
- -webkit-user-select: none;
32
- -moz-user-select: none;
33
- -ms-user-select: none;
34
- `;
35
-
36
- const DisclaimerWrapper = styled.div`
37
- > :nth-child(2) {
38
- margin-top: ${spacing.xsmall};
39
- }
40
- `;
22
+ const StyledMessageBox = styled(MessageBox, {
23
+ base: {
24
+ display: "flex",
25
+ alignItems: "center",
26
+ },
27
+ });
28
+ const Disclaimer = styled("div", {
29
+ base: {
30
+ textStyle: "body.medium",
31
+ },
32
+ });
41
33
 
42
34
  const UuDisclaimerEmbed = ({ embed, children }: Props) => {
43
35
  const { t } = useTranslation();
@@ -58,8 +50,8 @@ const UuDisclaimerEmbed = ({ embed, children }: Props) => {
58
50
  ) : null;
59
51
 
60
52
  return (
61
- <DisclaimerWrapper role="region">
62
- <StyledMessageBox type="info" contentEditable={false}>
53
+ <div role="region">
54
+ <StyledMessageBox variant="warning" contentEditable={false}>
63
55
  <InformationOutline />
64
56
  <Disclaimer>
65
57
  {embedData.disclaimer}
@@ -67,7 +59,7 @@ const UuDisclaimerEmbed = ({ embed, children }: Props) => {
67
59
  </Disclaimer>
68
60
  </StyledMessageBox>
69
61
  {children}
70
- </DisclaimerWrapper>
62
+ </div>
71
63
  );
72
64
  };
73
65
 
@@ -15,11 +15,10 @@ export { default as FootnoteEmbed } from "./FootnoteEmbed";
15
15
  export { default as BrightcoveEmbed } from "./BrightcoveEmbed";
16
16
  export { default as ContentLinkEmbed } from "./ContentLinkEmbed";
17
17
  export { default as RelatedContentEmbed } from "./RelatedContentEmbed";
18
- export { default as ConceptEmbed } from "./ConceptEmbed";
19
- export { ConceptNotionV2 } from "./conceptComponents";
18
+ export { ConceptEmbed, InlineConcept, BlockConcept } from "./ConceptEmbed";
19
+ export type { InlineConceptProps, BlockConceptProps } from "./ConceptEmbed";
20
20
  export { default as ConceptListEmbed } from "./ConceptListEmbed";
21
21
  export { default as UnknownEmbed } from "./UnknownEmbed";
22
- export { InlineConcept, BlockConcept } from "./ConceptEmbed";
23
22
  export { default as UuDisclaimerEmbed } from "./UuDisclaimerEmbed";
24
23
  export { default as CopyrightEmbed } from "./CopyrightEmbed";
25
24
  export { default as CodeEmbed } from "./CodeEmbed";
@@ -7,42 +7,53 @@
7
7
  */
8
8
 
9
9
  import { ReactNode } from "react";
10
- import styled from "@emotion/styled";
11
- import { colors, spacing, breakpoints } from "@ndla/core";
10
+ import { Text } from "@ndla/primitives";
12
11
  import { SafeLink } from "@ndla/safelink";
12
+ import { styled } from "@ndla/styled-system/jsx";
13
13
 
14
- const StyledErrorMessage = styled.article`
15
- text-align: center;
16
- a {
17
- color: ${colors.brand.primary};
18
- }
14
+ // TODO: This has not been redesignet yet. This is just a rewrite of the previous design in panda
19
15
 
20
- h1 {
21
- margin-top: 0;
22
- }
23
- `;
16
+ const StyledErrorMessage = styled("article", {
17
+ base: {
18
+ textAlign: "center",
19
+ "& a": {
20
+ color: "text.strong",
21
+ },
22
+ "& h1": {
23
+ marginTop: "0",
24
+ },
25
+ },
26
+ });
24
27
 
25
- const IllustrationWrapper = styled("div")`
26
- margin-bottom: ${spacing.normal};
27
- @media (min-width: ${breakpoints.tablet}) {
28
- margin-top: ${spacing.large};
29
- }
30
- `;
28
+ const IllustrationWrapper = styled("div", {
29
+ base: {
30
+ marginBottom: "medium",
31
+ tablet: {
32
+ marginTop: "xxlarge",
33
+ },
34
+ },
35
+ });
31
36
 
32
- const Description = styled("p")`
33
- margin-bottom: ${spacing.normal};
34
- @media (min-width: ${breakpoints.tablet}) {
35
- margin-bottom: ${spacing.large};
36
- }
37
- `;
37
+ const Description = styled(Text, {
38
+ base: {
39
+ marginBottom: "medium",
40
+ tablet: {
41
+ marginBottom: "xxlarge",
42
+ },
43
+ },
44
+ });
38
45
 
39
- const CustomElementWrapper = styled.div`
40
- margin: ${spacing.large} 0;
41
- `;
46
+ const CustomElementWrapper = styled("div", {
47
+ base: {
48
+ marginBlock: "xxlarge",
49
+ },
50
+ });
42
51
 
43
- const MessageWrapper = styled.div`
44
- margin-top: ${spacing.xsmall};
45
- `;
52
+ const MessageWrapper = styled("div", {
53
+ base: {
54
+ marginTop: "3xsmall",
55
+ },
56
+ });
46
57
 
47
58
  interface Props {
48
59
  messages: {
@@ -7,16 +7,18 @@
7
7
  */
8
8
 
9
9
  import { useTranslation } from "react-i18next";
10
- import styled from "@emotion/styled";
11
10
  import { ButtonV2 } from "@ndla/button";
12
- import { spacing } from "@ndla/core";
13
11
  import { HumanMaleBoard, LogIn } from "@ndla/icons/common";
14
-
12
+ import { styled } from "@ndla/styled-system/jsx";
15
13
  import ErrorMessage from "./ErrorMessage";
16
14
 
17
- const StyledLogInIconWrapper = styled.span`
18
- margin-left: ${spacing.xsmall};
19
- `;
15
+ // TODO: This has not been redesignet yet. This is just a rewrite of the previous design in panda
16
+
17
+ const StyledLogInIconWrapper = styled("span", {
18
+ base: {
19
+ marginLeft: "3xsmall",
20
+ },
21
+ });
20
22
 
21
23
  type Props = {
22
24
  onAuthenticateClick: () => void;
@@ -6,14 +6,11 @@
6
6
  *
7
7
  */
8
8
 
9
- /** @jsxImportSource @emotion/react */
10
- import { ComponentProps, ReactNode, forwardRef, useCallback, useEffect, useState } from "react";
9
+ import { ComponentProps, ReactNode, forwardRef, useCallback, useEffect, useId, useMemo, useState } from "react";
11
10
  import { useTranslation } from "react-i18next";
12
- import { css } from "@emotion/react";
13
- import styled from "@emotion/styled";
14
- import { IconButtonV2 } from "@ndla/button";
15
- import { breakpoints, colors, mq, spacing, stackOrder } from "@ndla/core";
16
- import { ChevronDown, ChevronUp } from "@ndla/icons/common";
11
+ import { ChevronDown } from "@ndla/icons/common";
12
+ import { IconButton } from "@ndla/primitives";
13
+ import { styled } from "@ndla/styled-system/jsx";
17
14
 
18
15
  interface Props extends ComponentProps<"aside"> {
19
16
  children?: ReactNode;
@@ -22,129 +19,132 @@ interface Props extends ComponentProps<"aside"> {
22
19
  onOpenChange?: (open: boolean) => void;
23
20
  }
24
21
 
25
- const StyledAside = styled.aside`
26
- display: flex;
27
- flex-direction: column;
28
- align-items: center;
29
- position: relative;
30
- z-index: ${stackOrder.offsetSingle};
31
- margin: ${spacing.large} 0 calc(${spacing.large} - ${spacing.nsmall}) 0;
32
- overflow: hidden;
33
- padding-bottom: ${spacing.nsmall};
34
-
35
- @media print {
36
- overflow: visible;
37
- }
38
-
39
- h2:first-of-type {
40
- border-bottom: 2px solid ${colors.brand.primary};
41
- margin-top: 0;
42
- margin-bottom: ${spacing.normal};
43
- }
44
-
45
- h2,
46
- h3,
47
- h4,
48
- h5 {
49
- display: block;
50
- margin-top: ${spacing.normal};
51
- margin-bottom: ${spacing.small};
52
- border-bottom: 1px solid ${colors.brand.light};
53
- }
54
- `;
55
-
56
- const StyledDiv = styled.div`
57
- width: 100%;
58
- position: relative;
59
- color: ${colors.brand.greyDark};
60
- padding: ${spacing.normal} ${spacing.normal} ${spacing.large};
61
- border: 1px solid ${colors.brand.greyLight};
62
- max-height: 190px;
63
- transition: max-height 0.6s ease-in-out;
64
- overflow: hidden;
65
-
66
- &:after {
67
- content: "";
68
- text-align: center;
69
- position: absolute;
70
- top: 0;
71
- bottom: 0;
72
- right: 0;
73
- width: 99%;
74
- margin: 0.5% 0.5% 0 0.5%;
75
- transition: opacity 0.5s cubic-bezier(0.74, -0.04, 0.96, 0.97);
76
- /* The 00 after our color is to set its opacity to 0 */
77
- background: linear-gradient(${colors.brand.light}00, ${colors.white});
78
- opacity: 1;
79
- z-index: ${stackOrder.base};
80
- }
81
-
82
- @media print {
83
- max-height: revert;
84
- &:after {
85
- display: none;
86
- }
87
- }
88
-
89
- & > ul:not([class]),
90
- :not(li) > ul:not([class]) {
91
- ${mq.range({ from: breakpoints.desktop })} {
92
- margin-left: ${spacing.normal};
93
- }
94
- }
95
-
96
- & > ol:not([class]),
97
- :not(li) > ol:not([class]) {
98
- ${mq.range({ from: breakpoints.desktop })} {
99
- margin-left: ${spacing.large};
100
- }
101
- }
102
- `;
103
-
104
- const StyledIconButton = styled(IconButtonV2)`
105
- margin-top: -20px;
106
- z-index: ${stackOrder.offsetSingle};
107
-
108
- @media print {
109
- display: none;
110
- }
111
- `;
112
-
113
- const expandedStyle = css`
114
- max-height: 500vh;
115
- `;
22
+ const StyledAside = styled("aside", {
23
+ base: {
24
+ display: "flex",
25
+ flexDirection: "column",
26
+ alignItems: "center",
27
+ position: "relative",
28
+ padding: "medium",
29
+ transitionProperty: "max-height",
30
+ transitionDuration: "slow",
31
+ transitionTimingFunction: "ease-in-out",
32
+ border: "1px solid",
33
+ borderColor: "stroke.default",
34
+ borderRadius: "xsmall",
35
+ maxHeight: "surface.xxsmall",
36
+ _closed: {
37
+ _print: {
38
+ overflow: "visible",
39
+ maxHeight: "500vh",
40
+ },
41
+ },
42
+ _open: {
43
+ maxHeight: "500vh",
44
+ },
45
+ },
46
+ });
47
+
48
+ const StyledContent = styled("div", {
49
+ base: {
50
+ position: "relative",
51
+ width: "100%",
52
+ overflow: "hidden",
53
+ // Reset the top margin of the very first child.
54
+ "& :first-child": {
55
+ marginBlockStart: "0",
56
+ },
57
+ _after: {
58
+ content: '""',
59
+ textAlign: "center",
60
+ position: "absolute",
61
+ inset: "0",
62
+ transitionProperty: "opacity",
63
+ transitionDuration: "slow",
64
+ transitionTimingFunction: "ease-out",
65
+ // TODO: Consider improving this gradient. It's a little light up top.
66
+ gradientFrom: "surface.default/00",
67
+ gradientTo: "surface.default",
68
+ backgroundGradient: "to-b",
69
+ opacity: "1",
70
+ zIndex: "base",
71
+ },
72
+ _print: {
73
+ overflow: "visible",
74
+ _after: {
75
+ display: "none",
76
+ },
77
+ },
78
+ _open: {
79
+ paddingBlockEnd: "xsmall",
80
+ _after: {
81
+ opacity: "0",
82
+ zIndex: "hide",
83
+ },
84
+ },
85
+ },
86
+ });
87
+
88
+ const StyledIconButton = styled(IconButton, {
89
+ base: {
90
+ position: "absolute",
91
+ bottom: "-medium",
92
+ zIndex: "base",
93
+ "& svg": {
94
+ transitionProperty: "transform",
95
+ transitionTimingFunction: "ease-in-out",
96
+ transitionDuration: "fast",
97
+ },
98
+ _open: {
99
+ "& svg": {
100
+ transform: "rotate(180deg)",
101
+ },
102
+ },
103
+ _print: {
104
+ display: "none",
105
+ },
106
+ },
107
+ });
116
108
 
117
- const expandedContentStyle = css`
118
- max-height: 500vh;
119
- &:after {
120
- opacity: 0;
121
- z-index: ${stackOrder.hide};
122
- }
123
- `;
109
+ // TODO: Consider moving the open trigger depending on whether the content is open or closed.
124
110
 
125
111
  const FactBox = forwardRef<HTMLElement, Props>(
126
112
  ({ children, open, onOpenChange, defaultOpen = false, ...rest }, ref) => {
127
113
  const { t } = useTranslation();
128
- const [isOpen, setIsOpen] = useState(defaultOpen);
114
+ const [state, setState] = useState<"open" | "closed">(defaultOpen ? "open" : "closed");
115
+ const contentId = useId();
116
+ // Inert has existed since early 2023. It allows us to disable tabindex inside the content if it is closed, allowing us to be accessible for users with newish browsers. React 18 removes this because it doesn't recognize the attribute. This is a workaround for that.
117
+ // TODO: Remove this hack when we upgrade to React 19.
118
+ const inertAttribute = useMemo(() => {
119
+ return state === "closed" ? { inert: "" } : {};
120
+ }, [state]);
129
121
 
130
122
  useEffect(() => {
131
123
  if (open !== undefined) {
132
- setIsOpen(open);
124
+ setState(open ? "open" : "closed");
133
125
  }
134
126
  }, [open]);
135
127
 
136
128
  const onClick = useCallback(() => {
137
- const newOpen = !isOpen;
138
- setIsOpen(newOpen);
139
- onOpenChange?.(newOpen);
140
- }, [isOpen, onOpenChange]);
129
+ const newState = state === "open" ? "closed" : "open";
130
+ setState(newState);
131
+ onOpenChange?.(newState === "open");
132
+ }, [state, onOpenChange]);
141
133
 
142
134
  return (
143
- <StyledAside {...rest} css={[isOpen ? expandedStyle : undefined]} ref={ref}>
144
- <StyledDiv css={isOpen ? expandedContentStyle : undefined}>{children}</StyledDiv>
145
- <StyledIconButton onClick={onClick} aria-label={t(`factbox.${isOpen ? "close" : "open"}`)}>
146
- {isOpen ? <ChevronUp /> : <ChevronDown />}
135
+ <StyledAside data-state={state} {...rest} ref={ref}>
136
+ <StyledIconButton
137
+ data-state={state}
138
+ onClick={onClick}
139
+ aria-expanded={state === "open"}
140
+ aria-controls={contentId}
141
+ aria-label={t(`factbox.${state === "open" ? "close" : "open"}`)}
142
+ >
143
+ <ChevronDown />
147
144
  </StyledIconButton>
145
+ <StyledContent id={contentId} data-state={state} aria-hidden={state === "closed"} {...inertAttribute}>
146
+ {children}
147
+ </StyledContent>
148
148
  </StyledAside>
149
149
  );
150
150
  },
@@ -6,16 +6,10 @@
6
6
  *
7
7
  */
8
8
 
9
- import styled from "@emotion/styled";
10
9
  import { Meta, StoryObj } from "@storybook/react";
11
- import { spacing } from "@ndla/core";
12
- import { Heading, Text } from "@ndla/typography";
10
+ import { Button, UnOrderedList, OrderedList } from "@ndla/primitives";
13
11
  import FactBox from "./FactBox";
14
12
 
15
- const Wrapper = styled.div`
16
- padding: ${spacing.normal};
17
- `;
18
-
19
13
  /**
20
14
  *For alt nytt innhold på ndla.no skal ikke flytende høyrespalte benyttes. I stedet benytter vi faktabokser innenfor innholdsspalten.
21
15
  */
@@ -26,32 +20,54 @@ export default {
26
20
  paramemeters: {
27
21
  inlineStories: true,
28
22
  },
29
- decorators: [
30
- (Story) => (
31
- <Wrapper>
32
- <Story />
33
- </Wrapper>
34
- ),
35
- ],
23
+ decorators: [(Story) => <Story />],
36
24
  args: {
37
25
  children: (
38
26
  <>
39
- <Heading element="h2" headingStyle="h2">
40
- Faktaboks
41
- </Heading>
42
- <Text textStyle="content">
43
- En faktaboks kan inneholde punktlister eller korte fakta som er relevant for artikkelens innhold.
44
- </Text>
45
- <Text textStyle="content">
27
+ <h2>Faktaboks</h2>
28
+ <p>Innhold kan først nås etter at boksen er åpnet.</p>
29
+ <Button>Klikk meg</Button>
30
+ <p>En faktaboks kan inneholde punktlister eller korte fakta som er relevant for artikkelens innhold.</p>
31
+ <p>
46
32
  Det anbefales å ikke ha for mye innhold i faktaboks, slik at lese-konteksten i størst mulig grad beholdes.
47
- </Text>
48
- <Heading element="h2" headingStyle="h2">
49
- Enkel tittel
50
- </Heading>
51
- <Text textStyle="content">
33
+ </p>
34
+ <h2>Enkel tittel</h2>
35
+ <p>
52
36
  Faktaboksen kan også brukes til å oppsummere innhold i slutten av en artikkel, og den kan inneholde
53
37
  lisensiering om eksternt innhold er brukt.
54
- </Text>
38
+ </p>
39
+ <UnOrderedList>
40
+ <li>Punkt 1</li>
41
+ <li>Punkt 2</li>
42
+ <li>
43
+ <UnOrderedList>
44
+ <li>Punkt 1.1</li>
45
+ <li>Punkt 1.2</li>
46
+ <li>
47
+ <UnOrderedList>
48
+ <li>Punkt 1.1.1</li>
49
+ <li>Punkt 1.2.1</li>
50
+ </UnOrderedList>
51
+ </li>
52
+ </UnOrderedList>
53
+ </li>
54
+ </UnOrderedList>
55
+ <OrderedList>
56
+ <li>Punkt 1</li>
57
+ <li>Punkt 2</li>
58
+ <li>
59
+ <OrderedList>
60
+ <li>Punkt 1.1</li>
61
+ <li>Punkt 1.2</li>
62
+ <li>
63
+ <OrderedList>
64
+ <li>Punkt 1.1.1</li>
65
+ <li>Punkt 1.2.1</li>
66
+ </OrderedList>
67
+ </li>
68
+ </OrderedList>
69
+ </li>
70
+ </OrderedList>
55
71
  </>
56
72
  ),
57
73
  },
@@ -9,6 +9,7 @@
9
9
  import { Meta, StoryObj } from "@storybook/react";
10
10
  import File from "./File";
11
11
  import FileList from "./FileList";
12
+ import PdfFile from "./PdfFile";
12
13
 
13
14
  export default {
14
15
  title: "Components/FileList",
@@ -38,7 +39,11 @@ export const SeveralFiles: StoryObj<typeof File> = {
38
39
  render: () => (
39
40
  <FileList>
40
41
  <File title="Fil 1" url="https://ndla.no/1" fileExists fileType="mp4" />
41
- <File title="Fil 2" url="https://ndla.no/2" fileExists={false} fileType="pdf" />
42
+ <File title="Fil 2" url="https://ndla.no/2" fileExists={false} fileType="png" />
43
+ <PdfFile
44
+ title="Fil 3"
45
+ url="https://api.test.ndla.no/files/131789/krypteringsaktivitet_-_til_fiendegruppe_bm.pdf"
46
+ />
42
47
  <File title="Fil 3" url="https://ndla.no/3" fileExists fileType="docx" />
43
48
  <File title="Fil 4" url="https://ndla.no/4" fileExists fileType="docx" />
44
49
  </FileList>
@@ -6,19 +6,36 @@
6
6
  *
7
7
  */
8
8
 
9
- import { Figure } from "../Figure";
9
+ import { Heading, Figure } from "@ndla/primitives";
10
+ import { styled } from "@ndla/styled-system/jsx";
10
11
 
11
12
  interface Props {
12
13
  title: string;
13
14
  url: string;
14
15
  }
15
16
 
17
+ const StyledIframe = styled("iframe", {
18
+ base: {
19
+ width: "100%",
20
+ },
21
+ });
22
+
23
+ const StyledFigure = styled(Figure, {
24
+ base: {
25
+ display: "flex",
26
+ flexDirection: "column",
27
+ gap: "xsmall",
28
+ },
29
+ });
30
+
16
31
  const PdfFile = ({ title, url }: Props) => {
17
32
  return (
18
- <Figure>
19
- <h2>{title}</h2>
20
- <iframe title={title} height="1050" src={url} />
21
- </Figure>
33
+ <StyledFigure>
34
+ <Heading asChild consumeCss textStyle="title.medium">
35
+ <h4>{title}</h4>
36
+ </Heading>
37
+ <StyledIframe title={title} height="1050" src={url} />
38
+ </StyledFigure>
22
39
  );
23
40
  };
24
41