@nypl/design-system-react-components 0.25.5 → 0.25.9

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 (275) hide show
  1. package/CHANGELOG.md +91 -1
  2. package/README.md +1 -1
  3. package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +1 -0
  4. package/dist/components/Button/Button.d.ts +6 -6
  5. package/dist/components/Button/ButtonTypes.d.ts +0 -1
  6. package/dist/components/Card/Card.d.ts +6 -4
  7. package/dist/components/Checkbox/Checkbox.d.ts +3 -2
  8. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +3 -2
  9. package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +8 -2
  10. package/dist/components/DatePicker/DatePicker.d.ts +3 -2
  11. package/dist/components/Form/Form.d.ts +2 -2
  12. package/dist/components/Heading/Heading.d.ts +7 -3
  13. package/dist/components/Heading/HeadingTypes.d.ts +6 -6
  14. package/dist/components/HelperErrorText/HelperErrorText.d.ts +5 -2
  15. package/dist/components/HorizontalRule/HorizontalRule.d.ts +2 -2
  16. package/dist/components/Icons/Icon.d.ts +4 -4
  17. package/dist/components/Icons/IconSvgs.d.ts +1 -21
  18. package/dist/components/Icons/IconTypes.d.ts +1 -23
  19. package/dist/components/Image/Image.d.ts +11 -3
  20. package/dist/components/Image/ImageTypes.d.ts +3 -1
  21. package/dist/components/Link/LinkTypes.d.ts +1 -0
  22. package/dist/components/Logo/Logo.d.ts +28 -0
  23. package/dist/components/Logo/LogoSvgs.d.ts +18 -0
  24. package/dist/components/Logo/LogoTypes.d.ts +30 -0
  25. package/dist/components/Modal/Modal.d.ts +0 -4
  26. package/dist/components/Notification/Notification.d.ts +4 -2
  27. package/dist/components/Placeholder/Placeholder.d.ts +3 -5
  28. package/dist/components/Radio/Radio.d.ts +6 -5
  29. package/dist/components/RadioGroup/RadioGroup.d.ts +3 -2
  30. package/dist/components/SearchBar/SearchBar.d.ts +10 -2
  31. package/dist/components/Select/Select.d.ts +5 -2
  32. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +8 -4
  33. package/dist/components/Slider/Slider.d.ts +3 -2
  34. package/dist/components/StatusBadge/StatusBadge.d.ts +2 -1
  35. package/dist/components/StructuredContent/StructuredContent.d.ts +41 -0
  36. package/dist/components/StructuredContent/StructuredContentTypes.d.ts +5 -0
  37. package/dist/components/Table/Table.d.ts +23 -0
  38. package/dist/components/Template/Template.d.ts +8 -3
  39. package/dist/components/Text/Text.d.ts +2 -2
  40. package/dist/components/TextInput/TextInput.d.ts +4 -3
  41. package/dist/components/Toggle/Toggle.d.ts +48 -0
  42. package/dist/components/Toggle/ToggleSizes.d.ts +4 -0
  43. package/dist/components/VideoPlayer/VideoPlayer.d.ts +17 -6
  44. package/dist/design-system-react-components.cjs.development.js +5989 -5490
  45. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  46. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  47. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  48. package/dist/design-system-react-components.esm.js +6057 -5551
  49. package/dist/design-system-react-components.esm.js.map +1 -1
  50. package/dist/index.d.ts +11 -4
  51. package/dist/styles.css +2 -2
  52. package/dist/theme/components/breadcrumb.d.ts +9 -0
  53. package/dist/theme/components/button.d.ts +0 -12
  54. package/dist/theme/components/card.d.ts +14 -2
  55. package/dist/theme/components/customTable.d.ts +47 -0
  56. package/dist/theme/components/fieldset.d.ts +2 -2
  57. package/dist/theme/components/global.d.ts +1 -1
  58. package/dist/theme/components/heading.d.ts +4 -0
  59. package/dist/theme/components/label.d.ts +1 -1
  60. package/dist/theme/components/link.d.ts +14 -1
  61. package/dist/theme/components/list.d.ts +0 -2
  62. package/dist/theme/components/logo.d.ts +4 -0
  63. package/dist/theme/components/notification.d.ts +8 -4
  64. package/dist/theme/components/searchBar.d.ts +7 -13
  65. package/dist/theme/components/select.d.ts +1 -0
  66. package/dist/theme/components/structuredContent.d.ts +33 -0
  67. package/dist/theme/components/template.d.ts +10 -10
  68. package/dist/theme/components/textInput.d.ts +2 -0
  69. package/dist/theme/components/toggle.d.ts +71 -0
  70. package/dist/theme/foundations/spacing.d.ts +2 -0
  71. package/dist/utils/utils.d.ts +10 -0
  72. package/package.json +2 -3
  73. package/src/__tests__/utils/utils.test.ts +23 -1
  74. package/src/components/Accordion/Accordion.stories.mdx +15 -14
  75. package/src/components/Autosuggest/Autosuggest.stories.mdx +2 -1
  76. package/src/components/Autosuggest/Autosuggest.stories.tsx +24 -48
  77. package/src/components/Autosuggest/_Autosuggest.scss +2 -6
  78. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +50 -14
  79. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +20 -0
  80. package/src/components/Breadcrumbs/BreadcrumbsTypes.tsx +1 -0
  81. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +198 -0
  82. package/src/components/Button/Button.stories.mdx +93 -48
  83. package/src/components/Button/Button.test.tsx +0 -12
  84. package/src/components/Button/Button.tsx +7 -8
  85. package/src/components/Button/ButtonTypes.tsx +0 -1
  86. package/src/components/Button/__snapshots__/Button.test.tsx.snap +0 -12
  87. package/src/components/Card/Card.stories.mdx +246 -64
  88. package/src/components/Card/Card.test.tsx +45 -22
  89. package/src/components/Card/Card.tsx +26 -13
  90. package/src/components/Card/__snapshots__/Card.test.tsx.snap +75 -37
  91. package/src/components/Chakra/Box.stories.mdx +3 -3
  92. package/src/components/Chakra/Center.stories.mdx +5 -5
  93. package/src/components/Chakra/Grid.stories.mdx +14 -17
  94. package/src/components/Chakra/Stack.stories.mdx +2 -2
  95. package/src/components/Checkbox/Checkbox.stories.mdx +37 -15
  96. package/src/components/Checkbox/Checkbox.tsx +13 -8
  97. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +48 -16
  98. package/src/components/CheckboxGroup/CheckboxGroup.tsx +14 -10
  99. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +6 -3
  100. package/src/components/ComponentWrapper/ComponentWrapper.test.tsx +151 -0
  101. package/src/components/ComponentWrapper/ComponentWrapper.tsx +36 -23
  102. package/src/components/ComponentWrapper/__snapshots__/ComponentWrapper.test.tsx.snap +85 -0
  103. package/src/components/DatePicker/DatePicker.stories.mdx +63 -18
  104. package/src/components/DatePicker/DatePicker.test.tsx +8 -6
  105. package/src/components/DatePicker/DatePicker.tsx +10 -6
  106. package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +41 -22
  107. package/src/components/Fieldset/Fieldset.stories.mdx +19 -8
  108. package/src/components/Form/Form.stories.mdx +49 -41
  109. package/src/components/Form/Form.tsx +5 -4
  110. package/src/components/Grid/SimpleGrid.stories.mdx +26 -26
  111. package/src/components/Heading/Heading.stories.mdx +59 -23
  112. package/src/components/Heading/Heading.test.tsx +82 -18
  113. package/src/components/Heading/Heading.tsx +31 -31
  114. package/src/components/Heading/HeadingTypes.tsx +6 -6
  115. package/src/components/Heading/__snapshots__/Heading.test.tsx.snap +71 -0
  116. package/src/components/HelperErrorText/HelperErrorText.stories.mdx +55 -27
  117. package/src/components/HelperErrorText/HelperErrorText.test.tsx +42 -15
  118. package/src/components/HelperErrorText/HelperErrorText.tsx +24 -24
  119. package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +41 -4
  120. package/src/components/Hero/Hero.stories.mdx +72 -53
  121. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +9 -8
  122. package/src/components/HorizontalRule/HorizontalRule.tsx +2 -4
  123. package/src/components/Icons/Icon.stories.mdx +77 -75
  124. package/src/components/Icons/Icon.tsx +4 -5
  125. package/src/components/Icons/IconSvgs.tsx +2 -42
  126. package/src/components/Icons/IconTypes.tsx +1 -24
  127. package/src/components/Image/Image.stories.mdx +214 -104
  128. package/src/components/Image/Image.test.tsx +10 -0
  129. package/src/components/Image/Image.tsx +21 -10
  130. package/src/components/Image/ImageTypes.ts +2 -0
  131. package/src/components/Image/__snapshots__/Image.test.tsx.snap +24 -8
  132. package/src/components/Label/Label.stories.mdx +21 -20
  133. package/src/components/Link/Link.stories.mdx +103 -53
  134. package/src/components/Link/Link.test.tsx +108 -7
  135. package/src/components/Link/Link.tsx +58 -19
  136. package/src/components/Link/LinkTypes.tsx +1 -0
  137. package/src/components/Link/__snapshots__/Link.test.tsx.snap +261 -0
  138. package/src/components/List/List.stories.mdx +36 -24
  139. package/src/components/Logo/Logo.stories.mdx +220 -0
  140. package/src/components/Logo/Logo.test.tsx +98 -0
  141. package/src/components/Logo/Logo.tsx +97 -0
  142. package/src/components/Logo/LogoSvgs.tsx +34 -0
  143. package/src/components/Logo/LogoTypes.tsx +32 -0
  144. package/src/components/Logo/__snapshots__/Logo.test.tsx.snap +71 -0
  145. package/src/components/Modal/Modal.stories.mdx +20 -5
  146. package/src/components/Modal/Modal.tsx +2 -8
  147. package/src/components/Notification/Notification.stories.mdx +96 -40
  148. package/src/components/Notification/Notification.test.tsx +62 -16
  149. package/src/components/Notification/Notification.tsx +26 -9
  150. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +121 -0
  151. package/src/components/Pagination/Pagination.stories.mdx +18 -8
  152. package/src/components/Pagination/Pagination.tsx +1 -1
  153. package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +42 -0
  154. package/src/components/Placeholder/Placeholder.tsx +7 -14
  155. package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +74 -46
  156. package/src/components/Radio/Radio.stories.mdx +39 -19
  157. package/src/components/Radio/Radio.tsx +13 -9
  158. package/src/components/RadioGroup/RadioGroup.stories.mdx +50 -16
  159. package/src/components/RadioGroup/RadioGroup.tsx +15 -11
  160. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +6 -3
  161. package/src/components/SearchBar/SearchBar.Test.tsx +114 -22
  162. package/src/components/SearchBar/SearchBar.stories.mdx +111 -33
  163. package/src/components/SearchBar/SearchBar.tsx +57 -33
  164. package/src/components/Select/Select.stories.mdx +177 -66
  165. package/src/components/Select/Select.test.tsx +2 -2
  166. package/src/components/Select/Select.tsx +22 -12
  167. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +50 -16
  168. package/src/components/SkeletonLoader/SkeletonLoader.tsx +8 -4
  169. package/src/components/Slider/Slider.stories.mdx +74 -23
  170. package/src/components/Slider/Slider.test.tsx +35 -0
  171. package/src/components/Slider/Slider.tsx +22 -11
  172. package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +60 -30
  173. package/src/components/StatusBadge/StatusBadge.stories.mdx +33 -18
  174. package/src/components/StatusBadge/StatusBadge.tsx +2 -1
  175. package/src/components/StructuredContent/StructuredContent.stories.mdx +427 -0
  176. package/src/components/StructuredContent/StructuredContent.test.tsx +376 -0
  177. package/src/components/StructuredContent/StructuredContent.tsx +153 -0
  178. package/src/components/StructuredContent/StructuredContentTypes.tsx +5 -0
  179. package/src/components/StructuredContent/__snapshots__/StructuredContent.test.tsx.snap +283 -0
  180. package/src/components/StyleGuide/Bidirectionality.stories.mdx +32 -83
  181. package/src/components/StyleGuide/Breakpoints.stories.mdx +1 -11
  182. package/src/components/StyleGuide/Buttons.stories.mdx +3 -18
  183. package/src/components/StyleGuide/ColorCard.tsx +1 -2
  184. package/src/components/StyleGuide/Colors.stories.mdx +3 -11
  185. package/src/components/StyleGuide/DesignTokens.stories.mdx +3 -8
  186. package/src/components/StyleGuide/Forms.stories.mdx +2 -10
  187. package/src/components/StyleGuide/Iconography.stories.mdx +8 -34
  188. package/src/components/StyleGuide/Spacing.stories.mdx +3 -14
  189. package/src/components/StyleGuide/Typography.stories.mdx +64 -76
  190. package/src/components/Table/Table.stories.mdx +66 -0
  191. package/src/components/Table/Table.test.tsx +60 -0
  192. package/src/components/Table/Table.tsx +116 -0
  193. package/src/components/Tabs/Tabs.stories.mdx +19 -13
  194. package/src/components/Tabs/Tabs.test.tsx +1 -1
  195. package/src/components/Template/Template.stories.mdx +57 -49
  196. package/src/components/Template/Template.test.tsx +65 -5
  197. package/src/components/Template/Template.tsx +35 -5
  198. package/src/components/Template/__snapshots__/Template.test.tsx.snap +76 -0
  199. package/src/components/Text/Text.stories.mdx +33 -11
  200. package/src/components/Text/Text.tsx +2 -2
  201. package/src/components/TextInput/TextInput.stories.mdx +84 -17
  202. package/src/components/TextInput/TextInput.test.tsx +96 -0
  203. package/src/components/TextInput/TextInput.tsx +12 -8
  204. package/src/components/TextInput/__snapshots__/TextInput.test.tsx.snap +240 -0
  205. package/src/components/Toggle/Toggle.stories.mdx +200 -0
  206. package/src/components/Toggle/Toggle.test.tsx +140 -0
  207. package/src/components/Toggle/Toggle.tsx +123 -0
  208. package/src/components/Toggle/ToggleSizes.tsx +4 -0
  209. package/src/components/Toggle/__snapshots__/Toggle.test.tsx.snap +255 -0
  210. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +96 -25
  211. package/src/components/VideoPlayer/VideoPlayer.test.tsx +103 -1
  212. package/src/components/VideoPlayer/VideoPlayer.tsx +72 -22
  213. package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +57 -3
  214. package/src/docs/Chakra.stories.mdx +5 -8
  215. package/src/docs/Intro.stories.mdx +2 -2
  216. package/src/index.ts +13 -4
  217. package/src/styles/base/_03-base.scss +1 -1
  218. package/src/styles/base/_place-holder.scss +7 -7
  219. package/src/styles.scss +1 -5
  220. package/src/theme/components/breadcrumb.ts +14 -4
  221. package/src/theme/components/button.ts +5 -12
  222. package/src/theme/components/card.ts +9 -7
  223. package/src/theme/components/checkbox.ts +1 -1
  224. package/src/theme/components/customTable.ts +50 -0
  225. package/src/theme/components/datePicker.ts +1 -1
  226. package/src/theme/components/global.ts +7 -7
  227. package/src/theme/components/heading.ts +13 -11
  228. package/src/theme/components/helperErrorText.ts +1 -1
  229. package/src/theme/components/icon.ts +2 -2
  230. package/src/theme/components/image.ts +9 -1
  231. package/src/theme/components/link.ts +17 -5
  232. package/src/theme/components/list.ts +1 -3
  233. package/src/theme/components/logo.ts +54 -0
  234. package/src/theme/components/notification.ts +9 -7
  235. package/src/theme/components/searchBar.ts +7 -13
  236. package/src/theme/components/select.ts +1 -0
  237. package/src/theme/components/statusBadge.ts +1 -1
  238. package/src/theme/components/structuredContent.ts +54 -0
  239. package/src/theme/components/template.ts +10 -10
  240. package/src/theme/components/text.ts +6 -6
  241. package/src/theme/components/textInput.ts +1 -0
  242. package/src/theme/components/toggle.ts +69 -0
  243. package/src/theme/components/videoPlayer.ts +0 -2
  244. package/src/theme/foundations/global.ts +2 -2
  245. package/src/theme/foundations/spacing.ts +3 -0
  246. package/src/theme/foundations/typography.ts +84 -12
  247. package/src/theme/index.ts +8 -0
  248. package/src/utils/componentCategories.ts +4 -2
  249. package/src/utils/utils.ts +17 -0
  250. package/dist/__tests__/utils/bem.test.d.ts +0 -1
  251. package/dist/components/CardEdition/CardEdition.d.ts +0 -21
  252. package/dist/components/CardEdition/CardEdition.stories.d.ts +0 -27
  253. package/dist/components/Input/Input.d.ts +0 -36
  254. package/dist/components/Input/Input.stories.d.ts +0 -29
  255. package/dist/components/Input/InputTypes.d.ts +0 -6
  256. package/dist/components/StyleGuide/UIDocCard.d.ts +0 -11
  257. package/dist/helpers/CSSVariablesHelper.d.ts +0 -3
  258. package/dist/helpers/getCSSVariable.d.ts +0 -1
  259. package/dist/interfaces.d.ts +0 -3
  260. package/dist/utils/bem.d.ts +0 -1
  261. package/src/__tests__/utils/bem.test.ts +0 -37
  262. package/src/components/CardEdition/CardEdition.stories.tsx +0 -122
  263. package/src/components/CardEdition/CardEdition.test.tsx +0 -395
  264. package/src/components/CardEdition/CardEdition.tsx +0 -60
  265. package/src/components/CardEdition/_CardEdition.scss +0 -137
  266. package/src/components/Input/Input.stories.tsx +0 -133
  267. package/src/components/Input/Input.test.tsx +0 -266
  268. package/src/components/Input/Input.tsx +0 -81
  269. package/src/components/Input/InputTypes.tsx +0 -8
  270. package/src/components/Input/_Input.scss +0 -78
  271. package/src/components/StyleGuide/UIDocCard.tsx +0 -36
  272. package/src/helpers/CSSVariablesHelper.tsx +0 -34
  273. package/src/helpers/getCSSVariable.tsx +0 -5
  274. package/src/interfaces.ts +0 -3
  275. package/src/utils/bem.ts +0 -44
