@ndla/ui 55.0.16-alpha.0 → 55.0.17-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (305) hide show
  1. package/dist/panda.buildinfo.json +114 -23
  2. package/dist/styles.css +411 -81
  3. package/es/Article/Article.js +101 -162
  4. package/es/Article/ArticleByline.js +23 -23
  5. package/es/Article/ArticleFootNotes.js +8 -8
  6. package/es/Article/ArticleParagraph.js +2 -2
  7. package/es/Article/index.js +3 -5
  8. package/es/AudioPlayer/AudioPlayer.js +20 -20
  9. package/es/AudioPlayer/Controls.js +45 -45
  10. package/es/AudioPlayer/SpeechControl.js +8 -8
  11. package/es/BlogPost/BlogPost.js +6 -6
  12. package/es/Breadcrumb/Breadcrumb.js +19 -29
  13. package/es/Breadcrumb/BreadcrumbItem.js +20 -49
  14. package/es/Breadcrumb/HomeBreadcrumb.js +36 -82
  15. package/es/CampaignBlock/CampaignBlock.js +12 -12
  16. package/es/CodeBlock/CodeBlock.js +2 -2
  17. package/es/Concept/Concept.js +11 -11
  18. package/es/ContactBlock/ContactBlock.js +170 -185
  19. package/es/ContactBlock/index.js +3 -3
  20. package/es/ContentLoader/index.js +12 -12
  21. package/es/ContentPlaceholder/ContentPlaceholder.js +3 -3
  22. package/es/ContentTypeBadge/ContentTypeBadge.js +81 -80
  23. package/es/ContentTypeBadge/ContentTypeBadgeNew.js +2 -2
  24. package/es/ContentTypeHero/ContentTypeHero.js +50 -0
  25. package/es/{Logo → ContentTypeHero}/index.js +2 -3
  26. package/es/CopyParagraphButton/CopyParagraphButton.js +13 -12
  27. package/es/Embed/AudioEmbed.js +7 -7
  28. package/es/Embed/BrightcoveEmbed.js +8 -8
  29. package/es/Embed/CodeEmbed.js +6 -6
  30. package/es/Embed/ConceptEmbed.js +13 -13
  31. package/es/Embed/ConceptListEmbed.js +9 -9
  32. package/es/Embed/ContentLinkEmbed.js +6 -6
  33. package/es/Embed/CopyrightEmbed.js +3 -3
  34. package/es/Embed/EmbedErrorPlaceholder.js +5 -5
  35. package/es/Embed/ExternalEmbed.js +5 -5
  36. package/es/Embed/FootnoteEmbed.js +5 -5
  37. package/es/Embed/GlossEmbed.js +11 -11
  38. package/es/Embed/H5pEmbed.js +5 -5
  39. package/es/Embed/IframeEmbed.js +6 -6
  40. package/es/Embed/ImageEmbed.js +10 -10
  41. package/es/Embed/InlineTriggerButton.js +2 -2
  42. package/es/Embed/RelatedContentEmbed.js +5 -5
  43. package/es/Embed/UnknownEmbed.js +3 -3
  44. package/es/Embed/UuDisclaimerEmbed.js +6 -6
  45. package/es/ErrorMessage/ErrorMessage.js +14 -14
  46. package/es/ErrorMessage/ErrorResourceAccessDenied.js +6 -6
  47. package/es/FactBox/FactBox.js +5 -5
  48. package/es/FileList/File.js +3 -3
  49. package/es/FileList/FileList.js +6 -6
  50. package/es/FileList/Format.js +6 -6
  51. package/es/FileList/PdfFile.js +5 -5
  52. package/es/FrontpageArticle/FrontpageArticle.js +6 -6
  53. package/es/Gloss/Gloss.js +23 -23
  54. package/es/Gloss/GlossExample.js +9 -9
  55. package/es/Grid/Grid.js +4 -4
  56. package/es/KeyFigure/KeyFigure.js +5 -5
  57. package/es/Layout/LayoutItem.js +25 -37
  58. package/es/Layout/OneColumn.js +33 -31
  59. package/es/Layout/PageContainer.js +21 -30
  60. package/es/LicenseByline/EmbedByline.js +21 -21
  61. package/es/LicenseByline/LicenseLink.js +3 -3
  62. package/es/LinkBlock/LinkBlock.js +8 -8
  63. package/es/LinkBlock/LinkBlockSection.js +4 -4
  64. package/es/Messages/MessageBox.js +11 -11
  65. package/es/Messages/index.js +1 -2
  66. package/es/ProgrammeCard/ProgrammeCard.js +5 -5
  67. package/es/RelatedArticleList/RelatedArticleList.js +15 -15
  68. package/es/ResourceBox/ResourceBox.js +9 -9
  69. package/es/SnackBar/DefaultSnackbar.js +5 -5
  70. package/es/SnackBar/SnackbarProvider.js +7 -7
  71. package/es/TagSelector/TagSelector.js +17 -17
  72. package/es/TreeStructure/AddFolderButton.js +4 -4
  73. package/es/TreeStructure/ComboboxButton.js +7 -7
  74. package/es/TreeStructure/FolderItem.js +13 -13
  75. package/es/TreeStructure/FolderItems.js +6 -6
  76. package/es/TreeStructure/TreeStructure.js +9 -9
  77. package/es/ZendeskButton/ZendeskButton.js +2 -2
  78. package/es/i18n/index.js +1 -1
  79. package/es/index.js +5 -11
  80. package/es/locale/messages-en.js +1 -1
  81. package/es/locale/messages-nb.js +1 -1
  82. package/es/locale/messages-nn.js +1 -1
  83. package/es/locale/messages-se.js +1 -1
  84. package/es/locale/messages-sma.js +1 -1
  85. package/es/styles.css +411 -81
  86. package/lib/Article/Article.d.ts +9 -30
  87. package/lib/Article/Article.js +104 -164
  88. package/lib/Article/ArticleByline.js +23 -23
  89. package/lib/Article/ArticleFootNotes.js +8 -8
  90. package/lib/Article/ArticleParagraph.js +2 -2
  91. package/lib/Article/index.d.ts +2 -5
  92. package/lib/Article/index.js +18 -24
  93. package/lib/AudioPlayer/AudioPlayer.js +20 -20
  94. package/lib/AudioPlayer/Controls.js +45 -45
  95. package/lib/AudioPlayer/SpeechControl.js +8 -8
  96. package/lib/BlogPost/BlogPost.js +6 -6
  97. package/lib/Breadcrumb/Breadcrumb.js +21 -29
  98. package/lib/Breadcrumb/BreadcrumbItem.js +22 -50
  99. package/lib/Breadcrumb/HomeBreadcrumb.d.ts +1 -2
  100. package/lib/Breadcrumb/HomeBreadcrumb.js +38 -82
  101. package/lib/CampaignBlock/CampaignBlock.js +12 -12
  102. package/lib/CodeBlock/CodeBlock.js +2 -2
  103. package/lib/Concept/Concept.js +11 -11
  104. package/lib/ContactBlock/ContactBlock.d.ts +6 -7
  105. package/lib/ContactBlock/ContactBlock.js +173 -184
  106. package/lib/ContactBlock/index.d.ts +3 -3
  107. package/lib/ContactBlock/index.js +13 -11
  108. package/lib/ContentLoader/index.js +12 -12
  109. package/lib/ContentPlaceholder/ContentPlaceholder.js +3 -3
  110. package/lib/ContentTypeBadge/ContentTypeBadge.d.ts +11 -12
  111. package/lib/ContentTypeBadge/ContentTypeBadge.js +83 -80
  112. package/lib/ContentTypeBadge/ContentTypeBadgeNew.js +2 -2
  113. package/lib/ContentTypeHero/ContentTypeHero.d.ts +15 -0
  114. package/lib/ContentTypeHero/ContentTypeHero.js +57 -0
  115. package/lib/ContentTypeHero/index.d.ts +9 -0
  116. package/lib/ContentTypeHero/index.js +12 -0
  117. package/lib/CopyParagraphButton/CopyParagraphButton.js +13 -12
  118. package/lib/Embed/AudioEmbed.js +7 -7
  119. package/lib/Embed/BrightcoveEmbed.js +8 -8
  120. package/lib/Embed/CodeEmbed.js +6 -6
  121. package/lib/Embed/ConceptEmbed.js +13 -13
  122. package/lib/Embed/ConceptListEmbed.js +9 -9
  123. package/lib/Embed/ContentLinkEmbed.js +6 -6
  124. package/lib/Embed/CopyrightEmbed.js +3 -3
  125. package/lib/Embed/EmbedErrorPlaceholder.js +5 -5
  126. package/lib/Embed/ExternalEmbed.js +5 -5
  127. package/lib/Embed/FootnoteEmbed.js +5 -5
  128. package/lib/Embed/GlossEmbed.js +11 -11
  129. package/lib/Embed/H5pEmbed.js +5 -5
  130. package/lib/Embed/IframeEmbed.js +6 -6
  131. package/lib/Embed/ImageEmbed.js +10 -10
  132. package/lib/Embed/InlineTriggerButton.js +2 -2
  133. package/lib/Embed/RelatedContentEmbed.js +5 -5
  134. package/lib/Embed/UnknownEmbed.js +3 -3
  135. package/lib/Embed/UuDisclaimerEmbed.js +6 -6
  136. package/lib/ErrorMessage/ErrorMessage.js +14 -14
  137. package/lib/ErrorMessage/ErrorResourceAccessDenied.js +6 -6
  138. package/lib/FactBox/FactBox.js +5 -5
  139. package/lib/FileList/File.js +3 -3
  140. package/lib/FileList/FileList.js +6 -6
  141. package/lib/FileList/Format.js +6 -6
  142. package/lib/FileList/PdfFile.js +5 -5
  143. package/lib/FrontpageArticle/FrontpageArticle.js +6 -6
  144. package/lib/Gloss/Gloss.js +23 -23
  145. package/lib/Gloss/GlossExample.js +9 -9
  146. package/lib/Grid/Grid.js +4 -4
  147. package/lib/KeyFigure/KeyFigure.js +5 -5
  148. package/lib/Layout/LayoutItem.d.ts +3 -7
  149. package/lib/Layout/LayoutItem.js +27 -38
  150. package/lib/Layout/OneColumn.d.ts +3 -6
  151. package/lib/Layout/OneColumn.js +36 -33
  152. package/lib/Layout/PageContainer.d.ts +3 -6
  153. package/lib/Layout/PageContainer.js +24 -32
  154. package/lib/LicenseByline/EmbedByline.js +21 -21
  155. package/lib/LicenseByline/LicenseLink.js +3 -3
  156. package/lib/LinkBlock/LinkBlock.js +8 -8
  157. package/lib/LinkBlock/LinkBlockSection.js +4 -4
  158. package/lib/Messages/MessageBox.js +11 -11
  159. package/lib/Messages/index.d.ts +1 -2
  160. package/lib/Messages/index.js +0 -7
  161. package/lib/ProgrammeCard/ProgrammeCard.js +5 -5
  162. package/lib/RelatedArticleList/RelatedArticleList.js +15 -15
  163. package/lib/ResourceBox/ResourceBox.js +9 -9
  164. package/lib/SnackBar/DefaultSnackbar.js +5 -5
  165. package/lib/SnackBar/SnackbarProvider.js +7 -7
  166. package/lib/TagSelector/TagSelector.js +17 -17
  167. package/lib/TreeStructure/AddFolderButton.js +4 -4
  168. package/lib/TreeStructure/ComboboxButton.js +7 -7
  169. package/lib/TreeStructure/FolderItem.js +13 -13
  170. package/lib/TreeStructure/FolderItems.js +6 -6
  171. package/lib/TreeStructure/TreeStructure.js +9 -9
  172. package/lib/ZendeskButton/ZendeskButton.js +2 -2
  173. package/lib/i18n/index.d.ts +1 -1
  174. package/lib/i18n/index.js +6 -0
  175. package/lib/index.d.ts +8 -14
  176. package/lib/index.js +30 -132
  177. package/lib/locale/messages-en.js +1 -1
  178. package/lib/locale/messages-nb.js +1 -1
  179. package/lib/locale/messages-nn.js +1 -1
  180. package/lib/locale/messages-se.js +1 -1
  181. package/lib/locale/messages-sma.js +1 -1
  182. package/lib/styles.css +411 -81
  183. package/package.json +10 -10
  184. package/src/Article/Article.tsx +101 -229
  185. package/src/Article/index.ts +3 -7
  186. package/src/Breadcrumb/Breadcrumb.tsx +20 -18
  187. package/src/Breadcrumb/BreadcrumbItem.tsx +36 -59
  188. package/src/Breadcrumb/HomeBreadcrumb.stories.tsx +0 -12
  189. package/src/Breadcrumb/HomeBreadcrumb.tsx +33 -46
  190. package/src/ContactBlock/{Contactblock.stories.tsx → ContactBlock.stories.tsx} +3 -4
  191. package/src/ContactBlock/ContactBlock.tsx +165 -199
  192. package/src/ContactBlock/index.ts +3 -3
  193. package/src/ContentTypeBadge/ContentTypeBadge.tsx +77 -77
  194. package/src/ContentTypeHero/ContentTypeHero.stories.tsx +76 -0
  195. package/src/ContentTypeHero/ContentTypeHero.tsx +55 -0
  196. package/src/ContentTypeHero/index.ts +10 -0
  197. package/src/CopyParagraphButton/CopyParagraphButton.tsx +10 -3
  198. package/src/Embed/AudioEmbed.stories.tsx +6 -8
  199. package/src/Embed/BrightcoveEmbed.stories.tsx +6 -8
  200. package/src/Embed/ConceptEmbed.stories.tsx +6 -8
  201. package/src/Embed/ExternalEmbed.stories.tsx +5 -5
  202. package/src/Embed/H5pEmbed.stories.tsx +6 -8
  203. package/src/Embed/IframeEmbed.stories.tsx +6 -8
  204. package/src/Embed/ImageEmbed.stories.tsx +6 -8
  205. package/src/Embed/RelatedContentEmbed.stories.tsx +6 -8
  206. package/src/Embed/UuDisclaimerEmbed.stories.tsx +6 -8
  207. package/src/Layout/LayoutItem.tsx +25 -41
  208. package/src/Layout/OneColumn.tsx +33 -33
  209. package/src/Layout/PageContainer.tsx +22 -24
  210. package/src/Messages/index.ts +1 -2
  211. package/src/i18n/index.ts +1 -0
  212. package/src/index.ts +11 -33
  213. package/src/locale/messages-en.ts +1 -1
  214. package/src/locale/messages-nb.ts +1 -1
  215. package/src/locale/messages-nn.ts +1 -1
  216. package/src/locale/messages-se.ts +1 -1
  217. package/src/locale/messages-sma.ts +1 -1
  218. package/es/Article/ArticleHeaderWrapper.js +0 -33
  219. package/es/Hero/Hero.js +0 -68
  220. package/es/Hero/HeroContent.js +0 -16
  221. package/es/Hero/index.js +0 -10
  222. package/es/LanguageSelector/LanguageSelector.js +0 -87
  223. package/es/LanguageSelector/index.js +0 -10
  224. package/es/Logo/Logo.js +0 -52
  225. package/es/Logo/SvgLogo.js +0 -54
  226. package/es/Messages/MessageBanner.js +0 -72
  227. package/es/Search/ActiveFilterContent.js +0 -40
  228. package/es/Search/ActiveFilters.js +0 -112
  229. package/es/Search/ContentTypeResult.js +0 -151
  230. package/es/Search/ContentTypeResultStyles.js +0 -51
  231. package/es/Search/IsPathToHighlight.js +0 -12
  232. package/es/Search/LoadingWrapper.js +0 -31
  233. package/es/Search/SearchField.js +0 -110
  234. package/es/Search/SearchFieldForm.js +0 -33
  235. package/es/Search/SearchResult.js +0 -185
  236. package/es/Search/SearchResultSleeve.js +0 -229
  237. package/es/Search/index.js +0 -12
  238. package/lib/Article/ArticleHeaderWrapper.d.ts +0 -14
  239. package/lib/Article/ArticleHeaderWrapper.js +0 -40
  240. package/lib/Hero/Hero.d.ts +0 -25
  241. package/lib/Hero/Hero.js +0 -83
  242. package/lib/Hero/HeroContent.d.ts +0 -12
  243. package/lib/Hero/HeroContent.js +0 -23
  244. package/lib/Hero/index.d.ts +0 -10
  245. package/lib/Hero/index.js +0 -61
  246. package/lib/LanguageSelector/LanguageSelector.d.ts +0 -15
  247. package/lib/LanguageSelector/LanguageSelector.js +0 -92
  248. package/lib/LanguageSelector/index.d.ts +0 -9
  249. package/lib/LanguageSelector/index.js +0 -13
  250. package/lib/Logo/Logo.d.ts +0 -20
  251. package/lib/Logo/Logo.js +0 -58
  252. package/lib/Logo/SvgLogo.d.ts +0 -14
  253. package/lib/Logo/SvgLogo.js +0 -62
  254. package/lib/Logo/index.d.ts +0 -9
  255. package/lib/Logo/index.js +0 -16
  256. package/lib/Messages/MessageBanner.d.ts +0 -16
  257. package/lib/Messages/MessageBanner.js +0 -77
  258. package/lib/Search/ActiveFilterContent.d.ts +0 -23
  259. package/lib/Search/ActiveFilterContent.js +0 -47
  260. package/lib/Search/ActiveFilters.d.ts +0 -19
  261. package/lib/Search/ActiveFilters.js +0 -119
  262. package/lib/Search/ContentTypeResult.d.ts +0 -29
  263. package/lib/Search/ContentTypeResult.js +0 -159
  264. package/lib/Search/ContentTypeResultStyles.d.ts +0 -45
  265. package/lib/Search/ContentTypeResultStyles.js +0 -58
  266. package/lib/Search/IsPathToHighlight.d.ts +0 -8
  267. package/lib/Search/IsPathToHighlight.js +0 -19
  268. package/lib/Search/LoadingWrapper.d.ts +0 -12
  269. package/lib/Search/LoadingWrapper.js +0 -38
  270. package/lib/Search/SearchField.d.ts +0 -25
  271. package/lib/Search/SearchField.js +0 -117
  272. package/lib/Search/SearchFieldForm.d.ts +0 -15
  273. package/lib/Search/SearchFieldForm.js +0 -41
  274. package/lib/Search/SearchResult.d.ts +0 -43
  275. package/lib/Search/SearchResult.js +0 -194
  276. package/lib/Search/SearchResultSleeve.d.ts +0 -25
  277. package/lib/Search/SearchResultSleeve.js +0 -237
  278. package/lib/Search/index.d.ts +0 -11
  279. package/lib/Search/index.js +0 -33
  280. package/src/Article/ArticleHeaderWrapper.tsx +0 -38
  281. package/src/Hero/Hero.stories.tsx +0 -35
  282. package/src/Hero/Hero.tsx +0 -129
  283. package/src/Hero/HeroContent.tsx +0 -43
  284. package/src/Hero/index.ts +0 -21
  285. package/src/LanguageSelector/LanguageSelector.stories.tsx +0 -44
  286. package/src/LanguageSelector/LanguageSelector.tsx +0 -101
  287. package/src/LanguageSelector/index.ts +0 -11
  288. package/src/Logo/Logo.stories.tsx +0 -47
  289. package/src/Logo/Logo.tsx +0 -47
  290. package/src/Logo/SvgLogo.tsx +0 -48
  291. package/src/Logo/index.ts +0 -11
  292. package/src/Messages/MessageBanner.stories.tsx +0 -31
  293. package/src/Messages/MessageBanner.tsx +0 -67
  294. package/src/Search/ActiveFilterContent.tsx +0 -64
  295. package/src/Search/ActiveFilters.tsx +0 -145
  296. package/src/Search/ContentTypeResult.tsx +0 -190
  297. package/src/Search/ContentTypeResultStyles.tsx +0 -172
  298. package/src/Search/IsPathToHighlight.ts +0 -12
  299. package/src/Search/LoadingWrapper.tsx +0 -44
  300. package/src/Search/SearchField.tsx +0 -175
  301. package/src/Search/SearchFieldForm.tsx +0 -64
  302. package/src/Search/SearchResult.tsx +0 -368
  303. package/src/Search/SearchResultSleeve.tsx +0 -367
  304. package/src/Search/__tests__/Highlight-test.ts +0 -66
  305. package/src/Search/index.ts +0 -14
