@nypl/design-system-react-components 1.0.1 → 1.0.2
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 +1428 -3
- package/README.md +391 -3
- package/dist/__tests__/fileMock.d.ts +4 -0
- package/dist/__tests__/setup.d.ts +2 -0
- package/{lib/stories/0-Welcome.stories.d.ts → dist/__tests__/utils/utils.test.d.ts} +1 -1
- package/dist/components/Accordion/Accordion.d.ts +21 -0
- package/dist/components/Autosuggest/Autosuggest.stories.d.ts +4 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +18 -0
- package/dist/components/Button/Button.d.ts +25 -0
- package/dist/components/ButtonGroup/ButtonGroup.d.ts +22 -0
- package/dist/components/Card/Card.d.ts +49 -0
- package/dist/components/Checkbox/Checkbox.d.ts +47 -0
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +49 -0
- package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +29 -0
- package/dist/components/DatePicker/DatePicker.d.ts +81 -0
- package/dist/components/Fieldset/Fieldset.d.ts +22 -0
- package/dist/components/Form/Form.d.ts +29 -0
- package/dist/components/Grid/SimpleGrid.d.ts +17 -0
- package/dist/components/Heading/Heading.d.ts +27 -0
- package/dist/components/HelperErrorText/HelperErrorText.d.ts +29 -0
- package/dist/components/Hero/Hero.d.ts +40 -0
- package/dist/components/HorizontalRule/HorizontalRule.d.ts +11 -0
- package/dist/components/Icons/Icon.d.ts +37 -0
- package/dist/components/Icons/IconSvgs.d.ts +33 -0
- package/dist/components/Image/Image.d.ts +61 -0
- package/dist/components/Label/Label.d.ts +20 -0
- package/dist/components/Link/Link.d.ts +20 -0
- package/dist/components/List/List.d.ts +35 -0
- package/dist/components/Logo/Logo.d.ts +26 -0
- package/dist/components/Logo/LogoSvgs.d.ts +46 -0
- package/dist/components/Modal/Modal.d.ts +33 -0
- package/dist/components/Notification/Notification.d.ts +50 -0
- package/dist/components/Pagination/Pagination.d.ts +27 -0
- package/dist/components/Placeholder/Placeholder.d.ts +10 -0
- package/dist/components/ProgressIndicator/ProgressIndicator.d.ts +30 -0
- package/dist/components/Radio/Radio.d.ts +43 -0
- package/dist/components/RadioGroup/RadioGroup.d.ts +51 -0
- package/dist/components/SearchBar/SearchBar.d.ts +61 -0
- package/dist/components/Select/Select.d.ts +57 -0
- package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +39 -0
- package/dist/components/SkipNavigation/SkipNavigation.d.ts +17 -0
- package/dist/components/Slider/Slider.d.ts +60 -0
- package/dist/components/StatusBadge/StatusBadge.d.ts +16 -0
- package/dist/components/StructuredContent/StructuredContent.d.ts +28 -0
- package/dist/components/StyleGuide/ColorCard.d.ts +12 -0
- package/dist/components/Table/Table.d.ts +29 -0
- package/dist/components/Tabs/Tabs.d.ts +26 -0
- package/dist/components/Template/Template.d.ts +126 -0
- package/dist/components/Text/Text.d.ts +16 -0
- package/dist/components/TextInput/TextInput.d.ts +78 -0
- package/dist/components/Toggle/Toggle.d.ts +42 -0
- package/dist/components/VideoPlayer/VideoPlayer.d.ts +38 -0
- package/dist/design-system-react-components.cjs.development.js +11305 -0
- package/dist/design-system-react-components.cjs.development.js.map +1 -0
- package/dist/design-system-react-components.cjs.production.min.js +2 -0
- package/dist/design-system-react-components.cjs.production.min.js.map +1 -0
- package/dist/design-system-react-components.esm.js +11150 -0
- package/dist/design-system-react-components.esm.js.map +1 -0
- package/dist/helpers/types.d.ts +1 -0
- package/dist/hooks/tests/useCarouselStyles.test.d.ts +1 -0
- package/dist/hooks/useCarouselStyles.d.ts +17 -0
- package/dist/hooks/useNYPLTheme.d.ts +66 -0
- package/dist/hooks/useWindowSize.d.ts +10 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.js +8 -0
- package/dist/resources.scss +386 -0
- package/dist/styles.css +3 -0
- package/dist/theme/components/accordion.d.ts +20 -0
- package/dist/theme/components/breadcrumb.d.ts +105 -0
- package/dist/theme/components/button.d.ts +120 -0
- package/dist/theme/components/buttonGroup.d.ts +11 -0
- package/dist/theme/components/card.d.ts +381 -0
- package/dist/theme/components/checkbox.d.ts +95 -0
- package/dist/theme/components/checkboxGroup.d.ts +14 -0
- package/dist/theme/components/componentWrapper.d.ts +12 -0
- package/dist/theme/components/customTable.d.ts +136 -0
- package/dist/theme/components/datePicker.d.ts +16 -0
- package/dist/theme/components/fieldset.d.ts +20 -0
- package/dist/theme/components/global.d.ts +73 -0
- package/dist/theme/components/globalMixins.d.ts +23 -0
- package/dist/theme/components/heading.d.ts +160 -0
- package/dist/theme/components/helperErrorText.d.ts +12 -0
- package/dist/theme/components/hero.d.ts +499 -0
- package/dist/theme/components/horizontalRule.d.ts +15 -0
- package/dist/theme/components/icon.d.ts +47755 -0
- package/dist/theme/components/image.d.ts +590 -0
- package/dist/theme/components/label.d.ts +18 -0
- package/dist/theme/components/link.d.ts +62 -0
- package/dist/theme/components/list.d.ts +182 -0
- package/dist/theme/components/logo.d.ts +477 -0
- package/dist/theme/components/notification.d.ts +95 -0
- package/dist/theme/components/pagination.d.ts +16 -0
- package/dist/theme/components/progressIndicator.d.ts +52 -0
- package/dist/theme/components/radio.d.ts +99 -0
- package/dist/theme/components/radioGroup.d.ts +14 -0
- package/dist/theme/components/searchBar.d.ts +18 -0
- package/dist/theme/components/select.d.ts +87 -0
- package/dist/theme/components/skeletonLoader.d.ts +102 -0
- package/dist/theme/components/skipNavigation.d.ts +25 -0
- package/dist/theme/components/slider.d.ts +59 -0
- package/dist/theme/components/statusBadge.d.ts +25 -0
- package/dist/theme/components/structuredContent.d.ts +226 -0
- package/dist/theme/components/tabs.d.ts +136 -0
- package/dist/theme/components/template.d.ts +105 -0
- package/dist/theme/components/text.d.ts +26 -0
- package/dist/theme/components/textInput.d.ts +124 -0
- package/dist/theme/components/toggle.d.ts +92 -0
- package/dist/theme/components/videoPlayer.d.ts +40 -0
- package/dist/theme/foundations/breakpoints.d.ts +23 -0
- package/dist/theme/foundations/colors.d.ts +3 -0
- package/dist/theme/foundations/global.d.ts +58 -0
- package/dist/theme/foundations/radii.d.ts +6 -0
- package/dist/theme/foundations/shadows.d.ts +4 -0
- package/dist/theme/foundations/spacing.d.ts +82 -0
- package/dist/theme/foundations/typography.d.ts +8 -0
- package/dist/theme/index.d.ts +20 -0
- package/dist/theme/provider.d.ts +3 -0
- package/dist/theme/types.d.ts +1 -0
- package/dist/utils/componentCategories.d.ts +1 -0
- package/dist/utils/interfaces.d.ts +5 -0
- package/dist/utils/utils.d.ts +31 -0
- package/package.json +133 -20
- package/src/__tests__/fileMock.ts +6 -0
- package/src/__tests__/setup.ts +27 -0
- package/src/__tests__/utils/utils.test.ts +18 -0
- package/src/components/AccessibilityGuide/SkipNavigation.stories.mdx +42 -0
- package/src/components/Accordion/Accordion.stories.mdx +333 -0
- package/src/components/Accordion/Accordion.test.tsx +237 -0
- package/src/components/Accordion/Accordion.tsx +137 -0
- package/src/components/Accordion/__snapshots__/Accordion.test.tsx.snap +734 -0
- package/src/components/Autosuggest/Autosuggest.stories.mdx +75 -0
- package/src/components/Autosuggest/Autosuggest.stories.tsx +211 -0
- package/src/components/Autosuggest/_Autosuggest.scss +51 -0
- package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +231 -0
- package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +144 -0
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +98 -0
- package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +695 -0
- package/src/components/Button/Button.stories.mdx +320 -0
- package/src/components/Button/Button.test.tsx +184 -0
- package/src/components/Button/Button.tsx +95 -0
- package/src/components/Button/__snapshots__/Button.test.tsx.snap +106 -0
- package/src/components/ButtonGroup/ButtonGroup.stories.mdx +178 -0
- package/src/components/ButtonGroup/ButtonGroup.test.tsx +141 -0
- package/src/components/ButtonGroup/ButtonGroup.tsx +100 -0
- package/src/components/ButtonGroup/__snapshots__/ButtonGroup.test.tsx.snap +117 -0
- package/src/components/Card/Card.stories.mdx +1041 -0
- package/src/components/Card/Card.test.tsx +388 -0
- package/src/components/Card/Card.tsx +346 -0
- package/src/components/Card/__snapshots__/Card.test.tsx.snap +568 -0
- package/src/components/Chakra/Box.stories.mdx +52 -0
- package/src/components/Chakra/Center.stories.mdx +96 -0
- package/src/components/Chakra/Flex.stories.mdx +111 -0
- package/src/components/Chakra/Grid.stories.mdx +89 -0
- package/src/components/Chakra/Stack.stories.mdx +109 -0
- package/src/components/Checkbox/Checkbox.stories.mdx +243 -0
- package/src/components/Checkbox/Checkbox.test.tsx +350 -0
- package/src/components/Checkbox/Checkbox.tsx +152 -0
- package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +661 -0
- package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +462 -0
- package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +492 -0
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +173 -0
- package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +1842 -0
- package/src/components/ComponentWrapper/ComponentWrapper.test.tsx +163 -0
- package/src/components/ComponentWrapper/ComponentWrapper.tsx +76 -0
- package/src/components/ComponentWrapper/__snapshots__/ComponentWrapper.test.tsx.snap +103 -0
- package/src/components/DatePicker/DatePicker.stories.mdx +452 -0
- package/src/components/DatePicker/DatePicker.test.tsx +940 -0
- package/src/components/DatePicker/DatePicker.tsx +450 -0
- package/src/components/DatePicker/_DatePicker.scss +100 -0
- package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +908 -0
- package/src/components/Fieldset/Fieldset.stories.mdx +96 -0
- package/src/components/Fieldset/Fieldset.test.tsx +155 -0
- package/src/components/Fieldset/Fieldset.tsx +55 -0
- package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +89 -0
- package/src/components/Form/Form.stories.mdx +426 -0
- package/src/components/Form/Form.test.tsx +234 -0
- package/src/components/Form/Form.tsx +124 -0
- package/src/components/Form/__snapshots__/Form.test.tsx.snap +115 -0
- package/src/components/Grid/SimpleGrid.stories.mdx +336 -0
- package/src/components/Grid/SimpleGrid.test.tsx +79 -0
- package/src/components/Grid/SimpleGrid.tsx +49 -0
- package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +23 -0
- package/src/components/Heading/Heading.stories.mdx +187 -0
- package/src/components/Heading/Heading.test.tsx +171 -0
- package/src/components/Heading/Heading.tsx +104 -0
- package/src/components/Heading/__snapshots__/Heading.test.tsx.snap +90 -0
- package/src/components/HelperErrorText/HelperErrorText.stories.mdx +172 -0
- package/src/components/HelperErrorText/HelperErrorText.test.tsx +114 -0
- package/src/components/HelperErrorText/HelperErrorText.tsx +62 -0
- package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +93 -0
- package/src/components/Hero/Hero.stories.mdx +378 -0
- package/src/components/Hero/Hero.test.tsx +611 -0
- package/src/components/Hero/Hero.tsx +203 -0
- package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +379 -0
- package/src/components/HorizontalRule/HorizontalRule.stories.mdx +73 -0
- package/src/components/HorizontalRule/HorizontalRule.test.tsx +54 -0
- package/src/components/HorizontalRule/HorizontalRule.tsx +27 -0
- package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +44 -0
- package/src/components/Icons/Icon.stories.mdx +413 -0
- package/src/components/Icons/Icon.test.tsx +120 -0
- package/src/components/Icons/Icon.tsx +187 -0
- package/src/components/Icons/IconSvgs.tsx +64 -0
- package/src/components/Icons/__snapshots__/Icon.test.tsx.snap +129 -0
- package/src/components/Image/Image.stories.mdx +332 -0
- package/src/components/Image/Image.test.tsx +155 -0
- package/src/components/Image/Image.tsx +171 -0
- package/src/components/Image/__snapshots__/Image.test.tsx.snap +269 -0
- package/src/components/Label/Label.stories.mdx +100 -0
- package/src/components/Label/Label.test.tsx +116 -0
- package/src/components/Label/Label.tsx +55 -0
- package/src/components/Label/__snapshots__/Label.test.tsx.snap +45 -0
- package/src/components/Link/Link.stories.mdx +249 -0
- package/src/components/Link/Link.test.tsx +224 -0
- package/src/components/Link/Link.tsx +178 -0
- package/src/components/Link/__snapshots__/Link.test.tsx.snap +286 -0
- package/src/components/List/List.stories.mdx +393 -0
- package/src/components/List/List.test.tsx +265 -0
- package/src/components/List/List.tsx +156 -0
- package/src/components/List/__snapshots__/List.test.tsx.snap +213 -0
- package/src/components/Logo/Logo.stories.mdx +295 -0
- package/src/components/Logo/Logo.test.tsx +116 -0
- package/src/components/Logo/Logo.tsx +151 -0
- package/src/components/Logo/LogoSvgs.tsx +90 -0
- package/src/components/Logo/__snapshots__/Logo.test.tsx.snap +142 -0
- package/src/components/Modal/Modal.stories.mdx +294 -0
- package/src/components/Modal/Modal.test.tsx +157 -0
- package/src/components/Modal/Modal.tsx +154 -0
- package/src/components/Modal/__snapshots__/Modal.test.tsx.snap +25 -0
- package/src/components/Notification/Notification.stories.mdx +358 -0
- package/src/components/Notification/Notification.test.tsx +279 -0
- package/src/components/Notification/Notification.tsx +224 -0
- package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +525 -0
- package/src/components/Pagination/Pagination.stories.mdx +184 -0
- package/src/components/Pagination/Pagination.test.tsx +419 -0
- package/src/components/Pagination/Pagination.tsx +269 -0
- package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +544 -0
- package/src/components/Placeholder/Placeholder.tsx +19 -0
- package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +360 -0
- package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +298 -0
- package/src/components/ProgressIndicator/ProgressIndicator.tsx +132 -0
- package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +434 -0
- package/src/components/Radio/Radio.stories.mdx +216 -0
- package/src/components/Radio/Radio.test.tsx +247 -0
- package/src/components/Radio/Radio.tsx +119 -0
- package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +451 -0
- package/src/components/RadioGroup/RadioGroup.stories.mdx +479 -0
- package/src/components/RadioGroup/RadioGroup.test.tsx +471 -0
- package/src/components/RadioGroup/RadioGroup.tsx +171 -0
- package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +1550 -0
- package/src/components/SearchBar/SearchBar.stories.mdx +518 -0
- package/src/components/SearchBar/SearchBar.test.tsx +435 -0
- package/src/components/SearchBar/SearchBar.tsx +210 -0
- package/src/components/SearchBar/__snapshots__/SearchBar.test.tsx.snap +1049 -0
- package/src/components/Select/Select.stories.mdx +439 -0
- package/src/components/Select/Select.test.tsx +358 -0
- package/src/components/Select/Select.tsx +183 -0
- package/src/components/Select/__snapshots__/Select.test.tsx.snap +895 -0
- package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +142 -0
- package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +116 -0
- package/src/components/SkeletonLoader/SkeletonLoader.tsx +123 -0
- package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +898 -0
- package/src/components/SkipNavigation/SkipNavigation.stories.mdx +90 -0
- package/src/components/SkipNavigation/SkipNavigation.test.tsx +63 -0
- package/src/components/SkipNavigation/SkipNavigation.tsx +51 -0
- package/src/components/SkipNavigation/__snapshots__/SkipNavigation.test.tsx.snap +130 -0
- package/src/components/Slider/Slider.stories.mdx +628 -0
- package/src/components/Slider/Slider.test.tsx +736 -0
- package/src/components/Slider/Slider.tsx +322 -0
- package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +2186 -0
- package/src/components/StatusBadge/StatusBadge.stories.mdx +109 -0
- package/src/components/StatusBadge/StatusBadge.test.tsx +70 -0
- package/src/components/StatusBadge/StatusBadge.tsx +35 -0
- package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +47 -0
- package/src/components/StructuredContent/StructuredContent.stories.mdx +567 -0
- package/src/components/StructuredContent/StructuredContent.test.tsx +435 -0
- package/src/components/StructuredContent/StructuredContent.tsx +139 -0
- package/src/components/StructuredContent/__snapshots__/StructuredContent.test.tsx.snap +368 -0
- package/src/components/StyleGuide/Bidirectionality.stories.mdx +206 -0
- package/src/components/StyleGuide/Breakpoints.stories.mdx +55 -0
- package/src/components/StyleGuide/Buttons.stories.mdx +194 -0
- package/src/components/StyleGuide/ColorCard.tsx +43 -0
- package/src/components/StyleGuide/Colors.stories.mdx +201 -0
- package/src/components/StyleGuide/DesignTokens.stories.mdx +193 -0
- package/src/components/StyleGuide/Forms.stories.mdx +94 -0
- package/src/components/StyleGuide/Iconography.stories.mdx +142 -0
- package/src/components/StyleGuide/Spacing.stories.mdx +116 -0
- package/src/components/StyleGuide/Typography.stories.mdx +419 -0
- package/src/components/Table/Table.stories.mdx +272 -0
- package/src/components/Table/Table.test.tsx +241 -0
- package/src/components/Table/Table.tsx +152 -0
- package/src/components/Table/__snapshots__/Table.test.tsx.snap +1703 -0
- package/src/components/Tabs/Tabs.stories.mdx +338 -0
- package/src/components/Tabs/Tabs.test.tsx +298 -0
- package/src/components/Tabs/Tabs.tsx +264 -0
- package/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap +584 -0
- package/src/components/Template/Template.stories.mdx +695 -0
- package/src/components/Template/Template.test.tsx +309 -0
- package/src/components/Template/Template.tsx +326 -0
- package/src/components/Template/__snapshots__/Template.test.tsx.snap +342 -0
- package/src/components/Text/Text.stories.mdx +103 -0
- package/src/components/Text/Text.test.tsx +63 -0
- package/src/components/Text/Text.tsx +50 -0
- package/src/components/Text/__snapshots__/Text.test.tsx.snap +50 -0
- package/src/components/TextInput/TextInput.stories.mdx +268 -0
- package/src/components/TextInput/TextInput.test.tsx +451 -0
- package/src/components/TextInput/TextInput.tsx +240 -0
- package/src/components/TextInput/__snapshots__/TextInput.test.tsx.snap +274 -0
- package/src/components/Toggle/Toggle.stories.mdx +237 -0
- package/src/components/Toggle/Toggle.test.tsx +170 -0
- package/src/components/Toggle/Toggle.tsx +128 -0
- package/src/components/Toggle/__snapshots__/Toggle.test.tsx.snap +470 -0
- package/src/components/VideoPlayer/VideoPlayer.stories.mdx +212 -0
- package/src/components/VideoPlayer/VideoPlayer.test.tsx +308 -0
- package/src/components/VideoPlayer/VideoPlayer.tsx +188 -0
- package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +192 -0
- package/src/docs/Chakra.stories.mdx +563 -0
- package/src/docs/Welcome.stories.mdx +148 -0
- package/src/helpers/types.ts +1 -0
- package/src/hooks/tests/useCarouselStyles.test.ts +140 -0
- package/src/hooks/tests/useNYPLTheme.test.tsx +36 -0
- package/src/hooks/useCarouselStyles.stories.mdx +30 -0
- package/src/hooks/useCarouselStyles.ts +35 -0
- package/src/hooks/useNYPLTheme.stories.mdx +98 -0
- package/src/hooks/useNYPLTheme.ts +91 -0
- package/src/hooks/useWindowSize.stories.mdx +23 -0
- package/src/hooks/useWindowSize.ts +40 -0
- package/src/index.ts +136 -0
- package/src/resources.scss +6 -0
- package/src/styles/base/_01-breakpoints.scss +27 -0
- package/src/styles/base/_02-mixins.scss +103 -0
- package/src/styles/base/_place-holder.scss +33 -0
- package/src/styles/space/_space-inline.scss +79 -0
- package/src/styles/space/_space-inset.scss +57 -0
- package/src/styles/space/_space-stack.scss +116 -0
- package/src/styles.scss +23 -0
- package/src/theme/components/accordion.ts +25 -0
- package/src/theme/components/breadcrumb.ts +94 -0
- package/src/theme/components/button.ts +133 -0
- package/src/theme/components/buttonGroup.ts +10 -0
- package/src/theme/components/card.ts +237 -0
- package/src/theme/components/checkbox.ts +110 -0
- package/src/theme/components/checkboxGroup.ts +10 -0
- package/src/theme/components/componentWrapper.ts +14 -0
- package/src/theme/components/customTable.ts +77 -0
- package/src/theme/components/datePicker.ts +17 -0
- package/src/theme/components/fieldset.ts +23 -0
- package/src/theme/components/global.ts +91 -0
- package/src/theme/components/globalMixins.ts +24 -0
- package/src/theme/components/heading.ts +79 -0
- package/src/theme/components/helperErrorText.ts +14 -0
- package/src/theme/components/hero.ts +238 -0
- package/src/theme/components/horizontalRule.ts +17 -0
- package/src/theme/components/icon.ts +88 -0
- package/src/theme/components/image.ts +136 -0
- package/src/theme/components/label.ts +15 -0
- package/src/theme/components/link.ts +63 -0
- package/src/theme/components/list.ts +88 -0
- package/src/theme/components/logo.ts +58 -0
- package/src/theme/components/notification.ts +132 -0
- package/src/theme/components/pagination.ts +17 -0
- package/src/theme/components/progressIndicator.ts +67 -0
- package/src/theme/components/radio.ts +103 -0
- package/src/theme/components/radioGroup.ts +10 -0
- package/src/theme/components/searchBar.ts +19 -0
- package/src/theme/components/select.ts +72 -0
- package/src/theme/components/skeletonLoader.ts +113 -0
- package/src/theme/components/skipNavigation.ts +29 -0
- package/src/theme/components/slider.ts +95 -0
- package/src/theme/components/statusBadge.ts +26 -0
- package/src/theme/components/structuredContent.ts +149 -0
- package/src/theme/components/tabs.ts +109 -0
- package/src/theme/components/template.ts +114 -0
- package/src/theme/components/text.ts +38 -0
- package/src/theme/components/textInput.ts +65 -0
- package/src/theme/components/toggle.ts +109 -0
- package/src/theme/components/videoPlayer.ts +47 -0
- package/src/theme/foundations/breakpoints.ts +24 -0
- package/src/theme/foundations/colors.ts +212 -0
- package/src/theme/foundations/global.ts +43 -0
- package/src/theme/foundations/radii.ts +7 -0
- package/src/theme/foundations/shadows.ts +5 -0
- package/src/theme/foundations/spacing.ts +136 -0
- package/src/theme/foundations/typography.ts +107 -0
- package/src/theme/index.ts +131 -0
- package/src/theme/provider.tsx +9 -0
- package/src/theme/types.ts +1 -0
- package/src/utils/componentCategories.ts +152 -0
- package/src/utils/interfaces.ts +5 -0
- package/src/utils/utils.ts +84 -0
- package/lib/components/Button/Button.d.ts +0 -17
- package/lib/components/Button/Button.js +0 -42
- package/lib/index.d.ts +0 -1
- package/lib/index.js +0 -6
- package/lib/stories/0-Welcome.stories.js +0 -19
- package/lib/stories/1-Button.stories.d.ts +0 -6
- package/lib/stories/1-Button.stories.js +0 -20
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ArgsTable,
|
|
3
|
+
Canvas,
|
|
4
|
+
Description,
|
|
5
|
+
Meta,
|
|
6
|
+
Story,
|
|
7
|
+
} from "@storybook/addon-docs";
|
|
8
|
+
import ReactDOMServer from "react-dom/server";
|
|
9
|
+
import { withDesign } from "storybook-addon-designs";
|
|
10
|
+
|
|
11
|
+
import Accordion from "./Accordion";
|
|
12
|
+
import Card, { CardHeading, CardContent } from "../Card/Card";
|
|
13
|
+
import { getCategory } from "../../utils/componentCategories";
|
|
14
|
+
|
|
15
|
+
<Meta
|
|
16
|
+
title={getCategory("Accordion")}
|
|
17
|
+
component={Accordion}
|
|
18
|
+
decorators={[withDesign]}
|
|
19
|
+
parameters={{
|
|
20
|
+
design: {
|
|
21
|
+
type: "figma",
|
|
22
|
+
url: "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Master?node-id=10734%3A2520",
|
|
23
|
+
},
|
|
24
|
+
jest: ["Accordion.test.tsx"],
|
|
25
|
+
}}
|
|
26
|
+
argTypes={{
|
|
27
|
+
accordionData: { control: false },
|
|
28
|
+
id: { control: false },
|
|
29
|
+
isDefaultOpen: { table: { defaultValue: { summary: false } } },
|
|
30
|
+
}}
|
|
31
|
+
/>
|
|
32
|
+
|
|
33
|
+
# Accordion
|
|
34
|
+
|
|
35
|
+
| Component Version | DS Version |
|
|
36
|
+
| ----------------- | ---------- |
|
|
37
|
+
| Added | `0.1.0` |
|
|
38
|
+
| Latest | `1.0.2` |
|
|
39
|
+
|
|
40
|
+
## Table of Contents
|
|
41
|
+
|
|
42
|
+
- [Overview](#overview)
|
|
43
|
+
- [Component Props](#component-props)
|
|
44
|
+
- [Accessibility](#accessibility)
|
|
45
|
+
- [FAQ Example](#faq-example)
|
|
46
|
+
|
|
47
|
+
## Overview
|
|
48
|
+
|
|
49
|
+
<Description of={Accordion} />
|
|
50
|
+
|
|
51
|
+
The `Accordion` component displays a list of high-level options that can
|
|
52
|
+
expand and collapse to reveal associated sections of content. This component
|
|
53
|
+
pushes existing content on the page down. Each accordion item is self contained,
|
|
54
|
+
but when the data for multiple accordions is passed in through the `accordionData`
|
|
55
|
+
prop, the `Accordion` components are grouped together and rendered under a single
|
|
56
|
+
element. When grouped like this, each `Accordion` component still opens and
|
|
57
|
+
closes independent from the others in the group.
|
|
58
|
+
|
|
59
|
+
The only way to render an `Accordion` component is to pass in an array of objects
|
|
60
|
+
with `label`, `panel`, and optional `accordionType` properties for each accordion item.
|
|
61
|
+
Note that you can pass in a string or DOM elements into the `panel` property in each
|
|
62
|
+
object. This approach is needed because, internally, we deal with the logic to render
|
|
63
|
+
the necessary icon, Chakra components, and styles. Additionally, the `accordionType`
|
|
64
|
+
prop can be used to change the accordion button's background color. It takes a value
|
|
65
|
+
of `"default"` for `"ui.white"`, `"warning"` for `"ui.status.primary"`, and
|
|
66
|
+
`"error"` for `"ui.status.secondary"`.
|
|
67
|
+
|
|
68
|
+
```jsx
|
|
69
|
+
const accordionData = [
|
|
70
|
+
{
|
|
71
|
+
accordionType: "default",
|
|
72
|
+
label: "Tom Nook",
|
|
73
|
+
panel: (
|
|
74
|
+
<Card
|
|
75
|
+
imageProps={{
|
|
76
|
+
alt: "Alt text",
|
|
77
|
+
aspectRatio: "twoByOne",
|
|
78
|
+
src: "https://play.nintendo.com/images/AC_Tom_FRYtwIN.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png",
|
|
79
|
+
}}
|
|
80
|
+
isCentered
|
|
81
|
+
layout="row"
|
|
82
|
+
>
|
|
83
|
+
<CardHeading level="four" id="heading1">
|
|
84
|
+
Tom Nook
|
|
85
|
+
</CardHeading>
|
|
86
|
+
<CardContent>
|
|
87
|
+
Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional
|
|
88
|
+
character in the Animal Crossing series who operates the
|
|
89
|
+
village store.
|
|
90
|
+
</CardContent>
|
|
91
|
+
</Card>
|
|
92
|
+
),
|
|
93
|
+
},
|
|
94
|
+
];
|
|
95
|
+
|
|
96
|
+
...
|
|
97
|
+
|
|
98
|
+
<Accordion accordionData={accordionData} />
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Component Props
|
|
102
|
+
|
|
103
|
+
export const accordionData = [
|
|
104
|
+
{
|
|
105
|
+
accordionType: "default",
|
|
106
|
+
label: "Tom Nook",
|
|
107
|
+
panel: (
|
|
108
|
+
<Card
|
|
109
|
+
imageProps={{
|
|
110
|
+
alt: "Alt text",
|
|
111
|
+
aspectRatio: "twoByOne",
|
|
112
|
+
src: "https://play.nintendo.com/images/AC_Tom_FRYtwIN.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png",
|
|
113
|
+
}}
|
|
114
|
+
isCentered
|
|
115
|
+
layout="row"
|
|
116
|
+
>
|
|
117
|
+
<CardHeading level="four" id="heading1">
|
|
118
|
+
Tom Nook
|
|
119
|
+
</CardHeading>
|
|
120
|
+
<CardContent>
|
|
121
|
+
Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional character
|
|
122
|
+
in the Animal Crossing series who operates the village store.
|
|
123
|
+
</CardContent>
|
|
124
|
+
</Card>
|
|
125
|
+
),
|
|
126
|
+
},
|
|
127
|
+
];
|
|
128
|
+
|
|
129
|
+
<Canvas withToolbar>
|
|
130
|
+
<Story
|
|
131
|
+
name="Accordion with Controls"
|
|
132
|
+
args={{
|
|
133
|
+
id: "accordion-id",
|
|
134
|
+
isDefaultOpen: false,
|
|
135
|
+
}}
|
|
136
|
+
>
|
|
137
|
+
{(args) => <Accordion accordionData={accordionData} {...args} />}
|
|
138
|
+
</Story>
|
|
139
|
+
</Canvas>
|
|
140
|
+
|
|
141
|
+
<ArgsTable story="Accordion with Controls" />
|
|
142
|
+
|
|
143
|
+
## Accessibility
|
|
144
|
+
|
|
145
|
+
- Follows [U.S. Web Design System (USWDS)](https://designsystem.digital.gov/components/accordion/)
|
|
146
|
+
guidelines:
|
|
147
|
+
- Use the `button` HTML element for screenreaders and keyboards.
|
|
148
|
+
- Use the `aria-expanded` attribute to indicate whether the `Accordion` is
|
|
149
|
+
expanded (`true`) or collapsed (`false`).
|
|
150
|
+
- Use the `aria-controls` attribute to associate the control with the panel.
|
|
151
|
+
- Deviates from USWDS in that the user can open multiple panels. Opening one,
|
|
152
|
+
does not collapse already expanded panel.
|
|
153
|
+
- The open and close icons are decorative (`aria-hidden` is `true`).
|
|
154
|
+
- Visible focus goes around full button and full button is clickable
|
|
155
|
+
|
|
156
|
+
Resources:
|
|
157
|
+
|
|
158
|
+
- [W3C WAI-Aria Practices - Accordion](https://www.w3.org/TR/wai-aria-practices-1.1/#accordion)
|
|
159
|
+
- [USWDS Accordion](https://designsystem.digital.gov/components/accordion/)
|
|
160
|
+
- [Chakra Accordion](https://chakra-ui.com/docs/components/disclosure/accordion)
|
|
161
|
+
|
|
162
|
+
## FAQ Example
|
|
163
|
+
|
|
164
|
+
export const faqContent = [
|
|
165
|
+
{
|
|
166
|
+
accordionType: "default",
|
|
167
|
+
label: "Tom Nook",
|
|
168
|
+
panel: (
|
|
169
|
+
<Card
|
|
170
|
+
imageProps={{
|
|
171
|
+
alt: "Alt text",
|
|
172
|
+
aspectRatio: "twoByOne",
|
|
173
|
+
src: "https://play.nintendo.com/images/AC_Tom_FRYtwIN.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png",
|
|
174
|
+
}}
|
|
175
|
+
isCentered
|
|
176
|
+
layout="row"
|
|
177
|
+
>
|
|
178
|
+
<CardHeading level="four" id="heading1-tom">
|
|
179
|
+
Tom Nook
|
|
180
|
+
</CardHeading>
|
|
181
|
+
<CardContent>
|
|
182
|
+
Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional character
|
|
183
|
+
in the Animal Crossing series who operates the village store.
|
|
184
|
+
</CardContent>
|
|
185
|
+
</Card>
|
|
186
|
+
),
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
accordionType: "warning",
|
|
190
|
+
label: "Isabelle",
|
|
191
|
+
panel: (
|
|
192
|
+
<Card
|
|
193
|
+
imageProps={{
|
|
194
|
+
alt: "Alt text",
|
|
195
|
+
aspectRatio: "twoByOne",
|
|
196
|
+
src: "https://play.nintendo.com/images/AC_Isabelle_7XU6aGu.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png",
|
|
197
|
+
}}
|
|
198
|
+
isCentered
|
|
199
|
+
layout="row"
|
|
200
|
+
>
|
|
201
|
+
<CardHeading level="four" id="heading1-isabelle">
|
|
202
|
+
Isabelle
|
|
203
|
+
</CardHeading>
|
|
204
|
+
<CardContent>
|
|
205
|
+
Isabelle, known as Shizue in Japan, is a fictional character from the
|
|
206
|
+
Animal Crossing series of video games. She is a kindly Shih Tzu that
|
|
207
|
+
debuted in the 2012 release Animal Crossing: New Leaf, where she
|
|
208
|
+
serves as the secretary to the player character.
|
|
209
|
+
</CardContent>
|
|
210
|
+
</Card>
|
|
211
|
+
),
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
accordionType: "error",
|
|
215
|
+
label: "K.K. Slider",
|
|
216
|
+
panel: (
|
|
217
|
+
<Card
|
|
218
|
+
imageProps={{
|
|
219
|
+
alt: "Alt text",
|
|
220
|
+
aspectRatio: "twoByOne",
|
|
221
|
+
src: "https://play.nintendo.com/images/AC_KK_jh4yj5t.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png",
|
|
222
|
+
}}
|
|
223
|
+
isCentered
|
|
224
|
+
layout="row"
|
|
225
|
+
>
|
|
226
|
+
<CardHeading level="four" id="heading1-kkslider">
|
|
227
|
+
K.K. Slider
|
|
228
|
+
</CardHeading>
|
|
229
|
+
<CardContent>
|
|
230
|
+
<p>
|
|
231
|
+
Totakeke, more commonly known as <b>K.K. Slider or K.K.</b>, is a
|
|
232
|
+
fictional character within the Animal Crossing franchise. One of the
|
|
233
|
+
franchise's most popular characters, he debuted in the title Animal
|
|
234
|
+
Crossing, and has appeared in every installment since.
|
|
235
|
+
</p>
|
|
236
|
+
</CardContent>
|
|
237
|
+
</Card>
|
|
238
|
+
),
|
|
239
|
+
},
|
|
240
|
+
];
|
|
241
|
+
|
|
242
|
+
Building out FAQ-like accordions happens automatically when there are more than
|
|
243
|
+
one object in the array passed into the `accordionData` prop.
|
|
244
|
+
|
|
245
|
+
<Canvas withToolbar>
|
|
246
|
+
<Story name="FAQ Example">
|
|
247
|
+
<Accordion accordionData={faqContent} />
|
|
248
|
+
</Story>
|
|
249
|
+
</Canvas>
|
|
250
|
+
|
|
251
|
+
```jsx
|
|
252
|
+
export const faqContent = [
|
|
253
|
+
{
|
|
254
|
+
accordionType: "default",
|
|
255
|
+
label: "Tom Nook",
|
|
256
|
+
panel: (
|
|
257
|
+
<Card
|
|
258
|
+
imageProps={{
|
|
259
|
+
alt: "Alt text",
|
|
260
|
+
aspectRatio: "twoByOne",
|
|
261
|
+
src: "https://play.nintendo.com/images/AC_Tom_FRYtwIN.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png",
|
|
262
|
+
}}
|
|
263
|
+
isCentered
|
|
264
|
+
layout="row"
|
|
265
|
+
>
|
|
266
|
+
<CardHeading level="four" id="heading1-tom">
|
|
267
|
+
Tom Nook
|
|
268
|
+
</CardHeading>
|
|
269
|
+
<CardContent>
|
|
270
|
+
Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional character
|
|
271
|
+
in the Animal Crossing series who operates the village store.
|
|
272
|
+
</CardContent>
|
|
273
|
+
</Card>
|
|
274
|
+
),
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
accordionType: "warning",
|
|
278
|
+
label: "Isabelle",
|
|
279
|
+
panel: (
|
|
280
|
+
<Card
|
|
281
|
+
imageProps={{
|
|
282
|
+
alt: "Alt text",
|
|
283
|
+
aspectRatio: "twoByOne",
|
|
284
|
+
src: "https://play.nintendo.com/images/AC_Isabelle_7XU6aGu.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png",
|
|
285
|
+
}}
|
|
286
|
+
isCentered
|
|
287
|
+
layout="row"
|
|
288
|
+
>
|
|
289
|
+
<CardHeading level="four" id="heading1-isabelle">
|
|
290
|
+
Isabelle
|
|
291
|
+
</CardHeading>
|
|
292
|
+
<CardContent>
|
|
293
|
+
Isabelle, known as Shizue in Japan, is a fictional character from the
|
|
294
|
+
Animal Crossing series of video games. She is a kindly Shih Tzu that
|
|
295
|
+
debuted in the 2012 release Animal Crossing: New Leaf, where she
|
|
296
|
+
serves as the secretary to the player character.
|
|
297
|
+
</CardContent>
|
|
298
|
+
</Card>
|
|
299
|
+
),
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
accordionType: "error",
|
|
303
|
+
label: "K.K. Slider",
|
|
304
|
+
panel: (
|
|
305
|
+
<Card
|
|
306
|
+
imageProps={{
|
|
307
|
+
alt: "Alt text",
|
|
308
|
+
aspectRatio: "twoByOne",
|
|
309
|
+
src: "https://play.nintendo.com/images/AC_KK_jh4yj5t.17345b1513ac044897cfc243542899dce541e8dc.9afde10b.png",
|
|
310
|
+
}}
|
|
311
|
+
isCentered
|
|
312
|
+
layout="row"
|
|
313
|
+
>
|
|
314
|
+
<CardHeading level="four" id="heading1-kkslider">
|
|
315
|
+
K.K. Slider
|
|
316
|
+
</CardHeading>
|
|
317
|
+
<CardContent>
|
|
318
|
+
<p>
|
|
319
|
+
Totakeke, more commonly known as <b>K.K. Slider or K.K.</b>, is a
|
|
320
|
+
fictional character within the Animal Crossing franchise. One of the
|
|
321
|
+
franchise's most popular characters, he debuted in the title Animal
|
|
322
|
+
Crossing, and has appeared in every installment since.
|
|
323
|
+
</p>
|
|
324
|
+
</CardContent>
|
|
325
|
+
</Card>
|
|
326
|
+
),
|
|
327
|
+
},
|
|
328
|
+
];
|
|
329
|
+
|
|
330
|
+
...
|
|
331
|
+
|
|
332
|
+
<Accordion accordionData={faqContent} />
|
|
333
|
+
```
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { axe } from "jest-axe";
|
|
3
|
+
import { render, screen } from "@testing-library/react";
|
|
4
|
+
import renderer from "react-test-renderer";
|
|
5
|
+
import userEvent from "@testing-library/user-event";
|
|
6
|
+
|
|
7
|
+
import Accordion from "./Accordion";
|
|
8
|
+
import Card, { CardContent, CardHeading } from "../Card/Card";
|
|
9
|
+
|
|
10
|
+
describe("Accordion Accessibility", () => {
|
|
11
|
+
it("passes axe accessibility test for one item", async () => {
|
|
12
|
+
const { container } = render(
|
|
13
|
+
<Accordion
|
|
14
|
+
accordionData={[
|
|
15
|
+
{
|
|
16
|
+
label: "Tom Nook",
|
|
17
|
+
panel: (
|
|
18
|
+
<p>
|
|
19
|
+
Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional
|
|
20
|
+
character in the Animal Crossing series who operates the village
|
|
21
|
+
store.
|
|
22
|
+
</p>
|
|
23
|
+
),
|
|
24
|
+
},
|
|
25
|
+
]}
|
|
26
|
+
/>
|
|
27
|
+
);
|
|
28
|
+
expect(await axe(container)).toHaveNoViolations();
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("passes axe accessibility test for multiple items", async () => {
|
|
32
|
+
const { container } = render(
|
|
33
|
+
<Accordion
|
|
34
|
+
accordionData={[
|
|
35
|
+
{
|
|
36
|
+
label: "Tom Nook",
|
|
37
|
+
panel: (
|
|
38
|
+
<p>
|
|
39
|
+
Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional
|
|
40
|
+
character in the Animal Crossing series who operates the village
|
|
41
|
+
store.
|
|
42
|
+
</p>
|
|
43
|
+
),
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
label: "Isabelle",
|
|
47
|
+
panel:
|
|
48
|
+
"Isabelle, known as Shizue in Japan, is a fictional character " +
|
|
49
|
+
"from the Animal Crossing series of video games. She is a kindly Shih " +
|
|
50
|
+
"Tzu that debuted in the 2012 release Animal Crossing: New Leaf, where " +
|
|
51
|
+
"she serves as the secretary to the player character.",
|
|
52
|
+
},
|
|
53
|
+
]}
|
|
54
|
+
/>
|
|
55
|
+
);
|
|
56
|
+
expect(await axe(container)).toHaveNoViolations();
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
export const accordionData = [
|
|
61
|
+
{
|
|
62
|
+
label: "Tom Nook",
|
|
63
|
+
panel: (
|
|
64
|
+
<p>
|
|
65
|
+
Tom Nook, <b>known in Japan as Tanukichi</b>, is a fictional character
|
|
66
|
+
in the Animal Crossing series who operates the village store.
|
|
67
|
+
</p>
|
|
68
|
+
),
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
label: "Isabelle",
|
|
72
|
+
panel:
|
|
73
|
+
"Isabelle, known as Shizue in Japan, is a fictional character " +
|
|
74
|
+
"from the Animal Crossing series of video games. She is a kindly Shih " +
|
|
75
|
+
"Tzu that debuted in the 2012 release Animal Crossing: New Leaf, where " +
|
|
76
|
+
"she serves as the secretary to the player character.",
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
label: "K.K. Slider",
|
|
80
|
+
panel:
|
|
81
|
+
"<p>Totakeke, more commonly known as <b>K.K. Slider or K.K.</b>, is a " +
|
|
82
|
+
"fictional character within the Animal Crossing franchise. One of the " +
|
|
83
|
+
"franchise's most popular characters, he debuted in the title Animal " +
|
|
84
|
+
"Crossing, and has appeared in every installment since.</p>",
|
|
85
|
+
},
|
|
86
|
+
];
|
|
87
|
+
|
|
88
|
+
describe("Accordion", () => {
|
|
89
|
+
it("renders a visible button with a label to click on", () => {
|
|
90
|
+
render(<Accordion accordionData={[accordionData[0]]} />);
|
|
91
|
+
const accordionLabel = screen.getByRole("button", { name: "Tom Nook" });
|
|
92
|
+
|
|
93
|
+
expect(accordionLabel).toBeInTheDocument();
|
|
94
|
+
// Closed by default.
|
|
95
|
+
expect(accordionLabel).toHaveAttribute("aria-expanded", "false");
|
|
96
|
+
expect(screen.getByText(/known in Japan as Tanukichi/i)).not.toBeVisible();
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("opens the panel by default with isDefaultOpen passed", () => {
|
|
100
|
+
render(<Accordion isDefaultOpen accordionData={[accordionData[0]]} />);
|
|
101
|
+
const accordionLabel = screen.getByRole("button", { name: "Tom Nook" });
|
|
102
|
+
|
|
103
|
+
expect(accordionLabel).toBeInTheDocument();
|
|
104
|
+
expect(accordionLabel).toHaveAttribute("aria-expanded", "true");
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it("opens the accordion when the label is clicked", () => {
|
|
108
|
+
render(<Accordion accordionData={[accordionData[0]]} />);
|
|
109
|
+
|
|
110
|
+
const accordionLabel = screen.getByRole("button", { name: "Tom Nook" });
|
|
111
|
+
expect(accordionLabel).toHaveAttribute("aria-expanded", "false");
|
|
112
|
+
userEvent.click(accordionLabel);
|
|
113
|
+
expect(accordionLabel).toHaveAttribute("aria-expanded", "true");
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it("renders multiple accordion items grouped together", () => {
|
|
117
|
+
render(<Accordion accordionData={accordionData} />);
|
|
118
|
+
|
|
119
|
+
const accordion1 = screen.getByRole("button", { name: "Tom Nook" });
|
|
120
|
+
const accordion2 = screen.getByRole("button", { name: "Isabelle" });
|
|
121
|
+
const accordion3 = screen.getByRole("button", { name: "K.K. Slider" });
|
|
122
|
+
|
|
123
|
+
expect(accordion1).toHaveAttribute("aria-expanded", "false");
|
|
124
|
+
expect(accordion2).toHaveAttribute("aria-expanded", "false");
|
|
125
|
+
expect(accordion3).toHaveAttribute("aria-expanded", "false");
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it("opens each accordion item independently of each other", () => {
|
|
129
|
+
render(<Accordion accordionData={accordionData} />);
|
|
130
|
+
|
|
131
|
+
const accordion1 = screen.getByRole("button", { name: "Tom Nook" });
|
|
132
|
+
const accordion2 = screen.getByRole("button", { name: "Isabelle" });
|
|
133
|
+
const accordion3 = screen.getByRole("button", { name: "K.K. Slider" });
|
|
134
|
+
|
|
135
|
+
expect(accordion1).toHaveAttribute("aria-expanded", "false");
|
|
136
|
+
expect(accordion2).toHaveAttribute("aria-expanded", "false");
|
|
137
|
+
expect(accordion3).toHaveAttribute("aria-expanded", "false");
|
|
138
|
+
|
|
139
|
+
userEvent.click(accordion1);
|
|
140
|
+
expect(accordion1).toHaveAttribute("aria-expanded", "true");
|
|
141
|
+
expect(accordion2).toHaveAttribute("aria-expanded", "false");
|
|
142
|
+
expect(accordion3).toHaveAttribute("aria-expanded", "false");
|
|
143
|
+
|
|
144
|
+
userEvent.click(accordion2);
|
|
145
|
+
expect(accordion1).toHaveAttribute("aria-expanded", "true");
|
|
146
|
+
expect(accordion2).toHaveAttribute("aria-expanded", "true");
|
|
147
|
+
expect(accordion3).toHaveAttribute("aria-expanded", "false");
|
|
148
|
+
|
|
149
|
+
userEvent.click(accordion3);
|
|
150
|
+
userEvent.click(accordion1);
|
|
151
|
+
expect(accordion1).toHaveAttribute("aria-expanded", "false");
|
|
152
|
+
expect(accordion2).toHaveAttribute("aria-expanded", "true");
|
|
153
|
+
expect(accordion3).toHaveAttribute("aria-expanded", "true");
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it("Renders the UI snapshot correctly", () => {
|
|
157
|
+
const accordionData = [
|
|
158
|
+
{
|
|
159
|
+
label: "Gerry Kellman",
|
|
160
|
+
panel: (
|
|
161
|
+
<Card
|
|
162
|
+
id="card"
|
|
163
|
+
imageProps={{
|
|
164
|
+
alt: "Alt text",
|
|
165
|
+
aspectRatio: "twoByOne",
|
|
166
|
+
src: "https://cdn.onebauer.media/one/media/6176/76fd/405b/ab5f/f20f/2d52/gerri-1500-1.jpg?format=jpg&quality=80&width=850&ratio=1-1&resize=aspectfit",
|
|
167
|
+
}}
|
|
168
|
+
isCentered
|
|
169
|
+
layout="row"
|
|
170
|
+
>
|
|
171
|
+
<CardHeading id="heading1" level="four">
|
|
172
|
+
Gerry Kellman
|
|
173
|
+
</CardHeading>
|
|
174
|
+
<CardContent>
|
|
175
|
+
Gerri is <b>one of Logan's most trusted confidantes</b>, one who
|
|
176
|
+
serves many roles within the company. She's one of the most
|
|
177
|
+
powerful people at Waystar Royco outside of the family itself.
|
|
178
|
+
</CardContent>
|
|
179
|
+
</Card>
|
|
180
|
+
),
|
|
181
|
+
},
|
|
182
|
+
];
|
|
183
|
+
|
|
184
|
+
const primary = renderer
|
|
185
|
+
.create(<Accordion accordionData={accordionData} id="accordian" />)
|
|
186
|
+
.toJSON();
|
|
187
|
+
const defaultOpen = renderer
|
|
188
|
+
.create(
|
|
189
|
+
<Accordion accordionData={accordionData} id="accordian" isDefaultOpen />
|
|
190
|
+
)
|
|
191
|
+
.toJSON();
|
|
192
|
+
const withError = renderer
|
|
193
|
+
.create(
|
|
194
|
+
<Accordion
|
|
195
|
+
accordionData={[{ ...accordionData[0], accordionType: "error" }]}
|
|
196
|
+
id="accordian"
|
|
197
|
+
isDefaultOpen
|
|
198
|
+
/>
|
|
199
|
+
)
|
|
200
|
+
.toJSON();
|
|
201
|
+
const withWarning = renderer
|
|
202
|
+
.create(
|
|
203
|
+
<Accordion
|
|
204
|
+
accordionData={[{ ...accordionData[0], accordionType: "warning" }]}
|
|
205
|
+
id="accordian"
|
|
206
|
+
isDefaultOpen
|
|
207
|
+
/>
|
|
208
|
+
)
|
|
209
|
+
.toJSON();
|
|
210
|
+
const withChakraProps = renderer
|
|
211
|
+
.create(
|
|
212
|
+
<Accordion
|
|
213
|
+
accordionData={accordionData}
|
|
214
|
+
id="accordian"
|
|
215
|
+
p="s"
|
|
216
|
+
color="ui.error.primary"
|
|
217
|
+
/>
|
|
218
|
+
)
|
|
219
|
+
.toJSON();
|
|
220
|
+
const withOtherProps = renderer
|
|
221
|
+
.create(
|
|
222
|
+
<Accordion
|
|
223
|
+
accordionData={accordionData}
|
|
224
|
+
id="accordian"
|
|
225
|
+
data-testid="testid"
|
|
226
|
+
/>
|
|
227
|
+
)
|
|
228
|
+
.toJSON();
|
|
229
|
+
|
|
230
|
+
expect(primary).toMatchSnapshot();
|
|
231
|
+
expect(defaultOpen).toMatchSnapshot();
|
|
232
|
+
expect(withChakraProps).toMatchSnapshot();
|
|
233
|
+
expect(withOtherProps).toMatchSnapshot();
|
|
234
|
+
expect(withError).toMatchSnapshot();
|
|
235
|
+
expect(withWarning).toMatchSnapshot();
|
|
236
|
+
});
|
|
237
|
+
});
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Accordion as ChakraAccordion,
|
|
3
|
+
AccordionButton,
|
|
4
|
+
AccordionItem,
|
|
5
|
+
AccordionPanel,
|
|
6
|
+
Box,
|
|
7
|
+
chakra,
|
|
8
|
+
} from "@chakra-ui/react";
|
|
9
|
+
import * as React from "react";
|
|
10
|
+
|
|
11
|
+
import Icon from "../Icons/Icon";
|
|
12
|
+
|
|
13
|
+
export type AccordionTypes = "default" | "warning" | "error";
|
|
14
|
+
export interface AccordionDataProps {
|
|
15
|
+
accordionType?: AccordionTypes;
|
|
16
|
+
label: string;
|
|
17
|
+
panel: string | React.ReactNode;
|
|
18
|
+
}
|
|
19
|
+
export interface AccordionProps {
|
|
20
|
+
/** Array of data to display, and an optional accordionType */
|
|
21
|
+
accordionData: AccordionDataProps[];
|
|
22
|
+
/** ID that other components can cross reference for accessibility purposes */
|
|
23
|
+
id?: string;
|
|
24
|
+
/** Whether the accordion is open by default only on its initial rendering */
|
|
25
|
+
isDefaultOpen?: boolean;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Get the minus or plus icon depending on whether the accordion
|
|
30
|
+
* is open or closed.
|
|
31
|
+
*/
|
|
32
|
+
const getIcon = (isExpanded = false, index: number, id: string) => {
|
|
33
|
+
const iconName = isExpanded ? "minus" : "plus";
|
|
34
|
+
return (
|
|
35
|
+
<Icon id={`accordion-${id}-icon-${index}`} name={iconName} size="small" />
|
|
36
|
+
);
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Returns `AccordionItems` for every accordion object in the data
|
|
41
|
+
* array. This automatically creates the `AccordionButton` and `AccordionPanel`
|
|
42
|
+
* combination that is required for the Chakra `Accordion` component.
|
|
43
|
+
*/
|
|
44
|
+
const getElementsFromData = (data: AccordionDataProps[] = [], id: string) => {
|
|
45
|
+
const colorMap = {
|
|
46
|
+
default: "ui.white",
|
|
47
|
+
warning: "ui.status.primary",
|
|
48
|
+
error: "ui.status.secondary",
|
|
49
|
+
};
|
|
50
|
+
// For FAQ-style multiple accordions, the button should be bigger.
|
|
51
|
+
// Otherwise, use the default.
|
|
52
|
+
const multipleFontSize = data?.length > 1 ? "text.default" : "text.caption";
|
|
53
|
+
const multiplePadding = data?.length > 1 ? "s" : "xs s";
|
|
54
|
+
|
|
55
|
+
return data.map((content, index) => {
|
|
56
|
+
// This is done to support both string and DOM element input.
|
|
57
|
+
const panel =
|
|
58
|
+
typeof content.panel === "string" ? (
|
|
59
|
+
<AccordionPanel
|
|
60
|
+
id={`${id}-panel-${index}`}
|
|
61
|
+
key={index}
|
|
62
|
+
dangerouslySetInnerHTML={{ __html: content.panel }}
|
|
63
|
+
/>
|
|
64
|
+
) : (
|
|
65
|
+
<AccordionPanel id={`${id}-panel-${index}`} key={index}>
|
|
66
|
+
{content.panel}
|
|
67
|
+
</AccordionPanel>
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
return (
|
|
71
|
+
<AccordionItem id={`${id}-item-${index}`} key={index}>
|
|
72
|
+
{/* Get the current state to render the correct icon. */}
|
|
73
|
+
{({ isExpanded }) => {
|
|
74
|
+
const bgColorByAccordionType = colorMap[content.accordionType];
|
|
75
|
+
return (
|
|
76
|
+
<>
|
|
77
|
+
<AccordionButton
|
|
78
|
+
id={`${id}-button-${index}`}
|
|
79
|
+
padding={multiplePadding}
|
|
80
|
+
bg={
|
|
81
|
+
!content.accordionType
|
|
82
|
+
? colorMap.default
|
|
83
|
+
: bgColorByAccordionType
|
|
84
|
+
}
|
|
85
|
+
_expanded={{
|
|
86
|
+
bg:
|
|
87
|
+
!content.accordionType ||
|
|
88
|
+
content.accordionType === "default"
|
|
89
|
+
? "ui.gray.light-cool"
|
|
90
|
+
: bgColorByAccordionType,
|
|
91
|
+
}}
|
|
92
|
+
_hover={{
|
|
93
|
+
bg:
|
|
94
|
+
!content.accordionType ||
|
|
95
|
+
content.accordionType === "default"
|
|
96
|
+
? "transparent"
|
|
97
|
+
: bgColorByAccordionType,
|
|
98
|
+
borderColor: "ui.gray.dark",
|
|
99
|
+
}}
|
|
100
|
+
>
|
|
101
|
+
<Box flex="1" fontSize={multipleFontSize} textAlign="left">
|
|
102
|
+
{content.label}
|
|
103
|
+
</Box>
|
|
104
|
+
{getIcon(isExpanded, index, id)}
|
|
105
|
+
</AccordionButton>
|
|
106
|
+
{panel}
|
|
107
|
+
</>
|
|
108
|
+
);
|
|
109
|
+
}}
|
|
110
|
+
</AccordionItem>
|
|
111
|
+
);
|
|
112
|
+
});
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Accordion component that shows content on toggle. Can be used to display
|
|
117
|
+
* multiple accordion items together.
|
|
118
|
+
*/
|
|
119
|
+
export const Accordion = chakra((props: AccordionProps) => {
|
|
120
|
+
const { accordionData, id, isDefaultOpen = false, ...rest } = props;
|
|
121
|
+
|
|
122
|
+
// Pass `0` to open the first accordion in the 0-index based array.
|
|
123
|
+
const openFirstAccordion = isDefaultOpen ? [0] : undefined;
|
|
124
|
+
|
|
125
|
+
return (
|
|
126
|
+
<ChakraAccordion
|
|
127
|
+
id={id}
|
|
128
|
+
defaultIndex={openFirstAccordion}
|
|
129
|
+
allowMultiple
|
|
130
|
+
{...rest}
|
|
131
|
+
>
|
|
132
|
+
{getElementsFromData(accordionData, id)}
|
|
133
|
+
</ChakraAccordion>
|
|
134
|
+
);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
export default Accordion;
|