@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
@@ -2,16 +2,16 @@ import {
2
2
  Meta,
3
3
  Story,
4
4
  ArgsTable,
5
- Preview,
5
+ Canvas,
6
6
  Description,
7
7
  } from "@storybook/addon-docs/blocks";
8
8
  import Accordion from "./Accordion";
9
9
  import { withDesign } from "storybook-addon-designs";
10
- import * as stories from "./Accordion.stories.tsx";
11
- import { listRenderer as ListStory } from "../List/List.stories.tsx";
12
- import { ListTypes } from "../List/ListTypes";
10
+ import Card, { CardHeading, CardContent } from "../Card/Card";
11
+ import { CardLayouts } from "../Card/CardTypes";
12
+ import { ImageRatios } from "../Image/ImageTypes";
13
+ import { HeadingLevels } from "../Heading/HeadingTypes";
13
14
  import { Source } from "@storybook/addon-docs/blocks";
14
- import dedent from "ts-dedent";
15
15
  import ReactDOMServer from "react-dom/server";
16
16
  import { getCategory } from "../../utils/componentCategories";
17
17
 
@@ -28,7 +28,8 @@ import { getCategory } from "../../utils/componentCategories";
28
28
  jest: ["Accordion.test.tsx"],
29
29
  }}
30
30
  argTypes={{
31
- children: { table: { disable: true } },
31
+ contentData: { table: { disable: true } },
32
+ id: { table: { disable: true } },
32
33
  }}
33
34
  />
34
35
 
@@ -37,52 +38,240 @@ import { getCategory } from "../../utils/componentCategories";
37
38
  | Component Version | DS Version |
38
39
  | ----------------- | ---------- |
39
40
  | Added | `0.1.0` |
40
- | Latest | `0.21.1` |
41
+ | Latest | `0.25.1` |
41
42
 
42
43
  <Description of={Accordion} />
43
44
 
44
- The Accordion component pushes existing content on the page down. The
45
- implementation is built using basic input/label DOM elements and CSS.
46
- Therefore, make sure to pass the `inputId` prop to associate the label with
47
- the input element. If multiple Accordion components are used on a page, make
48
- sure that each `inputId` is unique.
45
+ The `Accordion` component displays a list of high-level options that can
46
+ expand/collapse to reveal associated sections of content. This component pushes
47
+ existing content on the page down. Each accordion item is self contained but
48
+ when multiple are rendered together, they render in a "FAQ" style. When multiple
49
+ accordions are rendered together, they can each open and close independent of
50
+ each other.
49
51
 
50
- <Preview withToolbar>
52
+ The only way to render an `Accordion` component is to pass in an array of objects
53
+ with `label` and `panel` properties for each accordion item. Note that you can
54
+ pass in a string or DOM elements into the `panel` property in each object. This
55
+ approach is needed because, internally, we deal with the logic to render the
56
+ necessary icon, Chakra components, and styles.
57
+
58
+ <Canvas withToolbar>
51
59
  <Story
52
60
  name="Basic"
53
61
  args={{
54
- accordionLabel: "Click to expand",
55
- children: <ListStory type={ListTypes.Unordered} />,
56
- inputId: "accordionBtn",
62
+ isDefaultOpen: false,
63
+ contentData: [
64
+ {
65
+ label: "Tom Nook",
66
+ panel: (
67
+ <Card
68
+ layout={CardLayouts.Row}
69
+ center
70
+ imageSrc="https://play.nintendo.com/images/AC_Tom_FRYtwIN.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png"
71
+ imageAlt="Alt text"
72
+ imageAspectRatio={ImageRatios.TwoByOne}
73
+ >
74
+ <CardHeading level={HeadingLevels.Four} id="heading1">
75
+ Tom Nook
76
+ </CardHeading>
77
+ <CardContent>
78
+ Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional
79
+ character in the Animal Crossing series who operates the village
80
+ store.
81
+ </CardContent>
82
+ </Card>
83
+ ),
84
+ },
85
+ ],
57
86
  }}