@@ -6,69 +6,56 @@
6
6
  *
7
7
  */
8
8
 
9
- import styled from "@emotion/styled";
10
- import { breakpoints, colors, fonts, mq, spacing } from "@ndla/core";
11
9
  import { ChevronRight, Home } from "@ndla/icons/common";
12
10
  import { SafeLink } from "@ndla/safelink";
11
+ import { styled } from "@ndla/styled-system/jsx";
13
12
  import Breadcrumb from "./Breadcrumb";
14
13
  import { IndexedBreadcrumbItem, SimpleBreadcrumbItem } from "./BreadcrumbItem";
15
14
 
16
- interface ThemeProps {
17
- light: boolean | undefined;
18
- }
15
+ const StyledSafeLink = styled(SafeLink, {
16
+ base: {
17
+ color: "inherit",
18
+ textDecoration: "underline",
19
+ _hover: {
20
+ textDecoration: "none",
21
+ },
22
+ _focusVisible: {
23
+ textDecoration: "none",
24
+ },
25
+ },
26
+ });
19
27
 
20
- const StyledSeparator = styled.div<ThemeProps>`
21
- ${fonts.sizes("14px")};
22
- margin: 0 ${spacing.small};
23
- user-select: none;
24
- color: ${({ light }) => (light ? colors.white : colors.text.primary)};
25
- ${mq.range({ until: breakpoints.tablet })} {
26
- display: none;
27
- }
28
- `;
28
+ const StyledChevronRight = styled(ChevronRight, {
29
+ base: {
30
+ tabletDown: {
31
+ display: "none",
32
+ },
33
+ },
34
+ });
29
35
 
