@ndla/ui 55.0.12-alpha.0 → 55.0.13-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 (192) hide show
  1. package/dist/all-aout.js +0 -0
  2. package/dist/all.css +1 -0
  3. package/dist/panda.buildinfo.json +170 -0
  4. package/dist/styles.css +686 -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/AudioPlayer/AudioPlayer.js +142 -163
  9. package/es/AudioPlayer/Controls.js +187 -203
  10. package/es/AudioPlayer/SpeechControl.js +13 -11
  11. package/es/BlogPost/BlogPost.js +85 -23
  12. package/es/CampaignBlock/CampaignBlock.js +3 -4
  13. package/es/CodeBlock/CodeBlock.js +88 -96
  14. package/es/ContactBlock/ContactBlock.js +54 -40
  15. package/es/ContentLoader/index.js +7 -7
  16. package/es/CopyParagraphButton/CopyParagraphButton.js +4 -4
  17. package/es/Embed/AudioEmbed.js +5 -9
  18. package/es/Embed/BrightcoveEmbed.js +12 -15
  19. package/es/Embed/CodeEmbed.js +58 -10
  20. package/es/Embed/ConceptEmbed.js +15 -20
  21. package/es/Embed/ContentLinkEmbed.js +1 -1
  22. package/es/Embed/EmbedErrorPlaceholder.js +32 -17
  23. package/es/Embed/ExternalEmbed.js +7 -10
  24. package/es/Embed/FootnoteEmbed.js +3 -3
  25. package/es/Embed/H5pEmbed.js +1 -2
  26. package/es/Embed/IframeEmbed.js +8 -9
  27. package/es/Embed/ImageEmbed.js +167 -122
  28. package/es/Embed/RelatedContentEmbed.js +8 -10
  29. package/es/Embed/UuDisclaimerEmbed.js +2 -2
  30. package/es/Embed/conceptComponents.js +9 -9
  31. package/es/ErrorMessage/ErrorMessage.js +1 -1
  32. package/es/FactBox/FactBox.js +2 -2
  33. package/es/FileList/File.js +1 -1
  34. package/es/FileList/Format.js +3 -3
  35. package/es/FrontpageArticle/FrontpageArticle.js +1 -1
  36. package/es/Gloss/Gloss.js +9 -11
  37. package/es/Gloss/GlossExample.js +3 -4
  38. package/es/Grid/Grid.js +1 -1
  39. package/es/Image/Image.js +7 -8
  40. package/es/Image/ImageLink.js +1 -1
  41. package/es/KeyFigure/KeyFigure.js +2 -2
  42. package/es/LanguageSelector/LanguageSelector.js +2 -2
  43. package/es/LetterFilter/LetterFilter.js +1 -1
  44. package/es/LicenseByline/EmbedByline.js +5 -6
  45. package/es/LicenseByline/LicenseDescription.js +1 -1
  46. package/es/LicenseByline/LicenseLink.js +1 -2
  47. package/es/Messages/MessageBox.js +1 -1
  48. package/es/Notion/Notion.js +2 -2
  49. package/es/Notion/NotionImage.js +12 -57
  50. package/es/RelatedArticleList/RelatedArticleList.js +3 -3
  51. package/es/ResourceBox/ResourceBox.js +12 -17
  52. package/es/Search/ActiveFilters.js +1 -1
  53. package/es/Search/ContentTypeResult.js +9 -6
  54. package/es/Search/ContentTypeResultStyles.js +1 -1
  55. package/es/Search/IsPathToHighlight.js +1 -1
  56. package/es/Search/SearchField.js +6 -8
  57. package/es/Search/SearchResult.js +14 -19
  58. package/es/Search/SearchResultSleeve.js +14 -16
  59. package/es/SnackBar/SnackbarProvider.js +8 -11
  60. package/es/TagSelector/TagSelector.js +1 -1
  61. package/es/TagSelector/ariaMessages.js +6 -6
  62. package/es/TreeStructure/AddFolderButton.js +4 -6
  63. package/es/TreeStructure/ComboboxButton.js +4 -7
  64. package/es/TreeStructure/FolderItem.js +12 -15
  65. package/es/TreeStructure/FolderItems.js +3 -3
  66. package/es/TreeStructure/TreeStructure.js +9 -12
  67. package/es/TreeStructure/helperFunctions.js +1 -1
  68. package/es/ZendeskButton/ZendeskButton.js +55 -0
  69. package/es/i18n/formatNestedMessages.js +1 -1
  70. package/es/index.js +2 -1
  71. package/es/locale/messages-en.js +9 -8
  72. package/es/locale/messages-nb.js +9 -8
  73. package/es/locale/messages-nn.js +9 -8
  74. package/es/locale/messages-se.js +9 -8
  75. package/es/locale/messages-sma.js +9 -8
  76. package/es/styles.css +686 -0
  77. package/es/utils/relativeUrl.js +3 -3
  78. package/lib/Article/Article.js +3 -4
  79. package/lib/Article/ArticleByline.js +9 -9
  80. package/lib/Article/ArticleFootNotes.js +4 -4
  81. package/lib/AudioPlayer/AudioPlayer.d.ts +1 -2
  82. package/lib/AudioPlayer/AudioPlayer.js +142 -162
  83. package/lib/AudioPlayer/Controls.js +190 -205
  84. package/lib/AudioPlayer/SpeechControl.js +13 -11
  85. package/lib/BlogPost/BlogPost.d.ts +2 -2
  86. package/lib/BlogPost/BlogPost.js +85 -24
  87. package/lib/CampaignBlock/CampaignBlock.js +3 -4
  88. package/lib/CodeBlock/CodeBlock.d.ts +5 -8
  89. package/lib/CodeBlock/CodeBlock.js +88 -96
  90. package/lib/ContactBlock/ContactBlock.js +55 -43
  91. package/lib/ContentLoader/index.js +7 -7
  92. package/lib/CopyParagraphButton/CopyParagraphButton.js +4 -4
  93. package/lib/Embed/AudioEmbed.js +5 -9
  94. package/lib/Embed/BrightcoveEmbed.js +12 -15
  95. package/lib/Embed/CodeEmbed.js +56 -8
  96. package/lib/Embed/ConceptEmbed.js +15 -20
  97. package/lib/Embed/ContentLinkEmbed.js +1 -1
  98. package/lib/Embed/EmbedErrorPlaceholder.d.ts +4 -3
  99. package/lib/Embed/EmbedErrorPlaceholder.js +32 -18
  100. package/lib/Embed/ExternalEmbed.js +7 -10
  101. package/lib/Embed/FootnoteEmbed.js +3 -3
  102. package/lib/Embed/H5pEmbed.js +1 -2
  103. package/lib/Embed/IframeEmbed.js +8 -9
  104. package/lib/Embed/ImageEmbed.d.ts +1 -2
  105. package/lib/Embed/ImageEmbed.js +167 -123
  106. package/lib/Embed/RelatedContentEmbed.js +8 -10
  107. package/lib/Embed/UuDisclaimerEmbed.js +2 -2
  108. package/lib/Embed/conceptComponents.js +9 -9
  109. package/lib/ErrorMessage/ErrorMessage.js +1 -1
  110. package/lib/FactBox/FactBox.js +2 -2
  111. package/lib/FileList/File.js +1 -1
  112. package/lib/FileList/Format.js +3 -3
  113. package/lib/FrontpageArticle/FrontpageArticle.js +1 -1
  114. package/lib/Gloss/Gloss.js +9 -11
  115. package/lib/Gloss/GlossExample.js +3 -4
  116. package/lib/Grid/Grid.js +1 -1
  117. package/lib/Image/Image.js +7 -8
  118. package/lib/Image/ImageLink.js +1 -1
  119. package/lib/KeyFigure/KeyFigure.js +2 -2
  120. package/lib/LanguageSelector/LanguageSelector.js +2 -2
  121. package/lib/LetterFilter/LetterFilter.js +1 -1
  122. package/lib/LicenseByline/EmbedByline.js +5 -6
  123. package/lib/LicenseByline/LicenseDescription.js +1 -1
  124. package/lib/LicenseByline/LicenseLink.js +1 -2
  125. package/lib/Messages/MessageBox.js +1 -1
  126. package/lib/Notion/Notion.js +2 -2
  127. package/lib/Notion/NotionImage.d.ts +1 -11
  128. package/lib/Notion/NotionImage.js +12 -59
  129. package/lib/RelatedArticleList/RelatedArticleList.js +3 -3
  130. package/lib/ResourceBox/ResourceBox.js +13 -18
  131. package/lib/Search/ActiveFilters.js +1 -1
  132. package/lib/Search/ContentTypeResult.js +9 -6
  133. package/lib/Search/ContentTypeResultStyles.js +1 -1
  134. package/lib/Search/IsPathToHighlight.js +1 -1
  135. package/lib/Search/SearchField.js +6 -8
  136. package/lib/Search/SearchResult.js +14 -19
  137. package/lib/Search/SearchResultSleeve.js +14 -16
  138. package/lib/SnackBar/SnackbarProvider.js +8 -11
  139. package/lib/TagSelector/TagSelector.js +1 -1
  140. package/lib/TagSelector/ariaMessages.js +6 -6
  141. package/lib/TreeStructure/AddFolderButton.js +4 -6
  142. package/lib/TreeStructure/ComboboxButton.js +4 -7
  143. package/lib/TreeStructure/FolderItem.js +12 -15
  144. package/lib/TreeStructure/FolderItems.js +3 -3
  145. package/lib/TreeStructure/TreeStructure.js +9 -12
  146. package/lib/TreeStructure/helperFunctions.js +1 -1
  147. package/lib/ZendeskButton/ZendeskButton.d.ts +19 -0
  148. package/lib/ZendeskButton/ZendeskButton.js +61 -0
  149. package/lib/i18n/formatNestedMessages.js +1 -1
  150. package/lib/index.d.ts +2 -0
  151. package/lib/index.js +7 -0
  152. package/lib/locale/messages-en.d.ts +1 -0
  153. package/lib/locale/messages-en.js +9 -8
  154. package/lib/locale/messages-nb.d.ts +1 -0
  155. package/lib/locale/messages-nb.js +9 -8
  156. package/lib/locale/messages-nn.d.ts +1 -0
  157. package/lib/locale/messages-nn.js +9 -8
  158. package/lib/locale/messages-se.d.ts +1 -0
  159. package/lib/locale/messages-se.js +9 -8
  160. package/lib/locale/messages-sma.d.ts +1 -0
  161. package/lib/locale/messages-sma.js +9 -8
  162. package/lib/styles.css +686 -0
  163. package/lib/types.d.ts +1 -0
  164. package/lib/utils/relativeUrl.js +3 -3
  165. package/package.json +17 -12
  166. package/src/AudioPlayer/AudioPlayer.tsx +139 -176
  167. package/src/AudioPlayer/Controls.tsx +210 -250
  168. package/src/AudioPlayer/SpeechControl.tsx +9 -7
  169. package/src/BlogPost/BlogPost.tsx +82 -58
  170. package/src/CodeBlock/CodeBlock.stories.tsx +0 -43
  171. package/src/CodeBlock/CodeBlock.tsx +91 -202
  172. package/src/ContactBlock/ContactBlock.tsx +10 -2
  173. package/src/Embed/CodeEmbed.stories.tsx +95 -0
  174. package/src/Embed/CodeEmbed.tsx +62 -7
  175. package/src/Embed/ConceptEmbed.tsx +1 -9
  176. package/src/Embed/EmbedErrorPlaceholder.tsx +31 -28
  177. package/src/Embed/ImageEmbed.stories.tsx +53 -11
  178. package/src/Embed/ImageEmbed.tsx +162 -166
  179. package/src/Notion/NotionImage.tsx +4 -54
  180. package/src/ResourceBox/ResourceBox.tsx +3 -15
  181. package/src/Search/ContentTypeResult.tsx +9 -3
  182. package/src/Search/SearchResultSleeve.tsx +5 -2
  183. package/src/ZendeskButton/ZendeskButton.tsx +58 -0
  184. package/src/index.ts +4 -0
  185. package/src/locale/messages-en.ts +1 -0
  186. package/src/locale/messages-nb.ts +1 -0
  187. package/src/locale/messages-nn.ts +1 -0
  188. package/src/locale/messages-se.ts +1 -0
  189. package/src/locale/messages-sma.ts +1 -0
  190. package/src/types.ts +2 -0
  191. package/src/Image/__tests__/Image-test.tsx +0 -66
  192. package/src/Image/__tests__/__snapshots__/Image-test.tsx.snap +0 -194
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ndla/ui",
3
- "version": "55.0.12-alpha.0",
3
+ "version": "55.0.13-alpha.0",
4
4
  "description": "UI component library for NDLA",
