@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.
- package/CHANGELOG.md +142 -1
- package/README.md +98 -50
- package/dist/components/Accordion/Accordion.d.ts +14 -14
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +15 -14
- package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +6 -0
- package/dist/components/Button/Button.d.ts +13 -8
- package/dist/components/Button/ButtonTypes.d.ts +3 -1
- package/dist/components/Card/Card.d.ts +36 -52
- package/dist/components/Card/CardTypes.d.ts +2 -17
- package/dist/components/Checkbox/Checkbox.d.ts +17 -13
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +45 -0
- package/dist/components/CheckboxGroup/CheckboxGroupLayoutTypes.d.ts +4 -0
- package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +15 -0
- package/dist/components/DatePicker/DatePicker.d.ts +37 -35
- package/dist/components/Fieldset/Fieldset.d.ts +25 -0
- package/dist/components/Form/Form.d.ts +13 -8
- package/dist/components/Form/FormTypes.d.ts +2 -8
- package/dist/components/Grid/GridTypes.d.ts +9 -0
- package/dist/components/Grid/SimpleGrid.d.ts +14 -0
- package/dist/components/Heading/Heading.d.ts +4 -4
- package/dist/components/HelperErrorText/HelperErrorText.d.ts +17 -14
- package/dist/components/Hero/Hero.d.ts +19 -14
- package/dist/components/Hero/HeroTypes.d.ts +10 -5
- package/dist/components/HorizontalRule/HorizontalRule.d.ts +10 -9
- package/dist/components/Icons/Icon.d.ts +19 -14
- package/dist/components/Icons/IconSvgs.d.ts +11 -0
- package/dist/components/Icons/IconTypes.d.ts +89 -64
- package/dist/components/Image/Image.d.ts +19 -9
- package/dist/components/Image/ImageTypes.d.ts +20 -0
- package/dist/components/Label/Label.d.ts +5 -17
- package/dist/components/Link/Link.d.ts +12 -12
- package/dist/components/List/List.d.ts +19 -14
- package/dist/components/Notification/Notification.d.ts +37 -16
- package/dist/components/Pagination/Pagination.d.ts +16 -13
- package/dist/components/Pagination/Pagination.stories.d.ts +2 -0
- package/dist/components/ProgressIndicator/ProgressIndicator.d.ts +29 -0
- package/dist/components/ProgressIndicator/ProgressIndicatorTypes.d.ts +8 -0
- package/dist/components/Radio/Radio.d.ts +2 -0
- package/dist/components/RadioGroup/RadioGroup.d.ts +4 -2
- package/dist/components/SearchBar/SearchBar.d.ts +45 -27
- package/dist/components/Select/Select.d.ts +34 -35
- package/dist/components/Select/SelectTypes.d.ts +4 -0
- package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +18 -14
- package/dist/components/SkeletonLoader/SkeletonLoaderTypes.d.ts +2 -2
- package/dist/components/Slider/Slider.d.ts +57 -0
- package/dist/components/StatusBadge/StatusBadge.d.ts +8 -6
- package/dist/components/StatusBadge/StatusBadgeTypes.d.ts +5 -0
- package/dist/components/StyleGuide/ColorCard.d.ts +12 -0
- package/dist/components/Tabs/Tabs.d.ts +1 -1
- package/dist/components/Template/Template.d.ts +91 -0
- package/dist/components/Text/Text.d.ts +16 -0
- package/dist/components/Text/TextTypes.d.ts +6 -0
- package/dist/components/TextInput/TextInput.d.ts +44 -31
- package/dist/components/TextInput/TextInputTypes.d.ts +5 -0
- package/dist/components/VideoPlayer/VideoPlayer.d.ts +6 -8
- package/dist/components/VideoPlayer/VideoPlayerTypes.d.ts +2 -2
- package/dist/design-system-react-components.cjs.development.js +6473 -2630
- 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 +6463 -2631
- package/dist/design-system-react-components.esm.js.map +1 -1
- package/dist/hooks/tests/useCarouselStyles.test.d.ts +1 -0
- package/dist/hooks/useCarouselStyles.d.ts +16 -0
- package/dist/hooks/useNYPLTheme.d.ts +54 -0
- package/dist/hooks/useWindowSize.d.ts +10 -0
- package/dist/index.d.ts +19 -7
- package/dist/resources.scss +180 -170
- package/dist/styles.css +1 -1
- package/dist/theme/components/accordion.d.ts +25 -0
- package/dist/theme/components/breadcrumb.d.ts +90 -0
- package/dist/theme/components/button.d.ts +39 -15
- package/dist/theme/components/card.d.ts +168 -0
- package/dist/theme/components/checkbox.d.ts +12 -8
- package/dist/theme/components/checkboxGroup.d.ts +12 -0
- package/dist/theme/components/componentWrapper.d.ts +11 -0
- package/dist/theme/components/datePicker.d.ts +16 -0
- package/dist/theme/components/fieldset.d.ts +27 -0
- package/dist/theme/components/global.d.ts +65 -0
- package/dist/theme/components/globalMixins.d.ts +23 -0
- package/dist/theme/components/heading.d.ts +55 -20
- package/dist/theme/components/helperErrorText.d.ts +10 -0
- package/dist/theme/components/hero.d.ts +493 -0
- package/dist/theme/components/horizontalRule.d.ts +14 -0
- package/dist/theme/components/icon.d.ts +13 -0
- package/dist/theme/components/image.d.ts +31 -0
- package/dist/theme/components/label.d.ts +18 -0
- package/dist/theme/components/link.d.ts +49 -0
- package/dist/theme/components/list.d.ts +89 -0
- package/dist/theme/components/notification.d.ts +75 -0
- package/dist/theme/components/pagination.d.ts +19 -0
- package/dist/theme/components/progressIndicator.d.ts +50 -0
- package/dist/theme/components/radio.d.ts +8 -7
- package/dist/theme/components/radioGroup.d.ts +12 -0
- package/dist/theme/components/searchBar.d.ts +20 -0
- package/dist/theme/components/select.d.ts +67 -0
- package/dist/theme/components/skeletonLoader.d.ts +98 -0
- package/dist/theme/components/slider.d.ts +51 -0
- package/dist/theme/components/statusBadge.d.ts +25 -0
- package/dist/theme/components/tabs.d.ts +63 -12
- package/dist/theme/components/template.d.ts +105 -0
- package/dist/theme/components/text.d.ts +20 -0
- package/dist/theme/components/textInput.d.ts +112 -0
- package/dist/theme/components/videoPlayer.d.ts +40 -0
- package/dist/theme/foundations/breakpoints.d.ts +8 -8
- package/dist/theme/foundations/global.d.ts +8 -0
- package/dist/theme/foundations/radii.d.ts +5 -0
- package/dist/theme/foundations/shadows.d.ts +4 -0
- package/dist/theme/foundations/spacing.d.ts +16 -16
- package/dist/utils/utils.d.ts +6 -0
- package/package.json +72 -82
- package/src/__tests__/setup.ts +2 -2
- package/src/components/Accordion/Accordion.stories.mdx +223 -34
- package/src/components/Accordion/Accordion.test.tsx +135 -19
- package/src/components/Accordion/Accordion.tsx +81 -56
- package/src/components/Autosuggest/Autosuggest.stories.mdx +4 -4
- package/src/components/Autosuggest/Autosuggest.stories.tsx +3 -2
- package/src/components/Autosuggest/_Autosuggest.scss +5 -5
- package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +48 -50
- package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +54 -25
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +75 -73
- package/src/components/Breadcrumbs/BreadcrumbsTypes.tsx +6 -0
- package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +298 -0
- package/src/components/Button/Button.stories.mdx +45 -36
- package/src/components/Button/Button.test.tsx +37 -11
- package/src/components/Button/Button.tsx +22 -34
- package/src/components/Button/ButtonTypes.tsx +2 -0
- package/src/components/Button/__snapshots__/Button.test.tsx.snap +50 -8
- package/src/components/Card/Card.stories.mdx +314 -273
- package/src/components/Card/Card.test.tsx +157 -91
- package/src/components/Card/Card.tsx +195 -145
- package/src/components/Card/CardTypes.tsx +2 -19
- package/src/components/Card/__snapshots__/Card.test.tsx.snap +410 -0
- package/src/components/CardEdition/CardEdition.stories.tsx +26 -53
- package/src/components/CardEdition/CardEdition.test.tsx +23 -31
- package/src/components/CardEdition/_CardEdition.scss +22 -23
- package/src/components/Chakra/Box.stories.mdx +15 -16
- package/src/components/Chakra/Center.stories.mdx +56 -24
- package/src/components/Chakra/Grid.stories.mdx +92 -0
- package/src/components/Chakra/Stack.stories.mdx +38 -21
- package/src/components/Checkbox/Checkbox.stories.mdx +33 -11
- package/src/components/Checkbox/Checkbox.test.tsx +47 -2
- package/src/components/Checkbox/Checkbox.tsx +44 -41
- package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +92 -7
- package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +329 -0
- package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +372 -0
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +152 -0
- package/src/components/CheckboxGroup/CheckboxGroupLayoutTypes.tsx +4 -0
- package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +1326 -0
- package/src/components/ComponentWrapper/ComponentWrapper.tsx +63 -0
- package/src/components/DatePicker/DatePicker.stories.mdx +163 -62
- package/src/components/DatePicker/DatePicker.test.tsx +264 -64
- package/src/components/DatePicker/DatePicker.tsx +165 -134
- package/src/components/DatePicker/_DatePicker.scss +33 -66
- package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +818 -0
- package/src/components/Fieldset/Fieldset.stories.mdx +55 -0
- package/src/components/Fieldset/Fieldset.test.tsx +125 -0
- package/src/components/Fieldset/Fieldset.tsx +52 -0
- package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +68 -0
- package/src/components/Form/Form.stories.mdx +70 -27
- package/src/components/Form/Form.test.tsx +58 -45
- package/src/components/Form/Form.tsx +50 -21
- package/src/components/Form/FormTypes.tsx +3 -8
- package/src/components/Form/__snapshots__/Form.test.tsx.snap +24 -14
- package/src/components/Grid/GridTypes.tsx +9 -0
- package/src/components/Grid/SimpleGrid.stories.mdx +268 -0
- package/src/components/Grid/SimpleGrid.test.tsx +66 -0
- package/src/components/Grid/SimpleGrid.tsx +37 -0
- package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +8 -0
- package/src/components/Heading/Heading.stories.mdx +3 -3
- package/src/components/Heading/Heading.tsx +12 -6
- package/src/components/HelperErrorText/HelperErrorText.stories.mdx +124 -0
- package/src/components/HelperErrorText/HelperErrorText.test.tsx +39 -44
- package/src/components/HelperErrorText/HelperErrorText.tsx +37 -39
- package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +25 -0
- package/src/components/Hero/Hero.stories.mdx +198 -121
- package/src/components/Hero/Hero.test.tsx +537 -107
- package/src/components/Hero/Hero.tsx +79 -92
- package/src/components/Hero/HeroTypes.tsx +18 -5
- package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +307 -0
- package/src/components/HorizontalRule/HorizontalRule.stories.mdx +8 -6
- package/src/components/HorizontalRule/HorizontalRule.test.tsx +33 -28
- package/src/components/HorizontalRule/HorizontalRule.tsx +27 -29
- package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +27 -9
- package/src/components/Icons/Icon.stories.mdx +94 -77
- package/src/components/Icons/Icon.test.tsx +48 -22
- package/src/components/Icons/Icon.tsx +78 -61
- package/src/components/Icons/IconSvgs.tsx +22 -0
- package/src/components/Icons/IconTypes.tsx +91 -64
- package/src/components/Image/Image.stories.mdx +220 -0
- package/src/components/Image/Image.test.tsx +131 -29
- package/src/components/Image/Image.tsx +84 -56
- package/src/components/Image/ImageTypes.ts +22 -0
- package/src/components/Image/__snapshots__/Image.test.tsx.snap +190 -0
- package/src/components/Input/Input.stories.tsx +23 -67
- package/src/components/Input/Input.test.tsx +4 -4
- package/src/components/Input/_Input.scss +23 -14
- package/src/components/Label/Label.stories.mdx +28 -7
- package/src/components/Label/Label.test.tsx +43 -12
- package/src/components/Label/Label.tsx +21 -34
- package/src/components/Label/__snapshots__/Label.test.tsx.snap +41 -0
- package/src/components/Link/Link.stories.mdx +41 -41
- package/src/components/Link/Link.test.tsx +33 -44
- package/src/components/Link/Link.tsx +117 -100
- package/src/components/List/List.stories.mdx +124 -51
- package/src/components/List/List.test.tsx +142 -63
- package/src/components/List/List.tsx +89 -93
- package/src/components/List/__snapshots__/List.test.tsx.snap +109 -0
- package/src/components/Modal/Modal.stories.mdx +3 -3
- package/src/components/Modal/_Modal.scss +2 -2
- package/src/components/Notification/Notification.stories.mdx +119 -111
- package/src/components/Notification/Notification.test.tsx +102 -126
- package/src/components/Notification/Notification.tsx +157 -161
- package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +159 -8
- package/src/components/Pagination/Pagination.stories.mdx +26 -27
- package/src/components/Pagination/Pagination.stories.tsx +11 -16
- package/src/components/Pagination/Pagination.test.tsx +276 -140
- package/src/components/Pagination/Pagination.tsx +174 -154
- package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +285 -0
- package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +292 -0
- package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +225 -0
- package/src/components/ProgressIndicator/ProgressIndicator.tsx +126 -0
- package/src/components/ProgressIndicator/ProgressIndicatorTypes.ts +8 -0
- package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +357 -0
- package/src/components/Radio/Radio.test.tsx +20 -4
- package/src/components/Radio/Radio.tsx +6 -3
- package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +3 -0
- package/src/components/RadioGroup/RadioGroup.stories.mdx +4 -5
- package/src/components/RadioGroup/RadioGroup.test.tsx +24 -1
- package/src/components/RadioGroup/RadioGroup.tsx +21 -29
- package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +42 -72
- package/src/components/SearchBar/SearchBar.Test.tsx +170 -16
- package/src/components/SearchBar/SearchBar.stories.mdx +294 -219
- package/src/components/SearchBar/SearchBar.tsx +161 -46
- package/src/components/Select/Select.stories.mdx +188 -170
- package/src/components/Select/Select.test.tsx +132 -375
- package/src/components/Select/Select.tsx +121 -165
- package/src/components/Select/SelectTypes.tsx +5 -0
- package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +33 -76
- package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +97 -177
- package/src/components/SkeletonLoader/SkeletonLoader.tsx +75 -70
- package/src/components/SkeletonLoader/SkeletonLoaderTypes.tsx +2 -2
- package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +739 -0
- package/src/components/Slider/Slider.stories.mdx +529 -0
- package/src/components/Slider/Slider.test.tsx +653 -0
- package/src/components/Slider/Slider.tsx +303 -0
- package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +1946 -0
- package/src/components/StatusBadge/StatusBadge.stories.mdx +91 -0
- package/src/components/StatusBadge/StatusBadge.test.tsx +35 -7
- package/src/components/StatusBadge/StatusBadge.tsx +24 -25
- package/src/components/StatusBadge/StatusBadgeTypes.tsx +5 -0
- package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +28 -0
- package/src/components/StyleGuide/Bidirectionality.stories.mdx +17 -17
- package/src/components/StyleGuide/Breakpoints.stories.mdx +34 -10
- package/src/components/StyleGuide/Buttons.stories.mdx +102 -86
- package/src/components/StyleGuide/ColorCard.tsx +46 -0
- package/src/components/StyleGuide/Colors.stories.mdx +196 -0
- package/src/components/StyleGuide/DesignTokens.stories.mdx +170 -0
- package/src/components/StyleGuide/Forms.stories.mdx +9 -7
- package/src/components/StyleGuide/Iconography.stories.mdx +119 -127
- package/src/components/StyleGuide/Spacing.stories.mdx +31 -23
- package/src/components/StyleGuide/Typography.stories.mdx +202 -189
- package/src/components/StyleGuide/UIDocCard.tsx +1 -1
- package/src/components/Tabs/Tabs.stories.mdx +73 -11
- package/src/components/Tabs/Tabs.tsx +88 -67
- package/src/components/Template/Template.stories.mdx +572 -0
- package/src/components/Template/Template.test.tsx +124 -0
- package/src/components/Template/Template.tsx +226 -0
- package/src/components/Text/Text.stories.mdx +70 -0
- package/src/components/Text/Text.test.tsx +63 -0
- package/src/components/Text/Text.tsx +55 -0
- package/src/components/Text/TextTypes.tsx +6 -0
- package/src/components/Text/__snapshots__/Text.test.tsx.snap +33 -0
- package/src/components/TextInput/TextInput.stories.mdx +89 -90
- package/src/components/TextInput/TextInput.test.tsx +84 -85
- package/src/components/TextInput/TextInput.tsx +121 -95
- package/src/components/TextInput/TextInputTypes.tsx +8 -0
- package/src/components/VideoPlayer/VideoPlayer.stories.mdx +17 -4
- package/src/components/VideoPlayer/VideoPlayer.test.tsx +54 -53
- package/src/components/VideoPlayer/VideoPlayer.tsx +50 -51
- package/src/components/VideoPlayer/VideoPlayerTypes.tsx +2 -2
- package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +91 -0
- package/src/docs/Chakra.stories.mdx +246 -65
- package/src/docs/Intro.stories.mdx +18 -13
- package/src/hooks/tests/useCarouselStyles.test.ts +140 -0
- package/src/hooks/tests/useNYPLTheme.test.tsx +36 -0
- package/src/hooks/useCarouselStyles.ts +34 -0
- package/src/hooks/useNYPLTheme.ts +67 -0
- package/src/hooks/useWindowSize.ts +40 -0
- package/src/index.ts +39 -16
- package/src/resources.scss +5 -5
- package/src/styles/base/{_02-breakpoints.scss → _01-breakpoints.scss} +9 -10
- package/src/styles/base/{_03-mixins.scss → _02-mixins.scss} +16 -5
- package/src/styles/base/_03-base.scss +25 -0
- package/src/styles/base/{_05-focus.scss → _04-focus.scss} +0 -15
- package/src/styles/base/_place-holder.scss +14 -3
- package/src/styles/{03-space → space}/_space-inline.scss +14 -14
- package/src/styles/{03-space → space}/_space-inset.scss +10 -10
- package/src/styles/space/_space-stack.scss +116 -0
- package/src/styles.scss +13 -62
- package/src/theme/components/accordion.ts +30 -0
- package/src/theme/components/breadcrumb.ts +77 -0
- package/src/theme/components/button.ts +91 -71
- package/src/theme/components/card.ts +174 -0
- package/src/theme/components/checkbox.ts +22 -29
- package/src/theme/components/checkboxGroup.ts +8 -0
- package/src/theme/components/componentWrapper.ts +10 -0
- package/src/theme/components/datePicker.ts +17 -0
- package/src/theme/components/fieldset.ts +18 -0
- package/src/theme/components/global.ts +82 -0
- package/src/theme/components/globalMixins.ts +24 -0
- package/src/theme/components/heading.ts +25 -13
- package/src/theme/components/helperErrorText.ts +9 -0
- package/src/theme/components/hero.ts +240 -0
- package/src/theme/components/horizontalRule.ts +13 -0
- package/src/theme/components/icon.ts +79 -0
- package/src/theme/components/image.ts +116 -0
- package/src/theme/components/label.ts +10 -0
- package/src/theme/components/link.ts +51 -0
- package/src/theme/components/list.ts +73 -0
- package/src/theme/components/notification.ts +93 -0
- package/src/theme/components/pagination.ts +20 -0
- package/src/theme/components/progressIndicator.ts +62 -0
- package/src/theme/components/radio.ts +22 -33
- package/src/theme/components/radioGroup.ts +8 -0
- package/src/theme/components/searchBar.ts +21 -0
- package/src/theme/components/select.ts +53 -0
- package/src/theme/components/skeletonLoader.ts +107 -0
- package/src/theme/components/slider.ts +79 -0
- package/src/theme/components/statusBadge.ts +26 -0
- package/src/theme/components/tabs.ts +102 -69
- package/src/theme/components/template.ts +114 -0
- package/src/theme/components/text.ts +31 -0
- package/src/theme/components/textInput.ts +62 -0
- package/src/theme/components/videoPlayer.ts +49 -0
- package/src/theme/foundations/breakpoints.ts +8 -8
- package/src/theme/foundations/colors.ts +29 -13
- package/src/theme/foundations/global.ts +8 -0
- package/src/theme/foundations/radii.ts +6 -0
- package/src/theme/foundations/shadows.ts +5 -0
- package/src/theme/foundations/spacing.ts +24 -24
- package/src/theme/index.ts +74 -13
- package/src/utils/componentCategories.ts +12 -5
- package/src/utils/utils.ts +13 -0
- package/dist/components/Accordion/Accordion.stories.d.ts +0 -6
- package/dist/components/HelperErrorText/HelperErrorText.stories.d.ts +0 -16
- package/dist/components/Image/Image.stories.d.ts +0 -18
- package/dist/components/List/List.stories.d.ts +0 -7
- package/dist/components/StatusBadge/StatusBadge.stories.d.ts +0 -8
- package/dist/components/StyleGuide/Colors.stories.d.ts +0 -25
- package/dist/components/Template/Template.stories.d.ts +0 -30
- package/dist/theme/components/customRadioGroup.d.ts +0 -17
- package/src/components/Accordion/Accordion.stories.tsx +0 -66
- package/src/components/Accordion/_Accordion.scss +0 -81
- package/src/components/Breadcrumbs/_Breadcrumbs.scss +0 -97
- package/src/components/Button/_Button.scss +0 -56
- package/src/components/Card/_Card.scss +0 -308
- package/src/components/Form/_Form.scss +0 -67
- package/src/components/HelperErrorText/HelperErrorText.stories.tsx +0 -48
- package/src/components/HelperErrorText/_HelperErrorText.scss +0 -9
- package/src/components/Hero/_Hero.scss +0 -256
- package/src/components/HorizontalRule/_HorizontalRule.scss +0 -15
- package/src/components/Icons/_Icons.scss +0 -116
- package/src/components/Image/Image.stories.tsx +0 -54
- package/src/components/Image/_Image.scss +0 -38
- package/src/components/Label/_Label.scss +0 -22
- package/src/components/Link/_Link.scss +0 -73
- package/src/components/List/List.stories.tsx +0 -139
- package/src/components/List/_List.scss +0 -76
- package/src/components/Notification/_Notification.scss +0 -110
- package/src/components/Pagination/_Pagination.scss +0 -40
- package/src/components/SearchBar/_SearchBar.scss +0 -16
- package/src/components/Select/_Select.scss +0 -82
- package/src/components/SkeletonLoader/_SkeletonLoader.scss +0 -142
- package/src/components/StatusBadge/StatusBadge.stories.tsx +0 -34
- package/src/components/StatusBadge/_StatusBadge.scss +0 -23
- package/src/components/StyleGuide/Colors.stories.tsx +0 -289
- package/src/components/Template/Template.stories.tsx +0 -86
- package/src/components/Template/_Template.scss +0 -63
- package/src/components/TextInput/_TextInput.scss +0 -59
- package/src/components/VideoPlayer/_VideoPlayer.scss +0 -38
- package/src/styles/01-colors/_colors-brand.scss +0 -56
- package/src/styles/01-colors/_colors-utility.scss +0 -65
- package/src/styles/02-typography/_type-scale.css +0 -11
- package/src/styles/02-typography/_type-weight.css +0 -7
- package/src/styles/02-typography/_typefaces.css +0 -4
- package/src/styles/03-space/_space-stack.scss +0 -116
- package/src/styles/03-space/_space.css +0 -30
- package/src/styles/base/_04-base.scss +0 -19
- package/src/styles/base/_card-grid.scss +0 -78
- package/src/styles/base/_typography.scss +0 -11
- package/src/theme/components/customRadioGroup.ts +0 -18
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Meta,
|
|
3
|
+
Story,
|
|
4
|
+
Canvas,
|
|
5
|
+
ArgsTable,
|
|
6
|
+
Description,
|
|
7
|
+
} from "@storybook/addon-docs/blocks";
|
|
8
|
+
import { withDesign } from "storybook-addon-designs";
|
|
9
|
+
|
|
10
|
+
import { getCategory } from "../../utils/componentCategories";
|
|
11
|
+
import DSProvider from "../../theme/provider";
|
|
12
|
+
import CheckboxGroup from "./CheckboxGroup";
|
|
13
|
+
import { CheckboxGroupLayoutTypes } from "./CheckboxGroupLayoutTypes";
|
|
14
|
+
import Checkbox from "../Checkbox/Checkbox";
|
|
15
|
+
|
|
16
|
+
<Meta
|
|
17
|
+
title={getCategory("CheckboxGroup")}
|
|
18
|
+
component={CheckboxGroup}
|
|
19
|
+
decorators={[withDesign]}
|
|
20
|
+
parameters={{
|
|
21
|
+
design: {
|
|
22
|
+
type: "figma",
|
|
23
|
+
url:
|
|
24
|
+
"https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=11895%3A658",
|
|
25
|
+
},
|
|
26
|
+
jest: ["CheckboxGroup.test.tsx"],
|
|
27
|
+
}}
|
|
28
|
+
argTypes={{
|
|
29
|
+
children: { table: { disable: true } },
|
|
30
|
+
defaultValue: { table: { disable: true } },
|
|
31
|
+
id: { table: { disable: true } },
|
|
32
|
+
name: { table: { disable: true } },
|
|
33
|
+
onChange: { table: { disable: true } },
|
|
34
|
+
}}
|
|
35
|
+
/>
|
|
36
|
+
|
|
37
|
+
# CheckboxGroup
|
|
38
|
+
|
|
39
|
+
| Component Version | DS Version |
|
|
40
|
+
| ----------------- | ---------- |
|
|
41
|
+
| Added | `0.25.1` |
|
|
42
|
+
| Latest | `0.25.3` |
|
|
43
|
+
|
|
44
|
+
<Description of={CheckboxGroup} />
|
|
45
|
+
|
|
46
|
+
<Canvas withToolbar>
|
|
47
|
+
<Story
|
|
48
|
+
name="CheckboxGroup"
|
|
49
|
+
args={{
|
|
50
|
+
defaultValue: ["4"],
|
|
51
|
+
helperText: "This is the helper text for the full group.",
|
|
52
|
+
invalidText: "This is the error text :(",
|
|
53
|
+
isDisabled: false,
|
|
54
|
+
isInvalid: false,
|
|
55
|
+
isRequired: false,
|
|
56
|
+
labelText: "Standard Checkbox Group",
|
|
57
|
+
layout: CheckboxGroupLayoutTypes.Column,
|
|
58
|
+
name: "checkbox-story",
|
|
59
|
+
optReqFlag: true,
|
|
60
|
+
showHelperInvalidText: true,
|
|
61
|
+
showLabel: true,
|
|
62
|
+
}}
|
|
63
|
+
>
|
|
64
|
+
{(args) => (
|
|
65
|
+
<CheckboxGroup {...args}>
|
|
66
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
67
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
68
|
+
<Checkbox value="4" labelText="Checkbox 4" />
|
|
69
|
+
<Checkbox value="5" labelText="Checkbox 5" />
|
|
70
|
+
</CheckboxGroup>
|
|
71
|
+
)}
|
|
72
|
+
</Story>
|
|
73
|
+
</Canvas>
|
|
74
|
+
|
|
75
|
+
<ArgsTable story="CheckboxGroup" />
|
|
76
|
+
|
|
77
|
+
## Layout Patterns
|
|
78
|
+
|
|
79
|
+
Use the `layout` prop to set the `Checkbox` buttons to display in a column or in
|
|
80
|
+
a row.
|
|
81
|
+
|
|
82
|
+
<Canvas>
|
|
83
|
+
<DSProvider>
|
|
84
|
+
<CheckboxGroup
|
|
85
|
+
labelText="Column (default)"
|
|
86
|
+
name="column-example"
|
|
87
|
+
optReqFlag={false}
|
|
88
|
+
>
|
|
89
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
90
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
91
|
+
<Checkbox value="4" labelText="Checkbox 4" />
|
|
92
|
+
<Checkbox value="5" labelText="Checkbox 5" />
|
|
93
|
+
</CheckboxGroup>
|
|
94
|
+
<br />
|
|
95
|
+
<CheckboxGroup
|
|
96
|
+
labelText="Row"
|
|
97
|
+
name="row-example"
|
|
98
|
+
layout={CheckboxGroupLayoutTypes.Row}
|
|
99
|
+
optReqFlag={false}
|
|
100
|
+
>
|
|
101
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
102
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
103
|
+
<Checkbox value="4" labelText="Checkbox 4" />
|
|
104
|
+
<Checkbox value="5" labelText="Checkbox 5" />
|
|
105
|
+
</CheckboxGroup>
|
|
106
|
+
</DSProvider>
|
|
107
|
+
</Canvas>
|
|
108
|
+
|
|
109
|
+
## Errored
|
|
110
|
+
|
|
111
|
+
<Canvas>
|
|
112
|
+
<DSProvider>
|
|
113
|
+
<CheckboxGroup
|
|
114
|
+
labelText="Errored Checkbox Group"
|
|
115
|
+
name="errored-example"
|
|
116
|
+
optReqFlag={false}
|
|
117
|
+
invalidText="Error message for the full group."
|
|
118
|
+
isInvalid
|
|
119
|
+
>
|
|
120
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
121
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
122
|
+
<Checkbox value="4" labelText="Checkbox 4" />
|
|
123
|
+
<Checkbox value="5" labelText="Checkbox 5" />
|
|
124
|
+
</CheckboxGroup>
|
|
125
|
+
</DSProvider>
|
|
126
|
+
</Canvas>
|
|
127
|
+
|
|
128
|
+
## Disabled
|
|
129
|
+
|
|
130
|
+
<Canvas>
|
|
131
|
+
<DSProvider>
|
|
132
|
+
<CheckboxGroup
|
|
133
|
+
labelText="Disabled Checkbox Group"
|
|
134
|
+
name="disabled-example"
|
|
135
|
+
optReqFlag={false}
|
|
136
|
+
helperText="The reason for being disabled."
|
|
137
|
+
isDisabled
|
|
138
|
+
>
|
|
139
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
140
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
141
|
+
<Checkbox value="4" labelText="Checkbox 4" />
|
|
142
|
+
<Checkbox value="5" labelText="Checkbox 5" />
|
|
143
|
+
</CheckboxGroup>
|
|
144
|
+
</DSProvider>
|
|
145
|
+
</Canvas>
|
|
146
|
+
|
|
147
|
+
## Indeterminate Example
|
|
148
|
+
|
|
149
|
+
The "indeterminate" state can be used when a group of checkboxes are not all
|
|
150
|
+
checked or unchecked. In the following example, if only one child checkebox is
|
|
151
|
+
checked, the parent checkbox will be in the "indeterminate" state. Once both
|
|
152
|
+
children are checked, the parent will be in the "checked" state.
|
|
153
|
+
|
|
154
|
+
The following working example can be used in your application to keep track of
|
|
155
|
+
the checked and indeterminate states - taken and modified from Chakra's
|
|
156
|
+
[Checkbox](https://chakra-ui.com/docs/form/checkbox#indeterminate) documentation.
|
|
157
|
+
Note that this example is specifically using NYPL DS `Checkbox` and
|
|
158
|
+
`CheckboxGroup` components.
|
|
159
|
+
|
|
160
|
+
```tsx
|
|
161
|
+
export function IndeterminateExample() {
|
|
162
|
+
const [checkedItems, setCheckedItems] = React.useState([false, false]);
|
|
163
|
+
const allChecked = checkedItems.every(Boolean);
|
|
164
|
+
const isIndeterminate = checkedItems.some(Boolean) && !allChecked;
|
|
165
|
+
return (
|
|
166
|
+
<CheckboxGroup
|
|
167
|
+
labelText="Indeterminate Example"
|
|
168
|
+
name="indeterminate-example"
|
|
169
|
+
>
|
|
170
|
+
<Checkbox
|
|
171
|
+
isChecked={allChecked}
|
|
172
|
+
isIndeterminate={isIndeterminate}
|
|
173
|
+
onChange={(e) => setCheckedItems([e.target.checked, e.target.checked])}
|
|
174
|
+
labelText="Parent Checkbox"
|
|
175
|
+
/>
|
|
176
|
+
<Checkbox
|
|
177
|
+
isChecked={checkedItems[0]}
|
|
178
|
+
onChange={(e) => setCheckedItems([e.target.checked, checkedItems[1]])}
|
|
179
|
+
labelText="Child Checkbox 1"
|
|
180
|
+
/>
|
|
181
|
+
<Checkbox
|
|
182
|
+
isChecked={checkedItems[1]}
|
|
183
|
+
onChange={(e) => setCheckedItems([checkedItems[0], e.target.checked])}
|
|
184
|
+
labelText="Child Checkbox 2"
|
|
185
|
+
/>
|
|
186
|
+
</CheckboxGroup>
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
export function IndeterminateExample() {
|
|
192
|
+
const [checkedItems, setCheckedItems] = React.useState([false, false]);
|
|
193
|
+
const allChecked = checkedItems.every(Boolean);
|
|
194
|
+
const isIndeterminate = checkedItems.some(Boolean) && !allChecked;
|
|
195
|
+
return (
|
|
196
|
+
<CheckboxGroup
|
|
197
|
+
labelText="Indeterminate Example"
|
|
198
|
+
name="indeterminate-example"
|
|
199
|
+
>
|
|
200
|
+
<Checkbox
|
|
201
|
+
isChecked={allChecked}
|
|
202
|
+
isIndeterminate={isIndeterminate}
|
|
203
|
+
onChange={(e) => setCheckedItems([e.target.checked, e.target.checked])}
|
|
204
|
+
labelText="Parent Checkbox"
|
|
205
|
+
/>
|
|
206
|
+
<Checkbox
|
|
207
|
+
isChecked={checkedItems[0]}
|
|
208
|
+
onChange={(e) => setCheckedItems([e.target.checked, checkedItems[1]])}
|
|
209
|
+
labelText="Child Checkbox 1"
|
|
210
|
+
/>
|
|
211
|
+
<Checkbox
|
|
212
|
+
isChecked={checkedItems[1]}
|
|
213
|
+
onChange={(e) => setCheckedItems([checkedItems[0], e.target.checked])}
|
|
214
|
+
labelText="Child Checkbox 2"
|
|
215
|
+
/>
|
|
216
|
+
</CheckboxGroup>
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
<Canvas>
|
|
221
|
+
<DSProvider>
|
|
222
|
+
<IndeterminateExample />
|
|
223
|
+
</DSProvider>
|
|
224
|
+
</Canvas>
|
|
225
|
+
|
|
226
|
+
## Getting Checkbox Data Values
|
|
227
|
+
|
|
228
|
+
### Controlled Component using `name`, `defaultValue`, and `onChange` props
|
|
229
|
+
|
|
230
|
+
If your application uses controlled React components and the DS CheckboxGroup
|
|
231
|
+
must be controlled, you can extract the data through the `name`, `defaultValue`,
|
|
232
|
+
and `onChange` props. The `onChange` function will be called every time a new
|
|
233
|
+
`Checkbox` value is checked or unchecked.
|
|
234
|
+
|
|
235
|
+
```jsx
|
|
236
|
+
const onChange = (data: string[]) => {
|
|
237
|
+
// This will return the values selected as an array of strings.
|
|
238
|
+
// Ex: ["2", "4"]
|
|
239
|
+
console.log(data);
|
|
240
|
+
};
|
|
241
|
+
// ...
|
|
242
|
+
|
|
243
|
+
// Example of the DS CheckboxGroup instance with the function above:
|
|
244
|
+
<CheckboxGroup
|
|
245
|
+
id="controlled-example"
|
|
246
|
+
labelText="Checkbox Group"
|
|
247
|
+
name="CheckboxExample"
|
|
248
|
+
defaultValue={["2"]}
|
|
249
|
+
onChange={onChange}
|
|
250
|
+
>
|
|
251
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
252
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
253
|
+
<Checkbox value="4" labelText="Checkbox 4" />
|
|
254
|
+
</CheckboxGroup>;
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### Uncontrolled Component using `ref`s
|
|
258
|
+
|
|
259
|
+
If your application uses uncontrolled components, you can pass React `ref` props
|
|
260
|
+
to the DS CheckboxGroup component to get the selected value from the DOM.
|
|
261
|
+
|
|
262
|
+
The following example is using the `register` React `ref` from the
|
|
263
|
+
`react-hook-form` package.
|
|
264
|
+
|
|
265
|
+
```jsx
|
|
266
|
+
import { useFormContext, Controller } from "react-hook-form";
|
|
267
|
+
// ...
|
|
268
|
+
const { register, handleSubmit, control } = useFormContext();
|
|
269
|
+
// ...
|
|
270
|
+
const submitForm = (formData) => {
|
|
271
|
+
// This will return an object with all the DOM element values that were
|
|
272
|
+
// registered with a `name` attribute.
|
|
273
|
+
// {
|
|
274
|
+
// checkboxExample: ["3"]
|
|
275
|
+
// }
|
|
276
|
+
console.log(formData);
|
|
277
|
+
// ...
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
<form
|
|
281
|
+
onSubmit={handleSubmit(submitForm)}
|
|
282
|
+
method="post"
|
|
283
|
+
action="/some/api/endpoint"
|
|
284
|
+
>
|
|
285
|
+
<Controller
|
|
286
|
+
as={
|
|
287
|
+
<CheckboxGroup
|
|
288
|
+
id="uncontrolled-example"
|
|
289
|
+
labelText="Checkbox Group"
|
|
290
|
+
name="checkboxExample"
|
|
291
|
+
defaultValue={["3"]}
|
|
292
|
+
ref={register()}
|
|
293
|
+
>
|
|
294
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
295
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
296
|
+
<Checkbox value="4" labelText="Checkbox 4" />
|
|
297
|
+
</CheckboxGroup>
|
|
298
|
+
}
|
|
299
|
+
name="checkboxExample"
|
|
300
|
+
control={control}
|
|
301
|
+
/>
|
|
302
|
+
</form>;
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
The above is specific to `react-hook-form` but a similar pattern can be used
|
|
306
|
+
with normal React `ref` values.
|
|
307
|
+
|
|
308
|
+
```jsx
|
|
309
|
+
const CheckboxGroupRef = React.createRef<HTMLInputElement>();
|
|
310
|
+
// ...
|
|
311
|
+
<CheckboxGroup
|
|
312
|
+
id="uncontrolled-example"
|
|
313
|
+
labelText="Checkbox Group"
|
|
314
|
+
name="checkboxExample"
|
|
315
|
+
defaultValue={["3"]}
|
|
316
|
+
ref={CheckboxGroupRef}
|
|
317
|
+
>
|
|
318
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
319
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
320
|
+
<Checkbox value="4" labelText="Checkbox 4" />
|
|
321
|
+
</CheckboxGroup>
|
|
322
|
+
|
|
323
|
+
// ...
|
|
324
|
+
// Get the value through:
|
|
325
|
+
const onSubmit = () => {
|
|
326
|
+
// ...
|
|
327
|
+
const CheckboxGroupValue = CheckboxGroupRef.current.value;
|
|
328
|
+
};
|
|
329
|
+
```
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { render, screen } from "@testing-library/react";
|
|
3
|
+
import { axe } from "jest-axe";
|
|
4
|
+
import renderer from "react-test-renderer";
|
|
5
|
+
|
|
6
|
+
import * as generateUUID from "../../helpers/generateUUID";
|
|
7
|
+
import CheckboxGroup from "./CheckboxGroup";
|
|
8
|
+
import Checkbox from "../Checkbox/Checkbox";
|
|
9
|
+
import { CheckboxGroupLayoutTypes } from "./CheckboxGroupLayoutTypes";
|
|
10
|
+
import userEvent from "@testing-library/user-event";
|
|
11
|
+
|
|
12
|
+
describe("Checkbox Accessibility", () => {
|
|
13
|
+
it("passes axe accessibility", async () => {
|
|
14
|
+
const { container } = render(
|
|
15
|
+
<CheckboxGroup labelText="CheckboxGroup example" name="a11y-test">
|
|
16
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
17
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
18
|
+
<Checkbox value="4" labelText="Checkbox 4" />
|
|
19
|
+
<Checkbox value="5" labelText="Checkbox 5" />
|
|
20
|
+
</CheckboxGroup>
|
|
21
|
+
);
|
|
22
|
+
expect(await axe(container)).toHaveNoViolations();
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
describe("Checkbox", () => {
|
|
27
|
+
it("renders with Checkbox inputs and a label", () => {
|
|
28
|
+
render(
|
|
29
|
+
<CheckboxGroup labelText="Test Label" name="test1">
|
|
30
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
31
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
32
|
+
<Checkbox value="4" labelText="Checkbox 4" />
|
|
33
|
+
</CheckboxGroup>
|
|
34
|
+
);
|
|
35
|
+
expect(screen.getByText(/Test Label/i)).toBeInTheDocument();
|
|
36
|
+
expect(screen.getAllByRole("checkbox")).toHaveLength(3);
|
|
37
|
+
expect(screen.getByLabelText("Checkbox 2")).toBeInTheDocument();
|
|
38
|
+
expect(screen.getByLabelText("Checkbox 3")).toBeInTheDocument();
|
|
39
|
+
expect(screen.getByLabelText("Checkbox 4")).toBeInTheDocument();
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("renders with appropriate 'aria-label' attribute and value when 'showLabel' prop is set to false", () => {
|
|
43
|
+
const { rerender } = render(
|
|
44
|
+
<CheckboxGroup labelText="Test Label" name="test2">
|
|
45
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
46
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
47
|
+
<Checkbox value="4" labelText="Checkbox 4" />
|
|
48
|
+
</CheckboxGroup>
|
|
49
|
+
);
|
|
50
|
+
expect(screen.getByTestId("checkbox-group")).not.toHaveAttribute(
|
|
51
|
+
"aria-label",
|
|
52
|
+
"Test Label"
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
rerender(
|
|
56
|
+
<CheckboxGroup labelText="Test Label" name="test2" showLabel={false}>
|
|
57
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
58
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
59
|
+
<Checkbox value="4" labelText="Checkbox 4" />
|
|
60
|
+
</CheckboxGroup>
|
|
61
|
+
);
|
|
62
|
+
expect(screen.getByTestId("checkbox-group")).toHaveAttribute(
|
|
63
|
+
"aria-label",
|
|
64
|
+
"Test Label"
|
|
65
|
+
);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("renders visible helper or error text", () => {
|
|
69
|
+
const { rerender } = render(
|
|
70
|
+
<CheckboxGroup
|
|
71
|
+
labelText="Test Label"
|
|
72
|
+
name="test3"
|
|
73
|
+
helperText="This is the helper text for the full group."
|
|
74
|
+
invalidText="This is the error text :("
|
|
75
|
+
>
|
|
76
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
77
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
78
|
+
<Checkbox value="4" labelText="Checkbox 4" />
|
|
79
|
+
</CheckboxGroup>
|
|
80
|
+
);
|
|
81
|
+
expect(
|
|
82
|
+
screen.getByText("This is the helper text for the full group.")
|
|
83
|
+
).toBeVisible();
|
|
84
|
+
expect(
|
|
85
|
+
screen.queryByText("This is the error text :(")
|
|
86
|
+
).not.toBeInTheDocument();
|
|
87
|
+
|
|
88
|
+
rerender(
|
|
89
|
+
<CheckboxGroup
|
|
90
|
+
labelText="Test Label"
|
|
91
|
+
name="test3"
|
|
92
|
+
helperText="This is the helper text for the full group."
|
|
93
|
+
invalidText="This is the error text :("
|
|
94
|
+
isInvalid
|
|
95
|
+
>
|
|
96
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
97
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
98
|
+
<Checkbox value="4" labelText="Checkbox 4" />
|
|
99
|
+
</CheckboxGroup>
|
|
100
|
+
);
|
|
101
|
+
expect(screen.getByText("This is the error text :(")).toBeVisible();
|
|
102
|
+
expect(
|
|
103
|
+
screen.queryByText("This is the helper text for the full group.")
|
|
104
|
+
).not.toBeInTheDocument();
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it("sets the CheckboxGroup's ID", () => {
|
|
108
|
+
render(
|
|
109
|
+
<CheckboxGroup labelText="Test Label" name="test5" id="some-id">
|
|
110
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
111
|
+
</CheckboxGroup>
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
// The "group" role here is for the `fieldset` element.
|
|
115
|
+
expect(screen.getByRole("group")).toHaveAttribute(
|
|
116
|
+
"id",
|
|
117
|
+
"some-id-checkbox-group"
|
|
118
|
+
);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it("sets the next value through the onChange function", () => {
|
|
122
|
+
let newValue = [];
|
|
123
|
+
const onChange = (value) => {
|
|
124
|
+
newValue = value;
|
|
125
|
+
};
|
|
126
|
+
render(
|
|
127
|
+
<CheckboxGroup
|
|
128
|
+
labelText="Test Label"
|
|
129
|
+
name="getValue"
|
|
130
|
+
defaultValue={["4"]}
|
|
131
|
+
onChange={onChange}
|
|
132
|
+
>
|
|
133
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
134
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
135
|
+
<Checkbox value="4" labelText="Checkbox 4" />
|
|
136
|
+
</CheckboxGroup>
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
expect(newValue).toEqual([]);
|
|
140
|
+
|
|
141
|
+
userEvent.click(screen.getByText("Checkbox 3"));
|
|
142
|
+
// "4" was the initial selected value
|
|
143
|
+
expect(newValue).toEqual(["4", "3"]);
|
|
144
|
+
userEvent.click(screen.getByText("Checkbox 2"));
|
|
145
|
+
expect(newValue).toEqual(["4", "3", "2"]);
|
|
146
|
+
userEvent.click(screen.getByText("Checkbox 3"));
|
|
147
|
+
expect(newValue).toEqual(["4", "2"]);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it("calls the UUID generation function if no id prop value is passed", () => {
|
|
151
|
+
const generateUUIDSpy = jest.spyOn(generateUUID, "default");
|
|
152
|
+
expect(generateUUIDSpy).toHaveBeenCalledTimes(0);
|
|
153
|
+
render(
|
|
154
|
+
<CheckboxGroup labelText="Test Label" name="test6">
|
|
155
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
156
|
+
</CheckboxGroup>
|
|
157
|
+
);
|
|
158
|
+
expect(generateUUIDSpy).toHaveBeenCalledTimes(1);
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it("sets the 'disabled' attribute for all its Checkbox children", () => {
|
|
162
|
+
render(
|
|
163
|
+
<CheckboxGroup labelText="Test Label" name="test7" isDisabled>
|
|
164
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
165
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
166
|
+
<Checkbox value="4" labelText="Checkbox 4" />
|
|
167
|
+
</CheckboxGroup>
|
|
168
|
+
);
|
|
169
|
+
const Checkboxes = screen.getAllByRole("checkbox");
|
|
170
|
+
|
|
171
|
+
expect(Checkboxes).toHaveLength(3);
|
|
172
|
+
expect(Checkboxes[0]).toHaveAttribute("disabled");
|
|
173
|
+
expect(Checkboxes[1]).toHaveAttribute("disabled");
|
|
174
|
+
expect(Checkboxes[2]).toHaveAttribute("disabled");
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
it("sets the 'required' attribute for all its Checkbox children", () => {
|
|
178
|
+
render(
|
|
179
|
+
<CheckboxGroup labelText="Test Label" name="test8" isRequired>
|
|
180
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
181
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
182
|
+
<Checkbox value="4" labelText="Checkbox 4" />
|
|
183
|
+
</CheckboxGroup>
|
|
184
|
+
);
|
|
185
|
+
const Checkboxes = screen.getAllByRole("checkbox");
|
|
186
|
+
|
|
187
|
+
expect(Checkboxes).toHaveLength(3);
|
|
188
|
+
expect(Checkboxes[0]).toHaveAttribute("required");
|
|
189
|
+
expect(Checkboxes[1]).toHaveAttribute("required");
|
|
190
|
+
expect(Checkboxes[2]).toHaveAttribute("required");
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it("sets the error state for all its Checkbox children", () => {
|
|
194
|
+
render(
|
|
195
|
+
<CheckboxGroup
|
|
196
|
+
labelText="Test Label"
|
|
197
|
+
name="test9"
|
|
198
|
+
isInvalid
|
|
199
|
+
invalidText="There's an error!"
|
|
200
|
+
>
|
|
201
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
202
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
203
|
+
<Checkbox value="4" labelText="Checkbox 4" />
|
|
204
|
+
</CheckboxGroup>
|
|
205
|
+
);
|
|
206
|
+
const Checkboxes = screen.getAllByRole("checkbox");
|
|
207
|
+
|
|
208
|
+
expect(Checkboxes).toHaveLength(3);
|
|
209
|
+
expect(Checkboxes[0]).toHaveAttribute("aria-invalid");
|
|
210
|
+
expect(Checkboxes[1]).toHaveAttribute("aria-invalid");
|
|
211
|
+
expect(Checkboxes[2]).toHaveAttribute("aria-invalid");
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
it("does not render the invalid text when 'isInvalid' is true but 'showHelperInvalidText' is false", () => {
|
|
215
|
+
render(
|
|
216
|
+
<CheckboxGroup
|
|
217
|
+
labelText="Test Label"
|
|
218
|
+
name="test9"
|
|
219
|
+
isInvalid
|
|
220
|
+
invalidText="There's an error!"
|
|
221
|
+
showHelperInvalidText={false}
|
|
222
|
+
>
|
|
223
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
224
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
225
|
+
<Checkbox value="4" labelText="Checkbox 4" />
|
|
226
|
+
</CheckboxGroup>
|
|
227
|
+
);
|
|
228
|
+
const Checkboxes = screen.getAllByRole("checkbox");
|
|
229
|
+
|
|
230
|
+
expect(Checkboxes).toHaveLength(3);
|
|
231
|
+
expect(Checkboxes[0]).toHaveAttribute("aria-invalid");
|
|
232
|
+
expect(Checkboxes[1]).toHaveAttribute("aria-invalid");
|
|
233
|
+
expect(Checkboxes[2]).toHaveAttribute("aria-invalid");
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
it("renders the UI snapshot correctly", () => {
|
|
237
|
+
const column = renderer
|
|
238
|
+
.create(
|
|
239
|
+
<CheckboxGroup labelText="column" name="column" id="column">
|
|
240
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
241
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
242
|
+
</CheckboxGroup>
|
|
243
|
+
)
|
|
244
|
+
.toJSON();
|
|
245
|
+
const row = renderer
|
|
246
|
+
.create(
|
|
247
|
+
<CheckboxGroup
|
|
248
|
+
labelText="row"
|
|
249
|
+
name="row"
|
|
250
|
+
id="row"
|
|
251
|
+
layout={CheckboxGroupLayoutTypes.Row}
|
|
252
|
+
>
|
|
253
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
254
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
255
|
+
</CheckboxGroup>
|
|
256
|
+
)
|
|
257
|
+
.toJSON();
|
|
258
|
+
const noLabel = renderer
|
|
259
|
+
.create(
|
|
260
|
+
<CheckboxGroup
|
|
261
|
+
labelText="no label"
|
|
262
|
+
name="noLabel"
|
|
263
|
+
id="noLabel"
|
|
264
|
+
showLabel={false}
|
|
265
|
+
>
|
|
266
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
267
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
268
|
+
</CheckboxGroup>
|
|
269
|
+
)
|
|
270
|
+
.toJSON();
|
|
271
|
+
const helperText = renderer
|
|
272
|
+
.create(
|
|
273
|
+
<CheckboxGroup
|
|
274
|
+
labelText="helperText"
|
|
275
|
+
name="helperText"
|
|
276
|
+
id="helperText"
|
|
277
|
+
helperText="helper text"
|
|
278
|
+
>
|
|
279
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
280
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
281
|
+
</CheckboxGroup>
|
|
282
|
+
)
|
|
283
|
+
.toJSON();
|
|
284
|
+
const invalidText = renderer
|
|
285
|
+
.create(
|
|
286
|
+
<CheckboxGroup
|
|
287
|
+
labelText="invalidText"
|
|
288
|
+
name="invalidText"
|
|
289
|
+
id="invalidText"
|
|
290
|
+
invalidText="error text"
|
|
291
|
+
>
|
|
292
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
293
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
294
|
+
</CheckboxGroup>
|
|
295
|
+
)
|
|
296
|
+
.toJSON();
|
|
297
|
+
const noOptReqLabel = renderer
|
|
298
|
+
.create(
|
|
299
|
+
<CheckboxGroup
|
|
300
|
+
labelText="no optional or required label"
|
|
301
|
+
name="optReq"
|
|
302
|
+
id="optReq"
|
|
303
|
+
optReqFlag={false}
|
|
304
|
+
>
|
|
305
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
306
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
307
|
+
</CheckboxGroup>
|
|
308
|
+
)
|
|
309
|
+
.toJSON();
|
|
310
|
+
const isRequired = renderer
|
|
311
|
+
.create(
|
|
312
|
+
<CheckboxGroup
|
|
313
|
+
labelText="required"
|
|
314
|
+
name="required"
|
|
315
|
+
id="required"
|
|
316
|
+
isRequired
|
|
317
|
+
>
|
|
318
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
319
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
320
|
+
</CheckboxGroup>
|
|
321
|
+
)
|
|
322
|
+
.toJSON();
|
|
323
|
+
const isInvalid = renderer
|
|
324
|
+
.create(
|
|
325
|
+
<CheckboxGroup
|
|
326
|
+
labelText="invalid"
|
|
327
|
+
name="invalid"
|
|
328
|
+
id="invalid"
|
|
329
|
+
isInvalid
|
|
330
|
+
>
|
|
331
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
332
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
333
|
+
</CheckboxGroup>
|
|
334
|
+
)
|
|
335
|
+
.toJSON();
|
|
336
|
+
const isDisabled = renderer
|
|
337
|
+
.create(
|
|
338
|
+
<CheckboxGroup
|
|
339
|
+
labelText="disabled"
|
|
340
|
+
name="disabled"
|
|
341
|
+
id="disabled"
|
|
342
|
+
isDisabled
|
|
343
|
+
>
|
|
344
|
+
<Checkbox value="2" labelText="Checkbox 2" />
|
|
345
|
+
<Checkbox value="3" labelText="Checkbox 3" />
|
|
346
|
+
</CheckboxGroup>
|
|
347
|
+
)
|
|
348
|
+
.toJSON();
|
|
349
|
+
|
|
350
|
+
expect(column).toMatchSnapshot();
|
|
351
|
+
expect(row).toMatchSnapshot();
|
|
352
|
+
expect(noLabel).toMatchSnapshot();
|
|
353
|
+
expect(helperText).toMatchSnapshot();
|
|
354
|
+
expect(invalidText).toMatchSnapshot();
|
|
355
|
+
expect(noOptReqLabel).toMatchSnapshot();
|
|
356
|
+
expect(isRequired).toMatchSnapshot();
|
|
357
|
+
expect(isInvalid).toMatchSnapshot();
|
|
358
|
+
expect(isDisabled).toMatchSnapshot();
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
it("should throw warning when a non-Checkbox component is used as a child", () => {
|
|
362
|
+
const warn = jest.spyOn(console, "warn");
|
|
363
|
+
render(
|
|
364
|
+
<CheckboxGroup labelText="wrong child!" name="wrong" id="wrong-child">
|
|
365
|
+
<p>This is wrong!</p>
|
|
366
|
+
</CheckboxGroup>
|
|
367
|
+
);
|
|
368
|
+
expect(warn).toHaveBeenCalledWith(
|
|
369
|
+
"Only `Checkbox` components are allowed inside the `CheckboxGroup` component."
|
|
370
|
+
);
|
|
371
|
+
});
|
|
372
|
+
});
|