@nypl/design-system-react-components 1.0.2 → 1.0.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 (309) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/README.md +171 -135
  3. package/dist/__tests__/mediaMatchMock.d.ts +79 -0
  4. package/dist/components/Card/Card.d.ts +8 -6
  5. package/dist/components/Heading/Heading.d.ts +6 -0
  6. package/dist/components/Icons/Icon.d.ts +1 -1
  7. package/dist/components/Icons/IconSvgs.d.ts +10 -0
  8. package/dist/components/Logo/Logo.d.ts +1 -1
  9. package/dist/components/Logo/LogoSvgs.d.ts +3 -0
  10. package/dist/components/Slider/Slider.d.ts +1 -2
  11. package/dist/components/Table/Table.d.ts +3 -2
  12. package/dist/components/Text/Text.d.ts +6 -0
  13. package/dist/components/TextInput/TextInput.d.ts +2 -1
  14. package/dist/design-system-react-components.cjs.development.js +1700 -878
  15. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  16. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  17. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  18. package/dist/design-system-react-components.esm.js +1672 -881
  19. package/dist/design-system-react-components.esm.js.map +1 -1
  20. package/dist/hooks/{tests → __tests__}/useCarouselStyles.test.d.ts +0 -0
  21. package/dist/hooks/__tests__/useNYPLBreakpoints.test.d.ts +1 -0
  22. package/dist/hooks/useNYPLBreakpoints.d.ts +13 -0
  23. package/dist/index.d.ts +2 -1
  24. package/dist/resources.scss +0 -4
  25. package/dist/styles.css +3 -2
  26. package/dist/theme/components/button.d.ts +7 -2
  27. package/dist/theme/components/checkbox.d.ts +1 -0
  28. package/dist/theme/components/customTable.d.ts +522 -34
  29. package/dist/theme/components/datePicker.d.ts +1 -0
  30. package/dist/theme/components/global.d.ts +5 -2
  31. package/dist/theme/components/heading.d.ts +5 -1
  32. package/dist/theme/components/image.d.ts +18 -0
  33. package/dist/theme/components/radio.d.ts +9 -0
  34. package/dist/theme/components/searchBar.d.ts +6 -0
  35. package/dist/theme/components/select.d.ts +4 -5
  36. package/dist/theme/components/structuredContent.d.ts +117 -17
  37. package/dist/theme/components/template.d.ts +4 -1
  38. package/dist/theme/components/text.d.ts +5 -1
  39. package/dist/theme/components/textInput.d.ts +4 -0
  40. package/dist/theme/components/toggle.d.ts +1 -0
  41. package/dist/theme/provider.d.ts +2 -1
  42. package/package.json +16 -16
  43. package/src/__tests__/fileMock.ts +0 -6
  44. package/src/__tests__/setup.ts +0 -27
  45. package/src/__tests__/utils/utils.test.ts +0 -18
  46. package/src/components/AccessibilityGuide/SkipNavigation.stories.mdx +0 -42
  47. package/src/components/Accordion/Accordion.stories.mdx +0 -333
  48. package/src/components/Accordion/Accordion.test.tsx +0 -237
  49. package/src/components/Accordion/Accordion.tsx +0 -137
  50. package/src/components/Accordion/__snapshots__/Accordion.test.tsx.snap +0 -734
  51. package/src/components/Autosuggest/Autosuggest.stories.mdx +0 -75
  52. package/src/components/Autosuggest/Autosuggest.stories.tsx +0 -211
  53. package/src/components/Autosuggest/_Autosuggest.scss +0 -51
  54. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +0 -231
  55. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +0 -144
  56. package/src/components/Breadcrumbs/Breadcrumbs.tsx +0 -98
  57. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +0 -695
  58. package/src/components/Button/Button.stories.mdx +0 -320
  59. package/src/components/Button/Button.test.tsx +0 -184
  60. package/src/components/Button/Button.tsx +0 -95
  61. package/src/components/Button/__snapshots__/Button.test.tsx.snap +0 -106
  62. package/src/components/ButtonGroup/ButtonGroup.stories.mdx +0 -178
  63. package/src/components/ButtonGroup/ButtonGroup.test.tsx +0 -141
  64. package/src/components/ButtonGroup/ButtonGroup.tsx +0 -100
  65. package/src/components/ButtonGroup/__snapshots__/ButtonGroup.test.tsx.snap +0 -117
  66. package/src/components/Card/Card.stories.mdx +0 -1041
  67. package/src/components/Card/Card.test.tsx +0 -388
  68. package/src/components/Card/Card.tsx +0 -346
  69. package/src/components/Card/__snapshots__/Card.test.tsx.snap +0 -568
  70. package/src/components/Chakra/Box.stories.mdx +0 -52
  71. package/src/components/Chakra/Center.stories.mdx +0 -96
  72. package/src/components/Chakra/Flex.stories.mdx +0 -111
  73. package/src/components/Chakra/Grid.stories.mdx +0 -89
  74. package/src/components/Chakra/Stack.stories.mdx +0 -109
  75. package/src/components/Checkbox/Checkbox.stories.mdx +0 -243
  76. package/src/components/Checkbox/Checkbox.test.tsx +0 -350
  77. package/src/components/Checkbox/Checkbox.tsx +0 -152
  78. package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +0 -661
  79. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +0 -462
  80. package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +0 -492
  81. package/src/components/CheckboxGroup/CheckboxGroup.tsx +0 -173
  82. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +0 -1842
  83. package/src/components/ComponentWrapper/ComponentWrapper.test.tsx +0 -163
  84. package/src/components/ComponentWrapper/ComponentWrapper.tsx +0 -76
  85. package/src/components/ComponentWrapper/__snapshots__/ComponentWrapper.test.tsx.snap +0 -103
  86. package/src/components/DatePicker/DatePicker.stories.mdx +0 -452
  87. package/src/components/DatePicker/DatePicker.test.tsx +0 -940
  88. package/src/components/DatePicker/DatePicker.tsx +0 -450
  89. package/src/components/DatePicker/_DatePicker.scss +0 -100
  90. package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +0 -908
  91. package/src/components/Fieldset/Fieldset.stories.mdx +0 -96
  92. package/src/components/Fieldset/Fieldset.test.tsx +0 -155
  93. package/src/components/Fieldset/Fieldset.tsx +0 -55
  94. package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +0 -89
  95. package/src/components/Form/Form.stories.mdx +0 -426
  96. package/src/components/Form/Form.test.tsx +0 -234
  97. package/src/components/Form/Form.tsx +0 -124
  98. package/src/components/Form/__snapshots__/Form.test.tsx.snap +0 -115
  99. package/src/components/Grid/SimpleGrid.stories.mdx +0 -336
  100. package/src/components/Grid/SimpleGrid.test.tsx +0 -79
  101. package/src/components/Grid/SimpleGrid.tsx +0 -49
  102. package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +0 -23
  103. package/src/components/Heading/Heading.stories.mdx +0 -187
  104. package/src/components/Heading/Heading.test.tsx +0 -171
  105. package/src/components/Heading/Heading.tsx +0 -104
  106. package/src/components/Heading/__snapshots__/Heading.test.tsx.snap +0 -90
  107. package/src/components/HelperErrorText/HelperErrorText.stories.mdx +0 -172
  108. package/src/components/HelperErrorText/HelperErrorText.test.tsx +0 -114
  109. package/src/components/HelperErrorText/HelperErrorText.tsx +0 -62
  110. package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +0 -93
  111. package/src/components/Hero/Hero.stories.mdx +0 -378
  112. package/src/components/Hero/Hero.test.tsx +0 -611
  113. package/src/components/Hero/Hero.tsx +0 -203
  114. package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +0 -379
  115. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +0 -73
  116. package/src/components/HorizontalRule/HorizontalRule.test.tsx +0 -54
  117. package/src/components/HorizontalRule/HorizontalRule.tsx +0 -27
  118. package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +0 -44
  119. package/src/components/Icons/Icon.stories.mdx +0 -413
  120. package/src/components/Icons/Icon.test.tsx +0 -120
  121. package/src/components/Icons/Icon.tsx +0 -187
  122. package/src/components/Icons/IconSvgs.tsx +0 -64
  123. package/src/components/Icons/__snapshots__/Icon.test.tsx.snap +0 -129
  124. package/src/components/Image/Image.stories.mdx +0 -332
  125. package/src/components/Image/Image.test.tsx +0 -155
  126. package/src/components/Image/Image.tsx +0 -171
  127. package/src/components/Image/__snapshots__/Image.test.tsx.snap +0 -269
  128. package/src/components/Label/Label.stories.mdx +0 -100
  129. package/src/components/Label/Label.test.tsx +0 -116
  130. package/src/components/Label/Label.tsx +0 -55
  131. package/src/components/Label/__snapshots__/Label.test.tsx.snap +0 -45
  132. package/src/components/Link/Link.stories.mdx +0 -249
  133. package/src/components/Link/Link.test.tsx +0 -224
  134. package/src/components/Link/Link.tsx +0 -178
  135. package/src/components/Link/__snapshots__/Link.test.tsx.snap +0 -286
  136. package/src/components/List/List.stories.mdx +0 -393
  137. package/src/components/List/List.test.tsx +0 -265
  138. package/src/components/List/List.tsx +0 -156
  139. package/src/components/List/__snapshots__/List.test.tsx.snap +0 -213
  140. package/src/components/Logo/Logo.stories.mdx +0 -295
  141. package/src/components/Logo/Logo.test.tsx +0 -116
  142. package/src/components/Logo/Logo.tsx +0 -151
  143. package/src/components/Logo/LogoSvgs.tsx +0 -90
  144. package/src/components/Logo/__snapshots__/Logo.test.tsx.snap +0 -142
  145. package/src/components/Modal/Modal.stories.mdx +0 -294
  146. package/src/components/Modal/Modal.test.tsx +0 -157
  147. package/src/components/Modal/Modal.tsx +0 -154
  148. package/src/components/Modal/__snapshots__/Modal.test.tsx.snap +0 -25
  149. package/src/components/Notification/Notification.stories.mdx +0 -358
  150. package/src/components/Notification/Notification.test.tsx +0 -279
  151. package/src/components/Notification/Notification.tsx +0 -224
  152. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +0 -525
  153. package/src/components/Pagination/Pagination.stories.mdx +0 -184
  154. package/src/components/Pagination/Pagination.test.tsx +0 -419
  155. package/src/components/Pagination/Pagination.tsx +0 -269
  156. package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +0 -544
  157. package/src/components/Placeholder/Placeholder.tsx +0 -19
  158. package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +0 -360
  159. package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +0 -298
  160. package/src/components/ProgressIndicator/ProgressIndicator.tsx +0 -132
  161. package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +0 -434
  162. package/src/components/Radio/Radio.stories.mdx +0 -216
  163. package/src/components/Radio/Radio.test.tsx +0 -247
  164. package/src/components/Radio/Radio.tsx +0 -119
  165. package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +0 -451
  166. package/src/components/RadioGroup/RadioGroup.stories.mdx +0 -479
  167. package/src/components/RadioGroup/RadioGroup.test.tsx +0 -471
  168. package/src/components/RadioGroup/RadioGroup.tsx +0 -171
  169. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +0 -1550
  170. package/src/components/SearchBar/SearchBar.stories.mdx +0 -518
  171. package/src/components/SearchBar/SearchBar.test.tsx +0 -435
  172. package/src/components/SearchBar/SearchBar.tsx +0 -210
  173. package/src/components/SearchBar/__snapshots__/SearchBar.test.tsx.snap +0 -1049
  174. package/src/components/Select/Select.stories.mdx +0 -439
  175. package/src/components/Select/Select.test.tsx +0 -358
  176. package/src/components/Select/Select.tsx +0 -183
  177. package/src/components/Select/__snapshots__/Select.test.tsx.snap +0 -895
  178. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +0 -142
  179. package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +0 -116
  180. package/src/components/SkeletonLoader/SkeletonLoader.tsx +0 -123
  181. package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +0 -898
  182. package/src/components/SkipNavigation/SkipNavigation.stories.mdx +0 -90
  183. package/src/components/SkipNavigation/SkipNavigation.test.tsx +0 -63
  184. package/src/components/SkipNavigation/SkipNavigation.tsx +0 -51
  185. package/src/components/SkipNavigation/__snapshots__/SkipNavigation.test.tsx.snap +0 -130
  186. package/src/components/Slider/Slider.stories.mdx +0 -628
  187. package/src/components/Slider/Slider.test.tsx +0 -736
  188. package/src/components/Slider/Slider.tsx +0 -322
  189. package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +0 -2186
  190. package/src/components/StatusBadge/StatusBadge.stories.mdx +0 -109
  191. package/src/components/StatusBadge/StatusBadge.test.tsx +0 -70
  192. package/src/components/StatusBadge/StatusBadge.tsx +0 -35
  193. package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +0 -47
  194. package/src/components/StructuredContent/StructuredContent.stories.mdx +0 -567
  195. package/src/components/StructuredContent/StructuredContent.test.tsx +0 -435
  196. package/src/components/StructuredContent/StructuredContent.tsx +0 -139
  197. package/src/components/StructuredContent/__snapshots__/StructuredContent.test.tsx.snap +0 -368
  198. package/src/components/StyleGuide/Bidirectionality.stories.mdx +0 -206
  199. package/src/components/StyleGuide/Breakpoints.stories.mdx +0 -55
  200. package/src/components/StyleGuide/Buttons.stories.mdx +0 -194
  201. package/src/components/StyleGuide/ColorCard.tsx +0 -43
  202. package/src/components/StyleGuide/Colors.stories.mdx +0 -201
  203. package/src/components/StyleGuide/DesignTokens.stories.mdx +0 -193
  204. package/src/components/StyleGuide/Forms.stories.mdx +0 -94
  205. package/src/components/StyleGuide/Iconography.stories.mdx +0 -142
  206. package/src/components/StyleGuide/Spacing.stories.mdx +0 -116
  207. package/src/components/StyleGuide/Typography.stories.mdx +0 -419
  208. package/src/components/Table/Table.stories.mdx +0 -272
  209. package/src/components/Table/Table.test.tsx +0 -241
  210. package/src/components/Table/Table.tsx +0 -152
  211. package/src/components/Table/__snapshots__/Table.test.tsx.snap +0 -1703
  212. package/src/components/Tabs/Tabs.stories.mdx +0 -338
  213. package/src/components/Tabs/Tabs.test.tsx +0 -298
  214. package/src/components/Tabs/Tabs.tsx +0 -264
  215. package/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap +0 -584
  216. package/src/components/Template/Template.stories.mdx +0 -695
  217. package/src/components/Template/Template.test.tsx +0 -309
  218. package/src/components/Template/Template.tsx +0 -326
  219. package/src/components/Template/__snapshots__/Template.test.tsx.snap +0 -342
  220. package/src/components/Text/Text.stories.mdx +0 -103
  221. package/src/components/Text/Text.test.tsx +0 -63
  222. package/src/components/Text/Text.tsx +0 -50
  223. package/src/components/Text/__snapshots__/Text.test.tsx.snap +0 -50
  224. package/src/components/TextInput/TextInput.stories.mdx +0 -268
  225. package/src/components/TextInput/TextInput.test.tsx +0 -451
  226. package/src/components/TextInput/TextInput.tsx +0 -240
  227. package/src/components/TextInput/__snapshots__/TextInput.test.tsx.snap +0 -274
  228. package/src/components/Toggle/Toggle.stories.mdx +0 -237
  229. package/src/components/Toggle/Toggle.test.tsx +0 -170
  230. package/src/components/Toggle/Toggle.tsx +0 -128
  231. package/src/components/Toggle/__snapshots__/Toggle.test.tsx.snap +0 -470
  232. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +0 -212
  233. package/src/components/VideoPlayer/VideoPlayer.test.tsx +0 -308
  234. package/src/components/VideoPlayer/VideoPlayer.tsx +0 -188
  235. package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +0 -192
  236. package/src/docs/Chakra.stories.mdx +0 -563
  237. package/src/docs/Welcome.stories.mdx +0 -148
  238. package/src/helpers/types.ts +0 -1
  239. package/src/hooks/tests/useCarouselStyles.test.ts +0 -140
  240. package/src/hooks/tests/useNYPLTheme.test.tsx +0 -36
  241. package/src/hooks/useCarouselStyles.stories.mdx +0 -30
  242. package/src/hooks/useCarouselStyles.ts +0 -35
  243. package/src/hooks/useNYPLTheme.stories.mdx +0 -98
  244. package/src/hooks/useNYPLTheme.ts +0 -91
  245. package/src/hooks/useWindowSize.stories.mdx +0 -23
  246. package/src/hooks/useWindowSize.ts +0 -40
  247. package/src/index.ts +0 -136
  248. package/src/resources.scss +0 -6
  249. package/src/styles/base/_01-breakpoints.scss +0 -27
  250. package/src/styles/base/_02-mixins.scss +0 -103
  251. package/src/styles/base/_place-holder.scss +0 -33
  252. package/src/styles/space/_space-inline.scss +0 -79
  253. package/src/styles/space/_space-inset.scss +0 -57
  254. package/src/styles/space/_space-stack.scss +0 -116
  255. package/src/styles.scss +0 -23
  256. package/src/theme/components/accordion.ts +0 -25
  257. package/src/theme/components/breadcrumb.ts +0 -94
  258. package/src/theme/components/button.ts +0 -133
  259. package/src/theme/components/buttonGroup.ts +0 -10
  260. package/src/theme/components/card.ts +0 -237
  261. package/src/theme/components/checkbox.ts +0 -110
  262. package/src/theme/components/checkboxGroup.ts +0 -10
  263. package/src/theme/components/componentWrapper.ts +0 -14
  264. package/src/theme/components/customTable.ts +0 -77
  265. package/src/theme/components/datePicker.ts +0 -17
  266. package/src/theme/components/fieldset.ts +0 -23
  267. package/src/theme/components/global.ts +0 -91
  268. package/src/theme/components/globalMixins.ts +0 -24
  269. package/src/theme/components/heading.ts +0 -79
  270. package/src/theme/components/helperErrorText.ts +0 -14
  271. package/src/theme/components/hero.ts +0 -238
  272. package/src/theme/components/horizontalRule.ts +0 -17
  273. package/src/theme/components/icon.ts +0 -88
  274. package/src/theme/components/image.ts +0 -136
  275. package/src/theme/components/label.ts +0 -15
  276. package/src/theme/components/link.ts +0 -63
  277. package/src/theme/components/list.ts +0 -88
  278. package/src/theme/components/logo.ts +0 -58
  279. package/src/theme/components/notification.ts +0 -132
  280. package/src/theme/components/pagination.ts +0 -17
  281. package/src/theme/components/progressIndicator.ts +0 -67
  282. package/src/theme/components/radio.ts +0 -103
  283. package/src/theme/components/radioGroup.ts +0 -10
  284. package/src/theme/components/searchBar.ts +0 -19
  285. package/src/theme/components/select.ts +0 -72
  286. package/src/theme/components/skeletonLoader.ts +0 -113
  287. package/src/theme/components/skipNavigation.ts +0 -29
  288. package/src/theme/components/slider.ts +0 -95
  289. package/src/theme/components/statusBadge.ts +0 -26
  290. package/src/theme/components/structuredContent.ts +0 -149
  291. package/src/theme/components/tabs.ts +0 -109
  292. package/src/theme/components/template.ts +0 -114
  293. package/src/theme/components/text.ts +0 -38
  294. package/src/theme/components/textInput.ts +0 -65
  295. package/src/theme/components/toggle.ts +0 -109
  296. package/src/theme/components/videoPlayer.ts +0 -47
  297. package/src/theme/foundations/breakpoints.ts +0 -24
  298. package/src/theme/foundations/colors.ts +0 -212
  299. package/src/theme/foundations/global.ts +0 -43
  300. package/src/theme/foundations/radii.ts +0 -7
  301. package/src/theme/foundations/shadows.ts +0 -5
  302. package/src/theme/foundations/spacing.ts +0 -136
  303. package/src/theme/foundations/typography.ts +0 -107
  304. package/src/theme/index.ts +0 -131
  305. package/src/theme/provider.tsx +0 -9
  306. package/src/theme/types.ts +0 -1
  307. package/src/utils/componentCategories.ts +0 -152
  308. package/src/utils/interfaces.ts +0 -5
  309. package/src/utils/utils.ts +0 -84
@@ -1,333 +0,0 @@
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
- ```
@@ -1,237 +0,0 @@
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
- });
@@ -1,137 +0,0 @@
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;