5
5
  "license": "GPL-3.0",
6
6
  "main": "lib/index.js",
@@ -10,7 +10,8 @@
10
10
  "scripts": {
11
11
  "build": "node ../../scripts/build.js package",
12
12
  "build:types": "tsc -p tsconfig.build.json",
13
- "prepublish": "concurrently 'yarn build:types' 'yarn build:css'",
13
+ "prepublish": "concurrently 'yarn build:types' 'yarn build:css' 'yarn build:panda'",
14
+ "build:panda": "mkdir -p dist && concurrently 'panda cssgen --minimal --outfile dist/styles.css' 'panda ship --outfile dist/panda.buildinfo.json'",
14
15
  "build:css": "webpack && cp ./dist/*.css ./es && cp ./dist/*.css ./lib"
15
16
  },
16
17
  "repository": {
@@ -25,27 +26,29 @@
25
26
  ],
26
27
  "author": "ndla@knowit.no",
27
28
  "files": [
29
+ "dist",
28
30
  "lib",
29
31
  "src",
30
32
  "es",
31
33
  "types"
32
34
  ],
33
35
  "dependencies": {
34
- "@ndla/accordion": "^5.0.5-alpha.0",
35
- "@ndla/button": "^14.0.5-alpha.0",
36
+ "@ndla/accordion": "^5.0.6-alpha.0",
37
+ "@ndla/button": "^14.0.6-alpha.0",
36
38
  "@ndla/core": "^5.0.1",
37
39
  "@ndla/dropdown-menu": "^1.0.38",
38
- "@ndla/forms": "^9.0.5-alpha.0",
40
+ "@ndla/forms": "^9.0.6-alpha.0",
39
41
  "@ndla/hooks": "^2.1.8",
40
- "@ndla/icons": "^7.0.6-alpha.0",
42
+ "@ndla/icons": "^7.0.7-alpha.0",
41
43
  "@ndla/licenses": "^8.0.0-alpha.0",
42
- "@ndla/modal": "^7.0.5-alpha.0",
43
- "@ndla/safelink": "^5.1.15",
44
+ "@ndla/modal": "^7.0.6-alpha.0",
45
+ "@ndla/primitives": "^0.0.17",
46
+ "@ndla/safelink": "^6.0.0-alpha.0",
47
+ "@ndla/styled-system": "^0.0.8",
44
48
  "@ndla/tooltip": "^8.0.1",
45
49
  "@ndla/typography": "^0.4.23",
46
50
  "@ndla/util": "^4.1.0",
47
51
  "@radix-ui/react-popover": "^1.0.7",
48
- "@radix-ui/react-slider": "^1.1.2",
49
52
  "date-fns": "^2.30.0",
50
53
  "html-react-parser": "^5.1.8",
51
54
  "i18next-browser-languagedetector": "^7.1.0",
@@ -59,14 +62,16 @@
59
62
  "@emotion/react": "^11.10.4",
60
63
  "@emotion/styled": "^11.10.4",
61
64
  "i18next": "^23.11.5",
62
- "react": ">= 16.8.0",
63
- "react-dom": ">= 16.8.0",
65
+ "react": ">= 18",
66
+ "react-dom": ">= 18",
64
67
  "react-i18next": "^14.1.1",
65
68
  "react-router-dom": "> 6.0.0"
66
69
  },
