@nypl/design-system-react-components 0.25.0 → 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 +30 -0
- package/dist/components/Accordion/Accordion.d.ts +14 -14
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +11 -14
- package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +6 -0
- package/dist/components/Button/ButtonTypes.d.ts +2 -1
- package/dist/components/Card/Card.d.ts +1 -1
- package/dist/components/Card/CardTypes.d.ts +2 -2
- 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 +3 -3
- package/dist/components/Form/Form.d.ts +13 -8
- package/dist/components/Form/FormTypes.d.ts +2 -8
- package/dist/components/Grid/GridTypes.d.ts +9 -0
- package/dist/components/Grid/SimpleGrid.d.ts +14 -0
- package/dist/components/Heading/Heading.d.ts +4 -4
- package/dist/components/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/IconTypes.d.ts +78 -64
- package/dist/components/Label/Label.d.ts +5 -17
- package/dist/components/Link/Link.d.ts +8 -12
- package/dist/components/SearchBar/SearchBar.d.ts +45 -27
- package/dist/components/Select/Select.d.ts +32 -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/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 +32 -31
- package/dist/components/TextInput/TextInputTypes.d.ts +5 -0
- package/dist/design-system-react-components.cjs.development.js +2597 -1170
- 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 +2580 -1173
- package/dist/design-system-react-components.esm.js.map +1 -1
- package/dist/index.d.ts +8 -1
- 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 +17 -7
- package/dist/theme/components/checkbox.d.ts +7 -7
- package/dist/theme/components/customCheckboxGroup.d.ts +18 -0
- package/dist/theme/components/customRadioGroup.d.ts +4 -3
- 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 +50 -20
- 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 +8 -7
- 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 +9 -9
- 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/global.d.ts +3 -0
- package/dist/theme/foundations/shadows.d.ts +4 -0
- package/dist/utils/utils.d.ts +6 -0
- package/package.json +3 -2
- package/src/components/Accordion/Accordion.stories.mdx +227 -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 +1 -1
- package/src/components/Autosuggest/Autosuggest.stories.tsx +1 -1
- package/src/components/Autosuggest/_Autosuggest.scss +2 -2
- package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +46 -52
- 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 +31 -27
- package/src/components/Button/Button.test.tsx +17 -5
- package/src/components/Button/ButtonTypes.tsx +1 -0
- package/src/components/Button/_Button.scss +3 -27
- package/src/components/Button/__snapshots__/Button.test.tsx.snap +11 -0
- package/src/components/Card/Card.stories.mdx +24 -20
- package/src/components/Card/Card.test.tsx +13 -19
- package/src/components/Card/Card.tsx +1 -1
- package/src/components/Card/CardTypes.tsx +2 -2
- package/src/components/Card/_Card.scss +1 -1
- package/src/components/CardEdition/CardEdition.stories.tsx +11 -6
- package/src/components/CardEdition/CardEdition.test.tsx +23 -31
- package/src/components/CardEdition/_CardEdition.scss +2 -2
- package/src/components/Chakra/Center.stories.mdx +31 -14
- package/src/components/Chakra/Grid.stories.mdx +79 -0
- package/src/components/Chakra/Stack.stories.mdx +4 -4
- package/src/components/Checkbox/Checkbox.tsx +9 -12
- package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +2 -5
- 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.test.tsx +4 -4
- package/src/components/DatePicker/DatePicker.tsx +13 -13
- package/src/components/DatePicker/_DatePicker.scss +1 -0
- package/src/components/Form/Form.stories.mdx +46 -21
- package/src/components/Form/Form.test.tsx +58 -45
- package/src/components/Form/Form.tsx +49 -21
- package/src/components/Form/FormTypes.tsx +3 -8
- package/src/components/Form/__snapshots__/Form.test.tsx.snap +24 -14
- package/src/components/Grid/GridTypes.tsx +9 -0
- package/src/components/Grid/SimpleGrid.stories.mdx +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 +1 -0
- package/src/components/Heading/Heading.tsx +12 -6
- package/src/components/HelperErrorText/_HelperErrorText.scss +1 -1
- package/src/components/Hero/Hero.stories.mdx +188 -121
- package/src/components/Hero/Hero.test.tsx +537 -107
- package/src/components/Hero/Hero.tsx +79 -92
- package/src/components/Hero/HeroTypes.tsx +17 -5
- package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +307 -0
- package/src/components/HorizontalRule/_HorizontalRule.scss +1 -1
- package/src/components/Icons/Icon.stories.mdx +83 -74
- package/src/components/Icons/Icon.test.tsx +30 -22
- package/src/components/Icons/Icon.tsx +63 -61
- package/src/components/Icons/IconTypes.tsx +80 -64
- package/src/components/Input/_Input.scss +2 -2
- package/src/components/Label/Label.stories.mdx +28 -7
- package/src/components/Label/Label.test.tsx +43 -12
- package/src/components/Label/Label.tsx +21 -34
- package/src/components/Label/__snapshots__/Label.test.tsx.snap +41 -0
- package/src/components/Link/Link.stories.mdx +41 -41
- package/src/components/Link/Link.test.tsx +33 -44
- package/src/components/Link/Link.tsx +114 -100
- package/src/components/List/List.stories.mdx +0 -2
- package/src/components/List/List.stories.tsx +5 -5
- package/src/components/List/_List.scss +3 -3
- package/src/components/Modal/_Modal.scss +1 -1
- package/src/components/Notification/Notification.stories.mdx +12 -1
- package/src/components/Notification/Notification.test.tsx +3 -16
- package/src/components/Notification/Notification.tsx +9 -10
- package/src/components/Notification/_Notification.scss +4 -4
- package/src/components/Pagination/Pagination.test.tsx +16 -10
- package/src/components/RadioGroup/RadioGroup.stories.mdx +1 -1
- package/src/components/RadioGroup/RadioGroup.tsx +2 -10
- package/src/components/SearchBar/SearchBar.Test.tsx +151 -16
- package/src/components/SearchBar/SearchBar.stories.mdx +189 -219
- package/src/components/SearchBar/SearchBar.tsx +151 -46
- package/src/components/Select/Select.stories.mdx +188 -170
- package/src/components/Select/Select.test.tsx +125 -380
- package/src/components/Select/Select.tsx +118 -165
- package/src/components/Select/SelectTypes.tsx +4 -0
- package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +13 -25
- 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 +16 -16
- package/src/components/StyleGuide/Buttons.stories.mdx +15 -15
- package/src/components/StyleGuide/Colors.stories.mdx +336 -0
- package/src/components/StyleGuide/Iconography.stories.mdx +88 -90
- package/src/components/StyleGuide/UIDocCard.tsx +1 -1
- package/src/components/Tabs/Tabs.tsx +7 -9
- 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 +89 -90
- package/src/components/TextInput/TextInput.test.tsx +65 -86
- package/src/components/TextInput/TextInput.tsx +101 -95
- package/src/components/TextInput/TextInputTypes.tsx +6 -0
- package/src/components/VideoPlayer/_VideoPlayer.scss +1 -1
- package/src/docs/Chakra.stories.mdx +4 -4
- package/src/docs/Intro.stories.mdx +15 -13
- package/src/index.ts +20 -0
- package/src/styles/01-colors/_colors-brand.scss +6 -0
- package/src/styles/01-colors/_colors-utility.scss +14 -12
- package/src/styles/base/_04-base.scss +2 -1
- package/src/styles/base/_place-holder.scss +1 -1
- package/src/styles.scss +10 -12
- package/src/theme/components/accordion.ts +30 -0
- package/src/theme/components/breadcrumb.ts +77 -0
- package/src/theme/components/button.ts +77 -63
- package/src/theme/components/checkbox.ts +15 -27
- package/src/theme/components/customCheckboxGroup.ts +12 -0
- package/src/theme/components/customRadioGroup.ts +4 -10
- package/src/theme/components/global.ts +71 -0
- package/src/theme/components/globalMixins.ts +16 -0
- package/src/theme/components/heading.ts +15 -8
- 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 +20 -31
- 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 +72 -69
- 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/colors.ts +29 -13
- package/src/theme/foundations/global.ts +3 -0
- package/src/theme/foundations/shadows.ts +5 -0
- package/src/theme/index.ts +37 -7
- package/src/utils/componentCategories.ts +8 -2
- package/src/utils/utils.ts +13 -0
- package/dist/components/Accordion/Accordion.stories.d.ts +0 -6
- package/dist/components/StatusBadge/StatusBadge.stories.d.ts +0 -8
- package/dist/components/StyleGuide/Colors.stories.d.ts +0 -25
- package/dist/components/Template/Template.stories.d.ts +0 -30
- package/src/components/Accordion/Accordion.stories.tsx +0 -66
- package/src/components/Accordion/_Accordion.scss +0 -81
- package/src/components/Breadcrumbs/_Breadcrumbs.scss +0 -97
- package/src/components/Form/_Form.scss +0 -67
- package/src/components/Hero/_Hero.scss +0 -256
- package/src/components/Icons/_Icons.scss +0 -116
- package/src/components/Label/_Label.scss +0 -22
- package/src/components/Link/_Link.scss +0 -73
- package/src/components/SearchBar/_SearchBar.scss +0 -16
- package/src/components/Select/_Select.scss +0 -82
- package/src/components/StatusBadge/StatusBadge.stories.tsx +0 -34
- package/src/components/StatusBadge/_StatusBadge.scss +0 -23
- package/src/components/StyleGuide/Colors.stories.tsx +0 -289
- package/src/components/Template/Template.stories.tsx +0 -86
- package/src/components/Template/_Template.scss +0 -63
- package/src/components/TextInput/_TextInput.scss +0 -59
|
@@ -195,7 +195,7 @@ describe("DatePicker", () => {
|
|
|
195
195
|
labelText="Select the date you want to visit NYPL"
|
|
196
196
|
helperText="Note that the Library may be closed on Sundays."
|
|
197
197
|
invalidText="Please select a valid date."
|
|
198
|
-
|
|
198
|
+
isInvalid={true}
|
|
199
199
|
/>
|
|
200
200
|
);
|
|
201
201
|
// When errored, we expect only the error text to appear.
|
|
@@ -212,7 +212,7 @@ describe("DatePicker", () => {
|
|
|
212
212
|
<DatePicker
|
|
213
213
|
labelText="Select the date you want to visit NYPL"
|
|
214
214
|
helperText="Note that the Library may be closed on Sundays."
|
|
215
|
-
|
|
215
|
+
isDisabled={true}
|
|
216
216
|
/>
|
|
217
217
|
);
|
|
218
218
|
|
|
@@ -383,7 +383,7 @@ describe("DatePicker", () => {
|
|
|
383
383
|
helperText="Note that the Library may be closed on Sundays."
|
|
384
384
|
helperTextTo="Note for the 'to' field."
|
|
385
385
|
invalidText="Please select a valid date range."
|
|
386
|
-
|
|
386
|
+
isInvalid={true}
|
|
387
387
|
/>
|
|
388
388
|
);
|
|
389
389
|
|
|
@@ -398,7 +398,7 @@ describe("DatePicker", () => {
|
|
|
398
398
|
helperText="Note that the Library may be closed on Sundays."
|
|
399
399
|
helperTextTo="Note for the 'to' field."
|
|
400
400
|
invalidText="Please select a valid date range."
|
|
401
|
-
|
|
401
|
+
isDisabled={true}
|
|
402
402
|
/>
|
|
403
403
|
);
|
|
404
404
|
|
|
@@ -86,14 +86,14 @@ export interface DatePickerProps extends DatePickerWrapperProps {
|
|
|
86
86
|
maxDate?: string;
|
|
87
87
|
/** Populates the `HelperErrorText` error state for both "From" and "To" input components. */
|
|
88
88
|
invalidText?: string;
|
|
89
|
-
/** Helper for modifiers array; adds '
|
|
90
|
-
|
|
89
|
+
/** Helper for modifiers array; adds 'isInvalid' styling. */
|
|
90
|
+
isInvalid?: boolean;
|
|
91
91
|
/** Adds the 'required' property to the input element(s). */
|
|
92
92
|
required?: boolean;
|
|
93
93
|
/** Whether or not to display the "Required"/"Optional" text in the label text. */
|
|
94
94
|
showOptReqLabel?: boolean;
|
|
95
95
|
/** Adds the 'disabled' property to the input element(s). */
|
|
96
|
-
|
|
96
|
+
isDisabled?: boolean;
|
|
97
97
|
/** Modifiers array for use with BEM. See how to work with modifiers and BEM
|
|
98
98
|
* here: http://getbem.com/introduction/ */
|
|
99
99
|
modifiers?: string[];
|
|
@@ -130,10 +130,10 @@ const CustomTextInput = forwardRef<TextInputRefType, CustomTextInputProps>(
|
|
|
130
130
|
onChange,
|
|
131
131
|
value,
|
|
132
132
|
labelText,
|
|
133
|
-
|
|
133
|
+
isDisabled,
|
|
134
134
|
dsRequired,
|
|
135
135
|
showOptReqLabel,
|
|
136
|
-
|
|
136
|
+
isInvalid,
|
|
137
137
|
helperText,
|
|
138
138
|
invalidText,
|
|
139
139
|
onClick,
|
|
@@ -149,10 +149,10 @@ const CustomTextInput = forwardRef<TextInputRefType, CustomTextInputProps>(
|
|
|
149
149
|
onChange={onChange}
|
|
150
150
|
value={value}
|
|
151
151
|
labelText={labelText}
|
|
152
|
-
|
|
153
|
-
|
|
152
|
+
isDisabled={isDisabled}
|
|
153
|
+
isRequired={dsRequired}
|
|
154
154
|
showOptReqLabel={showOptReqLabel}
|
|
155
|
-
|
|
155
|
+
isInvalid={isInvalid}
|
|
156
156
|
helperText={helperText}
|
|
157
157
|
invalidText={invalidText}
|
|
158
158
|
// Use either the specific prop-based or the forwardRef value.
|
|
@@ -220,10 +220,10 @@ const DatePicker = React.forwardRef<TextInputRefType, DatePickerProps>(
|
|
|
220
220
|
helperTextFrom,
|
|
221
221
|
helperTextTo,
|
|
222
222
|
invalidText,
|
|
223
|
-
|
|
223
|
+
isInvalid,
|
|
224
224
|
required,
|
|
225
225
|
showOptReqLabel = true,
|
|
226
|
-
|
|
226
|
+
isDisabled,
|
|
227
227
|
nameFrom,
|
|
228
228
|
nameTo,
|
|
229
229
|
blockName,
|
|
@@ -268,7 +268,7 @@ const DatePicker = React.forwardRef<TextInputRefType, DatePickerProps>(
|
|
|
268
268
|
minDate: minDate ? new Date(minDate) : null,
|
|
269
269
|
maxDate: maxDate ? new Date(maxDate) : null,
|
|
270
270
|
dateFormat,
|
|
271
|
-
|
|
271
|
+
isDisabled,
|
|
272
272
|
};
|
|
273
273
|
// Both TextInput components share some props.
|
|
274
274
|
let baseCustomTextInputAttrs = {
|
|
@@ -277,8 +277,8 @@ const DatePicker = React.forwardRef<TextInputRefType, DatePickerProps>(
|
|
|
277
277
|
// Always display the labels or the input fields when
|
|
278
278
|
// the DatePicker component is a `dateRange` type.
|
|
279
279
|
showLabel: dateRange ? true : showLabel,
|
|
280
|
-
|
|
281
|
-
|
|
280
|
+
isDisabled,
|
|
281
|
+
isInvalid,
|
|
282
282
|
helperText: dateRange ? helperTextFrom : helperText,
|
|
283
283
|
invalidText,
|
|
284
284
|
};
|
|
@@ -13,7 +13,9 @@ import Form, { FormRow, FormField } from "./Form";
|
|
|
13
13
|
import { FormSpacing } from "./FormTypes";
|
|
14
14
|
import TextInput from "../TextInput/TextInput";
|
|
15
15
|
import Radio from "../Radio/Radio";
|
|
16
|
+
import RadioGroup from "../RadioGroup/RadioGroup";
|
|
16
17
|
import Checkbox from "../Checkbox/Checkbox";
|
|
18
|
+
import CheckboxGroup from "../CheckboxGroup/CheckboxGroup";
|
|
17
19
|
import Label from "../Label/Label";
|
|
18
20
|
import Button from "../Button/Button";
|
|
19
21
|
import Select from "../Select/Select";
|
|
@@ -22,6 +24,8 @@ import { HeadingLevels } from "../Heading/HeadingTypes";
|
|
|
22
24
|
import HorizontalRule from "../HorizontalRule/HorizontalRule";
|
|
23
25
|
import { action } from "@storybook/addon-actions";
|
|
24
26
|
|
|
27
|
+
import SimpleGrid from "../Grid/SimpleGrid";
|
|
28
|
+
|
|
25
29
|
<Meta
|
|
26
30
|
title={getCategory("Form")}
|
|
27
31
|
component={Form}
|
|
@@ -41,7 +45,7 @@ import { action } from "@storybook/addon-actions";
|
|
|
41
45
|
| Component Version | DS Version |
|
|
42
46
|
| ----------------- | ---------- |
|
|
43
47
|
| Added | `0.23.2` |
|
|
44
|
-
| Latest | `0.
|
|
48
|
+
| Latest | `0.25.1` |
|
|
45
49
|
|
|
46
50
|
<Description of={Form} />
|
|
47
51
|
|
|
@@ -70,18 +74,34 @@ The `Form` component renders a standard `<form>` element and should be used to h
|
|
|
70
74
|
>
|
|
71
75
|
{(args) => (
|
|
72
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>
|
|
73
93
|
<FormField>
|
|
74
94
|
<TextInput
|
|
75
95
|
labelText="Username"
|
|
76
96
|
helperText="Make sure to complete this field."
|
|
77
|
-
|
|
97
|
+
isRequired
|
|
78
98
|
/>
|
|
79
99
|
</FormField>
|
|
80
100
|
<FormField>
|
|
81
101
|
<TextInput
|
|
82
102
|
labelText="Password"
|
|
83
103
|
helperText="Make sure to complete this field."
|
|
84
|
-
|
|
104
|
+
isRequired
|
|
85
105
|
/>
|
|
86
106
|
</FormField>
|
|
87
107
|
<FormRow>
|
|
@@ -109,24 +129,24 @@ The `Form` component renders a standard `<form>` element and should be used to h
|
|
|
109
129
|
</FormRow>
|
|
110
130
|
<FormRow>
|
|
111
131
|
<FormField>
|
|
112
|
-
<
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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>
|
|
120
142
|
</FormField>
|
|
121
143
|
<FormField>
|
|
122
|
-
<
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
<br />
|
|
129
|
-
<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>
|
|
130
150
|
</FormField>
|
|
131
151
|
<FormField>
|
|
132
152
|
<Select
|
|
@@ -137,6 +157,8 @@ The `Form` component renders a standard `<form>` element and should be used to h
|
|
|
137
157
|
<option>Option 1</option>
|
|
138
158
|
<option>Option 2</option>
|
|
139
159
|
<option>Option 3</option>
|
|
160
|
+
<option>Option 4</option>
|
|
161
|
+
<option>Option 5</option>
|
|
140
162
|
</Select>
|
|
141
163
|
</FormField>
|
|
142
164
|
</FormRow>
|
|
@@ -168,6 +190,7 @@ export const formRow = (size) => {
|
|
|
168
190
|
<option>Option 1</option>
|
|
169
191
|
<option>Option 2</option>
|
|
170
192
|
<option>Option 3</option>
|
|
193
|
+
<option>Option 4</option>
|
|
171
194
|
</Select>
|
|
172
195
|
</FormField>
|
|
173
196
|
<FormField>
|
|
@@ -179,6 +202,7 @@ export const formRow = (size) => {
|
|
|
179
202
|
<option>Option 1</option>
|
|
180
203
|
<option>Option 2</option>
|
|
181
204
|
<option>Option 3</option>
|
|
205
|
+
<option>Option 4</option>
|
|
182
206
|
</Select>
|
|
183
207
|
</FormField>
|
|
184
208
|
<FormField>
|
|
@@ -190,6 +214,7 @@ export const formRow = (size) => {
|
|
|
190
214
|
<option>Option 1</option>
|
|
191
215
|
<option>Option 2</option>
|
|
192
216
|
<option>Option 3</option>
|
|
217
|
+
<option>Option 4</option>
|
|
193
218
|
</Select>
|
|
194
219
|
</FormField>
|
|
195
220
|
</FormRow>
|
|
@@ -231,14 +256,14 @@ Below are the spacing variants available with the `FormSpacing` enum.
|
|
|
231
256
|
<TextInput
|
|
232
257
|
labelText="Username"
|
|
233
258
|
helperText="Make sure to complete this field."
|
|
234
|
-
|
|
259
|
+
isRequired
|
|
235
260
|
/>
|
|
236
261
|
</FormField>
|
|
237
262
|
<FormField>
|
|
238
263
|
<TextInput
|
|
239
264
|
labelText="Password"
|
|
240
265
|
helperText="Make sure to complete this field."
|
|
241
|
-
|
|
266
|
+
isRequired
|
|
242
267
|
/>
|
|
243
268
|
</FormField>
|
|
244
269
|
<FormRow>
|
|
@@ -1,10 +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
4
|
import renderer from "react-test-renderer";
|
|
5
5
|
|
|
6
6
|
import Form, { FormRow, FormField } from "./Form";
|
|
7
|
-
import { FormSpacing } from "./FormTypes";
|
|
7
|
+
// import { FormSpacing } from "./FormTypes";
|
|
8
8
|
import TextInput from "../TextInput/TextInput";
|
|
9
9
|
|
|
10
10
|
describe("Form Accessibility", () => {
|
|
@@ -32,40 +32,43 @@ describe("Form Snapshot", () => {
|
|
|
32
32
|
});
|
|
33
33
|
|
|
34
34
|
describe("Form", () => {
|
|
35
|
-
let container;
|
|
36
35
|
it("Renders a <form> element", () => {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
expect(container.querySelector(".form")).toBeInTheDocument();
|
|
36
|
+
render(<Form />);
|
|
37
|
+
expect(screen.getByRole("form")).toBeInTheDocument();
|
|
41
38
|
});
|
|
42
39
|
|
|
43
|
-
it("Renders a <form> element with child
|
|
44
|
-
|
|
40
|
+
it("Renders a <form> element with child FormRow element", () => {
|
|
41
|
+
render(
|
|
45
42
|
<Form>
|
|
46
43
|
<FormRow />
|
|
47
44
|
</Form>
|
|
48
45
|
);
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
expect(
|
|
52
|
-
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
|
+
});
|
|
53
53
|
});
|
|
54
54
|
|
|
55
|
-
it("Renders a <form> element with child
|
|
56
|
-
|
|
55
|
+
it("Renders a <form> element with child FormField element", () => {
|
|
56
|
+
render(
|
|
57
57
|
<Form>
|
|
58
58
|
<FormField />
|
|
59
59
|
</Form>
|
|
60
60
|
);
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
expect(
|
|
64
|
-
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
|
+
});
|
|
65
68
|
});
|
|
66
69
|
|
|
67
|
-
it("Renders a <form> element with
|
|
68
|
-
|
|
70
|
+
it("Renders a <form> element with FormRow, FormField and input elements properly nested", () => {
|
|
71
|
+
render(
|
|
69
72
|
<Form>
|
|
70
73
|
<FormRow>
|
|
71
74
|
<FormField>
|
|
@@ -74,33 +77,43 @@ describe("Form", () => {
|
|
|
74
77
|
</FormRow>
|
|
75
78
|
</Form>
|
|
76
79
|
);
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
expect(
|
|
82
|
-
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();
|
|
83
94
|
});
|
|
84
95
|
|
|
85
96
|
it("Renders a <form> element with custom `action` and `method` attributes", () => {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
expect(
|
|
90
|
-
expect(
|
|
91
|
-
"action",
|
|
92
|
-
"/end/point"
|
|
93
|
-
);
|
|
94
|
-
expect(container.querySelector(".form")).toHaveAttribute("method", "get");
|
|
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");
|
|
95
102
|
});
|
|
96
103
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
+
// });
|
|
106
119
|
});
|
|
@@ -1,66 +1,94 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import bem from "../../utils/bem";
|
|
3
|
-
import generateUUID from "../../helpers/generateUUID";
|
|
4
2
|
import { FormSpacing } from "./FormTypes";
|
|
3
|
+
import SimpleGrid from "../Grid/SimpleGrid";
|
|
4
|
+
import { Box } from "@chakra-ui/react";
|
|
5
|
+
import generateUUID from "../../helpers/generateUUID";
|
|
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
|
+
}
|
|
5
15
|
|
|
6
16
|
export interface FormProps {
|
|
7
17
|
/** Optional form `action` attribute */
|
|
8
18
|
action?: string;
|
|
9
|
-
/** Optional additional attributes passed to the `<form>` element */
|
|
10
|
-
attributes?: { [key: string]: any };
|
|
11
19
|
/** Optional className you can add in addition to `form` */
|
|
12
20
|
className?: string;
|
|
13
21
|
/** Optional ID that other components can cross reference */
|
|
14
22
|
id?: string;
|
|
15
23
|
/** Optional form `method` attribute */
|
|
16
24
|
method?: "get" | "post";
|
|
17
|
-
/** Optional modifiers array for use with BEM. See how to work with modifiers and BEM here: http://getbem.com/introduction/ */
|
|
18
|
-
modifiers?: string[];
|
|
19
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``` */
|
|
20
26
|
spacing?: FormSpacing;
|
|
21
27
|
}
|
|
22
28
|
|
|
23
|
-
|
|
24
|
-
export function FormRow(props) {
|
|
25
|
-
const { children, className } = props;
|
|
26
|
-
|
|
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
|
+
);
|
|
27
44
|
}
|
|
28
45
|
|
|
29
|
-
|
|
30
|
-
export function FormField(props) {
|
|
31
|
-
const { children, className } = props;
|
|
46
|
+
/** FormField child-component */
|
|
47
|
+
export function FormField(props: React.PropsWithChildren<FormChildProps>) {
|
|
48
|
+
const { children, className, gap, id } = props;
|
|
32
49
|
return (
|
|
33
|
-
<
|
|
50
|
+
<SimpleGrid columns={1} className={className} gap={gap} id={id}>
|
|
51
|
+
{children}
|
|
52
|
+
</SimpleGrid>
|
|
34
53
|
);
|
|
35
54
|
}
|
|
36
55
|
|
|
56
|
+
/** main Form component */
|
|
37
57
|
export default function Form(props: React.ComponentProps<"form"> & FormProps) {
|
|
38
58
|
const {
|
|
39
59
|
action,
|
|
40
|
-
attributes = {},
|
|
41
60
|
children,
|
|
42
61
|
className,
|
|
43
62
|
id = generateUUID(),
|
|
44
63
|
method,
|
|
45
|
-
modifiers = [],
|
|
46
64
|
spacing,
|
|
47
65
|
} = props;
|
|
48
66
|
|
|
67
|
+
let attributes = {};
|
|
49
68
|
action && (attributes["action"] = action);
|
|
50
69
|
|
|
51
70
|
method &&
|
|
52
71
|
(method === "get" || method === "post") &&
|
|
53
72
|
(attributes["method"] = method);
|
|
54
73
|
|
|
55
|
-
|
|
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
|
+
);
|
|
56
80
|
|
|
57
81
|
return (
|
|
58
|
-
<
|
|
59
|
-
|
|
82
|
+
<Box
|
|
83
|
+
as="form"
|
|
84
|
+
aria-label="form"
|
|
60
85
|
id={id}
|
|
61
86
|
{...attributes}
|
|
87
|
+
className={className}
|
|
62
88
|
>
|
|
63
|
-
{
|
|
64
|
-
|
|
89
|
+
<SimpleGrid columns={1} gap={spacing} id={id + "-parent"}>
|
|
90
|
+
{alteredChildren}
|
|
91
|
+
</SimpleGrid>
|
|
92
|
+
</Box>
|
|
65
93
|
);
|
|
66
94
|
}
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
Small = "small",
|
|
5
|
-
Medium = "medium",
|
|
6
|
-
Large = "large",
|
|
7
|
-
ExtraLarge = "extra-large",
|
|
8
|
-
}
|
|
1
|
+
import { GridGaps as FormSpacing } from "../Grid/GridTypes";
|
|
2
|
+
|
|
3
|
+
export { FormSpacing };
|
|
@@ -2,26 +2,36 @@
|
|
|
2
2
|
|
|
3
3
|
exports[`Form Snapshot Renders the UI snapshot correctly 1`] = `
|
|
4
4
|
<form
|
|
5
|
-
|
|
5
|
+
aria-label="form"
|
|
6
|
+
className="css-0"
|
|
6
7
|
id="snapshot-form"
|
|
7
8
|
>
|
|
8
9
|
<div
|
|
9
|
-
className="
|
|
10
|
+
className="css-aq1pyb"
|
|
11
|
+
id="snapshot-form-parent"
|
|
10
12
|
>
|
|
11
13
|
<div
|
|
12
|
-
className="
|
|
14
|
+
className="css-1ao258g"
|
|
15
|
+
id="snapshot-form-child0"
|
|
13
16
|
>
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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>
|
|
25
35
|
</div>
|
|
26
36
|
</div>
|
|
27
37
|
</form>
|