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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (305) hide show
  1. package/CHANGELOG.md +85 -0
  2. package/README.md +10 -10
  3. package/dist/components/Accordion/Accordion.d.ts +1 -1
  4. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +1 -1
  5. package/dist/components/Button/Button.d.ts +2 -2
  6. package/dist/components/Card/Card.d.ts +11 -9
  7. package/dist/components/Checkbox/Checkbox.d.ts +2 -2
  8. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +5 -4
  9. package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +1 -1
  10. package/dist/components/DatePicker/DatePicker.d.ts +5 -6
  11. package/dist/components/Fieldset/Fieldset.d.ts +5 -6
  12. package/dist/components/Form/Form.d.ts +6 -6
  13. package/dist/components/Grid/GridTypes.d.ts +7 -7
  14. package/dist/components/Grid/SimpleGrid.d.ts +1 -1
  15. package/dist/components/Heading/Heading.d.ts +1 -1
  16. package/dist/components/HelperErrorText/HelperErrorText.d.ts +9 -8
  17. package/dist/components/Hero/Hero.d.ts +2 -1
  18. package/dist/components/HorizontalRule/HorizontalRule.d.ts +2 -10
  19. package/dist/components/Icons/Icon.d.ts +2 -1
  20. package/dist/components/Image/Image.d.ts +2 -2
  21. package/dist/components/Label/Label.d.ts +7 -4
  22. package/dist/components/Link/Link.d.ts +1 -1
  23. package/dist/components/List/List.d.ts +11 -11
  24. package/dist/components/List/ListTypes.d.ts +1 -1
  25. package/dist/components/Logo/Logo.d.ts +2 -1
  26. package/dist/components/Logo/LogoSvgs.d.ts +2 -0
  27. package/dist/components/Logo/LogoTypes.d.ts +2 -0
  28. package/dist/components/Modal/Modal.d.ts +28 -8
  29. package/dist/components/Notification/Notification.d.ts +4 -4
  30. package/dist/components/Pagination/Pagination.d.ts +2 -2
  31. package/dist/components/ProgressIndicator/ProgressIndicator.d.ts +3 -3
  32. package/dist/components/Radio/Radio.d.ts +4 -6
  33. package/dist/components/RadioGroup/RadioGroup.d.ts +12 -6
  34. package/dist/components/SearchBar/SearchBar.d.ts +4 -4
  35. package/dist/components/Select/Select.d.ts +10 -6
  36. package/dist/components/Select/SelectTypes.d.ts +4 -0
  37. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +4 -3
  38. package/dist/components/Slider/Slider.d.ts +6 -4
  39. package/dist/components/StatusBadge/StatusBadge.d.ts +5 -1
  40. package/dist/components/StructuredContent/StructuredContent.d.ts +2 -2
  41. package/dist/components/Table/Table.d.ts +1 -1
  42. package/dist/components/Tabs/Tabs.d.ts +4 -3
  43. package/dist/components/Template/Template.d.ts +4 -3
  44. package/dist/components/Text/Text.d.ts +1 -1
  45. package/dist/components/TextInput/TextInput.d.ts +5 -5
  46. package/dist/components/Toggle/Toggle.d.ts +3 -4
  47. package/dist/components/VideoPlayer/VideoPlayer.d.ts +2 -1
  48. package/dist/design-system-react-components.cjs.development.js +1767 -1180
  49. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  50. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  51. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  52. package/dist/design-system-react-components.esm.js +1774 -1188
  53. package/dist/design-system-react-components.esm.js.map +1 -1
  54. package/dist/hooks/useCarouselStyles.d.ts +3 -2
  55. package/dist/hooks/useNYPLTheme.d.ts +12 -0
  56. package/dist/index.d.ts +5 -2
  57. package/dist/styles.css +1 -1
  58. package/dist/theme/components/button.d.ts +10 -2
  59. package/dist/theme/components/card.d.ts +42 -22
  60. package/dist/theme/components/checkbox.d.ts +5 -4
  61. package/dist/theme/components/checkboxGroup.d.ts +1 -1
  62. package/dist/theme/components/componentWrapper.d.ts +2 -2
  63. package/dist/theme/components/customTable.d.ts +84 -1
  64. package/dist/theme/components/fieldset.d.ts +4 -14
  65. package/dist/theme/components/global.d.ts +23 -17
  66. package/dist/theme/components/heading.d.ts +53 -0
  67. package/dist/theme/components/helperErrorText.d.ts +1 -0
  68. package/dist/theme/components/hero.d.ts +20 -14
  69. package/dist/theme/components/label.d.ts +9 -10
  70. package/dist/theme/components/list.d.ts +99 -9
  71. package/dist/theme/components/radio.d.ts +6 -4
  72. package/dist/theme/components/radioGroup.d.ts +1 -1
  73. package/dist/theme/components/select.d.ts +28 -5
  74. package/dist/theme/components/skeletonLoader.d.ts +2 -2
  75. package/dist/theme/components/slider.d.ts +6 -3
  76. package/dist/theme/components/structuredContent.d.ts +197 -0
  77. package/dist/theme/components/textInput.d.ts +18 -6
  78. package/dist/theme/components/toggle.d.ts +7 -4
  79. package/dist/theme/foundations/global.d.ts +2 -0
  80. package/dist/theme/foundations/radii.d.ts +1 -0
  81. package/dist/theme/foundations/spacing.d.ts +46 -43
  82. package/package.json +17 -19
  83. package/src/components/Accordion/Accordion.stories.mdx +9 -9
  84. package/src/components/Accordion/Accordion.test.tsx +21 -0
  85. package/src/components/Accordion/Accordion.tsx +13 -9
  86. package/src/components/Accordion/__snapshots__/Accordion.test.tsx.snap +276 -27
  87. package/src/components/Autosuggest/Autosuggest.stories.mdx +4 -3
  88. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +21 -5
  89. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +52 -31
  90. package/src/components/Breadcrumbs/Breadcrumbs.tsx +8 -7
  91. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +211 -12
  92. package/src/components/Button/Button.stories.mdx +87 -23
  93. package/src/components/Button/Button.test.tsx +25 -0
  94. package/src/components/Button/Button.tsx +18 -7
  95. package/src/components/Button/__snapshots__/Button.test.tsx.snap +27 -7
  96. package/src/components/Card/Card.stories.mdx +287 -194
  97. package/src/components/Card/Card.test.tsx +102 -0
  98. package/src/components/Card/Card.tsx +73 -32
  99. package/src/components/Card/__snapshots__/Card.test.tsx.snap +196 -36
  100. package/src/components/Chakra/Grid.stories.mdx +4 -4
  101. package/src/components/Checkbox/Checkbox.stories.mdx +62 -10
  102. package/src/components/Checkbox/Checkbox.test.tsx +32 -9
  103. package/src/components/Checkbox/Checkbox.tsx +20 -15
  104. package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +134 -7
  105. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +65 -17
  106. package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +137 -81
  107. package/src/components/CheckboxGroup/CheckboxGroup.tsx +31 -21
  108. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +332 -97
  109. package/src/components/ComponentWrapper/ComponentWrapper.test.tsx +12 -0
  110. package/src/components/ComponentWrapper/ComponentWrapper.tsx +39 -41
  111. package/src/components/ComponentWrapper/__snapshots__/ComponentWrapper.test.tsx.snap +47 -34
  112. package/src/components/DatePicker/DatePicker.stories.mdx +63 -27
  113. package/src/components/DatePicker/DatePicker.test.tsx +89 -13
  114. package/src/components/DatePicker/DatePicker.tsx +62 -56
  115. package/src/components/DatePicker/_DatePicker.scss +71 -13
  116. package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +250 -206
  117. package/src/components/Fieldset/Fieldset.stories.mdx +33 -3
  118. package/src/components/Fieldset/Fieldset.test.tsx +58 -28
  119. package/src/components/Fieldset/Fieldset.tsx +35 -30
  120. package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +40 -19
  121. package/src/components/Form/Form.stories.mdx +72 -39
  122. package/src/components/Form/Form.test.tsx +58 -15
  123. package/src/components/Form/Form.tsx +89 -67
  124. package/src/components/Form/__snapshots__/Form.test.tsx.snap +83 -5
  125. package/src/components/Grid/GridTypes.tsx +7 -7
  126. package/src/components/Grid/SimpleGrid.stories.mdx +34 -6
  127. package/src/components/Grid/SimpleGrid.test.tsx +9 -0
  128. package/src/components/Grid/SimpleGrid.tsx +29 -20
  129. package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +16 -1
  130. package/src/components/Heading/Heading.stories.mdx +36 -3
  131. package/src/components/Heading/Heading.test.tsx +10 -0
  132. package/src/components/Heading/Heading.tsx +56 -50
  133. package/src/components/Heading/__snapshots__/Heading.test.tsx.snap +26 -7
  134. package/src/components/HelperErrorText/HelperErrorText.stories.mdx +64 -42
  135. package/src/components/HelperErrorText/HelperErrorText.test.tsx +15 -0
  136. package/src/components/HelperErrorText/HelperErrorText.tsx +40 -35
  137. package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +35 -4
  138. package/src/components/Hero/Hero.stories.mdx +125 -95
  139. package/src/components/Hero/Hero.test.tsx +33 -0
  140. package/src/components/Hero/Hero.tsx +135 -126
  141. package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +89 -17
  142. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +26 -4
  143. package/src/components/HorizontalRule/HorizontalRule.test.tsx +9 -19
  144. package/src/components/HorizontalRule/HorizontalRule.tsx +9 -26
  145. package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +18 -5
  146. package/src/components/Icons/Icon.stories.mdx +31 -6
  147. package/src/components/Icons/Icon.test.tsx +38 -0
  148. package/src/components/Icons/Icon.tsx +93 -76
  149. package/src/components/Icons/__snapshots__/Icon.test.tsx.snap +129 -0
  150. package/src/components/Image/Image.stories.mdx +29 -5
  151. package/src/components/Image/Image.test.tsx +8 -0
  152. package/src/components/Image/Image.tsx +38 -26
  153. package/src/components/Image/__snapshots__/Image.test.tsx.snap +24 -8
  154. package/src/components/Label/Label.stories.mdx +42 -20
  155. package/src/components/Label/Label.test.tsx +42 -17
  156. package/src/components/Label/Label.tsx +22 -13
  157. package/src/components/Label/__snapshots__/Label.test.tsx.snap +19 -15
  158. package/src/components/Link/Link.stories.mdx +25 -15
  159. package/src/components/Link/Link.test.tsx +21 -22
  160. package/src/components/Link/Link.tsx +8 -8
  161. package/src/components/Link/__snapshots__/Link.test.tsx.snap +37 -11
  162. package/src/components/List/List.stories.mdx +75 -40
  163. package/src/components/List/List.test.tsx +67 -19
  164. package/src/components/List/List.tsx +38 -25
  165. package/src/components/List/ListTypes.tsx +1 -1
  166. package/src/components/List/__snapshots__/List.test.tsx.snap +110 -8
  167. package/src/components/Logo/Logo.stories.mdx +30 -6
  168. package/src/components/Logo/Logo.test.tsx +17 -0
  169. package/src/components/Logo/Logo.tsx +18 -6
  170. package/src/components/Logo/LogoSvgs.tsx +4 -0
  171. package/src/components/Logo/LogoTypes.tsx +2 -0
  172. package/src/components/Logo/__snapshots__/Logo.test.tsx.snap +73 -2
  173. package/src/components/Modal/Modal.stories.mdx +256 -136
  174. package/src/components/Modal/Modal.test.tsx +151 -9
  175. package/src/components/Modal/Modal.tsx +140 -20
  176. package/src/components/Modal/__snapshots__/Modal.test.tsx.snap +25 -0
  177. package/src/components/Notification/Notification.stories.mdx +25 -1
  178. package/src/components/Notification/Notification.test.tsx +23 -0
  179. package/src/components/Notification/Notification.tsx +46 -44
  180. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +158 -29
  181. package/src/components/Pagination/Pagination.stories.mdx +25 -6
  182. package/src/components/Pagination/Pagination.test.tsx +25 -0
  183. package/src/components/Pagination/Pagination.tsx +6 -6
  184. package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +244 -27
  185. package/src/components/Placeholder/Placeholder.tsx +3 -1
  186. package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +76 -10
  187. package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +81 -11
  188. package/src/components/ProgressIndicator/ProgressIndicator.tsx +17 -9
  189. package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +101 -14
  190. package/src/components/Radio/Radio.stories.mdx +64 -12
  191. package/src/components/Radio/Radio.test.tsx +28 -8
  192. package/src/components/Radio/Radio.tsx +66 -63
  193. package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +103 -6
  194. package/src/components/RadioGroup/RadioGroup.stories.mdx +224 -89
  195. package/src/components/RadioGroup/RadioGroup.test.tsx +122 -62
  196. package/src/components/RadioGroup/RadioGroup.tsx +106 -100
  197. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +1236 -1020
  198. package/src/components/SearchBar/SearchBar.stories.mdx +101 -36
  199. package/src/components/SearchBar/{SearchBar.Test.tsx → SearchBar.test.tsx} +46 -4
  200. package/src/components/SearchBar/SearchBar.tsx +17 -8
  201. package/src/components/SearchBar/__snapshots__/SearchBar.test.tsx.snap +1039 -0
  202. package/src/components/Select/Select.stories.mdx +128 -49
  203. package/src/components/Select/Select.test.tsx +63 -16
  204. package/src/components/Select/Select.tsx +131 -92
  205. package/src/components/Select/SelectTypes.tsx +5 -0
  206. package/src/components/Select/__snapshots__/Select.test.tsx.snap +765 -425
  207. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +42 -10
  208. package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +8 -0
  209. package/src/components/SkeletonLoader/SkeletonLoader.tsx +76 -72
  210. package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +169 -10
  211. package/src/components/Slider/Slider.stories.mdx +91 -42
  212. package/src/components/Slider/Slider.test.tsx +65 -17
  213. package/src/components/Slider/Slider.tsx +26 -19
  214. package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +403 -226
  215. package/src/components/StatusBadge/StatusBadge.stories.mdx +19 -1
  216. package/src/components/StatusBadge/StatusBadge.test.tsx +16 -0
  217. package/src/components/StatusBadge/StatusBadge.tsx +25 -20
  218. package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +22 -3
  219. package/src/components/StructuredContent/StructuredContent.stories.mdx +131 -12
  220. package/src/components/StructuredContent/StructuredContent.test.tsx +34 -0
  221. package/src/components/StructuredContent/StructuredContent.tsx +80 -75
  222. package/src/components/StructuredContent/__snapshots__/StructuredContent.test.tsx.snap +102 -17
  223. package/src/components/StyleGuide/Bidirectionality.stories.mdx +5 -5
  224. package/src/components/StyleGuide/Breakpoints.stories.mdx +6 -6
  225. package/src/components/StyleGuide/Buttons.stories.mdx +2 -12
  226. package/src/components/StyleGuide/ColorCard.tsx +1 -1
  227. package/src/components/StyleGuide/Colors.stories.mdx +1 -2
  228. package/src/components/StyleGuide/DesignTokens.stories.mdx +56 -26
  229. package/src/components/StyleGuide/Forms.stories.mdx +27 -12
  230. package/src/components/StyleGuide/Iconography.stories.mdx +2 -12
  231. package/src/components/StyleGuide/Spacing.stories.mdx +80 -41
  232. package/src/components/StyleGuide/Typography.stories.mdx +30 -21
  233. package/src/components/Table/Table.stories.mdx +38 -11
  234. package/src/components/Table/Table.test.tsx +15 -0
  235. package/src/components/Table/Table.tsx +7 -7
  236. package/src/components/Table/__snapshots__/Table.test.tsx.snap +408 -5
  237. package/src/components/Tabs/Tabs.stories.mdx +52 -3
  238. package/src/components/Tabs/Tabs.test.tsx +16 -0
  239. package/src/components/Tabs/Tabs.tsx +10 -6
  240. package/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap +394 -5
  241. package/src/components/Template/Template.stories.mdx +47 -43
  242. package/src/components/Template/Template.test.tsx +33 -0
  243. package/src/components/Template/Template.tsx +65 -60
  244. package/src/components/Template/__snapshots__/Template.test.tsx.snap +191 -20
  245. package/src/components/Text/Text.stories.mdx +20 -1
  246. package/src/components/Text/Text.test.tsx +12 -0
  247. package/src/components/Text/Text.tsx +6 -4
  248. package/src/components/Text/__snapshots__/Text.test.tsx.snap +21 -4
  249. package/src/components/TextInput/TextInput.stories.mdx +65 -19
  250. package/src/components/TextInput/TextInput.test.tsx +42 -28
  251. package/src/components/TextInput/TextInput.tsx +121 -113
  252. package/src/components/TextInput/__snapshots__/TextInput.test.tsx.snap +96 -73
  253. package/src/components/Toggle/Toggle.stories.mdx +80 -22
  254. package/src/components/Toggle/Toggle.test.tsx +27 -9
  255. package/src/components/Toggle/Toggle.tsx +22 -18
  256. package/src/components/Toggle/__snapshots__/Toggle.test.tsx.snap +128 -5
  257. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +52 -4
  258. package/src/components/VideoPlayer/VideoPlayer.test.tsx +23 -0
  259. package/src/components/VideoPlayer/VideoPlayer.tsx +133 -126
  260. package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +81 -39
  261. package/src/docs/Chakra.stories.mdx +50 -9
  262. package/src/docs/Welcome.stories.mdx +160 -41
  263. package/src/hooks/useCarouselStyles.stories.mdx +22 -2
  264. package/src/hooks/useCarouselStyles.ts +3 -2
  265. package/src/hooks/useNYPLTheme.stories.mdx +101 -0
  266. package/src/hooks/useNYPLTheme.ts +30 -6
  267. package/src/hooks/useWindowSize.stories.mdx +23 -0
  268. package/src/index.ts +5 -2
  269. package/src/styles/base/_place-holder.scss +1 -1
  270. package/src/styles.scss +0 -1
  271. package/src/theme/components/button.ts +15 -7
  272. package/src/theme/components/card.ts +30 -19
  273. package/src/theme/components/checkbox.ts +10 -8
  274. package/src/theme/components/checkboxGroup.ts +1 -1
  275. package/src/theme/components/componentWrapper.ts +2 -2
  276. package/src/theme/components/customTable.ts +39 -31
  277. package/src/theme/components/fieldset.ts +1 -2
  278. package/src/theme/components/global.ts +25 -20
  279. package/src/theme/components/heading.ts +1 -1
  280. package/src/theme/components/helperErrorText.ts +1 -0
  281. package/src/theme/components/hero.ts +13 -15
  282. package/src/theme/components/label.ts +4 -3
  283. package/src/theme/components/list.ts +73 -66
  284. package/src/theme/components/notification.ts +2 -2
  285. package/src/theme/components/radio.ts +9 -9
  286. package/src/theme/components/radioGroup.ts +1 -1
  287. package/src/theme/components/select.ts +31 -22
  288. package/src/theme/components/skeletonLoader.ts +3 -3
  289. package/src/theme/components/slider.ts +8 -7
  290. package/src/theme/components/statusBadge.ts +2 -2
  291. package/src/theme/components/structuredContent.ts +66 -1
  292. package/src/theme/components/tabs.ts +2 -2
  293. package/src/theme/components/template.ts +9 -9
  294. package/src/theme/components/textInput.ts +13 -12
  295. package/src/theme/components/toggle.ts +17 -10
  296. package/src/theme/components/videoPlayer.ts +1 -1
  297. package/src/theme/foundations/colors.ts +1 -1
  298. package/src/theme/foundations/radii.ts +1 -0
  299. package/src/theme/foundations/spacing.ts +70 -22
  300. package/src/theme/foundations/typography.ts +2 -2
  301. package/src/utils/componentCategories.ts +1 -2
  302. package/dist/components/SearchBar/SearchBar.Test.d.ts +0 -1
  303. package/dist/helpers/generateUUID.d.ts +0 -1
  304. package/src/components/Modal/_Modal.scss +0 -18
  305. package/src/helpers/generateUUID.tsx +0 -5
