@ndla/ui 55.0.13-alpha.0 → 55.0.15-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 (337) hide show
  1. package/dist/panda.buildinfo.json +142 -1
  2. package/dist/styles.css +597 -0
  3. package/es/Article/ArticleByline.js +7 -7
  4. package/es/Article/ArticleParagraph.js +11 -13
  5. package/es/AudioPlayer/AudioPlayer.js +1 -0
  6. package/es/CampaignBlock/CampaignBlock.js +103 -68
  7. package/es/Concept/Concept.js +69 -0
  8. package/es/ContactBlock/ContactBlock.js +17 -17
  9. package/es/ContentTypeBadge/ContentTypeBadgeNew.js +48 -0
  10. package/es/Embed/AudioEmbed.js +1 -2
  11. package/es/Embed/BrightcoveEmbed.js +13 -25
  12. package/es/Embed/ConceptEmbed.js +57 -301
  13. package/es/Embed/ConceptListEmbed.js +18 -24
  14. package/es/Embed/ContentLinkEmbed.js +10 -10
  15. package/es/Embed/CopyrightEmbed.js +3 -21
  16. package/es/Embed/ExternalEmbed.js +10 -18
  17. package/es/Embed/FootnoteEmbed.js +11 -8
  18. package/es/Embed/GlossEmbed.js +68 -0
  19. package/es/Embed/H5pEmbed.js +19 -19
  20. package/es/Embed/IframeEmbed.js +9 -6
  21. package/es/Embed/InlineTriggerButton.js +70 -0
  22. package/es/Embed/UnknownEmbed.js +9 -9
  23. package/es/Embed/UuDisclaimerEmbed.js +14 -25
  24. package/es/Embed/index.js +1 -3
  25. package/es/ErrorMessage/ErrorMessage.js +41 -22
  26. package/es/ErrorMessage/ErrorResourceAccessDenied.js +8 -6
  27. package/es/FactBox/FactBox.js +118 -47
  28. package/es/FileList/PdfFile.js +23 -5
  29. package/es/Gloss/Gloss.js +116 -86
  30. package/es/Gloss/GlossExample.js +49 -51
  31. package/es/LicenseByline/EmbedByline.js +143 -33
  32. package/es/LicenseByline/LicenseLink.js +16 -9
  33. package/es/LicenseByline/index.js +2 -2
  34. package/es/LinkBlock/LinkBlock.js +61 -33
  35. package/es/LinkBlock/LinkBlockSection.js +9 -6
  36. package/es/Logo/Logo.js +1 -30
  37. package/es/RelatedArticleList/RelatedArticleList.js +70 -87
  38. package/es/ResourceBox/ResourceBox.js +65 -37
  39. package/es/TagSelector/TagSelector.js +124 -131
  40. package/es/i18n/index.js +2 -1
  41. package/es/i18n/useComponentTranslations.js +83 -0
  42. package/es/index.js +4 -12
  43. package/es/locale/messages-en.js +30 -4
  44. package/es/locale/messages-nb.js +30 -4
  45. package/es/locale/messages-nn.js +30 -4
  46. package/es/locale/messages-se.js +30 -4
  47. package/es/locale/messages-sma.js +30 -4
  48. package/es/model/ContentType.js +3 -0
  49. package/es/styles.css +597 -0
  50. package/lib/Article/ArticleByline.js +8 -8
  51. package/lib/Article/ArticleParagraph.js +12 -14
  52. package/lib/AudioPlayer/AudioPlayer.js +1 -0
  53. package/lib/CampaignBlock/CampaignBlock.d.ts +2 -2
  54. package/lib/CampaignBlock/CampaignBlock.js +106 -68
  55. package/lib/Concept/Concept.d.ts +18 -0
  56. package/lib/Concept/Concept.js +75 -0
  57. package/lib/ContactBlock/ContactBlock.js +18 -18
  58. package/lib/ContentTypeBadge/ContentTypeBadgeNew.d.ts +17 -0
  59. package/lib/ContentTypeBadge/ContentTypeBadgeNew.js +56 -0
  60. package/lib/Embed/AudioEmbed.js +2 -3
  61. package/lib/Embed/BrightcoveEmbed.d.ts +1 -2
  62. package/lib/Embed/BrightcoveEmbed.js +16 -26
  63. package/lib/Embed/ConceptEmbed.d.ts +15 -21
  64. package/lib/Embed/ConceptEmbed.js +58 -301
  65. package/lib/Embed/ConceptListEmbed.js +21 -26
  66. package/lib/Embed/ContentLinkEmbed.js +10 -11
  67. package/lib/Embed/CopyrightEmbed.js +5 -22
  68. package/lib/Embed/ExternalEmbed.d.ts +1 -2
  69. package/lib/Embed/ExternalEmbed.js +13 -19
  70. package/lib/Embed/FootnoteEmbed.js +11 -9
  71. package/lib/Embed/GlossEmbed.d.ts +13 -0
  72. package/lib/Embed/GlossEmbed.js +76 -0
  73. package/lib/Embed/H5pEmbed.d.ts +1 -2
  74. package/lib/Embed/H5pEmbed.js +21 -19
  75. package/lib/Embed/IframeEmbed.d.ts +1 -2
  76. package/lib/Embed/IframeEmbed.js +11 -8
  77. package/lib/Embed/InlineTriggerButton.d.ts +11 -0
  78. package/lib/Embed/InlineTriggerButton.js +76 -0
  79. package/lib/Embed/UnknownEmbed.js +9 -10
  80. package/lib/Embed/UuDisclaimerEmbed.js +16 -26
  81. package/lib/Embed/index.d.ts +2 -3
  82. package/lib/Embed/index.js +2 -9
  83. package/lib/ErrorMessage/ErrorMessage.js +40 -23
  84. package/lib/ErrorMessage/ErrorResourceAccessDenied.js +7 -6
  85. package/lib/FactBox/FactBox.d.ts +0 -1
  86. package/lib/FactBox/FactBox.js +119 -46
  87. package/lib/FileList/PdfFile.js +23 -5
  88. package/lib/Gloss/Gloss.d.ts +10 -2
  89. package/lib/Gloss/Gloss.js +116 -85
  90. package/lib/Gloss/GlossExample.d.ts +3 -5
  91. package/lib/Gloss/GlossExample.js +49 -52
  92. package/lib/LicenseByline/EmbedByline.d.ts +2 -4
  93. package/lib/LicenseByline/EmbedByline.js +145 -35
  94. package/lib/LicenseByline/LicenseLink.d.ts +2 -2
  95. package/lib/LicenseByline/LicenseLink.js +16 -9
  96. package/lib/LicenseByline/index.d.ts +2 -2
  97. package/lib/LicenseByline/index.js +4 -5
  98. package/lib/LinkBlock/LinkBlock.js +62 -34
  99. package/lib/LinkBlock/LinkBlockSection.js +9 -7
  100. package/lib/Logo/Logo.d.ts +1 -3
  101. package/lib/Logo/Logo.js +2 -30
  102. package/lib/RelatedArticleList/RelatedArticleList.d.ts +4 -4
  103. package/lib/RelatedArticleList/RelatedArticleList.js +74 -90
  104. package/lib/ResourceBox/ResourceBox.js +64 -37
  105. package/lib/TagSelector/TagSelector.d.ts +27 -12
  106. package/lib/TagSelector/TagSelector.js +126 -131
  107. package/lib/i18n/index.d.ts +1 -0
  108. package/lib/i18n/index.js +20 -1
  109. package/lib/i18n/useComponentTranslations.d.ts +14 -0
  110. package/lib/i18n/useComponentTranslations.js +93 -0
  111. package/lib/index.d.ts +5 -15
  112. package/lib/index.js +70 -102
  113. package/lib/locale/messages-en.d.ts +26 -0
  114. package/lib/locale/messages-en.js +30 -4
  115. package/lib/locale/messages-nb.d.ts +26 -0
  116. package/lib/locale/messages-nb.js +30 -4
  117. package/lib/locale/messages-nn.d.ts +26 -0
  118. package/lib/locale/messages-nn.js +30 -4
  119. package/lib/locale/messages-se.d.ts +26 -0
  120. package/lib/locale/messages-se.js +30 -4
  121. package/lib/locale/messages-sma.d.ts +26 -0
  122. package/lib/locale/messages-sma.js +30 -4
  123. package/lib/model/ContentType.d.ts +3 -0
  124. package/lib/model/ContentType.js +4 -1
  125. package/lib/styles.css +597 -0
  126. package/package.json +11 -13
  127. package/src/Article/ArticleByline.tsx +1 -1
  128. package/src/Article/ArticleParagraph.tsx +11 -9
  129. package/src/AudioPlayer/AudioPlayer.tsx +1 -0
  130. package/src/CampaignBlock/CampaignBlock.tsx +92 -55
  131. package/src/Concept/Concept.stories.tsx +142 -0
  132. package/src/Concept/Concept.tsx +73 -0
  133. package/src/ContactBlock/ContactBlock.tsx +1 -1
  134. package/src/ContentTypeBadge/ContentTypeBadgeNew.stories.tsx +70 -0
  135. package/src/ContentTypeBadge/ContentTypeBadgeNew.tsx +69 -0
  136. package/src/Embed/AudioEmbed.tsx +2 -2
  137. package/src/Embed/BrightcoveEmbed.stories.tsx +0 -3
  138. package/src/Embed/BrightcoveEmbed.tsx +18 -20
  139. package/src/Embed/ConceptEmbed.stories.tsx +1 -105
  140. package/src/Embed/ConceptEmbed.tsx +60 -385
  141. package/src/Embed/ConceptListEmbed.tsx +20 -19
  142. package/src/Embed/ContentLinkEmbed.tsx +8 -10
  143. package/src/Embed/CopyrightEmbed.tsx +1 -11
  144. package/src/Embed/ExternalEmbed.tsx +14 -17
  145. package/src/Embed/FootnoteEmbed.stories.tsx +2 -5
  146. package/src/Embed/FootnoteEmbed.tsx +13 -16
  147. package/src/Embed/GlossEmbed.stories.tsx +140 -0
  148. package/src/Embed/GlossEmbed.tsx +64 -0
  149. package/src/Embed/H5pEmbed.tsx +22 -16
  150. package/src/Embed/IframeEmbed.tsx +12 -6
  151. package/src/Embed/InlineTriggerButton.tsx +72 -0
  152. package/src/Embed/UnknownEmbed.tsx +6 -7
  153. package/src/Embed/UuDisclaimerEmbed.stories.tsx +4 -4
  154. package/src/Embed/UuDisclaimerEmbed.tsx +17 -25
  155. package/src/Embed/index.ts +2 -3
  156. package/src/ErrorMessage/ErrorMessage.tsx +40 -29
  157. package/src/ErrorMessage/ErrorResourceAccessDenied.tsx +8 -6
  158. package/src/FactBox/FactBox.tsx +115 -115
  159. package/src/FactBox/Factbox.stories.tsx +43 -27
  160. package/src/FileList/FileList.stories.tsx +6 -1
  161. package/src/FileList/PdfFile.tsx +22 -5
  162. package/src/Gloss/Gloss.stories.tsx +107 -1
  163. package/src/Gloss/Gloss.tsx +143 -156
  164. package/src/Gloss/GlossExample.tsx +51 -77
  165. package/src/LicenseByline/EmbedByline.stories.tsx +9 -4
  166. package/src/LicenseByline/EmbedByline.tsx +139 -53
  167. package/src/LicenseByline/LicenseLink.tsx +15 -15
  168. package/src/LicenseByline/index.tsx +2 -2
  169. package/src/LinkBlock/LinkBlock.stories.tsx +8 -10
  170. package/src/LinkBlock/LinkBlock.tsx +54 -59
  171. package/src/LinkBlock/LinkBlockSection.tsx +9 -12
  172. package/src/Logo/Logo.stories.tsx +0 -1
  173. package/src/Logo/Logo.tsx +2 -30
  174. package/src/RelatedArticleList/RelatedArticleList.tsx +69 -88
  175. package/src/ResourceBox/ResourceBox.tsx +63 -59
  176. package/src/TagSelector/TagSelector.stories.tsx +92 -68
  177. package/src/TagSelector/TagSelector.tsx +161 -126
  178. package/src/i18n/index.ts +5 -0
  179. package/src/i18n/useComponentTranslations.ts +72 -0
  180. package/src/index.ts +23 -19
  181. package/src/locale/messages-en.ts +28 -2
  182. package/src/locale/messages-nb.ts +28 -2
  183. package/src/locale/messages-nn.ts +28 -2
  184. package/src/locale/messages-se.ts +28 -2
  185. package/src/locale/messages-sma.ts +28 -2
  186. package/src/model/ContentType.ts +3 -0
  187. package/es/DefinitionList/DefinitionDescription.js +0 -28
  188. package/es/DefinitionList/DefinitionTerm.js +0 -28
  189. package/es/DefinitionList/index.js +0 -10
  190. package/es/Embed/conceptComponents.js +0 -155
  191. package/es/ExpandableBox/ExpandableBox.js +0 -29
  192. package/es/ExpandableBox/index.js +0 -9
  193. package/es/Figure/Figure.js +0 -73
  194. package/es/Figure/index.js +0 -9
  195. package/es/FramedContent/FramedContent.js +0 -28
  196. package/es/FramedContent/index.js +0 -10
  197. package/es/Image/Image.js +0 -99
  198. package/es/Image/ImageLink.js +0 -39
  199. package/es/Image/index.js +0 -12
  200. package/es/LetterFilter/LetterFilter.js +0 -54
  201. package/es/LetterFilter/alphabet.js +0 -9
  202. package/es/LetterFilter/index.js +0 -10
  203. package/es/LicenseByline/LicenseDescription.js +0 -63
  204. package/es/List/OrderedList.js +0 -41
  205. package/es/List/UnOrderedList.js +0 -28
  206. package/es/List/index.js +0 -10
  207. package/es/Notion/Notion.js +0 -76
  208. package/es/Notion/NotionImage.js +0 -46
  209. package/es/Notion/index.js +0 -9
  210. package/es/Table/Table.js +0 -141
  211. package/es/Table/index.js +0 -11
  212. package/es/TagSelector/Control.js +0 -28
  213. package/es/TagSelector/DropdownIndicator.js +0 -60
  214. package/es/TagSelector/Input.js +0 -22
  215. package/es/TagSelector/Menu.js +0 -27
  216. package/es/TagSelector/MenuList.js +0 -28
  217. package/es/TagSelector/Option.js +0 -60
  218. package/es/TagSelector/SelectContainer.js +0 -27
  219. package/es/TagSelector/ValueButton.js +0 -53
  220. package/es/TagSelector/ariaMessages.js +0 -94
  221. package/es/TagSelector/index.js +0 -10
  222. package/es/TagSelector/types.js +0 -1
  223. package/lib/DefinitionList/DefinitionDescription.d.ts +0 -10
  224. package/lib/DefinitionList/DefinitionDescription.js +0 -35
  225. package/lib/DefinitionList/DefinitionTerm.d.ts +0 -10
  226. package/lib/DefinitionList/DefinitionTerm.js +0 -35
  227. package/lib/DefinitionList/index.d.ts +0 -9
  228. package/lib/DefinitionList/index.js +0 -20
  229. package/lib/Embed/conceptComponents.d.ts +0 -40
  230. package/lib/Embed/conceptComponents.js +0 -163
  231. package/lib/ExpandableBox/ExpandableBox.d.ts +0 -15
  232. package/lib/ExpandableBox/ExpandableBox.js +0 -37
  233. package/lib/ExpandableBox/index.d.ts +0 -8
  234. package/lib/ExpandableBox/index.js +0 -18
  235. package/lib/Figure/Figure.d.ts +0 -16
  236. package/lib/Figure/Figure.js +0 -81
  237. package/lib/Figure/index.d.ts +0 -9
  238. package/lib/Figure/index.js +0 -13
  239. package/lib/FramedContent/FramedContent.d.ts +0 -12
  240. package/lib/FramedContent/FramedContent.js +0 -35
  241. package/lib/FramedContent/index.d.ts +0 -9
  242. package/lib/FramedContent/index.js +0 -16
  243. package/lib/Image/Image.d.ts +0 -38
  244. package/lib/Image/Image.js +0 -105
  245. package/lib/Image/ImageLink.d.ts +0 -18
  246. package/lib/Image/ImageLink.js +0 -44
  247. package/lib/Image/index.d.ts +0 -12
  248. package/lib/Image/index.js +0 -30
  249. package/lib/LetterFilter/LetterFilter.d.ts +0 -14
  250. package/lib/LetterFilter/LetterFilter.js +0 -61
  251. package/lib/LetterFilter/alphabet.d.ts +0 -8
  252. package/lib/LetterFilter/alphabet.js +0 -15
  253. package/lib/LetterFilter/index.d.ts +0 -9
  254. package/lib/LetterFilter/index.js +0 -16
  255. package/lib/LicenseByline/LicenseDescription.d.ts +0 -15
  256. package/lib/LicenseByline/LicenseDescription.js +0 -70
  257. package/lib/List/OrderedList.d.ts +0 -16
  258. package/lib/List/OrderedList.js +0 -48
  259. package/lib/List/UnOrderedList.d.ts +0 -10
  260. package/lib/List/UnOrderedList.js +0 -35
  261. package/lib/List/index.d.ts +0 -9
  262. package/lib/List/index.js +0 -20
  263. package/lib/Notion/Notion.d.ts +0 -20
  264. package/lib/Notion/Notion.js +0 -82
  265. package/lib/Notion/NotionImage.d.ts +0 -13
  266. package/lib/Notion/NotionImage.js +0 -54
  267. package/lib/Notion/index.d.ts +0 -8
  268. package/lib/Notion/index.js +0 -13
  269. package/lib/Table/Table.d.ts +0 -19
  270. package/lib/Table/Table.js +0 -145
  271. package/lib/Table/index.d.ts +0 -10
  272. package/lib/Table/index.js +0 -23
  273. package/lib/TagSelector/Control.d.ts +0 -11
  274. package/lib/TagSelector/Control.js +0 -35
  275. package/lib/TagSelector/DropdownIndicator.d.ts +0 -11
  276. package/lib/TagSelector/DropdownIndicator.js +0 -64
  277. package/lib/TagSelector/Input.d.ts +0 -12
  278. package/lib/TagSelector/Input.js +0 -29
  279. package/lib/TagSelector/Menu.d.ts +0 -12
  280. package/lib/TagSelector/Menu.js +0 -34
  281. package/lib/TagSelector/MenuList.d.ts +0 -16
  282. package/lib/TagSelector/MenuList.js +0 -35
  283. package/lib/TagSelector/Option.d.ts +0 -12
  284. package/lib/TagSelector/Option.js +0 -67
  285. package/lib/TagSelector/SelectContainer.d.ts +0 -11
  286. package/lib/TagSelector/SelectContainer.js +0 -34
  287. package/lib/TagSelector/ValueButton.d.ts +0 -20
  288. package/lib/TagSelector/ValueButton.js +0 -60
  289. package/lib/TagSelector/ariaMessages.d.ts +0 -16
  290. package/lib/TagSelector/ariaMessages.js +0 -101
  291. package/lib/TagSelector/index.d.ts +0 -11
  292. package/lib/TagSelector/index.js +0 -13
  293. package/lib/TagSelector/types.d.ts +0 -11
  294. package/lib/TagSelector/types.js +0 -5
  295. package/src/DefinitionList/DefinitionDescription.tsx +0 -26
  296. package/src/DefinitionList/DefinitionTerm.tsx +0 -26
  297. package/src/DefinitionList/index.tsx +0 -10
  298. package/src/Embed/conceptComponents.tsx +0 -293
  299. package/src/ExpandableBox/ExpandableBox.stories.tsx +0 -41
  300. package/src/ExpandableBox/ExpandableBox.tsx +0 -23
  301. package/src/ExpandableBox/index.ts +0 -9
  302. package/src/Figure/Figure.tsx +0 -167
  303. package/src/Figure/index.ts +0 -11
  304. package/src/FramedContent/FramedContent.stories.tsx +0 -152
  305. package/src/FramedContent/FramedContent.tsx +0 -26
  306. package/src/FramedContent/index.ts +0 -10
  307. package/src/Image/Image.stories.tsx +0 -61
  308. package/src/Image/Image.tsx +0 -147
  309. package/src/Image/ImageLink.tsx +0 -37
  310. package/src/Image/index.ts +0 -14
  311. package/src/LetterFilter/LetterFilter.stories.tsx +0 -29
  312. package/src/LetterFilter/LetterFilter.tsx +0 -78
  313. package/src/LetterFilter/alphabet.ts +0 -39
  314. package/src/LetterFilter/index.ts +0 -11
  315. package/src/LicenseByline/LicenseDescription.tsx +0 -100
  316. package/src/List/OrderedList.stories.tsx +0 -135
  317. package/src/List/OrderedList.tsx +0 -158
  318. package/src/List/UnOrderedList.tsx +0 -43
  319. package/src/List/UnorderedList.stories.tsx +0 -72
  320. package/src/List/index.ts +0 -10
  321. package/src/Notion/Notion.tsx +0 -96
  322. package/src/Notion/NotionImage.tsx +0 -64
  323. package/src/Notion/index.ts +0 -9
  324. package/src/Table/Table.stories.tsx +0 -738
  325. package/src/Table/Table.tsx +0 -284
  326. package/src/Table/index.ts +0 -12
  327. package/src/TagSelector/Control.tsx +0 -34
  328. package/src/TagSelector/DropdownIndicator.tsx +0 -55
  329. package/src/TagSelector/Input.tsx +0 -31
  330. package/src/TagSelector/Menu.tsx +0 -38
  331. package/src/TagSelector/MenuList.tsx +0 -30
  332. package/src/TagSelector/Option.tsx +0 -58
  333. package/src/TagSelector/SelectContainer.tsx +0 -31
  334. package/src/TagSelector/ValueButton.tsx +0 -47
  335. package/src/TagSelector/ariaMessages.ts +0 -96
  336. package/src/TagSelector/index.ts +0 -14
  337. package/src/TagSelector/types.ts +0 -12