67
70
  "devDependencies": {
71
+ "@ndla/preset-panda": "^0.0.10",
68
72
  "@ndla/types-backend": "^0.2.86",
69
73
  "@ndla/types-embed": "^4.1.8",
74
+ "@pandacss/dev": "^0.42.0",
70
75
  "css-loader": "^6.7.3",
71
76
  "mini-css-extract-plugin": "^2.7.5",
72
77
  "sass-loader": "^13.2.2",
@@ -76,5 +81,5 @@
76
81
  "publishConfig": {
77
82
  "access": "public"
78
83
  },
79
- "gitHead": "8c3254246b993068a867ab9ec9594347d5ebf439"
84
+ "gitHead": "93dde6fe4aaca52642f8fa0a27f4acad359207cb"
80
85
  }
@@ -6,141 +6,120 @@
6
6
  *
7
7
  */
8
8
 
9
- import { ReactNode, useMemo, useState } from "react";
9
+ import { ReactNode, useId, useMemo, useState } from "react";
10
10
  import { useTranslation } from "react-i18next";
11
- import styled from "@emotion/styled";
12
- import { ButtonV2 } from "@ndla/button";
13
- import { breakpoints, colors, fonts, mq, spacing } from "@ndla/core";
14
- import { Cross as CrossIcon } from "@ndla/icons/action";
11
+ import { Heading, Text, Button } from "@ndla/primitives";
15
12
  import { SafeLink } from "@ndla/safelink";