58
87
  >
59
88
  {(args) => <Accordion {...args} />}
60
89
  </Story>
61
- </Preview>
90
+ </Canvas>
91
+
92
+ ```jsx
93
+ const contentData = [
94
+ {
95
+ label: "Tom Nook",
96
+ panel: (
97
+ <Card
98
+ layout={CardLayouts.Row}
99
+ center
100
+ imageSrc="https://play.nintendo.com/images/AC_Tom_FRYtwIN.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png"
101
+ imageAlt="Alt text"
102
+ imageAspectRatio={ImageRatios.TwoByOne}
103
+ >
104
+ <CardHeading level={HeadingLevels.Four} id="heading1">
105
+ Tom Nook
106
+ </CardHeading>
107
+ <CardContent>
108
+ Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional
109
+ character in the Animal Crossing series who operates the
110
+ village store.
111
+ </CardContent>
112
+ </Card>
113
+ ),
114
+ },
115
+ ];
116
+
117
+ ...
118
+
119
+ <Accordion contentData={contentData} />
120
+ ```
62
121
 
63
122
  <ArgsTable story="Basic" />
64
123
 
65
124
  ## FAQ example
66
125
 
67
- The Accordion component has an optional `modifiers` prop that has pre-styled
68
- designs. For example, when building out FAQ-like pages, pass
69
- `modifiers=["faq"]` into the Accordion component.
70
-
71
- <Preview withToolbar>
72
- <Story story={stories.AccordionAsFAQSet} />
73
- </Preview>
126
+ export const faqContent = [
127
+ {
128
+ label: "Tom Nook",
129
+ panel: (
130
+ <Card
131
+ layout={CardLayouts.Row}
132
+ center
133
+ imageSrc="https://play.nintendo.com/images/AC_Tom_FRYtwIN.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png"
134
+ imageAlt="Alt text"
135
+ imageAspectRatio={ImageRatios.TwoByOne}
136
+ >
137
+ <CardHeading level={HeadingLevels.Four} id="heading1-tom">
138
+ Tom Nook
139
+ </CardHeading>
140
+ <CardContent>
141
+ Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional character
142
+ in the Animal Crossing series who operates the village store.
143
+ </CardContent>
144
+ </Card>
145
+ ),
146
+ },
147
+ {
148
+ label: "Isabelle",
149
+ panel: (
150
+ <Card
151
+ layout={CardLayouts.Row}
152
+ center
153
+ imageSrc="https://play.nintendo.com/images/AC_Isabelle_7XU6aGu.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png"
154
+ imageAlt="Alt text"
155
+ imageAspectRatio={ImageRatios.TwoByOne}
156
+ >
157
+ <CardHeading level={HeadingLevels.Four} id="heading1-isabelle">
158
+ Isabelle
159
+ </CardHeading>
160
+ <CardContent>
161
+ Isabelle, known as Shizue in Japan, is a fictional character from the
162
+ Animal Crossing series of video games. She is a kindly Shih Tzu that
163
+ debuted in the 2012 release Animal Crossing: New Leaf, where she
164
+ serves as the secretary to the player character.
165
+ </CardContent>
166
+ </Card>
167
+ ),
168
+ },
169
+ {
170
+ label: "K.K. Slider",
171
+ panel: (
172
+ <Card
173
+ layout={CardLayouts.Row}
174
+ center
175
+ imageSrc="https://play.nintendo.com/images/AC_KK_jh4yj5t.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png"
176
+ imageAlt="Alt text"
177
+ imageAspectRatio={ImageRatios.TwoByOne}
178
+ >
179
+ <CardHeading level={HeadingLevels.Four} id="heading1-kkslider">
180
+ K.K. Slider
181
+ </CardHeading>
182
+ <CardContent>
183
+ <p>
184
+ Totakeke, more commonly known as <b>K.K. Slider or K.K.</b>, is a
185
+ fictional character within the Animal Crossing franchise. One of the
186
+ franchise's most popular characters, he debuted in the title Animal
187
+ Crossing, and has appeared in every installment since.
188
+ </p>
189
+ </CardContent>
190
+ </Card>
191
+ ),
192
+ },
193
+ ];
74
194
 
