@ndla/ui 48.0.0 → 49.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/es/BlogPost/BlogPost.js +6 -6
  2. package/es/CampaignBlock/CampaignBlock.js +8 -8
  3. package/es/ContactBlock/ContactBlock.js +29 -20
  4. package/es/CopyParagraphButton/CopyParagraphButton.js +30 -58
  5. package/es/CopyParagraphButton/index.js +1 -3
  6. package/es/Embed/BrightcoveEmbed.js +8 -6
  7. package/es/Embed/ImageEmbed.js +7 -5
  8. package/es/Embed/RelatedContentEmbed.js +3 -3
  9. package/es/FactBox/FactBox.js +64 -19
  10. package/es/FactBox/index.js +0 -1
  11. package/es/Figure/index.js +0 -2
  12. package/es/FileList/File.js +46 -24
  13. package/es/FileList/FileList.js +18 -14
  14. package/es/FileList/index.js +0 -2
  15. package/es/LinkBlock/LinkBlock.js +7 -7
  16. package/es/Messages/index.js +1 -2
  17. package/es/Navigation/index.js +1 -2
  18. package/es/RelatedArticleList/RelatedArticleList.js +80 -35
  19. package/es/RelatedArticleList/index.js +2 -3
  20. package/es/Search/index.js +0 -1
  21. package/es/all.css +1 -1
  22. package/es/i18n/i18n.js +2 -1
  23. package/es/index.js +9 -11
  24. package/es/utils/relativeUrl.js +17 -2
  25. package/lib/BlogPost/BlogPost.js +5 -5
  26. package/lib/CampaignBlock/CampaignBlock.js +7 -7
  27. package/lib/ContactBlock/ContactBlock.js +28 -19
  28. package/lib/CopyParagraphButton/CopyParagraphButton.d.ts +5 -4
  29. package/lib/CopyParagraphButton/CopyParagraphButton.js +29 -57
  30. package/lib/CopyParagraphButton/index.d.ts +1 -3
  31. package/lib/CopyParagraphButton/index.js +0 -14
  32. package/lib/Embed/BrightcoveEmbed.d.ts +3 -2
  33. package/lib/Embed/BrightcoveEmbed.js +8 -6
  34. package/lib/Embed/ImageEmbed.d.ts +3 -2
  35. package/lib/Embed/ImageEmbed.js +7 -5
  36. package/lib/Embed/RelatedContentEmbed.js +3 -3
  37. package/lib/Embed/index.d.ts +1 -1
  38. package/lib/Embed/types.d.ts +1 -0
  39. package/lib/FactBox/FactBox.d.ts +1 -4
  40. package/lib/FactBox/FactBox.js +72 -27
  41. package/lib/FactBox/index.d.ts +0 -1
  42. package/lib/FactBox/index.js +0 -7
  43. package/lib/Figure/index.d.ts +0 -2
  44. package/lib/Figure/index.js +0 -14
  45. package/lib/FileList/File.d.ts +22 -3
  46. package/lib/FileList/File.js +45 -25
  47. package/lib/FileList/FileList.d.ts +10 -14
  48. package/lib/FileList/FileList.js +17 -15
  49. package/lib/FileList/index.d.ts +0 -2
  50. package/lib/FileList/index.js +0 -14
  51. package/lib/LinkBlock/LinkBlock.js +6 -6
  52. package/lib/Messages/index.d.ts +1 -2
  53. package/lib/Messages/index.js +0 -7
  54. package/lib/Navigation/index.d.ts +1 -2
  55. package/lib/Navigation/index.js +0 -7
  56. package/lib/RelatedArticleList/RelatedArticleList.d.ts +16 -17
  57. package/lib/RelatedArticleList/RelatedArticleList.js +78 -35
  58. package/lib/RelatedArticleList/index.d.ts +2 -3
  59. package/lib/RelatedArticleList/index.js +2 -12
  60. package/lib/Search/index.d.ts +0 -1
  61. package/lib/Search/index.js +0 -7
  62. package/lib/all.css +1 -1
  63. package/lib/i18n/i18n.d.ts +1 -0
  64. package/lib/i18n/i18n.js +4 -2
  65. package/lib/index.d.ts +10 -12
  66. package/lib/index.js +9 -89
  67. package/lib/utils/relativeUrl.d.ts +1 -1
  68. package/lib/utils/relativeUrl.js +19 -4
  69. package/package.json +17 -17
  70. package/src/BlogPost/BlogPost.tsx +2 -2
  71. package/src/CampaignBlock/CampaignBlock.tsx +2 -2
  72. package/src/ContactBlock/ContactBlock.tsx +12 -6
  73. package/src/CopyParagraphButton/CopyParagraphButton.tsx +24 -46
  74. package/src/CopyParagraphButton/index.tsx +1 -3
  75. package/src/Embed/BrightcoveEmbed.tsx +6 -5
  76. package/src/Embed/ImageEmbed.tsx +14 -5
  77. package/src/Embed/RelatedContentEmbed.stories.tsx +9 -9
  78. package/src/Embed/RelatedContentEmbed.tsx +3 -3
  79. package/src/Embed/index.ts +1 -1
  80. package/src/Embed/types.ts +2 -0
  81. package/src/FactBox/FactBox.tsx +29 -16
  82. package/src/FactBox/Factbox.stories.tsx +4 -4
  83. package/src/FactBox/index.ts +0 -2
  84. package/src/Figure/index.ts +0 -2
  85. package/src/FileList/File.tsx +62 -32
  86. package/src/FileList/FileList.stories.tsx +15 -15
  87. package/src/FileList/FileList.tsx +21 -27
  88. package/src/FileList/index.ts +0 -2
  89. package/src/LinkBlock/LinkBlock.tsx +2 -2
  90. package/src/Messages/index.ts +1 -2
  91. package/src/Navigation/index.ts +1 -2
  92. package/src/RelatedArticleList/RelatedArticleList.tsx +53 -47
  93. package/src/RelatedArticleList/index.ts +2 -3
  94. package/src/Search/index.ts +0 -1
  95. package/src/i18n/i18n.ts +2 -1
  96. package/src/index.ts +11 -14
  97. package/src/main.scss +0 -1
  98. package/src/utils/__tests__/relativeUrl-test.tsx +72 -0
  99. package/src/utils/relativeUrl.ts +19 -2
  100. package/es/CopyParagraphButton/CopyParagraphButtonV2.js +0 -87
  101. package/es/CopyParagraphButton/initCopyParagraphButtons.js +0 -29
  102. package/es/FactBox/FactBoxV2.js +0 -93
  103. package/es/Figure/FigureBylineExpandButton.js +0 -29
  104. package/es/Figure/FigureExpandButton.js +0 -30
  105. package/es/FileList/FileListV2.js +0 -47
  106. package/es/FileList/FileV2.js +0 -32
  107. package/es/Masthead/MastheadSearchModal.js +0 -82
  108. package/es/Messages/MessageBoxTag.js +0 -33
  109. package/es/MultidisciplinarySubject/List.js +0 -52
  110. package/es/MultidisciplinarySubject/ListItem.js +0 -90
  111. package/es/MultidisciplinarySubject/MultidisciplinarySubject.js +0 -125
  112. package/es/MultidisciplinarySubject/index.js +0 -10
  113. package/es/Navigation/NavigationTopicAbout.js +0 -164
  114. package/es/RelatedArticleList/RelatedArticleV2.js +0 -125
  115. package/es/Search/ToggleSearchButton.js +0 -51
  116. package/es/Translation/Translation.js +0 -33
  117. package/es/Translation/TranslationLine.js +0 -47
  118. package/es/Translation/index.js +0 -2
  119. package/lib/CopyParagraphButton/CopyParagraphButtonV2.d.ts +0 -15
  120. package/lib/CopyParagraphButton/CopyParagraphButtonV2.js +0 -92
  121. package/lib/CopyParagraphButton/initCopyParagraphButtons.d.ts +0 -2
  122. package/lib/CopyParagraphButton/initCopyParagraphButtons.js +0 -38
  123. package/lib/FactBox/FactBoxV2.d.ts +0 -13
  124. package/lib/FactBox/FactBoxV2.js +0 -98
  125. package/lib/Figure/FigureBylineExpandButton.d.ts +0 -16
  126. package/lib/Figure/FigureBylineExpandButton.js +0 -35
  127. package/lib/Figure/FigureExpandButton.d.ts +0 -16
  128. package/lib/Figure/FigureExpandButton.js +0 -35
  129. package/lib/FileList/FileListV2.d.ts +0 -13
  130. package/lib/FileList/FileListV2.js +0 -52
  131. package/lib/FileList/FileV2.d.ts +0 -15
  132. package/lib/FileList/FileV2.js +0 -40
  133. package/lib/Masthead/MastheadSearchModal.d.ts +0 -8
  134. package/lib/Masthead/MastheadSearchModal.js +0 -89
  135. package/lib/Messages/MessageBoxTag.d.ts +0 -12
  136. package/lib/Messages/MessageBoxTag.js +0 -40
  137. package/lib/MultidisciplinarySubject/List.d.ts +0 -7
  138. package/lib/MultidisciplinarySubject/List.js +0 -59
  139. package/lib/MultidisciplinarySubject/ListItem.d.ts +0 -10
  140. package/lib/MultidisciplinarySubject/ListItem.js +0 -97
  141. package/lib/MultidisciplinarySubject/MultidisciplinarySubject.d.ts +0 -13
  142. package/lib/MultidisciplinarySubject/MultidisciplinarySubject.js +0 -135
  143. package/lib/MultidisciplinarySubject/index.d.ts +0 -9
  144. package/lib/MultidisciplinarySubject/index.js +0 -17
  145. package/lib/Navigation/NavigationTopicAbout.d.ts +0 -13
  146. package/lib/Navigation/NavigationTopicAbout.js +0 -171
  147. package/lib/RelatedArticleList/RelatedArticleV2.d.ts +0 -26
  148. package/lib/RelatedArticleList/RelatedArticleV2.js +0 -131
  149. package/lib/Search/ToggleSearchButton.d.ts +0 -14
  150. package/lib/Search/ToggleSearchButton.js +0 -57
  151. package/lib/Translation/Translation.d.ts +0 -14
  152. package/lib/Translation/Translation.js +0 -38
  153. package/lib/Translation/TranslationLine.d.ts +0 -16
  154. package/lib/Translation/TranslationLine.js +0 -51
  155. package/lib/Translation/index.d.ts +0 -2
  156. package/lib/Translation/index.js +0 -20
  157. package/src/CopyParagraphButton/CopyParagraphButtonV2.tsx +0 -85
  158. package/src/CopyParagraphButton/initCopyParagraphButtons.tsx +0 -27
  159. package/src/FactBox/FactBoxV2.tsx +0 -56
  160. package/src/Figure/FigureBylineExpandButton.tsx +0 -34
  161. package/src/Figure/FigureExpandButton.tsx +0 -35
  162. package/src/FileList/FileListV2.tsx +0 -58
  163. package/src/FileList/FileV2.tsx +0 -33
  164. package/src/Masthead/MastheadSearchModal.tsx +0 -101
  165. package/src/Messages/MessageBoxTag.tsx +0 -34
  166. package/src/MultidisciplinarySubject/List.tsx +0 -49
  167. package/src/MultidisciplinarySubject/ListItem.tsx +0 -74
  168. package/src/MultidisciplinarySubject/MultidisciplinarySubject.tsx +0 -117
  169. package/src/MultidisciplinarySubject/index.ts +0 -11
  170. package/src/Navigation/NavigationTopicAbout.tsx +0 -171
  171. package/src/RelatedArticleList/RelatedArticleV2.tsx +0 -101
  172. package/src/Search/ToggleSearchButton.tsx +0 -64
  173. package/src/Translation/Translation.tsx +0 -29
  174. package/src/Translation/TranslationLine.tsx +0 -42
  175. package/src/Translation/component.translation.scss +0 -53
  176. package/src/Translation/index.ts +0 -2
