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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/dist/panda.buildinfo.json +120 -1
  2. package/dist/styles.css +511 -0
  3. package/es/Article/ArticleParagraph.js +11 -13
  4. package/es/CampaignBlock/CampaignBlock.js +103 -68
  5. package/es/Concept/Concept.js +69 -0
  6. package/es/ContentTypeBadge/ContentTypeBadgeNew.js +48 -0
  7. package/es/Embed/AudioEmbed.js +1 -2
  8. package/es/Embed/BrightcoveEmbed.js +13 -24
  9. package/es/Embed/ConceptEmbed.js +57 -301
  10. package/es/Embed/ConceptListEmbed.js +18 -24
  11. package/es/Embed/ContentLinkEmbed.js +10 -10
  12. package/es/Embed/CopyrightEmbed.js +4 -21
  13. package/es/Embed/ExternalEmbed.js +10 -18
  14. package/es/Embed/FootnoteEmbed.js +11 -8
  15. package/es/Embed/GlossEmbed.js +68 -0
  16. package/es/Embed/H5pEmbed.js +19 -19
  17. package/es/Embed/IframeEmbed.js +9 -6
  18. package/es/Embed/InlineTriggerButton.js +70 -0
  19. package/es/Embed/UnknownEmbed.js +9 -9
  20. package/es/Embed/UuDisclaimerEmbed.js +14 -25
  21. package/es/Embed/index.js +1 -3
  22. package/es/ErrorMessage/ErrorMessage.js +41 -22
  23. package/es/ErrorMessage/ErrorResourceAccessDenied.js +8 -6
  24. package/es/FactBox/FactBox.js +118 -47
  25. package/es/FileList/PdfFile.js +23 -5
  26. package/es/Gloss/Gloss.js +116 -86
  27. package/es/Gloss/GlossExample.js +49 -51
  28. package/es/LinkBlock/LinkBlock.js +61 -33
  29. package/es/LinkBlock/LinkBlockSection.js +9 -6
  30. package/es/Logo/Logo.js +1 -30
  31. package/es/RelatedArticleList/RelatedArticleList.js +70 -87
  32. package/es/ResourceBox/ResourceBox.js +65 -37
  33. package/es/TagSelector/TagSelector.js +124 -131
  34. package/es/i18n/index.js +2 -1
  35. package/es/i18n/useComponentTranslations.js +83 -0
  36. package/es/index.js +4 -11
  37. package/es/locale/messages-en.js +30 -4
  38. package/es/locale/messages-nb.js +30 -4
  39. package/es/locale/messages-nn.js +30 -4
  40. package/es/locale/messages-se.js +30 -4
  41. package/es/locale/messages-sma.js +30 -4
  42. package/es/model/ContentType.js +3 -0
  43. package/es/styles.css +511 -0
  44. package/lib/Article/ArticleParagraph.js +12 -14
  45. package/lib/CampaignBlock/CampaignBlock.d.ts +2 -2
  46. package/lib/CampaignBlock/CampaignBlock.js +106 -68
  47. package/lib/Concept/Concept.d.ts +18 -0
  48. package/lib/Concept/Concept.js +75 -0
  49. package/lib/ContentTypeBadge/ContentTypeBadgeNew.d.ts +17 -0
  50. package/lib/ContentTypeBadge/ContentTypeBadgeNew.js +56 -0
  51. package/lib/Embed/AudioEmbed.js +2 -3
  52. package/lib/Embed/BrightcoveEmbed.d.ts +1 -2
  53. package/lib/Embed/BrightcoveEmbed.js +16 -25
  54. package/lib/Embed/ConceptEmbed.d.ts +15 -21
  55. package/lib/Embed/ConceptEmbed.js +58 -301
  56. package/lib/Embed/ConceptListEmbed.js +21 -26
  57. package/lib/Embed/ContentLinkEmbed.js +10 -11
  58. package/lib/Embed/CopyrightEmbed.js +6 -22
  59. package/lib/Embed/ExternalEmbed.d.ts +1 -2
  60. package/lib/Embed/ExternalEmbed.js +13 -19
  61. package/lib/Embed/FootnoteEmbed.js +11 -9
  62. package/lib/Embed/GlossEmbed.d.ts +13 -0
  63. package/lib/Embed/GlossEmbed.js +76 -0
  64. package/lib/Embed/H5pEmbed.d.ts +1 -2
  65. package/lib/Embed/H5pEmbed.js +21 -19
  66. package/lib/Embed/IframeEmbed.d.ts +1 -2
  67. package/lib/Embed/IframeEmbed.js +11 -8
  68. package/lib/Embed/InlineTriggerButton.d.ts +11 -0
  69. package/lib/Embed/InlineTriggerButton.js +76 -0
  70. package/lib/Embed/UnknownEmbed.js +9 -10
  71. package/lib/Embed/UuDisclaimerEmbed.js +16 -26
  72. package/lib/Embed/index.d.ts +2 -3
  73. package/lib/Embed/index.js +2 -9
  74. package/lib/ErrorMessage/ErrorMessage.js +40 -23
  75. package/lib/ErrorMessage/ErrorResourceAccessDenied.js +7 -6
  76. package/lib/FactBox/FactBox.d.ts +0 -1
  77. package/lib/FactBox/FactBox.js +119 -46
  78. package/lib/FileList/PdfFile.js +23 -5
  79. package/lib/Gloss/Gloss.d.ts +10 -2
  80. package/lib/Gloss/Gloss.js +116 -85
  81. package/lib/Gloss/GlossExample.d.ts +3 -5
  82. package/lib/Gloss/GlossExample.js +49 -52
  83. package/lib/LinkBlock/LinkBlock.js +62 -34
  84. package/lib/LinkBlock/LinkBlockSection.js +9 -7
  85. package/lib/Logo/Logo.d.ts +1 -3
  86. package/lib/Logo/Logo.js +2 -30
  87. package/lib/RelatedArticleList/RelatedArticleList.d.ts +4 -4
  88. package/lib/RelatedArticleList/RelatedArticleList.js +74 -90
  89. package/lib/ResourceBox/ResourceBox.js +64 -37
  90. package/lib/TagSelector/TagSelector.d.ts +27 -12
  91. package/lib/TagSelector/TagSelector.js +126 -131
  92. package/lib/i18n/index.d.ts +1 -0
  93. package/lib/i18n/index.js +20 -1
  94. package/lib/i18n/useComponentTranslations.d.ts +14 -0
  95. package/lib/i18n/useComponentTranslations.js +93 -0
  96. package/lib/index.d.ts +5 -14
  97. package/lib/index.js +70 -89
  98. package/lib/locale/messages-en.d.ts +26 -0
  99. package/lib/locale/messages-en.js +30 -4
  100. package/lib/locale/messages-nb.d.ts +26 -0
  101. package/lib/locale/messages-nb.js +30 -4
  102. package/lib/locale/messages-nn.d.ts +26 -0
  103. package/lib/locale/messages-nn.js +30 -4
  104. package/lib/locale/messages-se.d.ts +26 -0
  105. package/lib/locale/messages-se.js +30 -4
  106. package/lib/locale/messages-sma.d.ts +26 -0
  107. package/lib/locale/messages-sma.js +30 -4
  108. package/lib/model/ContentType.d.ts +3 -0
  109. package/lib/model/ContentType.js +4 -1
  110. package/lib/styles.css +511 -0
  111. package/package.json +11 -13
  112. package/src/Article/ArticleParagraph.tsx +11 -9
  113. package/src/CampaignBlock/CampaignBlock.tsx +92 -55
  114. package/src/Concept/Concept.stories.tsx +142 -0
  115. package/src/Concept/Concept.tsx +73 -0
  116. package/src/ContentTypeBadge/ContentTypeBadgeNew.stories.tsx +70 -0
  117. package/src/ContentTypeBadge/ContentTypeBadgeNew.tsx +69 -0
  118. package/src/Embed/AudioEmbed.tsx +2 -2
  119. package/src/Embed/BrightcoveEmbed.stories.tsx +0 -3
  120. package/src/Embed/BrightcoveEmbed.tsx +17 -19
  121. package/src/Embed/ConceptEmbed.stories.tsx +1 -105
  122. package/src/Embed/ConceptEmbed.tsx +60 -385
  123. package/src/Embed/ConceptListEmbed.tsx +20 -19
  124. package/src/Embed/ContentLinkEmbed.tsx +8 -10
  125. package/src/Embed/CopyrightEmbed.tsx +1 -11
  126. package/src/Embed/ExternalEmbed.tsx +14 -17
  127. package/src/Embed/FootnoteEmbed.stories.tsx +2 -5
  128. package/src/Embed/FootnoteEmbed.tsx +13 -16
  129. package/src/Embed/GlossEmbed.stories.tsx +140 -0
  130. package/src/Embed/GlossEmbed.tsx +64 -0
  131. package/src/Embed/H5pEmbed.tsx +22 -16
  132. package/src/Embed/IframeEmbed.tsx +12 -6
  133. package/src/Embed/InlineTriggerButton.tsx +72 -0
  134. package/src/Embed/UnknownEmbed.tsx +6 -7
  135. package/src/Embed/UuDisclaimerEmbed.stories.tsx +4 -4
  136. package/src/Embed/UuDisclaimerEmbed.tsx +17 -25
  137. package/src/Embed/index.ts +2 -3
  138. package/src/ErrorMessage/ErrorMessage.tsx +40 -29
  139. package/src/ErrorMessage/ErrorResourceAccessDenied.tsx +8 -6
  140. package/src/FactBox/FactBox.tsx +115 -115
  141. package/src/FactBox/Factbox.stories.tsx +43 -27
  142. package/src/FileList/FileList.stories.tsx +6 -1
  143. package/src/FileList/PdfFile.tsx +22 -5
  144. package/src/Gloss/Gloss.stories.tsx +107 -1
  145. package/src/Gloss/Gloss.tsx +143 -156
  146. package/src/Gloss/GlossExample.tsx +51 -77
  147. package/src/LinkBlock/LinkBlock.stories.tsx +8 -10
  148. package/src/LinkBlock/LinkBlock.tsx +54 -59
  149. package/src/LinkBlock/LinkBlockSection.tsx +9 -12
  150. package/src/Logo/Logo.stories.tsx +0 -1
  151. package/src/Logo/Logo.tsx +2 -30
  152. package/src/RelatedArticleList/RelatedArticleList.tsx +69 -88
  153. package/src/ResourceBox/ResourceBox.tsx +63 -59
  154. package/src/TagSelector/TagSelector.stories.tsx +92 -68
  155. package/src/TagSelector/TagSelector.tsx +161 -126
  156. package/src/i18n/index.ts +5 -0
  157. package/src/i18n/useComponentTranslations.ts +72 -0
  158. package/src/index.ts +23 -18
  159. package/src/locale/messages-en.ts +28 -2
  160. package/src/locale/messages-nb.ts +28 -2
  161. package/src/locale/messages-nn.ts +28 -2
  162. package/src/locale/messages-se.ts +28 -2
  163. package/src/locale/messages-sma.ts +28 -2
  164. package/src/model/ContentType.ts +3 -0
  165. package/es/DefinitionList/DefinitionDescription.js +0 -28
  166. package/es/DefinitionList/DefinitionTerm.js +0 -28
  167. package/es/DefinitionList/index.js +0 -10
  168. package/es/Embed/conceptComponents.js +0 -155
  169. package/es/ExpandableBox/ExpandableBox.js +0 -29
  170. package/es/ExpandableBox/index.js +0 -9
  171. package/es/Figure/Figure.js +0 -73
  172. package/es/Figure/index.js +0 -9
  173. package/es/FramedContent/FramedContent.js +0 -28
  174. package/es/FramedContent/index.js +0 -10
  175. package/es/Image/Image.js +0 -99
  176. package/es/Image/ImageLink.js +0 -39
  177. package/es/Image/index.js +0 -12
  178. package/es/LetterFilter/LetterFilter.js +0 -54
  179. package/es/LetterFilter/alphabet.js +0 -9
  180. package/es/LetterFilter/index.js +0 -10
  181. package/es/Notion/Notion.js +0 -76
  182. package/es/Notion/NotionImage.js +0 -46
  183. package/es/Notion/index.js +0 -9
  184. package/es/Table/Table.js +0 -141
  185. package/es/Table/index.js +0 -11
  186. package/es/TagSelector/Control.js +0 -28
  187. package/es/TagSelector/DropdownIndicator.js +0 -60
  188. package/es/TagSelector/Input.js +0 -22
  189. package/es/TagSelector/Menu.js +0 -27
  190. package/es/TagSelector/MenuList.js +0 -28
  191. package/es/TagSelector/Option.js +0 -60
  192. package/es/TagSelector/SelectContainer.js +0 -27
  193. package/es/TagSelector/ValueButton.js +0 -53
  194. package/es/TagSelector/ariaMessages.js +0 -94
  195. package/es/TagSelector/index.js +0 -10
  196. package/es/TagSelector/types.js +0 -1
  197. package/lib/DefinitionList/DefinitionDescription.d.ts +0 -10
  198. package/lib/DefinitionList/DefinitionDescription.js +0 -35
  199. package/lib/DefinitionList/DefinitionTerm.d.ts +0 -10
  200. package/lib/DefinitionList/DefinitionTerm.js +0 -35
  201. package/lib/DefinitionList/index.d.ts +0 -9
  202. package/lib/DefinitionList/index.js +0 -20
  203. package/lib/Embed/conceptComponents.d.ts +0 -40
  204. package/lib/Embed/conceptComponents.js +0 -163
  205. package/lib/ExpandableBox/ExpandableBox.d.ts +0 -15
  206. package/lib/ExpandableBox/ExpandableBox.js +0 -37
  207. package/lib/ExpandableBox/index.d.ts +0 -8
  208. package/lib/ExpandableBox/index.js +0 -18
  209. package/lib/Figure/Figure.d.ts +0 -16
  210. package/lib/Figure/Figure.js +0 -81
  211. package/lib/Figure/index.d.ts +0 -9
  212. package/lib/Figure/index.js +0 -13
  213. package/lib/FramedContent/FramedContent.d.ts +0 -12
  214. package/lib/FramedContent/FramedContent.js +0 -35
  215. package/lib/FramedContent/index.d.ts +0 -9
  216. package/lib/FramedContent/index.js +0 -16
  217. package/lib/Image/Image.d.ts +0 -38
  218. package/lib/Image/Image.js +0 -105
  219. package/lib/Image/ImageLink.d.ts +0 -18
  220. package/lib/Image/ImageLink.js +0 -44
  221. package/lib/Image/index.d.ts +0 -12
  222. package/lib/Image/index.js +0 -30
  223. package/lib/LetterFilter/LetterFilter.d.ts +0 -14
  224. package/lib/LetterFilter/LetterFilter.js +0 -61
  225. package/lib/LetterFilter/alphabet.d.ts +0 -8
  226. package/lib/LetterFilter/alphabet.js +0 -15
  227. package/lib/LetterFilter/index.d.ts +0 -9
  228. package/lib/LetterFilter/index.js +0 -16
  229. package/lib/Notion/Notion.d.ts +0 -20
  230. package/lib/Notion/Notion.js +0 -82
  231. package/lib/Notion/NotionImage.d.ts +0 -13
  232. package/lib/Notion/NotionImage.js +0 -54
  233. package/lib/Notion/index.d.ts +0 -8
  234. package/lib/Notion/index.js +0 -13
  235. package/lib/Table/Table.d.ts +0 -19
  236. package/lib/Table/Table.js +0 -145
  237. package/lib/Table/index.d.ts +0 -10
  238. package/lib/Table/index.js +0 -23
  239. package/lib/TagSelector/Control.d.ts +0 -11
  240. package/lib/TagSelector/Control.js +0 -35
  241. package/lib/TagSelector/DropdownIndicator.d.ts +0 -11
  242. package/lib/TagSelector/DropdownIndicator.js +0 -64
  243. package/lib/TagSelector/Input.d.ts +0 -12
  244. package/lib/TagSelector/Input.js +0 -29
  245. package/lib/TagSelector/Menu.d.ts +0 -12
  246. package/lib/TagSelector/Menu.js +0 -34
  247. package/lib/TagSelector/MenuList.d.ts +0 -16
  248. package/lib/TagSelector/MenuList.js +0 -35
  249. package/lib/TagSelector/Option.d.ts +0 -12
  250. package/lib/TagSelector/Option.js +0 -67
  251. package/lib/TagSelector/SelectContainer.d.ts +0 -11
  252. package/lib/TagSelector/SelectContainer.js +0 -34
  253. package/lib/TagSelector/ValueButton.d.ts +0 -20
  254. package/lib/TagSelector/ValueButton.js +0 -60
  255. package/lib/TagSelector/ariaMessages.d.ts +0 -16
  256. package/lib/TagSelector/ariaMessages.js +0 -101
  257. package/lib/TagSelector/index.d.ts +0 -11
  258. package/lib/TagSelector/index.js +0 -13
  259. package/lib/TagSelector/types.d.ts +0 -11
  260. package/lib/TagSelector/types.js +0 -5
  261. package/src/DefinitionList/DefinitionDescription.tsx +0 -26
  262. package/src/DefinitionList/DefinitionTerm.tsx +0 -26
  263. package/src/DefinitionList/index.tsx +0 -10
  264. package/src/Embed/conceptComponents.tsx +0 -293
  265. package/src/ExpandableBox/ExpandableBox.stories.tsx +0 -41
  266. package/src/ExpandableBox/ExpandableBox.tsx +0 -23
  267. package/src/ExpandableBox/index.ts +0 -9
  268. package/src/Figure/Figure.tsx +0 -167
  269. package/src/Figure/index.ts +0 -11
  270. package/src/FramedContent/FramedContent.stories.tsx +0 -152
  271. package/src/FramedContent/FramedContent.tsx +0 -26
  272. package/src/FramedContent/index.ts +0 -10
  273. package/src/Image/Image.stories.tsx +0 -61
  274. package/src/Image/Image.tsx +0 -147
  275. package/src/Image/ImageLink.tsx +0 -37
  276. package/src/Image/index.ts +0 -14
  277. package/src/LetterFilter/LetterFilter.stories.tsx +0 -29
  278. package/src/LetterFilter/LetterFilter.tsx +0 -78
  279. package/src/LetterFilter/alphabet.ts +0 -39
  280. package/src/LetterFilter/index.ts +0 -11
  281. package/src/Notion/Notion.tsx +0 -96
  282. package/src/Notion/NotionImage.tsx +0 -64
  283. package/src/Notion/index.ts +0 -9
  284. package/src/Table/Table.stories.tsx +0 -738
  285. package/src/Table/Table.tsx +0 -284
  286. package/src/Table/index.ts +0 -12
  287. package/src/TagSelector/Control.tsx +0 -34
  288. package/src/TagSelector/DropdownIndicator.tsx +0 -55
  289. package/src/TagSelector/Input.tsx +0 -31
  290. package/src/TagSelector/Menu.tsx +0 -38
  291. package/src/TagSelector/MenuList.tsx +0 -30
  292. package/src/TagSelector/Option.tsx +0 -58
  293. package/src/TagSelector/SelectContainer.tsx +0 -31
  294. package/src/TagSelector/ValueButton.tsx +0 -47
  295. package/src/TagSelector/ariaMessages.ts +0 -96
  296. package/src/TagSelector/index.ts +0 -14
  297. package/src/TagSelector/types.ts +0 -12
