@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.
- package/CHANGELOG.md +85 -0
- package/README.md +10 -10
- package/dist/components/Accordion/Accordion.d.ts +1 -1
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +1 -1
- package/dist/components/Button/Button.d.ts +2 -2
- package/dist/components/Card/Card.d.ts +11 -9
- package/dist/components/Checkbox/Checkbox.d.ts +2 -2
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +5 -4
- package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +1 -1
- package/dist/components/DatePicker/DatePicker.d.ts +5 -6
- package/dist/components/Fieldset/Fieldset.d.ts +5 -6
- package/dist/components/Form/Form.d.ts +6 -6
- package/dist/components/Grid/GridTypes.d.ts +7 -7
- package/dist/components/Grid/SimpleGrid.d.ts +1 -1
- package/dist/components/Heading/Heading.d.ts +1 -1
- package/dist/components/HelperErrorText/HelperErrorText.d.ts +9 -8
- package/dist/components/Hero/Hero.d.ts +2 -1
- package/dist/components/HorizontalRule/HorizontalRule.d.ts +2 -10
- package/dist/components/Icons/Icon.d.ts +2 -1
- package/dist/components/Image/Image.d.ts +2 -2
- package/dist/components/Label/Label.d.ts +7 -4
- package/dist/components/Link/Link.d.ts +1 -1
- package/dist/components/List/List.d.ts +11 -11
- package/dist/components/List/ListTypes.d.ts +1 -1
- package/dist/components/Logo/Logo.d.ts +2 -1
- package/dist/components/Logo/LogoSvgs.d.ts +2 -0
- package/dist/components/Logo/LogoTypes.d.ts +2 -0
- package/dist/components/Modal/Modal.d.ts +28 -8
- package/dist/components/Notification/Notification.d.ts +4 -4
- package/dist/components/Pagination/Pagination.d.ts +2 -2
- package/dist/components/ProgressIndicator/ProgressIndicator.d.ts +3 -3
- package/dist/components/Radio/Radio.d.ts +4 -6
- package/dist/components/RadioGroup/RadioGroup.d.ts +12 -6
- package/dist/components/SearchBar/SearchBar.d.ts +4 -4
- package/dist/components/Select/Select.d.ts +10 -6
- package/dist/components/Select/SelectTypes.d.ts +4 -0
- package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +4 -3
- package/dist/components/Slider/Slider.d.ts +6 -4
- package/dist/components/StatusBadge/StatusBadge.d.ts +5 -1
- package/dist/components/StructuredContent/StructuredContent.d.ts +2 -2
- package/dist/components/Table/Table.d.ts +1 -1
- package/dist/components/Tabs/Tabs.d.ts +4 -3
- package/dist/components/Template/Template.d.ts +4 -3
- package/dist/components/Text/Text.d.ts +1 -1
- package/dist/components/TextInput/TextInput.d.ts +5 -5
- package/dist/components/Toggle/Toggle.d.ts +3 -4
- package/dist/components/VideoPlayer/VideoPlayer.d.ts +2 -1
- package/dist/design-system-react-components.cjs.development.js +1767 -1180
- package/dist/design-system-react-components.cjs.development.js.map +1 -1
- package/dist/design-system-react-components.cjs.production.min.js +1 -1
- package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
- package/dist/design-system-react-components.esm.js +1774 -1188
- package/dist/design-system-react-components.esm.js.map +1 -1
- package/dist/hooks/useCarouselStyles.d.ts +3 -2
- package/dist/hooks/useNYPLTheme.d.ts +12 -0
- package/dist/index.d.ts +5 -2
- package/dist/styles.css +1 -1
- package/dist/theme/components/button.d.ts +10 -2
- package/dist/theme/components/card.d.ts +42 -22
- package/dist/theme/components/checkbox.d.ts +5 -4
- package/dist/theme/components/checkboxGroup.d.ts +1 -1
- package/dist/theme/components/componentWrapper.d.ts +2 -2
- package/dist/theme/components/customTable.d.ts +84 -1
- package/dist/theme/components/fieldset.d.ts +4 -14
- package/dist/theme/components/global.d.ts +23 -17
- package/dist/theme/components/heading.d.ts +53 -0
- package/dist/theme/components/helperErrorText.d.ts +1 -0
- package/dist/theme/components/hero.d.ts +20 -14
- package/dist/theme/components/label.d.ts +9 -10
- package/dist/theme/components/list.d.ts +99 -9
- package/dist/theme/components/radio.d.ts +6 -4
- package/dist/theme/components/radioGroup.d.ts +1 -1
- package/dist/theme/components/select.d.ts +28 -5
- package/dist/theme/components/skeletonLoader.d.ts +2 -2
- package/dist/theme/components/slider.d.ts +6 -3
- package/dist/theme/components/structuredContent.d.ts +197 -0
- package/dist/theme/components/textInput.d.ts +18 -6
- package/dist/theme/components/toggle.d.ts +7 -4
- package/dist/theme/foundations/global.d.ts +2 -0
- package/dist/theme/foundations/radii.d.ts +1 -0
- package/dist/theme/foundations/spacing.d.ts +46 -43
- package/package.json +17 -19
- package/src/components/Accordion/Accordion.stories.mdx +9 -9
- package/src/components/Accordion/Accordion.test.tsx +21 -0
- package/src/components/Accordion/Accordion.tsx +13 -9
- package/src/components/Accordion/__snapshots__/Accordion.test.tsx.snap +276 -27
- package/src/components/Autosuggest/Autosuggest.stories.mdx +4 -3
- package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +21 -5
- package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +52 -31
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +8 -7
- package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +211 -12
- package/src/components/Button/Button.stories.mdx +87 -23
- package/src/components/Button/Button.test.tsx +25 -0
- package/src/components/Button/Button.tsx +18 -7
- package/src/components/Button/__snapshots__/Button.test.tsx.snap +27 -7
- package/src/components/Card/Card.stories.mdx +287 -194
- package/src/components/Card/Card.test.tsx +102 -0
- package/src/components/Card/Card.tsx +73 -32
- package/src/components/Card/__snapshots__/Card.test.tsx.snap +196 -36
- package/src/components/Chakra/Grid.stories.mdx +4 -4
- package/src/components/Checkbox/Checkbox.stories.mdx +62 -10
- package/src/components/Checkbox/Checkbox.test.tsx +32 -9
- package/src/components/Checkbox/Checkbox.tsx +20 -15
- package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +134 -7
- package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +65 -17
- package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +137 -81
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +31 -21
- package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +332 -97
- package/src/components/ComponentWrapper/ComponentWrapper.test.tsx +12 -0
- package/src/components/ComponentWrapper/ComponentWrapper.tsx +39 -41
- package/src/components/ComponentWrapper/__snapshots__/ComponentWrapper.test.tsx.snap +47 -34
- package/src/components/DatePicker/DatePicker.stories.mdx +63 -27
- package/src/components/DatePicker/DatePicker.test.tsx +89 -13
- package/src/components/DatePicker/DatePicker.tsx +62 -56
- package/src/components/DatePicker/_DatePicker.scss +71 -13
- package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +250 -206
- package/src/components/Fieldset/Fieldset.stories.mdx +33 -3
- package/src/components/Fieldset/Fieldset.test.tsx +58 -28
- package/src/components/Fieldset/Fieldset.tsx +35 -30
- package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +40 -19
- package/src/components/Form/Form.stories.mdx +72 -39
- package/src/components/Form/Form.test.tsx +58 -15
- package/src/components/Form/Form.tsx +89 -67
- package/src/components/Form/__snapshots__/Form.test.tsx.snap +83 -5
- package/src/components/Grid/GridTypes.tsx +7 -7
- package/src/components/Grid/SimpleGrid.stories.mdx +34 -6
- package/src/components/Grid/SimpleGrid.test.tsx +9 -0
- package/src/components/Grid/SimpleGrid.tsx +29 -20
- package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +16 -1
- package/src/components/Heading/Heading.stories.mdx +36 -3
- package/src/components/Heading/Heading.test.tsx +10 -0
- package/src/components/Heading/Heading.tsx +56 -50
- package/src/components/Heading/__snapshots__/Heading.test.tsx.snap +26 -7
- package/src/components/HelperErrorText/HelperErrorText.stories.mdx +64 -42
- package/src/components/HelperErrorText/HelperErrorText.test.tsx +15 -0
- package/src/components/HelperErrorText/HelperErrorText.tsx +40 -35
- package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +35 -4
- package/src/components/Hero/Hero.stories.mdx +125 -95
- package/src/components/Hero/Hero.test.tsx +33 -0
- package/src/components/Hero/Hero.tsx +135 -126
- package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +89 -17
- package/src/components/HorizontalRule/HorizontalRule.stories.mdx +26 -4
- package/src/components/HorizontalRule/HorizontalRule.test.tsx +9 -19
- package/src/components/HorizontalRule/HorizontalRule.tsx +9 -26
- package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +18 -5
- package/src/components/Icons/Icon.stories.mdx +31 -6
- package/src/components/Icons/Icon.test.tsx +38 -0
- package/src/components/Icons/Icon.tsx +93 -76
- package/src/components/Icons/__snapshots__/Icon.test.tsx.snap +129 -0
- package/src/components/Image/Image.stories.mdx +29 -5
- package/src/components/Image/Image.test.tsx +8 -0
- package/src/components/Image/Image.tsx +38 -26
- package/src/components/Image/__snapshots__/Image.test.tsx.snap +24 -8
- package/src/components/Label/Label.stories.mdx +42 -20
- package/src/components/Label/Label.test.tsx +42 -17
- package/src/components/Label/Label.tsx +22 -13
- package/src/components/Label/__snapshots__/Label.test.tsx.snap +19 -15
- package/src/components/Link/Link.stories.mdx +25 -15
- package/src/components/Link/Link.test.tsx +21 -22
- package/src/components/Link/Link.tsx +8 -8
- package/src/components/Link/__snapshots__/Link.test.tsx.snap +37 -11
- package/src/components/List/List.stories.mdx +75 -40
- package/src/components/List/List.test.tsx +67 -19
- package/src/components/List/List.tsx +38 -25
- package/src/components/List/ListTypes.tsx +1 -1
- package/src/components/List/__snapshots__/List.test.tsx.snap +110 -8
- package/src/components/Logo/Logo.stories.mdx +30 -6
- package/src/components/Logo/Logo.test.tsx +17 -0
- package/src/components/Logo/Logo.tsx +18 -6
- package/src/components/Logo/LogoSvgs.tsx +4 -0
- package/src/components/Logo/LogoTypes.tsx +2 -0
- package/src/components/Logo/__snapshots__/Logo.test.tsx.snap +73 -2
- package/src/components/Modal/Modal.stories.mdx +256 -136
- package/src/components/Modal/Modal.test.tsx +151 -9
- package/src/components/Modal/Modal.tsx +140 -20
- package/src/components/Modal/__snapshots__/Modal.test.tsx.snap +25 -0
- package/src/components/Notification/Notification.stories.mdx +25 -1
- package/src/components/Notification/Notification.test.tsx +23 -0
- package/src/components/Notification/Notification.tsx +46 -44
- package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +158 -29
- package/src/components/Pagination/Pagination.stories.mdx +25 -6
- package/src/components/Pagination/Pagination.test.tsx +25 -0
- package/src/components/Pagination/Pagination.tsx +6 -6
- package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +244 -27
- package/src/components/Placeholder/Placeholder.tsx +3 -1
- package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +76 -10
- package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +81 -11
- package/src/components/ProgressIndicator/ProgressIndicator.tsx +17 -9
- package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +101 -14
- package/src/components/Radio/Radio.stories.mdx +64 -12
- package/src/components/Radio/Radio.test.tsx +28 -8
- package/src/components/Radio/Radio.tsx +66 -63
- package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +103 -6
- package/src/components/RadioGroup/RadioGroup.stories.mdx +224 -89
- package/src/components/RadioGroup/RadioGroup.test.tsx +122 -62
- package/src/components/RadioGroup/RadioGroup.tsx +106 -100
- package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +1236 -1020
- package/src/components/SearchBar/SearchBar.stories.mdx +101 -36
- package/src/components/SearchBar/{SearchBar.Test.tsx → SearchBar.test.tsx} +46 -4
- package/src/components/SearchBar/SearchBar.tsx +17 -8
- package/src/components/SearchBar/__snapshots__/SearchBar.test.tsx.snap +1039 -0
- package/src/components/Select/Select.stories.mdx +128 -49
- package/src/components/Select/Select.test.tsx +63 -16
- package/src/components/Select/Select.tsx +131 -92
- package/src/components/Select/SelectTypes.tsx +5 -0
- package/src/components/Select/__snapshots__/Select.test.tsx.snap +765 -425
- package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +42 -10
- package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +8 -0
- package/src/components/SkeletonLoader/SkeletonLoader.tsx +76 -72
- package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +169 -10
- package/src/components/Slider/Slider.stories.mdx +91 -42
- package/src/components/Slider/Slider.test.tsx +65 -17
- package/src/components/Slider/Slider.tsx +26 -19
- package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +403 -226
- package/src/components/StatusBadge/StatusBadge.stories.mdx +19 -1
- package/src/components/StatusBadge/StatusBadge.test.tsx +16 -0
- package/src/components/StatusBadge/StatusBadge.tsx +25 -20
- package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +22 -3
- package/src/components/StructuredContent/StructuredContent.stories.mdx +131 -12
- package/src/components/StructuredContent/StructuredContent.test.tsx +34 -0
- package/src/components/StructuredContent/StructuredContent.tsx +80 -75
- package/src/components/StructuredContent/__snapshots__/StructuredContent.test.tsx.snap +102 -17
- package/src/components/StyleGuide/Bidirectionality.stories.mdx +5 -5
- package/src/components/StyleGuide/Breakpoints.stories.mdx +6 -6
- package/src/components/StyleGuide/Buttons.stories.mdx +2 -12
- package/src/components/StyleGuide/ColorCard.tsx +1 -1
- package/src/components/StyleGuide/Colors.stories.mdx +1 -2
- package/src/components/StyleGuide/DesignTokens.stories.mdx +56 -26
- package/src/components/StyleGuide/Forms.stories.mdx +27 -12
- package/src/components/StyleGuide/Iconography.stories.mdx +2 -12
- package/src/components/StyleGuide/Spacing.stories.mdx +80 -41
- package/src/components/StyleGuide/Typography.stories.mdx +30 -21
- package/src/components/Table/Table.stories.mdx +38 -11
- package/src/components/Table/Table.test.tsx +15 -0
- package/src/components/Table/Table.tsx +7 -7
- package/src/components/Table/__snapshots__/Table.test.tsx.snap +408 -5
- package/src/components/Tabs/Tabs.stories.mdx +52 -3
- package/src/components/Tabs/Tabs.test.tsx +16 -0
- package/src/components/Tabs/Tabs.tsx +10 -6
- package/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap +394 -5
- package/src/components/Template/Template.stories.mdx +47 -43
- package/src/components/Template/Template.test.tsx +33 -0
- package/src/components/Template/Template.tsx +65 -60
- package/src/components/Template/__snapshots__/Template.test.tsx.snap +191 -20
- package/src/components/Text/Text.stories.mdx +20 -1
- package/src/components/Text/Text.test.tsx +12 -0
- package/src/components/Text/Text.tsx +6 -4
- package/src/components/Text/__snapshots__/Text.test.tsx.snap +21 -4
- package/src/components/TextInput/TextInput.stories.mdx +65 -19
- package/src/components/TextInput/TextInput.test.tsx +42 -28
- package/src/components/TextInput/TextInput.tsx +121 -113
- package/src/components/TextInput/__snapshots__/TextInput.test.tsx.snap +96 -73
- package/src/components/Toggle/Toggle.stories.mdx +80 -22
- package/src/components/Toggle/Toggle.test.tsx +27 -9
- package/src/components/Toggle/Toggle.tsx +22 -18
- package/src/components/Toggle/__snapshots__/Toggle.test.tsx.snap +128 -5
- package/src/components/VideoPlayer/VideoPlayer.stories.mdx +52 -4
- package/src/components/VideoPlayer/VideoPlayer.test.tsx +23 -0
- package/src/components/VideoPlayer/VideoPlayer.tsx +133 -126
- package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +81 -39
- package/src/docs/Chakra.stories.mdx +50 -9
- package/src/docs/Welcome.stories.mdx +160 -41
- package/src/hooks/useCarouselStyles.stories.mdx +22 -2
- package/src/hooks/useCarouselStyles.ts +3 -2
- package/src/hooks/useNYPLTheme.stories.mdx +101 -0
- package/src/hooks/useNYPLTheme.ts +30 -6
- package/src/hooks/useWindowSize.stories.mdx +23 -0
- package/src/index.ts +5 -2
- package/src/styles/base/_place-holder.scss +1 -1
- package/src/styles.scss +0 -1
- package/src/theme/components/button.ts +15 -7
- package/src/theme/components/card.ts +30 -19
- package/src/theme/components/checkbox.ts +10 -8
- package/src/theme/components/checkboxGroup.ts +1 -1
- package/src/theme/components/componentWrapper.ts +2 -2
- package/src/theme/components/customTable.ts +39 -31
- package/src/theme/components/fieldset.ts +1 -2
- package/src/theme/components/global.ts +25 -20
- package/src/theme/components/heading.ts +1 -1
- package/src/theme/components/helperErrorText.ts +1 -0
- package/src/theme/components/hero.ts +13 -15
- package/src/theme/components/label.ts +4 -3
- package/src/theme/components/list.ts +73 -66
- package/src/theme/components/notification.ts +2 -2
- package/src/theme/components/radio.ts +9 -9
- package/src/theme/components/radioGroup.ts +1 -1
- package/src/theme/components/select.ts +31 -22
- package/src/theme/components/skeletonLoader.ts +3 -3
- package/src/theme/components/slider.ts +8 -7
- package/src/theme/components/statusBadge.ts +2 -2
- package/src/theme/components/structuredContent.ts +66 -1
- package/src/theme/components/tabs.ts +2 -2
- package/src/theme/components/template.ts +9 -9
- package/src/theme/components/textInput.ts +13 -12
- package/src/theme/components/toggle.ts +17 -10
- package/src/theme/components/videoPlayer.ts +1 -1
- package/src/theme/foundations/colors.ts +1 -1
- package/src/theme/foundations/radii.ts +1 -0
- package/src/theme/foundations/spacing.ts +70 -22
- package/src/theme/foundations/typography.ts +2 -2
- package/src/utils/componentCategories.ts +1 -2
- package/dist/components/SearchBar/SearchBar.Test.d.ts +0 -1
- package/dist/helpers/generateUUID.d.ts +0 -1
- package/src/components/Modal/_Modal.scss +0 -18
- 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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
21
|
-
|
|
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
|
-
<
|
|
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
|
-
|
|
31
|
-
|
|
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.
|
|
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
|
|
56
|
-
props: React.PropsWithChildren<BasePropsWithoutAlignText>
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
</
|
|
74
|
-
|
|
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
|
|
82
|
-
props: React.PropsWithChildren<BasePropsWithoutIsCentered>
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
|
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
|
|
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;
|