75
- ## Scrollable example
195
+ Building out FAQ-like accordions happens automatically when there are more than
196
+ one object in the array passed into the `contentData` prop.
76
197
 
77
- Use modifiers=["fixed-height"] when you'd like the accordion height to match that of its
78
- parent container. In this example, we wrap the accordion in a container whose height is
79
- set to 300px. If the contents within the accordion are taller than the height of the parent
80
- container, a scrollbar will appear.
198
+ <Canvas withToolbar>
199
+ <Story name="FAQ">
200
+ <Accordion contentData={faqContent} />
201
+ </Story>
202
+ </Canvas>
81
203
 
82
- As in the other examples, any page content underneath the accordion will continue to be pushed down.
204
+ ```jsx
205
+ export const faqContent = [
206
+ {
207
+ label: "Tom Nook",
208
+ panel: (
209
+ <Card
210
+ layout={CardLayouts.Row}
211
+ center
212
+ imageSrc="https://play.nintendo.com/images/AC_Tom_FRYtwIN.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png"
213
+ imageAlt="Alt text"
214
+ imageAspectRatio={ImageRatios.TwoByOne}
215
+ >
216
+ <CardHeading level={HeadingLevels.Four} id="heading1-tom">
217
+ Tom Nook
218
+ </CardHeading>
219
+ <CardContent>
220
+ Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional character
221
+ in the Animal Crossing series who operates the village store.
222
+ </CardContent>
223
+ </Card>
224
+ ),
225
+ },
226
+ {
227
+ label: "Isabelle",
228
+ panel: (
229
+ <Card
230
+ layout={CardLayouts.Row}
231
+ center
232
+ imageSrc="https://play.nintendo.com/images/AC_Isabelle_7XU6aGu.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png"
233
+ imageAlt="Alt text"
234
+ imageAspectRatio={ImageRatios.TwoByOne}
235
+ >
236
+ <CardHeading level={HeadingLevels.Four} id="heading1-isabelle">
237
+ Isabelle
238
+ </CardHeading>
239
+ <CardContent>
240
+ Isabelle, known as Shizue in Japan, is a fictional character from the
241
+ Animal Crossing series of video games. She is a kindly Shih Tzu that
242
+ debuted in the 2012 release Animal Crossing: New Leaf, where she
243
+ serves as the secretary to the player character.
244
+ </CardContent>
245
+ </Card>
246
+ ),
247
+ },
248
+ {
249
+ label: "K.K. Slider",
250
+ panel: (
251
+ <Card
252
+ layout={CardLayouts.Row}
253
+ center
254
+ imageSrc="https://play.nintendo.com/images/AC_KK_jh4yj5t.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png"
255
+ imageAlt="Alt text"
256
+ imageAspectRatio={ImageRatios.TwoByOne}
257
+ >
258
+ <CardHeading level={HeadingLevels.Four} id="heading1-kkslider">
259
+ K.K. Slider
260
+ </CardHeading>
261
+ <CardContent>
262
+ <p>
263
+ Totakeke, more commonly known as <b>K.K. Slider or K.K.</b>, is a
264
+ fictional character within the Animal Crossing franchise. One of the
265
+ franchise's most popular characters, he debuted in the title Animal
266
+ Crossing, and has appeared in every installment since.
267
+ </p>
268
+ </CardContent>
269
+ </Card>
270
+ ),
271
+ },
272
+ ];
83
273
 
84
- <Preview withToolbar>
85
- <Story story={stories.AccordionScroll} />
86
- </Preview>
274
+ ...
87
275
 
88
- <Source code={ReactDOMServer.renderToString(stories.AccordionScroll)} />
276
+ <Accordion contentData={faqContent} />
277
+ ```
@@ -1,37 +1,153 @@
1
1
  import * as React from "react";
