@nypl/design-system-react-components 0.25.0 → 0.25.4

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 (392) hide show
  1. package/CHANGELOG.md +142 -1
  2. package/README.md +98 -50
  3. package/dist/components/Accordion/Accordion.d.ts +14 -14
  4. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +15 -14
  5. package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +6 -0
  6. package/dist/components/Button/Button.d.ts +13 -8
  7. package/dist/components/Button/ButtonTypes.d.ts +3 -1
  8. package/dist/components/Card/Card.d.ts +36 -52
  9. package/dist/components/Card/CardTypes.d.ts +2 -17
  10. package/dist/components/Checkbox/Checkbox.d.ts +17 -13
  11. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +45 -0
  12. package/dist/components/CheckboxGroup/CheckboxGroupLayoutTypes.d.ts +4 -0
  13. package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +15 -0
  14. package/dist/components/DatePicker/DatePicker.d.ts +37 -35
  15. package/dist/components/Fieldset/Fieldset.d.ts +25 -0
  16. package/dist/components/Form/Form.d.ts +13 -8
  17. package/dist/components/Form/FormTypes.d.ts +2 -8
  18. package/dist/components/Grid/GridTypes.d.ts +9 -0
  19. package/dist/components/Grid/SimpleGrid.d.ts +14 -0
  20. package/dist/components/Heading/Heading.d.ts +4 -4
  21. package/dist/components/HelperErrorText/HelperErrorText.d.ts +17 -14
  22. package/dist/components/Hero/Hero.d.ts +19 -14
  23. package/dist/components/Hero/HeroTypes.d.ts +10 -5
  24. package/dist/components/HorizontalRule/HorizontalRule.d.ts +10 -9
  25. package/dist/components/Icons/Icon.d.ts +19 -14
  26. package/dist/components/Icons/IconSvgs.d.ts +11 -0
  27. package/dist/components/Icons/IconTypes.d.ts +89 -64
  28. package/dist/components/Image/Image.d.ts +19 -9
  29. package/dist/components/Image/ImageTypes.d.ts +20 -0
  30. package/dist/components/Label/Label.d.ts +5 -17
  31. package/dist/components/Link/Link.d.ts +12 -12
  32. package/dist/components/List/List.d.ts +19 -14
  33. package/dist/components/Notification/Notification.d.ts +37 -16
  34. package/dist/components/Pagination/Pagination.d.ts +16 -13
  35. package/dist/components/Pagination/Pagination.stories.d.ts +2 -0
  36. package/dist/components/ProgressIndicator/ProgressIndicator.d.ts +29 -0
  37. package/dist/components/ProgressIndicator/ProgressIndicatorTypes.d.ts +8 -0
  38. package/dist/components/Radio/Radio.d.ts +2 -0
  39. package/dist/components/RadioGroup/RadioGroup.d.ts +4 -2
  40. package/dist/components/SearchBar/SearchBar.d.ts +45 -27
  41. package/dist/components/Select/Select.d.ts +34 -35
  42. package/dist/components/Select/SelectTypes.d.ts +4 -0
  43. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +18 -14
  44. package/dist/components/SkeletonLoader/SkeletonLoaderTypes.d.ts +2 -2
  45. package/dist/components/Slider/Slider.d.ts +57 -0
  46. package/dist/components/StatusBadge/StatusBadge.d.ts +8 -6
  47. package/dist/components/StatusBadge/StatusBadgeTypes.d.ts +5 -0
  48. package/dist/components/StyleGuide/ColorCard.d.ts +12 -0
  49. package/dist/components/Tabs/Tabs.d.ts +1 -1
  50. package/dist/components/Template/Template.d.ts +91 -0
  51. package/dist/components/Text/Text.d.ts +16 -0
  52. package/dist/components/Text/TextTypes.d.ts +6 -0
  53. package/dist/components/TextInput/TextInput.d.ts +44 -31
  54. package/dist/components/TextInput/TextInputTypes.d.ts +5 -0
  55. package/dist/components/VideoPlayer/VideoPlayer.d.ts +6 -8
  56. package/dist/components/VideoPlayer/VideoPlayerTypes.d.ts +2 -2
  57. package/dist/design-system-react-components.cjs.development.js +6473 -2630
  58. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  59. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  60. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  61. package/dist/design-system-react-components.esm.js +6463 -2631
  62. package/dist/design-system-react-components.esm.js.map +1 -1
  63. package/dist/hooks/tests/useCarouselStyles.test.d.ts +1 -0
  64. package/dist/hooks/useCarouselStyles.d.ts +16 -0
  65. package/dist/hooks/useNYPLTheme.d.ts +54 -0
  66. package/dist/hooks/useWindowSize.d.ts +10 -0
  67. package/dist/index.d.ts +19 -7
  68. package/dist/resources.scss +180 -170
  69. package/dist/styles.css +1 -1
  70. package/dist/theme/components/accordion.d.ts +25 -0
  71. package/dist/theme/components/breadcrumb.d.ts +90 -0
  72. package/dist/theme/components/button.d.ts +39 -15
  73. package/dist/theme/components/card.d.ts +168 -0
  74. package/dist/theme/components/checkbox.d.ts +12 -8
  75. package/dist/theme/components/checkboxGroup.d.ts +12 -0
  76. package/dist/theme/components/componentWrapper.d.ts +11 -0
  77. package/dist/theme/components/datePicker.d.ts +16 -0
  78. package/dist/theme/components/fieldset.d.ts +27 -0
  79. package/dist/theme/components/global.d.ts +65 -0
  80. package/dist/theme/components/globalMixins.d.ts +23 -0
  81. package/dist/theme/components/heading.d.ts +55 -20
  82. package/dist/theme/components/helperErrorText.d.ts +10 -0
  83. package/dist/theme/components/hero.d.ts +493 -0
  84. package/dist/theme/components/horizontalRule.d.ts +14 -0
  85. package/dist/theme/components/icon.d.ts +13 -0
  86. package/dist/theme/components/image.d.ts +31 -0
  87. package/dist/theme/components/label.d.ts +18 -0
  88. package/dist/theme/components/link.d.ts +49 -0
  89. package/dist/theme/components/list.d.ts +89 -0
  90. package/dist/theme/components/notification.d.ts +75 -0
  91. package/dist/theme/components/pagination.d.ts +19 -0
  92. package/dist/theme/components/progressIndicator.d.ts +50 -0
  93. package/dist/theme/components/radio.d.ts +8 -7
  94. package/dist/theme/components/radioGroup.d.ts +12 -0
  95. package/dist/theme/components/searchBar.d.ts +20 -0
  96. package/dist/theme/components/select.d.ts +67 -0
  97. package/dist/theme/components/skeletonLoader.d.ts +98 -0
  98. package/dist/theme/components/slider.d.ts +51 -0
  99. package/dist/theme/components/statusBadge.d.ts +25 -0
  100. package/dist/theme/components/tabs.d.ts +63 -12
  101. package/dist/theme/components/template.d.ts +105 -0
  102. package/dist/theme/components/text.d.ts +20 -0
  103. package/dist/theme/components/textInput.d.ts +112 -0
  104. package/dist/theme/components/videoPlayer.d.ts +40 -0
  105. package/dist/theme/foundations/breakpoints.d.ts +8 -8
  106. package/dist/theme/foundations/global.d.ts +8 -0
  107. package/dist/theme/foundations/radii.d.ts +5 -0
  108. package/dist/theme/foundations/shadows.d.ts +4 -0
  109. package/dist/theme/foundations/spacing.d.ts +16 -16
  110. package/dist/utils/utils.d.ts +6 -0
  111. package/package.json +72 -82
  112. package/src/__tests__/setup.ts +2 -2
  113. package/src/components/Accordion/Accordion.stories.mdx +223 -34
  114. package/src/components/Accordion/Accordion.test.tsx +135 -19
  115. package/src/components/Accordion/Accordion.tsx +81 -56
  116. package/src/components/Autosuggest/Autosuggest.stories.mdx +4 -4
  117. package/src/components/Autosuggest/Autosuggest.stories.tsx +3 -2
  118. package/src/components/Autosuggest/_Autosuggest.scss +5 -5
  119. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +48 -50
  120. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +54 -25
  121. package/src/components/Breadcrumbs/Breadcrumbs.tsx +75 -73
  122. package/src/components/Breadcrumbs/BreadcrumbsTypes.tsx +6 -0
  123. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +298 -0
  124. package/src/components/Button/Button.stories.mdx +45 -36
  125. package/src/components/Button/Button.test.tsx +37 -11
  126. package/src/components/Button/Button.tsx +22 -34
  127. package/src/components/Button/ButtonTypes.tsx +2 -0
  128. package/src/components/Button/__snapshots__/Button.test.tsx.snap +50 -8
  129. package/src/components/Card/Card.stories.mdx +314 -273
  130. package/src/components/Card/Card.test.tsx +157 -91
  131. package/src/components/Card/Card.tsx +195 -145
  132. package/src/components/Card/CardTypes.tsx +2 -19
  133. package/src/components/Card/__snapshots__/Card.test.tsx.snap +410 -0
  134. package/src/components/CardEdition/CardEdition.stories.tsx +26 -53
  135. package/src/components/CardEdition/CardEdition.test.tsx +23 -31
  136. package/src/components/CardEdition/_CardEdition.scss +22 -23
  137. package/src/components/Chakra/Box.stories.mdx +15 -16
  138. package/src/components/Chakra/Center.stories.mdx +56 -24
  139. package/src/components/Chakra/Grid.stories.mdx +92 -0
  140. package/src/components/Chakra/Stack.stories.mdx +38 -21
  141. package/src/components/Checkbox/Checkbox.stories.mdx +33 -11
  142. package/src/components/Checkbox/Checkbox.test.tsx +47 -2
  143. package/src/components/Checkbox/Checkbox.tsx +44 -41
  144. package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +92 -7
  145. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +329 -0
  146. package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +372 -0
  147. package/src/components/CheckboxGroup/CheckboxGroup.tsx +152 -0
  148. package/src/components/CheckboxGroup/CheckboxGroupLayoutTypes.tsx +4 -0
  149. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +1326 -0
  150. package/src/components/ComponentWrapper/ComponentWrapper.tsx +63 -0
  151. package/src/components/DatePicker/DatePicker.stories.mdx +163 -62
  152. package/src/components/DatePicker/DatePicker.test.tsx +264 -64
  153. package/src/components/DatePicker/DatePicker.tsx +165 -134
  154. package/src/components/DatePicker/_DatePicker.scss +33 -66
  155. package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +818 -0
  156. package/src/components/Fieldset/Fieldset.stories.mdx +55 -0
  157. package/src/components/Fieldset/Fieldset.test.tsx +125 -0
  158. package/src/components/Fieldset/Fieldset.tsx +52 -0
  159. package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +68 -0
  160. package/src/components/Form/Form.stories.mdx +70 -27
  161. package/src/components/Form/Form.test.tsx +58 -45
  162. package/src/components/Form/Form.tsx +50 -21
  163. package/src/components/Form/FormTypes.tsx +3 -8
  164. package/src/components/Form/__snapshots__/Form.test.tsx.snap +24 -14
  165. package/src/components/Grid/GridTypes.tsx +9 -0
  166. package/src/components/Grid/SimpleGrid.stories.mdx +268 -0
  167. package/src/components/Grid/SimpleGrid.test.tsx +66 -0
  168. package/src/components/Grid/SimpleGrid.tsx +37 -0
  169. package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +8 -0
  170. package/src/components/Heading/Heading.stories.mdx +3 -3
  171. package/src/components/Heading/Heading.tsx +12 -6
  172. package/src/components/HelperErrorText/HelperErrorText.stories.mdx +124 -0
  173. package/src/components/HelperErrorText/HelperErrorText.test.tsx +39 -44
  174. package/src/components/HelperErrorText/HelperErrorText.tsx +37 -39
  175. package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +25 -0
  176. package/src/components/Hero/Hero.stories.mdx +198 -121
  177. package/src/components/Hero/Hero.test.tsx +537 -107
  178. package/src/components/Hero/Hero.tsx +79 -92
  179. package/src/components/Hero/HeroTypes.tsx +18 -5
  180. package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +307 -0
  181. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +8 -6
  182. package/src/components/HorizontalRule/HorizontalRule.test.tsx +33 -28
  183. package/src/components/HorizontalRule/HorizontalRule.tsx +27 -29
  184. package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +27 -9
  185. package/src/components/Icons/Icon.stories.mdx +94 -77
  186. package/src/components/Icons/Icon.test.tsx +48 -22
  187. package/src/components/Icons/Icon.tsx +78 -61
  188. package/src/components/Icons/IconSvgs.tsx +22 -0
  189. package/src/components/Icons/IconTypes.tsx +91 -64
  190. package/src/components/Image/Image.stories.mdx +220 -0
  191. package/src/components/Image/Image.test.tsx +131 -29
  192. package/src/components/Image/Image.tsx +84 -56
  193. package/src/components/Image/ImageTypes.ts +22 -0
  194. package/src/components/Image/__snapshots__/Image.test.tsx.snap +190 -0
  195. package/src/components/Input/Input.stories.tsx +23 -67
  196. package/src/components/Input/Input.test.tsx +4 -4
  197. package/src/components/Input/_Input.scss +23 -14
  198. package/src/components/Label/Label.stories.mdx +28 -7
  199. package/src/components/Label/Label.test.tsx +43 -12
  200. package/src/components/Label/Label.tsx +21 -34
  201. package/src/components/Label/__snapshots__/Label.test.tsx.snap +41 -0
  202. package/src/components/Link/Link.stories.mdx +41 -41
  203. package/src/components/Link/Link.test.tsx +33 -44
  204. package/src/components/Link/Link.tsx +117 -100
  205. package/src/components/List/List.stories.mdx +124 -51
  206. package/src/components/List/List.test.tsx +142 -63
  207. package/src/components/List/List.tsx +89 -93
  208. package/src/components/List/__snapshots__/List.test.tsx.snap +109 -0
  209. package/src/components/Modal/Modal.stories.mdx +3 -3
  210. package/src/components/Modal/_Modal.scss +2 -2
  211. package/src/components/Notification/Notification.stories.mdx +119 -111
  212. package/src/components/Notification/Notification.test.tsx +102 -126
  213. package/src/components/Notification/Notification.tsx +157 -161
  214. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +159 -8
  215. package/src/components/Pagination/Pagination.stories.mdx +26 -27
  216. package/src/components/Pagination/Pagination.stories.tsx +11 -16
  217. package/src/components/Pagination/Pagination.test.tsx +276 -140
  218. package/src/components/Pagination/Pagination.tsx +174 -154
  219. package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +285 -0
  220. package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +292 -0
  221. package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +225 -0
  222. package/src/components/ProgressIndicator/ProgressIndicator.tsx +126 -0
  223. package/src/components/ProgressIndicator/ProgressIndicatorTypes.ts +8 -0
  224. package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +357 -0
  225. package/src/components/Radio/Radio.test.tsx +20 -4
  226. package/src/components/Radio/Radio.tsx +6 -3
  227. package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +3 -0
  228. package/src/components/RadioGroup/RadioGroup.stories.mdx +4 -5
  229. package/src/components/RadioGroup/RadioGroup.test.tsx +24 -1
  230. package/src/components/RadioGroup/RadioGroup.tsx +21 -29
  231. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +42 -72
  232. package/src/components/SearchBar/SearchBar.Test.tsx +170 -16
  233. package/src/components/SearchBar/SearchBar.stories.mdx +294 -219
  234. package/src/components/SearchBar/SearchBar.tsx +161 -46
  235. package/src/components/Select/Select.stories.mdx +188 -170
  236. package/src/components/Select/Select.test.tsx +132 -375
  237. package/src/components/Select/Select.tsx +121 -165
  238. package/src/components/Select/SelectTypes.tsx +5 -0
  239. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +33 -76
  240. package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +97 -177
  241. package/src/components/SkeletonLoader/SkeletonLoader.tsx +75 -70
  242. package/src/components/SkeletonLoader/SkeletonLoaderTypes.tsx +2 -2
  243. package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +739 -0
  244. package/src/components/Slider/Slider.stories.mdx +529 -0
  245. package/src/components/Slider/Slider.test.tsx +653 -0
  246. package/src/components/Slider/Slider.tsx +303 -0
  247. package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +1946 -0
  248. package/src/components/StatusBadge/StatusBadge.stories.mdx +91 -0
  249. package/src/components/StatusBadge/StatusBadge.test.tsx +35 -7
  250. package/src/components/StatusBadge/StatusBadge.tsx +24 -25
  251. package/src/components/StatusBadge/StatusBadgeTypes.tsx +5 -0
  252. package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +28 -0
  253. package/src/components/StyleGuide/Bidirectionality.stories.mdx +17 -17
  254. package/src/components/StyleGuide/Breakpoints.stories.mdx +34 -10
  255. package/src/components/StyleGuide/Buttons.stories.mdx +102 -86
  256. package/src/components/StyleGuide/ColorCard.tsx +46 -0
  257. package/src/components/StyleGuide/Colors.stories.mdx +196 -0
  258. package/src/components/StyleGuide/DesignTokens.stories.mdx +170 -0
  259. package/src/components/StyleGuide/Forms.stories.mdx +9 -7
  260. package/src/components/StyleGuide/Iconography.stories.mdx +119 -127
  261. package/src/components/StyleGuide/Spacing.stories.mdx +31 -23
  262. package/src/components/StyleGuide/Typography.stories.mdx +202 -189
  263. package/src/components/StyleGuide/UIDocCard.tsx +1 -1
  264. package/src/components/Tabs/Tabs.stories.mdx +73 -11
  265. package/src/components/Tabs/Tabs.tsx +88 -67
  266. package/src/components/Template/Template.stories.mdx +572 -0
  267. package/src/components/Template/Template.test.tsx +124 -0
  268. package/src/components/Template/Template.tsx +226 -0
  269. package/src/components/Text/Text.stories.mdx +70 -0
  270. package/src/components/Text/Text.test.tsx +63 -0
  271. package/src/components/Text/Text.tsx +55 -0
  272. package/src/components/Text/TextTypes.tsx +6 -0
  273. package/src/components/Text/__snapshots__/Text.test.tsx.snap +33 -0
  274. package/src/components/TextInput/TextInput.stories.mdx +89 -90
  275. package/src/components/TextInput/TextInput.test.tsx +84 -85
  276. package/src/components/TextInput/TextInput.tsx +121 -95
  277. package/src/components/TextInput/TextInputTypes.tsx +8 -0
  278. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +17 -4
  279. package/src/components/VideoPlayer/VideoPlayer.test.tsx +54 -53
  280. package/src/components/VideoPlayer/VideoPlayer.tsx +50 -51
  281. package/src/components/VideoPlayer/VideoPlayerTypes.tsx +2 -2
  282. package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +91 -0
  283. package/src/docs/Chakra.stories.mdx +246 -65
  284. package/src/docs/Intro.stories.mdx +18 -13
  285. package/src/hooks/tests/useCarouselStyles.test.ts +140 -0
  286. package/src/hooks/tests/useNYPLTheme.test.tsx +36 -0
  287. package/src/hooks/useCarouselStyles.ts +34 -0
  288. package/src/hooks/useNYPLTheme.ts +67 -0
  289. package/src/hooks/useWindowSize.ts +40 -0
  290. package/src/index.ts +39 -16
  291. package/src/resources.scss +5 -5
  292. package/src/styles/base/{_02-breakpoints.scss → _01-breakpoints.scss} +9 -10
  293. package/src/styles/base/{_03-mixins.scss → _02-mixins.scss} +16 -5
  294. package/src/styles/base/_03-base.scss +25 -0
  295. package/src/styles/base/{_05-focus.scss → _04-focus.scss} +0 -15
  296. package/src/styles/base/_place-holder.scss +14 -3
  297. package/src/styles/{03-space → space}/_space-inline.scss +14 -14
  298. package/src/styles/{03-space → space}/_space-inset.scss +10 -10
  299. package/src/styles/space/_space-stack.scss +116 -0
  300. package/src/styles.scss +13 -62
  301. package/src/theme/components/accordion.ts +30 -0
  302. package/src/theme/components/breadcrumb.ts +77 -0
  303. package/src/theme/components/button.ts +91 -71
  304. package/src/theme/components/card.ts +174 -0
  305. package/src/theme/components/checkbox.ts +22 -29
  306. package/src/theme/components/checkboxGroup.ts +8 -0
  307. package/src/theme/components/componentWrapper.ts +10 -0
  308. package/src/theme/components/datePicker.ts +17 -0
  309. package/src/theme/components/fieldset.ts +18 -0
  310. package/src/theme/components/global.ts +82 -0
  311. package/src/theme/components/globalMixins.ts +24 -0
  312. package/src/theme/components/heading.ts +25 -13
  313. package/src/theme/components/helperErrorText.ts +9 -0
  314. package/src/theme/components/hero.ts +240 -0
  315. package/src/theme/components/horizontalRule.ts +13 -0
  316. package/src/theme/components/icon.ts +79 -0
  317. package/src/theme/components/image.ts +116 -0
  318. package/src/theme/components/label.ts +10 -0
  319. package/src/theme/components/link.ts +51 -0
  320. package/src/theme/components/list.ts +73 -0
  321. package/src/theme/components/notification.ts +93 -0
  322. package/src/theme/components/pagination.ts +20 -0
  323. package/src/theme/components/progressIndicator.ts +62 -0
  324. package/src/theme/components/radio.ts +22 -33
  325. package/src/theme/components/radioGroup.ts +8 -0
  326. package/src/theme/components/searchBar.ts +21 -0
  327. package/src/theme/components/select.ts +53 -0
  328. package/src/theme/components/skeletonLoader.ts +107 -0
  329. package/src/theme/components/slider.ts +79 -0
  330. package/src/theme/components/statusBadge.ts +26 -0
  331. package/src/theme/components/tabs.ts +102 -69
  332. package/src/theme/components/template.ts +114 -0
  333. package/src/theme/components/text.ts +31 -0
  334. package/src/theme/components/textInput.ts +62 -0
  335. package/src/theme/components/videoPlayer.ts +49 -0
  336. package/src/theme/foundations/breakpoints.ts +8 -8
  337. package/src/theme/foundations/colors.ts +29 -13
  338. package/src/theme/foundations/global.ts +8 -0
  339. package/src/theme/foundations/radii.ts +6 -0
  340. package/src/theme/foundations/shadows.ts +5 -0
  341. package/src/theme/foundations/spacing.ts +24 -24
  342. package/src/theme/index.ts +74 -13
  343. package/src/utils/componentCategories.ts +12 -5
  344. package/src/utils/utils.ts +13 -0
  345. package/dist/components/Accordion/Accordion.stories.d.ts +0 -6
  346. package/dist/components/HelperErrorText/HelperErrorText.stories.d.ts +0 -16
  347. package/dist/components/Image/Image.stories.d.ts +0 -18
  348. package/dist/components/List/List.stories.d.ts +0 -7
  349. package/dist/components/StatusBadge/StatusBadge.stories.d.ts +0 -8
  350. package/dist/components/StyleGuide/Colors.stories.d.ts +0 -25
  351. package/dist/components/Template/Template.stories.d.ts +0 -30
  352. package/dist/theme/components/customRadioGroup.d.ts +0 -17
  353. package/src/components/Accordion/Accordion.stories.tsx +0 -66
  354. package/src/components/Accordion/_Accordion.scss +0 -81
  355. package/src/components/Breadcrumbs/_Breadcrumbs.scss +0 -97
  356. package/src/components/Button/_Button.scss +0 -56
  357. package/src/components/Card/_Card.scss +0 -308
  358. package/src/components/Form/_Form.scss +0 -67
  359. package/src/components/HelperErrorText/HelperErrorText.stories.tsx +0 -48
  360. package/src/components/HelperErrorText/_HelperErrorText.scss +0 -9
  361. package/src/components/Hero/_Hero.scss +0 -256
  362. package/src/components/HorizontalRule/_HorizontalRule.scss +0 -15
  363. package/src/components/Icons/_Icons.scss +0 -116
  364. package/src/components/Image/Image.stories.tsx +0 -54
  365. package/src/components/Image/_Image.scss +0 -38
  366. package/src/components/Label/_Label.scss +0 -22
  367. package/src/components/Link/_Link.scss +0 -73
  368. package/src/components/List/List.stories.tsx +0 -139
  369. package/src/components/List/_List.scss +0 -76
  370. package/src/components/Notification/_Notification.scss +0 -110
  371. package/src/components/Pagination/_Pagination.scss +0 -40
  372. package/src/components/SearchBar/_SearchBar.scss +0 -16
  373. package/src/components/Select/_Select.scss +0 -82
  374. package/src/components/SkeletonLoader/_SkeletonLoader.scss +0 -142
  375. package/src/components/StatusBadge/StatusBadge.stories.tsx +0 -34
  376. package/src/components/StatusBadge/_StatusBadge.scss +0 -23
  377. package/src/components/StyleGuide/Colors.stories.tsx +0 -289
  378. package/src/components/Template/Template.stories.tsx +0 -86
  379. package/src/components/Template/_Template.scss +0 -63
  380. package/src/components/TextInput/_TextInput.scss +0 -59
  381. package/src/components/VideoPlayer/_VideoPlayer.scss +0 -38
  382. package/src/styles/01-colors/_colors-brand.scss +0 -56
  383. package/src/styles/01-colors/_colors-utility.scss +0 -65
  384. package/src/styles/02-typography/_type-scale.css +0 -11
  385. package/src/styles/02-typography/_type-weight.css +0 -7
  386. package/src/styles/02-typography/_typefaces.css +0 -4
  387. package/src/styles/03-space/_space-stack.scss +0 -116
  388. package/src/styles/03-space/_space.css +0 -30
  389. package/src/styles/base/_04-base.scss +0 -19
  390. package/src/styles/base/_card-grid.scss +0 -78
  391. package/src/styles/base/_typography.scss +0 -11
  392. package/src/theme/components/customRadioGroup.ts +0 -18
