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

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 (307) hide show
  1. package/CHANGELOG.md +118 -1
  2. package/README.md +98 -50
  3. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +4 -0
  4. package/dist/components/Button/Button.d.ts +13 -8
  5. package/dist/components/Button/ButtonTypes.d.ts +2 -1
  6. package/dist/components/Card/Card.d.ts +36 -52
  7. package/dist/components/Card/CardTypes.d.ts +0 -15
  8. package/dist/components/Checkbox/Checkbox.d.ts +17 -13
  9. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +4 -2
  10. package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +15 -0
  11. package/dist/components/DatePicker/DatePicker.d.ts +36 -34
  12. package/dist/components/Fieldset/Fieldset.d.ts +25 -0
  13. package/dist/components/Heading/Heading.d.ts +4 -4
  14. package/dist/components/HelperErrorText/HelperErrorText.d.ts +17 -14
  15. package/dist/components/HorizontalRule/HorizontalRule.d.ts +10 -9
  16. package/dist/components/Icons/Icon.d.ts +8 -0
  17. package/dist/components/Icons/IconSvgs.d.ts +11 -0
  18. package/dist/components/Icons/IconTypes.d.ts +11 -0
  19. package/dist/components/Image/Image.d.ts +19 -9
  20. package/dist/components/Image/ImageTypes.d.ts +20 -0
  21. package/dist/components/Link/Link.d.ts +4 -0
  22. package/dist/components/List/List.d.ts +19 -14
  23. package/dist/components/Notification/Notification.d.ts +37 -16
  24. package/dist/components/Pagination/Pagination.d.ts +16 -13
  25. package/dist/components/Pagination/Pagination.stories.d.ts +2 -0
  26. package/dist/components/ProgressIndicator/ProgressIndicator.d.ts +29 -0
  27. package/dist/components/ProgressIndicator/ProgressIndicatorTypes.d.ts +8 -0
  28. package/dist/components/Radio/Radio.d.ts +2 -0
  29. package/dist/components/RadioGroup/RadioGroup.d.ts +4 -2
  30. package/dist/components/SearchBar/SearchBar.d.ts +3 -3
  31. package/dist/components/Select/Select.d.ts +2 -0
  32. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +18 -14
  33. package/dist/components/Slider/Slider.d.ts +57 -0
  34. package/dist/components/StyleGuide/ColorCard.d.ts +12 -0
  35. package/dist/components/Tabs/Tabs.d.ts +1 -1
  36. package/dist/components/TextInput/TextInput.d.ts +12 -0
  37. package/dist/components/VideoPlayer/VideoPlayer.d.ts +6 -8
  38. package/dist/components/VideoPlayer/VideoPlayerTypes.d.ts +2 -2
  39. package/dist/design-system-react-components.cjs.development.js +6131 -3715
  40. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  41. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  42. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  43. package/dist/design-system-react-components.esm.js +6124 -3699
  44. package/dist/design-system-react-components.esm.js.map +1 -1
  45. package/dist/hooks/tests/useCarouselStyles.test.d.ts +1 -0
  46. package/dist/hooks/useCarouselStyles.d.ts +16 -0
  47. package/dist/hooks/useNYPLTheme.d.ts +54 -0
  48. package/dist/hooks/useWindowSize.d.ts +10 -0
  49. package/dist/index.d.ts +13 -8
  50. package/dist/resources.scss +180 -170
  51. package/dist/styles.css +1 -1
  52. package/dist/theme/components/button.d.ts +22 -8
  53. package/dist/theme/components/card.d.ts +168 -0
  54. package/dist/theme/components/checkbox.d.ts +5 -1
  55. package/dist/theme/components/checkboxGroup.d.ts +12 -0
  56. package/dist/theme/components/componentWrapper.d.ts +11 -0
  57. package/dist/theme/components/datePicker.d.ts +16 -0
  58. package/dist/theme/components/fieldset.d.ts +27 -0
  59. package/dist/theme/components/global.d.ts +23 -13
  60. package/dist/theme/components/globalMixins.d.ts +9 -1
  61. package/dist/theme/components/heading.d.ts +5 -0
  62. package/dist/theme/components/helperErrorText.d.ts +10 -0
  63. package/dist/theme/components/hero.d.ts +1 -0
  64. package/dist/theme/components/horizontalRule.d.ts +14 -0
  65. package/dist/theme/components/image.d.ts +31 -0
  66. package/dist/theme/components/label.d.ts +5 -3
  67. package/dist/theme/components/link.d.ts +4 -0
  68. package/dist/theme/components/list.d.ts +89 -0
  69. package/dist/theme/components/notification.d.ts +75 -0
  70. package/dist/theme/components/pagination.d.ts +19 -0
  71. package/dist/theme/components/progressIndicator.d.ts +50 -0
  72. package/dist/theme/components/radioGroup.d.ts +12 -0
  73. package/dist/theme/components/select.d.ts +11 -2
  74. package/dist/theme/components/skeletonLoader.d.ts +98 -0
  75. package/dist/theme/components/slider.d.ts +51 -0
  76. package/dist/theme/components/tabs.d.ts +54 -3
  77. package/dist/theme/components/textInput.d.ts +8 -1
  78. package/dist/theme/components/videoPlayer.d.ts +40 -0
  79. package/dist/theme/foundations/breakpoints.d.ts +8 -8
  80. package/dist/theme/foundations/global.d.ts +6 -1
  81. package/dist/theme/foundations/radii.d.ts +5 -0
  82. package/dist/theme/foundations/spacing.d.ts +16 -16
  83. package/package.json +72 -83
  84. package/src/__tests__/setup.ts +2 -2
  85. package/src/components/Accordion/Accordion.stories.mdx +39 -44
  86. package/src/components/Autosuggest/Autosuggest.stories.mdx +3 -3
  87. package/src/components/Autosuggest/Autosuggest.stories.tsx +2 -1
  88. package/src/components/Autosuggest/_Autosuggest.scss +5 -5
  89. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +14 -10
  90. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +23 -0
  91. package/src/components/Breadcrumbs/Breadcrumbs.tsx +5 -1
  92. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +199 -1
  93. package/src/components/Button/Button.stories.mdx +15 -10
  94. package/src/components/Button/Button.test.tsx +21 -7
  95. package/src/components/Button/Button.tsx +22 -34
  96. package/src/components/Button/ButtonTypes.tsx +1 -0
  97. package/src/components/Button/__snapshots__/Button.test.tsx.snap +41 -10
  98. package/src/components/Card/Card.stories.mdx +296 -259
  99. package/src/components/Card/Card.test.tsx +156 -84
  100. package/src/components/Card/Card.tsx +195 -145
  101. package/src/components/Card/CardTypes.tsx +0 -17
  102. package/src/components/Card/__snapshots__/Card.test.tsx.snap +410 -0
  103. package/src/components/CardEdition/CardEdition.stories.tsx +15 -47
  104. package/src/components/CardEdition/_CardEdition.scss +22 -23
  105. package/src/components/Chakra/Box.stories.mdx +15 -16
  106. package/src/components/Chakra/Center.stories.mdx +31 -16
  107. package/src/components/Chakra/Grid.stories.mdx +28 -15
  108. package/src/components/Chakra/Stack.stories.mdx +35 -18
  109. package/src/components/Checkbox/Checkbox.stories.mdx +33 -11
  110. package/src/components/Checkbox/Checkbox.test.tsx +47 -2
  111. package/src/components/Checkbox/Checkbox.tsx +39 -33
  112. package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +90 -2
  113. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +82 -2
  114. package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +29 -2
  115. package/src/components/CheckboxGroup/CheckboxGroup.tsx +22 -18
  116. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +47 -81
  117. package/src/components/ComponentWrapper/ComponentWrapper.tsx +63 -0
  118. package/src/components/DatePicker/DatePicker.stories.mdx +163 -62
  119. package/src/components/DatePicker/DatePicker.test.tsx +264 -64
  120. package/src/components/DatePicker/DatePicker.tsx +159 -128
  121. package/src/components/DatePicker/_DatePicker.scss +33 -67
  122. package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +818 -0
  123. package/src/components/Fieldset/Fieldset.stories.mdx +55 -0
  124. package/src/components/Fieldset/Fieldset.test.tsx +125 -0
  125. package/src/components/Fieldset/Fieldset.tsx +52 -0
  126. package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +68 -0
  127. package/src/components/Form/Form.stories.mdx +24 -6
  128. package/src/components/Form/Form.test.tsx +1 -1
  129. package/src/components/Form/Form.tsx +1 -0
  130. package/src/components/Grid/SimpleGrid.stories.mdx +32 -39
  131. package/src/components/Grid/SimpleGrid.test.tsx +4 -4
  132. package/src/components/Heading/Heading.stories.mdx +3 -4
  133. package/src/components/Heading/Heading.tsx +5 -5
  134. package/src/components/HelperErrorText/HelperErrorText.stories.mdx +124 -0
  135. package/src/components/HelperErrorText/HelperErrorText.test.tsx +39 -44
  136. package/src/components/HelperErrorText/HelperErrorText.tsx +37 -39
  137. package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +25 -0
  138. package/src/components/Hero/Hero.stories.mdx +12 -2
  139. package/src/components/Hero/Hero.tsx +1 -1
  140. package/src/components/Hero/HeroTypes.tsx +1 -0
  141. package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +7 -7
  142. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +8 -6
  143. package/src/components/HorizontalRule/HorizontalRule.test.tsx +33 -28
  144. package/src/components/HorizontalRule/HorizontalRule.tsx +27 -29
  145. package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +27 -9
  146. package/src/components/Icons/Icon.stories.mdx +12 -4
  147. package/src/components/Icons/Icon.test.tsx +18 -0
  148. package/src/components/Icons/Icon.tsx +16 -1
  149. package/src/components/Icons/IconSvgs.tsx +22 -0
  150. package/src/components/Icons/IconTypes.tsx +11 -0
  151. package/src/components/Image/Image.stories.mdx +220 -0
  152. package/src/components/Image/Image.test.tsx +131 -29
  153. package/src/components/Image/Image.tsx +84 -56
  154. package/src/components/Image/ImageTypes.ts +22 -0
  155. package/src/components/Image/__snapshots__/Image.test.tsx.snap +190 -0
  156. package/src/components/Input/Input.stories.tsx +23 -67
  157. package/src/components/Input/Input.test.tsx +4 -4
  158. package/src/components/Input/_Input.scss +23 -14
  159. package/src/components/Link/Link.tsx +4 -1
  160. package/src/components/List/List.stories.mdx +124 -49
  161. package/src/components/List/List.test.tsx +142 -63
  162. package/src/components/List/List.tsx +89 -93
  163. package/src/components/List/__snapshots__/List.test.tsx.snap +109 -0
  164. package/src/components/Modal/Modal.stories.mdx +3 -3
  165. package/src/components/Modal/_Modal.scss +2 -2
  166. package/src/components/Notification/Notification.stories.mdx +109 -112
  167. package/src/components/Notification/Notification.test.tsx +99 -110
  168. package/src/components/Notification/Notification.tsx +156 -159
  169. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +159 -8
  170. package/src/components/Pagination/Pagination.stories.mdx +26 -27
  171. package/src/components/Pagination/Pagination.stories.tsx +11 -16
  172. package/src/components/Pagination/Pagination.test.tsx +276 -146
  173. package/src/components/Pagination/Pagination.tsx +174 -154
  174. package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +285 -0
  175. package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +292 -0
  176. package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +225 -0
  177. package/src/components/ProgressIndicator/ProgressIndicator.tsx +126 -0
  178. package/src/components/ProgressIndicator/ProgressIndicatorTypes.ts +8 -0
  179. package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +357 -0
  180. package/src/components/Radio/Radio.test.tsx +20 -4
  181. package/src/components/Radio/Radio.tsx +6 -3
  182. package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +3 -0
  183. package/src/components/RadioGroup/RadioGroup.stories.mdx +3 -4
  184. package/src/components/RadioGroup/RadioGroup.test.tsx +24 -1
  185. package/src/components/RadioGroup/RadioGroup.tsx +19 -19
  186. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +42 -72
  187. package/src/components/SearchBar/SearchBar.Test.tsx +20 -1
  188. package/src/components/SearchBar/SearchBar.stories.mdx +113 -8
  189. package/src/components/SearchBar/SearchBar.tsx +20 -10
  190. package/src/components/Select/Select.test.tsx +12 -0
  191. package/src/components/Select/Select.tsx +5 -2
  192. package/src/components/Select/SelectTypes.tsx +1 -0
  193. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +28 -59
  194. package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +97 -177
  195. package/src/components/SkeletonLoader/SkeletonLoader.tsx +74 -71
  196. package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +739 -0
  197. package/src/components/Slider/Slider.stories.mdx +529 -0
  198. package/src/components/Slider/Slider.test.tsx +653 -0
  199. package/src/components/Slider/Slider.tsx +303 -0
  200. package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +1946 -0
  201. package/src/components/StyleGuide/Bidirectionality.stories.mdx +1 -1
  202. package/src/components/StyleGuide/Breakpoints.stories.mdx +34 -10
  203. package/src/components/StyleGuide/Buttons.stories.mdx +89 -73
  204. package/src/components/StyleGuide/ColorCard.tsx +46 -0
  205. package/src/components/StyleGuide/Colors.stories.mdx +171 -311
  206. package/src/components/StyleGuide/DesignTokens.stories.mdx +170 -0
  207. package/src/components/StyleGuide/Forms.stories.mdx +9 -7
  208. package/src/components/StyleGuide/Iconography.stories.mdx +85 -91
  209. package/src/components/StyleGuide/Spacing.stories.mdx +31 -23
  210. package/src/components/StyleGuide/Typography.stories.mdx +202 -189
  211. package/src/components/StyleGuide/UIDocCard.tsx +1 -1
  212. package/src/components/Tabs/Tabs.stories.mdx +73 -11
  213. package/src/components/Tabs/Tabs.tsx +87 -64
  214. package/src/components/Template/Template.stories.mdx +25 -27
  215. package/src/components/TextInput/TextInput.stories.mdx +1 -1
  216. package/src/components/TextInput/TextInput.test.tsx +22 -2
  217. package/src/components/TextInput/TextInput.tsx +28 -8
  218. package/src/components/TextInput/TextInputTypes.tsx +2 -0
  219. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +17 -4
  220. package/src/components/VideoPlayer/VideoPlayer.test.tsx +54 -53
  221. package/src/components/VideoPlayer/VideoPlayer.tsx +50 -51
  222. package/src/components/VideoPlayer/VideoPlayerTypes.tsx +2 -2
  223. package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +91 -0
  224. package/src/docs/Chakra.stories.mdx +244 -63
  225. package/src/docs/Intro.stories.mdx +5 -2
  226. package/src/hooks/tests/useCarouselStyles.test.ts +140 -0
  227. package/src/hooks/tests/useNYPLTheme.test.tsx +36 -0
  228. package/src/hooks/useCarouselStyles.ts +34 -0
  229. package/src/hooks/useNYPLTheme.ts +67 -0
  230. package/src/hooks/useWindowSize.ts +40 -0
  231. package/src/index.ts +22 -19
  232. package/src/resources.scss +5 -5
  233. package/src/styles/base/{_02-breakpoints.scss → _01-breakpoints.scss} +9 -10
  234. package/src/styles/base/{_03-mixins.scss → _02-mixins.scss} +16 -5
  235. package/src/styles/base/{_04-base.scss → _03-base.scss} +7 -2
  236. package/src/styles/base/{_05-focus.scss → _04-focus.scss} +0 -15
  237. package/src/styles/base/_place-holder.scss +14 -3
  238. package/src/styles/{03-space → space}/_space-inline.scss +14 -14
  239. package/src/styles/{03-space → space}/_space-inset.scss +10 -10
  240. package/src/styles/space/_space-stack.scss +116 -0
  241. package/src/styles.scss +13 -60
  242. package/src/theme/components/button.ts +21 -15
  243. package/src/theme/components/card.ts +174 -0
  244. package/src/theme/components/checkbox.ts +8 -3
  245. package/src/theme/components/checkboxGroup.ts +8 -0
  246. package/src/theme/components/componentWrapper.ts +10 -0
  247. package/src/theme/components/datePicker.ts +17 -0
  248. package/src/theme/components/fieldset.ts +18 -0
  249. package/src/theme/components/global.ts +26 -15
  250. package/src/theme/components/globalMixins.ts +9 -1
  251. package/src/theme/components/heading.ts +10 -5
  252. package/src/theme/components/helperErrorText.ts +9 -0
  253. package/src/theme/components/hero.ts +4 -3
  254. package/src/theme/components/horizontalRule.ts +13 -0
  255. package/src/theme/components/icon.ts +9 -9
  256. package/src/theme/components/image.ts +116 -0
  257. package/src/theme/components/label.ts +3 -10
  258. package/src/theme/components/link.ts +5 -1
  259. package/src/theme/components/list.ts +73 -0
  260. package/src/theme/components/notification.ts +93 -0
  261. package/src/theme/components/pagination.ts +20 -0
  262. package/src/theme/components/progressIndicator.ts +62 -0
  263. package/src/theme/components/radio.ts +2 -2
  264. package/src/theme/components/radioGroup.ts +8 -0
  265. package/src/theme/components/select.ts +6 -3
  266. package/src/theme/components/skeletonLoader.ts +107 -0
  267. package/src/theme/components/slider.ts +79 -0
  268. package/src/theme/components/statusBadge.ts +1 -2
  269. package/src/theme/components/tabs.ts +49 -19
  270. package/src/theme/components/template.ts +8 -8
  271. package/src/theme/components/textInput.ts +5 -4
  272. package/src/theme/components/videoPlayer.ts +49 -0
  273. package/src/theme/foundations/breakpoints.ts +8 -8
  274. package/src/theme/foundations/global.ts +6 -1
  275. package/src/theme/foundations/radii.ts +6 -0
  276. package/src/theme/foundations/spacing.ts +24 -24
  277. package/src/theme/index.ts +41 -10
  278. package/src/utils/componentCategories.ts +4 -3
  279. package/dist/components/HelperErrorText/HelperErrorText.stories.d.ts +0 -16
  280. package/dist/components/Image/Image.stories.d.ts +0 -18
  281. package/dist/components/List/List.stories.d.ts +0 -7
  282. package/dist/theme/components/customCheckboxGroup.d.ts +0 -18
  283. package/dist/theme/components/customRadioGroup.d.ts +0 -18
  284. package/src/components/Button/_Button.scss +0 -32
  285. package/src/components/Card/_Card.scss +0 -308
  286. package/src/components/HelperErrorText/HelperErrorText.stories.tsx +0 -48
  287. package/src/components/HelperErrorText/_HelperErrorText.scss +0 -9
  288. package/src/components/HorizontalRule/_HorizontalRule.scss +0 -15
  289. package/src/components/Image/Image.stories.tsx +0 -54
  290. package/src/components/Image/_Image.scss +0 -38
  291. package/src/components/List/List.stories.tsx +0 -139
  292. package/src/components/List/_List.scss +0 -76
  293. package/src/components/Notification/_Notification.scss +0 -110
  294. package/src/components/Pagination/_Pagination.scss +0 -40
  295. package/src/components/SkeletonLoader/_SkeletonLoader.scss +0 -142
  296. package/src/components/VideoPlayer/_VideoPlayer.scss +0 -38
  297. package/src/styles/01-colors/_colors-brand.scss +0 -62
  298. package/src/styles/01-colors/_colors-utility.scss +0 -67
  299. package/src/styles/02-typography/_type-scale.css +0 -11
  300. package/src/styles/02-typography/_type-weight.css +0 -7
  301. package/src/styles/02-typography/_typefaces.css +0 -4
  302. package/src/styles/03-space/_space-stack.scss +0 -116
  303. package/src/styles/03-space/_space.css +0 -30
  304. package/src/styles/base/_card-grid.scss +0 -78
  305. package/src/styles/base/_typography.scss +0 -11
  306. package/src/theme/components/customCheckboxGroup.ts +0 -12
  307. package/src/theme/components/customRadioGroup.ts +0 -12
