@ndla/ui 30.1.0 → 30.2.1

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 (333) hide show
  1. package/es/Article/ArticleHeaderWrapper.js +75 -112
  2. package/es/Footer/FooterLinks.js +13 -10
  3. package/es/Frontpage/FrontpageFilm.js +11 -8
  4. package/es/Frontpage/FrontpageMultidisciplinarySubject.js +13 -10
  5. package/es/Frontpage/FrontpageToolbox.js +11 -8
  6. package/es/LearningPaths/LearningPathLastStepNavigation.js +11 -8
  7. package/es/LearningPaths/LearningPathMenuAside.js +13 -10
  8. package/es/LearningPaths/LearningPathMobileHeader.js +8 -6
  9. package/es/LearningPaths/LearningPathMobileStepInfo.js +8 -5
  10. package/es/Masthead/MastheadSearchModal.js +10 -7
  11. package/es/Messages/MessageBox.js +11 -12
  12. package/es/MyNdla/Resource/Folder.js +118 -57
  13. package/es/NDLAFilm/CategorySelect.js +106 -146
  14. package/es/Resource/BlockResource.js +45 -30
  15. package/es/Resource/ListResource.js +46 -41
  16. package/es/Resource/resourceComponents.js +29 -34
  17. package/es/SearchTypeResult/ActiveFilterContent.js +9 -6
  18. package/es/SearchTypeResult/SearchHeader.js +14 -12
  19. package/es/SearchTypeResult/SearchNotionsResult.js +5 -6
  20. package/es/SearchTypeResult/SearchTypeHeader.js +17 -15
  21. package/es/Subject/SubjectCarousel.js +11 -8
  22. package/es/ToolboxPage/ToolboxInfo.js +9 -6
  23. package/es/User/UserInfo.js +23 -2
  24. package/es/User/parseUserObject.js +22 -12
  25. package/es/locale/messages-en.js +5 -1
  26. package/es/locale/messages-nb.js +5 -1
  27. package/es/locale/messages-nn.js +5 -1
  28. package/es/locale/messages-se.js +33 -29
  29. package/es/locale/messages-sma.js +5 -1
  30. package/es/utils/createUniversalPortal.js +1 -1
  31. package/lib/Animation/DisplayOnPageYOffset.d.ts +2 -2
  32. package/lib/Animation/Fade.d.ts +2 -2
  33. package/lib/Article/Article.d.ts +3 -3
  34. package/lib/Article/ArticleAccessMessage.d.ts +1 -1
  35. package/lib/Article/ArticleByline.d.ts +1 -1
  36. package/lib/Article/ArticleContent.d.ts +1 -1
  37. package/lib/Article/ArticleFootNotes.d.ts +1 -1
  38. package/lib/Article/ArticleHeaderWrapper.d.ts +4 -5
  39. package/lib/Article/ArticleHeaderWrapper.js +73 -108
  40. package/lib/Article/ArticleNotions.d.ts +1 -1
  41. package/lib/Article/ArticleSideBar.d.ts +1 -1
  42. package/lib/Aside/Aside.d.ts +1 -1
  43. package/lib/AudioPlayer/AudioPlayer.d.ts +1 -1
  44. package/lib/AudioPlayer/Controls.d.ts +1 -1
  45. package/lib/AudioPlayer/SpeechControl.d.ts +1 -1
  46. package/lib/AuthorInfo/AuthorInfo.d.ts +1 -1
  47. package/lib/BannerCard/BannerCard.d.ts +1 -1
  48. package/lib/BlogPosts/BlogPost.d.ts +1 -1
  49. package/lib/BlogPosts/BlogPostWrapper.d.ts +1 -1
  50. package/lib/Breadcrumb/ActionBreadcrumb.d.ts +1 -1
  51. package/lib/Breadcrumb/Breadcrumb.d.ts +1 -1
  52. package/lib/Breadcrumb/HeaderBreadcrumb.d.ts +1 -1
  53. package/lib/Breadcrumb/HomeBreadcrumb.d.ts +1 -1
  54. package/lib/Breadcrumblist/Breadcrumblist.d.ts +1 -1
  55. package/lib/CompetenceGoalTab/CompetenceGoalItem.d.ts +1 -1
  56. package/lib/CompetenceGoalTab/CompetenceGoalTab.d.ts +1 -1
  57. package/lib/CompetenceGoalTab/CompetenceItem.d.ts +1 -1
  58. package/lib/CompetenceGoalTab/SearchButton.d.ts +1 -1
  59. package/lib/CompetenceGoals/CompetenceGoalsDialog.d.ts +1 -1
  60. package/lib/ComponentCursor/ComponentCursor.d.ts +1 -1
  61. package/lib/ContentCard/ContentCard.d.ts +1 -1
  62. package/lib/ContentLoader/index.d.ts +1 -1
  63. package/lib/ContentPlaceholder/ContentPlaceholder.d.ts +1 -1
  64. package/lib/ContentTypeBadge/ContentTypeBadge.d.ts +9 -9
  65. package/lib/CopyParagraphButton/CopyParagraphButton.d.ts +1 -1
  66. package/lib/CreatedBy/CreatedBy.d.ts +1 -1
  67. package/lib/Dialog/Dialog.d.ts +1 -1
  68. package/lib/ErrorMessage/ErrorMessage.d.ts +1 -1
  69. package/lib/ErrorMessage/ErrorResourceAccessDenied.d.ts +1 -1
  70. package/lib/FactBox/FactBox.d.ts +1 -1
  71. package/lib/Figure/Figure.d.ts +2 -2
  72. package/lib/Figure/FigureBylineExpandButton.d.ts +1 -1
  73. package/lib/Figure/FigureExpandButton.d.ts +1 -1
  74. package/lib/Figure/FigureLicense.d.ts +2 -2
  75. package/lib/Figure/FigureLicenseDialog.d.ts +1 -1
  76. package/lib/Figure/FigureOpenDialogButton.d.ts +1 -1
  77. package/lib/FileList/File.d.ts +1 -1
  78. package/lib/FileList/FileList.d.ts +1 -1
  79. package/lib/Filter/FilterButtons.d.ts +1 -1
  80. package/lib/Filter/FilterCarousel.d.ts +1 -1
  81. package/lib/Filter/FilterList.d.ts +1 -1
  82. package/lib/Filter/FilterListPhone.d.ts +1 -1
  83. package/lib/Filter/ToggleItem.d.ts +1 -1
  84. package/lib/Footer/EditorName.d.ts +1 -1
  85. package/lib/Footer/Footer.d.ts +1 -1
  86. package/lib/Footer/FooterAuth.d.ts +1 -1
  87. package/lib/Footer/FooterLinks.d.ts +3 -4
  88. package/lib/Footer/FooterLinks.js +12 -10
  89. package/lib/Footer/FooterPrivacy.d.ts +1 -1
  90. package/lib/Footer/FooterText.d.ts +1 -1
  91. package/lib/Footer/privacy_en.d.ts +1 -1
  92. package/lib/Footer/privacy_nb.d.ts +1 -1
  93. package/lib/Footer/privacy_nn.d.ts +1 -1
  94. package/lib/Frontpage/FrontpageAllSubjects.d.ts +1 -1
  95. package/lib/Frontpage/FrontpageFilm.d.ts +2 -4
  96. package/lib/Frontpage/FrontpageFilm.js +10 -8
  97. package/lib/Frontpage/FrontpageHeader.d.ts +1 -1
  98. package/lib/Frontpage/FrontpageInfo.d.ts +1 -1
  99. package/lib/Frontpage/FrontpageMultidisciplinarySubject.d.ts +7 -8
  100. package/lib/Frontpage/FrontpageMultidisciplinarySubject.js +12 -10
  101. package/lib/Frontpage/FrontpageProgramMenu.d.ts +1 -1
  102. package/lib/Frontpage/FrontpageSearch.d.ts +1 -1
  103. package/lib/Frontpage/FrontpageToolbox.d.ts +2 -4
  104. package/lib/Frontpage/FrontpageToolbox.js +10 -8
  105. package/lib/Frontpage/illustrations/Fellesfag.d.ts +1 -1
  106. package/lib/Frontpage/illustrations/FrontpageHeaderIllustration.d.ts +1 -1
  107. package/lib/Frontpage/illustrations/FrontpageIllustrations.d.ts +2 -2
  108. package/lib/Frontpage/illustrations/FrontpageSubjectIllustration.d.ts +1 -1
  109. package/lib/Frontpage/illustrations/MenuFellesfag.d.ts +1 -1
  110. package/lib/Frontpage/illustrations/MenuStudiespesialiserende.d.ts +1 -1
  111. package/lib/Frontpage/illustrations/MenuYrkesfag.d.ts +1 -1
  112. package/lib/Frontpage/illustrations/Studiespesialiserende.d.ts +1 -1
  113. package/lib/Frontpage/illustrations/Yrkesfag.d.ts +1 -1
  114. package/lib/Frontpage/illustrations/index.d.ts +6 -6
  115. package/lib/Hero/Hero.d.ts +8 -8
  116. package/lib/Image/Image.d.ts +2 -2
  117. package/lib/Image/ImageLink.d.ts +1 -1
  118. package/lib/Image/LazyLoadImage.d.ts +1 -1
  119. package/lib/InfoBlock/InfoBlock.d.ts +1 -1
  120. package/lib/InfoBox/InfoBox.d.ts +1 -1
  121. package/lib/InfoWidget/InfoWidget.d.ts +1 -1
  122. package/lib/LanguageSelector/LanguageSelector.d.ts +1 -1
  123. package/lib/LanguageSelector/LanguageSelectorContent.d.ts +1 -1
  124. package/lib/Layout/Content.d.ts +2 -2
  125. package/lib/Layout/LayoutItem.d.ts +1 -1
  126. package/lib/Layout/OneColumn.d.ts +1 -1
  127. package/lib/Layout/PageContainer.d.ts +1 -1
  128. package/lib/LearningPaths/LearningPathContent.d.ts +1 -1
  129. package/lib/LearningPaths/LearningPathInformation.d.ts +1 -1
  130. package/lib/LearningPaths/LearningPathLastStepNavigation.d.ts +3 -4
  131. package/lib/LearningPaths/LearningPathLastStepNavigation.js +10 -8
  132. package/lib/LearningPaths/LearningPathMenu.d.ts +1 -1
  133. package/lib/LearningPaths/LearningPathMenuAside.d.ts +2 -4
  134. package/lib/LearningPaths/LearningPathMenuAside.js +12 -10
  135. package/lib/LearningPaths/LearningPathMenuAsideCopyright.d.ts +1 -1
  136. package/lib/LearningPaths/LearningPathMenuContent.d.ts +1 -1
  137. package/lib/LearningPaths/LearningPathMenuIntro.d.ts +1 -1
  138. package/lib/LearningPaths/LearningPathMenuModalWrapper.d.ts +1 -1
  139. package/lib/LearningPaths/LearningPathMobileHeader.d.ts +2 -4
  140. package/lib/LearningPaths/LearningPathMobileHeader.js +7 -6
  141. package/lib/LearningPaths/LearningPathMobileStepInfo.d.ts +2 -4
  142. package/lib/LearningPaths/LearningPathMobileStepInfo.js +7 -5
  143. package/lib/LearningPaths/LearningPathSticky.d.ts +3 -3
  144. package/lib/LearningPaths/LearningPathWrapper.d.ts +1 -1
  145. package/lib/Logo/Logo.d.ts +1 -1
  146. package/lib/Logo/SvgLogo.d.ts +1 -1
  147. package/lib/Masthead/Masthead.d.ts +2 -2
  148. package/lib/Masthead/MastheadAuthModal.d.ts +1 -1
  149. package/lib/Masthead/MastheadSearchModal.d.ts +3 -4
  150. package/lib/Masthead/MastheadSearchModal.js +9 -7
  151. package/lib/Masthead/SkipToMainContent.d.ts +1 -1
  152. package/lib/MediaList/MediaList.d.ts +8 -8
  153. package/lib/Messages/MessageBanner.d.ts +1 -1
  154. package/lib/Messages/MessageBox.d.ts +2 -5
  155. package/lib/Messages/MessageBox.js +10 -14
  156. package/lib/Messages/MessageBoxTag.d.ts +1 -1
  157. package/lib/MultidisciplinarySubject/Illustrations.d.ts +7 -7
  158. package/lib/MultidisciplinarySubject/List.d.ts +1 -1
  159. package/lib/MultidisciplinarySubject/ListItem.d.ts +1 -1
  160. package/lib/MultidisciplinarySubject/MultidisciplinarySubject.d.ts +1 -1
  161. package/lib/MultidisciplinarySubject/MultidisciplinarySubjectHeader.d.ts +1 -1
  162. package/lib/MyNdla/Resource/Folder.d.ts +2 -2
  163. package/lib/MyNdla/Resource/Folder.js +115 -57
  164. package/lib/MyNdla/Resource/FolderInput.d.ts +1 -1
  165. package/lib/NDLAFilm/AboutNdlaFilm.d.ts +1 -1
  166. package/lib/NDLAFilm/AllMoviesAlphabetically.d.ts +1 -1
  167. package/lib/NDLAFilm/CategorySelect.d.ts +10 -5
  168. package/lib/NDLAFilm/CategorySelect.js +99 -145
  169. package/lib/NDLAFilm/FilmContentCard.d.ts +1 -1
  170. package/lib/NDLAFilm/FilmContentCardTags.d.ts +1 -1
  171. package/lib/NDLAFilm/FilmMovieList.d.ts +1 -1
  172. package/lib/NDLAFilm/FilmMovieSearch.d.ts +1 -1
  173. package/lib/NDLAFilm/FilmSlideshow.d.ts +1 -1
  174. package/lib/NDLAFilm/MovieGrid.d.ts +1 -1
  175. package/lib/NDLAFilm/NavigationArrow.d.ts +2 -2
  176. package/lib/NDLAFilm/SlideshowIndicator.d.ts +1 -1
  177. package/lib/NDLAFilm/VisualElement.d.ts +1 -1
  178. package/lib/NDLAFilm/filmStyles.d.ts +2 -2
  179. package/lib/Navigation/NavigationBox.d.ts +1 -1
  180. package/lib/Navigation/NavigationHeading.d.ts +1 -1
  181. package/lib/Navigation/NavigationTopicAbout.d.ts +1 -1
  182. package/lib/NoContentBox/NoContentBox.d.ts +1 -1
  183. package/lib/Notion/ConceptNotion.d.ts +1 -1
  184. package/lib/Notion/FigureNotion.d.ts +1 -1
  185. package/lib/Notion/Notion.d.ts +1 -1
  186. package/lib/Notion/NotionImage.d.ts +1 -1
  187. package/lib/Notion/NotionVisualElement.d.ts +1 -1
  188. package/lib/Portrait/Portrait.d.ts +1 -1
  189. package/lib/Programme/Programme.d.ts +1 -1
  190. package/lib/Programme/ProgrammeSubjects.d.ts +1 -1
  191. package/lib/RadioButtonGroup/RadioButtonGroup.d.ts +1 -1
  192. package/lib/RelatedArticleList/RelatedArticleList.d.ts +2 -2
  193. package/lib/Resource/BlockResource.d.ts +2 -2
  194. package/lib/Resource/BlockResource.js +44 -30
  195. package/lib/Resource/ListResource.d.ts +1 -1
  196. package/lib/Resource/ListResource.js +40 -36
  197. package/lib/Resource/resourceComponents.d.ts +7 -7
  198. package/lib/Resource/resourceComponents.js +28 -31
  199. package/lib/ResourceBox/ResourceBox.d.ts +1 -1
  200. package/lib/ResourceGroup/ResourceGroup.d.ts +1 -1
  201. package/lib/ResourceGroup/ResourceItem.d.ts +1 -1
  202. package/lib/ResourceGroup/ResourceList.d.ts +1 -1
  203. package/lib/ResourcesWrapper/ResourcesTitle.d.ts +1 -1
  204. package/lib/ResourcesWrapper/ResourcesTopicTitle.d.ts +1 -1
  205. package/lib/ResourcesWrapper/ResourcesWrapper.d.ts +1 -1
  206. package/lib/Search/ActiveFilterContent.d.ts +2 -2
  207. package/lib/Search/ActiveFilters.d.ts +1 -1
  208. package/lib/Search/ContentTypeResult.d.ts +1 -1
  209. package/lib/Search/ContentTypeResultStyles.d.ts +6 -6
  210. package/lib/Search/LoadingWrapper.d.ts +1 -1
  211. package/lib/Search/SearchField.d.ts +1 -1
  212. package/lib/Search/SearchFieldForm.d.ts +1 -1
  213. package/lib/Search/SearchResult.d.ts +2 -2
  214. package/lib/Search/SearchResultSleeve.d.ts +1 -1
  215. package/lib/Search/ToggleSearchButton.d.ts +1 -1
  216. package/lib/SearchTypeResult/ActiveFilterContent.d.ts +3 -4
  217. package/lib/SearchTypeResult/ActiveFilterContent.js +8 -6
  218. package/lib/SearchTypeResult/ActiveFilters.d.ts +1 -1
  219. package/lib/SearchTypeResult/PopupFilter.d.ts +1 -1
  220. package/lib/SearchTypeResult/ResultNavigation.d.ts +1 -1
  221. package/lib/SearchTypeResult/SearchFieldHeader.d.ts +1 -1
  222. package/lib/SearchTypeResult/SearchFilterContent.d.ts +1 -1
  223. package/lib/SearchTypeResult/SearchHeader.d.ts +3 -4
  224. package/lib/SearchTypeResult/SearchHeader.js +13 -12
  225. package/lib/SearchTypeResult/SearchItem.d.ts +1 -1
  226. package/lib/SearchTypeResult/SearchItemList.d.ts +1 -1
  227. package/lib/SearchTypeResult/SearchItems.d.ts +1 -1
  228. package/lib/SearchTypeResult/SearchNotionItem.d.ts +1 -1
  229. package/lib/SearchTypeResult/SearchNotionsResult.d.ts +3 -4
  230. package/lib/SearchTypeResult/SearchNotionsResult.js +5 -6
  231. package/lib/SearchTypeResult/SearchSubjectItem.d.ts +1 -1
  232. package/lib/SearchTypeResult/SearchSubjectResult.d.ts +1 -1
  233. package/lib/SearchTypeResult/SearchTypeHeader.d.ts +1 -2
  234. package/lib/SearchTypeResult/SearchTypeHeader.js +15 -12
  235. package/lib/SearchTypeResult/SearchTypeResult.d.ts +1 -1
  236. package/lib/SearchTypeResult/SearchViewType.d.ts +1 -1
  237. package/lib/SearchTypeResult/components/ItemContexts.d.ts +1 -1
  238. package/lib/SearchTypeResult/components/ItemResourceHeader.d.ts +1 -1
  239. package/lib/SearchTypeResult/components/ItemTopicHeader.d.ts +1 -1
  240. package/lib/SearchTypeResult/components/SubjectFilters.d.ts +1 -1
  241. package/lib/SectionHeading/SectionHeading.d.ts +1 -1
  242. package/lib/SnackBar/DefaultSnackbar.d.ts +1 -1
  243. package/lib/SnackBar/SnackbarProvider.d.ts +2 -2
  244. package/lib/Subject/Subject.d.ts +8 -8
  245. package/lib/Subject/SubjectAbout.d.ts +1 -1
  246. package/lib/Subject/SubjectArchive.d.ts +1 -1
  247. package/lib/Subject/SubjectBanner.d.ts +1 -1
  248. package/lib/Subject/SubjectCarousel.d.ts +2 -4
  249. package/lib/Subject/SubjectCarousel.js +10 -8
  250. package/lib/Subject/SubjectHeader.d.ts +1 -1
  251. package/lib/Subject/SubjectLinks.d.ts +1 -1
  252. package/lib/Subject/SubjectNewContent.d.ts +1 -1
  253. package/lib/Subject/SubjectShortcuts.d.ts +1 -1
  254. package/lib/Subject/SubjectSocial.d.ts +2 -2
  255. package/lib/Table/Table.d.ts +1 -1
  256. package/lib/TagSelector/Control.d.ts +1 -1
  257. package/lib/TagSelector/DropdownIndicator.d.ts +1 -1
  258. package/lib/TagSelector/Input.d.ts +1 -1
  259. package/lib/TagSelector/Menu.d.ts +1 -1
  260. package/lib/TagSelector/MenuList.d.ts +2 -2
  261. package/lib/TagSelector/Option.d.ts +1 -1
  262. package/lib/TagSelector/SelectContainer.d.ts +1 -1
  263. package/lib/TagSelector/TagSelector.d.ts +1 -1
  264. package/lib/TagSelector/ValueButton.d.ts +2 -2
  265. package/lib/ToolboxPage/ToolboxInfo.d.ts +3 -4
  266. package/lib/ToolboxPage/ToolboxInfo.js +8 -6
  267. package/lib/Topic/Loader.d.ts +1 -1
  268. package/lib/Topic/Topic.d.ts +1 -1
  269. package/lib/TopicIntroductionList/TopicIntroduction.d.ts +1 -1
  270. package/lib/TopicIntroductionList/TopicIntroductionList.d.ts +1 -1
  271. package/lib/TopicIntroductionList/TopicIntroductionShortcuts.d.ts +1 -1
  272. package/lib/TopicIntroductionList/TopicShortcutItem.d.ts +1 -1
  273. package/lib/Translation/Translation.d.ts +1 -1
  274. package/lib/Translation/TranslationBox.d.ts +1 -1
  275. package/lib/Translation/TranslationLine.d.ts +1 -1
  276. package/lib/TreeStructure/AddFolderButton.d.ts +1 -1
  277. package/lib/TreeStructure/FolderItem.d.ts +1 -1
  278. package/lib/TreeStructure/FolderItems.d.ts +1 -1
  279. package/lib/TreeStructure/NavigationLink.d.ts +1 -1
  280. package/lib/TreeStructure/TreeStructure.d.ts +1 -1
  281. package/lib/TreeStructure/helperFunctions.d.ts +1 -1
  282. package/lib/User/AuthModal.d.ts +1 -1
  283. package/lib/User/UserInfo.d.ts +1 -1
  284. package/lib/User/UserInfo.js +23 -2
  285. package/lib/User/apiTypes.d.ts +10 -2
  286. package/lib/User/parseUserObject.d.ts +2 -1
  287. package/lib/User/parseUserObject.js +22 -12
  288. package/lib/locale/LocaleProvider.d.ts +1 -1
  289. package/lib/locale/messages-en.d.ts +4 -0
  290. package/lib/locale/messages-en.js +5 -1
  291. package/lib/locale/messages-nb.d.ts +4 -0
  292. package/lib/locale/messages-nb.js +5 -1
  293. package/lib/locale/messages-nn.d.ts +4 -0
  294. package/lib/locale/messages-nn.js +5 -1
  295. package/lib/locale/messages-se.d.ts +4 -0
  296. package/lib/locale/messages-se.js +33 -29
  297. package/lib/locale/messages-sma.d.ts +4 -0
  298. package/lib/locale/messages-sma.js +5 -1
  299. package/lib/utils/createUniversalPortal.d.ts +1 -1
  300. package/lib/utils/createUniversalPortal.js +1 -1
  301. package/package.json +10 -10
  302. package/src/Article/ArticleHeaderWrapper.tsx +53 -66
  303. package/src/Footer/FooterLinks.tsx +43 -40
  304. package/src/Frontpage/FrontpageFilm.tsx +20 -17
  305. package/src/Frontpage/FrontpageMultidisciplinarySubject.tsx +33 -30
  306. package/src/Frontpage/FrontpageToolbox.tsx +21 -18
  307. package/src/LearningPaths/LearningPathLastStepNavigation.tsx +32 -29
  308. package/src/LearningPaths/LearningPathMenuAside.tsx +25 -29
  309. package/src/LearningPaths/LearningPathMobileHeader.tsx +11 -8
  310. package/src/LearningPaths/LearningPathMobileStepInfo.tsx +13 -10
  311. package/src/Masthead/MastheadSearchModal.tsx +36 -35
  312. package/src/Messages/MessageBox.tsx +2 -3
  313. package/src/MyNdla/Resource/Folder.tsx +118 -84
  314. package/src/NDLAFilm/CategorySelect.tsx +77 -97
  315. package/src/Resource/BlockResource.tsx +34 -28
  316. package/src/Resource/ListResource.tsx +76 -74
  317. package/src/Resource/resourceComponents.tsx +15 -20
  318. package/src/SearchTypeResult/ActiveFilterContent.tsx +18 -15
  319. package/src/SearchTypeResult/SearchHeader.tsx +4 -4
  320. package/src/SearchTypeResult/SearchNotionsResult.tsx +2 -3
  321. package/src/SearchTypeResult/SearchTypeHeader.tsx +48 -45
  322. package/src/Subject/SubjectCarousel.tsx +93 -96
  323. package/src/ToolboxPage/ToolboxInfo.tsx +19 -16
  324. package/src/User/UserInfo.tsx +22 -0
  325. package/src/User/__tests__/parseUserObject-test.ts +1 -0
  326. package/src/User/apiTypes.ts +11 -2
  327. package/src/User/parseUserObject.ts +17 -11
  328. package/src/locale/messages-en.ts +4 -0
  329. package/src/locale/messages-nb.ts +4 -0
  330. package/src/locale/messages-nn.ts +4 -0
  331. package/src/locale/messages-se.ts +32 -28
  332. package/src/locale/messages-sma.ts +4 -0
  333. package/src/utils/createUniversalPortal.tsx +1 -6
