@nypl/design-system-react-components 0.25.13 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +10 -10
  3. package/dist/components/Accordion/Accordion.d.ts +1 -1
  4. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +1 -1
  5. package/dist/components/Button/Button.d.ts +2 -2
  6. package/dist/components/Card/Card.d.ts +11 -9
  7. package/dist/components/Checkbox/Checkbox.d.ts +2 -2
  8. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +5 -4
  9. package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +1 -1
  10. package/dist/components/DatePicker/DatePicker.d.ts +5 -6
  11. package/dist/components/Fieldset/Fieldset.d.ts +5 -6
  12. package/dist/components/Form/Form.d.ts +6 -6
  13. package/dist/components/Grid/GridTypes.d.ts +7 -7
  14. package/dist/components/Grid/SimpleGrid.d.ts +1 -1
  15. package/dist/components/Heading/Heading.d.ts +1 -1
  16. package/dist/components/HelperErrorText/HelperErrorText.d.ts +9 -8
  17. package/dist/components/Hero/Hero.d.ts +2 -1
  18. package/dist/components/HorizontalRule/HorizontalRule.d.ts +2 -10
  19. package/dist/components/Icons/Icon.d.ts +2 -1
  20. package/dist/components/Image/Image.d.ts +2 -2
  21. package/dist/components/Label/Label.d.ts +7 -4
  22. package/dist/components/Link/Link.d.ts +1 -1
  23. package/dist/components/List/List.d.ts +11 -11
  24. package/dist/components/List/ListTypes.d.ts +1 -1
  25. package/dist/components/Logo/Logo.d.ts +2 -1
  26. package/dist/components/Logo/LogoSvgs.d.ts +2 -0
  27. package/dist/components/Logo/LogoTypes.d.ts +2 -0
  28. package/dist/components/Notification/Notification.d.ts +4 -4
  29. package/dist/components/Pagination/Pagination.d.ts +2 -2
  30. package/dist/components/ProgressIndicator/ProgressIndicator.d.ts +3 -3
  31. package/dist/components/Radio/Radio.d.ts +4 -6
  32. package/dist/components/RadioGroup/RadioGroup.d.ts +12 -6
  33. package/dist/components/SearchBar/SearchBar.d.ts +4 -4
  34. package/dist/components/Select/Select.d.ts +10 -6
  35. package/dist/components/Select/SelectTypes.d.ts +4 -0
  36. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +4 -3
  37. package/dist/components/Slider/Slider.d.ts +6 -4
  38. package/dist/components/StatusBadge/StatusBadge.d.ts +5 -1
  39. package/dist/components/StructuredContent/StructuredContent.d.ts +2 -2
  40. package/dist/components/Table/Table.d.ts +1 -1
  41. package/dist/components/Tabs/Tabs.d.ts +4 -3
  42. package/dist/components/Template/Template.d.ts +4 -3
  43. package/dist/components/Text/Text.d.ts +1 -1
  44. package/dist/components/TextInput/TextInput.d.ts +5 -5
  45. package/dist/components/Toggle/Toggle.d.ts +3 -4
  46. package/dist/components/VideoPlayer/VideoPlayer.d.ts +2 -1
  47. package/dist/design-system-react-components.cjs.development.js +1663 -1139
  48. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  49. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  50. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  51. package/dist/design-system-react-components.esm.js +1667 -1143
  52. package/dist/design-system-react-components.esm.js.map +1 -1
  53. package/dist/hooks/useCarouselStyles.d.ts +3 -2
  54. package/dist/hooks/useNYPLTheme.d.ts +12 -0
  55. package/dist/index.d.ts +4 -1
  56. package/dist/styles.css +1 -1
  57. package/dist/theme/components/button.d.ts +10 -2
  58. package/dist/theme/components/card.d.ts +42 -22
  59. package/dist/theme/components/checkbox.d.ts +5 -4
  60. package/dist/theme/components/checkboxGroup.d.ts +1 -1
  61. package/dist/theme/components/componentWrapper.d.ts +2 -2
  62. package/dist/theme/components/customTable.d.ts +84 -1
  63. package/dist/theme/components/fieldset.d.ts +4 -14
  64. package/dist/theme/components/global.d.ts +23 -17
  65. package/dist/theme/components/heading.d.ts +53 -0
  66. package/dist/theme/components/helperErrorText.d.ts +1 -0
  67. package/dist/theme/components/hero.d.ts +20 -14
  68. package/dist/theme/components/label.d.ts +9 -10
  69. package/dist/theme/components/list.d.ts +99 -9
  70. package/dist/theme/components/radio.d.ts +6 -4
  71. package/dist/theme/components/radioGroup.d.ts +1 -1
  72. package/dist/theme/components/select.d.ts +34 -5
  73. package/dist/theme/components/skeletonLoader.d.ts +2 -2
  74. package/dist/theme/components/slider.d.ts +6 -3
  75. package/dist/theme/components/structuredContent.d.ts +197 -0
  76. package/dist/theme/components/textInput.d.ts +18 -6
  77. package/dist/theme/components/toggle.d.ts +7 -4
  78. package/dist/theme/foundations/global.d.ts +2 -0
  79. package/dist/theme/foundations/radii.d.ts +1 -0
  80. package/dist/theme/foundations/spacing.d.ts +46 -43
  81. package/package.json +5 -6
  82. package/src/components/Accordion/Accordion.stories.mdx +9 -9
  83. package/src/components/Accordion/Accordion.test.tsx +21 -0
  84. package/src/components/Accordion/Accordion.tsx +13 -9
  85. package/src/components/Accordion/__snapshots__/Accordion.test.tsx.snap +276 -27
  86. package/src/components/Autosuggest/Autosuggest.stories.mdx +4 -3
  87. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +21 -5
  88. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +52 -31
  89. package/src/components/Breadcrumbs/Breadcrumbs.tsx +8 -7
  90. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +211 -12
  91. package/src/components/Button/Button.stories.mdx +87 -23
  92. package/src/components/Button/Button.test.tsx +25 -0
  93. package/src/components/Button/Button.tsx +18 -7
  94. package/src/components/Button/__snapshots__/Button.test.tsx.snap +27 -7
  95. package/src/components/Card/Card.stories.mdx +287 -194
  96. package/src/components/Card/Card.test.tsx +102 -0
  97. package/src/components/Card/Card.tsx +73 -32
  98. package/src/components/Card/__snapshots__/Card.test.tsx.snap +195 -35
  99. package/src/components/Chakra/Grid.stories.mdx +4 -4
  100. package/src/components/Checkbox/Checkbox.stories.mdx +62 -10
  101. package/src/components/Checkbox/Checkbox.test.tsx +32 -9
  102. package/src/components/Checkbox/Checkbox.tsx +20 -15
  103. package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +134 -7
  104. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +65 -17
  105. package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +137 -81
  106. package/src/components/CheckboxGroup/CheckboxGroup.tsx +31 -21
  107. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +332 -97
  108. package/src/components/ComponentWrapper/ComponentWrapper.test.tsx +12 -0
  109. package/src/components/ComponentWrapper/ComponentWrapper.tsx +39 -41
  110. package/src/components/ComponentWrapper/__snapshots__/ComponentWrapper.test.tsx.snap +47 -34
  111. package/src/components/DatePicker/DatePicker.stories.mdx +63 -27
  112. package/src/components/DatePicker/DatePicker.test.tsx +89 -13
  113. package/src/components/DatePicker/DatePicker.tsx +62 -56
  114. package/src/components/DatePicker/_DatePicker.scss +71 -13
  115. package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +250 -206
  116. package/src/components/Fieldset/Fieldset.stories.mdx +33 -3
  117. package/src/components/Fieldset/Fieldset.test.tsx +58 -28
  118. package/src/components/Fieldset/Fieldset.tsx +35 -30
  119. package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +40 -19
  120. package/src/components/Form/Form.stories.mdx +72 -39
  121. package/src/components/Form/Form.test.tsx +58 -15
  122. package/src/components/Form/Form.tsx +89 -67
  123. package/src/components/Form/__snapshots__/Form.test.tsx.snap +83 -5
  124. package/src/components/Grid/GridTypes.tsx +7 -7
  125. package/src/components/Grid/SimpleGrid.stories.mdx +34 -6
  126. package/src/components/Grid/SimpleGrid.test.tsx +9 -0
  127. package/src/components/Grid/SimpleGrid.tsx +29 -20
  128. package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +16 -1
  129. package/src/components/Heading/Heading.stories.mdx +36 -3
  130. package/src/components/Heading/Heading.test.tsx +10 -0
  131. package/src/components/Heading/Heading.tsx +56 -50
  132. package/src/components/Heading/__snapshots__/Heading.test.tsx.snap +26 -7
  133. package/src/components/HelperErrorText/HelperErrorText.stories.mdx +64 -42
  134. package/src/components/HelperErrorText/HelperErrorText.test.tsx +15 -0
  135. package/src/components/HelperErrorText/HelperErrorText.tsx +40 -35
  136. package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +35 -4
  137. package/src/components/Hero/Hero.stories.mdx +125 -95
  138. package/src/components/Hero/Hero.test.tsx +33 -0
  139. package/src/components/Hero/Hero.tsx +135 -126
  140. package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +89 -17
  141. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +26 -4
  142. package/src/components/HorizontalRule/HorizontalRule.test.tsx +9 -19
  143. package/src/components/HorizontalRule/HorizontalRule.tsx +9 -26
  144. package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +18 -5
  145. package/src/components/Icons/Icon.stories.mdx +31 -6
  146. package/src/components/Icons/Icon.test.tsx +38 -0
  147. package/src/components/Icons/Icon.tsx +93 -76
  148. package/src/components/Icons/__snapshots__/Icon.test.tsx.snap +129 -0
  149. package/src/components/Image/Image.stories.mdx +29 -5
  150. package/src/components/Image/Image.test.tsx +8 -0
  151. package/src/components/Image/Image.tsx +38 -26
  152. package/src/components/Image/__snapshots__/Image.test.tsx.snap +24 -8
  153. package/src/components/Label/Label.stories.mdx +42 -20
  154. package/src/components/Label/Label.test.tsx +42 -17
  155. package/src/components/Label/Label.tsx +22 -13
  156. package/src/components/Label/__snapshots__/Label.test.tsx.snap +19 -15
  157. package/src/components/Link/Link.stories.mdx +25 -1
  158. package/src/components/Link/Link.test.tsx +21 -0
  159. package/src/components/Link/Link.tsx +8 -8
  160. package/src/components/Link/__snapshots__/Link.test.tsx.snap +37 -11
  161. package/src/components/List/List.stories.mdx +75 -40
  162. package/src/components/List/List.test.tsx +67 -19
  163. package/src/components/List/List.tsx +38 -25
  164. package/src/components/List/ListTypes.tsx +1 -1
  165. package/src/components/List/__snapshots__/List.test.tsx.snap +110 -8
  166. package/src/components/Logo/Logo.stories.mdx +30 -6
  167. package/src/components/Logo/Logo.test.tsx +17 -0
  168. package/src/components/Logo/Logo.tsx +18 -6
  169. package/src/components/Logo/LogoSvgs.tsx +4 -0
  170. package/src/components/Logo/LogoTypes.tsx +2 -0
  171. package/src/components/Logo/__snapshots__/Logo.test.tsx.snap +73 -2
  172. package/src/components/Modal/Modal.stories.mdx +13 -0
  173. package/src/components/Notification/Notification.stories.mdx +25 -1
  174. package/src/components/Notification/Notification.test.tsx +23 -0
  175. package/src/components/Notification/Notification.tsx +46 -44
  176. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +158 -29
  177. package/src/components/Pagination/Pagination.stories.mdx +24 -4
  178. package/src/components/Pagination/Pagination.test.tsx +25 -0
  179. package/src/components/Pagination/Pagination.tsx +6 -6
  180. package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +244 -27
  181. package/src/components/Placeholder/Placeholder.tsx +3 -1
  182. package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +76 -10
  183. package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +81 -11
  184. package/src/components/ProgressIndicator/ProgressIndicator.tsx +17 -9
  185. package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +101 -14
  186. package/src/components/Radio/Radio.stories.mdx +64 -12
  187. package/src/components/Radio/Radio.test.tsx +28 -8
  188. package/src/components/Radio/Radio.tsx +66 -63
  189. package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +103 -6
  190. package/src/components/RadioGroup/RadioGroup.stories.mdx +224 -89
  191. package/src/components/RadioGroup/RadioGroup.test.tsx +122 -62
  192. package/src/components/RadioGroup/RadioGroup.tsx +106 -100
  193. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +1236 -1020
  194. package/src/components/SearchBar/SearchBar.stories.mdx +101 -36
  195. package/src/components/SearchBar/{SearchBar.Test.tsx → SearchBar.test.tsx} +46 -4
  196. package/src/components/SearchBar/SearchBar.tsx +17 -8
  197. package/src/components/SearchBar/__snapshots__/SearchBar.test.tsx.snap +1039 -0
  198. package/src/components/Select/Select.stories.mdx +128 -49
  199. package/src/components/Select/Select.test.tsx +63 -16
  200. package/src/components/Select/Select.tsx +125 -92
  201. package/src/components/Select/SelectTypes.tsx +5 -0
  202. package/src/components/Select/__snapshots__/Select.test.tsx.snap +749 -409
  203. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +42 -10
  204. package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +8 -0
  205. package/src/components/SkeletonLoader/SkeletonLoader.tsx +76 -72
  206. package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +169 -10
  207. package/src/components/Slider/Slider.stories.mdx +91 -42
  208. package/src/components/Slider/Slider.test.tsx +65 -17
  209. package/src/components/Slider/Slider.tsx +26 -19
  210. package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +403 -226
  211. package/src/components/StatusBadge/StatusBadge.stories.mdx +19 -1
  212. package/src/components/StatusBadge/StatusBadge.test.tsx +16 -0
  213. package/src/components/StatusBadge/StatusBadge.tsx +25 -20
  214. package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +22 -3
  215. package/src/components/StructuredContent/StructuredContent.stories.mdx +131 -12
  216. package/src/components/StructuredContent/StructuredContent.test.tsx +34 -0
  217. package/src/components/StructuredContent/StructuredContent.tsx +80 -75
  218. package/src/components/StructuredContent/__snapshots__/StructuredContent.test.tsx.snap +102 -17
  219. package/src/components/StyleGuide/Bidirectionality.stories.mdx +5 -5
  220. package/src/components/StyleGuide/Breakpoints.stories.mdx +6 -6
  221. package/src/components/StyleGuide/Buttons.stories.mdx +2 -12
  222. package/src/components/StyleGuide/ColorCard.tsx +1 -1
  223. package/src/components/StyleGuide/Colors.stories.mdx +1 -2
  224. package/src/components/StyleGuide/DesignTokens.stories.mdx +56 -26
  225. package/src/components/StyleGuide/Forms.stories.mdx +27 -12
  226. package/src/components/StyleGuide/Iconography.stories.mdx +2 -12
  227. package/src/components/StyleGuide/Spacing.stories.mdx +80 -41
  228. package/src/components/StyleGuide/Typography.stories.mdx +30 -21
  229. package/src/components/Table/Table.stories.mdx +38 -11
  230. package/src/components/Table/Table.test.tsx +15 -0
  231. package/src/components/Table/Table.tsx +7 -7
  232. package/src/components/Table/__snapshots__/Table.test.tsx.snap +408 -5
  233. package/src/components/Tabs/Tabs.stories.mdx +52 -3
  234. package/src/components/Tabs/Tabs.test.tsx +16 -0
  235. package/src/components/Tabs/Tabs.tsx +10 -6
  236. package/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap +394 -5
  237. package/src/components/Template/Template.stories.mdx +47 -43
  238. package/src/components/Template/Template.test.tsx +33 -0
  239. package/src/components/Template/Template.tsx +65 -60
  240. package/src/components/Template/__snapshots__/Template.test.tsx.snap +191 -20
  241. package/src/components/Text/Text.stories.mdx +20 -1
  242. package/src/components/Text/Text.test.tsx +12 -0
  243. package/src/components/Text/Text.tsx +6 -4
  244. package/src/components/Text/__snapshots__/Text.test.tsx.snap +21 -4
  245. package/src/components/TextInput/TextInput.stories.mdx +65 -19
  246. package/src/components/TextInput/TextInput.test.tsx +42 -28
  247. package/src/components/TextInput/TextInput.tsx +121 -113
  248. package/src/components/TextInput/__snapshots__/TextInput.test.tsx.snap +96 -73
  249. package/src/components/Toggle/Toggle.stories.mdx +80 -22
  250. package/src/components/Toggle/Toggle.test.tsx +27 -9
  251. package/src/components/Toggle/Toggle.tsx +22 -18
  252. package/src/components/Toggle/__snapshots__/Toggle.test.tsx.snap +128 -5
  253. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +52 -4
  254. package/src/components/VideoPlayer/VideoPlayer.test.tsx +23 -0
  255. package/src/components/VideoPlayer/VideoPlayer.tsx +133 -126
  256. package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +81 -39
  257. package/src/docs/Chakra.stories.mdx +50 -9
  258. package/src/docs/Welcome.stories.mdx +160 -41
  259. package/src/hooks/useCarouselStyles.stories.mdx +22 -2
  260. package/src/hooks/useCarouselStyles.ts +3 -2
  261. package/src/hooks/useNYPLTheme.stories.mdx +101 -0
  262. package/src/hooks/useNYPLTheme.ts +30 -6
  263. package/src/hooks/useWindowSize.stories.mdx +23 -0
  264. package/src/index.ts +4 -1
  265. package/src/styles/base/_place-holder.scss +1 -1
  266. package/src/theme/components/button.ts +15 -7
  267. package/src/theme/components/card.ts +30 -19
  268. package/src/theme/components/checkbox.ts +10 -8
  269. package/src/theme/components/checkboxGroup.ts +1 -1
  270. package/src/theme/components/componentWrapper.ts +2 -2
  271. package/src/theme/components/customTable.ts +39 -31
  272. package/src/theme/components/fieldset.ts +1 -2
  273. package/src/theme/components/global.ts +25 -20
  274. package/src/theme/components/heading.ts +1 -1
  275. package/src/theme/components/helperErrorText.ts +1 -0
  276. package/src/theme/components/hero.ts +13 -15
  277. package/src/theme/components/label.ts +4 -3
  278. package/src/theme/components/list.ts +73 -66
  279. package/src/theme/components/notification.ts +2 -2
  280. package/src/theme/components/radio.ts +9 -9
  281. package/src/theme/components/radioGroup.ts +1 -1
  282. package/src/theme/components/select.ts +35 -22
  283. package/src/theme/components/skeletonLoader.ts +3 -3
  284. package/src/theme/components/slider.ts +8 -7
  285. package/src/theme/components/statusBadge.ts +2 -2
  286. package/src/theme/components/structuredContent.ts +66 -1
  287. package/src/theme/components/tabs.ts +2 -2
  288. package/src/theme/components/template.ts +9 -9
  289. package/src/theme/components/textInput.ts +13 -12
  290. package/src/theme/components/toggle.ts +17 -10
  291. package/src/theme/components/videoPlayer.ts +1 -1
  292. package/src/theme/foundations/colors.ts +1 -1
  293. package/src/theme/foundations/radii.ts +1 -0
  294. package/src/theme/foundations/spacing.ts +70 -22
  295. package/src/theme/foundations/typography.ts +2 -2
  296. package/src/utils/componentCategories.ts +1 -2
  297. package/dist/components/SearchBar/SearchBar.Test.d.ts +0 -1
  298. package/dist/helpers/generateUUID.d.ts +0 -1
  299. package/src/helpers/generateUUID.tsx +0 -5