2
2
  import { render, screen } from "@testing-library/react";
3
3
  import { axe } from "jest-axe";
4
+ import userEvent from "@testing-library/user-event";
4
5
 
5
6
  import Accordion from "./Accordion";
6
7
 
7
8
  describe("Accordion Accessibility", () => {
8
- it("passes axe accessibility test", async () => {
9
+ it("passes axe accessibility test for one item", async () => {
9
10
  const { container } = render(
10
11
  <Accordion
11
- id="accordion"
12
- inputId="accordionBtn"
13
- accordionLabel="Click to expand"
14
- >
15
- <p className="accordion-content">this is the accordion content</p>
16
- </Accordion>
12
+ contentData={[
13
+ {
14
+ label: "Tom Nook",
15
+ panel: (
16
+ <p>
17
+ Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional
18
+ character in the Animal Crossing series who operates the village
19
+ store.
20
+ </p>
21
+ ),
22
+ },
23
+ ]}
24
+ />
17
25
  );
18
26
  expect(await axe(container)).toHaveNoViolations();
19
27
  });
20
- });
21
28
 
22
- describe("Accordion", () => {
23
- it("Renders an input checkbox and label", () => {
24
- render(
29
+ it("passes axe accessibility test for multiple items", async () => {
30
+ const { container } = render(
25
31
  <Accordion
26
- id="accordion"
27
- inputId="accordionBtn"
28
- accordionLabel="Click to expand"
29
- >
30
- <p className="accordion-content">this is the accordion content</p>
31
- </Accordion>
32
+ contentData={[
33
+ {
34
+ label: "Tom Nook",
35
+ panel: (
36
+ <p>
37
+ Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional
38
+ character in the Animal Crossing series who operates the village
39
+ store.
40
+ </p>
41
+ ),
42
+ },
43
+ {
44
+ label: "Isabelle",
45
+ panel:
46
+ "Isabelle, known as Shizue in Japan, is a fictional character " +
47
+ "from the Animal Crossing series of video games. She is a kindly Shih " +
48
+ "Tzu that debuted in the 2012 release Animal Crossing: New Leaf, where " +
49
+ "she serves as the secretary to the player character.",
50
+ },
51
+ ]}
52
+ />
32
53
  );
54
+ expect(await axe(container)).toHaveNoViolations();
55
+ });
56
+ });
57
+
58
+ export const contentData = [
59
+ {
60
+ label: "Tom Nook",
61
+ panel: (
62
+ <p>
63
+ Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional character
64
+ in the Animal Crossing series who operates the village store.
65
+ </p>
66
+ ),
67
+ },
68
+ {
69
+ label: "Isabelle",
70
+ panel:
71
+ "Isabelle, known as Shizue in Japan, is a fictional character " +
72
+ "from the Animal Crossing series of video games. She is a kindly Shih " +
73
+ "Tzu that debuted in the 2012 release Animal Crossing: New Leaf, where " +
74
+ "she serves as the secretary to the player character.",
75
+ },
76
+ {
77
+ label: "K.K. Slider",
78
+ panel:
79
+ "<p>Totakeke, more commonly known as <b>K.K. Slider or K.K.</b>, is a " +
80
+ "fictional character within the Animal Crossing franchise. One of the " +
81
+ "franchise's most popular characters, he debuted in the title Animal " +
82
+ "Crossing, and has appeared in every installment since.</p>",
83
+ },
84
+ ];
85
+
86
+ describe("Accordion", () => {
87
+ it("renders a visible button with a label to click on", () => {
88
+ render(<Accordion contentData={[contentData[0]]} />);
89
+ const accordionLabel = screen.getByRole("button", { name: "Tom Nook" });
90
+
91
+ expect(accordionLabel).toBeInTheDocument();
92
+ // Closed by default.
93
+ expect(accordionLabel).toHaveAttribute("aria-expanded", "false");
94
+ expect(screen.getByText(/known in Japan as Tanukichi/i)).not.toBeVisible();
95
+ });
96
+
97
+ it("opens the panel by default with isDefaultOpen passed", () => {
98
+ render(<Accordion isDefaultOpen contentData={[contentData[0]]} />);
99
+ const accordionLabel = screen.getByRole("button", { name: "Tom Nook" });
100
+
101
+ expect(accordionLabel).toBeInTheDocument();
102
+ expect(accordionLabel).toHaveAttribute("aria-expanded", "true");
103
+ });
104
+
105
+ it("opens the accordion when the label is clicked", () => {
106
+ render(<Accordion contentData={[contentData[0]]} />);
107
+
108
+ const accordionLabel = screen.getByRole("button", { name: "Tom Nook" });
109
+ expect(accordionLabel).toHaveAttribute("aria-expanded", "false");
110
+ userEvent.click(accordionLabel);
111
+ expect(accordionLabel).toHaveAttribute("aria-expanded", "true");
112
+ });
113
+
114
+ it("renders multiple accordion items grouped together", () => {
115
+ render(<Accordion contentData={contentData} />);
116
+
117
+ const accordion1 = screen.getByRole("button", { name: "Tom Nook" });
118
+ const accordion2 = screen.getByRole("button", { name: "Isabelle" });
119
+ const accordion3 = screen.getByRole("button", { name: "K.K. Slider" });
120
+
121
+ expect(accordion1).toHaveAttribute("aria-expanded", "false");
122
+ expect(accordion2).toHaveAttribute("aria-expanded", "false");
123
+ expect(accordion3).toHaveAttribute("aria-expanded", "false");
124
+ });
125
+
126
+ it("opens each accordion item independently of each other", () => {
127
+ render(<Accordion contentData={contentData} />);
128
+
129
+ const accordion1 = screen.getByRole("button", { name: "Tom Nook" });
130
+ const accordion2 = screen.getByRole("button", { name: "Isabelle" });
131
+ const accordion3 = screen.getByRole("button", { name: "K.K. Slider" });
132
+
133
+ expect(accordion1).toHaveAttribute("aria-expanded", "false");
134
+ expect(accordion2).toHaveAttribute("aria-expanded", "false");
135
+ expect(accordion3).toHaveAttribute("aria-expanded", "false");
136
+
137
+ userEvent.click(accordion1);
138
+ expect(accordion1).toHaveAttribute("aria-expanded", "true");
139
+ expect(accordion2).toHaveAttribute("aria-expanded", "false");
140
+ expect(accordion3).toHaveAttribute("aria-expanded", "false");
141
+
142
+ userEvent.click(accordion2);
143
+ expect(accordion1).toHaveAttribute("aria-expanded", "true");
144
+ expect(accordion2).toHaveAttribute("aria-expanded", "true");
145
+ expect(accordion3).toHaveAttribute("aria-expanded", "false");
33
146
 
34
- expect(screen.getByRole("checkbox")).toBeInTheDocument();
35
- expect(screen.getByLabelText("Click to expand")).toBeInTheDocument();
147
+ userEvent.click(accordion3);
148
+ userEvent.click(accordion1);
149
+ expect(accordion1).toHaveAttribute("aria-expanded", "false");
150
+ expect(accordion2).toHaveAttribute("aria-expanded", "true");
151
+ expect(accordion3).toHaveAttribute("aria-expanded", "true");
36
152
  });
37
153
  });
@@ -1,69 +1,94 @@
1
1
  import * as React from "react";
2
- import bem from "../../utils/bem";
2
+ import {
3
+ Box,
4
+ Accordion as ChakraAccordion,
5
+ AccordionItem,
6
+ AccordionButton,
7
+ AccordionPanel,
8
+ } from "@chakra-ui/react";
9
+
3
10
  import Icon from "../Icons/Icon";
4
- import { IconNames } from "../Icons/IconTypes";
11
+ import { IconNames, IconSizes } from "../Icons/IconTypes";
12
+ import generateUUID from "../../helpers/generateUUID";
13
+
14
+ export interface AccordionContentDataProps {
15
+ label: string;
16
+ panel: string | React.ReactNode;
17
+ }
5
18
 
6
19
  export interface AccordionProps {
7
- /** Inner label on the button that opens the accordion */
8
- accordionLabel?: React.ReactNode;
9
- /** BlockName for use with BEM. See how to work with blockNames and BEM here: http://getbem.com/introduction/ */
10
- blockName?: string;
11
- /** className you can add in addition to 'input' */
12
- className?: string;
13
- /** Whether the accordion is open by default */
14
- defaultOpen?: boolean;
20
+ /** Array of data to display */
21
+ contentData: AccordionContentDataProps[];
15
22
  /** ID that other components can cross reference for accessibility purposes */
16
23
  id?: string;
17
- /** accordionLabel's input ID */
18
- inputId?: string;
19
- /** Modifiers array for use with BEM. See how to work with modifiers and BEM here: http://getbem.com/introduction/ */
20
- modifiers?: string[];
24
+ /** Whether the accordion is open by default only on its initial rendering */
25
+ isDefaultOpen?: boolean;
21
26
  }
22
27
 
23
- /** Accordion component that shows content on toggle */
24
- export default function Accordion(
25
- props: React.PropsWithChildren<AccordionProps>
26
- ) {
27
- const {
28
- modifiers = [],
29
- blockName,
30
- id,
31
- className,
32
- inputId,
33
- defaultOpen = false,
34
- accordionLabel,
35
- children,
36
- } = props;
28
+ /**
29
+ * Get the minus or plus icon depending on whether the accordion
30
+ * is open or closed.
31
+ */
32
+ const getIcon = (isExpanded = false) => {
33
+ const iconName = isExpanded ? IconNames.Minus : IconNames.Plus;
34
+ return <Icon name={iconName} size={IconSizes.Small} />;
35
+ };
37
36
 
38
- return (
39
- <div
40
- id={id}
41
- className={bem("accordion", modifiers, blockName, [className])}
42
- >
43
- <input
44
- id={`accordion-${inputId}`}
45
- className={bem("input", modifiers, "accordion")}
46
- type="checkbox"
47
- defaultChecked={defaultOpen}
48
- />
49
- <label
50
- htmlFor={`accordion-${inputId}`}
51
- className={bem("label", modifiers, "accordion")}
52
- >
53
- {accordionLabel}
54
- <Icon
55
- decorative={true}
56
- name={IconNames.minus}
57
- modifiers={["small", `${IconNames.minus}`]}
58
- />
59
- <Icon
60
- decorative={true}
61
- name={IconNames.plus}
62
- modifiers={["small", `${IconNames.plus}`]}
37
+ /**
38
+ * Returns `AccordionItems` for every accordion object in the data
39
+ * array. This automatically creates the `AccordionButton` and `AccordionPanel`
40
+ * combination that is required for the Chakra `Accordion` component.
41
+ */
42
+ const getElementsFromContentData = (data = []) => {
43
+ // For FAQ-style multiple accordions, the button should be bigger.
44
+ // Otherwise, use the default.
45
+ const multiplePadding = data?.length > 1 ? 4 : null;
46
+
47
+ return data.map((content, index) => {
48
+ // This is done to support both string and DOM element input.
49
+ const panel =
50
+ typeof content.panel === "string" ? (
51
+ <AccordionPanel
52
+ key={index}
53
+ dangerouslySetInnerHTML={{ __html: content.panel }}
63
54
  />
64
- </label>
55
+ ) : (
56
+ <AccordionPanel key={index}>{content.panel}</AccordionPanel>
57
+ );
58
+
59
+ return (
60
+ <AccordionItem key={index}>
61
+ {/* Get the current state to render the correct icon. */}
62
+ {({ isExpanded }) => (
63
+ <>
64
+ <AccordionButton padding={multiplePadding}>
65
+ <Box flex="1" textAlign="left">
66
+ {content.label}
67
+ </Box>
68
+ {getIcon(isExpanded)}
69
+ </AccordionButton>
70
+ {panel}
71
+ </>
72
+ )}
73
+ </AccordionItem>
74
+ );
75
+ });
76
+ };
77
+
78
+ /**
79
+ * Accordion component that shows content on toggle. Can be used to display
80
+ * multiple accordion items together.
81
+ */
82
+ function Accordion(props: React.PropsWithChildren<AccordionProps>) {
83
+ const { contentData, id = generateUUID(), isDefaultOpen = false } = props;
65
84
 
66
- <div className={bem("content", modifiers, "accordion")}>{children}</div>
67
- </div>
85
+ // Pass `0` to open the first accordion in the 0-index based array.
86
+ const openFirstAccordion = isDefaultOpen ? 0 : undefined;
87
+ return (
88
+ <ChakraAccordion id={id} defaultIndex={[openFirstAccordion]} allowMultiple>
89
+ {getElementsFromContentData(contentData)}
90
+ </ChakraAccordion>
68
91
  );
69
92
  }
93
+
94
+ export default Accordion;
@@ -1,4 +1,4 @@
1
- import { Meta, Story, Preview } from "@storybook/addon-docs/blocks";
1
+ import { Meta, Story, Canvas } from "@storybook/addon-docs/blocks";
2
2
  import Autosuggest from "react-autosuggest";
3
3
  import * as stories from "./Autosuggest.stories.tsx";
4
4
  import { getCategory } from "../../utils/componentCategories";
@@ -19,9 +19,9 @@ every input element. Since the suggestion dropdown will appear on top of page co
19
19
  we've added a min-height to make it easier to see the dropdown. This is for demonstration
20
20
  purposes only and you will not need to do this in your application.
21
21
 
22
- <Preview withToolbar>
22
+ <Canvas withToolbar>
23
23
  <Story name="Basic" story={stories.AutosuggestLibrary} />
24
- </Preview>
24
+ </Canvas>
25
25
 
26
26
  ## With custom icons
27
27
 
@@ -34,7 +34,7 @@ typing "c" or "tr" in the following input.
34
34
  const renderSuggestion = (suggestion) => (
35
35
  <span>
36
36
  {suggestion}
37
- <Icon name={IconNames["check"]} decorative={true}></Icon>
37
+ <Icon name={IconNames.Check} />
38
38
  </span>
39
39
  );
40
40
  ```
@@ -29,7 +29,7 @@ const libraryRenderInputComponent = (
29
29
  >
30
30
  Home Library
31
31
  </Label>
32
- <HelperErrorText id="id-helperText" isError={false}>
32
+ <HelperErrorText id="id-helperText" isInvalid={false}>
33
33
  Select your home library. Start by typing the name of the library. Try{" "}
34
34
  {'"'}ba{'"'}.
35
35
  </HelperErrorText>
@@ -99,6 +99,7 @@ const LibraryExample = ({ renderInputComponent }) => {
99
99
  const renderSuggestion = (suggestion) => <span>{suggestion.label}</span>;
100
100
  // Autosuggest will pass through all these props to the Input component.
101
101
  const inputProps = {
102
+ "aria-label": "Home Library",
102
103
  placeholder: "Type a library name",
103
104
  value,
104
105
  onChange,
@@ -168,7 +169,7 @@ const FishExample = () => {
168
169
  const renderSuggestion = (suggestion) => (
169
170
  <span>
170
171
  {suggestion}
171
- <Icon name={IconNames["check"]} decorative={true}></Icon>
172
+ <Icon name={IconNames.Check} />
172
173
  </span>
173
174
  );
174
175
  const getSuggestionValue = (suggestion) => suggestion;