@nypl/design-system-react-components 0.25.12 → 0.26.1
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 +131 -1
- package/README.md +10 -10
- package/dist/components/Accordion/Accordion.d.ts +6 -4
- package/dist/components/Accordion/AccordionTypes.d.ts +5 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +4 -4
- package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +1 -1
- package/dist/components/Button/Button.d.ts +2 -2
- package/dist/components/Card/Card.d.ts +22 -29
- package/dist/components/Checkbox/Checkbox.d.ts +3 -3
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +9 -6
- package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +1 -1
- package/dist/components/DatePicker/DatePicker.d.ts +5 -6
- package/dist/components/Fieldset/Fieldset.d.ts +5 -6
- package/dist/components/Form/Form.d.ts +6 -6
- package/dist/components/Grid/GridTypes.d.ts +7 -7
- package/dist/components/Grid/SimpleGrid.d.ts +1 -1
- package/dist/components/Heading/Heading.d.ts +5 -5
- package/dist/components/Heading/HeadingTypes.d.ts +1 -1
- package/dist/components/HelperErrorText/HelperErrorText.d.ts +9 -8
- package/dist/components/Hero/Hero.d.ts +9 -5
- package/dist/components/HorizontalRule/HorizontalRule.d.ts +2 -10
- package/dist/components/Icons/Icon.d.ts +2 -1
- package/dist/components/Icons/IconTypes.d.ts +1 -0
- package/dist/components/Image/Image.d.ts +27 -9
- package/dist/components/Image/ImageTypes.d.ts +4 -4
- package/dist/components/Label/Label.d.ts +7 -4
- package/dist/components/Link/Link.d.ts +1 -1
- package/dist/components/List/List.d.ts +11 -11
- package/dist/components/List/ListTypes.d.ts +1 -1
- package/dist/components/Logo/Logo.d.ts +2 -1
- package/dist/components/Logo/LogoSvgs.d.ts +2 -0
- package/dist/components/Logo/LogoTypes.d.ts +4 -2
- package/dist/components/Notification/Notification.d.ts +7 -7
- package/dist/components/Pagination/Pagination.d.ts +2 -2
- package/dist/components/ProgressIndicator/ProgressIndicator.d.ts +3 -3
- package/dist/components/Radio/Radio.d.ts +5 -7
- package/dist/components/RadioGroup/RadioGroup.d.ts +16 -8
- package/dist/components/SearchBar/SearchBar.d.ts +4 -4
- package/dist/components/Select/Select.d.ts +12 -8
- package/dist/components/Select/SelectTypes.d.ts +4 -0
- package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +8 -6
- package/dist/components/SkeletonLoader/SkeletonLoaderTypes.d.ts +0 -4
- package/dist/components/Slider/Slider.d.ts +6 -4
- package/dist/components/StatusBadge/StatusBadge.d.ts +5 -1
- package/dist/components/StructuredContent/StructuredContent.d.ts +10 -23
- package/dist/components/Table/Table.d.ts +1 -1
- package/dist/components/Tabs/Tabs.d.ts +7 -6
- package/dist/components/Template/Template.d.ts +17 -8
- package/dist/components/Text/Text.d.ts +4 -4
- package/dist/components/Text/TextTypes.d.ts +1 -1
- package/dist/components/TextInput/TextInput.d.ts +7 -7
- package/dist/components/Toggle/Toggle.d.ts +8 -10
- package/dist/components/Toggle/{ToggleSizes.d.ts → ToggleTypes.d.ts} +1 -1
- package/dist/components/VideoPlayer/VideoPlayer.d.ts +2 -1
- package/dist/design-system-react-components.cjs.development.js +2075 -1468
- 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 +2086 -1483
- package/dist/design-system-react-components.esm.js.map +1 -1
- package/dist/helpers/enums.d.ts +4 -0
- package/dist/hooks/useCarouselStyles.d.ts +3 -2
- package/dist/hooks/useNYPLTheme.d.ts +12 -0
- package/dist/index.d.ts +11 -9
- package/dist/styles.css +1 -1
- package/dist/theme/components/accordion.d.ts +7 -12
- package/dist/theme/components/breadcrumb.d.ts +3 -0
- package/dist/theme/components/button.d.ts +10 -2
- package/dist/theme/components/card.d.ts +44 -24
- package/dist/theme/components/checkbox.d.ts +6 -4
- package/dist/theme/components/checkboxGroup.d.ts +4 -2
- package/dist/theme/components/componentWrapper.d.ts +2 -2
- package/dist/theme/components/customTable.d.ts +84 -1
- package/dist/theme/components/fieldset.d.ts +4 -14
- package/dist/theme/components/global.d.ts +25 -18
- package/dist/theme/components/heading.d.ts +53 -0
- package/dist/theme/components/helperErrorText.d.ts +1 -0
- package/dist/theme/components/hero.d.ts +21 -15
- package/dist/theme/components/image.d.ts +1 -1
- package/dist/theme/components/label.d.ts +9 -10
- package/dist/theme/components/list.d.ts +99 -9
- package/dist/theme/components/notification.d.ts +4 -4
- package/dist/theme/components/pagination.d.ts +2 -5
- package/dist/theme/components/radio.d.ts +7 -4
- package/dist/theme/components/radioGroup.d.ts +4 -2
- package/dist/theme/components/select.d.ts +37 -5
- package/dist/theme/components/skeletonLoader.d.ts +2 -2
- package/dist/theme/components/slider.d.ts +6 -3
- package/dist/theme/components/structuredContent.d.ts +197 -0
- package/dist/theme/components/textInput.d.ts +18 -6
- package/dist/theme/components/toggle.d.ts +20 -5
- package/dist/theme/foundations/global.d.ts +2 -0
- package/dist/theme/foundations/radii.d.ts +1 -0
- package/dist/theme/foundations/spacing.d.ts +46 -43
- package/package.json +5 -6
- package/src/components/AccessibilityGuide/SkipNavigation.stories.mdx +34 -0
- package/src/components/Accordion/Accordion.stories.mdx +150 -66
- package/src/components/Accordion/Accordion.test.tsx +65 -17
- package/src/components/Accordion/Accordion.tsx +61 -27
- package/src/components/Accordion/AccordionTypes.tsx +5 -0
- package/src/components/Accordion/__snapshots__/Accordion.test.tsx.snap +505 -14
- package/src/components/Autosuggest/Autosuggest.stories.mdx +4 -3
- package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +37 -19
- package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +57 -36
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +14 -13
- package/src/components/Breadcrumbs/BreadcrumbsTypes.tsx +1 -1
- package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +211 -12
- package/src/components/Button/Button.stories.mdx +87 -23
- package/src/components/Button/Button.test.tsx +25 -0
- package/src/components/Button/Button.tsx +18 -7
- package/src/components/Button/__snapshots__/Button.test.tsx.snap +27 -7
- package/src/components/Card/Card.stories.mdx +493 -329
- package/src/components/Card/Card.test.tsx +138 -18
- package/src/components/Card/Card.tsx +151 -85
- package/src/components/Card/__snapshots__/Card.test.tsx.snap +221 -101
- package/src/components/Chakra/Center.stories.mdx +2 -2
- package/src/components/Chakra/Grid.stories.mdx +4 -4
- package/src/components/Checkbox/Checkbox.stories.mdx +73 -9
- package/src/components/Checkbox/Checkbox.test.tsx +89 -10
- package/src/components/Checkbox/Checkbox.tsx +26 -16
- package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +209 -6
- package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +135 -23
- package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +216 -90
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +39 -26
- package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +493 -89
- package/src/components/ComponentWrapper/ComponentWrapper.test.tsx +12 -0
- package/src/components/ComponentWrapper/ComponentWrapper.tsx +39 -41
- package/src/components/ComponentWrapper/__snapshots__/ComponentWrapper.test.tsx.snap +47 -34
- package/src/components/DatePicker/DatePicker.stories.mdx +63 -27
- package/src/components/DatePicker/DatePicker.test.tsx +94 -15
- package/src/components/DatePicker/DatePicker.tsx +67 -58
- package/src/components/DatePicker/_DatePicker.scss +71 -13
- package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +250 -206
- package/src/components/Fieldset/Fieldset.stories.mdx +33 -3
- package/src/components/Fieldset/Fieldset.test.tsx +58 -28
- package/src/components/Fieldset/Fieldset.tsx +35 -30
- package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +40 -19
- package/src/components/Form/Form.stories.mdx +118 -47
- package/src/components/Form/Form.test.tsx +59 -16
- package/src/components/Form/Form.tsx +89 -65
- package/src/components/Form/__snapshots__/Form.test.tsx.snap +83 -5
- package/src/components/Grid/GridTypes.tsx +7 -7
- package/src/components/Grid/SimpleGrid.stories.mdx +87 -41
- package/src/components/Grid/SimpleGrid.test.tsx +24 -9
- package/src/components/Grid/SimpleGrid.tsx +29 -20
- package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +16 -1
- package/src/components/Heading/Heading.stories.mdx +56 -25
- package/src/components/Heading/Heading.test.tsx +17 -7
- package/src/components/Heading/Heading.tsx +60 -58
- package/src/components/Heading/HeadingTypes.tsx +1 -1
- package/src/components/Heading/__snapshots__/Heading.test.tsx.snap +27 -8
- package/src/components/HelperErrorText/HelperErrorText.stories.mdx +64 -42
- package/src/components/HelperErrorText/HelperErrorText.test.tsx +15 -0
- package/src/components/HelperErrorText/HelperErrorText.tsx +40 -35
- package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +35 -4
- package/src/components/Hero/Hero.stories.mdx +143 -113
- package/src/components/Hero/Hero.test.tsx +146 -58
- package/src/components/Hero/Hero.tsx +144 -112
- package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +89 -17
- package/src/components/HorizontalRule/HorizontalRule.stories.mdx +26 -4
- package/src/components/HorizontalRule/HorizontalRule.test.tsx +9 -17
- package/src/components/HorizontalRule/HorizontalRule.tsx +9 -25
- package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +18 -5
- package/src/components/Icons/Icon.stories.mdx +80 -23
- package/src/components/Icons/Icon.test.tsx +51 -2
- package/src/components/Icons/Icon.tsx +93 -71
- package/src/components/Icons/IconTypes.tsx +1 -0
- package/src/components/Icons/__snapshots__/Icon.test.tsx.snap +129 -0
- package/src/components/Image/Image.stories.mdx +160 -71
- package/src/components/Image/Image.test.tsx +40 -48
- package/src/components/Image/Image.tsx +80 -48
- package/src/components/Image/ImageTypes.ts +4 -4
- package/src/components/Image/__snapshots__/Image.test.tsx.snap +84 -21
- package/src/components/Label/Label.stories.mdx +42 -20
- package/src/components/Label/Label.test.tsx +42 -17
- package/src/components/Label/Label.tsx +22 -13
- package/src/components/Label/__snapshots__/Label.test.tsx.snap +19 -15
- package/src/components/Link/Link.stories.mdx +25 -1
- package/src/components/Link/Link.test.tsx +21 -0
- package/src/components/Link/Link.tsx +16 -9
- package/src/components/Link/__snapshots__/Link.test.tsx.snap +37 -11
- package/src/components/List/List.stories.mdx +75 -40
- package/src/components/List/List.test.tsx +73 -22
- package/src/components/List/List.tsx +44 -28
- package/src/components/List/ListTypes.tsx +1 -1
- package/src/components/List/__snapshots__/List.test.tsx.snap +110 -8
- package/src/components/Logo/Logo.stories.mdx +40 -16
- package/src/components/Logo/Logo.test.tsx +29 -2
- package/src/components/Logo/Logo.tsx +28 -11
- package/src/components/Logo/LogoSvgs.tsx +4 -0
- package/src/components/Logo/LogoTypes.tsx +3 -1
- package/src/components/Logo/__snapshots__/Logo.test.tsx.snap +73 -2
- package/src/components/Modal/Modal.stories.mdx +13 -0
- package/src/components/Notification/Notification.stories.mdx +29 -5
- package/src/components/Notification/Notification.test.tsx +23 -0
- package/src/components/Notification/Notification.tsx +53 -51
- package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +158 -29
- package/src/components/Pagination/Pagination.stories.mdx +27 -6
- package/src/components/Pagination/Pagination.test.tsx +55 -2
- package/src/components/Pagination/Pagination.tsx +12 -9
- package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +244 -27
- package/src/components/Placeholder/Placeholder.tsx +3 -1
- package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +76 -10
- package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +87 -13
- package/src/components/ProgressIndicator/ProgressIndicator.tsx +20 -10
- package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +101 -14
- package/src/components/Radio/Radio.stories.mdx +75 -11
- package/src/components/Radio/Radio.test.tsx +83 -9
- package/src/components/Radio/Radio.tsx +70 -62
- package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +163 -5
- package/src/components/RadioGroup/RadioGroup.stories.mdx +293 -94
- package/src/components/RadioGroup/RadioGroup.test.tsx +193 -68
- package/src/components/RadioGroup/RadioGroup.tsx +110 -101
- package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +1258 -902
- package/src/components/SearchBar/SearchBar.stories.mdx +101 -36
- package/src/components/SearchBar/{SearchBar.Test.tsx → SearchBar.test.tsx} +46 -4
- package/src/components/SearchBar/SearchBar.tsx +20 -11
- package/src/components/SearchBar/__snapshots__/SearchBar.test.tsx.snap +1039 -0
- package/src/components/Select/Select.stories.mdx +151 -62
- package/src/components/Select/Select.test.tsx +56 -44
- package/src/components/Select/Select.tsx +125 -104
- package/src/components/Select/SelectTypes.tsx +5 -0
- package/src/components/Select/__snapshots__/Select.test.tsx.snap +749 -409
- package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +53 -23
- package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +14 -8
- package/src/components/SkeletonLoader/SkeletonLoader.tsx +80 -78
- package/src/components/SkeletonLoader/SkeletonLoaderTypes.tsx +0 -5
- package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +169 -10
- package/src/components/Slider/Slider.stories.mdx +123 -41
- package/src/components/Slider/Slider.test.tsx +65 -17
- package/src/components/Slider/Slider.tsx +30 -23
- package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +403 -226
- package/src/components/StatusBadge/StatusBadge.stories.mdx +19 -1
- package/src/components/StatusBadge/StatusBadge.test.tsx +19 -1
- package/src/components/StatusBadge/StatusBadge.tsx +25 -20
- package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +22 -3
- package/src/components/StructuredContent/StructuredContent.stories.mdx +229 -61
- package/src/components/StructuredContent/StructuredContent.test.tsx +162 -101
- package/src/components/StructuredContent/StructuredContent.tsx +98 -103
- package/src/components/StructuredContent/__snapshots__/StructuredContent.test.tsx.snap +102 -17
- package/src/components/StyleGuide/Bidirectionality.stories.mdx +5 -5
- package/src/components/StyleGuide/Breakpoints.stories.mdx +6 -6
- package/src/components/StyleGuide/Buttons.stories.mdx +2 -12
- package/src/components/StyleGuide/ColorCard.tsx +4 -4
- package/src/components/StyleGuide/Colors.stories.mdx +1 -2
- package/src/components/StyleGuide/DesignTokens.stories.mdx +56 -26
- package/src/components/StyleGuide/Forms.stories.mdx +27 -12
- package/src/components/StyleGuide/Iconography.stories.mdx +2 -12
- package/src/components/StyleGuide/Spacing.stories.mdx +80 -41
- package/src/components/StyleGuide/Typography.stories.mdx +47 -33
- package/src/components/Table/Table.stories.mdx +38 -11
- package/src/components/Table/Table.test.tsx +16 -1
- package/src/components/Table/Table.tsx +10 -8
- package/src/components/Table/__snapshots__/Table.test.tsx.snap +408 -5
- package/src/components/Tabs/Tabs.stories.mdx +59 -10
- package/src/components/Tabs/Tabs.test.tsx +29 -11
- package/src/components/Tabs/Tabs.tsx +28 -21
- package/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap +394 -5
- package/src/components/Template/Template.stories.mdx +73 -32
- package/src/components/Template/Template.test.tsx +68 -5
- package/src/components/Template/Template.tsx +89 -71
- package/src/components/Template/__snapshots__/Template.test.tsx.snap +195 -22
- package/src/components/Text/Text.stories.mdx +32 -15
- package/src/components/Text/Text.test.tsx +14 -11
- package/src/components/Text/Text.tsx +13 -16
- package/src/components/Text/TextTypes.tsx +1 -1
- package/src/components/Text/__snapshots__/Text.test.tsx.snap +21 -4
- package/src/components/TextInput/TextInput.stories.mdx +73 -27
- package/src/components/TextInput/TextInput.test.tsx +65 -50
- package/src/components/TextInput/TextInput.tsx +123 -115
- package/src/components/TextInput/__snapshots__/TextInput.test.tsx.snap +96 -73
- package/src/components/Toggle/Toggle.stories.mdx +74 -26
- package/src/components/Toggle/Toggle.test.tsx +41 -10
- package/src/components/Toggle/Toggle.tsx +29 -26
- package/src/components/Toggle/{ToggleSizes.tsx → ToggleTypes.tsx} +1 -1
- package/src/components/Toggle/__snapshots__/Toggle.test.tsx.snap +191 -4
- package/src/components/VideoPlayer/VideoPlayer.stories.mdx +52 -4
- package/src/components/VideoPlayer/VideoPlayer.test.tsx +41 -6
- package/src/components/VideoPlayer/VideoPlayer.tsx +134 -120
- package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +81 -39
- package/src/docs/Chakra.stories.mdx +50 -9
- package/src/docs/Welcome.stories.mdx +168 -0
- package/src/{components/Card/CardTypes.tsx → helpers/enums.ts} +2 -2
- package/src/hooks/tests/useNYPLTheme.test.tsx +1 -1
- package/src/hooks/useCarouselStyles.stories.mdx +30 -0
- package/src/hooks/useCarouselStyles.ts +3 -2
- package/src/hooks/useNYPLTheme.stories.mdx +101 -0
- package/src/hooks/useNYPLTheme.ts +31 -7
- package/src/hooks/useWindowSize.stories.mdx +23 -0
- package/src/index.ts +11 -15
- package/src/styles/base/_place-holder.scss +1 -1
- package/src/theme/components/accordion.ts +7 -12
- package/src/theme/components/breadcrumb.ts +3 -0
- package/src/theme/components/button.ts +15 -7
- package/src/theme/components/card.ts +56 -36
- package/src/theme/components/checkbox.ts +10 -8
- package/src/theme/components/checkboxGroup.ts +4 -2
- package/src/theme/components/componentWrapper.ts +2 -2
- package/src/theme/components/customTable.ts +39 -31
- package/src/theme/components/fieldset.ts +1 -2
- package/src/theme/components/global.ts +29 -23
- package/src/theme/components/heading.ts +1 -1
- package/src/theme/components/helperErrorText.ts +1 -0
- package/src/theme/components/hero.ts +14 -16
- package/src/theme/components/icon.ts +5 -2
- package/src/theme/components/image.ts +1 -1
- package/src/theme/components/label.ts +4 -3
- package/src/theme/components/list.ts +73 -66
- package/src/theme/components/notification.ts +7 -7
- package/src/theme/components/pagination.ts +2 -5
- package/src/theme/components/progressIndicator.ts +3 -3
- package/src/theme/components/radio.ts +9 -9
- package/src/theme/components/radioGroup.ts +4 -2
- package/src/theme/components/select.ts +35 -16
- package/src/theme/components/skeletonLoader.ts +3 -3
- package/src/theme/components/slider.ts +8 -7
- package/src/theme/components/statusBadge.ts +2 -2
- package/src/theme/components/structuredContent.ts +66 -1
- package/src/theme/components/tabs.ts +2 -2
- package/src/theme/components/template.ts +9 -9
- package/src/theme/components/textInput.ts +13 -12
- package/src/theme/components/toggle.ts +43 -13
- package/src/theme/components/videoPlayer.ts +1 -1
- package/src/theme/foundations/colors.ts +1 -1
- package/src/theme/foundations/radii.ts +1 -0
- package/src/theme/foundations/spacing.ts +70 -22
- package/src/theme/foundations/typography.ts +2 -2
- package/src/utils/componentCategories.ts +28 -21
- package/dist/components/Card/CardTypes.d.ts +0 -4
- package/dist/components/CheckboxGroup/CheckboxGroupLayoutTypes.d.ts +0 -4
- package/dist/components/RadioGroup/RadioGroupLayoutTypes.d.ts +0 -4
- package/dist/components/SearchBar/SearchBar.Test.d.ts +0 -1
- package/dist/helpers/generateUUID.d.ts +0 -1
- package/src/components/CheckboxGroup/CheckboxGroupLayoutTypes.tsx +0 -4
- package/src/components/RadioGroup/RadioGroupLayoutTypes.tsx +0 -4
- package/src/docs/Intro.stories.mdx +0 -53
- package/src/helpers/generateUUID.tsx +0 -5
|
@@ -1,17 +1,39 @@
|
|
|
1
|
-
import { Box, useMultiStyleConfig } from "@chakra-ui/react";
|
|
1
|
+
import { Box, chakra, useMultiStyleConfig } from "@chakra-ui/react";
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
|
|
4
4
|
import { ImageRatios, ImageSizes, ImageTypes } from "./ImageTypes";
|
|
5
5
|
|
|
6
|
+
// Used for components that have an `imageProps` prop.
|
|
7
|
+
export interface ComponentImageProps {
|
|
8
|
+
/** String value used to populate the `alt` attribute of the internal `Image`
|
|
9
|
+
* component's `img` element. @NOTE if an image is used, this value must be passed. */
|
|
10
|
+
alt?: string;
|
|
11
|
+
/** Optional value to control the aspect ratio of the internal `Image` component.
|
|
12
|
+
* Defaults to `ImageRatios.Square`. */
|
|
13
|
+
aspectRatio?: ImageRatios;
|
|
14
|
+
/** Optional value to render as a caption for the internal `Image` component. */
|
|
15
|
+
caption?: string;
|
|
16
|
+
/** Optional DOM element to use instead of the DS `Image` component. */
|
|
17
|
+
component?: JSX.Element;
|
|
18
|
+
/** Optional value to render as a credit for the internal `Image` component. */
|
|
19
|
+
credit?: string;
|
|
20
|
+
/** Optional value to control the size of the internal `Image` component.
|
|
21
|
+
* Defaults to `ImageSizes.Medium`. */
|
|
22
|
+
size?: ImageSizes;
|
|
23
|
+
/** Optional value that contains the path to an image. If omitted, the internal
|
|
24
|
+
* DS `Image` component will not render. */
|
|
25
|
+
src?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
6
28
|
interface ImageWrapperProps {
|
|
7
29
|
/** Optionally pass in additional Chakra-based styles. */
|
|
8
30
|
additionalWrapperStyles?: { [key: string]: any };
|
|
9
31
|
/** ClassName you can add in addition to 'image' */
|
|
10
32
|
className?: string;
|
|
11
33
|
/** Optional value to control the aspect ratio of the cartd image; default value is `square` */
|
|
12
|
-
|
|
34
|
+
aspectRatio?: ImageRatios;
|
|
13
35
|
/** Optional value to control the size of the image */
|
|
14
|
-
|
|
36
|
+
size?: ImageSizes;
|
|
15
37
|
}
|
|
16
38
|
|
|
17
39
|
export interface ImageProps extends ImageWrapperProps {
|
|
@@ -21,67 +43,72 @@ export interface ImageProps extends ImageWrapperProps {
|
|
|
21
43
|
additionalImageStyles?: { [key: string]: any };
|
|
22
44
|
/** Alternate text description of the image */
|
|
23
45
|
alt: string;
|
|
46
|
+
/** Adding will wrap the image in a <figure> */
|
|
47
|
+
caption?: string;
|
|
24
48
|
/** Custom image component */
|
|
25
49
|
component?: JSX.Element | null;
|
|
26
50
|
/** Adding will wrap the image in a <figure> */
|
|
27
|
-
|
|
28
|
-
/** Adding will wrap the image in a <figure> */
|
|
29
|
-
imageCredit?: string;
|
|
30
|
-
/** Optional value to control the size of the image */
|
|
31
|
-
imageSize?: ImageSizes;
|
|
51
|
+
credit?: string;
|
|
32
52
|
/** Optional value for the image type */
|
|
33
53
|
imageType?: ImageTypes;
|
|
34
54
|
/** The src attribute is required, and contains the path to the image you want to embed. */
|
|
35
55
|
src: string;
|
|
36
56
|
}
|
|
37
57
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
{
|
|
58
|
+
const ImageWrapper = chakra(
|
|
59
|
+
(props: React.PropsWithChildren<ImageWrapperProps>) => {
|
|
60
|
+
const {
|
|
61
|
+
additionalWrapperStyles = {},
|
|
62
|
+
className = "",
|
|
63
|
+
children,
|
|
64
|
+
aspectRatio = ImageRatios.Original,
|
|
65
|
+
size = ImageSizes.Default,
|
|
66
|
+
...rest
|
|
67
|
+
} = props;
|
|
68
|
+
const styles = useMultiStyleConfig("CustomImageWrapper", {
|
|
69
|
+
ratio: aspectRatio,
|
|
70
|
+
size,
|
|
71
|
+
});
|
|
72
|
+
return (
|
|
73
|
+
<Box
|
|
74
|
+
className={`the-wrap ${className}`}
|
|
75
|
+
__css={{ ...styles, ...additionalWrapperStyles }}
|
|
76
|
+
{...rest}
|
|
77
|
+
>
|
|
78
|
+
<Box className="the-crop" __css={styles.crop}>
|
|
79
|
+
{children}
|
|
80
|
+
</Box>
|
|
57
81
|
</Box>
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
);
|
|
61
85
|
|
|
62
|
-
export
|
|
86
|
+
export const Image = chakra((props: ImageProps) => {
|
|
63
87
|
const {
|
|
64
88
|
additionalFigureStyles = {},
|
|
65
89
|
additionalImageStyles = {},
|
|
66
90
|
additionalWrapperStyles = {},
|
|
67
91
|
alt,
|
|
92
|
+
aspectRatio = ImageRatios.Original,
|
|
93
|
+
caption,
|
|
68
94
|
className = "",
|
|
69
95
|
component,
|
|
70
|
-
|
|
71
|
-
imageCaption,
|
|
72
|
-
imageCredit,
|
|
73
|
-
imageSize = ImageSizes.Default,
|
|
96
|
+
credit,
|
|
74
97
|
imageType = ImageTypes.Default,
|
|
98
|
+
size = ImageSizes.Default,
|
|
75
99
|
src,
|
|
100
|
+
...rest
|
|
76
101
|
} = props;
|
|
77
|
-
const useImageWrapper =
|
|
102
|
+
const useImageWrapper = aspectRatio !== ImageRatios.Original;
|
|
78
103
|
const styles = useMultiStyleConfig("CustomImage", {
|
|
79
104
|
variant: imageType,
|
|
80
|
-
size
|
|
105
|
+
size,
|
|
81
106
|
});
|
|
82
107
|
|
|
83
108
|
if (alt && alt.length > 300) {
|
|
84
|
-
throw new Error(
|
|
109
|
+
throw new Error(
|
|
110
|
+
"NYPL Reservoir Image: Alt text must be less than 300 characters."
|
|
111
|
+
);
|
|
85
112
|
}
|
|
86
113
|
|
|
87
114
|
const imageComponent: JSX.Element = component ? (
|
|
@@ -96,10 +123,11 @@ export default function Image(props: ImageProps) {
|
|
|
96
123
|
);
|
|
97
124
|
const finalImage = useImageWrapper ? (
|
|
98
125
|
<ImageWrapper
|
|
99
|
-
className={className}
|
|
100
|
-
imageAspectRatio={imageAspectRatio}
|
|
101
|
-
imageSize={imageSize}
|
|
102
126
|
additionalWrapperStyles={additionalWrapperStyles}
|
|
127
|
+
aspectRatio={aspectRatio}
|
|
128
|
+
className={className}
|
|
129
|
+
size={size}
|
|
130
|
+
{...(caption || credit ? {} : rest)}
|
|
103
131
|
>
|
|
104
132
|
{imageComponent}
|
|
105
133
|
</ImageWrapper>
|
|
@@ -107,17 +135,21 @@ export default function Image(props: ImageProps) {
|
|
|
107
135
|
imageComponent
|
|
108
136
|
);
|
|
109
137
|
|
|
110
|
-
return
|
|
111
|
-
<Box
|
|
138
|
+
return caption || credit ? (
|
|
139
|
+
<Box
|
|
140
|
+
as="figure"
|
|
141
|
+
__css={{ ...styles.figure, ...additionalFigureStyles }}
|
|
142
|
+
{...rest}
|
|
143
|
+
>
|
|
112
144
|
{finalImage}
|
|
113
145
|
<Box as="figcaption" __css={styles.figcaption}>
|
|
114
|
-
{
|
|
115
|
-
|
|
116
|
-
)}
|
|
117
|
-
{imageCredit && <Box __css={styles.captionWrappers}>{imageCredit}</Box>}
|
|
146
|
+
{caption && <Box __css={styles.captionWrappers}>{caption}</Box>}
|
|
147
|
+
{credit && <Box __css={styles.captionWrappers}>{credit}</Box>}
|
|
118
148
|
</Box>
|
|
119
149
|
</Box>
|
|
120
150
|
) : (
|
|
121
151
|
finalImage
|
|
122
152
|
);
|
|
123
|
-
}
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
export default Image;
|
|
@@ -11,11 +11,11 @@ export enum ImageRatios {
|
|
|
11
11
|
|
|
12
12
|
export enum ImageSizes {
|
|
13
13
|
Default = "default",
|
|
14
|
-
Large = "large",
|
|
15
|
-
Medium = "medium",
|
|
16
|
-
Small = "small",
|
|
17
|
-
ExtraSmall = "xsmall",
|
|
18
14
|
ExtraExtraSmall = "xxsmall",
|
|
15
|
+
ExtraSmall = "xsmall",
|
|
16
|
+
Small = "small",
|
|
17
|
+
Medium = "medium",
|
|
18
|
+
Large = "large",
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
export enum ImageTypes {
|
|
@@ -30,6 +30,53 @@ exports[`Image Renders the UI snapshot correctly 2`] = `
|
|
|
30
30
|
`;
|
|
31
31
|
|
|
32
32
|
exports[`Image Renders the UI snapshot correctly 3`] = `
|
|
33
|
+
<figure
|
|
34
|
+
className="css-0"
|
|
35
|
+
>
|
|
36
|
+
<img
|
|
37
|
+
alt=""
|
|
38
|
+
className="css-0"
|
|
39
|
+
src="test.png"
|
|
40
|
+
/>
|
|
41
|
+
<figcaption
|
|
42
|
+
className="css-0"
|
|
43
|
+
>
|
|
44
|
+
<div
|
|
45
|
+
className="css-0"
|
|
46
|
+
>
|
|
47
|
+
Credit
|
|
48
|
+
</div>
|
|
49
|
+
</figcaption>
|
|
50
|
+
</figure>
|
|
51
|
+
`;
|
|
52
|
+
|
|
53
|
+
exports[`Image Renders the UI snapshot correctly 4`] = `
|
|
54
|
+
<figure
|
|
55
|
+
className="css-0"
|
|
56
|
+
>
|
|
57
|
+
<img
|
|
58
|
+
alt=""
|
|
59
|
+
className="css-0"
|
|
60
|
+
src="test.png"
|
|
61
|
+
/>
|
|
62
|
+
<figcaption
|
|
63
|
+
className="css-0"
|
|
64
|
+
>
|
|
65
|
+
<div
|
|
66
|
+
className="css-0"
|
|
67
|
+
>
|
|
68
|
+
Caption
|
|
69
|
+
</div>
|
|
70
|
+
<div
|
|
71
|
+
className="css-0"
|
|
72
|
+
>
|
|
73
|
+
Credit
|
|
74
|
+
</div>
|
|
75
|
+
</figcaption>
|
|
76
|
+
</figure>
|
|
77
|
+
`;
|
|
78
|
+
|
|
79
|
+
exports[`Image Renders the UI snapshot correctly 5`] = `
|
|
33
80
|
<img
|
|
34
81
|
alt=""
|
|
35
82
|
className="css-0"
|
|
@@ -37,7 +84,7 @@ exports[`Image Renders the UI snapshot correctly 3`] = `
|
|
|
37
84
|
/>
|
|
38
85
|
`;
|
|
39
86
|
|
|
40
|
-
exports[`Image Renders the UI snapshot correctly
|
|
87
|
+
exports[`Image Renders the UI snapshot correctly 6`] = `
|
|
41
88
|
<img
|
|
42
89
|
alt=""
|
|
43
90
|
className="css-0"
|
|
@@ -45,7 +92,7 @@ exports[`Image Renders the UI snapshot correctly 4`] = `
|
|
|
45
92
|
/>
|
|
46
93
|
`;
|
|
47
94
|
|
|
48
|
-
exports[`Image Renders the UI snapshot correctly
|
|
95
|
+
exports[`Image Renders the UI snapshot correctly 7`] = `
|
|
49
96
|
<img
|
|
50
97
|
alt=""
|
|
51
98
|
className="css-0"
|
|
@@ -53,7 +100,7 @@ exports[`Image Renders the UI snapshot correctly 5`] = `
|
|
|
53
100
|
/>
|
|
54
101
|
`;
|
|
55
102
|
|
|
56
|
-
exports[`Image Renders the UI snapshot correctly
|
|
103
|
+
exports[`Image Renders the UI snapshot correctly 8`] = `
|
|
57
104
|
<img
|
|
58
105
|
alt=""
|
|
59
106
|
className="css-0"
|
|
@@ -61,7 +108,7 @@ exports[`Image Renders the UI snapshot correctly 6`] = `
|
|
|
61
108
|
/>
|
|
62
109
|
`;
|
|
63
110
|
|
|
64
|
-
exports[`Image Renders the UI snapshot correctly
|
|
111
|
+
exports[`Image Renders the UI snapshot correctly 9`] = `
|
|
65
112
|
<img
|
|
66
113
|
alt=""
|
|
67
114
|
className="css-0"
|
|
@@ -69,9 +116,9 @@ exports[`Image Renders the UI snapshot correctly 7`] = `
|
|
|
69
116
|
/>
|
|
70
117
|
`;
|
|
71
118
|
|
|
72
|
-
exports[`Image Renders the UI snapshot correctly
|
|
119
|
+
exports[`Image Renders the UI snapshot correctly 10`] = `
|
|
73
120
|
<div
|
|
74
|
-
className="the-wrap
|
|
121
|
+
className="the-wrap css-1u8qly9"
|
|
75
122
|
>
|
|
76
123
|
<div
|
|
77
124
|
className="the-crop css-0"
|
|
@@ -85,9 +132,9 @@ exports[`Image Renders the UI snapshot correctly 8`] = `
|
|
|
85
132
|
</div>
|
|
86
133
|
`;
|
|
87
134
|
|
|
88
|
-
exports[`Image Renders the UI snapshot correctly
|
|
135
|
+
exports[`Image Renders the UI snapshot correctly 11`] = `
|
|
89
136
|
<div
|
|
90
|
-
className="the-wrap
|
|
137
|
+
className="the-wrap css-1u8qly9"
|
|
91
138
|
>
|
|
92
139
|
<div
|
|
93
140
|
className="the-crop css-0"
|
|
@@ -101,7 +148,7 @@ exports[`Image Renders the UI snapshot correctly 9`] = `
|
|
|
101
148
|
</div>
|
|
102
149
|
`;
|
|
103
150
|
|
|
104
|
-
exports[`Image Renders the UI snapshot correctly
|
|
151
|
+
exports[`Image Renders the UI snapshot correctly 12`] = `
|
|
105
152
|
<img
|
|
106
153
|
alt=""
|
|
107
154
|
className="css-0"
|
|
@@ -109,9 +156,9 @@ exports[`Image Renders the UI snapshot correctly 10`] = `
|
|
|
109
156
|
/>
|
|
110
157
|
`;
|
|
111
158
|
|
|
112
|
-
exports[`Image Renders the UI snapshot correctly
|
|
159
|
+
exports[`Image Renders the UI snapshot correctly 13`] = `
|
|
113
160
|
<div
|
|
114
|
-
className="the-wrap
|
|
161
|
+
className="the-wrap css-1u8qly9"
|
|
115
162
|
>
|
|
116
163
|
<div
|
|
117
164
|
className="the-crop css-0"
|
|
@@ -125,9 +172,9 @@ exports[`Image Renders the UI snapshot correctly 11`] = `
|
|
|
125
172
|
</div>
|
|
126
173
|
`;
|
|
127
174
|
|
|
128
|
-
exports[`Image Renders the UI snapshot correctly
|
|
175
|
+
exports[`Image Renders the UI snapshot correctly 14`] = `
|
|
129
176
|
<div
|
|
130
|
-
className="the-wrap
|
|
177
|
+
className="the-wrap css-1u8qly9"
|
|
131
178
|
>
|
|
132
179
|
<div
|
|
133
180
|
className="the-crop css-0"
|
|
@@ -141,9 +188,9 @@ exports[`Image Renders the UI snapshot correctly 12`] = `
|
|
|
141
188
|
</div>
|
|
142
189
|
`;
|
|
143
190
|
|
|
144
|
-
exports[`Image Renders the UI snapshot correctly
|
|
191
|
+
exports[`Image Renders the UI snapshot correctly 15`] = `
|
|
145
192
|
<div
|
|
146
|
-
className="the-wrap
|
|
193
|
+
className="the-wrap css-1u8qly9"
|
|
147
194
|
>
|
|
148
195
|
<div
|
|
149
196
|
className="the-crop css-0"
|
|
@@ -157,9 +204,9 @@ exports[`Image Renders the UI snapshot correctly 13`] = `
|
|
|
157
204
|
</div>
|
|
158
205
|
`;
|
|
159
206
|
|
|
160
|
-
exports[`Image Renders the UI snapshot correctly
|
|
207
|
+
exports[`Image Renders the UI snapshot correctly 16`] = `
|
|
161
208
|
<div
|
|
162
|
-
className="the-wrap
|
|
209
|
+
className="the-wrap css-1u8qly9"
|
|
163
210
|
>
|
|
164
211
|
<div
|
|
165
212
|
className="the-crop css-0"
|
|
@@ -173,9 +220,9 @@ exports[`Image Renders the UI snapshot correctly 14`] = `
|
|
|
173
220
|
</div>
|
|
174
221
|
`;
|
|
175
222
|
|
|
176
|
-
exports[`Image Renders the UI snapshot correctly
|
|
223
|
+
exports[`Image Renders the UI snapshot correctly 17`] = `
|
|
177
224
|
<div
|
|
178
|
-
className="the-wrap
|
|
225
|
+
className="the-wrap css-1u8qly9"
|
|
179
226
|
>
|
|
180
227
|
<div
|
|
181
228
|
className="the-crop css-0"
|
|
@@ -189,9 +236,9 @@ exports[`Image Renders the UI snapshot correctly 15`] = `
|
|
|
189
236
|
</div>
|
|
190
237
|
`;
|
|
191
238
|
|
|
192
|
-
exports[`Image Renders the UI snapshot correctly
|
|
239
|
+
exports[`Image Renders the UI snapshot correctly 18`] = `
|
|
193
240
|
<div
|
|
194
|
-
className="the-wrap
|
|
241
|
+
className="the-wrap css-1u8qly9"
|
|
195
242
|
>
|
|
196
243
|
<div
|
|
197
244
|
className="the-crop css-0"
|
|
@@ -204,3 +251,19 @@ exports[`Image Renders the UI snapshot correctly 16`] = `
|
|
|
204
251
|
</div>
|
|
205
252
|
</div>
|
|
206
253
|
`;
|
|
254
|
+
|
|
255
|
+
exports[`Image Renders the UI snapshot correctly 19`] = `
|
|
256
|
+
<img
|
|
257
|
+
alt=""
|
|
258
|
+
className="css-0"
|
|
259
|
+
src="test.png"
|
|
260
|
+
/>
|
|
261
|
+
`;
|
|
262
|
+
|
|
263
|
+
exports[`Image Renders the UI snapshot correctly 20`] = `
|
|
264
|
+
<img
|
|
265
|
+
alt=""
|
|
266
|
+
className="css-0"
|
|
267
|
+
src="test.png"
|
|
268
|
+
/>
|
|
269
|
+
`;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Box } from "@chakra-ui/react";
|
|
1
|
+
import { Box, VStack } from "@chakra-ui/react";
|
|
2
2
|
import {
|
|
3
3
|
ArgsTable,
|
|
4
4
|
Canvas,
|
|
@@ -19,10 +19,7 @@ import { getCategory } from "../../utils/componentCategories";
|
|
|
19
19
|
argTypes={{
|
|
20
20
|
className: { control: false },
|
|
21
21
|
id: { control: false },
|
|
22
|
-
|
|
23
|
-
control: { type: "select" },
|
|
24
|
-
options: ["Required", "Optional", ""],
|
|
25
|
-
},
|
|
22
|
+
isInlined: { table: { disable: true } },
|
|
26
23
|
text: {
|
|
27
24
|
description: "Only used for Storybook",
|
|
28
25
|
},
|
|
@@ -34,10 +31,21 @@ import { getCategory } from "../../utils/componentCategories";
|
|
|
34
31
|
| Component Version | DS Version |
|
|
35
32
|
| ----------------- | ---------- |
|
|
36
33
|
| Added | `0.0.10` |
|
|
37
|
-
| Latest | `0.
|
|
34
|
+
| Latest | `0.26.0` |
|
|
35
|
+
|
|
36
|
+
## Table of Contents
|
|
37
|
+
|
|
38
|
+
- [Overview](#overview)
|
|
39
|
+
- [Component Props](#component-props)
|
|
40
|
+
- [Accessibility](#accessibility)
|
|
41
|
+
- [isRequired helper text](#isrequired-helper-text)
|
|
42
|
+
|
|
43
|
+
## Overview
|
|
38
44
|
|
|
39
45
|
<Description of={Label} />
|
|
40
46
|
|
|
47
|
+
## Component Props
|
|
48
|
+
|
|
41
49
|
<Canvas>
|
|
42
50
|
<Story
|
|
43
51
|
name="Label with Controls"
|
|
@@ -45,7 +53,7 @@ import { getCategory } from "../../utils/componentCategories";
|
|
|
45
53
|
className: undefined,
|
|
46
54
|
htmlFor: "id-of-input-element",
|
|
47
55
|
id: "label-id",
|
|
48
|
-
|
|
56
|
+
isRequired: false,
|
|
49
57
|
text: "A label for a villager.",
|
|
50
58
|
}}
|
|
51
59
|
>
|
|
@@ -55,24 +63,38 @@ import { getCategory } from "../../utils/componentCategories";
|
|
|
55
63
|
|
|
56
64
|
<ArgsTable story="Label with Controls" />
|
|
57
65
|
|
|
58
|
-
##
|
|
66
|
+
## Accessibility
|
|
67
|
+
|
|
68
|
+
The `Label` component is an accessible HTML `<label>` element. The JSX prop
|
|
69
|
+
`htmlFor` should be set to the `id` of the input element that the label is
|
|
70
|
+
associated with. This is the proper way to label inputs so that screenreaders
|
|
71
|
+
can read the label, without the use of the `aria-label` attribute on the input
|
|
72
|
+
element.
|
|
73
|
+
|
|
74
|
+
Note: All form-related Reservoir components already implement this `Label`
|
|
75
|
+
component so there is no need to use this component unless if you are building
|
|
76
|
+
a new form-related input component.
|
|
77
|
+
|
|
78
|
+
Resources:
|
|
79
|
+
|
|
80
|
+
- [WebAIM Creating Accessible Forms](https://webaim.org/techniques/forms/advanced)
|
|
81
|
+
|
|
82
|
+
## isRequired helper text
|
|
59
83
|
|
|
60
84
|
An optional helper string can be rendered at the end of the `Label` text through
|
|
61
|
-
the `
|
|
62
|
-
|
|
85
|
+
the `isRequired` prop. This is useful for visually labeling a field as required
|
|
86
|
+
with the `"(Required)"` text next to the label's text. This is set to `false`
|
|
87
|
+
by default.
|
|
63
88
|
|
|
64
89
|
<Canvas>
|
|
65
|
-
<Story name="
|
|
66
|
-
<
|
|
67
|
-
<Label htmlFor="
|
|
68
|
-
|
|
69
|
-
</Label>
|
|
70
|
-
<Label htmlFor="some-id2" optReqFlag="Required">
|
|
71
|
-
Required helper text
|
|
90
|
+
<Story name="isRequired helper text">
|
|
91
|
+
<VStack>
|
|
92
|
+
<Label htmlFor="label-id1" id="regular">
|
|
93
|
+
A regular label
|
|
72
94
|
</Label>
|
|
73
|
-
<Label htmlFor="
|
|
74
|
-
|
|
95
|
+
<Label htmlFor="label-id2" id="required" isRequired>
|
|
96
|
+
A label that is required
|
|
75
97
|
</Label>
|
|
76
|
-
</
|
|
98
|
+
</VStack>
|
|
77
99
|
</Story>
|
|
78
100
|
</Canvas>
|
|
@@ -14,6 +14,15 @@ describe("Label Accessibility", () => {
|
|
|
14
14
|
);
|
|
15
15
|
expect(await axe(container)).toHaveNoViolations();
|
|
16
16
|
});
|
|
17
|
+
|
|
18
|
+
it("passes axe accessibility test with required text", async () => {
|
|
19
|
+
const { container } = render(
|
|
20
|
+
<Label id="label" htmlFor="some-input-id" isRequired>
|
|
21
|
+
Cupcakes
|
|
22
|
+
</Label>
|
|
23
|
+
);
|
|
24
|
+
expect(await axe(container)).toHaveNoViolations();
|
|
25
|
+
});
|
|
17
26
|
});
|
|
18
27
|
|
|
19
28
|
describe("Label", () => {
|
|
@@ -35,30 +44,33 @@ describe("Label", () => {
|
|
|
35
44
|
expect(screen.getByText("Cupcakes")).toBeInTheDocument();
|
|
36
45
|
});
|
|
37
46
|
|
|
38
|
-
it("renders the
|
|
47
|
+
it("renders the '(Required)' helper text", () => {
|
|
39
48
|
const { rerender } = render(
|
|
40
49
|
<Label id="label" htmlFor="some-input-id">
|
|
41
50
|
<span>Cupcakes</span>
|
|
42
51
|
</Label>
|
|
43
52
|
);
|
|
44
|
-
expect(screen.queryByText(
|
|
45
|
-
expect(screen.queryByText("Required")).not.toBeInTheDocument();
|
|
53
|
+
expect(screen.queryByText(/Required/i)).not.toBeInTheDocument();
|
|
46
54
|
|
|
47
55
|
rerender(
|
|
48
|
-
<Label id="
|
|
56
|
+
<Label id="label" htmlFor="some-input-id" isRequired>
|
|
49
57
|
<span>Cupcakes</span>
|
|
50
58
|
</Label>
|
|
51
59
|
);
|
|
52
|
-
expect(screen.getByText("Optional")).toBeInTheDocument();
|
|
53
|
-
expect(screen.queryByText("Required")).not.toBeInTheDocument();
|
|
54
60
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
61
|
+
expect(screen.queryByText(/Required/i)).toBeInTheDocument();
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it("Logs a warning when there is no `id` passed", () => {
|
|
65
|
+
const warn = jest.spyOn(console, "warn");
|
|
66
|
+
render(
|
|
67
|
+
// @ts-ignore: Typescript complains when a required prop is not passed, but
|
|
68
|
+
// here we don't want to pass the required prop to make sure the warning appears.
|
|
69
|
+
<Label htmlFor="some-input-id">Cupcakes</Label>
|
|
70
|
+
);
|
|
71
|
+
expect(warn).toHaveBeenCalledWith(
|
|
72
|
+
"NYPL Reservoir Label: This component's required `id` prop was not passed."
|
|
59
73
|
);
|
|
60
|
-
expect(screen.queryByText("Optional")).not.toBeInTheDocument();
|
|
61
|
-
expect(screen.getByText("Required")).toBeInTheDocument();
|
|
62
74
|
});
|
|
63
75
|
|
|
64
76
|
it("Renders the UI snapshot correctly", () => {
|
|
@@ -69,23 +81,36 @@ describe("Label", () => {
|
|
|
69
81
|
</Label>
|
|
70
82
|
)
|
|
71
83
|
.toJSON();
|
|
72
|
-
const
|
|
84
|
+
const required = renderer
|
|
73
85
|
.create(
|
|
74
|
-
<Label id="
|
|
86
|
+
<Label id="label3" htmlFor="some-input-id" isRequired>
|
|
75
87
|
Cupcakes
|
|
76
88
|
</Label>
|
|
77
89
|
)
|
|
78
90
|
.toJSON();
|
|
79
|
-
const
|
|
91
|
+
const withChakraProps = renderer
|
|
92
|
+
.create(
|
|
93
|
+
<Label
|
|
94
|
+
id="chakra"
|
|
95
|
+
htmlFor="some-input-id"
|
|
96
|
+
p="20px"
|
|
97
|
+
color="ui.error.primary"
|
|
98
|
+
>
|
|
99
|
+
Cupcakes
|
|
100
|
+
</Label>
|
|
101
|
+
)
|
|
102
|
+
.toJSON();
|
|
103
|
+
const withOtherProps = renderer
|
|
80
104
|
.create(
|
|
81
|
-
<Label id="
|
|
105
|
+
<Label id="props" htmlFor="some-input-id" data-testid="props">
|
|
82
106
|
Cupcakes
|
|
83
107
|
</Label>
|
|
84
108
|
)
|
|
85
109
|
.toJSON();
|
|
86
110
|
|
|
87
111
|
expect(simple).toMatchSnapshot();
|
|
88
|
-
expect(optional).toMatchSnapshot();
|
|
89
112
|
expect(required).toMatchSnapshot();
|
|
113
|
+
expect(withChakraProps).toMatchSnapshot();
|
|
114
|
+
expect(withOtherProps).toMatchSnapshot();
|
|
90
115
|
});
|
|
91
116
|
});
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
+
import { Box, chakra, useStyleConfig } from "@chakra-ui/react";
|
|
1
2
|
import * as React from "react";
|
|
2
|
-
import { Box, useMultiStyleConfig } from "@chakra-ui/react";
|
|
3
|
-
|
|
4
|
-
import generateUUID from "../../helpers/generateUUID";
|
|
5
|
-
|
|
6
|
-
type optReqFlagType = "Required" | "Optional" | "" | undefined;
|
|
7
3
|
|
|
8
4
|
interface LabelProps {
|
|
9
5
|
/** Additional CSS class name to render in the `label` element. */
|
|
@@ -12,22 +8,34 @@ interface LabelProps {
|
|
|
12
8
|
htmlFor: string;
|
|
13
9
|
/** ID that other components can cross reference for accessibility purposes */
|
|
14
10
|
id?: string;
|
|
15
|
-
/**
|
|
16
|
-
|
|
11
|
+
/** Controls whether the label should be inline with the input it goes with.
|
|
12
|
+
* This prop should only be used internally. */
|
|
13
|
+
isInlined?: boolean;
|
|
14
|
+
/** Controls whether the "(Required)" text should be displayed alongside the
|
|
15
|
+
* label's text. False by default. */
|
|
16
|
+
isRequired?: boolean;
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
20
|
* A label for form inputs. It should never be used alone.
|
|
21
21
|
*/
|
|
22
|
-
|
|
22
|
+
export const Label = chakra((props: React.PropsWithChildren<LabelProps>) => {
|
|
23
23
|
const {
|
|
24
24
|
children,
|
|
25
25
|
className,
|
|
26
26
|
htmlFor,
|
|
27
|
-
id
|
|
28
|
-
|
|
27
|
+
id,
|
|
28
|
+
isInlined = false,
|
|
29
|
+
isRequired = false,
|
|
30
|
+
...rest
|
|
29
31
|
} = props;
|
|
30
|
-
const styles =
|
|
32
|
+
const styles = useStyleConfig("Label", { isInlined });
|
|
33
|
+
|
|
34
|
+
if (!id) {
|
|
35
|
+
console.warn(
|
|
36
|
+
"NYPL Reservoir Label: This component's required `id` prop was not passed."
|
|
37
|
+
);
|
|
38
|
+
}
|
|
31
39
|
|
|
32
40
|
return (
|
|
33
41
|
<Box
|
|
@@ -36,11 +44,12 @@ function Label(props: React.PropsWithChildren<LabelProps>) {
|
|
|
36
44
|
className={className}
|
|
37
45
|
htmlFor={htmlFor}
|
|
38
46
|
__css={styles}
|
|
47
|
+
{...rest}
|
|
39
48
|
>
|
|
40
49
|
{children}
|
|
41
|
-
{
|
|
50
|
+
{isRequired && <span> (Required)</span>}
|
|
42
51
|
</Box>
|
|
43
52
|
);
|
|
44
|
-
}
|
|
53
|
+
});
|
|
45
54
|
|
|
46
55
|
export default Label;
|