16
- import { Heading, Text } from "@ndla/typography";
13
+ import { styled } from "@ndla/styled-system/jsx";
17
14
  import Controls from "./Controls";
18
15
  import SpeechControl from "./SpeechControl";
19
16
 
20
- const InfoWrapper = styled.div`
21
- border: 1px solid ${colors.brand.lighter};
22
- border-bottom: 0;
23
- display: flex;
24
- ${mq.range({ until: breakpoints.tabletWide })} {
25
- display: block;
26
- }
27
- `;
28
-
29
- const ImageWrapper = styled.div`
30
- display: flex;
31
- align-items: center;
32
- flex: 1 0 auto;
33
-
34
- width: 200px;
35
- height: 200px;
36
- overflow: hidden;
37
-
38
- img {
39
- width: 100%;
40
- height: 100%;
41
- object-fit: cover;
42
- }
43
- ${mq.range({ from: breakpoints.desktop })} {
44
- width: 260px;
45
- height: 260px;
46
- }
47
- ${mq.range({ until: breakpoints.tabletWide })} {
48
- max-height: 400px;
49
- max-width: 100%;
50
- width: 100%;
51
- height: auto;
52
- img {
53
- object-fit: scale-down;
54
- }
55
- }
56
- `;
57
-
58
- const TextWrapper = styled.div`
59
- padding: ${spacing.small};
60
- width: 100%;
61
- &[data-has-image="true"] {
62
- ${mq.range({ from: breakpoints.tablet })} {
63
- padding: ${spacing.small} ${spacing.normal};
64
- }
65
- ${mq.range({ from: breakpoints.tabletWide })} {
66
- padding: ${spacing.small} ${spacing.medium};
67
- }
68
- }
69
- `;
70
-
71
- const TitleWrapper = styled.div`
72
- ${mq.range({ from: breakpoints.tabletWide })} {
73
- display: flex;
74
- justify-content: space-between;
75
- }
76
- `;
77
-
78
- const Title = styled(Heading)`
79
- &[data-has-desc="true"] {
80
- margin: ${spacing.xsmall} 0 ${spacing.small};
81
- }
82
- `;
83
-
84
- const LinkToTextVersionWrapper = styled.div`
85
- &[data-margin="true"] {
86
- margin-top: ${spacing.small};
87
- }
88
- ${mq.range({ until: breakpoints.tabletWide })} {
89
- margin: ${spacing.small} 0;
90
- }
91
- `;
92
-
93
- const TextVersionWrapper = styled.div`
94
- border: 1px solid ${colors.brand.lighter};
95
- border-top: 0;
96
- ${fonts.sizes("16px", "30px")};
97
- font-family: ${fonts.sans};
98
- &.audio-player-text-version-hidden {
99
- display: none;
100
- }
101
- padding: ${spacing.normal} ${spacing.small} ${spacing.small};
102
- ${mq.range({ from: breakpoints.tablet })} {
103
- padding: ${spacing.normal};
104
- }
105
- ${mq.range({ from: breakpoints.tabletWide })} {
106
- padding: ${spacing.normal} ${spacing.medium};
107
- }
108
- `;
109
-
110
- const TextVersionHeadingWrapper = styled.div`
111
- display: flex;
112
- justify-content: space-between;
113
- align-items: flex-start;
114
- `;
115
-
116
- const TextVersionHeading = styled(Heading)`
117
- font-weight: ${fonts.weight.semibold};
118
- margin: ${spacing.small} 0 ${spacing.normal};
119
- `;
120
-
121
- const LinkButton = styled(ButtonV2)`
122
- box-shadow: none;
123
- padding-left: 0;
124
- padding-right: ${spacing.xxsmall};
125
- min-height: ${spacing.medium};
126
- flex: 0 0 auto;
127
- &:hover,
128
- &:focus {
129
- box-shadow: ${colors.link};
130
- }
131
- `;
132
-
133
- const CloseText = styled.span`
134
- display: inline-block;
135
- margin-left: ${spacing.xsmall};
136
- `;
137
-
138
- const TextVersionText = styled.div`
139
- max-width: 670px;
140
- & span > * {
141
- white-space: pre-wrap;
142
- }
143
- `;
17
+ // TODO: Could the audio metadata be more tightly coupled to the audio player?
18
+
19
+ const AudioPlayerWrapper = styled("div", {
20
+ base: {
21
+ border: "1px solid",
22
+ borderColor: "stroke.default",
23
+ borderRadius: "xsmall",
24
+ boxShadow: "full",
25
+ overflow: "hidden",
26
+ },
27
+ });
28
+
29
+ const InfoWrapper = styled("div", {
30
+ base: {
31
+ display: "flex",
32
+ tabletWideDown: {
33
+ display: "block",
34
+ },
35
+ },
36
+ });
37
+
38
+ const ImageWrapper = styled("div", {
39
+ base: {
40
+ display: "flex",
41
+ alignItems: "center",
42
+ flex: "1 0 auto",
43
+ width: "surface.4xsmall",
44
+ height: "surface.4xsmall",
45
+ overflow: "hidden",
46
+ "& img": {
47
+ width: "100%",
48
+ height: "100%",
49
+ objectFit: "cover",
50
+ },
51
+ desktop: {
52
+ width: "260px",
53
+ height: "260px",
54
+ },
55
+ tabletWideDown: {
56
+ maxHeight: "surface.small",
57
+ maxWidth: "100%",
58
+ width: "100%",
59
+ height: "auto",
60
+ },
61
+ },
62
+ });
63
+
64
+ const TextWrapper = styled("div", {
65
+ base: {
66
+ display: "flex",
67
+ alignItems: "flex-start",
68
+ flexDirection: "column",
69
+ gap: "xsmall",
70
+ padding: "xsmall",
71
+ width: "100%",
72
+ "&[data-has-image='true']": {
73
+ tablet: {
74
+ paddingBlock: "xsmall",
75
+ paddingInline: "medium",
76
+ },
77
+ },
78
+ },
79
+ });
80
+
81
+ const TitleWrapper = styled("div", {
82
+ base: {
83
+ display: "flex",
84
+ flexDirection: "column",
85
+ gap: "xsmall",
86
+ tabletWide: {
87
+ width: "100%",
88
+ flexDirection: "row",
89
+ justifyContent: "space-between",
90
+ },
91
+ },
92
+ });
93
+
94
+ const TextVersionWrapper = styled("div", {
95
+ base: {
96
+ display: "flex",
97
+ flexDirection: "column",
98
+ gap: "xsmall",
99
+ borderBlockStart: "1px solid",
100
+ borderColor: "stroke.default",
101
+ paddingBlock: "medium",
102
+ paddingInline: "xsmall",
103
+ tablet: {
104
+ paddingInline: "medium",
105
+ },
106
+ },
107
+ });
108
+
109
+ const TextVersionText = styled("div", {
110
+ base: {
111
+ maxWidth: "surface.xlarge",
112
+ "& span > *": {
113
+ whiteSpace: "pre-wrap",
114
+ },
115
+ },
116
+ });
117
+
118
+ const TextVersionButton = styled(Button, {
119
+ base: {
120
+ alignSelf: "flex-start",
121
+ },
122
+ });
144
123
 