@@ -1,9 +1,21 @@
1
- import { Children, cloneElement, ReactElement } from 'react';
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 { Children, HTMLProps, ReactNode, useMemo, useState } from 'react';
2
10
  import BEMHelper from 'react-bem-helper';
11
+ import { useTranslation } from 'react-i18next';
12
+ import styled from '@emotion/styled';
3
13
  import { ButtonV2 } from '@ndla/button';
4
14
  import SafeLink from '@ndla/safelink';
5
15
  import { HeadingLevel } from '@ndla/typography';
6
16
  import SectionHeading from '../SectionHeading';
17
+ import ContentTypeBadge from '../ContentTypeBadge';
18
+ import { contentTypes } from '../model/ContentType';
7
19
 
8
20
  const classes = new BEMHelper({
9
21
  name: 'related-articles',
@@ -11,29 +23,26 @@ const classes = new BEMHelper({
11
23
  });
12
24
 
13
25
  interface RelatedArticleProps {
14
- icon: ReactElement;
15
26
  title: string;
16
- modifier?: string;
17
27
  introduction: string;
18
28
  to: string;
19
29
  linkInfo?: string;
20
30
  target?: string;
31
+ type?: string;
21
32
  }
22
33
 
23
34
  export const RelatedArticle = ({
24
35
  title,
25
36
  introduction,
26
- icon,
27
- modifier,
28
37
  to,
29
38
  linkInfo = '',
30
39
  target = '',
40
+ type = contentTypes.SUBJECT_MATERIAL,
31
41
  }: RelatedArticleProps) => {
32
- const iconWithClass = cloneElement(icon, { className: 'c-icon--medium' });
33
42
  return (
34
- <article {...classes('item', modifier)}>
43
+ <article {...classes('item', type)}>
35
44
  <h3 {...classes('title')}>
36
- {iconWithClass}
45
+ <ContentTypeBadge type={type} background size="small" />
37
46
  <span {...classes('link-wrapper')}>
38
47
  <SafeLink to={to} {...classes('link')} target={target} rel={linkInfo ? 'noopener noreferrer' : undefined}>
39
48
  {title}
@@ -46,50 +55,47 @@ export const RelatedArticle = ({
46
55
  );
47
56
  };
48
57
 
49
- interface Props {
50
- messages: {
51
- title: string;
52
- showMore: string;
53
- showLess: string;
54
- };
55
- headingLevel: HeadingLevel;
56
- children?: ReactElement;
57
- dangerouslySetInnerHTML?: {
58
- __html: string;
59
- };
58
+ const HeadingWrapper = styled.div`
59
+ display: flex;
60
+ justify-content: space-between;
61
+ align-items: center;
62
+ `;
63
+
64
+ interface Props extends HTMLProps<HTMLElement> {
65
+ children?: JSX.Element[];
60
66
  articleCount?: number;
67
+ headingLevel?: HeadingLevel;
68
+ headingButtons?: ReactNode;
61
69
  }
62
- const RelatedArticleList = ({ messages, children, articleCount, dangerouslySetInnerHTML, headingLevel }: Props) => {
63
- const clonedChildren =
64
- !dangerouslySetInnerHTML && children
65
- ? Children.map(children, (article, i) =>
66
- cloneElement(article, {
67
- modifier: i >= 2 ? `${article.props.modifier} hidden` : article.props.modifier,
68
- }),
69
- )
70
- : null;
71
- const childrenCount = articleCount || Children.count(children);
70
+ export const RelatedArticleList = ({
71
+ children = [],
72
+ articleCount,
73
+ headingLevel = 'h3',
74
+ headingButtons,
75
+ ...rest
76
+ }: Props) => {
77
+ const [expanded, setExpanded] = useState(false);
78
+ const { t } = useTranslation();
79
+ const childCount = useMemo(() => articleCount ?? Children.count(children), [children, articleCount]);
80
+ const childrenToShow = useMemo(
81
+ () => (childCount > 2 && !expanded ? children?.slice(0, 2) : children),
82
+ [childCount, children, expanded],
83
+ );
72
84
 
73
85
  return (
74
- <section {...classes('')}>
75
- <SectionHeading headingLevel={headingLevel} className={classes('component-title').className}>
76
- {messages.title}
77
- </SectionHeading>
78
- <div {...classes('articles')} dangerouslySetInnerHTML={dangerouslySetInnerHTML}>
79
- {clonedChildren}
80
- </div>
81
- {childrenCount > 2 && (
82
- <ButtonV2
83
- data-type="related-article-button"
84
- data-showmore={messages.showMore}
85
- data-showless={messages.showLess}
86
- variant="outline"
87
- >
88
- {messages.showMore}
86
+ <section {...classes('')} {...rest}>
87
+ <HeadingWrapper>
88
+ <SectionHeading headingLevel={headingLevel} className={classes('component-title').className}>
89
+ {t('related.title')}
90
+ </SectionHeading>
91
+ {headingButtons}
92
+ </HeadingWrapper>
93
+ <div {...classes('articles')}>{childrenToShow}</div>
94
+ {childCount > 2 ? (
95
+ <ButtonV2 onClick={() => setExpanded((p) => !p)} variant="outline">
96
+ {t(`related.show${expanded ? 'Less' : 'More'}`)}
89
97
  </ButtonV2>
90
- )}
98
+ ) : null}
91
99
  </section>
92
100
  );
93
101
  };
94
-
95
- export default RelatedArticleList;
@@ -6,9 +6,8 @@
6
6
  *
7
7
  */
8
8
 
9
- import RelatedArticleList, { RelatedArticle } from './RelatedArticleList';
10
- import { RelatedArticleListV2 } from './RelatedArticleV2';
9
+ import { RelatedArticle, RelatedArticleList } from './RelatedArticleList';
11
10
 
12
- export { RelatedArticle, RelatedArticleListV2 };
11
+ export { RelatedArticle };
13
12
 
14
13
  export default RelatedArticleList;
@@ -11,6 +11,5 @@ import SearchField from './SearchField';
11
11
  import { SearchResultList, SearchResultItem } from './SearchResult';
12
12
 
13
13
  import ActiveFilters from './ActiveFilters';
14
- export { default as ToggleSearchButton } from './ToggleSearchButton';
15
14
 
16
15
  export { SearchField, SearchResultItem, SearchResultList, ActiveFilters };
package/src/i18n/i18n.ts CHANGED
@@ -21,13 +21,14 @@ const DETECTION_OPTIONS = {
21
21
  lookupLocalStorage: 'i18nextLng',
22
22
  };
23
23
 
24
+ export const supportedTranslationLanguages = ['nb', 'nn', 'en', 'se', 'sma'] as const;
24
25
  const i18nInstance = i18n.use(initReactI18next).use(LanguageDetector);
25
26
 
26
27
  i18nInstance.init({
27
28
  compatibilityJSON: 'v3',
28
29
  detection: DETECTION_OPTIONS,
29
30
  fallbackLng: 'nb',
30
- supportedLngs: ['nb', 'nn', 'en', 'se', 'sma'],
31
+ supportedLngs: supportedTranslationLanguages,
31
32
  resources: {
32
33
  en: {
33
34
  translation: messagesEN,
package/src/index.ts CHANGED
@@ -40,6 +40,8 @@ export {
40
40
  default as Article,
41
41
  } from './Article';
42
42
 
43
+ export { getPossiblyRelativeUrl } from './utils/relativeUrl';
44
+
43
45
  export { default as Table, TableStyling } from './Table';
44
46
 
45
47
  export { default as ResourcesWrapper, ResourcesTopicTitle } from './ResourcesWrapper';
@@ -50,15 +52,15 @@ export { default as Masthead, getMastheadHeight, useMastheadHeight, SkipToMainCo
50
52
 
51
53
  export { default as ContentLoader } from './ContentLoader';
52
54
 
53
- export { default as RelatedArticleList, RelatedArticle, RelatedArticleListV2 } from './RelatedArticleList';
55
+ export { default as RelatedArticleList, RelatedArticle } from './RelatedArticleList';
54
56
 
55
57
  export { ErrorResourceAccessDenied, default as ErrorMessage } from './ErrorMessage';
56
58
 
57
- export { default as FileList, File, FileListV2, FileV2, PdfFile } from './FileList';
59
+ export { default as FileList, File, PdfFile } from './FileList';
58
60
 
59
61
  export { default as Logo } from './Logo';
60
62
 
61
- export { default as FactBox, FactBoxV2 } from './FactBox';
63
+ export { default as FactBox } from './FactBox';
62
64
 
63
65
  export { default as Image, ImageLink, makeSrcQueryString } from './Image';
64
66
  export type { ImageCrop, ImageFocalPoint } from './Image';
@@ -80,7 +82,7 @@ export { FilterList, FilterListPhone, FilterButtons, ToggleItem } from './Filter
80
82
 
81
83
  export { Footer, EditorName, FooterText } from './Footer';
82
84
 
83
- export { Figure, FigureExpandButton, FigureOpenDialogButton, FigureBylineExpandButton } from './Figure';
85
+ export { Figure, FigureOpenDialogButton } from './Figure';
84
86
  export type { FigureType } from './Figure';
85
87
 
86
88
  export { LanguageSelector } from './LanguageSelector';
@@ -97,7 +99,6 @@ export {
97
99
  LearningPathMobileStepInfo,
98
100
  LearningPathMobileHeader,
99
101
  } from './LearningPaths';
100
- export { Translation, TranslationLine } from './Translation';
101
102
 
102
103
  export { default as SearchResultSleeve } from './Search/SearchResultSleeve';
103
104
 
@@ -105,26 +106,22 @@ export { default as ContentTypeResult } from './Search/ContentTypeResult';
105
106
 
106
107
  export { SearchFieldForm } from './Search/SearchFieldForm';
107
108
 
108
- export { default as MastheadSearchModal } from './Masthead/MastheadSearchModal';
109
-
110
109
  export { default as resourceTypeColor } from './utils/resourceTypeColor';
111
110
 
112
111
  export { default as CreatedBy } from './CreatedBy';
113
112
 
114
- export { MessageBox, MessageBoxTag, MessageBanner } from './Messages';
113
+ export { MessageBox, MessageBanner } from './Messages';
115
114
 
116
115
  export { ResourceBox } from './ResourceBox';
117
116
 
118
117
  export { default as AudioPlayer } from './AudioPlayer';
119
118
 
120
- export { NavigationBox, NavigationTopicAbout } from './Navigation';
119
+ export { NavigationBox } from './Navigation';
121
120
 
122
121
  export { default as Programme } from './Programme';
123
122
 
124
123
  export { default as CompetenceGoalTab } from './CompetenceGoalTab';
125
124
 
126
- export { default as MultidisciplinarySubject } from './MultidisciplinarySubject';
127
-
128
125
  export {
129
126
  SearchTypeResult,
130
127
  SearchHeader,
@@ -190,7 +187,7 @@ export {
190
187
 
191
188
  export { SubjectHeader, SubjectBanner } from './Subject';
192
189
 
193
- export { default as CopyParagraphButton, CopyParagraphButtonV2 } from './CopyParagraphButton';
190
+ export { default as CopyParagraphButton } from './CopyParagraphButton';
194
191
 
195
192
  export { default as ContentPlaceholder } from './ContentPlaceholder';
196
193
 
@@ -208,7 +205,7 @@ export type { Snack, SnackContext } from './SnackBar';
208
205
  export { TreeStructure } from './TreeStructure';
209
206
  export type { TreeStructureProps } from './TreeStructure';
210
207
 
211
- export { SearchField, SearchResultList, SearchResultItem, ActiveFilters, ToggleSearchButton } from './Search';
208
+ export { SearchField, SearchResultList, SearchResultItem, ActiveFilters } from './Search';
212
209
  export { default as LetterFilter } from './LetterFilter';
213
210
 
214
211
  export { OrderedList, UnOrderedList } from './List';
@@ -216,7 +213,7 @@ export { BlogPostV2 } from './BlogPost';
216
213
  export { ProgrammeCard } from './ProgrammeCard';
217
214
  export { KeyFigure } from './KeyFigure';
218
215
  export { default as ContactBlock } from './ContactBlock';
219
- export type { HeartButtonType } from './Embed';
216
+ export type { HeartButtonType, RenderContext } from './Embed';
220
217
  export { CampaignBlock } from './CampaignBlock';
221
218
  export { Grid, GridParallaxItem } from './Grid';
222
219
  export type { GridType } from './Grid';
package/src/main.scss CHANGED
@@ -16,6 +16,5 @@
16
16
  @import 'RelatedArticleList/component.related-articles';
17
17
  @import 'ContentTypeBadge/component.content-type-badge';
18
18
  @import 'Filter/component.filter';
19
- @import 'Translation/component.translation';
20
19
  @import 'Search/component.search';
21
20
  @import 'Carousel/component.carousel';
@@ -0,0 +1,72 @@
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 { getPossiblyRelativeUrl } from '../relativeUrl';
10
+
11
+ describe('getPossibleRelativeUrl', () => {
12
+ it('returns a relative URL for NDLA urls', () => {
13
+ const url = 'https://ndla.no/article/123';
14
+ const pathname = 'https://ndla.no/about/hvem-er-vi';
15
+
16
+ expect(getPossiblyRelativeUrl(url, pathname)).toEqual('/article/123');
17
+ });
18
+ it('does not return relative URLs for non-NDLA urls', () => {
19
+ const url = 'https://google.com';
20
+ const pathname = 'https://ndla.no/about/hvem-er-vi';
21
+
22
+ expect(getPossiblyRelativeUrl(url, pathname)).toEqual('https://google.com');
23
+ });
24
+ it('handles www just fine', () => {
25
+ const url = 'https://www.ndla.no/article/123';
26
+ const pathname = 'https://www.ndla.no/about/hvem-er-vi';
27
+
28
+ expect(getPossiblyRelativeUrl(url, pathname)).toEqual('/article/123');
29
+ });
30
+ it('handles other environments', () => {
31
+ const url = 'https://test.ndla.no/article/123';
32
+ const pathname = 'https://test.ndla.no/about/hvem-er-vi';
33
+
34
+ expect(getPossiblyRelativeUrl(url, pathname)).toEqual('/article/123');
35
+ });
36
+ it('strips out the languages from the URL if pathname has no language set', () => {
37
+ const url = 'https://test.ndla.no/nb/article/123';
38
+ const pathname = 'https://test.ndla.no/about/hvem-er-vi';
39
+
40
+ expect(getPossiblyRelativeUrl(url, pathname)).toEqual('/article/123');
41
+ });
42
+ it('replaces languages from the URL that do not match the pathname language', () => {
43
+ const url = 'https://test.ndla.no/nb/article/123';
44
+ const pathname = 'https://test.ndla.no/nn/about/hvem-er-vi';
45
+
46
+ expect(getPossiblyRelativeUrl(url, pathname)).toEqual('/nn/article/123');
47
+ });
48
+ it('returns a base url if the url only contains a language tag', () => {
49
+ const url = 'https://ndla.no/nb';
50
+ const pathname = 'https://ndla.no/about/hvem-er-vi';
51
+
52
+ expect(getPossiblyRelativeUrl(url, pathname)).toEqual('/');
53
+ });
54
+ it('Handles trailing backslash', () => {
55
+ const url = 'https://ndla.no/nb/';
56
+ const pathname = 'https://ndla.no/about/hvem-er-vi';
57
+
58
+ expect(getPossiblyRelativeUrl(url, pathname)).toEqual('/');
59
+ });
60
+ it('handles www', () => {
61
+ const url = 'https://www.ndla.no';
62
+ const pathname = 'https://ndla.no/about/hvem-er-vi';
63
+
64
+ expect(getPossiblyRelativeUrl(url, pathname)).toEqual('/');
65
+ });
66
+ it('handles ports', () => {
67
+ const url = 'https://www.ndla.no:8080';
68
+ const pathname = 'https://ndla.no/about/hvem-er-vi';
69
+
70
+ expect(getPossiblyRelativeUrl(url, pathname)).toEqual('/');
71
+ });
72
+ });
@@ -6,15 +6,32 @@
6
6
  *
7
7
  */
8
8
 
9
+ import { supportedTranslationLanguages } from '../i18n/i18n';
10
+
9
11
  const ENV_REGEX = /(staging|test)\.?/;
12
+ const LANGUAGE_REGEX = new RegExp(`^\\/((?:${supportedTranslationLanguages.join('|')})(?:$|\\/))`, '');
10
13
 
11
14
  const NDLA_URL = /(.*\.)?ndla.no.*/;
15
+ const REPLACE_WWW = /^www\./;
12
16
 
13
- export const usePossiblyRelativeUrl = (url: string, path?: string) => {
17
+ export const getPossiblyRelativeUrl = (url: string, path?: string) => {
14
18
  if (!path) return url;
19
+ // If not on NDLA, or if url is not a NDLA url, return url as is
15
20
  if (!NDLA_URL.test(url) || !NDLA_URL.test(path)) return url;
21
+ //Remove environment info
16
22
  const urlObj = new URL(url.replace(ENV_REGEX, ''));
17
23
  const pathObj = new URL(path.replace(ENV_REGEX, ''));
18
- if (urlObj.host === pathObj.host) return urlObj.pathname;
24
+ // If the host is the same, return the relative path
25
+ if (urlObj.hostname.replace(REPLACE_WWW, '') === pathObj.hostname.replace(REPLACE_WWW, '')) {
26
+ // Replace the language part of the url with the language part of the path
27
+ // If the path language part does not exist, remove it.
28
+ const urlMatch = urlObj.pathname.match(LANGUAGE_REGEX);
29
+ const pathMatch = pathObj.pathname.match(LANGUAGE_REGEX);
30
+ if (urlMatch?.[1] && urlMatch?.[1] !== pathMatch?.[1]) {
31
+ return urlObj.pathname.replace(urlMatch[1], pathMatch?.[1] || '');
32
+ }
33
+
34
+ return urlObj.pathname;
35
+ }
19
36
  return url;
20
37
  };
@@ -1,87 +0,0 @@
1
- import _styled from "@emotion/styled/base";
2
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
3
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
5
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
6
- function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
7
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
8
- function _EMOTION_STRINGIFIED_CSS_ERROR__() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; }
9
- /**
10
- * Copyright (c) 2021-present, NDLA.
11
- *
12
- * This source code is licensed under the GPLv3 license found in the
13
- * LICENSE file in the root directory of this source tree.
14
- *
15
- */
16
-
17
- import { useCallback, useEffect, useMemo, useState } from 'react';
18
- import { useTranslation } from 'react-i18next';
19
- import { colors } from '@ndla/core';
20
- import Tooltip from '@ndla/tooltip';
21
- import { Link } from '@ndla/icons/common';
22
- import { copyTextToClipboard } from '@ndla/util';
23
- import { jsx as _jsx } from "@emotion/react/jsx-runtime";
24
- import { jsxs as _jsxs } from "@emotion/react/jsx-runtime";
25
- var ContainerDiv = /*#__PURE__*/_styled("div", {
26
- target: "esvy8zq1",
27
- label: "ContainerDiv"
28
- })(process.env.NODE_ENV === "production" ? {
29
- name: "bjn8wh",
30
- styles: "position:relative"
31
- } : {
32
- name: "bjn8wh",
33
- styles: "position:relative",
34
- map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvcHlQYXJhZ3JhcGhCdXR0b25WMi50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZ0IrQiIsImZpbGUiOiJDb3B5UGFyYWdyYXBoQnV0dG9uVjIudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEtcHJlc2VudCwgTkRMQS5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEx2MyBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICpcbiAqL1xuXG5pbXBvcnQgeyBNb3VzZUV2ZW50LCBSZWFjdE5vZGUsIHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICdyZWFjdC1pMThuZXh0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcbmltcG9ydCB7IGNvbG9ycyB9IGZyb20gJ0BuZGxhL2NvcmUnO1xuaW1wb3J0IFRvb2x0aXAgZnJvbSAnQG5kbGEvdG9vbHRpcCc7XG5pbXBvcnQgeyBMaW5rIH0gZnJvbSAnQG5kbGEvaWNvbnMvY29tbW9uJztcbmltcG9ydCB7IGNvcHlUZXh0VG9DbGlwYm9hcmQgfSBmcm9tICdAbmRsYS91dGlsJztcblxuY29uc3QgQ29udGFpbmVyRGl2ID0gc3R5bGVkLmRpdmBcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuYDtcbmNvbnN0IEljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uYFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IC0zZW07XG4gIHRvcDogMC4xZW07XG4gIGJhY2tncm91bmQ6IG5vbmU7XG4gIGJvcmRlcjogMDtcbiAgei1pbmRleDogMTtcbiAgdHJhbnNpdGlvbjogMC4ycztcbiAgb3BhY2l0eTogMDtcbiAgY29sb3I6ICR7Y29sb3JzLmJyYW5kLmdyZXl9O1xuXG4gICYgc3ZnIHtcbiAgICB3aWR0aDogMzBweDtcbiAgICBoZWlnaHQ6IDMwcHg7XG4gIH1cblxuICAke0NvbnRhaW5lckRpdn06aG92ZXIgJixcbiAgJjpmb2N1cywgJjpmb2N1cy12aXNpYmxlLCAmOmFjdGl2ZSB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbmA7XG5cbmludGVyZmFjZSBQcm9wcyB7XG4gIC8vIFdoYXQgdG8gcmVuZGVyIHdpdGhpbiB0aGUgaDJcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbiAgY29weVRleHQ6IHN0cmluZztcbiAgbGFuZz86IHN0cmluZztcbn1cbmNvbnN0IENvcHlQYXJhZ3JhcGhCdXR0b25WMiA9ICh7IGNoaWxkcmVuLCBjb3B5VGV4dCwgbGFuZyB9OiBQcm9wcykgPT4ge1xuICBjb25zdCBbaGFzQ29waWVkLCBzZXRIYXNDb3BpZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCk7XG4gIGNvbnN0IHNhbml0aXplZFRpdGxlID0gdXNlTWVtbygoKSA9PiBlbmNvZGVVUklDb21wb25lbnQoY29weVRleHQucmVwbGFjZSgvIC9nLCAnLScpKSwgW2NvcHlUZXh0XSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaGFzQ29waWVkKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHNldEhhc0NvcGllZChmYWxzZSksIDMwMDApO1xuICAgIH1cbiAgfSwgW2hhc0NvcGllZF0pO1xuXG4gIGNvbnN0IG9uQ29weUNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldEhhc0NvcGllZCh0cnVlKTtcbiAgICBjb25zdCB7IGxvY2F0aW9uIH0gPSB3aW5kb3c7XG4gICAgY29uc3QgbmV3SGFzaCA9IGAjJHtzYW5pdGl6ZWRUaXRsZX1gO1xuICAgIGNvbnN0IHBvcnQgPSBsb2NhdGlvbi5wb3J0ID8gYDoke2xvY2F0aW9uLnBvcnR9YCA6ICcnO1xuICAgIGNvbnN0IHVybFRvQ29weSA9IGAke2xvY2F0aW9uLnByb3RvY29sfS8vJHtsb2NhdGlvbi5ob3N0bmFtZX0ke3BvcnR9JHtsb2NhdGlvbi5wYXRobmFtZX0ke2xvY2F0aW9uLnNlYXJjaH0ke25ld0hhc2h9YDtcblxuICAgIGNvcHlUZXh0VG9DbGlwYm9hcmQodXJsVG9Db3B5KTtcbiAgfSwgW3Nhbml0aXplZFRpdGxlXSk7XG5cbiAgY29uc3QgdG9vbHRpcCA9IGhhc0NvcGllZCA/IHQoJ2FydGljbGUuY29weVBhZ2VMaW5rQ29waWVkJykgOiB0KCdhcnRpY2xlLmNvcHlIZWFkZXJMaW5rJyk7XG4gIHJldHVybiAoXG4gICAgPENvbnRhaW5lckRpdj5cbiAgICAgIDxUb29sdGlwIHRvb2x0aXA9e3Rvb2x0aXB9PlxuICAgICAgICA8SWNvbkJ1dHRvbiBvbkNsaWNrPXtvbkNvcHlDbGlja30gYXJpYS1sYWJlbD17YCR7dG9vbHRpcH06ICR7Y29weVRleHR9YH0+XG4gICAgICAgICAgPExpbmsgLz5cbiAgICAgICAgPC9JY29uQnV0dG9uPlxuICAgICAgPC9Ub29sdGlwPlxuICAgICAgPGgyIGlkPXtzYW5pdGl6ZWRUaXRsZX0gdGFiSW5kZXg9ey0xfSBsYW5nPXtsYW5nfT5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9oMj5cbiAgICA8L0NvbnRhaW5lckRpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENvcHlQYXJhZ3JhcGhCdXR0b25WMjtcbiJdfQ== */",
35
- toString: _EMOTION_STRINGIFIED_CSS_ERROR__
36
- });
37
- var IconButton = /*#__PURE__*/_styled("button", {
38
- target: "esvy8zq0",
39
- label: "IconButton"
40
- })("position:absolute;left:-3em;top:0.1em;background:none;border:0;z-index:1;transition:0.2s;opacity:0;color:", colors.brand.grey, ";& svg{width:30px;height:30px;}", ContainerDiv, ":hover &,&:focus,&:focus-visible,&:active{cursor:pointer;opacity:1;}" + (process.env.NODE_ENV === "production" ? "" : "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkNvcHlQYXJhZ3JhcGhCdXR0b25WMi50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUJnQyIsImZpbGUiOiJDb3B5UGFyYWdyYXBoQnV0dG9uVjIudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEtcHJlc2VudCwgTkRMQS5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEx2MyBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICpcbiAqL1xuXG5pbXBvcnQgeyBNb3VzZUV2ZW50LCBSZWFjdE5vZGUsIHVzZUNhbGxiYWNrLCB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICdyZWFjdC1pMThuZXh0JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnQGVtb3Rpb24vc3R5bGVkJztcbmltcG9ydCB7IGNvbG9ycyB9IGZyb20gJ0BuZGxhL2NvcmUnO1xuaW1wb3J0IFRvb2x0aXAgZnJvbSAnQG5kbGEvdG9vbHRpcCc7XG5pbXBvcnQgeyBMaW5rIH0gZnJvbSAnQG5kbGEvaWNvbnMvY29tbW9uJztcbmltcG9ydCB7IGNvcHlUZXh0VG9DbGlwYm9hcmQgfSBmcm9tICdAbmRsYS91dGlsJztcblxuY29uc3QgQ29udGFpbmVyRGl2ID0gc3R5bGVkLmRpdmBcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuYDtcbmNvbnN0IEljb25CdXR0b24gPSBzdHlsZWQuYnV0dG9uYFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IC0zZW07XG4gIHRvcDogMC4xZW07XG4gIGJhY2tncm91bmQ6IG5vbmU7XG4gIGJvcmRlcjogMDtcbiAgei1pbmRleDogMTtcbiAgdHJhbnNpdGlvbjogMC4ycztcbiAgb3BhY2l0eTogMDtcbiAgY29sb3I6ICR7Y29sb3JzLmJyYW5kLmdyZXl9O1xuXG4gICYgc3ZnIHtcbiAgICB3aWR0aDogMzBweDtcbiAgICBoZWlnaHQ6IDMwcHg7XG4gIH1cblxuICAke0NvbnRhaW5lckRpdn06aG92ZXIgJixcbiAgJjpmb2N1cywgJjpmb2N1cy12aXNpYmxlLCAmOmFjdGl2ZSB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIG9wYWNpdHk6IDE7XG4gIH1cbmA7XG5cbmludGVyZmFjZSBQcm9wcyB7XG4gIC8vIFdoYXQgdG8gcmVuZGVyIHdpdGhpbiB0aGUgaDJcbiAgY2hpbGRyZW46IFJlYWN0Tm9kZTtcbiAgY29weVRleHQ6IHN0cmluZztcbiAgbGFuZz86IHN0cmluZztcbn1cbmNvbnN0IENvcHlQYXJhZ3JhcGhCdXR0b25WMiA9ICh7IGNoaWxkcmVuLCBjb3B5VGV4dCwgbGFuZyB9OiBQcm9wcykgPT4ge1xuICBjb25zdCBbaGFzQ29waWVkLCBzZXRIYXNDb3BpZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCB7IHQgfSA9IHVzZVRyYW5zbGF0aW9uKCk7XG4gIGNvbnN0IHNhbml0aXplZFRpdGxlID0gdXNlTWVtbygoKSA9PiBlbmNvZGVVUklDb21wb25lbnQoY29weVRleHQucmVwbGFjZSgvIC9nLCAnLScpKSwgW2NvcHlUZXh0XSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaGFzQ29waWVkKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHNldEhhc0NvcGllZChmYWxzZSksIDMwMDApO1xuICAgIH1cbiAgfSwgW2hhc0NvcGllZF0pO1xuXG4gIGNvbnN0IG9uQ29weUNsaWNrID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHNldEhhc0NvcGllZCh0cnVlKTtcbiAgICBjb25zdCB7IGxvY2F0aW9uIH0gPSB3aW5kb3c7XG4gICAgY29uc3QgbmV3SGFzaCA9IGAjJHtzYW5pdGl6ZWRUaXRsZX1gO1xuICAgIGNvbnN0IHBvcnQgPSBsb2NhdGlvbi5wb3J0ID8gYDoke2xvY2F0aW9uLnBvcnR9YCA6ICcnO1xuICAgIGNvbnN0IHVybFRvQ29weSA9IGAke2xvY2F0aW9uLnByb3RvY29sfS8vJHtsb2NhdGlvbi5ob3N0bmFtZX0ke3BvcnR9JHtsb2NhdGlvbi5wYXRobmFtZX0ke2xvY2F0aW9uLnNlYXJjaH0ke25ld0hhc2h9YDtcblxuICAgIGNvcHlUZXh0VG9DbGlwYm9hcmQodXJsVG9Db3B5KTtcbiAgfSwgW3Nhbml0aXplZFRpdGxlXSk7XG5cbiAgY29uc3QgdG9vbHRpcCA9IGhhc0NvcGllZCA/IHQoJ2FydGljbGUuY29weVBhZ2VMaW5rQ29waWVkJykgOiB0KCdhcnRpY2xlLmNvcHlIZWFkZXJMaW5rJyk7XG4gIHJldHVybiAoXG4gICAgPENvbnRhaW5lckRpdj5cbiAgICAgIDxUb29sdGlwIHRvb2x0aXA9e3Rvb2x0aXB9PlxuICAgICAgICA8SWNvbkJ1dHRvbiBvbkNsaWNrPXtvbkNvcHlDbGlja30gYXJpYS1sYWJlbD17YCR7dG9vbHRpcH06ICR7Y29weVRleHR9YH0+XG4gICAgICAgICAgPExpbmsgLz5cbiAgICAgICAgPC9JY29uQnV0dG9uPlxuICAgICAgPC9Ub29sdGlwPlxuICAgICAgPGgyIGlkPXtzYW5pdGl6ZWRUaXRsZX0gdGFiSW5kZXg9ey0xfSBsYW5nPXtsYW5nfT5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9oMj5cbiAgICA8L0NvbnRhaW5lckRpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IENvcHlQYXJhZ3JhcGhCdXR0b25WMjtcbiJdfQ== */"));
41
- var CopyParagraphButtonV2 = function CopyParagraphButtonV2(_ref) {
42
- var children = _ref.children,
43
- copyText = _ref.copyText,
44
- lang = _ref.lang;
45
- var _useState = useState(false),
46
- _useState2 = _slicedToArray(_useState, 2),
47
- hasCopied = _useState2[0],
48
- setHasCopied = _useState2[1];
49
- var _useTranslation = useTranslation(),
50
- t = _useTranslation.t;
51
- var sanitizedTitle = useMemo(function () {
52
- return encodeURIComponent(copyText.replace(/ /g, '-'));
53
- }, [copyText]);
54
- useEffect(function () {
55
- if (hasCopied) {
56
- setTimeout(function () {
57
- return setHasCopied(false);
58
- }, 3000);
59
- }
60
- }, [hasCopied]);
61
- var onCopyClick = useCallback(function () {
62
- setHasCopied(true);
63
- var _window = window,
64
- location = _window.location;
65
- var newHash = "#".concat(sanitizedTitle);
66
- var port = location.port ? ":".concat(location.port) : '';
67
- var urlToCopy = "".concat(location.protocol, "//").concat(location.hostname).concat(port).concat(location.pathname).concat(location.search).concat(newHash);
68
- copyTextToClipboard(urlToCopy);
69
- }, [sanitizedTitle]);
70
- var tooltip = hasCopied ? t('article.copyPageLinkCopied') : t('article.copyHeaderLink');
71
- return _jsxs(ContainerDiv, {
72
- children: [_jsx(Tooltip, {
73
- tooltip: tooltip,
74
- children: _jsx(IconButton, {
75
- onClick: onCopyClick,
76
- "aria-label": "".concat(tooltip, ": ").concat(copyText),
77
- children: _jsx(Link, {})
78
- })
79
- }), _jsx("h2", {
80
- id: sanitizedTitle,
81
- tabIndex: -1,
82
- lang: lang,
83
- children: children
84
- })]
85
- });
86
- };
87
- export default CopyParagraphButtonV2;
@@ -1,29 +0,0 @@
1
- /**
2
- * Copyright (c) 2021-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
- import ReactDOM from 'react-dom';
9
- import CopyParagraphButton from './CopyParagraphButton';
10
- import { jsx as _jsx } from "@emotion/react/jsx-runtime";
11
- var forEachElement = function forEachElement(selector, callback) {
12
- var nodeList = document.querySelectorAll(selector);
13
- for (var i = 0; i < nodeList.length; i += 1) {
14
- callback(nodeList[i], i);
15
- }
16
- };
17
- var initCopyParagraphButtons = function initCopyParagraphButtons() {
18
- forEachElement('[data-header-copy-container]', function (el) {
19
- var title = el.getAttribute('data-title');
20
-
21
- // eslint-disable-next-line react/no-deprecated
22
- ReactDOM.hydrate(_jsx(CopyParagraphButton, {
23
- title: title,
24
- content: title,
25
- hydrate: true
26
- }), el);
27
- });
28
- };
29
- export default initCopyParagraphButtons;
@@ -1,93 +0,0 @@
1
- function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
2
- import _styled from "@emotion/styled/base";
3
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
4
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
5
- function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
7
- function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
8
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
9
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
10
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
11
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
12
- function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
13
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
- function _EMOTION_STRINGIFIED_CSS_ERROR__() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; }
15
- /**
16
- * Copyright (c) 2016-present, NDLA.
17
- *
18
- * This source code is licensed under the GPLv3 license found in the
19
- * LICENSE file in the root directory of this source tree.
20
- *
21
- */
22
-
23
- import { useState } from 'react';
24
- import BEMHelper from 'react-bem-helper';
25
- import { useTranslation } from 'react-i18next';
26
- import { IconButtonV2 } from '@ndla/button';
27
- import { ChevronDown, ChevronUp } from '@ndla/icons/common';
28
- import { jsx as _jsx } from "@emotion/react/jsx-runtime";
29
- import { jsxs as _jsxs } from "@emotion/react/jsx-runtime";
30
- var classes = new BEMHelper({
31
- name: 'factbox',
32
- prefix: 'c-'
33
- });
34
- var StyledAside = /*#__PURE__*/_styled("aside", {
35
- target: "e1imrgx42",
36
- label: "StyledAside"
37
- })(process.env.NODE_ENV === "production" ? {
38
- name: "zigog8",
39
- styles: "display:flex;flex-direction:column;align-items:center"
40
- } : {
41
- name: "zigog8",
42
- styles: "display:flex;flex-direction:column;align-items:center",
43
- map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZhY3RCb3hWMi50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBd0JnQyIsImZpbGUiOiJGYWN0Qm94VjIudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtcHJlc2VudCwgTkRMQS5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEx2MyBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICpcbiAqL1xuXG5pbXBvcnQgeyBSZWFjdE5vZGUsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEJFTUhlbHBlciBmcm9tICdyZWFjdC1iZW0taGVscGVyJztcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeyBJY29uQnV0dG9uVjIgfSBmcm9tICdAbmRsYS9idXR0b24nO1xuaW1wb3J0IHsgQ2hldnJvbkRvd24sIENoZXZyb25VcCB9IGZyb20gJ0BuZGxhL2ljb25zL2NvbW1vbic7XG5cbmNvbnN0IGNsYXNzZXMgPSBuZXcgQkVNSGVscGVyKHtcbiAgbmFtZTogJ2ZhY3Rib3gnLFxuICBwcmVmaXg6ICdjLScsXG59KTtcblxuaW50ZXJmYWNlIFByb3BzIHtcbiAgY2hpbGRyZW4/OiBSZWFjdE5vZGU7XG59XG5cbmNvbnN0IFN0eWxlZEFzaWRlID0gc3R5bGVkLmFzaWRlYFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuYDtcblxuY29uc3QgU3R5bGVkRGl2ID0gc3R5bGVkLmRpdmBcbiAgd2lkdGg6IDEwMCU7XG5gO1xuXG5jb25zdCBTdHlsZWRJY29uQnV0dG9uID0gc3R5bGVkKEljb25CdXR0b25WMilgXG4gIG1hcmdpbi10b3A6IC0yMHB4O1xuICB6LWluZGV4OiAxO1xuYDtcblxuY29uc3QgRmFjdEJveCA9ICh7IGNoaWxkcmVuIH06IFByb3BzKSA9PiB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcbiAgY29uc3QgW2lzT3Blbiwgc2V0SXNPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICBjb25zdCBhZGRpdGlvbmFsID0gaXNPcGVuID8gJ2V4cGFuZGVkJyA6ICcnO1xuXG4gIHJldHVybiAoXG4gICAgPFN0eWxlZEFzaWRlIHsuLi5jbGFzc2VzKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhZGRpdGlvbmFsKX0+XG4gICAgICA8U3R5bGVkRGl2IHsuLi5jbGFzc2VzKCdjb250ZW50Jyl9PntjaGlsZHJlbn08L1N0eWxlZERpdj5cbiAgICAgIDxTdHlsZWRJY29uQnV0dG9uIG9uQ2xpY2s9eygpID0+IHNldElzT3BlbigocCkgPT4gIXApfSBhcmlhLWxhYmVsPXt0KGBmYWN0Ym94LiR7aXNPcGVuID8gJ2Nsb3NlJyA6ICdvcGVuJ31gKX0+XG4gICAgICAgIHtpc09wZW4gPyA8Q2hldnJvblVwIC8+IDogPENoZXZyb25Eb3duIC8+fVxuICAgICAgPC9TdHlsZWRJY29uQnV0dG9uPlxuICAgIDwvU3R5bGVkQXNpZGU+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBGYWN0Qm94O1xuIl19 */",
44
- toString: _EMOTION_STRINGIFIED_CSS_ERROR__
45
- });
46
- var StyledDiv = /*#__PURE__*/_styled("div", {
47
- target: "e1imrgx41",
48
- label: "StyledDiv"
49
- })(process.env.NODE_ENV === "production" ? {
50
- name: "1d3w5wq",
51
- styles: "width:100%"
52
- } : {
53
- name: "1d3w5wq",
54
- styles: "width:100%",
55
- map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZhY3RCb3hWMi50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBOEI0QiIsImZpbGUiOiJGYWN0Qm94VjIudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtcHJlc2VudCwgTkRMQS5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEx2MyBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICpcbiAqL1xuXG5pbXBvcnQgeyBSZWFjdE5vZGUsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEJFTUhlbHBlciBmcm9tICdyZWFjdC1iZW0taGVscGVyJztcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeyBJY29uQnV0dG9uVjIgfSBmcm9tICdAbmRsYS9idXR0b24nO1xuaW1wb3J0IHsgQ2hldnJvbkRvd24sIENoZXZyb25VcCB9IGZyb20gJ0BuZGxhL2ljb25zL2NvbW1vbic7XG5cbmNvbnN0IGNsYXNzZXMgPSBuZXcgQkVNSGVscGVyKHtcbiAgbmFtZTogJ2ZhY3Rib3gnLFxuICBwcmVmaXg6ICdjLScsXG59KTtcblxuaW50ZXJmYWNlIFByb3BzIHtcbiAgY2hpbGRyZW4/OiBSZWFjdE5vZGU7XG59XG5cbmNvbnN0IFN0eWxlZEFzaWRlID0gc3R5bGVkLmFzaWRlYFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuYDtcblxuY29uc3QgU3R5bGVkRGl2ID0gc3R5bGVkLmRpdmBcbiAgd2lkdGg6IDEwMCU7XG5gO1xuXG5jb25zdCBTdHlsZWRJY29uQnV0dG9uID0gc3R5bGVkKEljb25CdXR0b25WMilgXG4gIG1hcmdpbi10b3A6IC0yMHB4O1xuICB6LWluZGV4OiAxO1xuYDtcblxuY29uc3QgRmFjdEJveCA9ICh7IGNoaWxkcmVuIH06IFByb3BzKSA9PiB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcbiAgY29uc3QgW2lzT3Blbiwgc2V0SXNPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICBjb25zdCBhZGRpdGlvbmFsID0gaXNPcGVuID8gJ2V4cGFuZGVkJyA6ICcnO1xuXG4gIHJldHVybiAoXG4gICAgPFN0eWxlZEFzaWRlIHsuLi5jbGFzc2VzKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhZGRpdGlvbmFsKX0+XG4gICAgICA8U3R5bGVkRGl2IHsuLi5jbGFzc2VzKCdjb250ZW50Jyl9PntjaGlsZHJlbn08L1N0eWxlZERpdj5cbiAgICAgIDxTdHlsZWRJY29uQnV0dG9uIG9uQ2xpY2s9eygpID0+IHNldElzT3BlbigocCkgPT4gIXApfSBhcmlhLWxhYmVsPXt0KGBmYWN0Ym94LiR7aXNPcGVuID8gJ2Nsb3NlJyA6ICdvcGVuJ31gKX0+XG4gICAgICAgIHtpc09wZW4gPyA8Q2hldnJvblVwIC8+IDogPENoZXZyb25Eb3duIC8+fVxuICAgICAgPC9TdHlsZWRJY29uQnV0dG9uPlxuICAgIDwvU3R5bGVkQXNpZGU+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBGYWN0Qm94O1xuIl19 */",
56
- toString: _EMOTION_STRINGIFIED_CSS_ERROR__
57
- });
58
- var StyledIconButton = /*#__PURE__*/_styled(IconButtonV2, {
59
- target: "e1imrgx40",
60
- label: "StyledIconButton"
61
- })(process.env.NODE_ENV === "production" ? {
62
- name: "2grj3y",
63
- styles: "margin-top:-20px;z-index:1"
64
- } : {
65
- name: "2grj3y",
66
- styles: "margin-top:-20px;z-index:1",
67
- map: "/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkZhY3RCb3hWMi50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0M2QyIsImZpbGUiOiJGYWN0Qm94VjIudHN4Iiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYtcHJlc2VudCwgTkRMQS5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHUEx2MyBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICpcbiAqL1xuXG5pbXBvcnQgeyBSZWFjdE5vZGUsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IEJFTUhlbHBlciBmcm9tICdyZWFjdC1iZW0taGVscGVyJztcbmltcG9ydCB7IHVzZVRyYW5zbGF0aW9uIH0gZnJvbSAncmVhY3QtaTE4bmV4dCc7XG5pbXBvcnQgc3R5bGVkIGZyb20gJ0BlbW90aW9uL3N0eWxlZCc7XG5pbXBvcnQgeyBJY29uQnV0dG9uVjIgfSBmcm9tICdAbmRsYS9idXR0b24nO1xuaW1wb3J0IHsgQ2hldnJvbkRvd24sIENoZXZyb25VcCB9IGZyb20gJ0BuZGxhL2ljb25zL2NvbW1vbic7XG5cbmNvbnN0IGNsYXNzZXMgPSBuZXcgQkVNSGVscGVyKHtcbiAgbmFtZTogJ2ZhY3Rib3gnLFxuICBwcmVmaXg6ICdjLScsXG59KTtcblxuaW50ZXJmYWNlIFByb3BzIHtcbiAgY2hpbGRyZW4/OiBSZWFjdE5vZGU7XG59XG5cbmNvbnN0IFN0eWxlZEFzaWRlID0gc3R5bGVkLmFzaWRlYFxuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuYDtcblxuY29uc3QgU3R5bGVkRGl2ID0gc3R5bGVkLmRpdmBcbiAgd2lkdGg6IDEwMCU7XG5gO1xuXG5jb25zdCBTdHlsZWRJY29uQnV0dG9uID0gc3R5bGVkKEljb25CdXR0b25WMilgXG4gIG1hcmdpbi10b3A6IC0yMHB4O1xuICB6LWluZGV4OiAxO1xuYDtcblxuY29uc3QgRmFjdEJveCA9ICh7IGNoaWxkcmVuIH06IFByb3BzKSA9PiB7XG4gIGNvbnN0IHsgdCB9ID0gdXNlVHJhbnNsYXRpb24oKTtcbiAgY29uc3QgW2lzT3Blbiwgc2V0SXNPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICBjb25zdCBhZGRpdGlvbmFsID0gaXNPcGVuID8gJ2V4cGFuZGVkJyA6ICcnO1xuXG4gIHJldHVybiAoXG4gICAgPFN0eWxlZEFzaWRlIHsuLi5jbGFzc2VzKHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBhZGRpdGlvbmFsKX0+XG4gICAgICA8U3R5bGVkRGl2IHsuLi5jbGFzc2VzKCdjb250ZW50Jyl9PntjaGlsZHJlbn08L1N0eWxlZERpdj5cbiAgICAgIDxTdHlsZWRJY29uQnV0dG9uIG9uQ2xpY2s9eygpID0+IHNldElzT3BlbigocCkgPT4gIXApfSBhcmlhLWxhYmVsPXt0KGBmYWN0Ym94LiR7aXNPcGVuID8gJ2Nsb3NlJyA6ICdvcGVuJ31gKX0+XG4gICAgICAgIHtpc09wZW4gPyA8Q2hldnJvblVwIC8+IDogPENoZXZyb25Eb3duIC8+fVxuICAgICAgPC9TdHlsZWRJY29uQnV0dG9uPlxuICAgIDwvU3R5bGVkQXNpZGU+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBGYWN0Qm94O1xuIl19 */",
68
- toString: _EMOTION_STRINGIFIED_CSS_ERROR__
69
- });
70
- var FactBox = function FactBox(_ref) {
71
- var children = _ref.children;
72
- var _useTranslation = useTranslation(),
73
- t = _useTranslation.t;
74
- var _useState = useState(false),
75
- _useState2 = _slicedToArray(_useState, 2),
76
- isOpen = _useState2[0],
77
- setIsOpen = _useState2[1];
78
- var additional = isOpen ? 'expanded' : '';
79
- return _jsxs(StyledAside, _objectSpread(_objectSpread({}, classes(undefined, undefined, additional)), {}, {
80
- children: [_jsx(StyledDiv, _objectSpread(_objectSpread({}, classes('content')), {}, {
81
- children: children
82
- })), _jsx(StyledIconButton, {
83
- onClick: function onClick() {
84
- return setIsOpen(function (p) {
85
- return !p;
86
- });
87
- },
88
- "aria-label": t("factbox.".concat(isOpen ? 'close' : 'open')),
89
- children: isOpen ? _jsx(ChevronUp, {}) : _jsx(ChevronDown, {})
90
- })]
91
- }));
92
- };
93
- export default FactBox;