@@ -1,34 +1,154 @@
1
+ import {
2
+ chakra,
3
+ Modal as ChakraModal,
4
+ ModalOverlay,
5
+ ModalContent,
6
+ ModalHeader,
7
+ ModalFooter,
8
+ ModalBody,
9
+ ModalCloseButton,
10
+ useDisclosure,
11
+ ButtonGroup,
12
+ } from "@chakra-ui/react";
1
13
  import * as React from "react";
2
14
 
3
- export interface ModalProps {
4
- /** ClassName that appears in addition to "modal" */
5
- className?: string;
15
+ import Button from "../Button/Button";
16
+ import useWindowSize from "../../hooks/useWindowSize";
17
+
18
+ interface BaseModalProps {
19
+ bodyContent?: string | JSX.Element;
20
+ closeButtonLabel?: string;
21
+ headingText?: string | JSX.Element;
6
22
  /** ID that other components can cross reference for accessibility purposes */
7
23
  id?: string;
24
+ isOpen?: boolean;
25
+ onClose?: () => void;
8
26
  }
9
27
 
10
- /** Full-screen modal that appears on top of the body of the page. */
11
- export default class Modal extends React.Component<ModalProps, any> {
12
- componentDidMount() {
13
- document.body.classList.add("no-scroll");
14
- }
15
-
16
- componentWillUnmount() {
17
- document.body.classList.remove("no-scroll");
18
- }
28
+ export interface ModalProps {
29
+ buttonText?: string;
30
+ /** ID that other components can cross reference for accessibility purposes */
31
+ id?: string;
32
+ modalProps: BaseModalProps;
33
+ }
19
34
 
20
- render() {
21
- const { id, className } = this.props;
35
+ const BaseModal = chakra(
36
+ ({
37
+ bodyContent,
38
+ closeButtonLabel = "Close",
39
+ headingText,
40
+ id,
41
+ isOpen,
42
+ onClose,
43
+ ...rest
44
+ }: React.PropsWithChildren<BaseModalProps>) => {
45
+ // Based on --nypl-breakpoint-medium
46
+ const breakpointMedium = 600;
47
+ const defaultSize = "xl";
48
+ const fullSize = "full";
49
+ const [size, setSize] = React.useState<string>(defaultSize);
50
+ const windowDimensions = useWindowSize();
51
+ React.useEffect(() => {
52
+ if (windowDimensions.width <= breakpointMedium) {
53
+ setSize(fullSize);
54
+ } else {
55
+ setSize(defaultSize);
56
+ }
57
+ }, [windowDimensions.width]);
22
58
 
23
59
  return (
24
- <div
25
- // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex
26
- tabIndex={0}
27
- className={`modal ${className}`}
60
+ <ChakraModal
28
61
  id={id}
62
+ isOpen={isOpen}
63
+ onClose={onClose}
64
+ scrollBehavior="inside"
65
+ size={size}
66
+ {...rest}
29
67
  >
30
- {this.props.children}
31
- </div>
68
+ <ModalOverlay />
69
+ <ModalContent>
70
+ <ModalHeader>{headingText}</ModalHeader>
71
+ <ModalCloseButton />
72
+ <ModalBody>{bodyContent}</ModalBody>
73
+
74
+ <ModalFooter>
75
+ <ButtonGroup>
76
+ <Button id="modal-close-btn" onClick={onClose}>
77
+ {closeButtonLabel}
78
+ </Button>
79
+ </ButtonGroup>
80
+ </ModalFooter>
81
+ </ModalContent>
82
+ </ChakraModal>
83
+ );
84
+ }
85
+ );
86
+
87
+ /**
88
+ * The `ModalTrigger` component renders a button that you click to open the
89
+ * internal `Modal` component. Note that props to update the internal `Modal`
90
+ * component are passed through to the `modalProps` prop.
91
+ */
92
+ export const ModalTrigger = chakra(
93
+ ({
94
+ buttonText,
95
+ id,
96
+ modalProps,
97
+ ...rest
98
+ }: React.PropsWithChildren<ModalProps>) => {
99
+ const { isOpen, onOpen, onClose } = useDisclosure();
100
+ const finalOnCloseHandler = () => {
101
+ modalProps.onClose && modalProps.onClose();
102
+ onClose();
103
+ };
104
+ return (
105
+ <>
106
+ <Button id="modal-open-btn" onClick={onOpen}>
107
+ {buttonText}
108
+ </Button>
109
+
110
+ <BaseModal
111
+ bodyContent={modalProps.bodyContent}
112
+ closeButtonLabel={modalProps.closeButtonLabel}
113
+ headingText={modalProps.headingText}
114
+ id={id}
115
+ isOpen={isOpen}
116
+ onClose={finalOnCloseHandler}
117
+ {...rest}
118
+ />
119
+ </>
32
120
  );
33
121
  }
122
+ );
123
+
124
+ /**
125
+ * This hook function can be used to render the `Modal` component with a custom
126
+ * open button(s) and optional custom close button(s). You must render your own
127
+ * button and pass the appropriate `onOpen` and ` handler for the modal to open.
128
+ */
129
+ export function useModal() {
130
+ const { isOpen, onClose, onOpen } = useDisclosure();
131
+ const Modal = chakra(
132
+ ({
133
+ bodyContent,
134
+ closeButtonLabel,
135
+ headingText,
136
+ id,
137
+ ...rest
138
+ }: React.PropsWithChildren<BaseModalProps>) => {
139
+ return (
140
+ <BaseModal
141
+ bodyContent={bodyContent}
142
+ closeButtonLabel={closeButtonLabel}
143
+ headingText={headingText}
144
+ id={id}
145
+ isOpen={isOpen}
146
+ onClose={onClose}
147
+ {...rest}
148
+ />
149
+ );
150
+ }
151
+ );
152
+
153
+ return { onClose, onOpen, Modal };
34
154
  }
@@ -0,0 +1,25 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`ModalTrigger renders the UI snapshot correctly 1`] = `
4
+ <button
5
+ className="chakra-button css-1xdhyk6"
6
+ data-testid="button"
7
+ id="modal-open-btn"
8
+ onClick={[Function]}
9
+ type="button"
10
+ >
11
+ Button Text
12
+ </button>
13
+ `;
14
+
15
+ exports[`useModal renders the UI snapshot correctly 1`] = `
16
+ <button
17
+ className="chakra-button css-1xdhyk6"
18
+ data-testid="button"
19
+ id="1"
20
+ onClick={[Function]}
21
+ type="button"
22
+ >
23
+ Open Modal
24
+ </button>
25
+ `;
@@ -59,7 +59,18 @@ export const enumValues = getStorybookEnumValues(
59
59
  | Component Version | DS Version |
60
60
  | ----------------- | ---------- |
61
61
  | Added | `0.23.2` |
62
- | Latest | `0.25.13` |
62
+ | Latest | `0.26.0` |
63
+
64
+ ## Table of Contents
65
+
66
+ - [Overview](#overview)
67
+ - [Component Props](#component-props)
68
+ - [Accessibility](#accessibility)
69
+ - [Variants](#variants)
70
+ - [Custom Icon](#custom-icon)
71
+ - [Dismissible](#dismissible)
72
+
73
+ ## Overview
63
74
 
64
75
  <Description of={Notification} />
65
76
 
@@ -70,6 +81,8 @@ In the preview below, the border around the `Notification` is not part of the
70
81
  component. It has been added to help illustrate how the `Notification` sits
71
82
  within a parent element.
72
83
 
84
+ ## Component Props
85
+
73
86
  <Canvas>
74
87
  <Story
75
88
  name="Notification with Controls"
@@ -118,11 +131,22 @@ be rendered inside other landmark elements such as the `header` and `footer`
118
131
  landmark elements. Adding a `Notification` component inside an HTML `main` landmark
119
132
  element is acceptable.
120
133
 
134
+ Every `Notification` component must have a unique `aria-label` attribute. This
135
+ is set through the `ariaLabel` prop. A unique `aria-label` value, along with the
136
+ `aside` HTML landmark element, helps screen readers better navigate a page with
137
+ multiple `Notification`s.
138
+
121
139
  Icons rendered in the `Notification` component are decorative by default which
122
140
  means that they are hidden to screen readers. Since the "X" close icon inside the
123
141
  dismissible button is decorative and because there is no discernible text inside
124
142
  the button, an `aria-label` attribute is added to the button.
125
143
 
144
+ Resources:
145
+
146
+ - [MDN Aria: complementary role](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Roles/complementary_role)
147
+ - [Deque Creating Accessible SVGs](https://www.deque.com/blog/creating-accessible-svgs/)
148
+ - [CSS Tricks Accessible SVG Icons](https://css-tricks.com/accessible-svg-icons/)
149
+
126
150
  ## Variants
127
151
 
128
152
  ### With NotificationHeading
@@ -247,6 +247,27 @@ describe("Notification", () => {
247
247
  />
248
248
  )
249
249
  .toJSON();
250
+ const withChakraProps = renderer
251
+ .create(
252
+ <Notification
253
+ id="chakra"
254
+ notificationContent={<>Notification content.</>}
255
+ notificationHeading="Notification Heading"
256
+ p="20px"
257
+ color="ui.error.primary"
258
+ />
259
+ )
260
+ .toJSON();
261
+ const withOtherProps = renderer
262
+ .create(
263
+ <Notification
264
+ id="props"
265
+ notificationContent={<>Notification content.</>}
266
+ notificationHeading="Notification Heading"
267
+ data-testid="props"
268
+ />
269
+ )
270
+ .toJSON();
250
271
 
251
272
  expect(standard).toMatchSnapshot();
252
273
  expect(announcement).toMatchSnapshot();
@@ -255,5 +276,7 @@ describe("Notification", () => {
255
276
  expect(withoutAnIcon).toMatchSnapshot();
256
277
  expect(withoutHeadingAndIcon).toMatchSnapshot();
257
278
  expect(dismissible).toMatchSnapshot();
279
+ expect(withChakraProps).toMatchSnapshot();
280
+ expect(withOtherProps).toMatchSnapshot();
258
281
  });
259
282
  });
@@ -1,5 +1,5 @@
1
+ import { Box, chakra, useMultiStyleConfig } from "@chakra-ui/react";
1
2
  import React, { useState } from "react";
2
- import { Box, useMultiStyleConfig } from "@chakra-ui/react";
3
3
 
4
4
  import Button from "../Button/Button";
5
5
  import { ButtonTypes } from "../Button/ButtonTypes";
@@ -8,8 +8,6 @@ import { HeadingLevels } from "../Heading/HeadingTypes";
8
8
  import Icon from "../Icons/Icon";
9
9
  import { IconColors, IconNames, IconSizes } from "../Icons/IconTypes";
10
10
  import { NotificationTypes } from "./NotificationTypes";
11
- import generateUUID from "../../helpers/generateUUID";
12
-
13
11
  interface BaseProps {
14
12
  /** Optional prop to control text alignment in `NotificationContent` */
15
13
  alignText?: boolean;
@@ -52,66 +50,67 @@ export interface NotificationProps extends BasePropsWithoutAlignText {
52
50
  /**
53
51
  * NotificationHeading child-component.
54
52
  */
55
- export function NotificationHeading(
56
- props: React.PropsWithChildren<BasePropsWithoutAlignText>
57
- ) {
58
- const { children, icon, id, isCentered, notificationType } = props;
59
- const styles = useMultiStyleConfig("NotificationHeading", {
60
- icon,
61
- isCentered,
62
- notificationType,
63
- });
64
- return (
65
- <Box as="header" __css={styles}>
66
- {icon}
67
- <Heading
68
- additionalStyles={styles.heading}
69
- id={`${id}-heading`}
70
- level={HeadingLevels.Four}
71
- >
72
- {children}
73
- </Heading>
74
- </Box>
75
- );
76
- }
53
+ export const NotificationHeading = chakra(
54
+ (props: React.PropsWithChildren<BasePropsWithoutAlignText>) => {
55
+ const { children, icon, id, isCentered, notificationType, ...rest } = props;
56
+ const styles = useMultiStyleConfig("NotificationHeading", {
57
+ icon,
58
+ isCentered,
59
+ notificationType,
60
+ });
61
+ return (
62
+ <Box as="header" __css={styles} {...rest}>
63
+ {icon}
64
+ <Heading
65
+ additionalStyles={styles.heading}
66
+ id={`${id}-heading`}
67
+ level={HeadingLevels.Four}
68
+ >
69
+ {children}
70
+ </Heading>
71
+ </Box>
72
+ );
73
+ }
74
+ );
77
75
 
78
76
  /**
79
77
  * NotificationContent child-component.
80
78
  */
81
- export function NotificationContent(
82
- props: React.PropsWithChildren<BasePropsWithoutIsCentered>
83
- ) {
84
- const { alignText, children, icon, notificationType } = props;
85
- const styles = useMultiStyleConfig("NotificationContent", {
86
- alignText,
87
- icon,
88
- notificationType,
89
- });
90
- return (
91
- <Box __css={styles}>
92
- {icon}
93
- <Box __css={styles.content}>{children}</Box>
94
- </Box>
95
- );
96
- }
79
+ export const NotificationContent = chakra(
80
+ (props: React.PropsWithChildren<BasePropsWithoutIsCentered>) => {
81
+ const { alignText, children, icon, notificationType, ...rest } = props;
82
+ const styles = useMultiStyleConfig("NotificationContent", {
83
+ alignText,
84
+ icon,
85
+ notificationType,
86
+ });
87
+ return (
88
+ <Box __css={styles} {...rest}>
89
+ {icon}
90
+ <Box __css={styles.content}>{children}</Box>
91
+ </Box>
92
+ );
93
+ }
94
+ );
97
95
 
98
96
  /**
99
97
  * Component used to present users with three different levels of notifications:
100
98
  * standard, announcement, and warning.
101
99
  */
102
- export default function Notification(props: NotificationProps) {
100
+ export const Notification = chakra((props: NotificationProps) => {
103
101
  const {
104
102
  ariaLabel,
105
103
  className,
106
104
  dismissible = false,
107
105
  icon,
108
- id = generateUUID(),
106
+ id,
109
107
  isCentered = false,
110
108
  noMargin = false,
111
109
  notificationContent,
112
110
  notificationHeading,
113
111
  notificationType = NotificationTypes.Standard,
114
112
  showIcon = true,
113
+ ...rest
115
114
  } = props;
116
115
  const [isOpen, setIsOpen] = useState(true);
117
116
  const handleClose = () => setIsOpen(false);
@@ -214,6 +213,7 @@ export default function Notification(props: NotificationProps) {
214
213
  data-type={notificationType}
215
214
  id={id}
216
215
  __css={styles}
216
+ {...rest}
217
217
  >
218
218
  <Box __css={styles.container}>
219
219
  {childHeading}
@@ -222,4 +222,6 @@ export default function Notification(props: NotificationProps) {
222
222
  {dismissibleButton}
223
223
  </Box>
224
224
  );
225
- }
225
+ });
226
+
227
+ export default Notification;