30
- const StyledIconSafeLink = styled(SafeLink)`
31
- box-shadow: none;
32
- border-bottom: none;
33
- `;
34
- const StyledHome = styled(Home)<ThemeProps>`
35
- width: 20px;
36
- height: 20px;
37
- color: ${({ light }) => (light ? colors.white : colors.text.primary)};
38
- `;
39
- const StyledRightChevron = styled(ChevronRight)<ThemeProps>`
40
- color: ${({ light }) => (light ? colors.white : colors.text.primary)};
41
- margin: ${spacing.xxsmall};
42
- `;
43
- const StyledSpan = styled.span<ThemeProps>`
44
- color: ${({ light }) => (light ? colors.white : colors.text.primary)};
45
- `;
46
- const StyledSafeLink = styled(SafeLink)<ThemeProps>`
47
- color: ${({ light }) => (light ? colors.white : colors.text.primary)};
48
- `;
36
+ const IconSafeLink = styled(SafeLink, {
37
+ base: {
38
+ color: "inherit",
39
+ },
40
+ });
49
41
 
50
42
  interface Props {
51
43
  items: SimpleBreadcrumbItem[];
52
- light?: boolean;
53
44
  }
54
45
 
55
- const HomeBreadcrumb = ({ items, light }: Props) => {
46
+ const HomeBreadcrumb = ({ items }: Props) => {
56
47
  const renderItem = (item: IndexedBreadcrumbItem, totalCount: number) => {
57
48
  if (item.index === totalCount - 1) {
58
- return <StyledSpan light={light}>{item.name}</StyledSpan>;
49
+ return <span>{item.name}</span>;
59
50
  }
60
51
  if (item.index === 0 && typeof item.name === "string") {
61
52
  return (
62
- <StyledIconSafeLink aria-label={item.name} to={item.to}>
63
- <StyledHome title={item.name} light={light} />
64
- </StyledIconSafeLink>
53
+ <IconSafeLink aria-label={item.name} to={item.to}>
54
+ <Home title={item.name} />
55
+ </IconSafeLink>
65
56
  );
66
57
  }
67
- return (
68
- <StyledSafeLink light={light} to={item.to}>
69
- {item.name}
70
- </StyledSafeLink>
71
- );
58
+ return <StyledSafeLink to={item.to}>{item.name}</StyledSafeLink>;
72
59
  };
73
60
 
74
61
  const renderSeparator = (item: IndexedBreadcrumbItem, totalCount: number) => {
@@ -76,9 +63,9 @@ const HomeBreadcrumb = ({ items, light }: Props) => {
76
63
  return null;
77
64
  }
78
65
  if (item.index === 0) {
79
- return <StyledSeparator light={light}>|</StyledSeparator>;
66
+ return <StyledChevronRight />;
80
67
  }
81
- return <StyledRightChevron light={light} />;
68
+ return <ChevronRight />;
82
69
  };
83
70
 
84
71
  return <Breadcrumb items={items} renderItem={renderItem} renderSeparator={renderSeparator} />;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright (c) 2023-present, NDLA.
2
+ * Copyright (c) 2024-present, NDLA.
3
3
  *
4
4
  * This source code is licensed under the GPLv3 license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -7,7 +7,7 @@
7
7
  */
8
8
 
9
9
  import { Meta, StoryFn } from "@storybook/react";
10
- import ContactBlock from "./ContactBlock";
10
+ import { ContactBlock } from "./ContactBlock";
11
11
 
12
12
  export default {
13
13
  title: "Components/Contact block",
@@ -76,8 +76,7 @@ export default {
76
76
  "Sigurd har variert ledererfaring fra utdanningssektoren, både fra videregående skole, nasjonalt senter og fra universitets/høgskolesektoren. Ansvarsområdene dekker bl.a. utdanning/opplæring/studiekvalitet, økonomi, HR, stratgi og IT-utvikling/-drift.",
77
77
  name: "Sigurd Trageton",
78
78
  email: "sigurd@ndla.no",
79
- blobColor: "green",
80
- blob: "pointy",
79
+ backgroundColor: "strong",
81
80
  },
82
81
  } as Meta<typeof ContactBlock>;
83
82
 
@@ -1,233 +1,199 @@
1
1
  /**
2
- * Copyright (c) 2023-present, NDLA.
2
+ * Copyright (c) 2024-present, NDLA.
3
3
  *
4
4
  * This source code is licensed under the GPLv3 license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
7
  */
8
8
 
9
- /** @jsxImportSource @emotion/react */
10
- import { ReactNode } from "react";
11
9
  import { useTranslation } from "react-i18next";
12
- import { css } from "@emotion/react";
13
- import styled from "@emotion/styled";
14
- import { spacing, fonts, colors, mq, breakpoints, misc } from "@ndla/core";
15
- import { BlobPointy as UnstyledBlobPointy, BlobRound as UnstyledBlobRound } from "@ndla/icons/common";
16
- import { COPYRIGHTED, getLicenseByAbbreviation } from "@ndla/licenses";
17
- import { Image } from "@ndla/primitives";
18
- import { IAuthor, IImageMetaInformationV3 } from "@ndla/types-backend/image-api";
19
- import { CanonicalUrlFuncs } from "../Embed";
20
- import { errorSvgSrc } from "../Embed/ImageEmbed";
21
- import { LicenseLink } from "../LicenseByline/LicenseLink";
10
+ import { Text } from "@ndla/primitives";
11
+ import { styled } from "@ndla/styled-system/jsx";
12
+ import { SystemStyleObject } from "@ndla/styled-system/types";
13
+ import { IImageMetaInformationV3 } from "@ndla/types-backend/image-api";
14
+ import { LicenseContainerContent } from "../LicenseByline/EmbedByline";
15
+
16
+ export type ContactBlockBackground = "strong" | "moderate" | "subtle";
17
+
18
+ const BackgroundVariant: Record<ContactBlockBackground, SystemStyleObject> = {
19
+ strong: { _before: { backgroundColor: "surface.brand.3" } },
20
+ moderate: { _before: { backgroundColor: "surface.brand.3.moderate" } },
21
+ subtle: { _before: { backgroundColor: "surface.brand.3.subtle" } },
22
+ };
22
23
 
23
- const BLOB_WIDTH = 90;
24
+ export const contactBlockBackgrounds = Object.keys(BackgroundVariant) as ContactBlockBackground[];
25
+
26
+ const StyledWrapper = styled("div", {
27
+ base: {
28
+ display: "flex",
29
+ maxWidth: "744px",
30
+ minWidth: "surface.xxsmall",
31
+ padding: "medium",
32
+ alignItems: "center",
33
+ justifyContent: "space-between",
34
+ boxShadow: "full",
35
+ border: "1px solid",
36
+ gap: "medium",
37
+ position: "relative",
38
+ borderColor: "stroke.default",
39
+ borderRadius: "xsmall",
40
+ overflow: "hidden",
41
+ background: "surface.default",
42
+ flexDirection: "column-reverse",
43
+ tablet: {
44
+ alignItems: "unset",
45
+ flexDirection: "row",
46
+ },
47
+ },
48
+ });
49
+
50
+ const EmailLink = styled("a", {
51
+ base: {
52
+ color: "text.default",
53
+ textDecoration: "underline",
54
+ _hover: { textDecoration: "none" },
55
+ _focusVisible: { textDecoration: "none" },
56
+ },
57
+ });
58
+
59
+ const HeaderWrapper = styled("div", {
60
+ base: {
61
+ position: "relative",
62
+ display: "flex",
63
+ flexDirection: "column",
64
+ gap: "3xsmall",
65
+ zIndex: "base",
66
+ _before: {
67
+ content: '""',
68
+ position: "absolute",
69
+ top: "-60px",
70
+ left: "-50px",
71
+ right: "0",
72
+ bottom: "0",
73
+ height: "calc(100% + 50px)",
74
+ width: "surface.3xlarge",
75
+ transform: "rotate(-4deg)",
76
+ zIndex: "hide",
77
+ },
78
+ },
79
+ variants: {
80
+ variant: BackgroundVariant,
81
+ imageExists: {
82
+ true: {
83
+ tabletDown: {
84
+ _before: {
85
+ display: "none",
86
+ },
87
+ },
88
+ },
89
+ },
90
+ },
91
+ });
92
+
93
+ const ImageWrapper = styled("div", {
94
+ base: {
95
+ display: "flex",
96
+ gap: "xxsmall",
97
+ alignItems: "flex-start",
98
+ justifyContent: "flex-start",
99
+ flexDirection: "column",
100
+ zIndex: "base",
101
+ tabletDown: {
102
+ _before: {
103
+ content: '""',
104
+ position: "absolute",
105
+ top: "-50px",
106
+ left: "-50px",
107
+ right: "0",
108
+ bottom: "0",
109
+ height: "surface.xxsmall",
110
+ width: "surface.3xlarge",
111
+ transform: "rotate(-4deg)",
112
+ zIndex: "hide",
113
+ },
114
+ },
115
+ },
116
+ variants: {
117
+ variant: BackgroundVariant,
118
+ },
119
+ });
120
+
121
+ const StyledImage = styled("img", {
122
+ base: {
123
+ borderRadius: "xsmall",
124
+ width: "surface.xsmall",
125
+ height: "surface.xsmall",
126
+ objectFit: "cover",
127
+ },
128
+ });
129
+
130
+ const ContentWrapper = styled("div", {
131
+ base: {
132
+ display: "flex",
133
+ flexDirection: "column",
134
+ gap: "medium",
135
+ flex: "1",
136
+ width: "100%",
137
+ },
138
+ });
139
+
140
+ const StyledDescription = styled(Text, {
141
+ base: {
142
+ fontFamily: "serif",
143
+ },
144
+ });
24
145
 
25
146
  interface Props {
26
147
  image?: IImageMetaInformationV3;
27
148
  jobTitle: string;
28
149
  description: string;
29
- blobColor?: "pink" | "green";
30
- blob?: "pointy" | "round";
150
+ backgroundColor?: ContactBlockBackground;
31
151
  imageWidth?: number;
32
152
  name: string;
33
153
  email: string;
34
154
  embedAlt?: string;
35
155
  lang?: string;
36
- imageCanonicalUrl?: CanonicalUrlFuncs["image"];
37
- }
38
- const BlockWrapper = styled.div`
39
- display: flex;
40
- position: relative;
41
- flex-direction: column;
42
- padding: 0 0 ${spacing.medium} ${spacing.medium};
43
- font-family: ${fonts.sans};
44
- border-radius: ${misc.borderRadius};
45
- border: 1px solid ${colors.brand.lighter};
46
- background-color: ${colors.white};
47
- & ~ & {
48
- margin-top: ${spacing.medium};
49
- }
50
- ${mq.range({ from: breakpoints.tablet })} {
51
- max-width: 773px;
52
- flex-direction: row;
53
- padding: 0 0 ${spacing.medium} ${spacing.medium};
54
- gap: ${spacing.nsmall};
55
- }
56
- `;
57
-
58
- const StyledHeader = styled.div`
59
- ${fonts.sizes("22px", "30px")};
60
- font-weight: ${fonts.weight.bold};
61
- margin: 0 0 ${spacing.xsmall} 0;
62
- padding-top: ${spacing.medium};
63
- `;
64
-
65
- const StyledText = styled.div`
66
- display: flex;
67
- ${fonts.sizes("16px", "26px")};
68
- overflow-wrap: anywhere;
69
- color: ${colors.text.light};
70
- gap: ${spacing.xxsmall};
71
- `;
72
-
73
- const EmailLink = styled.a`
74
- color: ${colors.text.light};
75
- text-decoration-color: ${colors.text.light};
76
- text-decoration-style: solid;
77
- text-decoration: underline;
78
- box-shadow: unset;
79
- `;
80
-
81
- const SummaryBlock = styled.p`
82
- font-family: ${fonts.sans};
83
- padding: 0;
84
- max-width: calc(100% - (${BLOB_WIDTH}px / 2));
85
- ${mq.range({ from: breakpoints.tabletWide })} {
86
- padding-top: 0;
87
- }
88
- `;
89
-
90
- const InfoWrapper = styled.div`
91
- max-width: calc(100% - ${BLOB_WIDTH}px);
92
- `;
93
-
94
- const TextWrapper = styled.div`
95
- display: flex;
96
- overflow: hidden;
97
- justify-content: space-between;
98
- `;
99
-
100
- const BlobWrapper = styled.div`
101
- height: 180px;
102
- width: ${BLOB_WIDTH}px;
103
- position: absolute;
104
- overflow: hidden;
105
- right: 0px;
106
- `;
107
-
108
- const ImageWrapper = styled.div`
109
- display: flex;
110
- flex-direction: column;
111
- gap: ${spacing.xsmall};
112
- ${fonts.sizes("16px", "26px")};
113
- padding: ${spacing.medium} ${spacing.medium} 0 0;
114
- ${mq.range({ from: breakpoints.tablet })} {
115
- padding-right: 0;
116
- }
117
- `;
118
-
119
- const blobStyling = css`
120
- width: 165px;
121
- height: 180px;
122
- transform: translate(10%, 0);
123
- color: ${colors.support.redLight};
124
- &[data-green="true"] {
125
- color: ${colors.support.greenLight};
126
- }
127
- `;
128
-
129
- const BlobPointy = styled(UnstyledBlobPointy)`
130
- ${blobStyling}
131
- `;
132
-
133
- const BlobRound = styled(UnstyledBlobRound)`
134
- ${blobStyling}
135
- `;
136
- const Email = styled.div`
137
- white-space: nowrap;
138
- `;
139
-
140
- const ContentWrapper = styled.div`
141
- width: 100%;
142
- `;
143
-
144
- const StyledImage = styled(Image)`
145
- object-fit: cover;
146
- `;
147
-
148
- interface LinkWrapperProps {
149
- src?: string;
150
- children: ReactNode;
151
156
  }
152
157
 
153
- const StyledLink = styled.a`
154
- text-decoration: none;
155
- `;
156
-
157
- const LinkWrapper = ({ src, children }: LinkWrapperProps) => {
158
- if (src) {
159
- return (
160
- <StyledLink target="_blank" href={src} rel="noopener noreferrer">
161
- {children}
162
- </StyledLink>
163
- );
164
- }
165
- return children;
166
- };
167
-
168
- const ContactBlock = ({
158
+ export const ContactBlock = ({
169
159
  image,
170
160
  jobTitle,
171
161
  description,
172
162
  name,
173
163
  email,
174
164
  embedAlt,
175
- blobColor = "green",
176
- blob = "pointy",
177
- imageCanonicalUrl,
178
165
  lang,
166
+ backgroundColor = "strong",
179
167
  }: Props) => {
180
- const { t, i18n } = useTranslation();
181
- const isGreenBlob = blobColor === "green";
182
- const Blob = blob === "pointy" ? BlobPointy : BlobRound;
183
- const authors = [image?.copyright.processors, image?.copyright.creators, image?.copyright.rightsholders]
184
- .filter((authors) => !!authors?.length)
185
- .reduce<IAuthor[]>((acc, val) => acc.concat(val!), []);
186
- const license = image?.copyright
187
- ? getLicenseByAbbreviation(image.copyright.license.license, i18n.language)
188
- : undefined;
189
-
190
- const isCopyrighted = image?.copyright.license.license.toLowerCase() === COPYRIGHTED;
191
-
168
+ const { t } = useTranslation();
192
169
  return (
193
- <BlockWrapper>
194
- <ImageWrapper>
195
- {image ? (
196
- <>
197
- <LinkWrapper src={!isCopyrighted && image ? imageCanonicalUrl?.(image) : undefined}>
198
- <StyledImage
199
- alt={embedAlt !== undefined ? embedAlt : image.alttext.alttext}
200
- src={image.image.imageUrl}
201
- sizes={`(min-width: ${breakpoints.tablet}) 240px, (max-width: ${breakpoints.tablet}) 500px`}
202
- />
203
- </LinkWrapper>
204
- <span>
205
- {`${t("embed.type.image")}: ${authors.map((author) => `${author?.name}`).join(", ")} `}
206
- {!!license && <LicenseLink license={license} />}
207
- </span>
208
- </>
209
- ) : (
210
- <img alt={t("image.error.url")} src={errorSvgSrc} />
211
- )}
212
- </ImageWrapper>
170
+ <StyledWrapper>
213
171
  <ContentWrapper>
214
- <TextWrapper>
215
- <InfoWrapper>
216
- <StyledHeader lang={lang}>{name}</StyledHeader>
217
- <StyledText lang={lang}>{jobTitle}</StyledText>
218
- <StyledText>
219
- <Email>{`${t("email")}:`}</Email>
220
- <EmailLink href={`mailto:${email}`}>{email}</EmailLink>
221
- </StyledText>
222
- </InfoWrapper>
223
- <BlobWrapper>
224
- <Blob data-green={isGreenBlob} />
225
- </BlobWrapper>
226
- </TextWrapper>
227
- <SummaryBlock>{description}</SummaryBlock>
172
+ <HeaderWrapper variant={backgroundColor} imageExists={!!image}>
173
+ {/* TODO: The font in the design specified `Source Sans Pro` and this is the default `Satoshi` */}
174
+ <Text lang={lang} fontWeight="bold" textStyle="heading.small">
175
+ {name}
176
+ </Text>
177
+ <Text lang={lang}>{jobTitle}</Text>
178
+ <Text>
179
+ {`${t("email")}: `}
180
+ <EmailLink href={`mailto:${email}`}>{email}</EmailLink>
181
+ </Text>
182
+ </HeaderWrapper>
183
+ <StyledDescription textStyle="body.large">{description}</StyledDescription>
228
184
  </ContentWrapper>
229
- </BlockWrapper>
185
+ {image && (
186
+ <ImageWrapper variant={backgroundColor}>
187
+ <StyledImage
188
+ alt={embedAlt !== undefined ? embedAlt : image.alttext.alttext}
189
+ src={image.image.imageUrl}
190
+ width={300}
191
+ height={300}
192
+ />
193
+ {/* TODO: The font in the design specified `Source Sans Pro` and this is the default `Satoshi` */}
194
+ <LicenseContainerContent type="image" copyright={image.copyright} />
195
+ </ImageWrapper>
196
+ )}
197
+ </StyledWrapper>
230
198
  );
231
199
  };
232
-
233
- export default ContactBlock;
@@ -1,10 +1,10 @@
1
1
  /**
2
- * Copyright (c) 2023-present, NDLA.
2
+ * Copyright (c) 2024-present, NDLA.
3
3
  *
4
4
  * This source code is licensed under the GPLv3 license found in the
5
5
  * LICENSE file in the root directory of this source tree.
6
6
  *
7
7
  */
8
- import ContactBlock from "./ContactBlock";
9
8
 
10
- export default ContactBlock;
9
+ export { ContactBlock, contactBlockBackgrounds } from "./ContactBlock";
10
+ export type { ContactBlockBackground } from "./ContactBlock";