@@ -0,0 +1,376 @@
1
+ import * as React from "react";
2
+ import { render, screen } from "@testing-library/react";
3
+ import { axe } from "jest-axe";
4
+ import renderer from "react-test-renderer";
5
+
6
+ import { ImageRatios, ImageSizes } from "../Image/ImageTypes";
7
+ import StructuredContent from "./StructuredContent";
8
+ import { StructuredContentImagePosition } from "./StructuredContentTypes";
9
+
10
+ const htmlStringBodyContent =
11
+ "<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do" +
12
+ "eiusmod tempor incididunt ut labore et dolore magna aliqua." +
13
+ "Pellentesque massa placerat duis ultricies lacus sed turpis tincidunt. " +
14
+ "<a href='#'>Porttitor eget dolor</a> morbi non arcu risus quis varius." +
15
+ "Faucibus in ornare quam viverra orci sagittis.</p><p>Nisl vel pretium lectus" +
16
+ "quam id leo in. Etiam dignissim diam quis enim lobortis scelerisque fermentum." +
17
+ "Diam maecenas sed enim ut sem viverra. <b>Diam quam nulla porttitor massa" +
18
+ "id neque. Sed faucibus turpis in eu mi.</b></p><p>Ornare lectus sit amet est placerat" +
19
+ "in. Quis blandit turpis cursus in. Aliquam ut porttitor leo a diam sollicitudin" +
20
+ "tempor id eu. Pellentesque eu tincidunt tortor aliquam nulla facilisi cras" +
21
+ "fermentum. Porttitor leo a diam sollicitudin tempor id eu nisl nunc. Feugiat" +
22
+ "nisl pretium fusce id velit ut tortor. Porttitor leo a diam sollicitudin " +
23
+ "tempor id eu nisl nunc.</p><ul><li>one</li><li>two</li>" +
24
+ "<li>three</li><li>four</li></ul><p><i>Mauris nunc congue nisi vitae suscipit" +
25
+ "tellus mauris a diam. Purus gravida quis blandit turpis cursus in hac." +
26
+ "Morbi tempus iaculis urna id volutpat. Lectus nulla at volutpat diam ut" +
27
+ "venenatis. Donec ac odio tempor orci dapibus ultrices in iaculis. Dui vivamus" +
28
+ "arcu felis bibendum ut tristique. Cras semper auctor neque vitae tempus" +
29
+ "quam pellentesque. Placerat orci nulla pellentesque dignissim enim sit" +
30
+ "amet. Feugiat pretium nibh ipsum consequat. Placerat orci nulla pellentesque" +
31
+ "dignissim. Suspendisse faucibus interdum posuere lorem. Nullam non nisi" +
32
+ "est sit. Turpis egestas integer eget aliquet nibh praesent. Tortor at risus" +
33
+ "viverra adipiscing at. Eu augue ut lectus arcu bibendum at varius vel" +
34
+ "pharetra.</i></p>";
35
+ const htmlDOMBodyContent = (
36
+ <>
37
+ <p>
38
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
39
+ tempor incididunt ut labore et dolore magna aliqua. Pellentesque massa
40
+ placerat duis ultricies lacus sed turpis tincidunt.
41
+ <a href="http://nypl.org">Porttitor eget dolor</a> morbi non arcu risus
42
+ quis varius. Faucibus in ornare quam viverra orci sagittis.
43
+ </p>
44
+ <p>
45
+ Nisl vel pretium lectus quam id leo in. Etiam dignissim diam quis enim
46
+ lobortis scelerisque fermentum. Diam maecenas sed enim ut sem viverra.{" "}
47
+ <b>
48
+ Diam quam nulla porttitor massa id neque. Sed faucibus turpis in eu mi.
49
+ </b>
50
+ </p>
51
+ <p>
52
+ Ornare lectus sit amet est placerat in. Quis blandit turpis cursus in.
53
+ Aliquam ut porttitor leo a diam sollicitudin tempor id eu. Pellentesque eu
54
+ tincidunt tortor aliquam nulla facilisi cras fermentum. Porttitor leo a
55
+ diam sollicitudin tempor id eu nisl nunc. Feugiat nisl pretium fusce id
56
+ velit ut tortor. Porttitor leo a diam sollicitudin tempor id eu nisl nunc.
57
+ </p>
58
+ <ul>
59
+ <li>one</li>
60
+ <li>two</li>
61
+ <li>three</li>
62
+ <li>four</li>
63
+ </ul>
64
+ <p>
65
+ <i>
66
+ Mauris nunc congue nisi vitae suscipit tellus mauris a diam. Purus
67
+ gravida quis blandit turpis cursus in hac. Morbi tempus iaculis urna id
68
+ volutpat. Lectus nulla at volutpat diam ut venenatis. Donec ac odio
69
+ tempor orci dapibus ultrices in iaculis. Dui vivamus arcu felis bibendum
70
+ ut tristique. Cras semper auctor neque vitae tempus quam pellentesque.
71
+ Placerat orci nulla pellentesque dignissim enim sit amet. Feugiat
72
+ pretium nibh ipsum consequat. Placerat orci nulla pellentesque
73
+ dignissim. Suspendisse faucibus interdum posuere lorem. Nullam non nisi
74
+ est sit. Turpis egestas integer eget aliquet nibh praesent. Tortor at
75
+ risus 'viverra adipiscing at. Eu augue ut lectus arcu bibendum at varius
76
+ vel' pharetra.
77
+ </i>
78
+ </p>
79
+ </>
80
+ );
81
+
82
+ describe("StructuredContent Accessibility", () => {
83
+ it("passes axe accessibility for HTML string text content", async () => {
84
+ const { container } = render(
85
+ <StructuredContent
86
+ calloutText="This is the callout text"
87
+ headingText="Heading text"
88
+ imageAlt="Image alt text"
89
+ imageAspectRatio={ImageRatios.Original}
90
+ imageCaption="Image caption"
91
+ imageCredit="Image credit"
92
+ imagePosition={StructuredContentImagePosition.Left}
93
+ imageSize={ImageSizes.Medium}
94
+ imageSrc="https://placeimg.com/400/300/animals"
95
+ bodyContent={htmlStringBodyContent}
96
+ />
97
+ );
98
+ expect(await axe(container)).toHaveNoViolations();
99
+ });
100
+
101
+ it("passes axe accessibility for HTML DOM text content", async () => {
102
+ const { container } = render(
103
+ <StructuredContent
104
+ calloutText="This is the callout text"
105
+ headingText="Heading text"
106
+ imageAlt="Image alt text"
107
+ imageAspectRatio={ImageRatios.Original}
108
+ imageCaption="Image caption"
109
+ imageCredit="Image credit"
110
+ imagePosition={StructuredContentImagePosition.Left}
111
+ imageSize={ImageSizes.Medium}
112
+ imageSrc="https://placeimg.com/400/300/animals"
113
+ bodyContent={htmlDOMBodyContent}
114
+ />
115
+ );
116
+ expect(await axe(container)).toHaveNoViolations();
117
+ });
118
+
119
+ it("passes axe accessibility without an image", async () => {
120
+ const { container } = render(
121
+ <StructuredContent
122
+ calloutText="This is the callout text"
123
+ headingText="Heading text"
124
+ bodyContent={htmlStringBodyContent}
125
+ />
126
+ );
127
+ expect(await axe(container)).toHaveNoViolations();
128
+ });
129
+ });
130
+
131
+ describe("StructuredContent", () => {
132
+ it("renders two headings, an image, and body text", () => {
133
+ render(
134
+ <StructuredContent
135
+ calloutText="This is the callout text"
136
+ headingText="Heading text"
137
+ imageAlt="Image alt text"
138
+ imageAspectRatio={ImageRatios.Original}
139
+ imageCaption="Image caption"
140
+ imageCredit="Image credit"
141
+ imagePosition={StructuredContentImagePosition.Left}
142
+ imageSize={ImageSizes.Medium}
143
+ imageSrc="https://placeimg.com/400/300/animals"
144
+ bodyContent={htmlStringBodyContent}
145
+ />
146
+ );
147
+ const mainHeading = screen.getByRole("heading", { level: 2 });
148
+ const calloutHeading = screen.getByRole("heading", { level: 3 });
149
+
150
+ expect(mainHeading).toHaveTextContent("Heading text");
151
+ expect(calloutHeading).toHaveTextContent("This is the callout text");
152
+ expect(screen.getByRole("img")).toBeInTheDocument();
153
+ expect(screen.getByText(/Lorem ipsum dolor sit amet/i)).toBeInTheDocument();
154
+ });
155
+
156
+ it("optionally renders without the headings", () => {
157
+ render(
158
+ <StructuredContent
159
+ imageAlt="Image alt text"
160
+ imageAspectRatio={ImageRatios.Original}
161
+ imageCaption="Image caption"
162
+ imageCredit="Image credit"
163
+ imagePosition={StructuredContentImagePosition.Left}
164
+ imageSize={ImageSizes.Medium}
165
+ imageSrc="https://placeimg.com/400/300/animals"
166
+ bodyContent={htmlStringBodyContent}
167
+ />
168
+ );
169
+ const mainHeading = screen.queryByRole("heading", { level: 2 });
170
+ const calloutHeading = screen.queryByRole("heading", { level: 3 });
171
+
172
+ expect(mainHeading).not.toBeInTheDocument();
173
+ expect(calloutHeading).not.toBeInTheDocument();
174
+ expect(screen.getByRole("img")).toBeInTheDocument();
175
+ expect(screen.getByText(/Lorem ipsum dolor sit amet/i)).toBeInTheDocument();
176
+ });
177
+
178
+ it("optionally renders without the image", () => {
179
+ render(
180
+ <StructuredContent
181
+ calloutText="This is the callout text"
182
+ headingText="Heading text"
183
+ bodyContent={htmlStringBodyContent}
184
+ />
185
+ );
186
+ const mainHeading = screen.getByRole("heading", { level: 2 });
187
+ const calloutHeading = screen.getByRole("heading", { level: 3 });
188
+
189
+ expect(mainHeading).toHaveTextContent("Heading text");
190
+ expect(calloutHeading).toHaveTextContent("This is the callout text");
191
+ expect(screen.queryByRole("img")).not.toBeInTheDocument();
192
+ expect(screen.getByText(/Lorem ipsum dolor sit amet/i)).toBeInTheDocument();
193
+ });
194
+
195
+ it("logs a warning when an image is used but no alt text is passed to `imageAlt`", () => {
196
+ const warn = jest.spyOn(console, "warn");
197
+ render(
198
+ <StructuredContent
199
+ calloutText="This is the callout text"
200
+ headingText="Heading text"
201
+ imageAspectRatio={ImageRatios.Original}
202
+ imageCaption="Image caption"
203
+ imageCredit="Image credit"
204
+ imagePosition={StructuredContentImagePosition.Left}
205
+ imageSize={ImageSizes.Medium}
206
+ imageSrc="https://placeimg.com/400/300/animals"
207
+ bodyContent={htmlStringBodyContent}
208
+ />
209
+ );
210
+
211
+ expect(warn).toHaveBeenCalledWith(
212
+ "StructuredContent: `imageAlt` prop is required when using an image."
213
+ );
214
+ expect(screen.getByRole("img")).toBeInTheDocument();
215
+ });
216
+
217
+ it("renders an image wrapped in figure when provided an image caption or credit", () => {
218
+ const { rerender } = render(
219
+ <StructuredContent
220
+ calloutText="This is the callout text"
221
+ headingText="Heading text"
222
+ imageAlt="Image alt text"
223
+ imageAspectRatio={ImageRatios.Original}
224
+ imageCaption="Image caption"
225
+ imageCredit="Image credit"
226
+ imagePosition={StructuredContentImagePosition.Left}
227
+ imageSize={ImageSizes.Medium}
228
+ imageSrc="https://placeimg.com/400/300/animals"
229
+ bodyContent={htmlStringBodyContent}
230
+ />
231
+ );
232
+ expect(screen.getByRole("img")).toBeInTheDocument();
233
+ expect(screen.getByRole("figure")).toBeInTheDocument();
234
+ expect(screen.getByText("Image caption")).toBeInTheDocument();
235
+ expect(screen.getByText("Image credit")).toBeInTheDocument();
236
+
237
+ // Not passing in the image's caption
238
+ rerender(
239
+ <StructuredContent
240
+ calloutText="This is the callout text"
241
+ headingText="Heading text"
242
+ imageAlt="Image alt text"
243
+ imageAspectRatio={ImageRatios.Original}
244
+ imageCredit="Image credit"
245
+ imagePosition={StructuredContentImagePosition.Left}
246
+ imageSize={ImageSizes.Medium}
247
+ imageSrc="https://placeimg.com/400/300/animals"
248
+ bodyContent={htmlStringBodyContent}
249
+ />
250
+ );
251
+ expect(screen.getByRole("img")).toBeInTheDocument();
252
+ expect(screen.getByRole("figure")).toBeInTheDocument();
253
+ expect(screen.queryByText("Image caption")).not.toBeInTheDocument();
254
+ expect(screen.getByText("Image credit")).toBeInTheDocument();
255
+ });
256
+
257
+ it("renders a simple image element when no image caption or credit are provided", () => {
258
+ render(
259
+ <StructuredContent
260
+ calloutText="This is the callout text"
261
+ headingText="Heading text"
262
+ imageAlt="Image alt text"
263
+ imageAspectRatio={ImageRatios.Original}
264
+ imagePosition={StructuredContentImagePosition.Left}
265
+ imageSize={ImageSizes.Medium}
266
+ imageSrc="https://placeimg.com/400/300/animals"
267
+ bodyContent={htmlStringBodyContent}
268
+ />
269
+ );
270
+ expect(screen.getByRole("img")).toBeInTheDocument();
271
+ expect(screen.queryByRole("figure")).not.toBeInTheDocument();
272
+ expect(screen.queryByText("Image caption")).not.toBeInTheDocument();
273
+ expect(screen.queryByText("Image credit")).not.toBeInTheDocument();
274
+ });
275
+
276
+ it("renders the UI snapshot", () => {
277
+ const withHTMLStringContent = renderer
278
+ .create(
279
+ <StructuredContent
280
+ calloutText="This is the callout text"
281
+ headingText="Heading text"
282
+ id="withHTMLStringContent"
283
+ imageAlt="Image alt text"
284
+ imageAspectRatio={ImageRatios.Original}
285
+ imageCaption="Image caption"
286
+ imageCredit="Image credit"
287
+ imagePosition={StructuredContentImagePosition.Left}
288
+ imageSize={ImageSizes.Medium}
289
+ imageSrc="https://placeimg.com/400/300/animals"
290
+ bodyContent={htmlStringBodyContent}
291
+ />
292
+ )
293
+ .toJSON();
294
+ const withHTMLDOMContent = renderer
295
+ .create(
296
+ <StructuredContent
297
+ calloutText="This is the callout text"
298
+ headingText="Heading text"
299
+ id="withHTMLDOMContent"
300
+ imageAlt="Image alt text"
301
+ imageAspectRatio={ImageRatios.Original}
302
+ imageCaption="Image caption"
303
+ imageCredit="Image credit"
304
+ imagePosition={StructuredContentImagePosition.Left}
305
+ imageSize={ImageSizes.Medium}
306
+ imageSrc="https://placeimg.com/400/300/animals"
307
+ bodyContent={htmlDOMBodyContent}
308
+ />
309
+ )
310
+ .toJSON();
311
+ const withoutAnImage = renderer
312
+ .create(
313
+ <StructuredContent
314
+ calloutText="This is the callout text"
315
+ headingText="Heading text"
316
+ id="withoutAnImage"
317
+ bodyContent={htmlStringBodyContent}
318
+ />
319
+ )
320
+ .toJSON();
321
+ const withImageWithoutCaptionOrCredit = renderer
322
+ .create(
323
+ <StructuredContent
324
+ calloutText="This is the callout text"
325
+ headingText="Heading text"
326
+ id="withImageWithoutCaptionOrCredit"
327
+ imageAlt="Image alt text"
328
+ imageAspectRatio={ImageRatios.Original}
329
+ imagePosition={StructuredContentImagePosition.Left}
330
+ imageSize={ImageSizes.Medium}
331
+ imageSrc="https://placeimg.com/400/300/animals"
332
+ bodyContent={htmlStringBodyContent}
333
+ />
334
+ )
335
+ .toJSON();
336
+ const withoutHeading = renderer
337
+ .create(
338
+ <StructuredContent
339
+ calloutText="This is the callout text"
340
+ id="withoutHeading"
341
+ imageAlt="Image alt text"
342
+ imageAspectRatio={ImageRatios.Original}
343
+ imageCaption="Image caption"
344
+ imageCredit="Image credit"
345
+ imagePosition={StructuredContentImagePosition.Left}
346
+ imageSize={ImageSizes.Medium}
347
+ imageSrc="https://placeimg.com/400/300/animals"
348
+ bodyContent={htmlStringBodyContent}
349
+ />
350
+ )
351
+ .toJSON();
352
+ const withoutCalloutText = renderer
353
+ .create(
354
+ <StructuredContent
355
+ headingText="Heading text"
356
+ id="withoutCalloutText"
357
+ imageAlt="Image alt text"
358
+ imageAspectRatio={ImageRatios.Original}
359
+ imageCaption="Image caption"
360
+ imageCredit="Image credit"
361
+ imagePosition={StructuredContentImagePosition.Left}
362
+ imageSize={ImageSizes.Medium}
363
+ imageSrc="https://placeimg.com/400/300/animals"
364
+ bodyContent={htmlStringBodyContent}
365
+ />
366
+ )
367
+ .toJSON();
368
+
369
+ expect(withHTMLStringContent).toMatchSnapshot();
370
+ expect(withHTMLDOMContent).toMatchSnapshot();
371
+ expect(withoutAnImage).toMatchSnapshot();
372
+ expect(withImageWithoutCaptionOrCredit).toMatchSnapshot();
373
+ expect(withoutHeading).toMatchSnapshot();
374
+ expect(withoutCalloutText).toMatchSnapshot();
375
+ });
376
+ });
@@ -0,0 +1,153 @@
1
+ import * as React from "react";
2
+ import { Box, useMultiStyleConfig } from "@chakra-ui/react";
3
+
4
+ import Heading from "../Heading/Heading";
5
+ import { HeadingDisplaySizes, HeadingLevels } from "../Heading/HeadingTypes";
6
+ import Image, { ImageProps } from "../Image/Image";
7
+ import { ImageRatios, ImageSizes } from "../Image/ImageTypes";
8
+ import { StructuredContentImagePosition } from "./StructuredContentTypes";
9
+ import generateUUID from "../../helpers/generateUUID";
10
+
11
+ export interface StructuredContentProps {
12
+ /** Optional value to set the text for the callout heading text. */
13
+ calloutText?: string;
14
+ /** Additional class name for the `StructuredContent` component. */
15
+ className?: string;
16
+ /** Optional value to set the text for the main heading text. */
17
+ headingText?: string;
18
+ /** ID that other components can cross reference for accessibility purposes. */
19
+ id?: string;
20
+ /** String value used to populate the `alt` attribute of the internal `Image`
21
+ * component's `img` element. @NOTE if an image is used, this value must be passed. */
22
+ imageAlt?: string;
23
+ /** Optional value to control the aspect ratio of the internal `Image` component.
24
+ * Defaults to `ImageRatios.Square`. */
25
+ imageAspectRatio?: ImageRatios;
26
+ /** Optional value to render as a caption for the internal `Image` component. */
27
+ imageCaption?: string;
28
+ /** Optional DOM element to use instead of the DS `Image` component. */
29
+ imageComponent?: JSX.Element;
30
+ /** Optional value to render as a credit for the internal `Image` component. */
31
+ imageCredit?: string;
32
+ /** Optional value to control the positioning of the internal `Image` component.
33
+ * Defaults to `StructuredContentImagePosition.Left`. */
34
+ imagePosition?: StructuredContentImagePosition;
35
+ /** Optional value to control the size of the internal `Image` component.
36
+ * Defaults to `ImageSizes.Medium`. */
37
+ imageSize?: ImageSizes;
38
+ /** Optional value that contains the path to an image. If omitted, the internal
39
+ * DS `Image` component will not render. */
40
+ imageSrc?: string;
41
+ /** Required value to set the text for the body content. */
42
+ bodyContent: string | JSX.Element;
43
+ }
44
+
45
+ /**
46
+ * Internal component used in the `StructuredContent` component
47
+ * that renders the DS `Image` component.
48
+ */
49
+ function StructuredContentImage(props: ImageProps) {
50
+ const {
51
+ additionalFigureStyles,
52
+ additionalImageStyles,
53
+ additionalWrapperStyles,
54
+ alt,
55
+ component,
56
+ imageAspectRatio,
57
+ imageCaption,
58
+ imageCredit,
59
+ imageSize,
60
+ src,
61
+ } = props;
62
+ return (
63
+ <Image
64
+ additionalFigureStyles={additionalFigureStyles}
65
+ additionalImageStyles={additionalImageStyles}
66
+ additionalWrapperStyles={additionalWrapperStyles}
67
+ alt={alt}
68
+ component={component}
69
+ imageAspectRatio={imageAspectRatio}
70
+ imageSize={imageSize}
71
+ imageCaption={imageCaption}
72
+ imageCredit={imageCredit}
73
+ src={src}
74
+ />
75
+ );
76
+ }
77
+
78
+ /**
79
+ * The `StructuredContent` component that displays a heading, callout content,
80
+ * an image, and body content. All are optional except for body content.
81
+ */
82
+ export default function StructuredContent(
83
+ props: React.PropsWithChildren<StructuredContentProps>
84
+ ) {
85
+ const {
86
+ calloutText,
87
+ className,
88
+ headingText,
89
+ id = generateUUID(),
90
+ imageAlt = "",
91
+ imageAspectRatio = ImageRatios.Square,
92
+ imageCaption,
93
+ imageComponent,
94
+ imageCredit,
95
+ imagePosition = StructuredContentImagePosition.Left,
96
+ imageSize = ImageSizes.Medium,
97
+ imageSrc,
98
+ bodyContent,
99
+ } = props;
100
+ const hasImage = imageSrc || imageComponent;
101
+ const hasFigureImage = imageCaption || imageCredit;
102
+ const styles = useMultiStyleConfig("StructuredContent", {
103
+ hasFigureImage,
104
+ imageAspectRatio,
105
+ imagePosition,
106
+ });
107
+ const finalBodyContent =
108
+ typeof bodyContent === "string" ? (
109
+ <div dangerouslySetInnerHTML={{ __html: bodyContent }} />
110
+ ) : (
111
+ <Box>{bodyContent}</Box>
112
+ );
113
+
114
+ if (hasImage && !imageAlt) {
115
+ console.warn(
116
+ "StructuredContent: `imageAlt` prop is required when using an image."
117
+ );
118
+ }
119
+
120
+ return (
121
+ <Box id={id} className={className} __css={styles}>
122
+ {headingText && (
123
+ <Heading id={`${id}-heading`} level={HeadingLevels.Two}>
124
+ {headingText}
125
+ </Heading>
126
+ )}
127
+ {calloutText && (
128
+ <Heading
129
+ displaySize={HeadingDisplaySizes.Callout}
130
+ id={`${id}-callout`}
131
+ level={HeadingLevels.Three}
132
+ >
133
+ {calloutText}
134
+ </Heading>
135
+ )}
136
+ {hasImage && (
137
+ <StructuredContentImage
138
+ additionalFigureStyles={styles.imageFigure}
139
+ additionalImageStyles={styles.image}
140
+ additionalWrapperStyles={styles.imageWrapper}
141
+ alt={imageAlt}
142
+ component={imageComponent}
143
+ imageAspectRatio={imageAspectRatio}
144
+ imageCaption={imageCaption}
145
+ imageCredit={imageCredit}
146
+ imageSize={imageSize}
147
+ src={imageSrc ? imageSrc : null}
148
+ />
149
+ )}
150
+ {finalBodyContent}
151
+ </Box>
152
+ );
153
+ }
@@ -0,0 +1,5 @@
1
+ export enum StructuredContentImagePosition {
2
+ Left = "left",
3
+ Right = "right",
4
+ Center = "center",
5
+ }