@@ -5,18 +5,22 @@ import { axe } from "jest-axe";
5
5
  import * as React from "react";
6
6
  import renderer from "react-test-renderer";
7
7
 
8
- import RadioGroup from "./RadioGroup";
9
8
  import Radio from "../Radio/Radio";
9
+ import RadioGroup from "./RadioGroup";
10
10
  import { LayoutTypes } from "../../helpers/enums";
11
11
 
12
12
  describe("Radio Accessibility", () => {
13
13
  it("passes axe accessibility with string labels", async () => {
14
14
  const { container } = render(
15
- <RadioGroup labelText="RadioGroup example" name="a11y-test">
16
- <Radio value="2" labelText="Radio 2" />
17
- <Radio value="3" labelText="Radio 3" />
18
- <Radio value="4" labelText="Radio 4" />
19
- <Radio value="5" labelText="Radio 5" />
15
+ <RadioGroup
16
+ id="radioGroup"
17
+ labelText="RadioGroup example"
18
+ name="a11y-test"
19
+ >
20
+ <Radio id="radio2" value="2" labelText="Radio 2" />
21
+ <Radio id="radio3" value="3" labelText="Radio 3" />
22
+ <Radio id="radio4" value="4" labelText="Radio 4" />
23
+ <Radio id="radio5" value="5" labelText="Radio 5" />
20
24
  </RadioGroup>
21
25
  );
22
26
  expect(await axe(container)).toHaveNoViolations();
@@ -24,7 +28,12 @@ describe("Radio Accessibility", () => {
24
28
 
25
29
  it("passes axe accessibility with jsx labels", async () => {
26
30
  const { container } = render(
27
- <RadioGroup labelText="RadioGroup example" name="a11y-test" isFullWidth>
31
+ <RadioGroup
32
+ id="radioGroup"
33
+ labelText="RadioGroup example"
34
+ name="a11y-test"
35
+ isFullWidth
36
+ >
28
37
  <Radio
29
38
  id="arts"
30
39
  labelText={
@@ -56,10 +65,10 @@ describe("Radio Accessibility", () => {
56
65
  describe("Radio Button", () => {
57
66
  it("renders with radio inputs and a label", () => {
58
67
  render(
59
- <RadioGroup labelText="Test Label" name="test1">
60
- <Radio value="2" labelText="Radio 2" />
61
- <Radio value="3" labelText="Radio 3" />
62
- <Radio value="4" labelText="Radio 4" />
68
+ <RadioGroup id="radioGroup" labelText="Test Label" name="test1">
69
+ <Radio id="radio2" value="2" labelText="Radio 2" />
70
+ <Radio id="radio3" value="3" labelText="Radio 3" />
71
+ <Radio id="radio4" value="4" labelText="Radio 4" />
63
72
  </RadioGroup>
64
73
  );
65
74
  expect(screen.getByText(/Test Label/i)).toBeInTheDocument();
@@ -71,10 +80,15 @@ describe("Radio Button", () => {
71
80
 
72
81
  it("renders with appropriate 'aria-label' attribute and value when 'showLabel' prop is set to false", () => {
73
82
  render(
74
- <RadioGroup labelText="Test Label" name="test2" showLabel={false}>
75
- <Radio value="2" labelText="Radio 2" />
76
- <Radio value="3" labelText="Radio 3" />
77
- <Radio value="4" labelText="Radio 4" />
83
+ <RadioGroup
84
+ id="radioGroup"
85
+ labelText="Test Label"
86
+ name="test2"
87
+ showLabel={false}
88
+ >
89
+ <Radio id="radio2" value="2" labelText="Radio 2" />
90
+ <Radio id="radio3" value="3" labelText="Radio 3" />
91
+ <Radio id="radio4" value="4" labelText="Radio 4" />
78
92
  </RadioGroup>
79
93
  );
80
94
  expect(screen.getByRole("radiogroup")).toHaveAttribute(
@@ -86,14 +100,15 @@ describe("Radio Button", () => {
86
100
  it("renders visible helper or error text", () => {
87
101
  const { rerender } = render(
88
102
  <RadioGroup
103
+ id="radioGroup"
89
104
  labelText="Test Label"
90
105
  name="test3"
91
106
  helperText="This is the helper text for the full group."
92
107
  invalidText="This is the error text :("
93
108
  >
94
- <Radio value="2" labelText="Radio 2" />
95
- <Radio value="3" labelText="Radio 3" />
96
- <Radio value="4" labelText="Radio 4" />
109
+ <Radio id="radio2" value="2" labelText="Radio 2" />
110
+ <Radio id="radio3" value="3" labelText="Radio 3" />
111
+ <Radio id="radio4" value="4" labelText="Radio 4" />
97
112
  </RadioGroup>
98
113
  );
99
114
  expect(
@@ -105,15 +120,16 @@ describe("Radio Button", () => {
105
120
 
106
121
  rerender(
107
122
  <RadioGroup
123
+ id="radioGroup"
108
124
  labelText="Test Label"
109
125
  name="test4"
110
126
  helperText="This is the helper text for the full group."
111
127
  invalidText="This is the error text :("
112
128
  isInvalid
113
129
  >
114
- <Radio value="2" labelText="Radio 2" />
115
- <Radio value="3" labelText="Radio 3" />
116
- <Radio value="4" labelText="Radio 4" />
130
+ <Radio id="radio2" value="2" labelText="Radio 2" />
131
+ <Radio id="radio3" value="3" labelText="Radio 3" />
132
+ <Radio id="radio4" value="4" labelText="Radio 4" />
117
133
  </RadioGroup>
118
134
  );
119
135
  expect(screen.getByText("This is the error text :(")).toBeVisible();
@@ -125,7 +141,7 @@ describe("Radio Button", () => {
125
141
  it("sets the RadioGroup's ID", () => {
126
142
  render(
127
143
  <RadioGroup labelText="Test Label" name="test5" id="some-id">
128
- <Radio value="2" labelText="Radio 2" />
144
+ <Radio id="radio2" value="2" labelText="Radio 2" />
129
145
  </RadioGroup>
130
146
  );
131
147
 
@@ -143,14 +159,15 @@ describe("Radio Button", () => {
143
159
  };
144
160
  render(
145
161
  <RadioGroup
162
+ id="radioGroup"
146
163
  labelText="Test Label"
147
164
  name="getValue"
148
165
  defaultValue="4"
149
166
  onChange={onChange}
150
167
  >
151
- <Radio value="2" labelText="Radio 2" />
152
- <Radio value="3" labelText="Radio 3" />
153
- <Radio value="4" labelText="Radio 4" />
168
+ <Radio id="radio2" value="2" labelText="Radio 2" />
169
+ <Radio id="radio3" value="3" labelText="Radio 3" />
170
+ <Radio id="radio4" value="4" labelText="Radio 4" />
154
171
  </RadioGroup>
155
172
  );
156
173
 
@@ -161,25 +178,17 @@ describe("Radio Button", () => {
161
178
  expect(newValue).toEqual("2");
162
179
  });
163
180
 
164
- // TODO: Figure out why this renders twice with two different calls
165
- // to the render function.
166
- // it("calls the UUID generation function if no id prop value is passed", () => {
167
- // const generateUUIDSpy = jest.spyOn(generateUUID, "default");
168
- // expect(generateUUIDSpy).toHaveBeenCalledTimes(0);
169
- // render(
170
- // <RadioGroup labelText="Test Label" name="test6">
171
- // <Radio value="2" labelText="Radio 2" id="radio2" />
172
- // </RadioGroup>
173
- // );
174
- // expect(generateUUIDSpy).toHaveBeenCalledTimes(1);
175
- // });
176
-
177
181
  it("sets the 'disabled' attribute for all its Radio children", () => {
178
182
  render(
179
- <RadioGroup labelText="Test Label" name="test7" isDisabled>
180
- <Radio value="2" labelText="Radio 2" />
181
- <Radio value="3" labelText="Radio 3" />
182
- <Radio value="4" labelText="Radio 4" />
183
+ <RadioGroup
184
+ id="radioGroup"
185
+ labelText="Test Label"
186
+ name="test7"
187
+ isDisabled
188
+ >
189
+ <Radio id="radio2" value="2" labelText="Radio 2" />
190
+ <Radio id="radio3" value="3" labelText="Radio 3" />
191
+ <Radio id="radio4" value="4" labelText="Radio 4" />
183
192
  </RadioGroup>
184
193
  );
185
194
  const radios = screen.getAllByRole("radio");
@@ -192,10 +201,15 @@ describe("Radio Button", () => {
192
201
 
193
202
  it("sets the 'required' attribute for all its Radio children", () => {
194
203
  render(
195
- <RadioGroup labelText="Test Label" name="test8" isRequired>
196
- <Radio value="2" labelText="Radio 2" />
197
- <Radio value="3" labelText="Radio 3" />
198
- <Radio value="4" labelText="Radio 4" />
204
+ <RadioGroup
205
+ id="radioGroup"
206
+ labelText="Test Label"
207
+ name="test8"
208
+ isRequired
209
+ >
210
+ <Radio id="radio2" value="2" labelText="Radio 2" />
211
+ <Radio id="radio3" value="3" labelText="Radio 3" />
212
+ <Radio id="radio4" value="4" labelText="Radio 4" />
199
213
  </RadioGroup>
200
214
  );
201
215
  const radios = screen.getAllByRole("radio");
@@ -212,14 +226,15 @@ describe("Radio Button", () => {
212
226
  it("sets the error state for all its Radio children", () => {
213
227
  render(
214
228
  <RadioGroup
229
+ id="radioGroup"
215
230
  labelText="Test Label"
216
231
  name="test9"
217
232
  isInvalid
218
233
  invalidText="There is an error :("
219
234
  >
220
- <Radio value="2" labelText="Radio 2" />
221
- <Radio value="3" labelText="Radio 3" />
222
- <Radio value="4" labelText="Radio 4" />
235
+ <Radio id="radio2" value="2" labelText="Radio 2" />
236
+ <Radio id="radio3" value="3" labelText="Radio 3" />
237
+ <Radio id="radio4" value="4" labelText="Radio 4" />
223
238
  </RadioGroup>
224
239
  );
225
240
  const radios = screen.getAllByRole("radio");
@@ -234,15 +249,16 @@ describe("Radio Button", () => {
234
249
  it("does not render the error text when 'showHelperInvalidText' is false", () => {
235
250
  render(
236
251
  <RadioGroup
252
+ id="radioGroup"
237
253
  labelText="Test Label"
238
254
  name="test10"
239
255
  isInvalid
240
256
  invalidText="There is an error :("
241
257
  showHelperInvalidText={false}
242
258
  >
243
- <Radio value="2" labelText="Radio 2" />
244
- <Radio value="3" labelText="Radio 3" />
245
- <Radio value="4" labelText="Radio 4" />
259
+ <Radio id="radio2" value="2" labelText="Radio 2" />
260
+ <Radio id="radio3" value="3" labelText="Radio 3" />
261
+ <Radio id="radio4" value="4" labelText="Radio 4" />
246
262
  </RadioGroup>
247
263
  );
248
264
  expect(screen.queryByText("There is an error :(")).not.toBeInTheDocument();
@@ -309,26 +325,27 @@ describe("Radio Button", () => {
309
325
  </RadioGroup>
310
326
  )
311
327
  .toJSON();
312
- const noOptReqLabel = renderer
328
+ const isRequired = renderer
313
329
  .create(
314
330
  <RadioGroup
315
- labelText="no optional or required label"
316
- name="optReq"
317
- id="optReq"
318
- optReqFlag={false}
331
+ labelText="required"
332
+ name="required"
333
+ id="required"
334
+ isRequired
319
335
  >
320
336
  <Radio value="2" labelText="Radio 2" id="radio-2" />
321
337
  <Radio value="3" labelText="Radio 3" id="radio-3" />
322
338
  </RadioGroup>
323
339
  )
324
340
  .toJSON();
325
- const isRequired = renderer
341
+ const noRequiredLabel = renderer
326
342
  .create(
327
343
  <RadioGroup
328
- labelText="required"
329
- name="required"
330
- id="required"
344
+ labelText="no optional or required label"
345
+ name="noRequiredLabel"
346
+ id="noRequiredLabel"
331
347
  isRequired
348
+ showRequiredLabel={false}
332
349
  >
333
350
  <Radio value="2" labelText="Radio 2" id="radio-2" />
334
351
  <Radio value="3" labelText="Radio 3" id="radio-3" />
@@ -389,17 +406,46 @@ describe("Radio Button", () => {
389
406
  </RadioGroup>
390
407
  )
391
408
  .toJSON();
409
+ const withChakraProps = renderer
410
+ .create(
411
+ <RadioGroup
412
+ labelText="chakra"
413
+ name="chakra"
414
+ id="chakra"
415
+ p="20px"
416
+ color="ui.error.primary"
417
+ >
418
+ <Radio value="2" labelText="Radio 2" id="radio-2" />
419
+ <Radio value="3" labelText="Radio 3" id="radio-3" />
420
+ </RadioGroup>
421
+ )
422
+ .toJSON();
423
+ const withOtherProps = renderer
424
+ .create(
425
+ <RadioGroup
426
+ labelText="props"
427
+ name="props"
428
+ id="props"
429
+ data-testid="props"
430
+ >
431
+ <Radio value="2" labelText="Radio 2" id="radio-2" />
432
+ <Radio value="3" labelText="Radio 3" id="radio-3" />
433
+ </RadioGroup>
434
+ )
435
+ .toJSON();
392
436
 
393
437
  expect(column).toMatchSnapshot();
394
438
  expect(row).toMatchSnapshot();
395
439
  expect(noLabel).toMatchSnapshot();
396
440
  expect(helperText).toMatchSnapshot();
397
441
  expect(invalidText).toMatchSnapshot();
398
- expect(noOptReqLabel).toMatchSnapshot();
442
+ expect(noRequiredLabel).toMatchSnapshot();
399
443
  expect(isRequired).toMatchSnapshot();
400
444
  expect(isInvalid).toMatchSnapshot();
401
445
  expect(isDisabled).toMatchSnapshot();
402
446
  expect(withJSXRadioLabels).toMatchSnapshot();
447
+ expect(withChakraProps).toMatchSnapshot();
448
+ expect(withOtherProps).toMatchSnapshot();
403
449
  });
404
450
 
405
451
  it("should throw warning when a non-Radio component is used as a child", () => {
@@ -414,4 +460,18 @@ describe("Radio Button", () => {
414
460
  "the `RadioGroup` component."
415
461
  );
416
462
  });
463
+
464
+ it("logs a warning when there is no `id` passed", () => {
465
+ const warn = jest.spyOn(console, "warn");
466
+ render(
467
+ // @ts-ignore: Typescript complains when a required prop is not passed, but
468
+ // here we don't want to pass the required prop to make sure the warning appears.
469
+ <RadioGroup labelText="RadioGroup example" name="a11y-test">
470
+ <Radio id="radio1" value="1" labelText="Radio 1" />
471
+ </RadioGroup>
472
+ );
473
+ expect(warn).toHaveBeenCalledWith(
474
+ "NYPL Reservoir RadioGroup: This component's required `id` prop was not passed."
475
+ );
476
+ });
417
477
  });
@@ -1,8 +1,8 @@
1
1
  import {
2
- Box,
2
+ chakra,
3
+ RadioGroup as ChakraRadioGroup,
3
4
  Stack,
4
5
  useMultiStyleConfig,
5
- useRadioGroup,
6
6
  } from "@chakra-ui/react";
7
7
  import * as React from "react";
8
8
 
@@ -13,8 +13,6 @@ import HelperErrorText, {
13
13
  import { spacing } from "../../theme/foundations/spacing";
14
14
  import Radio from "../Radio/Radio";
15
15
  import { LayoutTypes } from "../../helpers/enums";
16
- import generateUUID from "../../helpers/generateUUID";
17
-
18
16
  export interface RadioGroupProps {
19
17
  /** Additional class name. */
20
18
  className?: string;
@@ -23,7 +21,7 @@ export interface RadioGroupProps {
23
21
  /** Optional string to populate the HelperErrorText for standard state */
24
22
  helperText?: HelperErrorTextType;
25
23
  /** ID that other components can cross reference for accessibility purposes */
26
- id?: string;
24
+ id: string;
27
25
  /** Optional string to populate the HelperErrorText for error state */
28
26
  invalidText?: HelperErrorTextType;
29
27
  /** Adds the 'disabled' prop to the input when true. */
@@ -44,117 +42,125 @@ export interface RadioGroupProps {
44
42
  name: string;
45
43
  /** The action to perform on the `<input>`'s onChange function */
46
44
  onChange?: (value: string) => void;
47
- /** Whether or not to display "Required"/"Optional" in the label text. */
48
- optReqFlag?: boolean;
49
45
  /** Offers the ability to hide the helper/invalid text. */
50
46
  showHelperInvalidText?: boolean;
51
47
  /** Offers the ability to show the group's legend onscreen or hide it. Refer
52
48
  * to the `labelText` property for more information. */
53
49
  showLabel?: boolean;
50
+ /** Whether or not to display the "(Required)" text in the label text.
51
+ * True by default. */
52
+ showRequiredLabel?: boolean;
54
53
  }
55
54
 
56
55
  const noop = () => {};
57
- export const onChangeDefault = () => {
58
- return;
59
- };
60
-
61
- const RadioGroup = React.forwardRef<
62
- HTMLInputElement,
63
- React.PropsWithChildren<RadioGroupProps>
64
- >((props, ref?) => {
65
- const {
66
- children,
67
- className = "",
68
- defaultValue,
69
- helperText,
70
- id = generateUUID(),
71
- invalidText,
72
- isDisabled = false,
73
- isFullWidth = false,
74
- isInvalid = false,
75
- isRequired = false,
76
- labelText,
77
- layout = LayoutTypes.Column,
78
- name,
79
- onChange = onChangeDefault,
80
- optReqFlag = true,
81
- showHelperInvalidText = true,
82
- showLabel = true,
83
- } = props;
84
- const footnote: HelperErrorTextType = isInvalid ? invalidText : helperText;
85
- const spacingProp = layout === LayoutTypes.Column ? spacing.s : spacing.l;
86
- const newChildren = [];
87
56
 
88
- // Use Chakra's RadioGroup hook to set and get the proper props
89
- // or the custom components.
90
- const { getRootProps, getRadioProps } = useRadioGroup({
91
- name,
92
- defaultValue,
93
- onChange,
94
- });
95
- const radioGroupProps = getRootProps();
57
+ /**
58
+ * RadioGroup is a wrapper for DS `Radio` components that renders as a fieldset
59
+ * HTML element along with optional helper text. The `name` prop is essential
60
+ * for this form group element and is not needed for individual DS `Radio`
61
+ * components when `RadioGroup` is used.
62
+ */
63
+ export const RadioGroup = chakra(
64
+ React.forwardRef<HTMLInputElement, React.PropsWithChildren<RadioGroupProps>>(
65
+ (props, ref?) => {
66
+ const {
67
+ children,
68
+ className = "",
69
+ defaultValue,
70
+ helperText,
71
+ id,
72
+ invalidText,
73
+ isDisabled = false,
74
+ isFullWidth = false,
75
+ isInvalid = false,
76
+ isRequired = false,
77
+ labelText,
78
+ layout = LayoutTypes.Column,
79
+ name,
80
+ onChange,
81
+ showHelperInvalidText = true,
82
+ showLabel = true,
83
+ showRequiredLabel = true,
84
+ ...rest
85
+ } = props;
86
+ const [value, setValue] = React.useState(defaultValue);
87
+ const footnote: HelperErrorTextType = isInvalid
88
+ ? invalidText
89
+ : helperText;
90
+ const spacingProp = layout === LayoutTypes.Column ? spacing.s : spacing.l;
91
+ const newChildren: JSX.Element[] = [];
92
+ // Get the Chakra-based styles for the custom elements in this component.
93
+ const styles = useMultiStyleConfig("RadioGroup", { isFullWidth });
94
+ // Props for the `ChakraRadioGroup` component.
95
+ const radioGroupProps = {
96
+ "aria-label": !showLabel ? labelText : undefined,
97
+ name,
98
+ onChange: (selected: string) => {
99
+ setValue(selected);
100
+ onChange && onChange(selected);
101
+ },
102
+ ref,
103
+ value,
104
+ };
96
105
 
97
- // Go through the Radio children and update them as needed.
98
- React.Children.map(children, (child: React.ReactElement, i) => {
99
- if (child.type !== Radio) {
100
- // Special case for Storybook MDX documentation.
101
- if (child.props.mdxType && child.props.mdxType === "Radio") {
102
- noop();
103
- } else {
106
+ if (!id) {
104
107
  console.warn(
105
- "NYPL Reservoir RadioGroup: Only `Radio` components are allowed " +
106
- "inside the `RadioGroup` component."
108
+ "NYPL Reservoir RadioGroup: This component's required `id` prop was not passed."
107
109
  );
108
110
  }
109
- }
110
111
 
111
- const chakraRadioProps = getRadioProps({
112
- value: child.props.value,
113
- } as any);
112
+ // Go through the Radio children and update them as needed.
113
+ React.Children.map(children, (child: React.ReactElement, key) => {
114
+ if (child?.type !== Radio) {
115
+ // Special case for Storybook MDX documentation.
116
+ if (child.props?.mdxType && child.props?.mdxType === "Radio") {
117
+ noop();
118
+ } else {
119
+ console.warn(
120
+ "NYPL Reservoir RadioGroup: Only `Radio` components are allowed " +
121
+ "inside the `RadioGroup` component."
122
+ );
123
+ }
124
+ }
114
125
 
115
- if (child !== undefined && child !== null) {
116
- const newProps = { key: i, isDisabled, isInvalid, isRequired };
117
- if (child.props.value === defaultValue) {
118
- newProps["checked"] = true;
119
- }
120
- newChildren.push(
121
- React.cloneElement(child, { ...newProps, ...chakraRadioProps })
126
+ if (child !== undefined && child !== null) {
127
+ const newProps = {
128
+ key,
129
+ isDisabled,
130
+ isInvalid,
131
+ isRequired,
132
+ };
133
+ newChildren.push(React.cloneElement(child, newProps));
134
+ }
135
+ });
136
+
137
+ return (
138
+ <Fieldset
139
+ className={className}
140
+ id={`radio-group-${id}`}
141
+ isLegendHidden={!showLabel}
142
+ isRequired={isRequired}
143
+ legendText={labelText}
144
+ showRequiredLabel={showRequiredLabel}
145
+ {...rest}
146
+ >
147
+ <ChakraRadioGroup {...radioGroupProps}>
148
+ <Stack direction={[layout]} spacing={spacingProp} sx={styles.stack}>
149
+ {newChildren}
150
+ </Stack>
151
+ </ChakraRadioGroup>
152
+ {footnote && showHelperInvalidText && (
153
+ <HelperErrorText
154
+ additionalStyles={styles.helperErrorText}
155
+ id={`${id}-helperErrorText`}
156
+ isInvalid={isInvalid}
157
+ text={footnote}
158
+ />
159
+ )}
160
+ </Fieldset>
122
161
  );
123
162
  }
124
- });
125
-
126
- // Get the Chakra-based styles for the custom elements in this component.
127
- const styles = useMultiStyleConfig("RadioGroup", { isFullWidth });
128
-
129
- return (
130
- <Fieldset
131
- className={className}
132
- id={`radio-group-${id}`}
133
- isLegendHidden={!showLabel}
134
- legendText={labelText}
135
- optReqFlag={optReqFlag}
136
- >
137
- <Stack
138
- aria-label={!showLabel ? labelText : null}
139
- direction={[layout]}
140
- spacing={spacingProp}
141
- ref={ref}
142
- {...radioGroupProps}
143
- sx={styles.stack}
144
- >
145
- {newChildren}
146
- </Stack>
147
- {footnote && showHelperInvalidText && (
148
- <Box __css={styles.helper}>
149
- <HelperErrorText
150
- id={`${id}-helperErrorText`}
151
- isInvalid={isInvalid}
152
- text={footnote}
153
- />
154
- </Box>
155
- )}
156
- </Fieldset>
157
- );
158
- });
163
+ )
164
+ );
159
165
 
160
166
  export default RadioGroup;