@@ -0,0 +1,329 @@
1
+ import {
2
+ Meta,
3
+ Story,
4
+ Canvas,
5
+ ArgsTable,
6
+ Description,
7
+ } from "@storybook/addon-docs/blocks";
8
+ import { withDesign } from "storybook-addon-designs";
9
+
10
+ import { getCategory } from "../../utils/componentCategories";
11
+ import DSProvider from "../../theme/provider";
12
+ import CheckboxGroup from "./CheckboxGroup";
13
+ import { CheckboxGroupLayoutTypes } from "./CheckboxGroupLayoutTypes";
14
+ import Checkbox from "../Checkbox/Checkbox";
15
+
16
+ <Meta
17
+ title={getCategory("CheckboxGroup")}
18
+ component={CheckboxGroup}
19
+ decorators={[withDesign]}
20
+ parameters={{
21
+ design: {
22
+ type: "figma",
23
+ url:
24
+ "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=11895%3A658",
25
+ },
26
+ jest: ["CheckboxGroup.test.tsx"],
27
+ }}
28
+ argTypes={{
29
+ children: { table: { disable: true } },
30
+ defaultValue: { table: { disable: true } },
31
+ id: { table: { disable: true } },
32
+ name: { table: { disable: true } },
33
+ onChange: { table: { disable: true } },
34
+ }}
35
+ />
36
+
37
+ # CheckboxGroup
38
+
39
+ | Component Version | DS Version |
40
+ | ----------------- | ---------- |
41
+ | Added | `0.25.1` |
42
+ | Latest | `0.25.3` |
43
+
44
+ <Description of={CheckboxGroup} />
45
+
46
+ <Canvas withToolbar>
47
+ <Story
48
+ name="CheckboxGroup"
49
+ args={{
50
+ defaultValue: ["4"],
51
+ helperText: "This is the helper text for the full group.",
52
+ invalidText: "This is the error text :(",
53
+ isDisabled: false,
54
+ isInvalid: false,
55
+ isRequired: false,
56
+ labelText: "Standard Checkbox Group",
57
+ layout: CheckboxGroupLayoutTypes.Column,
58
+ name: "checkbox-story",
59
+ optReqFlag: true,
60
+ showHelperInvalidText: true,
61
+ showLabel: true,
62
+ }}
63
+ >
64
+ {(args) => (
65
+ <CheckboxGroup {...args}>
66
+ <Checkbox value="2" labelText="Checkbox 2" />
67
+ <Checkbox value="3" labelText="Checkbox 3" />
68
+ <Checkbox value="4" labelText="Checkbox 4" />
69
+ <Checkbox value="5" labelText="Checkbox 5" />
70
+ </CheckboxGroup>
71
+ )}
72
+ </Story>
73
+ </Canvas>
74
+
75
+ <ArgsTable story="CheckboxGroup" />
76
+
77
+ ## Layout Patterns
78
+
79
+ Use the `layout` prop to set the `Checkbox` buttons to display in a column or in
80
+ a row.
81
+
82
+ <Canvas>
83
+ <DSProvider>
84
+ <CheckboxGroup
85
+ labelText="Column (default)"
86
+ name="column-example"
87
+ optReqFlag={false}
88
+ >
89
+ <Checkbox value="2" labelText="Checkbox 2" />
90
+ <Checkbox value="3" labelText="Checkbox 3" />
91
+ <Checkbox value="4" labelText="Checkbox 4" />
92
+ <Checkbox value="5" labelText="Checkbox 5" />
93
+ </CheckboxGroup>
94
+ <br />
95
+ <CheckboxGroup
96
+ labelText="Row"
97
+ name="row-example"
98
+ layout={CheckboxGroupLayoutTypes.Row}
99
+ optReqFlag={false}
100
+ >
101
+ <Checkbox value="2" labelText="Checkbox 2" />
102
+ <Checkbox value="3" labelText="Checkbox 3" />
103
+ <Checkbox value="4" labelText="Checkbox 4" />
104
+ <Checkbox value="5" labelText="Checkbox 5" />
105
+ </CheckboxGroup>
106
+ </DSProvider>
107
+ </Canvas>
108
+
109
+ ## Errored
110
+
111
+ <Canvas>
112
+ <DSProvider>
113
+ <CheckboxGroup
114
+ labelText="Errored Checkbox Group"
115
+ name="errored-example"
116
+ optReqFlag={false}
117
+ invalidText="Error message for the full group."
118
+ isInvalid
119
+ >
120
+ <Checkbox value="2" labelText="Checkbox 2" />
121
+ <Checkbox value="3" labelText="Checkbox 3" />
122
+ <Checkbox value="4" labelText="Checkbox 4" />
123
+ <Checkbox value="5" labelText="Checkbox 5" />
124
+ </CheckboxGroup>
125
+ </DSProvider>
126
+ </Canvas>
127
+
128
+ ## Disabled
129
+
130
+ <Canvas>
131
+ <DSProvider>
132
+ <CheckboxGroup
133
+ labelText="Disabled Checkbox Group"
134
+ name="disabled-example"
135
+ optReqFlag={false}
136
+ helperText="The reason for being disabled."
137
+ isDisabled
138
+ >
139
+ <Checkbox value="2" labelText="Checkbox 2" />
140
+ <Checkbox value="3" labelText="Checkbox 3" />
141
+ <Checkbox value="4" labelText="Checkbox 4" />
142
+ <Checkbox value="5" labelText="Checkbox 5" />
143
+ </CheckboxGroup>
144
+ </DSProvider>
145
+ </Canvas>
146
+
147
+ ## Indeterminate Example
148
+
149
+ The "indeterminate" state can be used when a group of checkboxes are not all
150
+ checked or unchecked. In the following example, if only one child checkebox is
151
+ checked, the parent checkbox will be in the "indeterminate" state. Once both
152
+ children are checked, the parent will be in the "checked" state.
153
+
154
+ The following working example can be used in your application to keep track of
155
+ the checked and indeterminate states - taken and modified from Chakra's
156
+ [Checkbox](https://chakra-ui.com/docs/form/checkbox#indeterminate) documentation.
157
+ Note that this example is specifically using NYPL DS `Checkbox` and
158
+ `CheckboxGroup` components.
159
+
160
+ ```tsx
161
+ export function IndeterminateExample() {
162
+ const [checkedItems, setCheckedItems] = React.useState([false, false]);
163
+ const allChecked = checkedItems.every(Boolean);
164
+ const isIndeterminate = checkedItems.some(Boolean) && !allChecked;
165
+ return (
166
+ <CheckboxGroup
167
+ labelText="Indeterminate Example"
168
+ name="indeterminate-example"
169
+ >
170
+ <Checkbox
171
+ isChecked={allChecked}
172
+ isIndeterminate={isIndeterminate}
173
+ onChange={(e) => setCheckedItems([e.target.checked, e.target.checked])}
174
+ labelText="Parent Checkbox"
175
+ />
176
+ <Checkbox
177
+ isChecked={checkedItems[0]}
178
+ onChange={(e) => setCheckedItems([e.target.checked, checkedItems[1]])}
179
+ labelText="Child Checkbox 1"
180
+ />
181
+ <Checkbox
182
+ isChecked={checkedItems[1]}
183
+ onChange={(e) => setCheckedItems([checkedItems[0], e.target.checked])}
184
+ labelText="Child Checkbox 2"
185
+ />
186
+ </CheckboxGroup>
187
+ );
188
+ }
189
+ ```
190
+
191
+ export function IndeterminateExample() {
192
+ const [checkedItems, setCheckedItems] = React.useState([false, false]);
193
+ const allChecked = checkedItems.every(Boolean);
194
+ const isIndeterminate = checkedItems.some(Boolean) && !allChecked;
195
+ return (
196
+ <CheckboxGroup
197
+ labelText="Indeterminate Example"
198
+ name="indeterminate-example"
199
+ >
200
+ <Checkbox
201
+ isChecked={allChecked}
202
+ isIndeterminate={isIndeterminate}
203
+ onChange={(e) => setCheckedItems([e.target.checked, e.target.checked])}
204
+ labelText="Parent Checkbox"
205
+ />
206
+ <Checkbox
207
+ isChecked={checkedItems[0]}
208
+ onChange={(e) => setCheckedItems([e.target.checked, checkedItems[1]])}
209
+ labelText="Child Checkbox 1"
210
+ />
211
+ <Checkbox
212
+ isChecked={checkedItems[1]}
213
+ onChange={(e) => setCheckedItems([checkedItems[0], e.target.checked])}
214
+ labelText="Child Checkbox 2"
215
+ />
216
+ </CheckboxGroup>
217
+ );
218
+ }
219
+
220
+ <Canvas>
221
+ <DSProvider>
222
+ <IndeterminateExample />
223
+ </DSProvider>
224
+ </Canvas>
225
+
226
+ ## Getting Checkbox Data Values
227
+
228
+ ### Controlled Component using `name`, `defaultValue`, and `onChange` props
229
+
230
+ If your application uses controlled React components and the DS CheckboxGroup
231
+ must be controlled, you can extract the data through the `name`, `defaultValue`,
232
+ and `onChange` props. The `onChange` function will be called every time a new
233
+ `Checkbox` value is checked or unchecked.
234
+
235
+ ```jsx
236
+ const onChange = (data: string[]) => {
237
+ // This will return the values selected as an array of strings.
238
+ // Ex: ["2", "4"]
239
+ console.log(data);
240
+ };
241
+ // ...
242
+
243
+ // Example of the DS CheckboxGroup instance with the function above:
244
+ <CheckboxGroup
245
+ id="controlled-example"
246
+ labelText="Checkbox Group"
247
+ name="CheckboxExample"
248
+ defaultValue={["2"]}
249
+ onChange={onChange}
250
+ >
251
+ <Checkbox value="2" labelText="Checkbox 2" />
252
+ <Checkbox value="3" labelText="Checkbox 3" />
253
+ <Checkbox value="4" labelText="Checkbox 4" />
254
+ </CheckboxGroup>;
255
+ ```
256
+
257
+ ### Uncontrolled Component using `ref`s
258
+
259
+ If your application uses uncontrolled components, you can pass React `ref` props
260
+ to the DS CheckboxGroup component to get the selected value from the DOM.
261
+
262
+ The following example is using the `register` React `ref` from the
263
+ `react-hook-form` package.
264
+
265
+ ```jsx
266
+ import { useFormContext, Controller } from "react-hook-form";
267
+ // ...
268
+ const { register, handleSubmit, control } = useFormContext();
269
+ // ...
270
+ const submitForm = (formData) => {
271
+ // This will return an object with all the DOM element values that were
272
+ // registered with a `name` attribute.
273
+ // {
274
+ // checkboxExample: ["3"]
275
+ // }
276
+ console.log(formData);
277
+ // ...
278
+ };
279
+
280
+ <form
281
+ onSubmit={handleSubmit(submitForm)}
282
+ method="post"
283
+ action="/some/api/endpoint"
284
+ >
285
+ <Controller
286
+ as={
287
+ <CheckboxGroup
288
+ id="uncontrolled-example"
289
+ labelText="Checkbox Group"
290
+ name="checkboxExample"
291
+ defaultValue={["3"]}
292
+ ref={register()}
293
+ >
294
+ <Checkbox value="2" labelText="Checkbox 2" />
295
+ <Checkbox value="3" labelText="Checkbox 3" />
296
+ <Checkbox value="4" labelText="Checkbox 4" />
297
+ </CheckboxGroup>
298
+ }
299
+ name="checkboxExample"
300
+ control={control}
301
+ />
302
+ </form>;
303
+ ```
304
+
305
+ The above is specific to `react-hook-form` but a similar pattern can be used
306
+ with normal React `ref` values.
307
+
308
+ ```jsx
309
+ const CheckboxGroupRef = React.createRef<HTMLInputElement>();
310
+ // ...
311
+ <CheckboxGroup
312
+ id="uncontrolled-example"
313
+ labelText="Checkbox Group"
314
+ name="checkboxExample"
315
+ defaultValue={["3"]}
316
+ ref={CheckboxGroupRef}
317
+ >
318
+ <Checkbox value="2" labelText="Checkbox 2" />
319
+ <Checkbox value="3" labelText="Checkbox 3" />
320
+ <Checkbox value="4" labelText="Checkbox 4" />
321
+ </CheckboxGroup>
322
+
323
+ // ...
324
+ // Get the value through:
325
+ const onSubmit = () => {
326
+ // ...
327
+ const CheckboxGroupValue = CheckboxGroupRef.current.value;
328
+ };
329
+ ```
@@ -0,0 +1,372 @@
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 * as generateUUID from "../../helpers/generateUUID";
7
+ import CheckboxGroup from "./CheckboxGroup";
8
+ import Checkbox from "../Checkbox/Checkbox";
9
+ import { CheckboxGroupLayoutTypes } from "./CheckboxGroupLayoutTypes";
10
+ import userEvent from "@testing-library/user-event";
11
+
12
+ describe("Checkbox Accessibility", () => {
13
+ it("passes axe accessibility", async () => {
14
+ const { container } = render(
15
+ <CheckboxGroup labelText="CheckboxGroup example" name="a11y-test">
16
+ <Checkbox value="2" labelText="Checkbox 2" />
17
+ <Checkbox value="3" labelText="Checkbox 3" />
18
+ <Checkbox value="4" labelText="Checkbox 4" />
19
+ <Checkbox value="5" labelText="Checkbox 5" />
20
+ </CheckboxGroup>
21
+ );
22
+ expect(await axe(container)).toHaveNoViolations();
23
+ });
24
+ });
25
+
26
+ describe("Checkbox", () => {
27
+ it("renders with Checkbox inputs and a label", () => {
28
+ render(
29
+ <CheckboxGroup labelText="Test Label" name="test1">
30
+ <Checkbox value="2" labelText="Checkbox 2" />
31
+ <Checkbox value="3" labelText="Checkbox 3" />
32
+ <Checkbox value="4" labelText="Checkbox 4" />
33
+ </CheckboxGroup>
34
+ );
35
+ expect(screen.getByText(/Test Label/i)).toBeInTheDocument();
36
+ expect(screen.getAllByRole("checkbox")).toHaveLength(3);
37
+ expect(screen.getByLabelText("Checkbox 2")).toBeInTheDocument();
38
+ expect(screen.getByLabelText("Checkbox 3")).toBeInTheDocument();
39
+ expect(screen.getByLabelText("Checkbox 4")).toBeInTheDocument();
40
+ });
41
+
42
+ it("renders with appropriate 'aria-label' attribute and value when 'showLabel' prop is set to false", () => {
43
+ const { rerender } = render(
44
+ <CheckboxGroup labelText="Test Label" name="test2">
45
+ <Checkbox value="2" labelText="Checkbox 2" />
46
+ <Checkbox value="3" labelText="Checkbox 3" />
47
+ <Checkbox value="4" labelText="Checkbox 4" />
48
+ </CheckboxGroup>
49
+ );
50
+ expect(screen.getByTestId("checkbox-group")).not.toHaveAttribute(
51
+ "aria-label",
52
+ "Test Label"
53
+ );
54
+
55
+ rerender(
56
+ <CheckboxGroup labelText="Test Label" name="test2" showLabel={false}>
57
+ <Checkbox value="2" labelText="Checkbox 2" />
58
+ <Checkbox value="3" labelText="Checkbox 3" />
59
+ <Checkbox value="4" labelText="Checkbox 4" />
60
+ </CheckboxGroup>
61
+ );
62
+ expect(screen.getByTestId("checkbox-group")).toHaveAttribute(
63
+ "aria-label",
64
+ "Test Label"
65
+ );
66
+ });
67
+
68
+ it("renders visible helper or error text", () => {
69
+ const { rerender } = render(
70
+ <CheckboxGroup
71
+ labelText="Test Label"
72
+ name="test3"
73
+ helperText="This is the helper text for the full group."
74
+ invalidText="This is the error text :("
75
+ >
76
+ <Checkbox value="2" labelText="Checkbox 2" />
77
+ <Checkbox value="3" labelText="Checkbox 3" />
78
+ <Checkbox value="4" labelText="Checkbox 4" />
79
+ </CheckboxGroup>
80
+ );
81
+ expect(
82
+ screen.getByText("This is the helper text for the full group.")
83
+ ).toBeVisible();
84
+ expect(
85
+ screen.queryByText("This is the error text :(")
86
+ ).not.toBeInTheDocument();
87
+
88
+ rerender(
89
+ <CheckboxGroup
90
+ labelText="Test Label"
91
+ name="test3"
92
+ helperText="This is the helper text for the full group."
93
+ invalidText="This is the error text :("
94
+ isInvalid
95
+ >
96
+ <Checkbox value="2" labelText="Checkbox 2" />
97
+ <Checkbox value="3" labelText="Checkbox 3" />
98
+ <Checkbox value="4" labelText="Checkbox 4" />
99
+ </CheckboxGroup>
100
+ );
101
+ expect(screen.getByText("This is the error text :(")).toBeVisible();
102
+ expect(
103
+ screen.queryByText("This is the helper text for the full group.")
104
+ ).not.toBeInTheDocument();
105
+ });
106
+
107
+ it("sets the CheckboxGroup's ID", () => {
108
+ render(
109
+ <CheckboxGroup labelText="Test Label" name="test5" id="some-id">
110
+ <Checkbox value="2" labelText="Checkbox 2" />
111
+ </CheckboxGroup>
112
+ );
113
+
114
+ // The "group" role here is for the `fieldset` element.
115
+ expect(screen.getByRole("group")).toHaveAttribute(
116
+ "id",
117
+ "some-id-checkbox-group"
118
+ );
119
+ });
120
+
121
+ it("sets the next value through the onChange function", () => {
122
+ let newValue = [];
123
+ const onChange = (value) => {
124
+ newValue = value;
125
+ };
126
+ render(
127
+ <CheckboxGroup
128
+ labelText="Test Label"
129
+ name="getValue"
130
+ defaultValue={["4"]}
131
+ onChange={onChange}
132
+ >
133
+ <Checkbox value="2" labelText="Checkbox 2" />
134
+ <Checkbox value="3" labelText="Checkbox 3" />
135
+ <Checkbox value="4" labelText="Checkbox 4" />
136
+ </CheckboxGroup>
137
+ );
138
+
139
+ expect(newValue).toEqual([]);
140
+
141
+ userEvent.click(screen.getByText("Checkbox 3"));
142
+ // "4" was the initial selected value
143
+ expect(newValue).toEqual(["4", "3"]);
144
+ userEvent.click(screen.getByText("Checkbox 2"));
145
+ expect(newValue).toEqual(["4", "3", "2"]);
146
+ userEvent.click(screen.getByText("Checkbox 3"));
147
+ expect(newValue).toEqual(["4", "2"]);
148
+ });
149
+
150
+ it("calls the UUID generation function if no id prop value is passed", () => {
151
+ const generateUUIDSpy = jest.spyOn(generateUUID, "default");
152
+ expect(generateUUIDSpy).toHaveBeenCalledTimes(0);
153
+ render(
154
+ <CheckboxGroup labelText="Test Label" name="test6">
155
+ <Checkbox value="2" labelText="Checkbox 2" />
156
+ </CheckboxGroup>
157
+ );
158
+ expect(generateUUIDSpy).toHaveBeenCalledTimes(1);
159
+ });
160
+
161
+ it("sets the 'disabled' attribute for all its Checkbox children", () => {
162
+ render(
163
+ <CheckboxGroup labelText="Test Label" name="test7" isDisabled>
164
+ <Checkbox value="2" labelText="Checkbox 2" />
165
+ <Checkbox value="3" labelText="Checkbox 3" />
166
+ <Checkbox value="4" labelText="Checkbox 4" />
167
+ </CheckboxGroup>
168
+ );
169
+ const Checkboxes = screen.getAllByRole("checkbox");
170
+
171
+ expect(Checkboxes).toHaveLength(3);
172
+ expect(Checkboxes[0]).toHaveAttribute("disabled");
173
+ expect(Checkboxes[1]).toHaveAttribute("disabled");
174
+ expect(Checkboxes[2]).toHaveAttribute("disabled");
175
+ });
176
+
177
+ it("sets the 'required' attribute for all its Checkbox children", () => {
178
+ render(
179
+ <CheckboxGroup labelText="Test Label" name="test8" isRequired>
180
+ <Checkbox value="2" labelText="Checkbox 2" />
181
+ <Checkbox value="3" labelText="Checkbox 3" />
182
+ <Checkbox value="4" labelText="Checkbox 4" />
183
+ </CheckboxGroup>
184
+ );
185
+ const Checkboxes = screen.getAllByRole("checkbox");
186
+
187
+ expect(Checkboxes).toHaveLength(3);
188
+ expect(Checkboxes[0]).toHaveAttribute("required");
189
+ expect(Checkboxes[1]).toHaveAttribute("required");
190
+ expect(Checkboxes[2]).toHaveAttribute("required");
191
+ });
192
+
193
+ it("sets the error state for all its Checkbox children", () => {
194
+ render(
195
+ <CheckboxGroup
196
+ labelText="Test Label"
197
+ name="test9"
198
+ isInvalid
199
+ invalidText="There's an error!"
200
+ >
201
+ <Checkbox value="2" labelText="Checkbox 2" />
202
+ <Checkbox value="3" labelText="Checkbox 3" />
203
+ <Checkbox value="4" labelText="Checkbox 4" />
204
+ </CheckboxGroup>
205
+ );
206
+ const Checkboxes = screen.getAllByRole("checkbox");
207
+
208
+ expect(Checkboxes).toHaveLength(3);
209
+ expect(Checkboxes[0]).toHaveAttribute("aria-invalid");
210
+ expect(Checkboxes[1]).toHaveAttribute("aria-invalid");
211
+ expect(Checkboxes[2]).toHaveAttribute("aria-invalid");
212
+ });
213
+
214
+ it("does not render the invalid text when 'isInvalid' is true but 'showHelperInvalidText' is false", () => {
215
+ render(
216
+ <CheckboxGroup
217
+ labelText="Test Label"
218
+ name="test9"
219
+ isInvalid
220
+ invalidText="There's an error!"
221
+ showHelperInvalidText={false}
222
+ >
223
+ <Checkbox value="2" labelText="Checkbox 2" />
224
+ <Checkbox value="3" labelText="Checkbox 3" />
225
+ <Checkbox value="4" labelText="Checkbox 4" />
226
+ </CheckboxGroup>
227
+ );
228
+ const Checkboxes = screen.getAllByRole("checkbox");
229
+
230
+ expect(Checkboxes).toHaveLength(3);
231
+ expect(Checkboxes[0]).toHaveAttribute("aria-invalid");
232
+ expect(Checkboxes[1]).toHaveAttribute("aria-invalid");
233
+ expect(Checkboxes[2]).toHaveAttribute("aria-invalid");
234
+ });
235
+
236
+ it("renders the UI snapshot correctly", () => {
237
+ const column = renderer
238
+ .create(
239
+ <CheckboxGroup labelText="column" name="column" id="column">
240
+ <Checkbox value="2" labelText="Checkbox 2" />
241
+ <Checkbox value="3" labelText="Checkbox 3" />
242
+ </CheckboxGroup>
243
+ )
244
+ .toJSON();
245
+ const row = renderer
246
+ .create(
247
+ <CheckboxGroup
248
+ labelText="row"
249
+ name="row"
250
+ id="row"
251
+ layout={CheckboxGroupLayoutTypes.Row}
252
+ >
253
+ <Checkbox value="2" labelText="Checkbox 2" />
254
+ <Checkbox value="3" labelText="Checkbox 3" />
255
+ </CheckboxGroup>
256
+ )
257
+ .toJSON();
258
+ const noLabel = renderer
259
+ .create(
260
+ <CheckboxGroup
261
+ labelText="no label"
262
+ name="noLabel"
263
+ id="noLabel"
264
+ showLabel={false}
265
+ >
266
+ <Checkbox value="2" labelText="Checkbox 2" />
267
+ <Checkbox value="3" labelText="Checkbox 3" />
268
+ </CheckboxGroup>
269
+ )
270
+ .toJSON();
271
+ const helperText = renderer
272
+ .create(
273
+ <CheckboxGroup
274
+ labelText="helperText"
275
+ name="helperText"
276
+ id="helperText"
277
+ helperText="helper text"
278
+ >
279
+ <Checkbox value="2" labelText="Checkbox 2" />
280
+ <Checkbox value="3" labelText="Checkbox 3" />
281
+ </CheckboxGroup>
282
+ )
283
+ .toJSON();
284
+ const invalidText = renderer
285
+ .create(
286
+ <CheckboxGroup
287
+ labelText="invalidText"
288
+ name="invalidText"
289
+ id="invalidText"
290
+ invalidText="error text"
291
+ >
292
+ <Checkbox value="2" labelText="Checkbox 2" />
293
+ <Checkbox value="3" labelText="Checkbox 3" />
294
+ </CheckboxGroup>
295
+ )
296
+ .toJSON();
297
+ const noOptReqLabel = renderer
298
+ .create(
299
+ <CheckboxGroup
300
+ labelText="no optional or required label"
301
+ name="optReq"
302
+ id="optReq"
303
+ optReqFlag={false}
304
+ >
305
+ <Checkbox value="2" labelText="Checkbox 2" />
306
+ <Checkbox value="3" labelText="Checkbox 3" />
307
+ </CheckboxGroup>
308
+ )
309
+ .toJSON();
310
+ const isRequired = renderer
311
+ .create(
312
+ <CheckboxGroup
313
+ labelText="required"
314
+ name="required"
315
+ id="required"
316
+ isRequired
317
+ >
318
+ <Checkbox value="2" labelText="Checkbox 2" />
319
+ <Checkbox value="3" labelText="Checkbox 3" />
320
+ </CheckboxGroup>
321
+ )
322
+ .toJSON();
323
+ const isInvalid = renderer
324
+ .create(
325
+ <CheckboxGroup
326
+ labelText="invalid"
327
+ name="invalid"
328
+ id="invalid"
329
+ isInvalid
330
+ >
331
+ <Checkbox value="2" labelText="Checkbox 2" />
332
+ <Checkbox value="3" labelText="Checkbox 3" />
333
+ </CheckboxGroup>
334
+ )
335
+ .toJSON();
336
+ const isDisabled = renderer
337
+ .create(
338
+ <CheckboxGroup
339
+ labelText="disabled"
340
+ name="disabled"
341
+ id="disabled"
342
+ isDisabled
343
+ >
344
+ <Checkbox value="2" labelText="Checkbox 2" />
345
+ <Checkbox value="3" labelText="Checkbox 3" />
346
+ </CheckboxGroup>
347
+ )
348
+ .toJSON();
349
+
350
+ expect(column).toMatchSnapshot();
351
+ expect(row).toMatchSnapshot();
352
+ expect(noLabel).toMatchSnapshot();
353
+ expect(helperText).toMatchSnapshot();
354
+ expect(invalidText).toMatchSnapshot();
355
+ expect(noOptReqLabel).toMatchSnapshot();
356
+ expect(isRequired).toMatchSnapshot();
357
+ expect(isInvalid).toMatchSnapshot();
358
+ expect(isDisabled).toMatchSnapshot();
359
+ });
360
+
361
+ it("should throw warning when a non-Checkbox component is used as a child", () => {
362
+ const warn = jest.spyOn(console, "warn");
363
+ render(
364
+ <CheckboxGroup labelText="wrong child!" name="wrong" id="wrong-child">
365
+ <p>This is wrong!</p>
366
+ </CheckboxGroup>
367
+ );
368
+ expect(warn).toHaveBeenCalledWith(
369
+ "Only `Checkbox` components are allowed inside the `CheckboxGroup` component."
370
+ );
371
+ });
372
+ });