145
124
  const DESCRIPTION_MAX_LENGTH = 200;
146
125
 
@@ -158,40 +137,37 @@ type Props = {
158
137
  url: string;
159
138
  alt: string;
160
139
  };
161
- staticRenderId?: string;
162
140
  };
163
141
 
164
- const AudioPlayer = ({ src, title, subtitle, speech, description, img, textVersion, staticRenderId }: Props) => {
142
+ const AudioPlayer = ({ src, title, subtitle, speech, description, img, textVersion }: Props) => {
165
143
  const { t } = useTranslation();
166
144
  const [showTextVersion, setShowTextVersion] = useState(false);
167
145
  const [showFullDescription, setShowFullDescription] = useState(false);
168
146
  const truncatedDescription = useMemo(() => description?.slice(0, DESCRIPTION_MAX_LENGTH), [description]);
147
+ const textDescriptionId = useId();
169
148
 
170
149
  if (speech) {
171
- return (
172
- <div data-audio-player={1} data-speech={1} data-src={src} data-title={title}>
173
- <SpeechControl src={src} title={title} />
174
- </div>
175
- );
150
+ return <SpeechControl src={src} title={title} />;
176
151
  }
177
152
 
178
153
  const toggleTextVersion = () => {
179
- setShowTextVersion(!showTextVersion);
154
+ setShowTextVersion((curr) => !curr);
180
155
  };
181
156
 
182
- type TextVersionComponentProps = {
183
- margin?: boolean;
184
- };
185
- const TextVersionComponent = ({ margin }: TextVersionComponentProps) => (
186
- <LinkToTextVersionWrapper data-margin={margin}>
187
- <ButtonV2 size="normal" shape="pill" onClick={toggleTextVersion} data-audio-text-button-id={staticRenderId}>
188
- {t("audio.textVersion.heading")}
189
- </ButtonV2>
190
- </LinkToTextVersionWrapper>
157
+ const textVersionButton = (
158
+ <TextVersionButton
159
+ variant="secondary"
160
+ aria-expanded={showTextVersion}
161
+ aria-controls={textDescriptionId}
162
+ size="small"
163
+ onClick={toggleTextVersion}
164
+ >
165
+ {t(showTextVersion ? "audio.textVersion.close" : "audio.textVersion.heading")}
166
+ </TextVersionButton>
191
167
  );
192
168
 
193
169
  return (
194
- <>
170
+ <AudioPlayerWrapper>
195
171
  <InfoWrapper>
196
172
  {img && (
197
173
  <ImageWrapper>
@@ -202,48 +178,35 @@ const AudioPlayer = ({ src, title, subtitle, speech, description, img, textVersi
202
178
  <TitleWrapper>
203
179
  <div>
204
180
  {subtitle?.url ? <SafeLink to={subtitle.url}>{subtitle.title}</SafeLink> : subtitle?.title}
205
- <Title element="h3" headingStyle="h4" margin="none" data-has-desc={!!description}>
206
- {title}
207
- </Title>
181
+ <Heading asChild consumeCss textStyle="title.large">
182
+ <h3>{title}</h3>
183
+ </Heading>
208
184
  </div>
209
- {textVersion && !img && <TextVersionComponent />}
185
+ {!!textVersion && !img && textVersionButton}
210
186
  </TitleWrapper>
211
187
  {description && (
212
- <Text element="p" textStyle="meta-text-small" margin="none">
188
+ <Text textStyle="body.medium">
213
189
  {showFullDescription || description.length < DESCRIPTION_MAX_LENGTH
214
190
  ? description
215
191
  : `${truncatedDescription}...`}
216
- <ButtonV2 variant="link" onClick={() => setShowFullDescription((p) => !p)}>
192
+ <Button variant="link" onClick={() => setShowFullDescription((p) => !p)}>
217
193
  {t(`audio.${showFullDescription ? "readLessDescriptionLabel" : "readMoreDescriptionLabel"}`)}
218
- </ButtonV2>
194
+ </Button>
219
195
  </Text>
220
196
  )}
221
- {textVersion && img && <TextVersionComponent margin />}
197
+ {!!textVersion && !!img && textVersionButton}
222
198
  </TextWrapper>
223
199
  </InfoWrapper>
224
- <div data-audio-player={1} data-src={src} data-title={title}>
225
- <Controls src={src} title={title} />
226
- </div>
227
- {textVersion && (showTextVersion || staticRenderId) && (
228
- <TextVersionWrapper id={staticRenderId} hidden={!!staticRenderId}>
229
- <TextVersionHeadingWrapper>
230
- <TextVersionHeading element="h3" headingStyle="h2" margin="small">
231
- {t("audio.textVersion.heading")}
232
- </TextVersionHeading>
233
- <LinkButton
234
- variant="link"
235
- size="normal"
236
- onClick={toggleTextVersion}
237
- data-audio-text-button-id={staticRenderId}
238
- >
239
- <CrossIcon style={{ width: "20px", height: "20px" }} />
240
- <CloseText>{t("audio.textVersion.close")}</CloseText>
241
- </LinkButton>
242
- </TextVersionHeadingWrapper>
200
+ <Controls src={src} title={title} />
201
+ {!!textVersion && (
202
+ <TextVersionWrapper id={textDescriptionId} hidden={!showTextVersion}>
203
+ <Heading asChild textStyle="title.medium" consumeCss>
204
+ <h3>{t("audio.textVersion.heading")}</h3>
205
+ </Heading>
243
206
  <TextVersionText>{textVersion}</TextVersionText>
244
207
  </TextVersionWrapper>
245
208
  )}
246
- </>
209
+ </AudioPlayerWrapper>
247
210
  );
248
211
  };
249
212