@ndla/ui 55.0.12-alpha.0 → 55.0.14-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/dist/all-aout.js +0 -0
  2. package/dist/all.css +1 -0
  3. package/dist/panda.buildinfo.json +289 -0
  4. package/dist/styles.css +1197 -0
  5. package/es/Article/Article.js +3 -4
  6. package/es/Article/ArticleByline.js +9 -9
  7. package/es/Article/ArticleFootNotes.js +4 -4
  8. package/es/Article/ArticleParagraph.js +11 -13
  9. package/es/AudioPlayer/AudioPlayer.js +142 -163
  10. package/es/AudioPlayer/Controls.js +187 -203
  11. package/es/AudioPlayer/SpeechControl.js +13 -11
  12. package/es/BlogPost/BlogPost.js +85 -23
  13. package/es/CampaignBlock/CampaignBlock.js +103 -69
  14. package/es/CodeBlock/CodeBlock.js +88 -96
  15. package/es/Concept/Concept.js +69 -0
  16. package/es/ContactBlock/ContactBlock.js +54 -40
  17. package/es/ContentLoader/index.js +7 -7
  18. package/es/ContentTypeBadge/ContentTypeBadgeNew.js +48 -0
  19. package/es/CopyParagraphButton/CopyParagraphButton.js +4 -4
  20. package/es/Embed/AudioEmbed.js +6 -11
  21. package/es/Embed/BrightcoveEmbed.js +25 -39
  22. package/es/Embed/CodeEmbed.js +58 -10
  23. package/es/Embed/ConceptEmbed.js +57 -306
  24. package/es/Embed/ConceptListEmbed.js +18 -24
  25. package/es/Embed/ContentLinkEmbed.js +10 -10
  26. package/es/Embed/CopyrightEmbed.js +4 -21
  27. package/es/Embed/EmbedErrorPlaceholder.js +32 -17
  28. package/es/Embed/ExternalEmbed.js +17 -28
  29. package/es/Embed/FootnoteEmbed.js +14 -11
  30. package/es/Embed/GlossEmbed.js +68 -0
  31. package/es/Embed/H5pEmbed.js +20 -21
  32. package/es/Embed/IframeEmbed.js +17 -15
  33. package/es/Embed/ImageEmbed.js +167 -122
  34. package/es/Embed/InlineTriggerButton.js +70 -0
  35. package/es/Embed/RelatedContentEmbed.js +8 -10
  36. package/es/Embed/UnknownEmbed.js +9 -9
  37. package/es/Embed/UuDisclaimerEmbed.js +16 -27
  38. package/es/Embed/index.js +1 -3
  39. package/es/ErrorMessage/ErrorMessage.js +42 -23
  40. package/es/ErrorMessage/ErrorResourceAccessDenied.js +8 -6
  41. package/es/FactBox/FactBox.js +118 -47
  42. package/es/FileList/File.js +1 -1
  43. package/es/FileList/Format.js +3 -3
  44. package/es/FileList/PdfFile.js +23 -5
  45. package/es/FrontpageArticle/FrontpageArticle.js +1 -1
  46. package/es/Gloss/Gloss.js +122 -94
  47. package/es/Gloss/GlossExample.js +49 -52
  48. package/es/Grid/Grid.js +1 -1
  49. package/es/KeyFigure/KeyFigure.js +2 -2
  50. package/es/LanguageSelector/LanguageSelector.js +2 -2
  51. package/es/LicenseByline/EmbedByline.js +5 -6
  52. package/es/LicenseByline/LicenseDescription.js +1 -1
  53. package/es/LicenseByline/LicenseLink.js +1 -2
  54. package/es/LinkBlock/LinkBlock.js +61 -33
  55. package/es/LinkBlock/LinkBlockSection.js +9 -6
  56. package/es/Logo/Logo.js +1 -30
  57. package/es/Messages/MessageBox.js +1 -1
  58. package/es/RelatedArticleList/RelatedArticleList.js +73 -90
  59. package/es/ResourceBox/ResourceBox.js +67 -44
  60. package/es/Search/ActiveFilters.js +1 -1
  61. package/es/Search/ContentTypeResult.js +9 -6
  62. package/es/Search/ContentTypeResultStyles.js +1 -1
  63. package/es/Search/IsPathToHighlight.js +1 -1
  64. package/es/Search/SearchField.js +6 -8
  65. package/es/Search/SearchResult.js +14 -19
  66. package/es/Search/SearchResultSleeve.js +14 -16
  67. package/es/SnackBar/SnackbarProvider.js +8 -11
  68. package/es/TagSelector/TagSelector.js +124 -131
  69. package/es/TreeStructure/AddFolderButton.js +4 -6
  70. package/es/TreeStructure/ComboboxButton.js +4 -7
  71. package/es/TreeStructure/FolderItem.js +12 -15
  72. package/es/TreeStructure/FolderItems.js +3 -3
  73. package/es/TreeStructure/TreeStructure.js +9 -12
  74. package/es/TreeStructure/helperFunctions.js +1 -1
  75. package/es/ZendeskButton/ZendeskButton.js +55 -0
  76. package/es/i18n/formatNestedMessages.js +1 -1
  77. package/es/i18n/index.js +2 -1
  78. package/es/i18n/useComponentTranslations.js +83 -0
  79. package/es/index.js +6 -12
  80. package/es/locale/messages-en.js +39 -12
  81. package/es/locale/messages-nb.js +39 -12
  82. package/es/locale/messages-nn.js +39 -12
  83. package/es/locale/messages-se.js +39 -12
  84. package/es/locale/messages-sma.js +39 -12
  85. package/es/model/ContentType.js +3 -0
  86. package/es/styles.css +1197 -0
  87. package/es/utils/relativeUrl.js +3 -3
  88. package/lib/Article/Article.js +3 -4
  89. package/lib/Article/ArticleByline.js +9 -9
  90. package/lib/Article/ArticleFootNotes.js +4 -4
  91. package/lib/Article/ArticleParagraph.js +12 -14
  92. package/lib/AudioPlayer/AudioPlayer.d.ts +1 -2
  93. package/lib/AudioPlayer/AudioPlayer.js +142 -162
  94. package/lib/AudioPlayer/Controls.js +190 -205
  95. package/lib/AudioPlayer/SpeechControl.js +13 -11
  96. package/lib/BlogPost/BlogPost.d.ts +2 -2
  97. package/lib/BlogPost/BlogPost.js +85 -24
  98. package/lib/CampaignBlock/CampaignBlock.d.ts +2 -2
  99. package/lib/CampaignBlock/CampaignBlock.js +106 -69
  100. package/lib/CodeBlock/CodeBlock.d.ts +5 -8
  101. package/lib/CodeBlock/CodeBlock.js +88 -96
  102. package/lib/Concept/Concept.d.ts +18 -0
  103. package/lib/Concept/Concept.js +75 -0
  104. package/lib/ContactBlock/ContactBlock.js +55 -43
  105. package/lib/ContentLoader/index.js +7 -7
  106. package/lib/ContentTypeBadge/ContentTypeBadgeNew.d.ts +17 -0
  107. package/lib/ContentTypeBadge/ContentTypeBadgeNew.js +56 -0
  108. package/lib/CopyParagraphButton/CopyParagraphButton.js +4 -4
  109. package/lib/Embed/AudioEmbed.js +7 -12
  110. package/lib/Embed/BrightcoveEmbed.d.ts +1 -2
  111. package/lib/Embed/BrightcoveEmbed.js +28 -40
  112. package/lib/Embed/CodeEmbed.js +56 -8
  113. package/lib/Embed/ConceptEmbed.d.ts +15 -21
  114. package/lib/Embed/ConceptEmbed.js +58 -306
  115. package/lib/Embed/ConceptListEmbed.js +21 -26
  116. package/lib/Embed/ContentLinkEmbed.js +10 -11
  117. package/lib/Embed/CopyrightEmbed.js +6 -22
  118. package/lib/Embed/EmbedErrorPlaceholder.d.ts +4 -3
  119. package/lib/Embed/EmbedErrorPlaceholder.js +32 -18
  120. package/lib/Embed/ExternalEmbed.d.ts +1 -2
  121. package/lib/Embed/ExternalEmbed.js +20 -29
  122. package/lib/Embed/FootnoteEmbed.js +14 -12
  123. package/lib/Embed/GlossEmbed.d.ts +13 -0
  124. package/lib/Embed/GlossEmbed.js +76 -0
  125. package/lib/Embed/H5pEmbed.d.ts +1 -2
  126. package/lib/Embed/H5pEmbed.js +22 -21
  127. package/lib/Embed/IframeEmbed.d.ts +1 -2
  128. package/lib/Embed/IframeEmbed.js +19 -17
  129. package/lib/Embed/ImageEmbed.d.ts +1 -2
  130. package/lib/Embed/ImageEmbed.js +167 -123
  131. package/lib/Embed/InlineTriggerButton.d.ts +11 -0
  132. package/lib/Embed/InlineTriggerButton.js +76 -0
  133. package/lib/Embed/RelatedContentEmbed.js +8 -10
  134. package/lib/Embed/UnknownEmbed.js +9 -10
  135. package/lib/Embed/UuDisclaimerEmbed.js +18 -28
  136. package/lib/Embed/index.d.ts +2 -3
  137. package/lib/Embed/index.js +2 -9
  138. package/lib/ErrorMessage/ErrorMessage.js +41 -24
  139. package/lib/ErrorMessage/ErrorResourceAccessDenied.js +7 -6
  140. package/lib/FactBox/FactBox.d.ts +0 -1
  141. package/lib/FactBox/FactBox.js +119 -46
  142. package/lib/FileList/File.js +1 -1
  143. package/lib/FileList/Format.js +3 -3
  144. package/lib/FileList/PdfFile.js +23 -5
  145. package/lib/FrontpageArticle/FrontpageArticle.js +1 -1
  146. package/lib/Gloss/Gloss.d.ts +10 -2
  147. package/lib/Gloss/Gloss.js +122 -93
  148. package/lib/Gloss/GlossExample.d.ts +3 -5
  149. package/lib/Gloss/GlossExample.js +49 -53
  150. package/lib/Grid/Grid.js +1 -1
  151. package/lib/KeyFigure/KeyFigure.js +2 -2
  152. package/lib/LanguageSelector/LanguageSelector.js +2 -2
  153. package/lib/LicenseByline/EmbedByline.js +5 -6
  154. package/lib/LicenseByline/LicenseDescription.js +1 -1
  155. package/lib/LicenseByline/LicenseLink.js +1 -2
  156. package/lib/LinkBlock/LinkBlock.js +62 -34
  157. package/lib/LinkBlock/LinkBlockSection.js +9 -7
  158. package/lib/Logo/Logo.d.ts +1 -3
  159. package/lib/Logo/Logo.js +2 -30
  160. package/lib/Messages/MessageBox.js +1 -1
  161. package/lib/RelatedArticleList/RelatedArticleList.d.ts +4 -4
  162. package/lib/RelatedArticleList/RelatedArticleList.js +77 -93
  163. package/lib/ResourceBox/ResourceBox.js +67 -45
  164. package/lib/Search/ActiveFilters.js +1 -1
  165. package/lib/Search/ContentTypeResult.js +9 -6
  166. package/lib/Search/ContentTypeResultStyles.js +1 -1
  167. package/lib/Search/IsPathToHighlight.js +1 -1
  168. package/lib/Search/SearchField.js +6 -8
  169. package/lib/Search/SearchResult.js +14 -19
  170. package/lib/Search/SearchResultSleeve.js +14 -16
  171. package/lib/SnackBar/SnackbarProvider.js +8 -11
  172. package/lib/TagSelector/TagSelector.d.ts +27 -12
  173. package/lib/TagSelector/TagSelector.js +126 -131
  174. package/lib/TreeStructure/AddFolderButton.js +4 -6
  175. package/lib/TreeStructure/ComboboxButton.js +4 -7
  176. package/lib/TreeStructure/FolderItem.js +12 -15
  177. package/lib/TreeStructure/FolderItems.js +3 -3
  178. package/lib/TreeStructure/TreeStructure.js +9 -12
  179. package/lib/TreeStructure/helperFunctions.js +1 -1
  180. package/lib/ZendeskButton/ZendeskButton.d.ts +19 -0
  181. package/lib/ZendeskButton/ZendeskButton.js +61 -0
  182. package/lib/i18n/formatNestedMessages.js +1 -1
  183. package/lib/i18n/index.d.ts +1 -0
  184. package/lib/i18n/index.js +20 -1
  185. package/lib/i18n/useComponentTranslations.d.ts +14 -0
  186. package/lib/i18n/useComponentTranslations.js +93 -0
  187. package/lib/index.d.ts +7 -14
  188. package/lib/index.js +77 -89
  189. package/lib/locale/messages-en.d.ts +27 -0
  190. package/lib/locale/messages-en.js +39 -12
  191. package/lib/locale/messages-nb.d.ts +27 -0
  192. package/lib/locale/messages-nb.js +39 -12
  193. package/lib/locale/messages-nn.d.ts +27 -0
  194. package/lib/locale/messages-nn.js +39 -12
  195. package/lib/locale/messages-se.d.ts +27 -0
  196. package/lib/locale/messages-se.js +39 -12
  197. package/lib/locale/messages-sma.d.ts +27 -0
  198. package/lib/locale/messages-sma.js +39 -12
  199. package/lib/model/ContentType.d.ts +3 -0
  200. package/lib/model/ContentType.js +4 -1
  201. package/lib/styles.css +1197 -0
  202. package/lib/types.d.ts +1 -0
  203. package/lib/utils/relativeUrl.js +3 -3
  204. package/package.json +18 -15
  205. package/src/Article/ArticleParagraph.tsx +11 -9
  206. package/src/AudioPlayer/AudioPlayer.tsx +139 -176
  207. package/src/AudioPlayer/Controls.tsx +210 -250
  208. package/src/AudioPlayer/SpeechControl.tsx +9 -7
  209. package/src/BlogPost/BlogPost.tsx +82 -58
  210. package/src/CampaignBlock/CampaignBlock.tsx +92 -55
  211. package/src/CodeBlock/CodeBlock.stories.tsx +0 -43
  212. package/src/CodeBlock/CodeBlock.tsx +91 -202
  213. package/src/Concept/Concept.stories.tsx +142 -0
  214. package/src/Concept/Concept.tsx +73 -0
  215. package/src/ContactBlock/ContactBlock.tsx +10 -2
  216. package/src/ContentTypeBadge/ContentTypeBadgeNew.stories.tsx +70 -0
  217. package/src/ContentTypeBadge/ContentTypeBadgeNew.tsx +69 -0
  218. package/src/Embed/AudioEmbed.tsx +2 -2
  219. package/src/Embed/BrightcoveEmbed.stories.tsx +0 -3
  220. package/src/Embed/BrightcoveEmbed.tsx +17 -19
  221. package/src/Embed/CodeEmbed.stories.tsx +95 -0
  222. package/src/Embed/CodeEmbed.tsx +62 -7
  223. package/src/Embed/ConceptEmbed.stories.tsx +1 -105
  224. package/src/Embed/ConceptEmbed.tsx +60 -393
  225. package/src/Embed/ConceptListEmbed.tsx +20 -19
  226. package/src/Embed/ContentLinkEmbed.tsx +8 -10
  227. package/src/Embed/CopyrightEmbed.tsx +1 -11
  228. package/src/Embed/EmbedErrorPlaceholder.tsx +31 -28
  229. package/src/Embed/ExternalEmbed.tsx +14 -17
  230. package/src/Embed/FootnoteEmbed.stories.tsx +2 -5
  231. package/src/Embed/FootnoteEmbed.tsx +13 -16
  232. package/src/Embed/GlossEmbed.stories.tsx +140 -0
  233. package/src/Embed/GlossEmbed.tsx +64 -0
  234. package/src/Embed/H5pEmbed.tsx +22 -16
  235. package/src/Embed/IframeEmbed.tsx +12 -6
  236. package/src/Embed/ImageEmbed.stories.tsx +53 -11
  237. package/src/Embed/ImageEmbed.tsx +162 -166
  238. package/src/Embed/InlineTriggerButton.tsx +72 -0
  239. package/src/Embed/UnknownEmbed.tsx +6 -7
  240. package/src/Embed/UuDisclaimerEmbed.stories.tsx +4 -4
  241. package/src/Embed/UuDisclaimerEmbed.tsx +17 -25
  242. package/src/Embed/index.ts +2 -3
  243. package/src/ErrorMessage/ErrorMessage.tsx +40 -29
  244. package/src/ErrorMessage/ErrorResourceAccessDenied.tsx +8 -6
  245. package/src/FactBox/FactBox.tsx +115 -115
  246. package/src/FactBox/Factbox.stories.tsx +43 -27
  247. package/src/FileList/FileList.stories.tsx +6 -1
  248. package/src/FileList/PdfFile.tsx +22 -5
  249. package/src/Gloss/Gloss.stories.tsx +107 -1
  250. package/src/Gloss/Gloss.tsx +143 -156
  251. package/src/Gloss/GlossExample.tsx +51 -77
  252. package/src/LinkBlock/LinkBlock.stories.tsx +8 -10
  253. package/src/LinkBlock/LinkBlock.tsx +54 -59
  254. package/src/LinkBlock/LinkBlockSection.tsx +9 -12
  255. package/src/Logo/Logo.stories.tsx +0 -1
  256. package/src/Logo/Logo.tsx +2 -30
  257. package/src/RelatedArticleList/RelatedArticleList.tsx +69 -88
  258. package/src/ResourceBox/ResourceBox.tsx +65 -73
  259. package/src/Search/ContentTypeResult.tsx +9 -3
  260. package/src/Search/SearchResultSleeve.tsx +5 -2
  261. package/src/TagSelector/TagSelector.stories.tsx +92 -68
  262. package/src/TagSelector/TagSelector.tsx +161 -126
  263. package/src/ZendeskButton/ZendeskButton.tsx +58 -0
  264. package/src/i18n/index.ts +5 -0
  265. package/src/i18n/useComponentTranslations.ts +72 -0
  266. package/src/index.ts +27 -18
  267. package/src/locale/messages-en.ts +29 -2
  268. package/src/locale/messages-nb.ts +29 -2
  269. package/src/locale/messages-nn.ts +29 -2
  270. package/src/locale/messages-se.ts +29 -2
  271. package/src/locale/messages-sma.ts +29 -2
  272. package/src/model/ContentType.ts +3 -0
  273. package/src/types.ts +2 -0
  274. package/es/DefinitionList/DefinitionDescription.js +0 -28
  275. package/es/DefinitionList/DefinitionTerm.js +0 -28
  276. package/es/DefinitionList/index.js +0 -10
  277. package/es/Embed/conceptComponents.js +0 -155
  278. package/es/ExpandableBox/ExpandableBox.js +0 -29
  279. package/es/ExpandableBox/index.js +0 -9
  280. package/es/Figure/Figure.js +0 -73
  281. package/es/Figure/index.js +0 -9
  282. package/es/FramedContent/FramedContent.js +0 -28
  283. package/es/FramedContent/index.js +0 -10
  284. package/es/Image/Image.js +0 -100
  285. package/es/Image/ImageLink.js +0 -39
  286. package/es/Image/index.js +0 -12
  287. package/es/LetterFilter/LetterFilter.js +0 -54
  288. package/es/LetterFilter/alphabet.js +0 -9
  289. package/es/LetterFilter/index.js +0 -10
  290. package/es/Notion/Notion.js +0 -76
  291. package/es/Notion/NotionImage.js +0 -91
  292. package/es/Notion/index.js +0 -9
  293. package/es/Table/Table.js +0 -141
  294. package/es/Table/index.js +0 -11
  295. package/es/TagSelector/Control.js +0 -28
  296. package/es/TagSelector/DropdownIndicator.js +0 -60
  297. package/es/TagSelector/Input.js +0 -22
  298. package/es/TagSelector/Menu.js +0 -27
  299. package/es/TagSelector/MenuList.js +0 -28
  300. package/es/TagSelector/Option.js +0 -60
  301. package/es/TagSelector/SelectContainer.js +0 -27
  302. package/es/TagSelector/ValueButton.js +0 -53
  303. package/es/TagSelector/ariaMessages.js +0 -94
  304. package/es/TagSelector/index.js +0 -10
  305. package/es/TagSelector/types.js +0 -1
  306. package/lib/DefinitionList/DefinitionDescription.d.ts +0 -10
  307. package/lib/DefinitionList/DefinitionDescription.js +0 -35
  308. package/lib/DefinitionList/DefinitionTerm.d.ts +0 -10
  309. package/lib/DefinitionList/DefinitionTerm.js +0 -35
  310. package/lib/DefinitionList/index.d.ts +0 -9
  311. package/lib/DefinitionList/index.js +0 -20
  312. package/lib/Embed/conceptComponents.d.ts +0 -40
  313. package/lib/Embed/conceptComponents.js +0 -163
  314. package/lib/ExpandableBox/ExpandableBox.d.ts +0 -15
  315. package/lib/ExpandableBox/ExpandableBox.js +0 -37
  316. package/lib/ExpandableBox/index.d.ts +0 -8
  317. package/lib/ExpandableBox/index.js +0 -18
  318. package/lib/Figure/Figure.d.ts +0 -16
  319. package/lib/Figure/Figure.js +0 -81
  320. package/lib/Figure/index.d.ts +0 -9
  321. package/lib/Figure/index.js +0 -13
  322. package/lib/FramedContent/FramedContent.d.ts +0 -12
  323. package/lib/FramedContent/FramedContent.js +0 -35
  324. package/lib/FramedContent/index.d.ts +0 -9
  325. package/lib/FramedContent/index.js +0 -16
  326. package/lib/Image/Image.d.ts +0 -38
  327. package/lib/Image/Image.js +0 -106
  328. package/lib/Image/ImageLink.d.ts +0 -18
  329. package/lib/Image/ImageLink.js +0 -44
  330. package/lib/Image/index.d.ts +0 -12
  331. package/lib/Image/index.js +0 -30
  332. package/lib/LetterFilter/LetterFilter.d.ts +0 -14
  333. package/lib/LetterFilter/LetterFilter.js +0 -61
  334. package/lib/LetterFilter/alphabet.d.ts +0 -8
  335. package/lib/LetterFilter/alphabet.js +0 -15
  336. package/lib/LetterFilter/index.d.ts +0 -9
  337. package/lib/LetterFilter/index.js +0 -16
  338. package/lib/Notion/Notion.d.ts +0 -20
  339. package/lib/Notion/Notion.js +0 -82
  340. package/lib/Notion/NotionImage.d.ts +0 -23
  341. package/lib/Notion/NotionImage.js +0 -101
  342. package/lib/Notion/index.d.ts +0 -8
  343. package/lib/Notion/index.js +0 -13
  344. package/lib/Table/Table.d.ts +0 -19
  345. package/lib/Table/Table.js +0 -145
  346. package/lib/Table/index.d.ts +0 -10
  347. package/lib/Table/index.js +0 -23
  348. package/lib/TagSelector/Control.d.ts +0 -11
  349. package/lib/TagSelector/Control.js +0 -35
  350. package/lib/TagSelector/DropdownIndicator.d.ts +0 -11
  351. package/lib/TagSelector/DropdownIndicator.js +0 -64
  352. package/lib/TagSelector/Input.d.ts +0 -12
  353. package/lib/TagSelector/Input.js +0 -29
  354. package/lib/TagSelector/Menu.d.ts +0 -12
  355. package/lib/TagSelector/Menu.js +0 -34
  356. package/lib/TagSelector/MenuList.d.ts +0 -16
  357. package/lib/TagSelector/MenuList.js +0 -35
  358. package/lib/TagSelector/Option.d.ts +0 -12
  359. package/lib/TagSelector/Option.js +0 -67
  360. package/lib/TagSelector/SelectContainer.d.ts +0 -11
  361. package/lib/TagSelector/SelectContainer.js +0 -34
  362. package/lib/TagSelector/ValueButton.d.ts +0 -20
  363. package/lib/TagSelector/ValueButton.js +0 -60
  364. package/lib/TagSelector/ariaMessages.d.ts +0 -16
  365. package/lib/TagSelector/ariaMessages.js +0 -101
  366. package/lib/TagSelector/index.d.ts +0 -11
  367. package/lib/TagSelector/index.js +0 -13
  368. package/lib/TagSelector/types.d.ts +0 -11
  369. package/lib/TagSelector/types.js +0 -5
  370. package/src/DefinitionList/DefinitionDescription.tsx +0 -26
  371. package/src/DefinitionList/DefinitionTerm.tsx +0 -26
  372. package/src/DefinitionList/index.tsx +0 -10
  373. package/src/Embed/conceptComponents.tsx +0 -293
  374. package/src/ExpandableBox/ExpandableBox.stories.tsx +0 -41
  375. package/src/ExpandableBox/ExpandableBox.tsx +0 -23
  376. package/src/ExpandableBox/index.ts +0 -9
  377. package/src/Figure/Figure.tsx +0 -167
  378. package/src/Figure/index.ts +0 -11
  379. package/src/FramedContent/FramedContent.stories.tsx +0 -152
  380. package/src/FramedContent/FramedContent.tsx +0 -26
  381. package/src/FramedContent/index.ts +0 -10
  382. package/src/Image/Image.stories.tsx +0 -61
  383. package/src/Image/Image.tsx +0 -147
  384. package/src/Image/ImageLink.tsx +0 -37
  385. package/src/Image/__tests__/Image-test.tsx +0 -66
  386. package/src/Image/__tests__/__snapshots__/Image-test.tsx.snap +0 -194
  387. package/src/Image/index.ts +0 -14
  388. package/src/LetterFilter/LetterFilter.stories.tsx +0 -29
  389. package/src/LetterFilter/LetterFilter.tsx +0 -78
  390. package/src/LetterFilter/alphabet.ts +0 -39
  391. package/src/LetterFilter/index.ts +0 -11
  392. package/src/Notion/Notion.tsx +0 -96
  393. package/src/Notion/NotionImage.tsx +0 -114
  394. package/src/Notion/index.ts +0 -9
  395. package/src/Table/Table.stories.tsx +0 -738
  396. package/src/Table/Table.tsx +0 -284
  397. package/src/Table/index.ts +0 -12
  398. package/src/TagSelector/Control.tsx +0 -34
  399. package/src/TagSelector/DropdownIndicator.tsx +0 -55
  400. package/src/TagSelector/Input.tsx +0 -31
  401. package/src/TagSelector/Menu.tsx +0 -38
  402. package/src/TagSelector/MenuList.tsx +0 -30
  403. package/src/TagSelector/Option.tsx +0 -58
  404. package/src/TagSelector/SelectContainer.tsx +0 -31
  405. package/src/TagSelector/ValueButton.tsx +0 -47
  406. package/src/TagSelector/ariaMessages.ts +0 -96
  407. package/src/TagSelector/index.ts +0 -14
  408. package/src/TagSelector/types.ts +0 -12