@@ -6,7 +6,7 @@ import { isFunction } from '@ndla/util';
6
6
  import styled from '@emotion/styled';
7
7
  import { css } from '@emotion/react';
8
8
  import { spacing, mq, breakpoints, colors, shadows } from '@ndla/core';
9
- import { WithTranslation, withTranslation } from 'react-i18next';
9
+ import { useTranslation } from 'react-i18next';
10
10
  import ToggleSearchButton from '../Search/ToggleSearchButton';
11
11
 
12
12
  interface Props {
@@ -91,38 +91,39 @@ const extraBackdrop = css`
91
91
  box-shadow: ${shadows.searchHeader};
92
92
  `;
93
93
 
94
- const MastheadSearchModal = ({
95
- onClose: onSearchClose,
96
- children,
97
- hideOnNarrowScreen,
98
- ndlaFilm,
99
- t,
100
- }: Props & WithTranslation) => (
101
- <Modal
102
- label={t('searchPage.searchFieldPlaceholder')}
103
- backgroundColor="grey"
104
- animation="slide-down"
105
- animationDuration={200}
106
- size="full-width"
107
- onClose={onSearchClose}
108
- css={modalStyles}
109
- activateButton={
110
- <ToggleSearchButton hideOnNarrowScreen={hideOnNarrowScreen} ndlaFilm={ndlaFilm}>
111
- {t('masthead.menu.search')}
112
- </ToggleSearchButton>
113
- }>
114
- {(closeModal: VoidFunction) => (
115
- <>
116
- <div css={extraBackdrop} />
117
- <StyledHeader>
118
- {isFunction(children) ? children(closeModal) : children}
119
- <IconButton aria-label={t('welcomePage.closeSearch')} variant="ghost" colorTheme="light" onClick={closeModal}>
120
- <Cross className="c-icon--medium" />
121
- </IconButton>
122
- </StyledHeader>
123
- </>
124
- )}
125
- </Modal>
126
- );
94
+ const MastheadSearchModal = ({ onClose: onSearchClose, children, hideOnNarrowScreen, ndlaFilm }: Props) => {
95
+ const { t } = useTranslation();
96
+ return (
97
+ <Modal
98
+ label={t('searchPage.searchFieldPlaceholder')}
99
+ backgroundColor="grey"
100
+ animation="slide-down"
101
+ animationDuration={200}
102
+ size="full-width"
103
+ onClose={onSearchClose}
104
+ css={modalStyles}
105
+ activateButton={
106
+ <ToggleSearchButton hideOnNarrowScreen={hideOnNarrowScreen} ndlaFilm={ndlaFilm}>
107
+ {t('masthead.menu.search')}
108
+ </ToggleSearchButton>
109
+ }>
110
+ {(closeModal: VoidFunction) => (
111
+ <>
112
+ <div css={extraBackdrop} />
113
+ <StyledHeader>
114
+ {isFunction(children) ? children(closeModal) : children}
115
+ <IconButton
116
+ aria-label={t('welcomePage.closeSearch')}
117
+ variant="ghost"
118
+ colorTheme="light"
119
+ onClick={closeModal}>
120
+ <Cross className="c-icon--medium" />
121
+ </IconButton>
122
+ </StyledHeader>
123
+ </>
124
+ )}
125
+ </Modal>
126
+ );
127
+ };
127
128
 
128
- export default withTranslation()(MastheadSearchModal);
129
+ export default MastheadSearchModal;
@@ -10,7 +10,6 @@ import React from 'react';
10
10
  import styled from '@emotion/styled';
11
11
  import { breakpoints, colors, fonts, mq, spacing } from '@ndla/core';
12
12
  import { InformationOutline, HumanMaleBoard, Forward, WarningOutline } from '@ndla/icons/common';
13
- import { WithTranslation, withTranslation } from 'react-i18next';
14
13
 
15
14
  // @ts-ignore
16
15
  import { Remarkable } from 'remarkable';
@@ -127,7 +126,7 @@ const Icon = ({ type }: StyledProps) => {
127
126
  return <InformationOutline />;
128
127
  };
129
128
 
130
- export const MessageBox = ({ type, children = '', links, showCloseButton, onClose }: Props & WithTranslation) => {
129
+ export const MessageBox = ({ type, children = '', links, showCloseButton, onClose }: Props) => {
131
130
  return (
132
131
  <MessageBoxWrapper type={type}>
133
132
  <InfoWrapper>
@@ -153,4 +152,4 @@ export const MessageBox = ({ type, children = '', links, showCloseButton, onClos
153
152
  );
154
153
  };
155
154
 
156
- export default withTranslation()(MessageBox);
155
+ export default MessageBox;
@@ -16,39 +16,72 @@ import { useTranslation } from 'react-i18next';
16
16
  import SafeLink from '@ndla/safelink';
17
17
  import { MenuButton, MenuItemProps } from '@ndla/button';
18
18
 
19
- interface FolderIconWrapperProps {
20
- type?: LayoutType;
19
+ type LayoutType = 'list' | 'listLarger' | 'block';
20
+ interface LayoutProps {
21
+ type: LayoutType;
21
22
  }
22
23
 
23
- const FolderIconWrapper = styled.div<FolderIconWrapperProps>`
24
+ const FolderWrapper = styled.div<LayoutProps>`
25
+ display: flex;
26
+ align-items: center;
27
+ justify-content: space-between;
28
+ padding: ${spacing.nsmall};
29
+ gap: ${spacing.small};
30
+
31
+ ${mq.range({ until: breakpoints.mobileWide })} {
32
+ ${({ type }) =>
33
+ type !== 'list' &&
34
+ css`
35
+ flex-direction: column;
36
+ align-items: unset;
37
+ `}
38
+ }
39
+
40
+ ${({ type }) =>
41
+ type === 'block' &&
42
+ css`
43
+ flex-direction: column;
44
+ align-items: unset;
45
+ `}
46
+
47
+ border: 1px solid ${colors.brand.neutral7};
48
+ cursor: pointer;
49
+ border-radius: 2px;
50
+ box-shadow: none;
51
+ text-decoration: none;
52
+ &:hover {
53
+ box-shadow: 1px 1px 6px 2px rgba(9, 55, 101, 0.08);
54
+ transition-duration: 0.2s;
55
+ }
56
+ `;
57
+
58
+ const TitleWrapper = styled.div`
59
+ display: flex;
60
+ flex-direction: row;
61
+ align-items: center;
62
+ gap: ${spacing.xsmall};
63
+ justify-content: space-between;
64
+ `;
65
+
66
+ const IconWrapper = styled.div`
24
67
  display: flex;
25
68
  border-radius: 100%;
26
- padding: ${spacing.small};
27
- background-color: ${colors.brand.greyLighter};
69
+ color: ${colors.brand.primary};
28
70
  svg {
29
- width: 18px;
30
- height: 18px;
71
+ width: 20px;
72
+ height: 20px;
31
73
  }
32
- ${(p) =>
33
- p.type === 'block' &&
34
- css`
35
- background-color: transparent;
36
- ${FolderWrapper}:hover & {
37
- background-color: ${colors.brand.light};
38
- transition-duration 0.5s;
39
- }
40
- `};
41
74
  `;
42
75
 
43
- const FolderTitleLink = styled(SafeLink)`
76
+ const StyledLink = styled(SafeLink)`
44
77
  box-shadow: none;
45
- color: ${colors.text.primary};
78
+ color: ${colors.brand.primary};
46
79
  flex: 1;
47
80
  `;
48
81
 
49
82
  const FolderTitle = styled.h2`
50
- ${fonts.sizes(18)};
51
- font-weight: ${fonts.weight.normal};
83
+ ${fonts.sizes('16px', '20px')};
84
+ font-weight: ${fonts.weight.semibold};
52
85
  margin: 0;
53
86
  flex: 1;
54
87
 
@@ -59,41 +92,50 @@ const FolderTitle = styled.h2`
59
92
  -webkit-line-clamp: 1;
60
93
  line-clamp: 1;
61
94
  -webkit-box-orient: vertical;
95
+
96
+ ${FolderWrapper}:hover & {
97
+ color: ${colors.brand.primary};
98
+ text-decoration: underline;
99
+ }
62
100
  `;
63
101
 
64
- const FolderWrapper = styled.div`
102
+ const MenuWrapper = styled.div`
103
+ overflow: hidden;
65
104
  display: flex;
105
+ flex-direction: row;
66
106
  align-items: center;
67
- padding: ${spacing.small};
68
- border: 1px solid ${colors.brand.neutral7};
69
- cursor: pointer;
70
- border-radius: 2px;
71
- box-shadow: none;
72
- text-decoration: none;
73
- color: ${colors.brand.greyDark};
74
- font-family: ${fonts.sans};
75
- transition-duration: 0.2s;
107
+ gap: ${spacing.xsmall};
108
+ justify-content: space-between;
109
+ margin: -${spacing.nsmall};
110
+ margin-left: 0;
111
+ `;
112
+
113
+ const CountContainer = styled.div`
114
+ overflow: hidden;
115
+ display: flex;
116
+ flex-direction: row;
76
117
  gap: ${spacing.small};
77
- &:hover {
78
- box-shadow: 1px 1px 6px 2px rgba(9, 55, 101, 0.08);
79
- transition-duration: 0.2s;
80
- ${FolderTitle} {
81
- color: ${colors.brand.primary};
82
- text-decoration: underline;
83
- }
84
- }
85
118
  `;
86
119
 
87
- interface Props {
88
- id: string;
89
- title: string;
90
- subFolders?: number;
91
- subResources?: number;
92
- description?: string;
93
- link: string;
94
- type: LayoutType;
95
- menuItems?: MenuItemProps[];
96
- }
120
+ const IconCountWrapper = styled.div<LayoutProps>`
121
+ display: flex;
122
+ align-items: center;
123
+ gap: ${spacing.xxsmall};
124
+ color: ${colors.brand.grey};
125
+ white-space: nowrap;
126
+ svg {
127
+ width: 13px;
128
+ height: 13px;
129
+ }
130
+ ${fonts.sizes(16)};
131
+ ${mq.range({ until: breakpoints.mobileWide })} {
132
+ ${({ type }) =>
133
+ type === 'list' &&
134
+ css`
135
+ display: none;
136
+ `}
137
+ }
138
+ `;
97
139
 
98
140
  interface IconCountProps {
99
141
  type: 'resource' | 'folder';
@@ -101,30 +143,7 @@ interface IconCountProps {
101
143
  layoutType: LayoutType;
102
144
  }
103
145
 
104
- interface IconCountWrapperProps {
105
- type: LayoutType;
106
- }
107
-
108
- const IconCountWrapper = styled.div<IconCountWrapperProps>`
109
- display: flex;
110
- align-items: center;
111
- gap: 2px;
112
- ${fonts.sizes(16)};
113
- ${(p) =>
114
- p.type === 'block' &&
115
- css`
116
- opacity: 0;
117
- ${FolderWrapper}:hover & {
118
- opacity: 1;
119
- }
120
- `};
121
-
122
- ${mq.range({ until: breakpoints.tabletWide })} {
123
- display: none;
124
- }
125
- `;
126
-
127
- const IconCount = ({ type, count, layoutType }: IconCountProps) => {
146
+ const Count = ({ type, count, layoutType }: IconCountProps) => {
128
147
  const Icon = type === 'resource' ? FileDocumentOutline : FolderOutlined;
129
148
  const { t } = useTranslation();
130
149
  if (!count) return null;
@@ -132,12 +151,21 @@ const IconCount = ({ type, count, layoutType }: IconCountProps) => {
132
151
  return (
133
152
  <IconCountWrapper type={layoutType}>
134
153
  <Icon aria-label={t(`myNdla.${type}s`)} />
135
- <span>{layoutType === 'block' ? count : t(`myNdla.${type}s`, { count })}</span>
154
+ <span>{t(`myNdla.${type}s`, { count })}</span>
136
155
  </IconCountWrapper>
137
156
  );
138
157
  };
139
158
 
140
- type LayoutType = 'list' | 'block';
159
+ interface Props {
160
+ id: string;
161
+ title: string;
162
+ subFolders?: number;
163
+ subResources?: number;
164
+ description?: string;
165
+ link: string;
166
+ type: LayoutType;
167
+ menuItems?: MenuItemProps[];
168
+ }
141
169
 
142
170
  const Folder = ({ id, link, title, subFolders, subResources, type = 'list', menuItems }: Props) => {
143
171
  const { t } = useTranslation();
@@ -148,16 +176,22 @@ const Folder = ({ id, link, title, subFolders, subResources, type = 'list', menu
148
176
  };
149
177
 
150
178
  return (
151
- <FolderWrapper onClick={onClick} id={id}>
152
- <FolderIconWrapper type={type}>
153
- <FolderOutlined aria-label={t('myNdla.folder.folder')} />
154
- </FolderIconWrapper>
155
- <FolderTitleLink to={link} ref={linkRef}>
156
- <FolderTitle>{title}</FolderTitle>
157
- </FolderTitleLink>
158
- <IconCount layoutType={type} type={'folder'} count={subFolders} />
159
- <IconCount layoutType={type} type={'resource'} count={subResources} />
160
- {menuItems && menuItems.length > 0 && <MenuButton alignRight size="small" menuItems={menuItems} />}
179
+ <FolderWrapper type={type} onClick={onClick} id={id}>
180
+ <TitleWrapper>
181
+ <IconWrapper>
182
+ <FolderOutlined aria-label={t('myNdla.folder.folder')} />
183
+ </IconWrapper>
184
+ <StyledLink to={link} ref={linkRef}>
185
+ <FolderTitle>{title}</FolderTitle>
186
+ </StyledLink>
187
+ </TitleWrapper>
188
+ <MenuWrapper>
189
+ <CountContainer>
190
+ <Count layoutType={type} type={'folder'} count={subFolders} />
191
+ <Count layoutType={type} type={'resource'} count={subResources} />
192
+ </CountContainer>
193
+ {menuItems && menuItems.length > 0 && <MenuButton alignRight size="small" menuItems={menuItems} />}
194
+ </MenuWrapper>
161
195
  </FolderWrapper>
162
196
  );
163
197
  };
@@ -1,10 +1,18 @@
1
- import React, { Component } from 'react';
1
+ /**
2
+ * Copyright (c) 2019-present, NDLA.
3
+ *
4
+ * This source code is licensed under the GPLv3 license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ */
8
+
9
+ import React, { useEffect, useRef, useState } from 'react';
2
10
  import FocusTrapReact from 'focus-trap-react';
3
11
  import styled from '@emotion/styled';
4
12
  import { keyframes } from '@emotion/react';
5
13
  import { breakpoints, colors, fonts, mq, spacing } from '@ndla/core';
6
14
  import { ChevronDown } from '@ndla/icons/common';
7
- import { WithTranslation, withTranslation } from 'react-i18next';
15
+ import { useTranslation } from 'react-i18next';
8
16
  import { MovieResourceType } from './types';
9
17
 
10
18
  const zoomInSelect = keyframes`
@@ -70,7 +78,7 @@ const DropdownWrapper = styled.div<DropdownWrapperProps>`
70
78
  top: -${(props) => props.offsetDropdown * 52 + 13}px;
71
79
  ${DropdownButton} {
72
80
  border-radius: 0;
73
- text-transform: 0;
81
+ text-transform: none;
74
82
  letter-spacing: 0;
75
83
  }
76
84
  display: flex;
@@ -105,110 +113,82 @@ const DropdownWrapper = styled.div<DropdownWrapperProps>`
105
113
  }
106
114
  `;
107
115
 
108
- interface Props extends WithTranslation {
116
+ interface Props {
109
117
  resourceTypes: MovieResourceType[];
110
118
  resourceTypeSelected?: MovieResourceType;
111
119
  ariaControlId?: string;
112
120
  onChangeResourceType: (resourceId?: string) => void;
113
121
  }
114
122
 
115
- interface State {
116
- resourceTypesIsOpen: boolean;
117
- }
118
- class CategorySelect extends Component<Props, State> {
119
- references: Record<string, HTMLButtonElement | null>;
120
- constructor(props: Props) {
121
- super(props);
122
- this.state = {
123
- resourceTypesIsOpen: false,
124
- };
125
- this.references = {};
126
- this.createRef = this.createRef.bind(this);
127
- this.openSelect = this.openSelect.bind(this);
128
- this.onSelect = this.onSelect.bind(this);
129
- }
123
+ const CategorySelect = ({ resourceTypes, resourceTypeSelected, ariaControlId, onChangeResourceType }: Props) => {
124
+ const { t } = useTranslation();
125
+ const refs = useRef<Record<string, HTMLButtonElement | null>>({});
130
126
 
131
- createRef(el: HTMLButtonElement | null, name: string) {
132
- this.references[name] = el;
133
- }
127
+ const [resourceTypesIsOpen, setResourceTypesIsOpen] = useState<boolean>(false);
134
128
 
135
- openSelect() {
136
- const { resourceTypeSelected } = this.props;
137
- this.setState(
138
- {
139
- resourceTypesIsOpen: true,
140
- },
141
- () => {
142
- if (resourceTypeSelected && this.references[resourceTypeSelected.id]) {
143
- this.references[resourceTypeSelected.id]?.focus();
144
- }
145
- },
146
- );
147
- }
129
+ const updateRef = (el: HTMLButtonElement | null, name: string) => {
130
+ refs.current[name] = el;
131
+ };
148
132
 
149
- onSelect(val?: string) {
150
- this.props.onChangeResourceType(val);
151
- this.setState({
152
- resourceTypesIsOpen: false,
153
- });
154
- }
133
+ useEffect(() => {
134
+ if (resourceTypeSelected && refs.current[resourceTypeSelected.id]) {
135
+ refs.current[resourceTypeSelected.id]?.focus();
136
+ }
137
+ }, [resourceTypesIsOpen, resourceTypeSelected]);
138
+
139
+ const onSelect = (val?: string) => {
140
+ onChangeResourceType(val);
141
+ setResourceTypesIsOpen(false);
142
+ };
155
143
 
156
- render() {
157
- const { resourceTypes, resourceTypeSelected, ariaControlId, t } = this.props;
158
- const { resourceTypesIsOpen } = this.state;
159
- const offsetDropDown = resourceTypeSelected
160
- ? resourceTypes.findIndex((resource) => resource.id === resourceTypeSelected.id) + 1
161
- : 0;
144
+ const offsetDropDown = resourceTypeSelected
145
+ ? resourceTypes.findIndex((resource) => resource.id === resourceTypeSelected.id) + 1
146
+ : 0;
162
147
 
163
- return (
164
- <DropdownContainer className="u-12/12">
165
- <DropdownButton
166
- aria-expanded={!resourceTypesIsOpen}
167
- aria-controls="selectCategory"
168
- type="button"
169
- tabIndex={resourceTypesIsOpen ? -1 : 0}
170
- onClick={this.openSelect}>
171
- <div>
172
- <span>{t('ndlaFilm.search.chooseCategory')}</span>
173
- <small>
174
- {(resourceTypeSelected && resourceTypeSelected.name) || t('ndlaFilm.search.categoryFromNdla')}
175
- </small>
176
- </div>
177
- <div>
178
- <ChevronDown className="c-icon--22" />
179
- </div>
180
- </DropdownButton>
181
- {resourceTypesIsOpen && (
182
- <FocusTrapReact
183
- active={resourceTypesIsOpen}
184
- focusTrapOptions={{
185
- onDeactivate: () => {
186
- this.setState({ resourceTypesIsOpen: false });
187
- },
188
- clickOutsideDeactivates: true,
189
- escapeDeactivates: true,
190
- }}>
191
- <DropdownWrapper id="selectCategory" offsetDropdown={offsetDropDown}>
192
- <DropdownButton aria-controls={ariaControlId} type="button" onClick={() => this.onSelect()}>
193
- <span>{t('ndlaFilm.search.categoryFromNdla')}</span>
148
+ return (
149
+ <DropdownContainer className="u-12/12">
150
+ <DropdownButton
151
+ aria-expanded={!resourceTypesIsOpen}
152
+ aria-controls="selectCategory"
153
+ type="button"
154
+ tabIndex={resourceTypesIsOpen ? -1 : 0}
155
+ onClick={() => setResourceTypesIsOpen(true)}>
156
+ <div>
157
+ <span>{t('ndlaFilm.search.chooseCategory')}</span>
158
+ <small>{(resourceTypeSelected && resourceTypeSelected.name) || t('ndlaFilm.search.categoryFromNdla')}</small>
159
+ </div>
160
+ <div>
161
+ <ChevronDown className="c-icon--22" />
162
+ </div>
163
+ </DropdownButton>
164
+ {resourceTypesIsOpen && (
165
+ <FocusTrapReact
166
+ active={resourceTypesIsOpen}
167
+ focusTrapOptions={{
168
+ onDeactivate: () => setResourceTypesIsOpen(false),
169
+ clickOutsideDeactivates: true,
170
+ escapeDeactivates: true,
171
+ }}>
172
+ <DropdownWrapper id="selectCategory" offsetDropdown={offsetDropDown}>
173
+ <DropdownButton aria-controls={ariaControlId} type="button" onClick={() => onSelect()}>
174
+ <span>{t('ndlaFilm.search.categoryFromNdla')}</span>
175
+ </DropdownButton>
176
+ {resourceTypes.map((resourceType) => (
177
+ <DropdownButton
178
+ aria-controls={ariaControlId}
179
+ type="button"
180
+ ref={(el) => updateRef(el, resourceType.id)}
181
+ onClick={() => onSelect(resourceType.id)}
182
+ data-id={resourceType.id}
183
+ key={resourceType.id}>
184
+ <span>{resourceType.name}</span>
194
185
  </DropdownButton>
195
- {resourceTypes.map((resourceType) => (
196
- <DropdownButton
197
- aria-controls={ariaControlId}
198
- type="button"
199
- ref={(el) => this.createRef(el, resourceType.id)}
200
- onClick={() => this.onSelect(resourceType.id)}
201
- data-id={resourceType.id}
202
- key={resourceType.id}>
203
- <span>{resourceType.name}</span>
204
- </DropdownButton>
205
- ))}
206
- </DropdownWrapper>
207
- </FocusTrapReact>
208
- )}
209
- </DropdownContainer>
210
- );
211
- }
212
- }
186
+ ))}
187
+ </DropdownWrapper>
188
+ </FocusTrapReact>
189
+ )}
190
+ </DropdownContainer>
191
+ );
192
+ };
213
193
 
214
- export default withTranslation()(CategorySelect);
194
+ export default CategorySelect;