@@ -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
 
@@ -65,6 +65,32 @@ export const GlossStory: StoryFn<typeof Gloss> = ({ ...args }) => {
65
65
  return <Gloss {...args} />;
66
66
  };
67
67
 
68
+ export const Bordered: StoryObj<typeof Gloss> = {
69
+ args: {
70
+ variant: "bordered",
71
+ },
72
+ };
73
+
74
+ export const NoExamples: StoryObj<typeof Gloss> = {
75
+ args: {
76
+ title: {
77
+ title: "Å angripe",
78
+ language: "nb",
79
+ },
80
+ glossData: {
81
+ gloss: "angreifen",
82
+ wordClass: wordClass.verb,
83
+ originalLanguage: "de",
84
+ transcriptions: {},
85
+ examples: [],
86
+ },
87
+ audio: {
88
+ title: "",
89
+ src: "",
90
+ },
91
+ },
92
+ };
93
+
68
94
  export const GlossChineseStory: StoryObj<typeof Gloss> = {
69
95
  args: {
70
96
  title: {
@@ -103,6 +129,86 @@ export const GlossChineseStory: StoryObj<typeof Gloss> = {
103
129
  },
104
130
  };
105
131
 
132
+ export const BigExample: StoryObj<typeof Gloss> = {
133
+ args: {
134
+ title: {
135
+ title: "(spørsmålspartikkel); hva med…?",
136
+ language: "nb",
137
+ },
138
+ audio: {
139
+ src: "https://api.ndla.no/audio/files/ne.mp3",
140
+ title: "Spill av",
141
+ },
142
+ glossData: {
143
+ gloss: "呢",
144
+ wordClass: "particle",
145
+ originalLanguage: "zh",
146
+ transcriptions: {
147
+ pinyin: "ne",
148
+ },
149
+ examples: [
150
+ [
151
+ {
152
+ example: "我叫马红,你呢?//我叫馬紅,你呢?",
153
+ language: "zh",
154
+ transcriptions: {
155
+ pinyin: "Wǒ jiào Mǎ Hóng, nǐ ne?",
156
+ },
157
+ },
158
+ {
159
+ example: "Jeg heter Ma Hong, hva med deg?",
160
+ language: "nb",
161
+ transcriptions: {},
162
+ },
163
+ {
164
+ example: "Eg heiter Ma Hong, kva med deg?",
165
+ language: "nn",
166
+ transcriptions: {},
167
+ },
168
+ ],
169
+ [
170
+ {
171
+ example: "我姓王,你呢?",
172
+ language: "zh",
173
+ transcriptions: {
174
+ pinyin: "Wǒ xìng Wáng, nǐ ne?",
175
+ },
176
+ },
177
+ {
178
+ example: "Jeg heter Wang til etternavn, hva med deg?",
179
+ language: "nb",
180
+ transcriptions: {},
181
+ },
182
+ {
183
+ example: "Eg heiter Wang til etternamn, kva med deg?",
184
+ language: "nn",
185
+ transcriptions: {},
186
+ },
187
+ ],
188
+ [
189
+ {
190
+ example: "我是老师,你呢?//我是老師,你呢?",
191
+ language: "zh",
192
+ transcriptions: {
193
+ pinyin: "Wǒ shì lǎoshī, nǐ ne?",
194
+ },
195
+ },
196
+ {
197
+ example: "Jeg er lærer, hva med deg?",
198
+ language: "nb",
199
+ transcriptions: {},
200
+ },
201
+ {
202
+ example: "Eg er lærar, kva med deg?",
203
+ language: "nn",
204
+ transcriptions: {},
205
+ },
206
+ ],
207
+ ],
208
+ },
209
+ },
210
+ };
211
+
106
212
  const GlossExampleText = {
107
213
  example: "我叫马红",
108
214
  language: "zh",
@@ -112,5 +218,5 @@ const GlossExampleText = {
112
218
  };
113
219
 
114
220
  export const GlossExampleStory: StoryFn<typeof Gloss> = () => {
115
- return <GlossExample originalLanguage="zh" index={0} example={GlossExampleText} isStandalone />;
221
+ return <GlossExample originalLanguage="zh" examples={[GlossExampleText]} />;
116
222
  };