@nypl/design-system-react-components 0.23.4 → 0.25.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 +98 -1
- package/README.md +46 -11
- package/dist/components/Accordion/Accordion.d.ts +14 -14
- package/dist/components/Autosuggest/Autosuggest.stories.d.ts +1 -0
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +11 -14
- package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +6 -0
- package/dist/components/Button/Button.d.ts +6 -13
- package/dist/components/Button/ButtonTypes.d.ts +5 -3
- package/dist/components/Card/Card.d.ts +59 -10
- package/dist/components/Card/CardTypes.d.ts +19 -0
- package/dist/components/CardEdition/CardEdition.d.ts +21 -0
- package/dist/components/{StyleGuide/Colors.stories.d.ts → CardEdition/CardEdition.stories.d.ts} +5 -2
- package/dist/components/Checkbox/Checkbox.d.ts +21 -16
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +43 -0
- package/dist/components/CheckboxGroup/CheckboxGroupLayoutTypes.d.ts +4 -0
- package/dist/components/DatePicker/DatePicker.d.ts +79 -0
- package/dist/components/DatePicker/DatePickerTypes.d.ts +5 -0
- package/dist/components/Form/Form.d.ts +16 -8
- package/dist/components/Form/FormTypes.d.ts +2 -0
- package/dist/components/Grid/GridTypes.d.ts +9 -0
- package/dist/components/Grid/SimpleGrid.d.ts +14 -0
- package/dist/components/Heading/Heading.d.ts +9 -11
- package/dist/components/Heading/{HeadingDisplaySizes.d.ts → HeadingTypes.d.ts} +8 -0
- package/dist/components/HelperErrorText/HelperErrorText.stories.d.ts +2 -1
- package/dist/components/Hero/Hero.d.ts +19 -14
- package/dist/components/Hero/HeroTypes.d.ts +10 -5
- package/dist/components/Icons/Icon.d.ts +13 -16
- package/dist/components/Icons/IconSvgs.d.ts +4 -0
- package/dist/components/Icons/IconTypes.d.ts +78 -60
- package/dist/components/Image/Image.stories.d.ts +2 -1
- package/dist/components/Label/Label.d.ts +10 -26
- package/dist/components/Link/Link.d.ts +8 -12
- package/dist/components/List/List.stories.d.ts +1 -0
- package/dist/components/Radio/Radio.d.ts +30 -24
- package/dist/components/RadioGroup/RadioGroup.d.ts +40 -0
- package/dist/components/RadioGroup/RadioGroupLayoutTypes.d.ts +4 -0
- package/dist/components/SearchBar/SearchBar.d.ts +45 -27
- package/dist/components/Select/Select.d.ts +34 -35
- package/dist/components/Select/SelectTypes.d.ts +4 -0
- package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +1 -1
- package/dist/components/SkeletonLoader/SkeletonLoaderTypes.d.ts +2 -2
- package/dist/components/StatusBadge/StatusBadge.d.ts +8 -6
- package/dist/components/StatusBadge/StatusBadgeTypes.d.ts +5 -0
- package/dist/components/Tabs/Tabs.d.ts +25 -0
- package/dist/components/Template/Template.d.ts +91 -0
- package/dist/components/Text/Text.d.ts +16 -0
- package/dist/components/Text/TextTypes.d.ts +6 -0
- package/dist/components/TextInput/TextInput.d.ts +37 -30
- package/dist/components/TextInput/TextInputTypes.d.ts +5 -0
- package/dist/design-system-react-components.cjs.development.js +4102 -917
- 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 +4023 -920
- package/dist/design-system-react-components.esm.js.map +1 -1
- package/dist/index.d.ts +23 -5
- package/dist/resources.scss +133 -24
- package/dist/styles.css +1 -1
- package/dist/theme/components/accordion.d.ts +25 -0
- package/dist/theme/components/breadcrumb.d.ts +90 -0
- package/dist/theme/components/button.d.ts +109 -0
- package/dist/theme/components/checkbox.d.ts +91 -0
- package/dist/theme/components/customCheckboxGroup.d.ts +18 -0
- package/dist/theme/components/customRadioGroup.d.ts +18 -0
- package/dist/theme/components/global.d.ts +55 -0
- package/dist/theme/components/globalMixins.d.ts +15 -0
- package/dist/theme/components/heading.d.ts +110 -0
- package/dist/theme/components/hero.d.ts +492 -0
- package/dist/theme/components/icon.d.ts +13 -0
- package/dist/theme/components/label.d.ts +16 -0
- package/dist/theme/components/link.d.ts +45 -0
- package/dist/theme/components/radio.d.ts +95 -0
- package/dist/theme/components/searchBar.d.ts +20 -0
- package/dist/theme/components/select.d.ts +58 -0
- package/dist/theme/components/statusBadge.d.ts +25 -0
- package/dist/theme/components/tabs.d.ts +85 -0
- package/dist/theme/components/template.d.ts +105 -0
- package/dist/theme/components/text.d.ts +20 -0
- package/dist/theme/components/textInput.d.ts +105 -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 +23 -0
- package/dist/theme/foundations/shadows.d.ts +4 -0
- package/dist/theme/foundations/spacing.d.ts +77 -0
- package/dist/theme/foundations/typography.d.ts +8 -0
- package/dist/theme/index.d.ts +20 -0
- package/dist/theme/provider.d.ts +5 -0
- package/dist/theme/types.d.ts +1 -0
- package/dist/utils/utils.d.ts +6 -0
- package/package.json +9 -2
- package/src/components/Accordion/Accordion.stories.mdx +233 -33
- package/src/components/Accordion/Accordion.test.tsx +135 -19
- package/src/components/Accordion/Accordion.tsx +81 -56
- package/src/components/Autosuggest/Autosuggest.stories.mdx +4 -3
- package/src/components/Autosuggest/Autosuggest.stories.tsx +1 -1
- package/src/components/Autosuggest/_Autosuggest.scss +2 -2
- package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +57 -56
- package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +31 -25
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +71 -73
- package/src/components/Breadcrumbs/BreadcrumbsTypes.tsx +6 -0
- package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +100 -0
- package/src/components/Button/Button.stories.mdx +125 -138
- package/src/components/Button/Button.test.tsx +65 -11
- package/src/components/Button/Button.tsx +72 -68
- package/src/components/Button/ButtonTypes.tsx +4 -2
- package/src/components/Button/_Button.scss +7 -92
- package/src/components/Button/__snapshots__/Button.test.tsx.snap +58 -3
- package/src/components/Card/Card.stories.mdx +694 -0
- package/src/components/Card/Card.test.tsx +97 -102
- package/src/components/Card/Card.tsx +182 -31
- package/src/components/Card/CardTypes.tsx +21 -0
- package/src/components/Card/_Card.scss +234 -49
- package/src/components/{Card/Card.stories.tsx → CardEdition/CardEdition.stories.tsx} +32 -22
- package/src/components/CardEdition/CardEdition.test.tsx +395 -0
- package/src/components/CardEdition/CardEdition.tsx +60 -0
- package/src/components/CardEdition/_CardEdition.scss +138 -0
- package/src/components/Chakra/Box.stories.mdx +57 -0
- package/src/components/Chakra/Center.stories.mdx +99 -0
- package/src/components/Chakra/Grid.stories.mdx +79 -0
- package/src/components/Chakra/Stack.stories.mdx +93 -0
- package/src/components/Checkbox/Checkbox.stories.mdx +57 -35
- package/src/components/Checkbox/Checkbox.test.tsx +117 -147
- package/src/components/Checkbox/Checkbox.tsx +76 -50
- package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +325 -0
- package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +249 -0
- package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +345 -0
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +148 -0
- package/src/components/CheckboxGroup/CheckboxGroupLayoutTypes.tsx +4 -0
- package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +1360 -0
- package/src/components/DatePicker/DatePicker.stories.mdx +284 -0
- package/src/components/DatePicker/DatePicker.test.tsx +657 -0
- package/src/components/DatePicker/DatePicker.tsx +396 -0
- package/src/components/DatePicker/DatePickerTypes.tsx +5 -0
- package/src/components/DatePicker/_DatePicker.scss +76 -0
- package/src/components/Form/Form.stories.mdx +130 -27
- package/src/components/Form/Form.test.tsx +78 -36
- package/src/components/Form/Form.tsx +53 -19
- package/src/components/Form/FormTypes.tsx +3 -0
- package/src/components/Form/__snapshots__/Form.test.tsx.snap +38 -0
- package/src/components/Grid/GridTypes.tsx +9 -0
- package/src/components/Grid/SimpleGrid.stories.mdx +275 -0
- package/src/components/Grid/SimpleGrid.test.tsx +66 -0
- package/src/components/Grid/SimpleGrid.tsx +37 -0
- package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +8 -0
- package/src/components/Heading/Heading.stories.mdx +63 -33
- package/src/components/Heading/Heading.test.tsx +24 -16
- package/src/components/Heading/Heading.tsx +54 -38
- package/src/components/Heading/{HeadingDisplaySizes.tsx → HeadingTypes.tsx} +9 -0
- package/src/components/HelperErrorText/HelperErrorText.stories.tsx +2 -1
- package/src/components/HelperErrorText/_HelperErrorText.scss +1 -1
- package/src/components/Hero/Hero.stories.mdx +195 -85
- package/src/components/Hero/Hero.test.tsx +544 -113
- package/src/components/Hero/Hero.tsx +80 -93
- package/src/components/Hero/HeroTypes.tsx +17 -5
- package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +307 -0
- package/src/components/HorizontalRule/HorizontalRule.stories.mdx +6 -1
- package/src/components/HorizontalRule/_HorizontalRule.scss +1 -1
- package/src/components/Icons/Icon.stories.mdx +89 -74
- package/src/components/Icons/Icon.test.tsx +30 -22
- package/src/components/Icons/Icon.tsx +63 -61
- package/src/components/Icons/IconSvgs.tsx +8 -0
- package/src/components/Icons/IconTypes.tsx +80 -60
- package/src/components/Image/Image.stories.tsx +2 -1
- package/src/components/Input/_Input.scss +2 -2
- package/src/components/Label/Label.stories.mdx +77 -0
- package/src/components/Label/Label.test.tsx +43 -12
- package/src/components/Label/Label.tsx +28 -45
- package/src/components/Label/__snapshots__/Label.test.tsx.snap +41 -0
- package/src/components/Link/Link.stories.mdx +47 -41
- package/src/components/Link/Link.test.tsx +33 -44
- package/src/components/Link/Link.tsx +114 -100
- package/src/components/List/List.stories.mdx +7 -3
- package/src/components/List/List.stories.tsx +14 -9
- package/src/components/List/List.test.tsx +12 -8
- package/src/components/List/List.tsx +9 -7
- package/src/components/List/_List.scss +3 -3
- package/src/components/Modal/Modal.stories.mdx +7 -3
- package/src/components/Modal/_Modal.scss +1 -1
- package/src/components/Notification/Notification.stories.mdx +99 -65
- package/src/components/Notification/Notification.test.tsx +3 -16
- package/src/components/Notification/Notification.tsx +12 -12
- package/src/components/Notification/_Notification.scss +5 -4
- package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +1 -1
- package/src/components/Pagination/Pagination.stories.mdx +7 -1
- package/src/components/Pagination/Pagination.test.tsx +16 -10
- package/src/components/Radio/Radio.stories.mdx +57 -46
- package/src/components/Radio/Radio.test.tsx +92 -138
- package/src/components/Radio/Radio.tsx +70 -69
- package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +250 -0
- package/src/components/RadioGroup/RadioGroup.stories.mdx +247 -0
- package/src/components/RadioGroup/RadioGroup.test.tsx +327 -0
- package/src/components/RadioGroup/RadioGroup.tsx +154 -0
- package/src/components/RadioGroup/RadioGroupLayoutTypes.tsx +4 -0
- package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +1101 -0
- package/src/components/SearchBar/SearchBar.Test.tsx +151 -16
- package/src/components/SearchBar/SearchBar.stories.mdx +196 -224
- package/src/components/SearchBar/SearchBar.tsx +151 -46
- package/src/components/Select/Select.stories.mdx +193 -168
- package/src/components/Select/Select.test.tsx +129 -324
- package/src/components/Select/Select.tsx +120 -160
- package/src/components/Select/SelectTypes.tsx +4 -0
- package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +18 -29
- package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +7 -7
- package/src/components/SkeletonLoader/SkeletonLoader.tsx +4 -2
- package/src/components/SkeletonLoader/SkeletonLoaderTypes.tsx +2 -2
- package/src/components/SkeletonLoader/_SkeletonLoader.scss +3 -3
- package/src/components/StatusBadge/StatusBadge.stories.mdx +91 -0
- package/src/components/StatusBadge/StatusBadge.test.tsx +35 -7
- package/src/components/StatusBadge/StatusBadge.tsx +24 -25
- package/src/components/StatusBadge/StatusBadgeTypes.tsx +5 -0
- package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +28 -0
- package/src/components/StyleGuide/Bidirectionality.stories.mdx +112 -90
- package/src/components/StyleGuide/Buttons.stories.mdx +98 -100
- package/src/components/StyleGuide/Colors.stories.mdx +336 -0
- package/src/components/StyleGuide/Forms.stories.mdx +85 -0
- package/src/components/StyleGuide/Iconography.stories.mdx +86 -93
- package/src/components/StyleGuide/Spacing.stories.mdx +0 -1
- package/src/components/StyleGuide/Typography.stories.mdx +164 -166
- package/src/components/StyleGuide/UIDocCard.tsx +4 -4
- package/src/components/Tabs/Tabs.stories.mdx +221 -0
- package/src/components/Tabs/Tabs.test.tsx +264 -0
- package/src/components/Tabs/Tabs.tsx +220 -0
- package/src/components/Template/Template.stories.mdx +574 -0
- package/src/components/Template/Template.test.tsx +124 -0
- package/src/components/Template/Template.tsx +226 -0
- package/src/components/Text/Text.stories.mdx +70 -0
- package/src/components/Text/Text.test.tsx +63 -0
- package/src/components/Text/Text.tsx +55 -0
- package/src/components/Text/TextTypes.tsx +6 -0
- package/src/components/Text/__snapshots__/Text.test.tsx.snap +33 -0
- package/src/components/TextInput/TextInput.stories.mdx +90 -90
- package/src/components/TextInput/TextInput.test.tsx +103 -83
- package/src/components/TextInput/TextInput.tsx +108 -91
- package/src/components/TextInput/TextInputTypes.tsx +6 -0
- package/src/components/VideoPlayer/VideoPlayer.stories.mdx +2 -1
- package/src/components/VideoPlayer/VideoPlayer.tsx +4 -2
- package/src/components/VideoPlayer/_VideoPlayer.scss +1 -1
- package/src/docs/Chakra.stories.mdx +341 -0
- package/src/docs/Intro.stories.mdx +31 -24
- package/src/index.ts +70 -5
- package/src/styles/01-colors/_colors-brand.scss +6 -4
- package/src/styles/01-colors/_colors-utility.scss +14 -15
- package/src/styles/03-space/_space-inline.scss +47 -7
- package/src/styles/03-space/_space-inset.scss +33 -5
- package/src/styles/03-space/_space-stack.scss +48 -8
- package/src/styles/base/_02-breakpoints.scss +5 -4
- package/src/styles/base/_04-base.scss +2 -1
- package/src/styles/base/_place-holder.scss +1 -1
- package/src/styles/base/_typography.scss +1 -29
- package/src/styles.scss +22 -25
- package/src/theme/components/accordion.ts +30 -0
- package/src/theme/components/breadcrumb.ts +77 -0
- package/src/theme/components/button.ts +125 -0
- package/src/theme/components/checkbox.ts +107 -0
- package/src/theme/components/customCheckboxGroup.ts +12 -0
- package/src/theme/components/customRadioGroup.ts +12 -0
- package/src/theme/components/global.ts +71 -0
- package/src/theme/components/globalMixins.ts +16 -0
- package/src/theme/components/heading.ts +72 -0
- package/src/theme/components/hero.ts +239 -0
- package/src/theme/components/icon.ts +79 -0
- package/src/theme/components/label.ts +17 -0
- package/src/theme/components/link.ts +47 -0
- package/src/theme/components/radio.ts +106 -0
- package/src/theme/components/searchBar.ts +21 -0
- package/src/theme/components/select.ts +50 -0
- package/src/theme/components/statusBadge.ts +27 -0
- package/src/theme/components/tabs.ts +79 -0
- package/src/theme/components/template.ts +114 -0
- package/src/theme/components/text.ts +31 -0
- package/src/theme/components/textInput.ts +61 -0
- package/src/theme/foundations/breakpoints.ts +24 -0
- package/src/theme/foundations/colors.ts +208 -0
- package/src/theme/foundations/global.ts +26 -0
- package/src/theme/foundations/shadows.ts +5 -0
- package/src/theme/foundations/spacing.ts +85 -0
- package/src/theme/foundations/typography.ts +35 -0
- package/src/theme/index.ts +88 -0
- package/src/theme/provider.tsx +9 -0
- package/src/theme/types.ts +1 -0
- package/src/utils/componentCategories.ts +56 -21
- package/src/utils/utils.ts +13 -0
- package/dist/components/Accordion/Accordion.stories.d.ts +0 -5
- package/dist/components/Card/Card.stories.d.ts +0 -27
- package/dist/components/Label/Label.stories.d.ts +0 -12
- package/dist/components/StatusBadge/StatusBadge.stories.d.ts +0 -8
- package/dist/components/Template/Template.stories.d.ts +0 -29
- package/src/components/Accordion/Accordion.stories.tsx +0 -65
- package/src/components/Accordion/_Accordion.scss +0 -81
- package/src/components/Breadcrumbs/_Breadcrumbs.scss +0 -97
- package/src/components/Checkbox/_Checkbox.scss +0 -97
- package/src/components/Form/_Form.scss +0 -28
- package/src/components/Heading/_Heading.scss +0 -163
- package/src/components/Hero/_Hero.scss +0 -256
- package/src/components/Icons/_Icons.scss +0 -116
- package/src/components/Label/Label.stories.tsx +0 -30
- package/src/components/Label/_Label.scss +0 -22
- package/src/components/Link/_Link.scss +0 -73
- package/src/components/Radio/_Radio.scss +0 -84
- package/src/components/SearchBar/_SearchBar.scss +0 -16
- package/src/components/Select/_Select.scss +0 -82
- package/src/components/StatusBadge/StatusBadge.stories.tsx +0 -33
- package/src/components/StatusBadge/_StatusBadge.scss +0 -23
- package/src/components/StyleGuide/Colors.stories.tsx +0 -288
- package/src/components/Template/Template.stories.tsx +0 -85
- package/src/components/Template/_Template.scss +0 -63
- package/src/components/TextInput/_TextInput.scss +0 -59
|
@@ -10,15 +10,22 @@ import { withDesign } from "storybook-addon-designs";
|
|
|
10
10
|
import { getCategory } from "../../utils/componentCategories";
|
|
11
11
|
|
|
12
12
|
import Form, { FormRow, FormField } from "./Form";
|
|
13
|
+
import { FormSpacing } from "./FormTypes";
|
|
13
14
|
import TextInput from "../TextInput/TextInput";
|
|
14
15
|
import Radio from "../Radio/Radio";
|
|
16
|
+
import RadioGroup from "../RadioGroup/RadioGroup";
|
|
15
17
|
import Checkbox from "../Checkbox/Checkbox";
|
|
18
|
+
import CheckboxGroup from "../CheckboxGroup/CheckboxGroup";
|
|
16
19
|
import Label from "../Label/Label";
|
|
17
20
|
import Button from "../Button/Button";
|
|
18
21
|
import Select from "../Select/Select";
|
|
19
|
-
import
|
|
22
|
+
import Heading from "../Heading/Heading";
|
|
23
|
+
import { HeadingLevels } from "../Heading/HeadingTypes";
|
|
24
|
+
import HorizontalRule from "../HorizontalRule/HorizontalRule";
|
|
20
25
|
import { action } from "@storybook/addon-actions";
|
|
21
26
|
|
|
27
|
+
import SimpleGrid from "../Grid/SimpleGrid";
|
|
28
|
+
|
|
22
29
|
<Meta
|
|
23
30
|
title={getCategory("Form")}
|
|
24
31
|
component={Form}
|
|
@@ -35,6 +42,11 @@ import { action } from "@storybook/addon-actions";
|
|
|
35
42
|
|
|
36
43
|
# Form
|
|
37
44
|
|
|
45
|
+
| Component Version | DS Version |
|
|
46
|
+
| ----------------- | ---------- |
|
|
47
|
+
| Added | `0.23.2` |
|
|
48
|
+
| Latest | `0.25.1` |
|
|
49
|
+
|
|
38
50
|
<Description of={Form} />
|
|
39
51
|
|
|
40
52
|
The `Form` component renders a standard `<form>` element and should be used to handle layout and spacing for child input fields. `FormRow` and `FormField` components should be used to build the `<form>` struture and to arrange input fields as needed.
|
|
@@ -62,18 +74,34 @@ The `Form` component renders a standard `<form>` element and should be used to h
|
|
|
62
74
|
>
|
|
63
75
|
{(args) => (
|
|
64
76
|
<Form {...args}>
|
|
77
|
+
<FormRow>
|
|
78
|
+
<FormField>
|
|
79
|
+
<TextInput
|
|
80
|
+
labelText="First Name"
|
|
81
|
+
helperText="Make sure to complete this field."
|
|
82
|
+
isRequired
|
|
83
|
+
/>
|
|
84
|
+
</FormField>
|
|
85
|
+
<FormField>
|
|
86
|
+
<TextInput
|
|
87
|
+
labelText="Last Name"
|
|
88
|
+
helperText="Make sure to complete this field."
|
|
89
|
+
isRequired
|
|
90
|
+
/>
|
|
91
|
+
</FormField>
|
|
92
|
+
</FormRow>
|
|
65
93
|
<FormField>
|
|
66
94
|
<TextInput
|
|
67
95
|
labelText="Username"
|
|
68
96
|
helperText="Make sure to complete this field."
|
|
69
|
-
|
|
97
|
+
isRequired
|
|
70
98
|
/>
|
|
71
99
|
</FormField>
|
|
72
100
|
<FormField>
|
|
73
101
|
<TextInput
|
|
74
102
|
labelText="Password"
|
|
75
103
|
helperText="Make sure to complete this field."
|
|
76
|
-
|
|
104
|
+
isRequired
|
|
77
105
|
/>
|
|
78
106
|
</FormField>
|
|
79
107
|
<FormRow>
|
|
@@ -101,24 +129,24 @@ The `Form` component renders a standard `<form>` element and should be used to h
|
|
|
101
129
|
</FormRow>
|
|
102
130
|
<FormRow>
|
|
103
131
|
<FormField>
|
|
104
|
-
<
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
132
|
+
<CheckboxGroup
|
|
133
|
+
labelText="Checkbox Group"
|
|
134
|
+
name="cbg1"
|
|
135
|
+
optReqFlag={false}
|
|
136
|
+
>
|
|
137
|
+
<Checkbox labelText="Checkbox 1" showLabel />
|
|
138
|
+
<Checkbox labelText="Checkbox 2" showLabel />
|
|
139
|
+
<Checkbox labelText="Checkbox 3" showLabel />
|
|
140
|
+
<Checkbox labelText="Checkbox 4" showLabel />
|
|
141
|
+
</CheckboxGroup>
|
|
112
142
|
</FormField>
|
|
113
143
|
<FormField>
|
|
114
|
-
<
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
<br />
|
|
121
|
-
<Radio labelText="Radio 4" showLabel />
|
|
144
|
+
<RadioGroup labelText="Radio Group" name="rg1" optReqFlag={false}>
|
|
145
|
+
<Radio labelText="Radio 1" showLabel />
|
|
146
|
+
<Radio labelText="Radio 2" showLabel />
|
|
147
|
+
<Radio labelText="Radio 3" showLabel />
|
|
148
|
+
<Radio labelText="Radio 4" showLabel />
|
|
149
|
+
</RadioGroup>
|
|
122
150
|
</FormField>
|
|
123
151
|
<FormField>
|
|
124
152
|
<Select
|
|
@@ -129,6 +157,8 @@ The `Form` component renders a standard `<form>` element and should be used to h
|
|
|
129
157
|
<option>Option 1</option>
|
|
130
158
|
<option>Option 2</option>
|
|
131
159
|
<option>Option 3</option>
|
|
160
|
+
<option>Option 4</option>
|
|
161
|
+
<option>Option 5</option>
|
|
132
162
|
</Select>
|
|
133
163
|
</FormField>
|
|
134
164
|
</FormRow>
|
|
@@ -142,25 +172,98 @@ The `Form` component renders a standard `<form>` element and should be used to h
|
|
|
142
172
|
|
|
143
173
|
<ArgsTable story="Form" />
|
|
144
174
|
|
|
145
|
-
|
|
175
|
+
## Spacing Variants
|
|
146
176
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
>
|
|
177
|
+
export const formRow = (size) => {
|
|
178
|
+
const labelText = `Size: ${size}`;
|
|
179
|
+
return (
|
|
180
|
+
<li>
|
|
181
|
+
<Heading level={HeadingLevels.Three}>{labelText}</Heading>
|
|
182
|
+
<Form spacing={size}>
|
|
183
|
+
<FormRow>
|
|
184
|
+
<FormField>
|
|
185
|
+
<Select
|
|
186
|
+
labelText="Select Field"
|
|
187
|
+
showLabel={true}
|
|
188
|
+
helperText="The select field helper text."
|
|
189
|
+
>
|
|
190
|
+
<option>Option 1</option>
|
|
191
|
+
<option>Option 2</option>
|
|
192
|
+
<option>Option 3</option>
|
|
193
|
+
<option>Option 4</option>
|
|
194
|
+
</Select>
|
|
195
|
+
</FormField>
|
|
196
|
+
<FormField>
|
|
197
|
+
<Select
|
|
198
|
+
labelText="Select Field"
|
|
199
|
+
showLabel={true}
|
|
200
|
+
helperText="The select field helper text."
|
|
201
|
+
>
|
|
202
|
+
<option>Option 1</option>
|
|
203
|
+
<option>Option 2</option>
|
|
204
|
+
<option>Option 3</option>
|
|
205
|
+
<option>Option 4</option>
|
|
206
|
+
</Select>
|
|
207
|
+
</FormField>
|
|
208
|
+
<FormField>
|
|
209
|
+
<Select
|
|
210
|
+
labelText="Select Field"
|
|
211
|
+
showLabel={true}
|
|
212
|
+
helperText="The select field helper text."
|
|
213
|
+
>
|
|
214
|
+
<option>Option 1</option>
|
|
215
|
+
<option>Option 2</option>
|
|
216
|
+
<option>Option 3</option>
|
|
217
|
+
<option>Option 4</option>
|
|
218
|
+
</Select>
|
|
219
|
+
</FormField>
|
|
220
|
+
</FormRow>
|
|
221
|
+
</Form>
|
|
222
|
+
<HorizontalRule />
|
|
223
|
+
</li>
|
|
224
|
+
);
|
|
225
|
+
};
|
|
226
|
+
export const sizes = [];
|
|
227
|
+
for (const formSpacing in FormSpacing) {
|
|
228
|
+
sizes.push(formRow(FormSpacing[formSpacing]));
|
|
229
|
+
}
|
|
230
|
+
export const getForms = (list) => <ul style={{ listStyle: "none" }}>{list}</ul>;
|
|
231
|
+
|
|
232
|
+
By default, the `Form` component will handle the NYPL spacing around form input elements. The default spacing value is `large`, which corresponds to the CSS variable `--space-l` (2rem / 32px).
|
|
233
|
+
|
|
234
|
+
**IMPORTANT:** The default spacing should not be overwritten without a very good reason.
|
|
235
|
+
|
|
236
|
+
Below are the spacing variants available with the `FormSpacing` enum.
|
|
237
|
+
|
|
238
|
+
<Preview>
|
|
239
|
+
<Story
|
|
240
|
+
name="Spacing Variants"
|
|
241
|
+
args={{
|
|
242
|
+
id: "spacing-form-id",
|
|
243
|
+
}}
|
|
244
|
+
>
|
|
245
|
+
{getForms(sizes)}
|
|
246
|
+
</Story>
|
|
247
|
+
</Preview>
|
|
248
|
+
|
|
249
|
+
## Example Code
|
|
250
|
+
|
|
251
|
+
<Story name="Example Code" />
|
|
252
|
+
|
|
253
|
+
```jsx
|
|
254
|
+
<Form action="/end/point" method="get">
|
|
152
255
|
<FormField>
|
|
153
256
|
<TextInput
|
|
154
257
|
labelText="Username"
|
|
155
258
|
helperText="Make sure to complete this field."
|
|
156
|
-
|
|
259
|
+
isRequired
|
|
157
260
|
/>
|
|
158
261
|
</FormField>
|
|
159
262
|
<FormField>
|
|
160
263
|
<TextInput
|
|
161
264
|
labelText="Password"
|
|
162
265
|
helperText="Make sure to complete this field."
|
|
163
|
-
|
|
266
|
+
isRequired
|
|
164
267
|
/>
|
|
165
268
|
</FormField>
|
|
166
269
|
<FormRow>
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import { render } from "@testing-library/react";
|
|
2
|
+
import { render, screen } from "@testing-library/react";
|
|
3
3
|
import { axe } from "jest-axe";
|
|
4
|
+
import renderer from "react-test-renderer";
|
|
4
5
|
|
|
5
6
|
import Form, { FormRow, FormField } from "./Form";
|
|
7
|
+
// import { FormSpacing } from "./FormTypes";
|
|
6
8
|
import TextInput from "../TextInput/TextInput";
|
|
7
9
|
|
|
8
10
|
describe("Form Accessibility", () => {
|
|
@@ -12,41 +14,61 @@ describe("Form Accessibility", () => {
|
|
|
12
14
|
});
|
|
13
15
|
});
|
|
14
16
|
|
|
17
|
+
describe("Form Snapshot", () => {
|
|
18
|
+
it("Renders the UI snapshot correctly", () => {
|
|
19
|
+
const tree = renderer
|
|
20
|
+
.create(
|
|
21
|
+
<Form id="snapshot-form">
|
|
22
|
+
<FormRow>
|
|
23
|
+
<FormField>Form Field 1</FormField>
|
|
24
|
+
<FormField>Form Field 2</FormField>
|
|
25
|
+
<FormField>Form Field 3</FormField>
|
|
26
|
+
</FormRow>
|
|
27
|
+
</Form>
|
|
28
|
+
)
|
|
29
|
+
.toJSON();
|
|
30
|
+
expect(tree).toMatchSnapshot();
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
|
|
15
34
|
describe("Form", () => {
|
|
16
|
-
let container;
|
|
17
35
|
it("Renders a <form> element", () => {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
expect(container.querySelector(".form")).toBeInTheDocument();
|
|
36
|
+
render(<Form />);
|
|
37
|
+
expect(screen.getByRole("form")).toBeInTheDocument();
|
|
22
38
|
});
|
|
23
39
|
|
|
24
|
-
it("Renders a <form> element with child
|
|
25
|
-
|
|
40
|
+
it("Renders a <form> element with child FormRow element", () => {
|
|
41
|
+
render(
|
|
26
42
|
<Form>
|
|
27
43
|
<FormRow />
|
|
28
44
|
</Form>
|
|
29
45
|
);
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
expect(
|
|
33
|
-
expect(
|
|
46
|
+
const form = screen.getByRole("form");
|
|
47
|
+
const formRow = form.firstChild;
|
|
48
|
+
expect(form).toBeInTheDocument();
|
|
49
|
+
expect(formRow).toBeInTheDocument();
|
|
50
|
+
expect(formRow).toHaveStyle({
|
|
51
|
+
display: "grid",
|
|
52
|
+
});
|
|
34
53
|
});
|
|
35
54
|
|
|
36
|
-
it("Renders a <form> element with child
|
|
37
|
-
|
|
55
|
+
it("Renders a <form> element with child FormField element", () => {
|
|
56
|
+
render(
|
|
38
57
|
<Form>
|
|
39
58
|
<FormField />
|
|
40
59
|
</Form>
|
|
41
60
|
);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
expect(
|
|
45
|
-
expect(
|
|
61
|
+
const form = screen.getByRole("form");
|
|
62
|
+
const formField = form.firstChild;
|
|
63
|
+
expect(form).toBeInTheDocument();
|
|
64
|
+
expect(formField).toBeInTheDocument();
|
|
65
|
+
expect(formField).toHaveStyle({
|
|
66
|
+
display: "grid",
|
|
67
|
+
});
|
|
46
68
|
});
|
|
47
69
|
|
|
48
|
-
it("Renders a <form> element with
|
|
49
|
-
|
|
70
|
+
it("Renders a <form> element with FormRow, FormField and input elements properly nested", () => {
|
|
71
|
+
render(
|
|
50
72
|
<Form>
|
|
51
73
|
<FormRow>
|
|
52
74
|
<FormField>
|
|
@@ -55,23 +77,43 @@ describe("Form", () => {
|
|
|
55
77
|
</FormRow>
|
|
56
78
|
</Form>
|
|
57
79
|
);
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
expect(
|
|
63
|
-
expect(
|
|
80
|
+
const form = screen.getByRole("form");
|
|
81
|
+
const formRow = form.firstChild;
|
|
82
|
+
const formField = formRow.firstChild;
|
|
83
|
+
const textInput = screen.getByRole("textbox");
|
|
84
|
+
expect(form).toBeInTheDocument();
|
|
85
|
+
expect(formRow).toBeInTheDocument();
|
|
86
|
+
expect(formRow).toHaveStyle({
|
|
87
|
+
display: "grid",
|
|
88
|
+
});
|
|
89
|
+
expect(formField).toBeInTheDocument();
|
|
90
|
+
expect(formField).toHaveStyle({
|
|
91
|
+
display: "grid",
|
|
92
|
+
});
|
|
93
|
+
expect(textInput).toBeInTheDocument();
|
|
64
94
|
});
|
|
65
95
|
|
|
66
|
-
it("Renders a <form> element with
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
expect(
|
|
71
|
-
expect(
|
|
72
|
-
"action",
|
|
73
|
-
"/end/point"
|
|
74
|
-
);
|
|
75
|
-
expect(container.querySelector(".form")).toHaveAttribute("method", "get");
|
|
96
|
+
it("Renders a <form> element with custom `action` and `method` attributes", () => {
|
|
97
|
+
render(<Form action="/end/point" method="get" />);
|
|
98
|
+
const form = screen.getByRole("form");
|
|
99
|
+
expect(form).toBeInTheDocument();
|
|
100
|
+
expect(form).toHaveAttribute("action", "/end/point");
|
|
101
|
+
expect(form).toHaveAttribute("method", "get");
|
|
76
102
|
});
|
|
103
|
+
|
|
104
|
+
// TO DO: There's somethign weird about checking for the "grid-gap" style.
|
|
105
|
+
// Other styles can be validated, but "grid-gap" is being ellusive.
|
|
106
|
+
// it("Renders a <form> element with spacing variant applied", () => {
|
|
107
|
+
// render(
|
|
108
|
+
// <Form spacing={FormSpacing.ExtraSmall}>
|
|
109
|
+
// <FormRow />
|
|
110
|
+
// </Form>
|
|
111
|
+
// );
|
|
112
|
+
// const form = screen.getByRole("form");
|
|
113
|
+
// const formRow = form.firstChild;
|
|
114
|
+
// expect(form).toBeInTheDocument();
|
|
115
|
+
// expect(formRow).toHaveStyle({
|
|
116
|
+
// "grid-gap": "var(--chakra-space-xs)",
|
|
117
|
+
// });
|
|
118
|
+
// });
|
|
77
119
|
});
|
|
@@ -1,60 +1,94 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import
|
|
2
|
+
import { FormSpacing } from "./FormTypes";
|
|
3
|
+
import SimpleGrid from "../Grid/SimpleGrid";
|
|
4
|
+
import { Box } from "@chakra-ui/react";
|
|
3
5
|
import generateUUID from "../../helpers/generateUUID";
|
|
4
6
|
|
|
7
|
+
export interface FormChildProps {
|
|
8
|
+
/** className to be applied to FormRow */
|
|
9
|
+
className?: string;
|
|
10
|
+
/** Spacing size (internal use) */
|
|
11
|
+
gap?: FormSpacing;
|
|
12
|
+
/** ID that other components can cross reference (internal use) */
|
|
13
|
+
id?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
5
16
|
export interface FormProps {
|
|
6
17
|
/** Optional form `action` attribute */
|
|
7
18
|
action?: string;
|
|
8
|
-
/** Optional additional attributes passed to the `<form>` element */
|
|
9
|
-
attributes?: { [key: string]: any };
|
|
10
19
|
/** Optional className you can add in addition to `form` */
|
|
11
20
|
className?: string;
|
|
12
21
|
/** Optional ID that other components can cross reference */
|
|
13
22
|
id?: string;
|
|
14
23
|
/** Optional form `method` attribute */
|
|
15
24
|
method?: "get" | "post";
|
|
16
|
-
/** Optional
|
|
17
|
-
|
|
25
|
+
/** Optional spacing size; if omitted, the default `large` (2rem / 32px) spacing will be used; ```IMPORTANT: for general form layout, this prop should not be used``` */
|
|
26
|
+
spacing?: FormSpacing;
|
|
18
27
|
}
|
|
19
28
|
|
|
20
|
-
|
|
21
|
-
export function FormRow(props) {
|
|
22
|
-
const { children, className } = props;
|
|
23
|
-
|
|
29
|
+
/** FormRow child-component */
|
|
30
|
+
export function FormRow(props: React.PropsWithChildren<FormChildProps>) {
|
|
31
|
+
const { children, className, gap, id } = props;
|
|
32
|
+
const count = React.Children.count(children);
|
|
33
|
+
const alteredChildren = React.Children.map(
|
|
34
|
+
children,
|
|
35
|
+
(child: React.ReactElement, i) => {
|
|
36
|
+
return React.cloneElement(child, { id: `${id}-grandchild${i}` });
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
return (
|
|
40
|
+
<SimpleGrid columns={count} className={className} gap={gap} id={id}>
|
|
41
|
+
{alteredChildren}
|
|
42
|
+
</SimpleGrid>
|
|
43
|
+
);
|
|
24
44
|
}
|
|
25
45
|
|
|
26
|
-
|
|
27
|
-
export function FormField(props) {
|
|
28
|
-
const { children, className } = props;
|
|
46
|
+
/** FormField child-component */
|
|
47
|
+
export function FormField(props: React.PropsWithChildren<FormChildProps>) {
|
|
48
|
+
const { children, className, gap, id } = props;
|
|
29
49
|
return (
|
|
30
|
-
<
|
|
50
|
+
<SimpleGrid columns={1} className={className} gap={gap} id={id}>
|
|
51
|
+
{children}
|
|
52
|
+
</SimpleGrid>
|
|
31
53
|
);
|
|
32
54
|
}
|
|
33
55
|
|
|
56
|
+
/** main Form component */
|
|
34
57
|
export default function Form(props: React.ComponentProps<"form"> & FormProps) {
|
|
35
58
|
const {
|
|
36
59
|
action,
|
|
37
|
-
attributes = {},
|
|
38
60
|
children,
|
|
39
61
|
className,
|
|
40
62
|
id = generateUUID(),
|
|
41
63
|
method,
|
|
42
|
-
|
|
64
|
+
spacing,
|
|
43
65
|
} = props;
|
|
44
66
|
|
|
67
|
+
let attributes = {};
|
|
45
68
|
action && (attributes["action"] = action);
|
|
46
69
|
|
|
47
70
|
method &&
|
|
48
71
|
(method === "get" || method === "post") &&
|
|
49
72
|
(attributes["method"] = method);
|
|
50
73
|
|
|
74
|
+
const alteredChildren = React.Children.map(
|
|
75
|
+
children,
|
|
76
|
+
(child: React.ReactElement, i) => {
|
|
77
|
+
return React.cloneElement(child, { gap: spacing, id: `${id}-child${i}` });
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
|
|
51
81
|
return (
|
|
52
|
-
<
|
|
53
|
-
|
|
82
|
+
<Box
|
|
83
|
+
as="form"
|
|
84
|
+
aria-label="form"
|
|
54
85
|
id={id}
|
|
55
86
|
{...attributes}
|
|
87
|
+
className={className}
|
|
56
88
|
>
|
|
57
|
-
{
|
|
58
|
-
|
|
89
|
+
<SimpleGrid columns={1} gap={spacing} id={id + "-parent"}>
|
|
90
|
+
{alteredChildren}
|
|
91
|
+
</SimpleGrid>
|
|
92
|
+
</Box>
|
|
59
93
|
);
|
|
60
94
|
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`Form Snapshot Renders the UI snapshot correctly 1`] = `
|
|
4
|
+
<form
|
|
5
|
+
aria-label="form"
|
|
6
|
+
className="css-0"
|
|
7
|
+
id="snapshot-form"
|
|
8
|
+
>
|
|
9
|
+
<div
|
|
10
|
+
className="css-aq1pyb"
|
|
11
|
+
id="snapshot-form-parent"
|
|
12
|
+
>
|
|
13
|
+
<div
|
|
14
|
+
className="css-1ao258g"
|
|
15
|
+
id="snapshot-form-child0"
|
|
16
|
+
>
|
|
17
|
+
<div
|
|
18
|
+
className="css-aq1pyb"
|
|
19
|
+
id="snapshot-form-child0-grandchild0"
|
|
20
|
+
>
|
|
21
|
+
Form Field 1
|
|
22
|
+
</div>
|
|
23
|
+
<div
|
|
24
|
+
className="css-aq1pyb"
|
|
25
|
+
id="snapshot-form-child0-grandchild1"
|
|
26
|
+
>
|
|
27
|
+
Form Field 2
|
|
28
|
+
</div>
|
|
29
|
+
<div
|
|
30
|
+
className="css-aq1pyb"
|
|
31
|
+
id="snapshot-form-child0-grandchild2"
|
|
32
|
+
>
|
|
33
|
+
Form Field 3
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
</form>
|
|
38
|
+
`;
|