@@ -65,6 +65,32 @@ export const GlossStory: StoryFn<typeof Gloss> = ({ ...args }) => {
65
65
  return <Gloss {...args} />;
66
66
  };
67
67
 
68
+ export const Bordered: StoryObj<typeof Gloss> = {
69
+ args: {
70
+ variant: "bordered",
71
+ },
72
+ };
73
+
74
+ export const NoExamples: StoryObj<typeof Gloss> = {
75
+ args: {
76
+ title: {
77
+ title: "Å angripe",
78
+ language: "nb",
79
+ },
80
+ glossData: {
81
+ gloss: "angreifen",
82
+ wordClass: wordClass.verb,
83
+ originalLanguage: "de",
84
+ transcriptions: {},
85
+ examples: [],
86
+ },
87
+ audio: {
88
+ title: "",
89
+ src: "",
90
+ },
91
+ },
92
+ };
93
+
68
94
  export const GlossChineseStory: StoryObj<typeof Gloss> = {
69
95
  args: {
70
96
  title: {
@@ -103,6 +129,86 @@ export const GlossChineseStory: StoryObj<typeof Gloss> = {
103
129
  },
104
130
  };
105
131
 
132
+ export const BigExample: StoryObj<typeof Gloss> = {
133
+ args: {
134
+ title: {
135
+ title: "(spørsmålspartikkel); hva med…?",
136
+ language: "nb",
137
+ },
138
+ audio: {
139
+ src: "https://api.ndla.no/audio/files/ne.mp3",
140
+ title: "Spill av",
141
+ },
142
+ glossData: {
143
+ gloss: "呢",
144
+ wordClass: "particle",
145
+ originalLanguage: "zh",
146
+ transcriptions: {
147
+ pinyin: "ne",
148
+ },
149
+ examples: [
150
+ [
151
+ {
152
+ example: "我叫马红,你呢?//我叫馬紅,你呢?",
153
+ language: "zh",
154
+ transcriptions: {
155
+ pinyin: "Wǒ jiào Mǎ Hóng, nǐ ne?",
156
+ },
157
+ },
158
+ {
159
+ example: "Jeg heter Ma Hong, hva med deg?",
160
+ language: "nb",
161
+ transcriptions: {},
162
+ },
163
+ {
164
+ example: "Eg heiter Ma Hong, kva med deg?",
165
+ language: "nn",
166
+ transcriptions: {},
167
+ },
168
+ ],
169
+ [
170
+ {
171
+ example: "我姓王,你呢?",
172
+ language: "zh",
173
+ transcriptions: {
174
+ pinyin: "Wǒ xìng Wáng, nǐ ne?",
175
+ },
176
+ },
177
+ {
178
+ example: "Jeg heter Wang til etternavn, hva med deg?",
179
+ language: "nb",
180
+ transcriptions: {},
181
+ },
182
+ {
183
+ example: "Eg heiter Wang til etternamn, kva med deg?",
184
+ language: "nn",
185
+ transcriptions: {},
186
+ },
187
+ ],
188
+ [
189
+ {
190
+ example: "我是老师,你呢?//我是老師,你呢?",
191
+ language: "zh",
192
+ transcriptions: {
193
+ pinyin: "Wǒ shì lǎoshī, nǐ ne?",
194
+ },
195
+ },
196
+ {
197
+ example: "Jeg er lærer, hva med deg?",
198
+ language: "nb",
199
+ transcriptions: {},
200
+ },
201
+ {
202
+ example: "Eg er lærar, kva med deg?",
203
+ language: "nn",
204
+ transcriptions: {},
205
+ },
206
+ ],
207
+ ],
208
+ },
209
+ },
210
+ };
211
+
106
212
  const GlossExampleText = {
107
213
  example: "我叫马红",
108
214
  language: "zh",
@@ -112,5 +218,5 @@ const GlossExampleText = {
112
218
  };
113
219
 
114
220
  export const GlossExampleStory: StoryFn<typeof Gloss> = () => {
115
- return <GlossExample originalLanguage="zh" index={0} example={GlossExampleText} isStandalone />;
221
+ return <GlossExample originalLanguage="zh" examples={[GlossExampleText]} />;
116
222
  };
@@ -8,102 +8,25 @@
8
8
 
9
9
  import { useMemo } from "react";
10
10
  import { useTranslation } from "react-i18next";
11
- import styled from "@emotion/styled";
12
- import { Trigger } from "@radix-ui/react-accordion";
13
- import { AccordionRoot, AccordionItem, AccordionContent } from "@ndla/accordion";
14
- import { colors, spacing, misc, fonts } from "@ndla/core";
11
+ import { AccordionItemTrigger } from "@ark-ui/react";
15
12
  import { ChevronDown } from "@ndla/icons/common";
16
- import { IGlossData, IGlossExample } from "@ndla/types-backend/concept-api";
13
+ import {
14
+ AccordionItem,
15
+ AccordionItemContent,
16
+ AccordionItemIndicator,
17
+ AccordionRoot,
18
+ IconButton,
19
+ Text,
20
+ } from "@ndla/primitives";
21
+ import { styled } from "@ndla/styled-system/jsx";
22
+ import { type StyledVariantProps } from "@ndla/styled-system/types";
23
+ import type { IGlossData, IGlossExample } from "@ndla/types-backend/concept-api";
17
24
  import GlossExample from "./GlossExample";
18
25
  import SpeechControl from "../AudioPlayer/SpeechControl";
19
26
 
20
- export interface Props {
21
- title: {
22
- title: string;
23
- language: string;
24
- };
25
- glossData?: IGlossData;
26
- audio?: {
27
- title: string;
28
- src?: string;
29
- };
30
- exampleIds?: string;
31
- exampleLangs?: string;
32
- }
33
-
34
- const StyledAccordionItem = styled(AccordionItem)`
35
- background-color: ${colors.background.lightBlue};
36
- border: 1px solid ${colors.brand.light};
37
- border-radius: ${misc.borderRadius};
38
- span {
39
- ${fonts.size.text.content}
40
- font-family: ${fonts.sans};
41
- }
42
- `;
43
-
44
- const Wrapper = styled.div`
45
- display: flex;
46
- flex-wrap: wrap;
47
- justify-content: space-between;
48
- padding: ${spacing.nsmall} ${spacing.normal} 0 ${spacing.normal};
49
- `;
50
-
51
- const GlossContainer = styled.div`
52
- display: flex;
53
- align-items: center;
54
- flex-wrap: wrap;
55
- gap: ${spacing.nsmall};
56
- span[data-pinyin] {
57
- font-style: italic;
58
- }
59
- `;
60
-
61
- const GlossSpan = styled.span`
62
- font-weight: ${fonts.weight.bold};
63
- `;
64
-
65
- const StyledWrapper = styled.div`
66
- display: flex;
67
- justify-content: space-between;
68
- align-items: center;
69
- padding: 0 ${spacing.normal} ${spacing.nsmall} ${spacing.normal};
70
- background-color: ${colors.background.lightBlue};
71
- border-radius: ${misc.borderRadius};
72
- `;
73
-
74
- const StyledAccordionContent = styled(AccordionContent)`
75
- padding: 0;
76
- `;
77
-
78
- const StyledTrigger = styled(Trigger)`
79
- background-color: transparent;
80
- cursor: pointer;
81
- border: none;
82
- padding: ${spacing.xsmall};
83
- border-radius: ${misc.borderRadiusLarge};
84
- color: ${colors.brand.primary};
85
- &:hover,
86
- &:focus-visible {
87
- color: ${colors.white};
88
- background-color: ${colors.brand.primary};
89
- }
90
- &[data-state="open"] {
91
- background-color: ${colors.brand.lighter};
92
- &:hover,
93
- &:focus-visible {
94
- background-color: ${colors.brand.primary};
95
- }
96
- }
97
- `;
98
-
99
- const StyledChevron = styled(ChevronDown)`
100
- transition: all 200ms ease-in-out;
101
- [data-styled-trigger][data-state="open"] > & {
102
- transform: rotate(180deg);
103
- }
104
- min-width: ${spacing.normal};
105
- min-height: ${spacing.normal};
106
- `;
27
+ // TODO: Figure out padding between bordered and simple variant.
28
+ // The design says that the content above the accordion content should have enough padding to align with the accordion content.
29
+ // When a gloss is bordered there's way too much padding.
107
30
 
108
31
  const getFilteredExamples = (
109
32
  glossData: IGlossData | undefined,
@@ -127,7 +50,70 @@ const getFilteredExamples = (
127
50
  return glossData?.examples ?? [];
128
51
  };
129
52
 
130
- const Gloss = ({ title, glossData, audio, exampleIds, exampleLangs }: Props) => {
53
+ const Container = styled("div", {
54
+ base: {
55
+ display: "flex",
56
+ alignItems: "center",
57
+ justifyContent: "space-between",
58
+ },
59
+ });
60
+
61
+ const TextWrapper = styled("div", {
62
+ base: {
63
+ display: "flex",
64
+ gap: "small",
65
+ },
66
+ });
67
+
68
+ const StyledAccordionItemContent = styled(AccordionItemContent, {
69
+ base: {
70
+ paddingInline: "0",
71
+ },
72
+ });
73
+
74
+ const StyledContainer = styled(Container, {
75
+ base: {
76
+ marginBlockStart: "3xsmall",
77
+ },
78
+ });
79
+
80
+ const StyledAccordionItem = styled(AccordionItem, {
81
+ base: {
82
+ paddingBlock: "small",
83
+ paddingInline: "medium",
84
+ },
85
+ defaultVariants: {
86
+ variant: "simple",
87
+ },
88
+ variants: {
89
+ variant: {
90
+ simple: {},
91
+ bordered: {
92
+ border: "1px solid",
93
+ borderColor: "stroke.subtle",
94
+ borderRadius: "xsmall",
95
+ },
96
+ },
97
+ },
98
+ });
99
+
100
+ type GlossVariantProps = StyledVariantProps<typeof StyledAccordionItem>;
101
+
102
+ export interface Props {
103
+ title: {
104
+ title: string;
105
+ language: string;
106
+ };
107
+ glossData?: IGlossData;
108
+ audio?: {
109
+ title: string;
110
+ src?: string;
111
+ };
112
+ exampleIds?: string;
113
+ exampleLangs?: string;
114
+ }
115
+
116
+ const Gloss = ({ title, glossData, audio, exampleIds, exampleLangs, variant }: Props & GlossVariantProps) => {
131
117
  const { t } = useTranslation();
132
118
 
133
119
  const filteredExamples = useMemo(
@@ -135,71 +121,72 @@ const Gloss = ({ title, glossData, audio, exampleIds, exampleLangs }: Props) =>
135
121
  [exampleIds, exampleLangs, glossData],
136
122
  );
137
123
 
124
+ if (!glossData) return null;
125
+
138
126
  return (
139
- <>
140
- {glossData && (
141
- <AccordionRoot type="single" collapsible>
142
- <StyledAccordionItem value="1">
143
- <Wrapper>
144
- <GlossContainer>
145
- <GlossSpan lang={glossData.originalLanguage}>{glossData.gloss}</GlossSpan>
146
- {glossData.transcriptions.traditional && (
147
- <span
148
- key={t("gloss.transcriptions.traditional")}
149
- aria-label={t("gloss.transcriptions.traditional")}
150
- lang={glossData.originalLanguage}
151
- >
152
- {glossData.transcriptions.traditional}
153
- </span>
154
- )}
155
- {glossData.transcriptions.pinyin && (
156
- <span
157
- data-pinyin=""
158
- key={t("gloss.transcriptions.pinyin")}
159
- aria-label={t("gloss.transcriptions.pinyin")}
160
- lang={glossData.originalLanguage}
161
- >
162
- {glossData.transcriptions.pinyin}
163
- </span>
164
- )}
165
- {glossData.wordClass && (
166
- <span aria-label={t("gloss.wordClass")}>{t(`wordClass.${glossData.wordClass}`).toLowerCase()}</span>
167
- )}
168
- </GlossContainer>
169
- {audio?.src && <SpeechControl src={audio.src} title={audio.title} type="gloss" />}
170
- </Wrapper>
171
- {filteredExamples.length > 0 ? (
172
- <>
173
- <StyledWrapper>
174
- <span lang={title.language}>{title.title}</span>
175
- <StyledTrigger data-styled-trigger aria-label={t("gloss.examples")}>
176
- <StyledChevron />
177
- </StyledTrigger>
178
- </StyledWrapper>
179
- <StyledAccordionContent>
180
- {filteredExamples.map((examples, index) => (
181
- <div key={`gloss-example-${index}`}>
182
- {examples.map((example, innerIndex) => (
183
- <GlossExample
184
- key={`gloss-example-${index}-${innerIndex}`}
185
- example={example}
186
- originalLanguage={glossData.originalLanguage}
187
- index={innerIndex}
188
- />
189
- ))}
190
- </div>
191
- ))}
192
- </StyledAccordionContent>
193
- </>
194
- ) : (
195
- <StyledWrapper>
196
- <span lang={title.language}>{title.title}</span>
197
- </StyledWrapper>
127
+ <AccordionRoot multiple variant="clean">
128
+ <StyledAccordionItem value="gloss" variant={variant}>
129
+ <Container>
130
+ <TextWrapper>
131
+ <Text textStyle="label.medium" fontWeight="bold" asChild consumeCss lang={glossData.originalLanguage}>
132
+ <span>{glossData.gloss}</span>
133
+ </Text>
134
+ {glossData.transcriptions.traditional && (
135
+ <Text textStyle="label.medium" asChild consumeCss>
136
+ <span
137
+ key={t("gloss.transcriptions.traditional")}
138
+ aria-label={t("gloss.transcriptions.traditional")}
139
+ lang={glossData.originalLanguage}
140
+ >
141
+ {glossData.transcriptions.traditional}
142
+ </span>
143
+ </Text>
144
+ )}
145
+ {glossData.transcriptions.pinyin && (
146
+ <Text textStyle="label.medium" asChild consumeCss>
147
+ <span
148
+ data-pinyin=""
149
+ key={t("gloss.transcriptions.pinyin")}
150
+ aria-label={t("gloss.transcriptions.pinyin")}
151
+ lang={glossData.originalLanguage}
152
+ >
153
+ {glossData.transcriptions.pinyin}
154
+ </span>
155
+ </Text>
156
+ )}
157
+ {glossData.wordClass && (
158
+ <Text textStyle="label.medium" asChild consumeCss>
159
+ <span aria-label={t("gloss.wordClass")}>{t(`wordClass.${glossData.wordClass}`).toLowerCase()}</span>
160
+ </Text>
198
161
  )}
199
- </StyledAccordionItem>
200
- </AccordionRoot>
201
- )}
202
- </>
162
+ </TextWrapper>
163
+ {audio?.src && <SpeechControl src={audio.src} title={audio.title} type="gloss" />}
164
+ </Container>
165
+ <StyledContainer>
166
+ <Text textStyle="label.medium" asChild consumeCss>
167
+ <span lang={title.language}>{title.title}</span>
168
+ </Text>
169
+ {!!filteredExamples.length && (
170
+ <AccordionItemTrigger asChild>
171
+ <IconButton variant="tertiary" aria-label={t("gloss.showExamples")} title={t("gloss.showExamples")}>
172
+ <AccordionItemIndicator asChild>
173
+ <ChevronDown size="medium" />
174
+ </AccordionItemIndicator>
175
+ </IconButton>
176
+ </AccordionItemTrigger>
177
+ )}
178
+ </StyledContainer>
179
+ <StyledAccordionItemContent>
180
+ {filteredExamples.map((examples, index) => (
181
+ <GlossExample
182
+ key={`gloss-example-${index}`}
183
+ examples={examples}
184
+ originalLanguage={glossData.originalLanguage}
185
+ />
186
+ ))}
187
+ </StyledAccordionItemContent>
188
+ </StyledAccordionItem>
189
+ </AccordionRoot>
203
190
  );
204
191
  };
205
192
 
@@ -6,91 +6,65 @@
6
6
  *
7
7
  */
8
8
 
9
- import styled from "@emotion/styled";
10
- import { colors, spacing, fonts, misc } from "@ndla/core";
9
+ import { Fragment } from "react";
10
+ import { Text } from "@ndla/primitives";
11
+ import { styled } from "@ndla/styled-system/jsx";
11
12
  import { IGlossExample } from "@ndla/types-backend/concept-api";
12
- import { Text } from "@ndla/typography";
13
13
 
14
- export interface Props {
15
- example: IGlossExample;
14
+ interface Props {
15
+ examples: IGlossExample[];
16
16
  originalLanguage: string | undefined;
17
- index: number;
18
- isStandalone?: boolean;
19
17
  }
20
18
 
21
- const StyledGlossExampleWrapper = styled.div`
22
- &[data-is-standalone="true"] {
23
- &:first-of-type {
24
- border-top: 1px solid ${colors.brand.lighter};
25
- }
26
- }
19
+ const StyledGlossExample = styled("div", {
20
+ base: {
21
+ borderTop: "1px solid",
22
+ borderColor: "stroke.subtle",
23
+ paddingBlock: "xsmall",
24
+ paddingInline: "medium",
25
+ _first: {
26
+ background: "surface.brand.1.subtle",
27
+ borderColor: "stroke.default",
28
+ "& p": {
29
+ fontWeight: "bold",
30
+ },
31
+ },
32
+ },
33
+ });
27
34
 
28
- &:first-of-type&:not([data-is-standalone="true"]) {
29
- border-top: 1px solid ${colors.brand.primary};
30
- }
35
+ const PinyinText = styled(Text, {
36
+ base: {
37
+ fontStyle: "italic",
38
+ },
39
+ });
31
40
 
32
- &[data-is-standalone="false"] {
33
- &:not(:last-child) {
34
- div {
35
- border-bottom: 1px solid ${colors.brand.lighter};
36
- border-radius: 0;
37
- }
38
- }
39
- }
40
- `;
41
-
42
- const StyledGlossExample = styled.div`
43
- padding: ${spacing.small} ${spacing.normal};
44
- background-color: ${colors.background.default};
45
- border: 1px solid ${colors.brand.lighter};
46
- border-top: none;
47
-
48
- &[data-is-first="true"] {
49
- background-color: ${colors.background.lightBlue};
50
- }
51
- &[data-is-standalone="false"] {
52
- border: none;
53
- border-radius: ${misc.borderRadius};
54
- }
55
- `;
56
-
57
- const StyledText = styled(Text)`
58
- &[data-is-first="true"] {
59
- font-weight: ${fonts.weight.bold};
60
- color: ${colors.text.primary};
61
- }
62
- &[data-pinyin] {
63
- font-style: italic;
64
- }
65
- `;
66
-
67
- const GlossExample = ({ example, originalLanguage, index, isStandalone = false }: Props) => {
41
+ const GlossExample = ({ examples, originalLanguage }: Props) => {
68
42
  return (
69
- <StyledGlossExampleWrapper data-is-standalone={isStandalone}>
70
- <StyledGlossExample data-is-first={index === 0} lang={example.language} data-is-standalone={isStandalone}>
71
- <StyledText data-is-first={index === 0} textStyle="meta-text-medium" margin="none">
72
- {example.example}
73
- </StyledText>
74
- </StyledGlossExample>
75
- {example.transcriptions.pinyin && (
76
- <StyledGlossExample
77
- lang={originalLanguage}
78
- data-is-standalone={isStandalone}
79
- data-is-last={example.transcriptions.traditional?.length === 0}
80
- >
81
- <StyledText data-pinyin textStyle="meta-text-medium" margin="none">
82
- {example.transcriptions?.pinyin}
83
- </StyledText>
84
- </StyledGlossExample>
85
- )}
86
- {example.transcriptions.traditional && (
87
- <StyledGlossExample lang={originalLanguage} data-is-standalone={isStandalone} data-is-last>
88
- <StyledText textStyle="meta-text-medium" margin="none">
89
- {example.transcriptions?.traditional}
90
- </StyledText>
91
- </StyledGlossExample>
92
- )}
93
- </StyledGlossExampleWrapper>
43
+ <div>
44
+ {examples.map((examples, index) => (
45
+ <Fragment key={index}>
46
+ <StyledGlossExample lang={examples.language}>
47
+ <Text textStyle="label.medium" lang={examples.language}>
48
+ {examples.example}
49
+ </Text>
50
+ </StyledGlossExample>
51
+ {!!examples.transcriptions.pinyin && (
52
+ <StyledGlossExample>
53
+ <PinyinText data-pinyin="" lang={originalLanguage} textStyle="label.medium">
54
+ {examples.transcriptions?.pinyin}
55
+ </PinyinText>
56
+ </StyledGlossExample>
57
+ )}
58
+ {!!examples.transcriptions?.traditional && (
59
+ <StyledGlossExample>
60
+ <Text textStyle="label.medium" lang={originalLanguage}>
61
+ {examples.transcriptions.traditional}
62
+ </Text>
63
+ </StyledGlossExample>
64
+ )}
65
+ </Fragment>
66
+ ))}
67
+ </div>
94
68
  );
95
69
  };
96
70
 
@@ -14,19 +14,17 @@ export default {
14
14
  title: "Components/Link Block",
15
15
  component: LinkBlock,
16
16
  tags: ["autodocs"],
17
- args: {},
17
+ args: {
18
+ title: "Redaksjonell <em>medarbeider</em> i faget spansk 2",
19
+ articleLanguage: "nb",
20
+ date: "05. mars 2023",
21
+ url: "",
22
+ },
18
23
  } as Meta<typeof LinkBlock>;
19
24
 
20
- const args = {
21
- title: "Redaksjonell <em>medarbeider</em> i faget spansk 2",
22
- articleLanguage: "nb",
23
- date: "05. mars 2023",
24
- url: "",
25
- };
25
+ export const AnnouncementExample: StoryObj<typeof LinkBlock> = {};
26
26
 
27
- export const AnnouncementExample: StoryObj<typeof LinkBlock> = { args };
28
-
29
- export const LinkList: StoryFn<typeof LinkBlock> = () => (
27
+ export const LinkList: StoryFn<typeof LinkBlock> = (args) => (
30
28
  <LinkBlockSection>
31
29
  <LinkBlock {...args} />
32
30
  <LinkBlock {...args} />