@@ -1,26 +0,0 @@
1
- /**
2
- * Copyright (c) 2023-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 { ComponentPropsWithRef, forwardRef } from "react";
10
- import styled from "@emotion/styled";
11
- import { colors, spacing } from "@ndla/core";
12
-
13
- const StyledFramedContent = styled.div`
14
- padding: ${spacing.mediumlarge};
15
- margin: ${spacing.large} 0;
16
- border: 1px solid ${colors.brand.tertiary};
17
- overflow: hidden;
18
- `;
19
-
20
- const FramedContent = forwardRef<HTMLDivElement, ComponentPropsWithRef<"div">>(({ children, ...rest }, ref) => (
21
- <StyledFramedContent {...rest} ref={ref}>
22
- {children}
23
- </StyledFramedContent>
24
- ));
25
-
26
- export default FramedContent;
@@ -1,10 +0,0 @@
1
- /**
2
- * Copyright (c) 2023-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 FramedContent from "./FramedContent";
10
- export default FramedContent;
@@ -1,61 +0,0 @@
1
- /**
2
- * Copyright (c) 2023-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 { Meta, StoryObj } from "@storybook/react";
10
- import Image from "./Image";
11
-
12
- export default {
13
- title: "Components/Image",
14
- tags: ["autodocs"],
15
- component: Image,
16
- parameters: {
17
- inlineStories: true,
18
- },
19
- args: {
20
- alt: "Mann med maske",
21
- src: "https://api.test.ndla.no/image-api/raw/id/604",
22
- },
23
- } as Meta<typeof Image>;
24
-
25
- export const Default: StoryObj<typeof Image> = {};
26
-
27
- export const Crop: StoryObj<typeof Image> = {
28
- args: {
29
- crop: {
30
- startX: 14.59,
31
- endX: 79.63,
32
- startY: 20,
33
- endY: 100,
34
- },
35
- },
36
- };
37
-
38
- export const FocalPoint: StoryObj<typeof Image> = {
39
- args: {
40
- focalPoint: {
41
- x: 65.08,
42
- y: 45.28,
43
- },
44
- sizes: "(min-width: 320px) 320px",
45
- },
46
- };
47
-
48
- export const LazyLoad: StoryObj<typeof Image> = {
49
- args: {
50
- alt: "Lyspære",
51
- src: "https://api.staging.ndla.no/image-api/raw/Ide.jpg",
52
- lazyLoad: true,
53
- lazyLoadSrc: `data:image/svg+xml;utf8,
54
- <svg xmlns="http://www.w3.org/2000/svg" height="400" width="100%">
55
- <rect x="0" y="0" width="100%" height="100%" style="fill:#EFF0F2;">
56
- <animate attributeType="XML" attributeName="fill" values="#EFF0F2;#E8E3E3;#EFF0F2;" dur="3s" repeatCount="indefinite"/>
57
- </rect>
58
- </svg>
59
- `,
60
- },
61
- };
@@ -1,147 +0,0 @@
1
- /**
2
- * Copyright (c) 2017-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 { ReactNode } from "react";
10
- import styled from "@emotion/styled";
11
- import { colors, misc } from "@ndla/core";
12
-
13
- export interface ImageCrop {
14
- startX: number;
15
- startY: number;
16
- endX: number;
17
- endY: number;
18
- }
19
-
20
- export interface ImageFocalPoint {
21
- x: number;
22
- y: number;
23
- }
24
-
25
- export const makeSrcQueryString = (width: number | undefined, crop?: ImageCrop, focalPoint?: ImageFocalPoint) => {
26
- const widthParams = width && `width=${width}`;
27
- const cropParams =
28
- crop && `cropStartX=${crop.startX}&cropEndX=${crop.endX}&cropStartY=${crop.startY}&cropEndY=${crop.endY}`;
29
- const focalPointParams = focalPoint && `focalX=${focalPoint.x}&focalY=${focalPoint.y}`;
30
- const params = [widthParams, cropParams, focalPointParams].filter((p) => p).join("&");
31
-
32
- return params;
33
- };
34
-
35
- const getSrcSet = (src: string, crop: ImageCrop | undefined, focalPoint: ImageFocalPoint | undefined) => {
36
- const widths = [2720, 2080, 1760, 1440, 1120, 1000, 960, 800, 640, 480, 320, 240, 180];
37
- return widths.map((width) => `${src}?${makeSrcQueryString(width, crop, focalPoint)} ${width}w`).join(", ");
38
- };
39
-
40
- const StyledImageWrapper = styled.div`
41
- overflow: hidden;
42
- position: relative;
43
-
44
- &[data-expanded="true"] {
45
- width: 100%;
46
- }
47
-
48
- picture {
49
- width: 100%;
50
- }
51
-
52
- &[data-svg="true"] {
53
- display: flex;
54
- justify-content: center;
55
- }
56
- &[data-border="true"] {
57
- border: 1px solid ${colors.brand.tertiary};
58
- border-bottom: 0;
59
- border-radius: ${misc.borderRadius};
60
- border-bottom-left-radius: 0;
61
- border-bottom-right-radius: 0;
62
- }
63
- &[data-expandable="true"] {
64
- cursor: pointer;
65
- }
66
- `;
67
-
68
- const StyledImage = styled.img`
69
- &[data-border="true"] {
70
- border-radius: 3px;
71
- border-bottom-left-radius: 0;
72
- border-bottom-right-radius: 0;
73
- }
74
- `;
75
-
76
- interface Props {
77
- alt: string;
78
- src: string;
79
- sizes?: string;
80
- fallbackWidth?: number;
81
- contentType?: string;
82
- srcSet?: string;
83
- lazyLoad?: boolean;
84
- lazyLoadSrc?: string;
85
- expandButton?: ReactNode;
86
- crop?: ImageCrop;
87
- focalPoint?: ImageFocalPoint;
88
- border?: string;
89
- lang?: string;
90
- onExpand?: () => void;
91
- expanded?: boolean;
92
- }
93
-
94
- const Image = ({
95
- alt,
96
- src,
97
- lazyLoad,
98
- lazyLoadSrc,
99
- crop,
100
- focalPoint,
101
- contentType,
102
- sizes = "(min-width: 1024px) 1024px, 100vw",
103
- expandButton,
104
- fallbackWidth = 1024,
105
- border,
106
- lang,
107
- onExpand,
108
- expanded,
109
- ...rest
110
- }: Props) => {
111
- const srcSet = rest.srcSet ?? getSrcSet(src, crop, focalPoint);
112
- const queryString = makeSrcQueryString(fallbackWidth, crop, focalPoint);
113
- const loading = lazyLoad ? "lazy" : undefined;
114
-
115
- if (contentType && contentType === "image/gif") {
116
- return (
117
- <StyledImageWrapper data-border={border} data-expanded={expanded} data-expandable={!!onExpand} onClick={onExpand}>
118
- <StyledImage alt={alt} loading={loading} src={`${src}`} {...rest} data-border={border} lang={lang} />
119
- </StyledImageWrapper>
120
- );
121
- }
122
-
123
- return (
124
- <StyledImageWrapper
125
- data-svg={contentType === "image/svg+xml"}
126
- data-border={border}
127
- data-expandable={!!onExpand}
128
- data-expanded={expanded}
129
- onClick={onExpand}
130
- >
131
- <picture>
132
- <source type={contentType} srcSet={srcSet} sizes={sizes} />
133
- <StyledImage
134
- alt={alt}
135
- loading={loading}
136
- src={`${src}?${queryString}`}
137
- {...rest}
138
- data-border={border}
139
- lang={lang}
140
- />
141
- </picture>
142
- {expandButton}
143
- </StyledImageWrapper>
144
- );
145
- };
146
-
147
- export default Image;
@@ -1,37 +0,0 @@
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 { ReactNode } from "react";
10
- import styled from "@emotion/styled";
11
- import { ImageCrop, ImageFocalPoint } from ".";
12
- import { makeSrcQueryString } from "./Image";
13
-
14
- const StyledLink = styled.a`
15
- box-shadow: inset 0 0;
16
- `;
17
-
18
- interface Props {
19
- src: string;
20
- children: ReactNode;
21
- sizes?: string;
22
- crop?: ImageCrop;
23
- focalPoint?: ImageFocalPoint;
24
- }
25
-
26
- export function ImageLink({ src, crop, children, ...rest }: Props) {
27
- return (
28
- <StyledLink
29
- target="_blank"
30
- href={`${src}?${makeSrcQueryString(undefined, crop)}`}
31
- rel="noopener noreferrer"
32
- {...rest}
33
- >
34
- {children}
35
- </StyledLink>
36
- );
37
- }
@@ -1,66 +0,0 @@
1
- /**
2
- * Copyright (c) 2017-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
- /* eslint-env jest */
10
-
11
- import { render } from "@testing-library/react";
12
- import "@testing-library/jest-dom";
13
- import Image, { makeSrcQueryString } from "../Image";
14
-
15
- test("Image renderers correctly", () => {
16
- const { container } = render(<Image alt="example" src="https://example.com/image.png" />, { container: undefined });
17
-
18
- expect(container.firstChild).toMatchSnapshot();
19
- });
20
-
21
- test("Lazyloaded image renderers correctly", () => {
22
- const { container } = render(
23
- <Image lazyLoad lazyLoadSrc="https://example.com/blurry.png" alt="example" src="https://example.com/image.png" />,
24
- );
25
-
26
- expect(container.firstChild).toMatchSnapshot();
27
- });
28
-
29
- test("Image with crop and focalpoint props renderers correctly", () => {
30
- const { container } = render(
31
- <Image
32
- crop={{
33
- startX: 14.59,
34
- endX: 79.63,
35
- startY: 20,
36
- endY: 100,
37
- }}
38
- focalPoint={{
39
- x: 65.08,
40
- y: 45.28,
41
- }}
42
- alt="example"
43
- src="https://example.com/image.png"
44
- />,
45
- );
46
-
47
- expect(container.firstChild).toMatchSnapshot();
48
- });
49
-
50
- test("makeSrcQueryString renders correctly", () => {
51
- const crop = {
52
- startX: 14.59,
53
- endX: 79.63,
54
- startY: 20,
55
- endY: 100,
56
- };
57
- const focalPoint = {
58
- x: 65.08,
59
- y: 45.28,
60
- };
61
- expect(makeSrcQueryString(undefined, undefined, undefined)).toMatch("");
62
- expect(makeSrcQueryString(1024, undefined, undefined)).toMatch("width=1024");
63
- expect(makeSrcQueryString(undefined, crop, undefined)).toMatchSnapshot();
64
- expect(makeSrcQueryString(undefined, undefined, focalPoint)).toMatchSnapshot();
65
- expect(makeSrcQueryString(1024, crop, focalPoint)).toMatchSnapshot();
66
- });
@@ -1,194 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`Image renderers correctly 1`] = `
4
- .emotion-0 {
5
- overflow: hidden;
6
- position: relative;
7
- }
8
-
9
- .emotion-0[data-expanded="true"] {
10
- width: 100%;
11
- }
12
-
13
- .emotion-0 picture {
14
- width: 100%;
15
- }
16
-
17
- .emotion-0[data-svg="true"] {
18
- display: -webkit-box;
19
- display: -webkit-flex;
20
- display: -ms-flexbox;
21
- display: flex;
22
- -webkit-box-pack: center;
23
- -ms-flex-pack: center;
24
- -webkit-justify-content: center;
25
- justify-content: center;
26
- }
27
-
28
- .emotion-0[data-border="true"] {
29
- border: 1px solid #a5bcd3;
30
- border-bottom: 0;
31
- border-radius: 4px;
32
- border-bottom-left-radius: 0;
33
- border-bottom-right-radius: 0;
34
- }
35
-
36
- .emotion-0[data-expandable="true"] {
37
- cursor: pointer;
38
- }
39
-
40
- .emotion-1[data-border="true"] {
41
- border-radius: 3px;
42
- border-bottom-left-radius: 0;
43
- border-bottom-right-radius: 0;
44
- }
45
-
46
- <div
47
- class="emotion-0"
48
- data-expandable="false"
49
- data-svg="false"
50
- >
51
- <picture>
52
- <source
53
- sizes="(min-width: 1024px) 1024px, 100vw"
54
- srcset="https://example.com/image.png?width=2720 2720w, https://example.com/image.png?width=2080 2080w, https://example.com/image.png?width=1760 1760w, https://example.com/image.png?width=1440 1440w, https://example.com/image.png?width=1120 1120w, https://example.com/image.png?width=1000 1000w, https://example.com/image.png?width=960 960w, https://example.com/image.png?width=800 800w, https://example.com/image.png?width=640 640w, https://example.com/image.png?width=480 480w, https://example.com/image.png?width=320 320w, https://example.com/image.png?width=240 240w, https://example.com/image.png?width=180 180w"
55
- />
56
- <img
57
- alt="example"
58
- class="emotion-1"
59
- src="https://example.com/image.png?width=1024"
60
- />
61
- </picture>
62
- </div>
63
- `;
64
-
65
- exports[`Image with crop and focalpoint props renderers correctly 1`] = `
66
- .emotion-0 {
67
- overflow: hidden;
68
- position: relative;
69
- }
70
-
71
- .emotion-0[data-expanded="true"] {
72
- width: 100%;
73
- }
74
-
75
- .emotion-0 picture {
76
- width: 100%;
77
- }
78
-
79
- .emotion-0[data-svg="true"] {
80
- display: -webkit-box;
81
- display: -webkit-flex;
82
- display: -ms-flexbox;
83
- display: flex;
84
- -webkit-box-pack: center;
85
- -ms-flex-pack: center;
86
- -webkit-justify-content: center;
87
- justify-content: center;
88
- }
89
-
90
- .emotion-0[data-border="true"] {
91
- border: 1px solid #a5bcd3;
92
- border-bottom: 0;
93
- border-radius: 4px;
94
- border-bottom-left-radius: 0;
95
- border-bottom-right-radius: 0;
96
- }
97
-
98
- .emotion-0[data-expandable="true"] {
99
- cursor: pointer;
100
- }
101
-
102
- .emotion-1[data-border="true"] {
103
- border-radius: 3px;
104
- border-bottom-left-radius: 0;
105
- border-bottom-right-radius: 0;
106
- }
107
-
108
- <div
109
- class="emotion-0"
110
- data-expandable="false"
111
- data-svg="false"
112
- >
113
- <picture>
114
- <source
115
- sizes="(min-width: 1024px) 1024px, 100vw"
116
- srcset="https://example.com/image.png?width=2720&cropStartX=14.59&cropEndX=79.63&cropStartY=20&cropEndY=100&focalX=65.08&focalY=45.28 2720w, https://example.com/image.png?width=2080&cropStartX=14.59&cropEndX=79.63&cropStartY=20&cropEndY=100&focalX=65.08&focalY=45.28 2080w, https://example.com/image.png?width=1760&cropStartX=14.59&cropEndX=79.63&cropStartY=20&cropEndY=100&focalX=65.08&focalY=45.28 1760w, https://example.com/image.png?width=1440&cropStartX=14.59&cropEndX=79.63&cropStartY=20&cropEndY=100&focalX=65.08&focalY=45.28 1440w, https://example.com/image.png?width=1120&cropStartX=14.59&cropEndX=79.63&cropStartY=20&cropEndY=100&focalX=65.08&focalY=45.28 1120w, https://example.com/image.png?width=1000&cropStartX=14.59&cropEndX=79.63&cropStartY=20&cropEndY=100&focalX=65.08&focalY=45.28 1000w, https://example.com/image.png?width=960&cropStartX=14.59&cropEndX=79.63&cropStartY=20&cropEndY=100&focalX=65.08&focalY=45.28 960w, https://example.com/image.png?width=800&cropStartX=14.59&cropEndX=79.63&cropStartY=20&cropEndY=100&focalX=65.08&focalY=45.28 800w, https://example.com/image.png?width=640&cropStartX=14.59&cropEndX=79.63&cropStartY=20&cropEndY=100&focalX=65.08&focalY=45.28 640w, https://example.com/image.png?width=480&cropStartX=14.59&cropEndX=79.63&cropStartY=20&cropEndY=100&focalX=65.08&focalY=45.28 480w, https://example.com/image.png?width=320&cropStartX=14.59&cropEndX=79.63&cropStartY=20&cropEndY=100&focalX=65.08&focalY=45.28 320w, https://example.com/image.png?width=240&cropStartX=14.59&cropEndX=79.63&cropStartY=20&cropEndY=100&focalX=65.08&focalY=45.28 240w, https://example.com/image.png?width=180&cropStartX=14.59&cropEndX=79.63&cropStartY=20&cropEndY=100&focalX=65.08&focalY=45.28 180w"
117
- />
118
- <img
119
- alt="example"
120
- class="emotion-1"
121
- src="https://example.com/image.png?width=1024&cropStartX=14.59&cropEndX=79.63&cropStartY=20&cropEndY=100&focalX=65.08&focalY=45.28"
122
- />
123
- </picture>
124
- </div>
125
- `;
126
-
127
- exports[`Lazyloaded image renderers correctly 1`] = `
128
- .emotion-0 {
129
- overflow: hidden;
130
- position: relative;
131
- }
132
-
133
- .emotion-0[data-expanded="true"] {
134
- width: 100%;
135
- }
136
-
137
- .emotion-0 picture {
138
- width: 100%;
139
- }
140
-
141
- .emotion-0[data-svg="true"] {
142
- display: -webkit-box;
143
- display: -webkit-flex;
144
- display: -ms-flexbox;
145
- display: flex;
146
- -webkit-box-pack: center;
147
- -ms-flex-pack: center;
148
- -webkit-justify-content: center;
149
- justify-content: center;
150
- }
151
-
152
- .emotion-0[data-border="true"] {
153
- border: 1px solid #a5bcd3;
154
- border-bottom: 0;
155
- border-radius: 4px;
156
- border-bottom-left-radius: 0;
157
- border-bottom-right-radius: 0;
158
- }
159
-
160
- .emotion-0[data-expandable="true"] {
161
- cursor: pointer;
162
- }
163
-
164
- .emotion-1[data-border="true"] {
165
- border-radius: 3px;
166
- border-bottom-left-radius: 0;
167
- border-bottom-right-radius: 0;
168
- }
169
-
170
- <div
171
- class="emotion-0"
172
- data-expandable="false"
173
- data-svg="false"
174
- >
175
- <picture>
176
- <source
177
- sizes="(min-width: 1024px) 1024px, 100vw"
178
- srcset="https://example.com/image.png?width=2720 2720w, https://example.com/image.png?width=2080 2080w, https://example.com/image.png?width=1760 1760w, https://example.com/image.png?width=1440 1440w, https://example.com/image.png?width=1120 1120w, https://example.com/image.png?width=1000 1000w, https://example.com/image.png?width=960 960w, https://example.com/image.png?width=800 800w, https://example.com/image.png?width=640 640w, https://example.com/image.png?width=480 480w, https://example.com/image.png?width=320 320w, https://example.com/image.png?width=240 240w, https://example.com/image.png?width=180 180w"
179
- />
180
- <img
181
- alt="example"
182
- class="emotion-1"
183
- loading="lazy"
184
- src="https://example.com/image.png?width=1024"
185
- />
186
- </picture>
187
- </div>
188
- `;
189
-
190
- exports[`makeSrcQueryString renders correctly 1`] = `"cropStartX=14.59&cropEndX=79.63&cropStartY=20&cropEndY=100"`;
191
-
192
- exports[`makeSrcQueryString renders correctly 2`] = `"focalX=65.08&focalY=45.28"`;
193
-
194
- exports[`makeSrcQueryString renders correctly 3`] = `"width=1024&cropStartX=14.59&cropEndX=79.63&cropStartY=20&cropEndY=100&focalX=65.08&focalY=45.28"`;
@@ -1,14 +0,0 @@
1
- /**
2
- * Copyright (c) 2017-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 Image from "./Image";
10
- export { makeSrcQueryString } from "./Image";
11
- export { ImageLink } from "./ImageLink";
12
- export type { ImageCrop, ImageFocalPoint } from "./Image";
13
-
14
- export default Image;
@@ -1,29 +0,0 @@
1
- /**
2
- * Copyright (c) 2022-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 { useArgs } from "@storybook/preview-api";
10
- import { Meta, StoryFn } from "@storybook/react";
11
- import LetterFilter from "./LetterFilter";
12
-
13
- export default {
14
- title: "Components/LetterFilter",
15
- component: LetterFilter,
16
- tags: ["autodocs"],
17
- args: {
18
- enabledLetters: ["a", "c"],
19
- onChange: (value?: string) => {},
20
- },
21
- } as Meta<typeof LetterFilter>;
22
-
23
- export const LetterFilterStory: StoryFn<typeof LetterFilter> = (args) => {
24
- const [, updateArgs] = useArgs();
25
-
26
- return <LetterFilter {...args} onChange={(val) => updateArgs({ value: val })} />;
27
- };
28
-
29
- LetterFilterStory.storyName = "LetterFilter";
@@ -1,78 +0,0 @@
1
- /**
2
- * Copyright (c) 2022-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 { useMemo } from "react";
10
- import { useTranslation } from "react-i18next";
11
- import styled from "@emotion/styled";
12
- import { IconButtonV2 as IconButton } from "@ndla/button";
13
- import { colors, fonts, spacing } from "@ndla/core";
14
- import { alphabet } from "./alphabet";
15
-
16
- const StyledUL = styled.ul`
17
- list-style: none;
18
- display: flex;
19
- flex-direction: row;
20
- flex-wrap: wrap;
21
- gap: ${spacing.xsmall};
22
- `;
23
-
24
- const StyledButton = styled(IconButton)`
25
- display: flex;
26
- align-items: center;
27
- justify-content: center;
28
- width: ${spacing.normal};
29
- height: ${spacing.normal};
30
- padding: 0;
31
- ${fonts.sizes(18)};
32
- && {
33
- font-weight: ${fonts.weight.semibold};
34
- }
35
-
36
- :disabled {
37
- pointer-events: none;
38
- color: ${colors.brand.light};
39
- }
40
- `;
41
-
42
- interface Props {
43
- value?: string | undefined;
44
- onChange: (value?: string) => void;
45
- enabledLetters: string[];
46
- }
47
-
48
- const LetterFilter = ({ value, onChange, enabledLetters }: Props) => {
49
- const { t } = useTranslation();
50
- const uppercaseLetters = useMemo(() => enabledLetters.map((letter) => letter.toUpperCase()), [enabledLetters]);
51
-
52
- return (
53
- <StyledUL>
54
- {alphabet.map((letter) => {
55
- const disabled = !uppercaseLetters.includes(letter.toUpperCase());
56
- const selected = letter.toUpperCase() === value?.toUpperCase();
57
- return (
58
- <li key={letter}>
59
- <StyledButton
60
- onClick={() => (selected ? onChange(undefined) : onChange(letter))}
61
- aria-label={t("listview.filters.alphabet.letterFilter", {
62
- letter,
63
- })}
64
- variant={!selected ? "ghost" : undefined}
65
- colorTheme={!selected ? "lighter" : "primary"}
66
- disabled={disabled}
67
- size="xsmall"
68
- >
69
- {letter}
70
- </StyledButton>
71
- </li>
72
- );
73
- })}
74
- </StyledUL>
75
- );
76
- };
77
-
78
- export default LetterFilter;