@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
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Meta,
|
|
3
3
|
Story,
|
|
4
|
-
Canvas,
|
|
5
4
|
ArgsTable,
|
|
6
|
-
|
|
5
|
+
Canvas,
|
|
7
6
|
Description,
|
|
8
7
|
} from "@storybook/addon-docs/blocks";
|
|
9
8
|
import { withDesign } from "storybook-addon-designs";
|
|
9
|
+
import { VStack } from "@chakra-ui/react";
|
|
10
10
|
|
|
11
11
|
import TextInput from "./TextInput";
|
|
12
12
|
import { TextInputTypes } from "./TextInputTypes";
|
|
13
|
-
import { action } from "@storybook/addon-actions";
|
|
14
13
|
import { getCategory } from "../../utils/componentCategories";
|
|
14
|
+
import DSProvider from "../../theme/provider";
|
|
15
15
|
|
|
16
16
|
<Meta
|
|
17
17
|
title={getCategory("TextInput")}
|
|
@@ -27,6 +27,9 @@ import { getCategory } from "../../utils/componentCategories";
|
|
|
27
27
|
}}
|
|
28
28
|
argTypes={{
|
|
29
29
|
attributes: { table: { disable: true } },
|
|
30
|
+
id: { table: { disable: true } },
|
|
31
|
+
onChange: { table: { disable: true } },
|
|
32
|
+
value: { table: { disable: true } },
|
|
30
33
|
}}
|
|
31
34
|
/>
|
|
32
35
|
|
|
@@ -35,134 +38,130 @@ import { getCategory } from "../../utils/componentCategories";
|
|
|
35
38
|
| Component Version | DS Version |
|
|
36
39
|
| ----------------- | ---------- |
|
|
37
40
|
| Added | `0.22.0` |
|
|
38
|
-
| Latest | `0.
|
|
41
|
+
| Latest | `0.25.1` |
|
|
39
42
|
|
|
40
43
|
<Description of={TextInput} />
|
|
41
44
|
|
|
42
|
-
This component renders a text input form element. See below for configuration
|
|
45
|
+
This component renders a text input form element. See below for configuration
|
|
46
|
+
information. For optimal accessibility, the `labelText` property is a required
|
|
47
|
+
prop, regardless of the label visibility. Additionally, while the `id` prop is
|
|
48
|
+
optional, a unique `id` attribute is necessary for accessibility. If the prop
|
|
49
|
+
is left blank, a value will be generated for you.
|
|
43
50
|
|
|
44
|
-
<
|
|
51
|
+
<Canvas withToolbar>
|
|
45
52
|
<Story
|
|
46
53
|
name="TextInput"
|
|
47
54
|
args={{
|
|
55
|
+
helperText: "Choose wisely.",
|
|
48
56
|
id: "myTextInput",
|
|
49
|
-
|
|
57
|
+
invalidText: "This is error text :(",
|
|
58
|
+
isDisabled: false,
|
|
59
|
+
isInvalid: false,
|
|
60
|
+
isRequired: true,
|
|
50
61
|
labelText: "What is your favorite color?",
|
|
51
|
-
showLabel: true,
|
|
52
62
|
placeholder: "e.g. blue, green, etc.",
|
|
53
|
-
|
|
54
|
-
invalidText: "Waaaaaaaa!",
|
|
55
|
-
errored: false,
|
|
56
|
-
required: true,
|
|
63
|
+
showLabel: true,
|
|
57
64
|
showOptReqLabel: true,
|
|
58
|
-
|
|
59
|
-
attributes: {
|
|
60
|
-
onFocus: action("focus"),
|
|
61
|
-
onBlur: action("blur"),
|
|
62
|
-
onChange: action("onChange"),
|
|
63
|
-
maxLength: 10,
|
|
64
|
-
tabIndex: 0,
|
|
65
|
-
autoFocus: true,
|
|
66
|
-
pattern: "[a-z0-9]",
|
|
67
|
-
},
|
|
65
|
+
type: TextInputTypes.text,
|
|
68
66
|
}}
|
|
69
67
|
>
|
|
70
68
|
{(args) => <TextInput {...args} />}
|
|
71
69
|
</Story>
|
|
72
|
-
</
|
|
70
|
+
</Canvas>
|
|
73
71
|
|
|
74
72
|
<ArgsTable story="TextInput" />
|
|
75
73
|
|
|
76
74
|
## Labelling Variations
|
|
77
75
|
|
|
78
|
-
A TextInput can be rendered with or without visible labels.
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
|
|
76
|
+
A TextInput can be rendered with or without visible labels. When `showLabel` is
|
|
77
|
+
set to `false`, an `aria-label` attribute is added to the input/textarea element
|
|
78
|
+
to maintain accessibility. If the component needs to be required, the
|
|
79
|
+
`showOptReqLabel` prop can be used to show or hide the "Required"/"Optional"
|
|
80
|
+
text within the `label` element.
|
|
81
|
+
|
|
82
|
+
<Canvas withToolbar>
|
|
83
|
+
<Story name="Labelling Variations">
|
|
84
|
+
<VStack align="stretch" spacing={12}>
|
|
85
|
+
<TextInput
|
|
86
|
+
labelText="What is your favorite color?"
|
|
87
|
+
placeholder="i.e. blue, green, etc."
|
|
88
|
+
helperText="Choose wisely!"
|
|
89
|
+
/>
|
|
90
|
+
<TextInput
|
|
91
|
+
labelText="What is your favorite color?"
|
|
92
|
+
placeholder="i.e. blue, green, etc."
|
|
93
|
+
showLabel={false}
|
|
94
|
+
/>
|
|
95
|
+
<TextInput
|
|
96
|
+
labelText="What is your favorite color?"
|
|
97
|
+
placeholder="i.e. blue, green, etc."
|
|
98
|
+
isRequired
|
|
99
|
+
/>
|
|
100
|
+
<TextInput
|
|
101
|
+
labelText="What is your favorite color?"
|
|
102
|
+
placeholder="i.e. blue, green, etc."
|
|
103
|
+
showOptReqLabel={false}
|
|
104
|
+
isRequired
|
|
105
|
+
/>
|
|
106
|
+
<TextInput
|
|
107
|
+
labelText="What is your favorite color?"
|
|
108
|
+
showLabel={false}
|
|
109
|
+
placeholder="i.e. blue, green, etc."
|
|
110
|
+
helperText="Choose wisely!"
|
|
111
|
+
/>
|
|
112
|
+
</VStack>
|
|
89
113
|
</Story>
|
|
90
|
-
</Preview>
|
|
91
|
-
|
|
92
|
-
<Canvas>
|
|
93
|
-
<TextInput labelText="What is your favorite color?" showLabel={true} />
|
|
94
114
|
</Canvas>
|
|
95
115
|
|
|
96
|
-
|
|
97
|
-
<TextInput
|
|
98
|
-
labelText="What is your favorite color?"
|
|
99
|
-
showLabel={false}
|
|
100
|
-
placeholder="i.e. blue, green, etc."
|
|
101
|
-
/>
|
|
102
|
-
</Canvas>
|
|
103
|
-
|
|
104
|
-
<Canvas>
|
|
105
|
-
<TextInput
|
|
106
|
-
labelText="What is your favorite color?"
|
|
107
|
-
showLabel={true}
|
|
108
|
-
placeholder="i.e. blue, green, etc."
|
|
109
|
-
/>
|
|
110
|
-
</Canvas>
|
|
116
|
+
### Errored
|
|
111
117
|
|
|
112
118
|
<Canvas>
|
|
113
|
-
<
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
+
<DSProvider>
|
|
120
|
+
<TextInput
|
|
121
|
+
labelText="What is your favorite color?"
|
|
122
|
+
placeholder="i.e. blue, green, etc."
|
|
123
|
+
helperText="Choose wisely!"
|
|
124
|
+
invalidText="This is error text :("
|
|
125
|
+
isInvalid
|
|
126
|
+
/>
|
|
127
|
+
</DSProvider>
|
|
119
128
|
</Canvas>
|
|
120
129
|
|
|
121
|
-
|
|
122
|
-
<TextInput
|
|
123
|
-
labelText="What is your favorite color?"
|
|
124
|
-
showLabel={true}
|
|
125
|
-
placeholder="i.e. blue, green, etc."
|
|
126
|
-
helperText="Choose wisely!"
|
|
127
|
-
/>
|
|
128
|
-
</Canvas>
|
|
129
|
-
|
|
130
|
-
<Canvas>
|
|
131
|
-
<TextInput
|
|
132
|
-
labelText="What is your favorite color?"
|
|
133
|
-
showLabel={false}
|
|
134
|
-
placeholder="i.e. blue, green, etc."
|
|
135
|
-
invalidText="Waaaaaa!"
|
|
136
|
-
errored={true}
|
|
137
|
-
/>
|
|
138
|
-
</Canvas>
|
|
130
|
+
### Disabled
|
|
139
131
|
|
|
140
132
|
<Canvas>
|
|
141
|
-
<
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
133
|
+
<DSProvider>
|
|
134
|
+
<TextInput
|
|
135
|
+
labelText="What is your favorite color?"
|
|
136
|
+
placeholder="i.e. blue, green, etc."
|
|
137
|
+
helperText="Choose wisely!"
|
|
138
|
+
isDisabled
|
|
139
|
+
/>
|
|
140
|
+
</DSProvider>
|
|
148
141
|
</Canvas>
|
|
149
142
|
|
|
150
143
|
## Textarea
|
|
151
144
|
|
|
152
145
|
The TextInput component includes a multiline `textarea` form field. To render a
|
|
153
|
-
`textarea` element, pass `TextInputTypes.textarea` for the `type` prop.
|
|
146
|
+
`textarea` element, pass `TextInputTypes.textarea` for the `type` prop. All the
|
|
147
|
+
variations described above are available for the `textarea` option.
|
|
154
148
|
|
|
155
|
-
<
|
|
149
|
+
<Canvas withToolbar>
|
|
156
150
|
<Story
|
|
157
151
|
name="Textarea"
|
|
158
152
|
args={{
|
|
159
|
-
|
|
153
|
+
helperText: "Let it all out.",
|
|
154
|
+
invalidText: "This is error text :(",
|
|
155
|
+
isDisabled: false,
|
|
156
|
+
isInvalid: false,
|
|
157
|
+
isRequired: true,
|
|
160
158
|
labelText: "In less than 500 words, describe your favorite color?",
|
|
161
|
-
showLabel: true,
|
|
162
159
|
placeholder: "Essay question...",
|
|
163
|
-
|
|
160
|
+
showLabel: true,
|
|
161
|
+
showOptReqLabel: true,
|
|
162
|
+
type: TextInputTypes.textarea,
|
|
164
163
|
}}
|
|
165
164
|
>
|
|
166
165
|
{(args) => <TextInput {...args} />}
|
|
167
166
|
</Story>
|
|
168
|
-
</
|
|
167
|
+
</Canvas>
|
|
@@ -1,23 +1,33 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import {
|
|
2
|
+
import { render, screen, fireEvent } from "@testing-library/react";
|
|
3
3
|
import { axe } from "jest-axe";
|
|
4
4
|
import userEvent from "@testing-library/user-event";
|
|
5
5
|
|
|
6
|
-
import HelperErrorText from "../HelperErrorText/HelperErrorText";
|
|
7
6
|
import TextInput from "./TextInput";
|
|
8
7
|
import { TextInputTypes } from "./TextInputTypes";
|
|
9
8
|
import * as generateUUID from "../../helpers/generateUUID";
|
|
10
9
|
|
|
11
10
|
describe("TextInput Accessibility", () => {
|
|
12
|
-
it("passes axe accessibility test", async () => {
|
|
11
|
+
it("passes axe accessibility test for the input element", async () => {
|
|
13
12
|
const { container } = render(
|
|
14
13
|
<TextInput
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
required={true}
|
|
14
|
+
labelText="Custom input label"
|
|
15
|
+
isRequired
|
|
18
16
|
placeholder="Input Placeholder"
|
|
19
17
|
type={TextInputTypes.text}
|
|
20
|
-
|
|
18
|
+
onChange={jest.fn()}
|
|
19
|
+
/>
|
|
20
|
+
);
|
|
21
|
+
expect(await axe(container)).toHaveNoViolations();
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it("passes axe accessibility test for the textarea element", async () => {
|
|
25
|
+
const { container } = render(
|
|
26
|
+
<TextInput
|
|
27
|
+
labelText="Custom textarea label"
|
|
28
|
+
isRequired
|
|
29
|
+
placeholder="Input Placeholder"
|
|
30
|
+
type={TextInputTypes.textarea}
|
|
21
31
|
onChange={jest.fn()}
|
|
22
32
|
/>
|
|
23
33
|
);
|
|
@@ -37,7 +47,7 @@ describe("TextInput", () => {
|
|
|
37
47
|
<TextInput
|
|
38
48
|
id="myTextInput"
|
|
39
49
|
labelText="Custom Input Label"
|
|
40
|
-
|
|
50
|
+
isRequired
|
|
41
51
|
placeholder="Input Placeholder"
|
|
42
52
|
type={TextInputTypes.text}
|
|
43
53
|
attributes={{ onFocus: focusHandler }}
|
|
@@ -46,25 +56,25 @@ describe("TextInput", () => {
|
|
|
46
56
|
);
|
|
47
57
|
});
|
|
48
58
|
|
|
49
|
-
it("
|
|
59
|
+
it("renders an input element", () => {
|
|
50
60
|
expect(screen.getByLabelText(/Custom Input Label/i)).toBeInTheDocument();
|
|
51
61
|
});
|
|
52
62
|
|
|
53
|
-
it("
|
|
63
|
+
it("renders label with label text", () => {
|
|
54
64
|
expect(screen.getByText("Custom Input Label")).toBeInTheDocument();
|
|
55
65
|
});
|
|
56
66
|
|
|
57
|
-
it("
|
|
67
|
+
it("renders 'Required' along with the label text", () => {
|
|
58
68
|
expect(screen.getByText("Custom Input Label")).toBeInTheDocument();
|
|
59
69
|
expect(screen.getByText(/Required/i)).toBeInTheDocument();
|
|
60
70
|
});
|
|
61
71
|
|
|
62
|
-
it("
|
|
72
|
+
it("renders 'Optional' along with the label text", () => {
|
|
63
73
|
utils.rerender(
|
|
64
74
|
<TextInput
|
|
65
75
|
id="myTextInput"
|
|
66
76
|
labelText="Custom Input Label"
|
|
67
|
-
|
|
77
|
+
isRequired={false}
|
|
68
78
|
placeholder="Input Placeholder"
|
|
69
79
|
type={TextInputTypes.text}
|
|
70
80
|
attributes={{ onFocus: focusHandler }}
|
|
@@ -76,12 +86,12 @@ describe("TextInput", () => {
|
|
|
76
86
|
expect(screen.getByText(/Optional/i)).toBeInTheDocument();
|
|
77
87
|
});
|
|
78
88
|
|
|
79
|
-
it("
|
|
89
|
+
it("does not render 'Required' along with the label text", () => {
|
|
80
90
|
utils.rerender(
|
|
81
91
|
<TextInput
|
|
82
92
|
id="myTextInput"
|
|
83
93
|
labelText="Custom Input Label"
|
|
84
|
-
|
|
94
|
+
isRequired
|
|
85
95
|
showOptReqLabel={false}
|
|
86
96
|
placeholder="Input Placeholder"
|
|
87
97
|
type={TextInputTypes.text}
|
|
@@ -94,32 +104,32 @@ describe("TextInput", () => {
|
|
|
94
104
|
expect(screen.queryByText(/Required/i)).not.toBeInTheDocument();
|
|
95
105
|
});
|
|
96
106
|
|
|
97
|
-
it("
|
|
107
|
+
it("renders label's `for` attribute pointing at ID from input", () => {
|
|
98
108
|
expect(screen.getByText(/Custom Input Label/i)).toHaveAttribute(
|
|
99
109
|
"for",
|
|
100
110
|
"myTextInput"
|
|
101
111
|
);
|
|
102
112
|
});
|
|
103
113
|
|
|
104
|
-
it("
|
|
114
|
+
it("renders placeholder text", () => {
|
|
105
115
|
expect(
|
|
106
116
|
screen.getByPlaceholderText("Input Placeholder")
|
|
107
117
|
).toBeInTheDocument();
|
|
108
118
|
});
|
|
109
119
|
|
|
110
|
-
it("
|
|
120
|
+
it("adds aria-required prop if input is required", () => {
|
|
111
121
|
expect(screen.getByLabelText(/Custom Input Label/i)).toHaveAttribute(
|
|
112
122
|
"aria-required"
|
|
113
123
|
);
|
|
114
124
|
});
|
|
115
125
|
|
|
116
|
-
it("
|
|
126
|
+
it("allows user to pass in additional attributes", () => {
|
|
117
127
|
expect(focusHandler).toHaveBeenCalledTimes(0);
|
|
118
128
|
fireEvent.focus(screen.getByLabelText(/Custom Input Label/i));
|
|
119
129
|
expect(focusHandler).toHaveBeenCalledTimes(1);
|
|
120
130
|
});
|
|
121
131
|
|
|
122
|
-
it("
|
|
132
|
+
it("changing the value calls the onChange handler", () => {
|
|
123
133
|
expect(changeHandler).toHaveBeenCalledTimes(0);
|
|
124
134
|
userEvent.type(screen.getByLabelText(/Custom Input Label/i), "Hello");
|
|
125
135
|
// Called 5 times because "Hello" has length of 5.
|
|
@@ -137,43 +147,36 @@ describe("Renders TextInput with auto-generated ID, hidden label and visible hel
|
|
|
137
147
|
labelText="Custom Input Label"
|
|
138
148
|
showLabel={false}
|
|
139
149
|
helperText="Custom Helper Text"
|
|
140
|
-
|
|
150
|
+
isRequired
|
|
141
151
|
placeholder="Input Placeholder"
|
|
142
152
|
type={TextInputTypes.text}
|
|
143
153
|
/>
|
|
144
154
|
);
|
|
145
155
|
});
|
|
146
156
|
|
|
147
|
-
it("
|
|
157
|
+
it("renders Input component", () => {
|
|
148
158
|
expect(screen.getByLabelText(/Custom Input Label/i)).toBeInTheDocument();
|
|
149
159
|
});
|
|
150
160
|
|
|
151
|
-
it("
|
|
161
|
+
it("calls a UUID generation method if no ID is passed as a prop", () => {
|
|
152
162
|
// Called twice for the `TextInput` and the SVG icon components.
|
|
153
163
|
expect(generateUUIDSpy).toHaveBeenCalledTimes(2);
|
|
154
164
|
});
|
|
155
165
|
|
|
156
|
-
it("
|
|
166
|
+
it("does not renders Label component", () => {
|
|
157
167
|
expect(screen.queryByText(/Custom Input Label/i)).not.toBeInTheDocument();
|
|
158
168
|
});
|
|
159
169
|
|
|
160
|
-
it("
|
|
170
|
+
it("renders custom aria-label", () => {
|
|
161
171
|
expect(screen.getByLabelText(/Custom Input Label/i)).toHaveAttribute(
|
|
162
172
|
"aria-label",
|
|
163
|
-
"Custom Input Label"
|
|
173
|
+
"Custom Input Label - Custom Helper Text"
|
|
164
174
|
);
|
|
165
175
|
});
|
|
166
176
|
|
|
167
|
-
it("
|
|
177
|
+
it("renders HelperErrorText component", () => {
|
|
168
178
|
expect(screen.getByText("Custom Helper Text")).toBeInTheDocument();
|
|
169
179
|
});
|
|
170
|
-
|
|
171
|
-
it("Renders aria-describedby with helper text", () => {
|
|
172
|
-
expect(screen.getByLabelText(/Custom Input Label/i)).toHaveAttribute(
|
|
173
|
-
"aria-describedby",
|
|
174
|
-
"Custom Helper Text"
|
|
175
|
-
);
|
|
176
|
-
});
|
|
177
180
|
});
|
|
178
181
|
|
|
179
182
|
describe("TextInput shows error state", () => {
|
|
@@ -185,71 +188,32 @@ describe("TextInput shows error state", () => {
|
|
|
185
188
|
helperText="Custom Helper Text"
|
|
186
189
|
invalidText="Custom Error Text"
|
|
187
190
|
placeholder="Input Placeholder"
|
|
188
|
-
|
|
191
|
+
isInvalid={true}
|
|
189
192
|
type={TextInputTypes.text}
|
|
190
193
|
/>
|
|
191
194
|
);
|
|
192
195
|
});
|
|
193
196
|
|
|
194
|
-
it("
|
|
197
|
+
it("renders Input component", () => {
|
|
195
198
|
expect(screen.getByLabelText(/Custom Input Label/i)).toBeInTheDocument();
|
|
196
199
|
});
|
|
197
200
|
|
|
198
|
-
it("
|
|
201
|
+
it("renders Label component", () => {
|
|
199
202
|
expect(screen.getByText(/Custom Input Label/i)).toBeInTheDocument();
|
|
200
203
|
});
|
|
201
204
|
|
|
202
|
-
it("
|
|
205
|
+
it("renders HelperErrorText component", () => {
|
|
203
206
|
expect(screen.queryByText("Custom Helper Text")).not.toBeInTheDocument();
|
|
204
207
|
expect(screen.getByText("Custom Error Text")).toBeInTheDocument();
|
|
205
208
|
});
|
|
206
209
|
|
|
207
|
-
it("
|
|
210
|
+
it("input shows error state", () => {
|
|
208
211
|
expect(screen.getByLabelText(/Custom Input Label/i)).toHaveAttribute(
|
|
209
|
-
"
|
|
210
|
-
"inputfield inputfield--error "
|
|
212
|
+
"aria-invalid"
|
|
211
213
|
);
|
|
212
214
|
});
|
|
213
215
|
});
|
|
214
216
|
|
|
215
|
-
describe("TextInput Group", () => {
|
|
216
|
-
beforeEach(() => {
|
|
217
|
-
render(
|
|
218
|
-
<fieldset>
|
|
219
|
-
<legend>Input Group Label Legend</legend>
|
|
220
|
-
|
|
221
|
-
<TextInput
|
|
222
|
-
id="input1"
|
|
223
|
-
required={true}
|
|
224
|
-
type={TextInputTypes.text}
|
|
225
|
-
labelText="For"
|
|
226
|
-
helperText="Input 1 Helper Text"
|
|
227
|
-
/>
|
|
228
|
-
|
|
229
|
-
<TextInput
|
|
230
|
-
id="input2"
|
|
231
|
-
required={true}
|
|
232
|
-
type={TextInputTypes.text}
|
|
233
|
-
labelText="To"
|
|
234
|
-
helperText="Input 2 Helper Text"
|
|
235
|
-
/>
|
|
236
|
-
|
|
237
|
-
<HelperErrorText isError={true} id={"sharedHelperText"}>
|
|
238
|
-
Additional Error Text
|
|
239
|
-
</HelperErrorText>
|
|
240
|
-
</fieldset>
|
|
241
|
-
);
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
it("Renders legend", () => {
|
|
245
|
-
expect(screen.getByText("Input Group Label Legend")).toBeInTheDocument();
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
it("Renders two inputs", () => {
|
|
249
|
-
expect(screen.getAllByRole("textbox")).toHaveLength(2);
|
|
250
|
-
});
|
|
251
|
-
});
|
|
252
|
-
|
|
253
217
|
describe("Renders HTML attributes passed through the `attributes` prop", () => {
|
|
254
218
|
const onChangeSpy = jest.fn();
|
|
255
219
|
const onBlurSpy = jest.fn();
|
|
@@ -270,27 +234,27 @@ describe("Renders HTML attributes passed through the `attributes` prop", () => {
|
|
|
270
234
|
);
|
|
271
235
|
});
|
|
272
236
|
|
|
273
|
-
it("
|
|
237
|
+
it("has a maxlength for the input element", () => {
|
|
274
238
|
expect(screen.getByLabelText(/Input Label/i)).toHaveAttribute(
|
|
275
239
|
"maxLength",
|
|
276
240
|
"10"
|
|
277
241
|
);
|
|
278
242
|
});
|
|
279
243
|
|
|
280
|
-
it("
|
|
244
|
+
it("has a tabIndex", () => {
|
|
281
245
|
expect(screen.getByLabelText(/Input Label/i)).toHaveAttribute(
|
|
282
246
|
"tabIndex",
|
|
283
247
|
"0"
|
|
284
248
|
);
|
|
285
249
|
});
|
|
286
250
|
|
|
287
|
-
it("
|
|
251
|
+
it("calls the onChange function", () => {
|
|
288
252
|
expect(onChangeSpy).toHaveBeenCalledTimes(0);
|
|
289
253
|
userEvent.type(screen.getByLabelText(/Input Label/i), "Hello");
|
|
290
254
|
expect(onChangeSpy).toHaveBeenCalledTimes(5);
|
|
291
255
|
});
|
|
292
256
|
|
|
293
|
-
it("
|
|
257
|
+
it("calls the onBlur function", () => {
|
|
294
258
|
expect(onBlurSpy).toHaveBeenCalledTimes(0);
|
|
295
259
|
fireEvent.blur(screen.getByLabelText(/Input Label/i));
|
|
296
260
|
expect(onBlurSpy).toHaveBeenCalledTimes(1);
|
|
@@ -329,7 +293,7 @@ describe("Renders HTML attributes passed through the `attributes` prop", () => {
|
|
|
329
293
|
// });
|
|
330
294
|
|
|
331
295
|
describe("Hidden input", () => {
|
|
332
|
-
it("
|
|
296
|
+
it("renders a hidden type input", () => {
|
|
333
297
|
const utils = render(
|
|
334
298
|
<TextInput
|
|
335
299
|
id="inputID-hidden"
|
|
@@ -347,6 +311,21 @@ describe("Hidden input", () => {
|
|
|
347
311
|
"hidden"
|
|
348
312
|
);
|
|
349
313
|
});
|
|
314
|
+
|
|
315
|
+
it("does not show the helper text", () => {
|
|
316
|
+
render(
|
|
317
|
+
<TextInput
|
|
318
|
+
id="inputID-hidden"
|
|
319
|
+
labelText="Hidden Input Label"
|
|
320
|
+
helperText="Helper Text"
|
|
321
|
+
type={TextInputTypes.hidden}
|
|
322
|
+
value="hidden"
|
|
323
|
+
/>
|
|
324
|
+
);
|
|
325
|
+
|
|
326
|
+
expect(screen.queryByText("Hidden Input Label")).not.toBeInTheDocument();
|
|
327
|
+
expect(screen.queryByText("Helper Text")).not.toBeInTheDocument();
|
|
328
|
+
});
|
|
350
329
|
});
|
|
351
330
|
|
|
352
331
|
describe("Textarea element type", () => {
|
|
@@ -361,11 +340,11 @@ describe("Textarea element type", () => {
|
|
|
361
340
|
);
|
|
362
341
|
});
|
|
363
342
|
|
|
364
|
-
it("
|
|
343
|
+
it("renders a textarea element", () => {
|
|
365
344
|
expect(screen.getByRole("textbox")).toBeInTheDocument();
|
|
366
345
|
});
|
|
367
346
|
|
|
368
|
-
it("
|
|
347
|
+
it("renders label with label text", () => {
|
|
369
348
|
expect(screen.getByLabelText(/Custom textarea Label/i)).toBeInTheDocument();
|
|
370
349
|
});
|
|
371
350
|
});
|