@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.
Files changed (236) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/components/Accordion/Accordion.d.ts +14 -14
  3. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +11 -14
  4. package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +6 -0
  5. package/dist/components/Button/ButtonTypes.d.ts +2 -1
  6. package/dist/components/Card/Card.d.ts +1 -1
  7. package/dist/components/Card/CardTypes.d.ts +2 -2
  8. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +43 -0
  9. package/dist/components/CheckboxGroup/CheckboxGroupLayoutTypes.d.ts +4 -0
  10. package/dist/components/DatePicker/DatePicker.d.ts +3 -3
  11. package/dist/components/Form/Form.d.ts +13 -8
  12. package/dist/components/Form/FormTypes.d.ts +2 -8
  13. package/dist/components/Grid/GridTypes.d.ts +9 -0
  14. package/dist/components/Grid/SimpleGrid.d.ts +14 -0
  15. package/dist/components/Heading/Heading.d.ts +4 -4
  16. package/dist/components/Hero/Hero.d.ts +19 -14
  17. package/dist/components/Hero/HeroTypes.d.ts +10 -5
  18. package/dist/components/Icons/Icon.d.ts +13 -16
  19. package/dist/components/Icons/IconTypes.d.ts +78 -64
  20. package/dist/components/Label/Label.d.ts +5 -17
  21. package/dist/components/Link/Link.d.ts +8 -12
  22. package/dist/components/SearchBar/SearchBar.d.ts +45 -27
  23. package/dist/components/Select/Select.d.ts +32 -35
  24. package/dist/components/Select/SelectTypes.d.ts +4 -0
  25. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +1 -1
  26. package/dist/components/SkeletonLoader/SkeletonLoaderTypes.d.ts +2 -2
  27. package/dist/components/StatusBadge/StatusBadge.d.ts +8 -6
  28. package/dist/components/StatusBadge/StatusBadgeTypes.d.ts +5 -0
  29. package/dist/components/Template/Template.d.ts +91 -0
  30. package/dist/components/Text/Text.d.ts +16 -0
  31. package/dist/components/Text/TextTypes.d.ts +6 -0
  32. package/dist/components/TextInput/TextInput.d.ts +32 -31
  33. package/dist/components/TextInput/TextInputTypes.d.ts +5 -0
  34. package/dist/design-system-react-components.cjs.development.js +2597 -1170
  35. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  36. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  37. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  38. package/dist/design-system-react-components.esm.js +2580 -1173
  39. package/dist/design-system-react-components.esm.js.map +1 -1
  40. package/dist/index.d.ts +8 -1
  41. package/dist/styles.css +1 -1
  42. package/dist/theme/components/accordion.d.ts +25 -0
  43. package/dist/theme/components/breadcrumb.d.ts +90 -0
  44. package/dist/theme/components/button.d.ts +17 -7
  45. package/dist/theme/components/checkbox.d.ts +7 -7
  46. package/dist/theme/components/customCheckboxGroup.d.ts +18 -0
  47. package/dist/theme/components/customRadioGroup.d.ts +4 -3
  48. package/dist/theme/components/global.d.ts +55 -0
  49. package/dist/theme/components/globalMixins.d.ts +15 -0
  50. package/dist/theme/components/heading.d.ts +50 -20
  51. package/dist/theme/components/hero.d.ts +492 -0
  52. package/dist/theme/components/icon.d.ts +13 -0
  53. package/dist/theme/components/label.d.ts +16 -0
  54. package/dist/theme/components/link.d.ts +45 -0
  55. package/dist/theme/components/radio.d.ts +8 -7
  56. package/dist/theme/components/searchBar.d.ts +20 -0
  57. package/dist/theme/components/select.d.ts +58 -0
  58. package/dist/theme/components/statusBadge.d.ts +25 -0
  59. package/dist/theme/components/tabs.d.ts +9 -9
  60. package/dist/theme/components/template.d.ts +105 -0
  61. package/dist/theme/components/text.d.ts +20 -0
  62. package/dist/theme/components/textInput.d.ts +105 -0
  63. package/dist/theme/foundations/global.d.ts +3 -0
  64. package/dist/theme/foundations/shadows.d.ts +4 -0
  65. package/dist/utils/utils.d.ts +6 -0
  66. package/package.json +3 -2
  67. package/src/components/Accordion/Accordion.stories.mdx +227 -33
  68. package/src/components/Accordion/Accordion.test.tsx +135 -19
  69. package/src/components/Accordion/Accordion.tsx +81 -56
  70. package/src/components/Autosuggest/Autosuggest.stories.mdx +1 -1
  71. package/src/components/Autosuggest/Autosuggest.stories.tsx +1 -1
  72. package/src/components/Autosuggest/_Autosuggest.scss +2 -2
  73. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +46 -52
  74. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +31 -25
  75. package/src/components/Breadcrumbs/Breadcrumbs.tsx +71 -73
  76. package/src/components/Breadcrumbs/BreadcrumbsTypes.tsx +6 -0
  77. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +100 -0
  78. package/src/components/Button/Button.stories.mdx +31 -27
  79. package/src/components/Button/Button.test.tsx +17 -5
  80. package/src/components/Button/ButtonTypes.tsx +1 -0
  81. package/src/components/Button/_Button.scss +3 -27
  82. package/src/components/Button/__snapshots__/Button.test.tsx.snap +11 -0
  83. package/src/components/Card/Card.stories.mdx +24 -20
  84. package/src/components/Card/Card.test.tsx +13 -19
  85. package/src/components/Card/Card.tsx +1 -1
  86. package/src/components/Card/CardTypes.tsx +2 -2
  87. package/src/components/Card/_Card.scss +1 -1
  88. package/src/components/CardEdition/CardEdition.stories.tsx +11 -6
  89. package/src/components/CardEdition/CardEdition.test.tsx +23 -31
  90. package/src/components/CardEdition/_CardEdition.scss +2 -2
  91. package/src/components/Chakra/Center.stories.mdx +31 -14
  92. package/src/components/Chakra/Grid.stories.mdx +79 -0
  93. package/src/components/Chakra/Stack.stories.mdx +4 -4
  94. package/src/components/Checkbox/Checkbox.tsx +9 -12
  95. package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +2 -5
  96. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +249 -0
  97. package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +345 -0
  98. package/src/components/CheckboxGroup/CheckboxGroup.tsx +148 -0
  99. package/src/components/CheckboxGroup/CheckboxGroupLayoutTypes.tsx +4 -0
  100. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +1360 -0
  101. package/src/components/DatePicker/DatePicker.test.tsx +4 -4
  102. package/src/components/DatePicker/DatePicker.tsx +13 -13
  103. package/src/components/DatePicker/_DatePicker.scss +1 -0
  104. package/src/components/Form/Form.stories.mdx +46 -21
  105. package/src/components/Form/Form.test.tsx +58 -45
  106. package/src/components/Form/Form.tsx +49 -21
  107. package/src/components/Form/FormTypes.tsx +3 -8
  108. package/src/components/Form/__snapshots__/Form.test.tsx.snap +24 -14
  109. package/src/components/Grid/GridTypes.tsx +9 -0
  110. package/src/components/Grid/SimpleGrid.stories.mdx +275 -0
  111. package/src/components/Grid/SimpleGrid.test.tsx +66 -0
  112. package/src/components/Grid/SimpleGrid.tsx +37 -0
  113. package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +8 -0
  114. package/src/components/Heading/Heading.stories.mdx +1 -0
  115. package/src/components/Heading/Heading.tsx +12 -6
  116. package/src/components/HelperErrorText/_HelperErrorText.scss +1 -1
  117. package/src/components/Hero/Hero.stories.mdx +188 -121
  118. package/src/components/Hero/Hero.test.tsx +537 -107
  119. package/src/components/Hero/Hero.tsx +79 -92
  120. package/src/components/Hero/HeroTypes.tsx +17 -5
  121. package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +307 -0
  122. package/src/components/HorizontalRule/_HorizontalRule.scss +1 -1
  123. package/src/components/Icons/Icon.stories.mdx +83 -74
  124. package/src/components/Icons/Icon.test.tsx +30 -22
  125. package/src/components/Icons/Icon.tsx +63 -61
  126. package/src/components/Icons/IconTypes.tsx +80 -64
  127. package/src/components/Input/_Input.scss +2 -2
  128. package/src/components/Label/Label.stories.mdx +28 -7
  129. package/src/components/Label/Label.test.tsx +43 -12
  130. package/src/components/Label/Label.tsx +21 -34
  131. package/src/components/Label/__snapshots__/Label.test.tsx.snap +41 -0
  132. package/src/components/Link/Link.stories.mdx +41 -41
  133. package/src/components/Link/Link.test.tsx +33 -44
  134. package/src/components/Link/Link.tsx +114 -100
  135. package/src/components/List/List.stories.mdx +0 -2
  136. package/src/components/List/List.stories.tsx +5 -5
  137. package/src/components/List/_List.scss +3 -3
  138. package/src/components/Modal/_Modal.scss +1 -1
  139. package/src/components/Notification/Notification.stories.mdx +12 -1
  140. package/src/components/Notification/Notification.test.tsx +3 -16
  141. package/src/components/Notification/Notification.tsx +9 -10
  142. package/src/components/Notification/_Notification.scss +4 -4
  143. package/src/components/Pagination/Pagination.test.tsx +16 -10
  144. package/src/components/RadioGroup/RadioGroup.stories.mdx +1 -1
  145. package/src/components/RadioGroup/RadioGroup.tsx +2 -10
  146. package/src/components/SearchBar/SearchBar.Test.tsx +151 -16
  147. package/src/components/SearchBar/SearchBar.stories.mdx +189 -219
  148. package/src/components/SearchBar/SearchBar.tsx +151 -46
  149. package/src/components/Select/Select.stories.mdx +188 -170
  150. package/src/components/Select/Select.test.tsx +125 -380
  151. package/src/components/Select/Select.tsx +118 -165
  152. package/src/components/Select/SelectTypes.tsx +4 -0
  153. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +13 -25
  154. package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +7 -7
  155. package/src/components/SkeletonLoader/SkeletonLoader.tsx +4 -2
  156. package/src/components/SkeletonLoader/SkeletonLoaderTypes.tsx +2 -2
  157. package/src/components/SkeletonLoader/_SkeletonLoader.scss +3 -3
  158. package/src/components/StatusBadge/StatusBadge.stories.mdx +91 -0
  159. package/src/components/StatusBadge/StatusBadge.test.tsx +35 -7
  160. package/src/components/StatusBadge/StatusBadge.tsx +24 -25
  161. package/src/components/StatusBadge/StatusBadgeTypes.tsx +5 -0
  162. package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +28 -0
  163. package/src/components/StyleGuide/Bidirectionality.stories.mdx +16 -16
  164. package/src/components/StyleGuide/Buttons.stories.mdx +15 -15
  165. package/src/components/StyleGuide/Colors.stories.mdx +336 -0
  166. package/src/components/StyleGuide/Iconography.stories.mdx +88 -90
  167. package/src/components/StyleGuide/UIDocCard.tsx +1 -1
  168. package/src/components/Tabs/Tabs.tsx +7 -9
  169. package/src/components/Template/Template.stories.mdx +574 -0
  170. package/src/components/Template/Template.test.tsx +124 -0
  171. package/src/components/Template/Template.tsx +226 -0
  172. package/src/components/Text/Text.stories.mdx +70 -0
  173. package/src/components/Text/Text.test.tsx +63 -0
  174. package/src/components/Text/Text.tsx +55 -0
  175. package/src/components/Text/TextTypes.tsx +6 -0
  176. package/src/components/Text/__snapshots__/Text.test.tsx.snap +33 -0
  177. package/src/components/TextInput/TextInput.stories.mdx +89 -90
  178. package/src/components/TextInput/TextInput.test.tsx +65 -86
  179. package/src/components/TextInput/TextInput.tsx +101 -95
  180. package/src/components/TextInput/TextInputTypes.tsx +6 -0
  181. package/src/components/VideoPlayer/_VideoPlayer.scss +1 -1
  182. package/src/docs/Chakra.stories.mdx +4 -4
  183. package/src/docs/Intro.stories.mdx +15 -13
  184. package/src/index.ts +20 -0
  185. package/src/styles/01-colors/_colors-brand.scss +6 -0
  186. package/src/styles/01-colors/_colors-utility.scss +14 -12
  187. package/src/styles/base/_04-base.scss +2 -1
  188. package/src/styles/base/_place-holder.scss +1 -1
  189. package/src/styles.scss +10 -12
  190. package/src/theme/components/accordion.ts +30 -0
  191. package/src/theme/components/breadcrumb.ts +77 -0
  192. package/src/theme/components/button.ts +77 -63
  193. package/src/theme/components/checkbox.ts +15 -27
  194. package/src/theme/components/customCheckboxGroup.ts +12 -0
  195. package/src/theme/components/customRadioGroup.ts +4 -10
  196. package/src/theme/components/global.ts +71 -0
  197. package/src/theme/components/globalMixins.ts +16 -0
  198. package/src/theme/components/heading.ts +15 -8
  199. package/src/theme/components/hero.ts +239 -0
  200. package/src/theme/components/icon.ts +79 -0
  201. package/src/theme/components/label.ts +17 -0
  202. package/src/theme/components/link.ts +47 -0
  203. package/src/theme/components/radio.ts +20 -31
  204. package/src/theme/components/searchBar.ts +21 -0
  205. package/src/theme/components/select.ts +50 -0
  206. package/src/theme/components/statusBadge.ts +27 -0
  207. package/src/theme/components/tabs.ts +72 -69
  208. package/src/theme/components/template.ts +114 -0
  209. package/src/theme/components/text.ts +31 -0
  210. package/src/theme/components/textInput.ts +61 -0
  211. package/src/theme/foundations/colors.ts +29 -13
  212. package/src/theme/foundations/global.ts +3 -0
  213. package/src/theme/foundations/shadows.ts +5 -0
  214. package/src/theme/index.ts +37 -7
  215. package/src/utils/componentCategories.ts +8 -2
  216. package/src/utils/utils.ts +13 -0
  217. package/dist/components/Accordion/Accordion.stories.d.ts +0 -6
  218. package/dist/components/StatusBadge/StatusBadge.stories.d.ts +0 -8
  219. package/dist/components/StyleGuide/Colors.stories.d.ts +0 -25
  220. package/dist/components/Template/Template.stories.d.ts +0 -30
  221. package/src/components/Accordion/Accordion.stories.tsx +0 -66
  222. package/src/components/Accordion/_Accordion.scss +0 -81
  223. package/src/components/Breadcrumbs/_Breadcrumbs.scss +0 -97
  224. package/src/components/Form/_Form.scss +0 -67
  225. package/src/components/Hero/_Hero.scss +0 -256
  226. package/src/components/Icons/_Icons.scss +0 -116
  227. package/src/components/Label/_Label.scss +0 -22
  228. package/src/components/Link/_Link.scss +0 -73
  229. package/src/components/SearchBar/_SearchBar.scss +0 -16
  230. package/src/components/Select/_Select.scss +0 -82
  231. package/src/components/StatusBadge/StatusBadge.stories.tsx +0 -34
  232. package/src/components/StatusBadge/_StatusBadge.scss +0 -23
  233. package/src/components/StyleGuide/Colors.stories.tsx +0 -289
  234. package/src/components/Template/Template.stories.tsx +0 -86
  235. package/src/components/Template/_Template.scss +0 -63
  236. 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
