@nypl/design-system-react-components 1.0.1 → 1.0.2

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 (396) hide show
  1. package/CHANGELOG.md +1428 -3
  2. package/README.md +391 -3
  3. package/dist/__tests__/fileMock.d.ts +4 -0
  4. package/dist/__tests__/setup.d.ts +2 -0
  5. package/{lib/stories/0-Welcome.stories.d.ts → dist/__tests__/utils/utils.test.d.ts} +1 -1
  6. package/dist/components/Accordion/Accordion.d.ts +21 -0
  7. package/dist/components/Autosuggest/Autosuggest.stories.d.ts +4 -0
  8. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +18 -0
  9. package/dist/components/Button/Button.d.ts +25 -0
  10. package/dist/components/ButtonGroup/ButtonGroup.d.ts +22 -0
  11. package/dist/components/Card/Card.d.ts +49 -0
  12. package/dist/components/Checkbox/Checkbox.d.ts +47 -0
  13. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +49 -0
  14. package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +29 -0
  15. package/dist/components/DatePicker/DatePicker.d.ts +81 -0
  16. package/dist/components/Fieldset/Fieldset.d.ts +22 -0
  17. package/dist/components/Form/Form.d.ts +29 -0
  18. package/dist/components/Grid/SimpleGrid.d.ts +17 -0
  19. package/dist/components/Heading/Heading.d.ts +27 -0
  20. package/dist/components/HelperErrorText/HelperErrorText.d.ts +29 -0
  21. package/dist/components/Hero/Hero.d.ts +40 -0
  22. package/dist/components/HorizontalRule/HorizontalRule.d.ts +11 -0
  23. package/dist/components/Icons/Icon.d.ts +37 -0
  24. package/dist/components/Icons/IconSvgs.d.ts +33 -0
  25. package/dist/components/Image/Image.d.ts +61 -0
  26. package/dist/components/Label/Label.d.ts +20 -0
  27. package/dist/components/Link/Link.d.ts +20 -0
  28. package/dist/components/List/List.d.ts +35 -0
  29. package/dist/components/Logo/Logo.d.ts +26 -0
  30. package/dist/components/Logo/LogoSvgs.d.ts +46 -0
  31. package/dist/components/Modal/Modal.d.ts +33 -0
  32. package/dist/components/Notification/Notification.d.ts +50 -0
  33. package/dist/components/Pagination/Pagination.d.ts +27 -0
  34. package/dist/components/Placeholder/Placeholder.d.ts +10 -0
  35. package/dist/components/ProgressIndicator/ProgressIndicator.d.ts +30 -0
  36. package/dist/components/Radio/Radio.d.ts +43 -0
  37. package/dist/components/RadioGroup/RadioGroup.d.ts +51 -0
  38. package/dist/components/SearchBar/SearchBar.d.ts +61 -0
  39. package/dist/components/Select/Select.d.ts +57 -0
  40. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +39 -0
  41. package/dist/components/SkipNavigation/SkipNavigation.d.ts +17 -0
  42. package/dist/components/Slider/Slider.d.ts +60 -0
  43. package/dist/components/StatusBadge/StatusBadge.d.ts +16 -0
  44. package/dist/components/StructuredContent/StructuredContent.d.ts +28 -0
  45. package/dist/components/StyleGuide/ColorCard.d.ts +12 -0
  46. package/dist/components/Table/Table.d.ts +29 -0
  47. package/dist/components/Tabs/Tabs.d.ts +26 -0
  48. package/dist/components/Template/Template.d.ts +126 -0
  49. package/dist/components/Text/Text.d.ts +16 -0
  50. package/dist/components/TextInput/TextInput.d.ts +78 -0
  51. package/dist/components/Toggle/Toggle.d.ts +42 -0
  52. package/dist/components/VideoPlayer/VideoPlayer.d.ts +38 -0
  53. package/dist/design-system-react-components.cjs.development.js +11305 -0
  54. package/dist/design-system-react-components.cjs.development.js.map +1 -0
  55. package/dist/design-system-react-components.cjs.production.min.js +2 -0
  56. package/dist/design-system-react-components.cjs.production.min.js.map +1 -0
  57. package/dist/design-system-react-components.esm.js +11150 -0
  58. package/dist/design-system-react-components.esm.js.map +1 -0
  59. package/dist/helpers/types.d.ts +1 -0
  60. package/dist/hooks/tests/useCarouselStyles.test.d.ts +1 -0
  61. package/dist/hooks/useCarouselStyles.d.ts +17 -0
  62. package/dist/hooks/useNYPLTheme.d.ts +66 -0
  63. package/dist/hooks/useWindowSize.d.ts +10 -0
  64. package/dist/index.d.ts +48 -0
  65. package/dist/index.js +8 -0
  66. package/dist/resources.scss +386 -0
  67. package/dist/styles.css +3 -0
  68. package/dist/theme/components/accordion.d.ts +20 -0
  69. package/dist/theme/components/breadcrumb.d.ts +105 -0
  70. package/dist/theme/components/button.d.ts +120 -0
  71. package/dist/theme/components/buttonGroup.d.ts +11 -0
  72. package/dist/theme/components/card.d.ts +381 -0
  73. package/dist/theme/components/checkbox.d.ts +95 -0
  74. package/dist/theme/components/checkboxGroup.d.ts +14 -0
  75. package/dist/theme/components/componentWrapper.d.ts +12 -0
  76. package/dist/theme/components/customTable.d.ts +136 -0
  77. package/dist/theme/components/datePicker.d.ts +16 -0
  78. package/dist/theme/components/fieldset.d.ts +20 -0
  79. package/dist/theme/components/global.d.ts +73 -0
  80. package/dist/theme/components/globalMixins.d.ts +23 -0
  81. package/dist/theme/components/heading.d.ts +160 -0
  82. package/dist/theme/components/helperErrorText.d.ts +12 -0
  83. package/dist/theme/components/hero.d.ts +499 -0
  84. package/dist/theme/components/horizontalRule.d.ts +15 -0
  85. package/dist/theme/components/icon.d.ts +47755 -0
  86. package/dist/theme/components/image.d.ts +590 -0
  87. package/dist/theme/components/label.d.ts +18 -0
  88. package/dist/theme/components/link.d.ts +62 -0
  89. package/dist/theme/components/list.d.ts +182 -0
  90. package/dist/theme/components/logo.d.ts +477 -0
  91. package/dist/theme/components/notification.d.ts +95 -0
  92. package/dist/theme/components/pagination.d.ts +16 -0
  93. package/dist/theme/components/progressIndicator.d.ts +52 -0
  94. package/dist/theme/components/radio.d.ts +99 -0
  95. package/dist/theme/components/radioGroup.d.ts +14 -0
  96. package/dist/theme/components/searchBar.d.ts +18 -0
  97. package/dist/theme/components/select.d.ts +87 -0
  98. package/dist/theme/components/skeletonLoader.d.ts +102 -0
  99. package/dist/theme/components/skipNavigation.d.ts +25 -0
  100. package/dist/theme/components/slider.d.ts +59 -0
  101. package/dist/theme/components/statusBadge.d.ts +25 -0
  102. package/dist/theme/components/structuredContent.d.ts +226 -0
  103. package/dist/theme/components/tabs.d.ts +136 -0
  104. package/dist/theme/components/template.d.ts +105 -0
  105. package/dist/theme/components/text.d.ts +26 -0
  106. package/dist/theme/components/textInput.d.ts +124 -0
  107. package/dist/theme/components/toggle.d.ts +92 -0
  108. package/dist/theme/components/videoPlayer.d.ts +40 -0
  109. package/dist/theme/foundations/breakpoints.d.ts +23 -0
  110. package/dist/theme/foundations/colors.d.ts +3 -0
  111. package/dist/theme/foundations/global.d.ts +58 -0
  112. package/dist/theme/foundations/radii.d.ts +6 -0
  113. package/dist/theme/foundations/shadows.d.ts +4 -0
  114. package/dist/theme/foundations/spacing.d.ts +82 -0
  115. package/dist/theme/foundations/typography.d.ts +8 -0
  116. package/dist/theme/index.d.ts +20 -0
  117. package/dist/theme/provider.d.ts +3 -0
  118. package/dist/theme/types.d.ts +1 -0
  119. package/dist/utils/componentCategories.d.ts +1 -0
  120. package/dist/utils/interfaces.d.ts +5 -0
  121. package/dist/utils/utils.d.ts +31 -0
  122. package/package.json +133 -20
  123. package/src/__tests__/fileMock.ts +6 -0
  124. package/src/__tests__/setup.ts +27 -0
  125. package/src/__tests__/utils/utils.test.ts +18 -0
  126. package/src/components/AccessibilityGuide/SkipNavigation.stories.mdx +42 -0
  127. package/src/components/Accordion/Accordion.stories.mdx +333 -0
  128. package/src/components/Accordion/Accordion.test.tsx +237 -0
  129. package/src/components/Accordion/Accordion.tsx +137 -0
  130. package/src/components/Accordion/__snapshots__/Accordion.test.tsx.snap +734 -0
  131. package/src/components/Autosuggest/Autosuggest.stories.mdx +75 -0
  132. package/src/components/Autosuggest/Autosuggest.stories.tsx +211 -0
  133. package/src/components/Autosuggest/_Autosuggest.scss +51 -0
  134. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +231 -0
  135. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +144 -0
  136. package/src/components/Breadcrumbs/Breadcrumbs.tsx +98 -0
  137. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +695 -0
  138. package/src/components/Button/Button.stories.mdx +320 -0
  139. package/src/components/Button/Button.test.tsx +184 -0
  140. package/src/components/Button/Button.tsx +95 -0
  141. package/src/components/Button/__snapshots__/Button.test.tsx.snap +106 -0
  142. package/src/components/ButtonGroup/ButtonGroup.stories.mdx +178 -0
  143. package/src/components/ButtonGroup/ButtonGroup.test.tsx +141 -0
  144. package/src/components/ButtonGroup/ButtonGroup.tsx +100 -0
  145. package/src/components/ButtonGroup/__snapshots__/ButtonGroup.test.tsx.snap +117 -0
  146. package/src/components/Card/Card.stories.mdx +1041 -0
  147. package/src/components/Card/Card.test.tsx +388 -0
  148. package/src/components/Card/Card.tsx +346 -0
  149. package/src/components/Card/__snapshots__/Card.test.tsx.snap +568 -0
  150. package/src/components/Chakra/Box.stories.mdx +52 -0
  151. package/src/components/Chakra/Center.stories.mdx +96 -0
  152. package/src/components/Chakra/Flex.stories.mdx +111 -0
  153. package/src/components/Chakra/Grid.stories.mdx +89 -0
  154. package/src/components/Chakra/Stack.stories.mdx +109 -0
  155. package/src/components/Checkbox/Checkbox.stories.mdx +243 -0
  156. package/src/components/Checkbox/Checkbox.test.tsx +350 -0
  157. package/src/components/Checkbox/Checkbox.tsx +152 -0
  158. package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +661 -0
  159. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +462 -0
  160. package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +492 -0
  161. package/src/components/CheckboxGroup/CheckboxGroup.tsx +173 -0
  162. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +1842 -0
  163. package/src/components/ComponentWrapper/ComponentWrapper.test.tsx +163 -0
  164. package/src/components/ComponentWrapper/ComponentWrapper.tsx +76 -0
  165. package/src/components/ComponentWrapper/__snapshots__/ComponentWrapper.test.tsx.snap +103 -0
  166. package/src/components/DatePicker/DatePicker.stories.mdx +452 -0
  167. package/src/components/DatePicker/DatePicker.test.tsx +940 -0
  168. package/src/components/DatePicker/DatePicker.tsx +450 -0
  169. package/src/components/DatePicker/_DatePicker.scss +100 -0
  170. package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +908 -0
  171. package/src/components/Fieldset/Fieldset.stories.mdx +96 -0
  172. package/src/components/Fieldset/Fieldset.test.tsx +155 -0
  173. package/src/components/Fieldset/Fieldset.tsx +55 -0
  174. package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +89 -0
  175. package/src/components/Form/Form.stories.mdx +426 -0
  176. package/src/components/Form/Form.test.tsx +234 -0
  177. package/src/components/Form/Form.tsx +124 -0
  178. package/src/components/Form/__snapshots__/Form.test.tsx.snap +115 -0
  179. package/src/components/Grid/SimpleGrid.stories.mdx +336 -0
  180. package/src/components/Grid/SimpleGrid.test.tsx +79 -0
  181. package/src/components/Grid/SimpleGrid.tsx +49 -0
  182. package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +23 -0
  183. package/src/components/Heading/Heading.stories.mdx +187 -0
  184. package/src/components/Heading/Heading.test.tsx +171 -0
  185. package/src/components/Heading/Heading.tsx +104 -0
  186. package/src/components/Heading/__snapshots__/Heading.test.tsx.snap +90 -0
  187. package/src/components/HelperErrorText/HelperErrorText.stories.mdx +172 -0
  188. package/src/components/HelperErrorText/HelperErrorText.test.tsx +114 -0
  189. package/src/components/HelperErrorText/HelperErrorText.tsx +62 -0
  190. package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +93 -0
  191. package/src/components/Hero/Hero.stories.mdx +378 -0
  192. package/src/components/Hero/Hero.test.tsx +611 -0
  193. package/src/components/Hero/Hero.tsx +203 -0
  194. package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +379 -0
  195. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +73 -0
  196. package/src/components/HorizontalRule/HorizontalRule.test.tsx +54 -0
  197. package/src/components/HorizontalRule/HorizontalRule.tsx +27 -0
  198. package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +44 -0
  199. package/src/components/Icons/Icon.stories.mdx +413 -0
  200. package/src/components/Icons/Icon.test.tsx +120 -0
  201. package/src/components/Icons/Icon.tsx +187 -0
  202. package/src/components/Icons/IconSvgs.tsx +64 -0
  203. package/src/components/Icons/__snapshots__/Icon.test.tsx.snap +129 -0
  204. package/src/components/Image/Image.stories.mdx +332 -0
  205. package/src/components/Image/Image.test.tsx +155 -0
  206. package/src/components/Image/Image.tsx +171 -0
  207. package/src/components/Image/__snapshots__/Image.test.tsx.snap +269 -0
  208. package/src/components/Label/Label.stories.mdx +100 -0
  209. package/src/components/Label/Label.test.tsx +116 -0
  210. package/src/components/Label/Label.tsx +55 -0
  211. package/src/components/Label/__snapshots__/Label.test.tsx.snap +45 -0
  212. package/src/components/Link/Link.stories.mdx +249 -0
  213. package/src/components/Link/Link.test.tsx +224 -0
  214. package/src/components/Link/Link.tsx +178 -0
  215. package/src/components/Link/__snapshots__/Link.test.tsx.snap +286 -0
  216. package/src/components/List/List.stories.mdx +393 -0
  217. package/src/components/List/List.test.tsx +265 -0
  218. package/src/components/List/List.tsx +156 -0
  219. package/src/components/List/__snapshots__/List.test.tsx.snap +213 -0
  220. package/src/components/Logo/Logo.stories.mdx +295 -0
  221. package/src/components/Logo/Logo.test.tsx +116 -0
  222. package/src/components/Logo/Logo.tsx +151 -0
  223. package/src/components/Logo/LogoSvgs.tsx +90 -0
  224. package/src/components/Logo/__snapshots__/Logo.test.tsx.snap +142 -0
  225. package/src/components/Modal/Modal.stories.mdx +294 -0
  226. package/src/components/Modal/Modal.test.tsx +157 -0
  227. package/src/components/Modal/Modal.tsx +154 -0
  228. package/src/components/Modal/__snapshots__/Modal.test.tsx.snap +25 -0
  229. package/src/components/Notification/Notification.stories.mdx +358 -0
  230. package/src/components/Notification/Notification.test.tsx +279 -0
  231. package/src/components/Notification/Notification.tsx +224 -0
  232. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +525 -0
  233. package/src/components/Pagination/Pagination.stories.mdx +184 -0
  234. package/src/components/Pagination/Pagination.test.tsx +419 -0
  235. package/src/components/Pagination/Pagination.tsx +269 -0
  236. package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +544 -0
  237. package/src/components/Placeholder/Placeholder.tsx +19 -0
  238. package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +360 -0
  239. package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +298 -0
  240. package/src/components/ProgressIndicator/ProgressIndicator.tsx +132 -0
  241. package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +434 -0
  242. package/src/components/Radio/Radio.stories.mdx +216 -0
  243. package/src/components/Radio/Radio.test.tsx +247 -0
  244. package/src/components/Radio/Radio.tsx +119 -0
  245. package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +451 -0
  246. package/src/components/RadioGroup/RadioGroup.stories.mdx +479 -0
  247. package/src/components/RadioGroup/RadioGroup.test.tsx +471 -0
  248. package/src/components/RadioGroup/RadioGroup.tsx +171 -0
  249. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +1550 -0
  250. package/src/components/SearchBar/SearchBar.stories.mdx +518 -0
  251. package/src/components/SearchBar/SearchBar.test.tsx +435 -0
  252. package/src/components/SearchBar/SearchBar.tsx +210 -0
  253. package/src/components/SearchBar/__snapshots__/SearchBar.test.tsx.snap +1049 -0
  254. package/src/components/Select/Select.stories.mdx +439 -0
  255. package/src/components/Select/Select.test.tsx +358 -0
  256. package/src/components/Select/Select.tsx +183 -0
  257. package/src/components/Select/__snapshots__/Select.test.tsx.snap +895 -0
  258. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +142 -0
  259. package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +116 -0
  260. package/src/components/SkeletonLoader/SkeletonLoader.tsx +123 -0
  261. package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +898 -0
  262. package/src/components/SkipNavigation/SkipNavigation.stories.mdx +90 -0
  263. package/src/components/SkipNavigation/SkipNavigation.test.tsx +63 -0
  264. package/src/components/SkipNavigation/SkipNavigation.tsx +51 -0
  265. package/src/components/SkipNavigation/__snapshots__/SkipNavigation.test.tsx.snap +130 -0
  266. package/src/components/Slider/Slider.stories.mdx +628 -0
  267. package/src/components/Slider/Slider.test.tsx +736 -0
  268. package/src/components/Slider/Slider.tsx +322 -0
  269. package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +2186 -0
  270. package/src/components/StatusBadge/StatusBadge.stories.mdx +109 -0
  271. package/src/components/StatusBadge/StatusBadge.test.tsx +70 -0
  272. package/src/components/StatusBadge/StatusBadge.tsx +35 -0
  273. package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +47 -0
  274. package/src/components/StructuredContent/StructuredContent.stories.mdx +567 -0
  275. package/src/components/StructuredContent/StructuredContent.test.tsx +435 -0
  276. package/src/components/StructuredContent/StructuredContent.tsx +139 -0
  277. package/src/components/StructuredContent/__snapshots__/StructuredContent.test.tsx.snap +368 -0
  278. package/src/components/StyleGuide/Bidirectionality.stories.mdx +206 -0
  279. package/src/components/StyleGuide/Breakpoints.stories.mdx +55 -0
  280. package/src/components/StyleGuide/Buttons.stories.mdx +194 -0
  281. package/src/components/StyleGuide/ColorCard.tsx +43 -0
  282. package/src/components/StyleGuide/Colors.stories.mdx +201 -0
  283. package/src/components/StyleGuide/DesignTokens.stories.mdx +193 -0
  284. package/src/components/StyleGuide/Forms.stories.mdx +94 -0
  285. package/src/components/StyleGuide/Iconography.stories.mdx +142 -0
  286. package/src/components/StyleGuide/Spacing.stories.mdx +116 -0
  287. package/src/components/StyleGuide/Typography.stories.mdx +419 -0
  288. package/src/components/Table/Table.stories.mdx +272 -0
  289. package/src/components/Table/Table.test.tsx +241 -0
  290. package/src/components/Table/Table.tsx +152 -0
  291. package/src/components/Table/__snapshots__/Table.test.tsx.snap +1703 -0
  292. package/src/components/Tabs/Tabs.stories.mdx +338 -0
  293. package/src/components/Tabs/Tabs.test.tsx +298 -0
  294. package/src/components/Tabs/Tabs.tsx +264 -0
  295. package/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap +584 -0
  296. package/src/components/Template/Template.stories.mdx +695 -0
  297. package/src/components/Template/Template.test.tsx +309 -0
  298. package/src/components/Template/Template.tsx +326 -0
  299. package/src/components/Template/__snapshots__/Template.test.tsx.snap +342 -0
  300. package/src/components/Text/Text.stories.mdx +103 -0
  301. package/src/components/Text/Text.test.tsx +63 -0
  302. package/src/components/Text/Text.tsx +50 -0
  303. package/src/components/Text/__snapshots__/Text.test.tsx.snap +50 -0
  304. package/src/components/TextInput/TextInput.stories.mdx +268 -0
  305. package/src/components/TextInput/TextInput.test.tsx +451 -0
  306. package/src/components/TextInput/TextInput.tsx +240 -0
  307. package/src/components/TextInput/__snapshots__/TextInput.test.tsx.snap +274 -0
  308. package/src/components/Toggle/Toggle.stories.mdx +237 -0
  309. package/src/components/Toggle/Toggle.test.tsx +170 -0
  310. package/src/components/Toggle/Toggle.tsx +128 -0
  311. package/src/components/Toggle/__snapshots__/Toggle.test.tsx.snap +470 -0
  312. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +212 -0
  313. package/src/components/VideoPlayer/VideoPlayer.test.tsx +308 -0
  314. package/src/components/VideoPlayer/VideoPlayer.tsx +188 -0
  315. package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +192 -0
  316. package/src/docs/Chakra.stories.mdx +563 -0
  317. package/src/docs/Welcome.stories.mdx +148 -0
  318. package/src/helpers/types.ts +1 -0
  319. package/src/hooks/tests/useCarouselStyles.test.ts +140 -0
  320. package/src/hooks/tests/useNYPLTheme.test.tsx +36 -0
  321. package/src/hooks/useCarouselStyles.stories.mdx +30 -0
  322. package/src/hooks/useCarouselStyles.ts +35 -0
  323. package/src/hooks/useNYPLTheme.stories.mdx +98 -0
  324. package/src/hooks/useNYPLTheme.ts +91 -0
  325. package/src/hooks/useWindowSize.stories.mdx +23 -0
  326. package/src/hooks/useWindowSize.ts +40 -0
  327. package/src/index.ts +136 -0
  328. package/src/resources.scss +6 -0
  329. package/src/styles/base/_01-breakpoints.scss +27 -0
  330. package/src/styles/base/_02-mixins.scss +103 -0
  331. package/src/styles/base/_place-holder.scss +33 -0
  332. package/src/styles/space/_space-inline.scss +79 -0
  333. package/src/styles/space/_space-inset.scss +57 -0
  334. package/src/styles/space/_space-stack.scss +116 -0
  335. package/src/styles.scss +23 -0
  336. package/src/theme/components/accordion.ts +25 -0
  337. package/src/theme/components/breadcrumb.ts +94 -0
  338. package/src/theme/components/button.ts +133 -0
  339. package/src/theme/components/buttonGroup.ts +10 -0
  340. package/src/theme/components/card.ts +237 -0
  341. package/src/theme/components/checkbox.ts +110 -0
  342. package/src/theme/components/checkboxGroup.ts +10 -0
  343. package/src/theme/components/componentWrapper.ts +14 -0
  344. package/src/theme/components/customTable.ts +77 -0
  345. package/src/theme/components/datePicker.ts +17 -0
  346. package/src/theme/components/fieldset.ts +23 -0
  347. package/src/theme/components/global.ts +91 -0
  348. package/src/theme/components/globalMixins.ts +24 -0
  349. package/src/theme/components/heading.ts +79 -0
  350. package/src/theme/components/helperErrorText.ts +14 -0
  351. package/src/theme/components/hero.ts +238 -0
  352. package/src/theme/components/horizontalRule.ts +17 -0
  353. package/src/theme/components/icon.ts +88 -0
  354. package/src/theme/components/image.ts +136 -0
  355. package/src/theme/components/label.ts +15 -0
  356. package/src/theme/components/link.ts +63 -0
  357. package/src/theme/components/list.ts +88 -0
  358. package/src/theme/components/logo.ts +58 -0
  359. package/src/theme/components/notification.ts +132 -0
  360. package/src/theme/components/pagination.ts +17 -0
  361. package/src/theme/components/progressIndicator.ts +67 -0
  362. package/src/theme/components/radio.ts +103 -0
  363. package/src/theme/components/radioGroup.ts +10 -0
  364. package/src/theme/components/searchBar.ts +19 -0
  365. package/src/theme/components/select.ts +72 -0
  366. package/src/theme/components/skeletonLoader.ts +113 -0
  367. package/src/theme/components/skipNavigation.ts +29 -0
  368. package/src/theme/components/slider.ts +95 -0
  369. package/src/theme/components/statusBadge.ts +26 -0
  370. package/src/theme/components/structuredContent.ts +149 -0
  371. package/src/theme/components/tabs.ts +109 -0
  372. package/src/theme/components/template.ts +114 -0
  373. package/src/theme/components/text.ts +38 -0
  374. package/src/theme/components/textInput.ts +65 -0
  375. package/src/theme/components/toggle.ts +109 -0
  376. package/src/theme/components/videoPlayer.ts +47 -0
  377. package/src/theme/foundations/breakpoints.ts +24 -0
  378. package/src/theme/foundations/colors.ts +212 -0
  379. package/src/theme/foundations/global.ts +43 -0
  380. package/src/theme/foundations/radii.ts +7 -0
  381. package/src/theme/foundations/shadows.ts +5 -0
  382. package/src/theme/foundations/spacing.ts +136 -0
  383. package/src/theme/foundations/typography.ts +107 -0
  384. package/src/theme/index.ts +131 -0
  385. package/src/theme/provider.tsx +9 -0
  386. package/src/theme/types.ts +1 -0
  387. package/src/utils/componentCategories.ts +152 -0
  388. package/src/utils/interfaces.ts +5 -0
  389. package/src/utils/utils.ts +84 -0
  390. package/lib/components/Button/Button.d.ts +0 -17
  391. package/lib/components/Button/Button.js +0 -42
  392. package/lib/index.d.ts +0 -1
  393. package/lib/index.js +0 -6
  394. package/lib/stories/0-Welcome.stories.js +0 -19
  395. package/lib/stories/1-Button.stories.d.ts +0 -6
  396. package/lib/stories/1-Button.stories.js +0 -20