@@ -1,53 +1,77 @@
1
1
  import * as React from "react";
2
2
  import { render, screen } from "@testing-library/react";
3
3
  import { axe } from "jest-axe";
4
+ import renderer from "react-test-renderer";
4
5
 
5
6
  import List from "./List";
6
7
  import { ListTypes } from "./ListTypes";
7
8
 
8
- describe("Link Accessibility", () => {
9
- it("passes axe accessibility test", async () => {
10
- const { container } = render(
9
+ const fishArray = ["Mahi-mahi", "Golden trout", "Rainbowfish", "Suckerfish"];
10
+ const fishDefinitions = [
11
+ {
12
+ term: "Mahi-mahi",
13
+ definition: "The mahi-mahi is an ocean fish known...",
14
+ },
15
+ {
16
+ term: "Golden trout",
17
+ definition: "The golden trout is a beautifully colored fish...",
18
+ },
19
+ ];
20
+
21
+ describe("List Accessibility", () => {
22
+ it("passes axe accessibility test for unordered list", async () => {
23
+ const { container, rerender } = render(
11
24
  <List type={ListTypes.Unordered}>
12
25
  <li>Mahi-mahi</li>
13
26
  <li>Golden trout</li>
14
27
  </List>
15
28
  );
16
29
  expect(await axe(container)).toHaveNoViolations();
30
+
31
+ rerender(<List type={ListTypes.Unordered} listItems={fishArray} />);
32
+ expect(await axe(container)).toHaveNoViolations();
33
+ });
34
+ it("passes axe accessibility test for ordered list", async () => {
35
+ const { container, rerender } = render(
36
+ <List type={ListTypes.Ordered}>
37
+ <li>Mahi-mahi</li>
38
+ <li>Golden trout</li>
39
+ </List>
40
+ );
41
+ expect(await axe(container)).toHaveNoViolations();
42
+
43
+ rerender(<List type={ListTypes.Ordered} listItems={fishArray} />);
44
+ expect(await axe(container)).toHaveNoViolations();
45
+ });
46
+ it("passes axe accessibility test for definition list", async () => {
47
+ const { container } = render(
48
+ <List
49
+ type={ListTypes.Definition}
50
+ title="Animal Crossing Fish"
51
+ listItems={fishDefinitions}
52
+ />
53
+ );
54
+ expect(await axe(container)).toHaveNoViolations();
17
55
  });
18
56
  });
19
57
 
20
58
  describe("List", () => {
21
- const fishArray = ["Mahi-mahi", "Golden trout", "Rainbowfish", "Suckerfish"];
22
- const fishDefinitions = [
23
- {
24
- term: "Mahi-mahi",
25
- definition: "The mahi-mahi is an ocean fish known...",
26
- },
27
- {
28
- term: "Golden trout",
29
- definition: "The golden trout is a beautifully colored fish...",
30
- },
31
- ];
32
-
33
59
  it("renders unordered list", () => {
34
- const utils = render(
60
+ render(
35
61
  <List type={ListTypes.Unordered}>
36
62
  <li>Mahi-mahi</li>
37
63
  <li>Golden trout</li>
38
64
  </List>
39
65
  );
40
- expect(utils.container.querySelector(".list")).toBeInTheDocument();
66
+
41
67
  expect(screen.getAllByRole("listitem")).toHaveLength(2);
42
68
  expect(screen.getByText("Mahi-mahi")).toBeInTheDocument();
43
69
  expect(screen.getByText("Golden trout")).toBeInTheDocument();
44
70
  });
45
71
 
46
72
  it("renders unordered list with the `listItems` prop", () => {
47
- const utils = render(
48
- <List type={ListTypes.Unordered} listItems={fishArray} />
49
- );
50
- expect(utils.container.querySelector(".list")).toBeInTheDocument();
73
+ render(<List type={ListTypes.Unordered} listItems={fishArray} />);
74
+
51
75
  expect(screen.getAllByRole("listitem")).toHaveLength(4);
52
76
  expect(screen.getByText("Mahi-mahi")).toBeInTheDocument();
53
77
  expect(screen.getByText("Golden trout")).toBeInTheDocument();
@@ -56,23 +80,21 @@ describe("List", () => {
56
80
  });
57
81
 
58
82
  it("renders ordered list", () => {
59
- const utils = render(
83
+ render(
60
84
  <List type={ListTypes.Ordered}>
61
85
  <li>Mahi-mahi</li>
62
86
  <li>Golden trout</li>
63
87
  </List>
64
88
  );
65
- expect(utils.container.querySelector(".list")).toBeInTheDocument();
89
+
66
90
  expect(screen.getAllByRole("listitem")).toHaveLength(2);
67
91
  expect(screen.getByText("Mahi-mahi")).toBeInTheDocument();
68
92
  expect(screen.getByText("Golden trout")).toBeInTheDocument();
69
93
  });
70
94
 
71
95
  it("renders ordered list with the `listItems` prop", () => {
72
- const utils = render(
73
- <List type={ListTypes.Ordered} listItems={fishArray} />
74
- );
75
- expect(utils.container.querySelector(".list")).toBeInTheDocument();
96
+ render(<List type={ListTypes.Ordered} listItems={fishArray} />);
97
+
76
98
  expect(screen.getAllByRole("listitem")).toHaveLength(4);
77
99
  expect(screen.getByText("Mahi-mahi")).toBeInTheDocument();
78
100
  expect(screen.getByText("Golden trout")).toBeInTheDocument();
@@ -105,50 +127,107 @@ describe("List", () => {
105
127
  expect(screen.getAllByRole("definition")).toHaveLength(2);
106
128
  });
107
129
 
108
- it("throws an error when you pass an ordered or unordered list children that aren't <li>s", () => {
109
- expect(() =>
110
- render(
111
- <List type={ListTypes.Ordered}>
112
- <span>Mahi-mahi</span>
113
- <span>Golden trout</span>
114
- <span>Rainbowfish</span>
115
- </List>
116
- )
117
- ).toThrowError("Direct children of `List` (ordered) should be `<li>`s");
130
+ it("consoles a warning when children and the `listItems` prop are both passed", () => {
131
+ const warn = jest.spyOn(console, "warn");
132
+ render(
133
+ <List type={ListTypes.Ordered} listItems={fishArray}>
134
+ <li>Mahi-mahi</li>
135
+ <li>Golden trout</li>
136
+ <li>Rainbowfish</li>
137
+ <li>Suckerfish</li>
138
+ </List>
139
+ );
140
+ expect(warn).toHaveBeenCalledWith(
141
+ "Pass in either `<li>`, `<dt>`, or `<dd>` children or use the `listItems` data prop, but don't use both."
142
+ );
118
143
  });
119
144
 
120
- it("throws an error when you pass a definition list children that aren't `<dt>`s or `<dd>`s", () => {
121
- expect(() =>
122
- render(
123
- <List type={ListTypes.Definition}>
124
- <span>Mahi-mahi</span>
125
- <span>Golden trout</span>
126
- <span>Rainbowfish</span>
127
- </List>
128
- )
129
- ).toThrowError(
130
- "Direct children of `List` (definition) should be `<dt>`s or `<dd>`s"
145
+ it("consoles a warning when no children are passed or the `listItems` prop is not passed", () => {
146
+ const warn = jest.spyOn(console, "warn");
147
+ render(<List type={ListTypes.Ordered}></List>);
148
+ expect(warn).toHaveBeenCalledWith(
149
+ "Either `<li>` children or the `listItems` prop must be used."
131
150
  );
132
151
  });
133
152
 
134
- it("throws an error when no children are passed or the `listItems` prop is not passed", () => {
135
- expect(() => render(<List type={ListTypes.Ordered}></List>)).toThrowError(
136
- "Either `<li>` children or the `listItems` prop must be used."
153
+ it("consoles a warning when you pass an ordered or unordered list children that aren't <li>s", () => {
154
+ const warn = jest.spyOn(console, "warn");
155
+ render(
156
+ <List type={ListTypes.Ordered}>
157
+ <span>Mahi-mahi</span>
158
+ <span>Golden trout</span>
159
+ <span>Rainbowfish</span>
160
+ </List>
161
+ );
162
+ expect(warn).toHaveBeenCalledWith(
163
+ "Direct children of `List` (ol) should be `<li>`s."
137
164
  );
138
165
  });
139
166
 
140
- it("throws an error when children and the `listItems` prop are both passed", () => {
141
- expect(() =>
142
- render(
143
- <List type={ListTypes.Ordered} listItems={fishArray}>
144
- <li>Mahi-mahi</li>
145
- <li>Golden trout</li>
146
- <li>Rainbowfish</li>
147
- <li>Suckerfish</li>
148
- </List>
149
- )
150
- ).toThrowError(
151
- "Pass in either `<li>` children or use the `listItems` data prop, don't use both."
167
+ it("consoles a warning when you pass a definition list children that aren't `<dt>`s or `<dd>`s", () => {
168
+ const warn = jest.spyOn(console, "warn");
169
+ render(
170
+ <List type={ListTypes.Definition}>
171
+ <span>Mahi-mahi</span>
172
+ <span>Golden trout</span>
173
+ <span>Rainbowfish</span>
174
+ </List>
175
+ );
176
+ expect(warn).toHaveBeenCalledWith(
177
+ "Direct children of `List` (definition) should be `<dt>`s and `<dd>`s."
152
178
  );
153
179
  });
180
+
181
+ it("Renders the UI snapshot correctly", () => {
182
+ const unordered = renderer
183
+ .create(
184
+ <List id="unordered" type={ListTypes.Unordered} listItems={fishArray} />
185
+ )
186
+ .toJSON();
187
+ const unorderedNoStyling = renderer
188
+ .create(
189
+ <List
190
+ id="ordered"
191
+ type={ListTypes.Unordered}
192
+ listItems={fishArray}
193
+ noStyling
194
+ />
195
+ )
196
+ .toJSON();
197
+ const ordered = renderer
198
+ .create(
199
+ <List
200
+ id="unordered-no-styling"
201
+ type={ListTypes.Ordered}
202
+ listItems={fishArray}
203
+ />
204
+ )
205
+ .toJSON();
206
+ const orderedNoStyling = renderer
207
+ .create(
208
+ <List
209
+ id="ordered-no-styling"
210
+ type={ListTypes.Ordered}
211
+ listItems={fishArray}
212
+ noStyling
213
+ />
214
+ )
215
+ .toJSON();
216
+ const definition = renderer
217
+ .create(
218
+ <List
219
+ id="definition"
220
+ type={ListTypes.Definition}
221
+ title="Animal Crossing Fish"
222
+ listItems={fishDefinitions}
223
+ />
224
+ )
225
+ .toJSON();
226
+
227
+ expect(unordered).toMatchSnapshot();
228
+ expect(unorderedNoStyling).toMatchSnapshot();
229
+ expect(ordered).toMatchSnapshot();
230
+ expect(orderedNoStyling).toMatchSnapshot();
231
+ expect(definition).toMatchSnapshot();
232
+ });
154
233
  });
@@ -1,80 +1,87 @@
1
1
  import * as React from "react";
2
+ import { As, Box, useStyleConfig } from "@chakra-ui/react";
2
3
 
3
- import bem from "../../utils/bem";
4
4
  import { ListTypes } from "./ListTypes";
5
5
  import Heading from "../Heading/Heading";
6
6
  import { HeadingLevels } from "../Heading/HeadingTypes";
7
+ import generateUUID from "../../helpers/generateUUID";
7
8
 
8
9
  interface DefinitionProps {
9
10
  term: string;
10
11
  definition: string;
11
12
  }
12
13
  export interface ListProps {
13
- /** BlockName for use with BEM. See how to work with blockNames and
14
- * BEM here: http://getbem.com/introduction/ */
15
- blockName?: string;
14
+ /** Optionally pass in additional Chakra-based styles. */
15
+ additionalStyles?: { [key: string]: any };
16
16
  /** ClassName you can add in addition to 'list' */
17
17
  className?: string;
18
18
  /** ID that other components can cross reference for accessibility purposes */
19
19
  id?: string;
20
- /** Modifiers array for use with BEM. See how to work with modifiers and
21
- * BEM here: http://getbem.com/introduction/ */
22
- modifiers?: any[];
23
- /** An optional title that will appear over the list. This prop only applies
24
- * to Definition Lists. */
25
- title?: string;
26
- /** Ordered, Unordered, or Definition */
27
- type: ListTypes;
20
+ /** Display the list in a row. */
21
+ inline?: boolean;
28
22
  /** Data to render if children are not passed. For `ListTypes.Ordered` and
29
23
  * `ListTypes.Unordered` `List` types, the data structure is an array of
30
24
  * strings to renders as `li` items. For `ListTypes.Definition` `List` types,
31
25
  * the data structure is an array of objects with `term` and `definition`
32
26
  * properties to render `dt` and `dd` elements, respectively.
33
27
  */
34
- listItems?: (string | DefinitionProps)[];
28
+ listItems?: (string | JSX.Element | DefinitionProps)[];
29
+ /** Remove list styling. */
30
+ noStyling?: boolean;
31
+ /** An optional title that will appear over the list. This prop only applies
32
+ * to Definition Lists. */
33
+ title?: string;
34
+ /** The type of list: Ordered, Unordered, or Definition. Unordered by default. */
35
+ type: ListTypes;
35
36
  }
36
37
 
37
- /** A component that renders list item `li` elements or definition item `dt`
38
- * and `dd` elements based on the `type` prop. */
38
+ /**
39
+ * A component that renders list item `li` elements or definition item `dt`
40
+ * and `dd` elements based on the `type` prop. Note that the `title` prop will
41
+ * only display for the `Definition` list type.
42
+ */
39
43
  export default function List(props: React.PropsWithChildren<ListProps>) {
40
44
  const {
41
- blockName,
45
+ additionalStyles = {},
42
46
  children,
43
47
  className,
44
- id,
45
- modifiers = [],
46
- type,
47
- title,
48
+ id = generateUUID(),
49
+ inline = false,
48
50
  listItems,
51
+ noStyling = false,
52
+ title,
53
+ type = ListTypes.Unordered,
49
54
  } = props;
55
+ const styles = useStyleConfig("List", { inline, noStyling, variant: type });
56
+ const finalStyles = { ...styles, ...additionalStyles };
57
+ let listElement = null;
50
58
 
51
59
  // Either li/dt/dd children elements must be passed or the `listItems`
52
60
  // prop must be used.
53
61
  if (children && (listItems || listItems?.length > 0)) {
54
- throw new Error(
55
- "Pass in either `<li>` children or use the `listItems` data prop, don't use both."
62
+ console.warn(
63
+ "Pass in either `<li>`, `<dt>`, or `<dd>` children or use the `listItems` data prop, but don't use both."
64
+ );
65
+ return null;
66
+ }
67
+ if (!children && !listItems) {
68
+ console.warn(
69
+ "Either `<li>` children or the `listItems` prop must be used."
56
70
  );
71
+ return null;
57
72
  }
58
73
 
59
- const baseClass = "list";
60
- let listTag;
61
- let invalidText = "";
62
74
  /**
63
75
  * This returns either the `children` elements passed to the `List` component
64
- * first, and if that is not passed, it will check and render the data passed
65
- * into `listItems` based on the `ListType` type of list. If it is of type
66
- * Unordered or Ordered, it will return `li` elements. Otherwise, it will
67
- * return a combination of `dt` and `dd` elements for the Definition type.
76
+ * first, otherwise it will check and render the data passed into the
77
+ * `listItems` props based on the `ListType` type. If it is of type "Unordered"
78
+ * or "Ordered", it will return `li` elements. Otherwise, it will return a
79
+ * combination of `dt` and `dd` elements for the "Definition" type.
68
80
  */
69
- const listChildrenElms = (listType) => {
81
+ const listChildrenElms = (listType: ListTypes) => {
70
82
  if (children) {
71
83
  return children;
72
84
  }
73
- if (!listItems || listItems?.length === 0) {
74
- throw new Error(
75
- "Either `<li>` children or the `listItems` prop must be used."
76
- );
77
- }
78
85
  if (listType === ListTypes.Ordered || listType === ListTypes.Unordered) {
79
86
  return listItems.map((item, i) => <li key={i}>{item}</li>);
80
87
  } else if (listType === ListTypes.Definition) {
@@ -86,70 +93,59 @@ export default function List(props: React.PropsWithChildren<ListProps>) {
86
93
  return null;
87
94
  };
88
95
  /**
89
- * Checks for `li` element type and throws an error if it is a different type.
96
+ * Checks for `li` elements and consoles a warning if the
97
+ * children are different HTML elements.
90
98
  */
91
- const checkLiChildrenError = (listType) => {
92
- invalidText = `Direct children of \`List\` (${listType}) should be \`<li>\`s`;
93
- React.Children.map(children, function (child: React.ReactElement) {
99
+ const checkListChildrenError = (listType: ListTypes) => {
100
+ React.Children.map(children, (child: React.ReactElement) => {
94
101
  if (child?.type !== "li" && child?.props?.mdxType !== "li") {
95
- throw new Error(invalidText);
102
+ console.warn(
103
+ `Direct children of \`List\` (${listType}) should be \`<li>\`s.`
104
+ );
105
+ }
106
+ });
107
+ };
108
+ /**
109
+ * Checks for `dt` and `dd` elements and consoles a warning if the
110
+ * children are different HTML elements.
111
+ */
112
+ const checkDefinitionChildrenError = () => {
113
+ React.Children.map(children, function (child: React.ReactElement) {
114
+ if (
115
+ child.type !== "dt" &&
116
+ child.type !== "dd" &&
117
+ child.type !== React.Fragment &&
118
+ child.props.mdxType !== "dt" &&
119
+ child.props.mdxType !== "dd" &&
120
+ child.props.mdxType !== React.Fragment
121
+ ) {
122
+ console.warn(
123
+ "Direct children of `List` (definition) should be `<dt>`s and `<dd>`s."
124
+ );
96
125
  }
97
126
  });
98
127
  };
99
128
 
100
- switch (type) {
101
- case ListTypes.Ordered:
102
- checkLiChildrenError("ordered");
103
- listTag = (
104
- <ol
105
- id={id}
106
- className={bem(baseClass, modifiers, blockName, [className])}
107
- >
108
- {listChildrenElms(type)}
109
- </ol>
110
- );
111
- break;
112
- case ListTypes.Unordered:
113
- checkLiChildrenError("unordered");
114
- listTag = (
115
- <ul
116
- id={id}
117
- className={bem(baseClass, modifiers, blockName, [className])}
118
- >
119
- {listChildrenElms(type)}
120
- </ul>
121
- );
122
- break;
123
- case ListTypes.Definition:
124
- invalidText =
125
- "Direct children of `List` (definition) should be `<dt>`s or `<dd>`s";
126
- React.Children.map(children, function (child: React.ReactElement) {
127
- if (
128
- child.type !== "dt" &&
129
- child.type !== "dd" &&
130
- child.type !== React.Fragment &&
131
- child.props.mdxType !== "dt" &&
132
- child.props.mdxType !== "dd" &&
133
- child.props.mdxType !== React.Fragment
134
- ) {
135
- throw new Error(invalidText);
136
- }
137
- });
138
- listTag = (
139
- <section
140
- id={id}
141
- className={bem("definition-list", modifiers, baseClass)}
142
- >
143
- {title && (
144
- <Heading id={`${id}-heading`} level={HeadingLevels.Two}>
145
- {title}
146
- </Heading>
147
- )}
148
- <dl>{listChildrenElms(type)}</dl>
149
- </section>
150
- );
151
- break;
129
+ if (type === ListTypes.Ordered || type === ListTypes.Unordered) {
130
+ checkListChildrenError(type);
131
+ listElement = (
132
+ <Box as={type as As} id={id} className={className} __css={finalStyles}>
133
+ {listChildrenElms(type)}
134
+ </Box>
135
+ );
136
+ } else if (type === ListTypes.Definition) {
137
+ checkDefinitionChildrenError();
138
+ listElement = (
139
+ <Box as="section" id={id} className={className} __css={finalStyles}>
140
+ {title && (
141
+ <Heading id={`${id}-heading`} level={HeadingLevels.Two}>
142
+ {title}
143
+ </Heading>
144
+ )}
145
+ <dl>{listChildrenElms(type)}</dl>
146
+ </Box>
147
+ );
152
148
  }
153
149
 
154
- return listTag;
150
+ return listElement;
155
151
  }
@@ -0,0 +1,109 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`List Renders the UI snapshot correctly 1`] = `
4
+ <ul
5
+ className="css-0"
6
+ id="unordered"
7
+ >
8
+ <li>
9
+ Mahi-mahi
10
+ </li>
11
+ <li>
12
+ Golden trout
13
+ </li>
14
+ <li>
15
+ Rainbowfish
16
+ </li>
17
+ <li>
18
+ Suckerfish
19
+ </li>
20
+ </ul>
21
+ `;
22
+
23
+ exports[`List Renders the UI snapshot correctly 2`] = `
24
+ <ul
25
+ className="css-0"
26
+ id="ordered"
27
+ >
28
+ <li>
29
+ Mahi-mahi
30
+ </li>
31
+ <li>
32
+ Golden trout
33
+ </li>
34
+ <li>
35
+ Rainbowfish
36
+ </li>
37
+ <li>
38
+ Suckerfish
39
+ </li>
40
+ </ul>
41
+ `;
42
+
43
+ exports[`List Renders the UI snapshot correctly 3`] = `
44
+ <ol
45
+ className="css-0"
46
+ id="unordered-no-styling"
47
+ >
48
+ <li>
49
+ Mahi-mahi
50
+ </li>
51
+ <li>
52
+ Golden trout
53
+ </li>
54
+ <li>
55
+ Rainbowfish
56
+ </li>
57
+ <li>
58
+ Suckerfish
59
+ </li>
60
+ </ol>
61
+ `;
62
+
63
+ exports[`List Renders the UI snapshot correctly 4`] = `
64
+ <ol
65
+ className="css-0"
66
+ id="ordered-no-styling"
67
+ >
68
+ <li>
69
+ Mahi-mahi
70
+ </li>
71
+ <li>
72
+ Golden trout
73
+ </li>
74
+ <li>
75
+ Rainbowfish
76
+ </li>
77
+ <li>
78
+ Suckerfish
79
+ </li>
80
+ </ol>
81
+ `;
82
+
83
+ exports[`List Renders the UI snapshot correctly 5`] = `
84
+ <section
85
+ className="css-0"
86
+ id="definition"
87
+ >
88
+ <h2
89
+ className="chakra-heading css-0"
90
+ id="definition-heading"
91
+ >
92
+ Animal Crossing Fish
93
+ </h2>
94
+ <dl>
95
+ <dt>
96
+ Mahi-mahi
97
+ </dt>
98
+ <dd>
99
+ The mahi-mahi is an ocean fish known...
100
+ </dd>
101
+ <dt>
102
+ Golden trout
103
+ </dt>
104
+ <dd>
105
+ The golden trout is a beautifully colored fish...
106
+ </dd>
107
+ </dl>
108
+ </section>
109
+ `;
@@ -3,7 +3,7 @@ import {
3
3
  Meta,
4
4
  Story,
5
5
  ArgsTable,
6
- Preview,
6
+ Canvas,
7
7
  Description,
8
8
  } from "@storybook/addon-docs/blocks";
9
9
  import Modal from "./Modal";
@@ -118,11 +118,11 @@ export const ModalStory = (args) => {
118
118
  );
119
119
  };
120
120
 
121
- <Preview withToolbar>
121
+ <Canvas withToolbar>
122
122
  <Story name="Basic" args={{ open: false }}>
123
123
  {(args) => <ModalStory {...args} />}
124
124
  </Story>
125
- </Preview>
125
+ </Canvas>
126
126
 
127
127
  <ArgsTable story="Basic" />
128
128
 
@@ -5,9 +5,9 @@
5
5
  }
6
6
 
7
7
  .modal {
8
- @include space-inset-s;
8
+ padding: var(--nypl-space-s);
9
9
 
10
- background-color: var(--ui-gray-x-light-warm);
10
+ background-color: var(--nypl-colors-ui-gray-x-light-warm);
11
11
  height: 100vh;
12
12
  left: 0;
13
13
  overflow-y: auto;