- Preview,
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.24.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 information. For optimal accessibility, the `labelText` property is a required prop, regardless of the label visibility. Additionally, while the `id` prop is optional, a unique `id` attribute is necessary for accessibility. If the prop is left blank, a value will be generated for you.
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
- <Preview withToolbar>
51
+ <Canvas withToolbar>
45
52
  <Story
46
53
  name="TextInput"
47
54
  args={{
55
+ helperText: "Choose wisely.",
48
56
  id: "myTextInput",
49
- type: TextInputTypes.text,
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
- helperText: "Choose wisely.",
54
- invalidText: "Waaaaaaaa!",
55
- errored: false,
56
- required: true,
63
+ showLabel: true,
57
64
  showOptReqLabel: true,
58
- disabled: false,
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
- </Preview>
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
- <Preview withToolbar>
81
- <Story
82
- name="Labelling Variations"
83
- args={{
84
- labelText: "What is your favorite color?",
85
- showLabel: false,
86
- }}
87
- >
88
- {(args) => <TextInput {...args} />}
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
- <Canvas>
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
- <TextInput
114
- labelText="What is your favorite color?"
115
- showLabel={false}
116
- placeholder="i.e. blue, green, etc."
117
- helperText="Choose wisely!"
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
- <Canvas>
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
- <TextInput
142
- labelText="What is your favorite color?"
143
- showLabel={true}
144
- placeholder="i.e. blue, green, etc."
145
- invalidText="Waaaaaa!"
146
- errored={true}
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
- <Preview withToolbar>
149
+ <Canvas withToolbar>
156
150
  <Story
157
151
  name="Textarea"
158
152
  args={{
159
- type: TextInputTypes.textarea,
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
- helperText: "Let it all out.",
160
+ showLabel: true,
161
+ showOptReqLabel: true,
162
+ type: TextInputTypes.textarea,
164
163
  }}
165
164
  >
166
165
  {(args) => <TextInput {...args} />}
167
166
  </Story>
168
- </Preview>
167
+ </Canvas>
@@ -1,23 +1,33 @@
1
1
  import * as React from "react";
2
- import { fireEvent, render, screen } from "@testing-library/react";
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
- id="myTextInput"
16
- labelText="Custom Input Label"
17
- required={true}
14
+ labelText="Custom input label"
15
+ isRequired
18
16
  placeholder="Input Placeholder"
19
17
  type={TextInputTypes.text}
20
- attributes={{ onFocus: jest.fn() }}
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
- required={true}
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("Renders an input element", () => {
59
+ it("renders an input element", () => {
50
60
  expect(screen.getByLabelText(/Custom Input Label/i)).toBeInTheDocument();
51
61
  });
52
62
 
53
- it("Renders label with label text", () => {
63
+ it("renders label with label text", () => {
54
64
  expect(screen.getByText("Custom Input Label")).toBeInTheDocument();
55
65
  });
56
66
 
57
- it("Renders 'Required' along with the label text", () => {
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("Renders 'Optional' along with the label text", () => {
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
- required={false}
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("Does not render 'Required' along with the label text", () => {
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
- required={true}
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("Renders label's `for` attribute pointing at ID from input", () => {
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("Renders placeholder text", () => {
114
+ it("renders placeholder text", () => {
105
115
  expect(
106
116
  screen.getByPlaceholderText("Input Placeholder")
107
117
  ).toBeInTheDocument();
108
118
  });
109
119
 
110
- it("Adds aria-required prop if input is required", () => {
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("Allows user to pass in additional attributes", () => {
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("Changing the value calls the onChange handler", () => {
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
- required={true}
150
+ isRequired
141
151
  placeholder="Input Placeholder"
142
152
  type={TextInputTypes.text}
143
153
  />
144
154
  );
145
155
  });
146
156
 
147
- it("Renders Input component", () => {
157
+ it("renders Input component", () => {
148
158
  expect(screen.getByLabelText(/Custom Input Label/i)).toBeInTheDocument();
149
159
  });
150
160
 
151
- it("Calls a UUID generation method if no ID is passed as a prop", () => {
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("Does not renders Label component", () => {
166
+ it("does not renders Label component", () => {
157
167
  expect(screen.queryByText(/Custom Input Label/i)).not.toBeInTheDocument();
158
168
  });
159
169
 
160
- it("Renders custom aria-label", () => {
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("Renders HelperErrorText component", () => {
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
- errored={true}
191
+ isInvalid={true}
189
192
  type={TextInputTypes.text}
190
193
  />
191
194
  );
192
195
  });
193
196
 
194
- it("Renders Input component", () => {
197
+ it("renders Input component", () => {
195
198
  expect(screen.getByLabelText(/Custom Input Label/i)).toBeInTheDocument();
196
199
  });
197
200
 
198
- it("Renders Label component", () => {
201
+ it("renders Label component", () => {
199
202
  expect(screen.getByText(/Custom Input Label/i)).toBeInTheDocument();
200
203
  });
201
204
 
202
- it("Renders HelperErrorText component", () => {
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("Input shows error state", () => {
210
+ it("input shows error state", () => {
208
211
  expect(screen.getByLabelText(/Custom Input Label/i)).toHaveAttribute(
209
- "class",
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("Has a maxlength for the input element", () => {
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("Has a tabIndex", () => {
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("Calls the onChange function", () => {
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("Calls the onBlur function", () => {
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("Renders a hidden type input", () => {
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("Renders a textarea element", () => {
343
+ it("renders a textarea element", () => {
365
344
  expect(screen.getByRole("textbox")).toBeInTheDocument();
366
345
  });
367
346
 
368
- it("Renders label with label text", () => {
347
+ it("renders label with label text", () => {
369
348
  expect(screen.getByLabelText(/Custom textarea Label/i)).toBeInTheDocument();
370
349
  });
371
350
  });