@@ -0,0 +1,333 @@
1
+ import {
2
+ ArgsTable,
3
+ Canvas,
4
+ Description,
5
+ Meta,
6
+ Story,
7
+ } from "@storybook/addon-docs";
8
+ import ReactDOMServer from "react-dom/server";
9
+ import { withDesign } from "storybook-addon-designs";
10
+
11
+ import Accordion from "./Accordion";
12
+ import Card, { CardHeading, CardContent } from "../Card/Card";
13
+ import { getCategory } from "../../utils/componentCategories";
14
+
15
+ <Meta
16
+ title={getCategory("Accordion")}
17
+ component={Accordion}
18
+ decorators={[withDesign]}
19
+ parameters={{
20
+ design: {
21
+ type: "figma",
22
+ url: "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Master?node-id=10734%3A2520",
23
+ },
24
+ jest: ["Accordion.test.tsx"],
25
+ }}
26
+ argTypes={{
27
+ accordionData: { control: false },
28
+ id: { control: false },
29
+ isDefaultOpen: { table: { defaultValue: { summary: false } } },
30
+ }}
31
+ />
32
+
33
+ # Accordion
34
+
35
+ | Component Version | DS Version |
36
+ | ----------------- | ---------- |
37
+ | Added | `0.1.0` |
38
+ | Latest | `1.0.2` |
39
+
40
+ ## Table of Contents
41
+
42
+ - [Overview](#overview)
43
+ - [Component Props](#component-props)
44
+ - [Accessibility](#accessibility)
45
+ - [FAQ Example](#faq-example)
46
+
47
+ ## Overview
48
+
49
+ <Description of={Accordion} />
50
+
51
+ The `Accordion` component displays a list of high-level options that can
52
+ expand and collapse to reveal associated sections of content. This component
53
+ pushes existing content on the page down. Each accordion item is self contained,
54
+ but when the data for multiple accordions is passed in through the `accordionData`
55
+ prop, the `Accordion` components are grouped together and rendered under a single
56
+ element. When grouped like this, each `Accordion` component still opens and
57
+ closes independent from the others in the group.
58
+
59
+ The only way to render an `Accordion` component is to pass in an array of objects
60
+ with `label`, `panel`, and optional `accordionType` properties for each accordion item.
61
+ Note that you can pass in a string or DOM elements into the `panel` property in each
62
+ object. This approach is needed because, internally, we deal with the logic to render
63
+ the necessary icon, Chakra components, and styles. Additionally, the `accordionType`
64
+ prop can be used to change the accordion button's background color. It takes a value
65
+ of `"default"` for `"ui.white"`, `"warning"` for `"ui.status.primary"`, and
66
+ `"error"` for `"ui.status.secondary"`.
67
+
68
+ ```jsx
69
+ const accordionData = [
70
+ {
71
+ accordionType: "default",
72
+ label: "Tom Nook",
73
+ panel: (
74
+ <Card
75
+ imageProps={{
76
+ alt: "Alt text",
77
+ aspectRatio: "twoByOne",
78
+ src: "https://play.nintendo.com/images/AC_Tom_FRYtwIN.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png",
79
+ }}
80
+ isCentered
81
+ layout="row"
82
+ >
83
+ <CardHeading level="four" id="heading1">
84
+ Tom Nook
85
+ </CardHeading>
86
+ <CardContent>
87
+ Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional
88
+ character in the Animal Crossing series who operates the
89
+ village store.
90
+ </CardContent>
91
+ </Card>
92
+ ),
93
+ },
94
+ ];
95
+
96
+ ...
97
+
98
+ <Accordion accordionData={accordionData} />
99
+ ```
100
+
101
+ ## Component Props
102
+
103
+ export const accordionData = [
104
+ {
105
+ accordionType: "default",
106
+ label: "Tom Nook",
107
+ panel: (
108
+ <Card
109
+ imageProps={{
110
+ alt: "Alt text",
111
+ aspectRatio: "twoByOne",
112
+ src: "https://play.nintendo.com/images/AC_Tom_FRYtwIN.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png",
113
+ }}
114
+ isCentered
115
+ layout="row"
116
+ >
117
+ <CardHeading level="four" id="heading1">
118
+ Tom Nook
119
+ </CardHeading>
120
+ <CardContent>
121
+ Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional character
122
+ in the Animal Crossing series who operates the village store.
123
+ </CardContent>
124
+ </Card>
125
+ ),
126
+ },
127
+ ];
128
+
129
+ <Canvas withToolbar>
130
+ <Story
131
+ name="Accordion with Controls"
132
+ args={{
133
+ id: "accordion-id",
134
+ isDefaultOpen: false,
135
+ }}
136
+ >
137
+ {(args) => <Accordion accordionData={accordionData} {...args} />}
138
+ </Story>
139
+ </Canvas>
140
+
141
+ <ArgsTable story="Accordion with Controls" />
142
+
143
+ ## Accessibility
144
+
145
+ - Follows [U.S. Web Design System (USWDS)](https://designsystem.digital.gov/components/accordion/)
146
+ guidelines:
147
+ - Use the `button` HTML element for screenreaders and keyboards.
148
+ - Use the `aria-expanded` attribute to indicate whether the `Accordion` is
149
+ expanded (`true`) or collapsed (`false`).
150
+ - Use the `aria-controls` attribute to associate the control with the panel.
151
+ - Deviates from USWDS in that the user can open multiple panels. Opening one,
152
+ does not collapse already expanded panel.
153
+ - The open and close icons are decorative (`aria-hidden` is `true`).
154
+ - Visible focus goes around full button and full button is clickable
155
+
156
+ Resources:
157
+
158
+ - [W3C WAI-Aria Practices - Accordion](https://www.w3.org/TR/wai-aria-practices-1.1/#accordion)
159
+ - [USWDS Accordion](https://designsystem.digital.gov/components/accordion/)
160
+ - [Chakra Accordion](https://chakra-ui.com/docs/components/disclosure/accordion)
161
+
162
+ ## FAQ Example
163
+
164
+ export const faqContent = [
165
+ {
166
+ accordionType: "default",
167
+ label: "Tom Nook",
168
+ panel: (
169
+ <Card
170
+ imageProps={{
171
+ alt: "Alt text",
172
+ aspectRatio: "twoByOne",
173
+ src: "https://play.nintendo.com/images/AC_Tom_FRYtwIN.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png",
174
+ }}
175
+ isCentered
176
+ layout="row"
177
+ >
178
+ <CardHeading level="four" id="heading1-tom">
179
+ Tom Nook
180
+ </CardHeading>
181
+ <CardContent>
182
+ Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional character
183
+ in the Animal Crossing series who operates the village store.
184
+ </CardContent>
185
+ </Card>
186
+ ),
187
+ },
188
+ {
189
+ accordionType: "warning",
190
+ label: "Isabelle",
191
+ panel: (
192
+ <Card
193
+ imageProps={{
194
+ alt: "Alt text",
195
+ aspectRatio: "twoByOne",
196
+ src: "https://play.nintendo.com/images/AC_Isabelle_7XU6aGu.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png",
197
+ }}
198
+ isCentered
199
+ layout="row"
200
+ >
201
+ <CardHeading level="four" id="heading1-isabelle">
202
+ Isabelle
203
+ </CardHeading>
204
+ <CardContent>
205
+ Isabelle, known as Shizue in Japan, is a fictional character from the
206
+ Animal Crossing series of video games. She is a kindly Shih Tzu that
207
+ debuted in the 2012 release Animal Crossing: New Leaf, where she
208
+ serves as the secretary to the player character.
209
+ </CardContent>
210
+ </Card>
211
+ ),
212
+ },
213
+ {
214
+ accordionType: "error",
215
+ label: "K.K. Slider",
216
+ panel: (
217
+ <Card
218
+ imageProps={{
219
+ alt: "Alt text",
220
+ aspectRatio: "twoByOne",
221
+ src: "https://play.nintendo.com/images/AC_KK_jh4yj5t.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png",
222
+ }}
223
+ isCentered
224
+ layout="row"
225
+ >
226
+ <CardHeading level="four" id="heading1-kkslider">
227
+ K.K. Slider
228
+ </CardHeading>
229
+ <CardContent>
230
+ <p>
231
+ Totakeke, more commonly known as <b>K.K. Slider or K.K.</b>, is a
232
+ fictional character within the Animal Crossing franchise. One of the
233
+ franchise's most popular characters, he debuted in the title Animal
234
+ Crossing, and has appeared in every installment since.
235
+ </p>
236
+ </CardContent>
237
+ </Card>
238
+ ),
239
+ },
240
+ ];
241
+
242
+ Building out FAQ-like accordions happens automatically when there are more than
243
+ one object in the array passed into the `accordionData` prop.
244
+
245
+ <Canvas withToolbar>
246
+ <Story name="FAQ Example">
247
+ <Accordion accordionData={faqContent} />
248
+ </Story>
249
+ </Canvas>
250
+
251
+ ```jsx
252
+ export const faqContent = [
253
+ {
254
+ accordionType: "default",
255
+ label: "Tom Nook",
256
+ panel: (
257
+ <Card
258
+ imageProps={{
259
+ alt: "Alt text",
260
+ aspectRatio: "twoByOne",
261
+ src: "https://play.nintendo.com/images/AC_Tom_FRYtwIN.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png",
262
+ }}
263
+ isCentered
264
+ layout="row"
265
+ >
266
+ <CardHeading level="four" id="heading1-tom">
267
+ Tom Nook
268
+ </CardHeading>
269
+ <CardContent>
270
+ Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional character
271
+ in the Animal Crossing series who operates the village store.
272
+ </CardContent>
273
+ </Card>
274
+ ),
275
+ },
276
+ {
277
+ accordionType: "warning",
278
+ label: "Isabelle",
279
+ panel: (
280
+ <Card
281
+ imageProps={{
282
+ alt: "Alt text",
283
+ aspectRatio: "twoByOne",
284
+ src: "https://play.nintendo.com/images/AC_Isabelle_7XU6aGu.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png",
285
+ }}
286
+ isCentered
287
+ layout="row"
288
+ >
289
+ <CardHeading level="four" id="heading1-isabelle">
290
+ Isabelle
291
+ </CardHeading>
292
+ <CardContent>
293
+ Isabelle, known as Shizue in Japan, is a fictional character from the
294
+ Animal Crossing series of video games. She is a kindly Shih Tzu that
295
+ debuted in the 2012 release Animal Crossing: New Leaf, where she
296
+ serves as the secretary to the player character.
297
+ </CardContent>
298
+ </Card>
299
+ ),
300
+ },
301
+ {
302
+ accordionType: "error",
303
+ label: "K.K. Slider",
304
+ panel: (
305
+ <Card
306
+ imageProps={{
307
+ alt: "Alt text",
308
+ aspectRatio: "twoByOne",
309
+ src: "https://play.nintendo.com/images/AC_KK_jh4yj5t.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png",
310
+ }}
311
+ isCentered
312
+ layout="row"
313
+ >
314
+ <CardHeading level="four" id="heading1-kkslider">
315
+ K.K. Slider
316
+ </CardHeading>
317
+ <CardContent>
318
+ <p>
319
+ Totakeke, more commonly known as <b>K.K. Slider or K.K.</b>, is a
320
+ fictional character within the Animal Crossing franchise. One of the
321
+ franchise's most popular characters, he debuted in the title Animal
322
+ Crossing, and has appeared in every installment since.
323
+ </p>
324
+ </CardContent>
325
+ </Card>
326
+ ),
327
+ },
328
+ ];
329
+
330
+ ...
331
+
332
+ <Accordion accordionData={faqContent} />
333
+ ```
@@ -0,0 +1,237 @@
1
+ import * as React from "react";
2
+ import { axe } from "jest-axe";
3
+ import { render, screen } from "@testing-library/react";
4
+ import renderer from "react-test-renderer";
5
+ import userEvent from "@testing-library/user-event";
6
+
7
+ import Accordion from "./Accordion";
8
+ import Card, { CardContent, CardHeading } from "../Card/Card";
9
+
10
+ describe("Accordion Accessibility", () => {
11
+ it("passes axe accessibility test for one item", async () => {
12
+ const { container } = render(
13
+ <Accordion
14
+ accordionData={[
15
+ {
16
+ label: "Tom Nook",
17
+ panel: (
18
+ <p>
19
+ Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional
20
+ character in the Animal Crossing series who operates the village
21
+ store.
22
+ </p>
23
+ ),
24
+ },
25
+ ]}
26
+ />
27
+ );
28
+ expect(await axe(container)).toHaveNoViolations();
29
+ });
30
+
31
+ it("passes axe accessibility test for multiple items", async () => {
32
+ const { container } = render(
33
+ <Accordion
34
+ accordionData={[
35
+ {
36
+ label: "Tom Nook",
37
+ panel: (
38
+ <p>
39
+ Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional
40
+ character in the Animal Crossing series who operates the village
41
+ store.
42
+ </p>
43
+ ),
44
+ },
45
+ {
46
+ label: "Isabelle",
47
+ panel:
48
+ "Isabelle, known as Shizue in Japan, is a fictional character " +
49
+ "from the Animal Crossing series of video games. She is a kindly Shih " +
50
+ "Tzu that debuted in the 2012 release Animal Crossing: New Leaf, where " +
51
+ "she serves as the secretary to the player character.",
52
+ },
53
+ ]}
54
+ />
55
+ );
56
+ expect(await axe(container)).toHaveNoViolations();
57
+ });
58
+ });
59
+
60
+ export const accordionData = [
61
+ {
62
+ label: "Tom Nook",
63
+ panel: (
64
+ <p>
65
+ Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional character
66
+ in the Animal Crossing series who operates the village store.
67
+ </p>
68
+ ),
69
+ },
70
+ {
71
+ label: "Isabelle",
72
+ panel:
73
+ "Isabelle, known as Shizue in Japan, is a fictional character " +
74
+ "from the Animal Crossing series of video games. She is a kindly Shih " +
75
+ "Tzu that debuted in the 2012 release Animal Crossing: New Leaf, where " +
76
+ "she serves as the secretary to the player character.",
77
+ },
78
+ {
79
+ label: "K.K. Slider",
80
+ panel:
81
+ "<p>Totakeke, more commonly known as <b>K.K. Slider or K.K.</b>, is a " +
82
+ "fictional character within the Animal Crossing franchise. One of the " +
83
+ "franchise's most popular characters, he debuted in the title Animal " +
84
+ "Crossing, and has appeared in every installment since.</p>",
85
+ },
86
+ ];
87
+
88
+ describe("Accordion", () => {
89
+ it("renders a visible button with a label to click on", () => {
90
+ render(<Accordion accordionData={[accordionData[0]]} />);
91
+ const accordionLabel = screen.getByRole("button", { name: "Tom Nook" });
92
+
93
+ expect(accordionLabel).toBeInTheDocument();
94
+ // Closed by default.
95
+ expect(accordionLabel).toHaveAttribute("aria-expanded", "false");
96
+ expect(screen.getByText(/known in Japan as Tanukichi/i)).not.toBeVisible();
97
+ });
98
+
99
+ it("opens the panel by default with isDefaultOpen passed", () => {
100
+ render(<Accordion isDefaultOpen accordionData={[accordionData[0]]} />);
101
+ const accordionLabel = screen.getByRole("button", { name: "Tom Nook" });
102
+
103
+ expect(accordionLabel).toBeInTheDocument();
104
+ expect(accordionLabel).toHaveAttribute("aria-expanded", "true");
105
+ });
106
+
107
+ it("opens the accordion when the label is clicked", () => {
108
+ render(<Accordion accordionData={[accordionData[0]]} />);
109
+
110
+ const accordionLabel = screen.getByRole("button", { name: "Tom Nook" });
111
+ expect(accordionLabel).toHaveAttribute("aria-expanded", "false");
112
+ userEvent.click(accordionLabel);
113
+ expect(accordionLabel).toHaveAttribute("aria-expanded", "true");
114
+ });
115
+
116
+ it("renders multiple accordion items grouped together", () => {
117
+ render(<Accordion accordionData={accordionData} />);
118
+
119
+ const accordion1 = screen.getByRole("button", { name: "Tom Nook" });
120
+ const accordion2 = screen.getByRole("button", { name: "Isabelle" });
121
+ const accordion3 = screen.getByRole("button", { name: "K.K. Slider" });
122
+
123
+ expect(accordion1).toHaveAttribute("aria-expanded", "false");
124
+ expect(accordion2).toHaveAttribute("aria-expanded", "false");
125
+ expect(accordion3).toHaveAttribute("aria-expanded", "false");
126
+ });
127
+
128
+ it("opens each accordion item independently of each other", () => {
129
+ render(<Accordion accordionData={accordionData} />);
130
+
131
+ const accordion1 = screen.getByRole("button", { name: "Tom Nook" });
132
+ const accordion2 = screen.getByRole("button", { name: "Isabelle" });
133
+ const accordion3 = screen.getByRole("button", { name: "K.K. Slider" });
134
+
135
+ expect(accordion1).toHaveAttribute("aria-expanded", "false");
136
+ expect(accordion2).toHaveAttribute("aria-expanded", "false");
137
+ expect(accordion3).toHaveAttribute("aria-expanded", "false");
138
+
139
+ userEvent.click(accordion1);
140
+ expect(accordion1).toHaveAttribute("aria-expanded", "true");
141
+ expect(accordion2).toHaveAttribute("aria-expanded", "false");
142
+ expect(accordion3).toHaveAttribute("aria-expanded", "false");
143
+
144
+ userEvent.click(accordion2);
145
+ expect(accordion1).toHaveAttribute("aria-expanded", "true");
146
+ expect(accordion2).toHaveAttribute("aria-expanded", "true");
147
+ expect(accordion3).toHaveAttribute("aria-expanded", "false");
148
+
149
+ userEvent.click(accordion3);
150
+ userEvent.click(accordion1);
151
+ expect(accordion1).toHaveAttribute("aria-expanded", "false");
152
+ expect(accordion2).toHaveAttribute("aria-expanded", "true");
153
+ expect(accordion3).toHaveAttribute("aria-expanded", "true");
154
+ });
155
+
156
+ it("Renders the UI snapshot correctly", () => {
157
+ const accordionData = [
158
+ {
159
+ label: "Gerry Kellman",
160
+ panel: (
161
+ <Card
162
+ id="card"
163
+ imageProps={{
164
+ alt: "Alt text",
165
+ aspectRatio: "twoByOne",
166
+ src: "https://cdn.onebauer.media/one/media/6176/76fd/405b/ab5f/f20f/2d52/gerri-1500-1.jpg?format=jpg&quality=80&width=850&ratio=1-1&resize=aspectfit",
167
+ }}
168
+ isCentered
169
+ layout="row"
170
+ >
171
+ <CardHeading id="heading1" level="four">
172
+ Gerry Kellman
173
+ </CardHeading>
174
+ <CardContent>
175
+ Gerri is <b>one of Logan's most trusted confidantes</b>, one who
176
+ serves many roles within the company. She's one of the most
177
+ powerful people at Waystar Royco outside of the family itself.
178
+ </CardContent>
179
+ </Card>
180
+ ),
181
+ },
182
+ ];
183
+
184
+ const primary = renderer
185
+ .create(<Accordion accordionData={accordionData} id="accordian" />)
186
+ .toJSON();
187
+ const defaultOpen = renderer
188
+ .create(
189
+ <Accordion accordionData={accordionData} id="accordian" isDefaultOpen />
190
+ )
191
+ .toJSON();
192
+ const withError = renderer
193
+ .create(
194
+ <Accordion
195
+ accordionData={[{ ...accordionData[0], accordionType: "error" }]}
196
+ id="accordian"
197
+ isDefaultOpen
198
+ />
199
+ )
200
+ .toJSON();
201
+ const withWarning = renderer
202
+ .create(
203
+ <Accordion
204
+ accordionData={[{ ...accordionData[0], accordionType: "warning" }]}
205
+ id="accordian"
206
+ isDefaultOpen
207
+ />
208
+ )
209
+ .toJSON();
210
+ const withChakraProps = renderer
211
+ .create(
212
+ <Accordion
213
+ accordionData={accordionData}
214
+ id="accordian"
215
+ p="s"
216
+ color="ui.error.primary"
217
+ />
218
+ )
219
+ .toJSON();
220
+ const withOtherProps = renderer
221
+ .create(
222
+ <Accordion
223
+ accordionData={accordionData}
224
+ id="accordian"
225
+ data-testid="testid"
226
+ />
227
+ )
228
+ .toJSON();
229
+
230
+ expect(primary).toMatchSnapshot();
231
+ expect(defaultOpen).toMatchSnapshot();
232
+ expect(withChakraProps).toMatchSnapshot();
233
+ expect(withOtherProps).toMatchSnapshot();
234
+ expect(withError).toMatchSnapshot();
235
+ expect(withWarning).toMatchSnapshot();
236
+ });
237
+ });
@@ -0,0 +1,137 @@
1
+ import {
2
+ Accordion as ChakraAccordion,
3
+ AccordionButton,
4
+ AccordionItem,
5
+ AccordionPanel,
6
+ Box,
7
+ chakra,
8
+ } from "@chakra-ui/react";
9
+ import * as React from "react";
10
+
11
+ import Icon from "../Icons/Icon";
12
+
13
+ export type AccordionTypes = "default" | "warning" | "error";
14
+ export interface AccordionDataProps {
15
+ accordionType?: AccordionTypes;
16
+ label: string;
17
+ panel: string | React.ReactNode;
18
+ }
19
+ export interface AccordionProps {
20
+ /** Array of data to display, and an optional accordionType */
21
+ accordionData: AccordionDataProps[];
22
+ /** ID that other components can cross reference for accessibility purposes */
23
+ id?: string;
24
+ /** Whether the accordion is open by default only on its initial rendering */
25
+ isDefaultOpen?: boolean;
26
+ }
27
+
28
+ /**
29
+ * Get the minus or plus icon depending on whether the accordion
30
+ * is open or closed.
31
+ */
32
+ const getIcon = (isExpanded = false, index: number, id: string) => {
33
+ const iconName = isExpanded ? "minus" : "plus";
34
+ return (
35
+ <Icon id={`accordion-${id}-icon-${index}`} name={iconName} size="small" />
36
+ );
37
+ };
38
+
39
+ /**
40
+ * Returns `AccordionItems` for every accordion object in the data
41
+ * array. This automatically creates the `AccordionButton` and `AccordionPanel`
42
+ * combination that is required for the Chakra `Accordion` component.
43
+ */
44
+ const getElementsFromData = (data: AccordionDataProps[] = [], id: string) => {
45
+ const colorMap = {
46
+ default: "ui.white",
47
+ warning: "ui.status.primary",
48
+ error: "ui.status.secondary",
49
+ };
50
+ // For FAQ-style multiple accordions, the button should be bigger.
51
+ // Otherwise, use the default.
52
+ const multipleFontSize = data?.length > 1 ? "text.default" : "text.caption";
53
+ const multiplePadding = data?.length > 1 ? "s" : "xs s";
54
+
55
+ return data.map((content, index) => {
56
+ // This is done to support both string and DOM element input.
57
+ const panel =
58
+ typeof content.panel === "string" ? (
59
+ <AccordionPanel
60
+ id={`${id}-panel-${index}`}
61
+ key={index}
62
+ dangerouslySetInnerHTML={{ __html: content.panel }}
63
+ />
64
+ ) : (
65
+ <AccordionPanel id={`${id}-panel-${index}`} key={index}>
66
+ {content.panel}
67
+ </AccordionPanel>
68
+ );
69
+
70
+ return (
71
+ <AccordionItem id={`${id}-item-${index}`} key={index}>
72
+ {/* Get the current state to render the correct icon. */}
73
+ {({ isExpanded }) => {
74
+ const bgColorByAccordionType = colorMap[content.accordionType];
75
+ return (
76
+ <>
77
+ <AccordionButton
78
+ id={`${id}-button-${index}`}
79
+ padding={multiplePadding}
80
+ bg={
81
+ !content.accordionType
82
+ ? colorMap.default
83
+ : bgColorByAccordionType
84
+ }
85
+ _expanded={{
86
+ bg:
87
+ !content.accordionType ||
88
+ content.accordionType === "default"
89
+ ? "ui.gray.light-cool"
90
+ : bgColorByAccordionType,
91
+ }}
92
+ _hover={{
93
+ bg:
94
+ !content.accordionType ||
95
+ content.accordionType === "default"
96
+ ? "transparent"
97
+ : bgColorByAccordionType,
98
+ borderColor: "ui.gray.dark",
99
+ }}
100
+ >
101
+ <Box flex="1" fontSize={multipleFontSize} textAlign="left">
102
+ {content.label}
103
+ </Box>
104
+ {getIcon(isExpanded, index, id)}
105
+ </AccordionButton>
106
+ {panel}
107
+ </>
108
+ );
109
+ }}
110
+ </AccordionItem>
111
+ );
112
+ });
113
+ };
114
+
115
+ /**
116
+ * Accordion component that shows content on toggle. Can be used to display
117
+ * multiple accordion items together.
118
+ */
119
+ export const Accordion = chakra((props: AccordionProps) => {
120
+ const { accordionData, id, isDefaultOpen = false, ...rest } = props;
121
+
122
+ // Pass `0` to open the first accordion in the 0-index based array.
123
+ const openFirstAccordion = isDefaultOpen ? [0] : undefined;
124
+
125
+ return (
126
+ <ChakraAccordion
127
+ id={id}
128
+ defaultIndex={openFirstAccordion}
129
+ allowMultiple
130
+ {...rest}
131
+ >
132
+ {getElementsFromData(accordionData, id)}
133
+ </ChakraAccordion>
134
+ );
135
+ });
136
+
137
+ export default Accordion;