@nypl/design-system-react-components 0.23.4 → 0.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. package/CHANGELOG.md +98 -1
  2. package/README.md +46 -11
  3. package/dist/components/Accordion/Accordion.d.ts +14 -14
  4. package/dist/components/Autosuggest/Autosuggest.stories.d.ts +1 -0
  5. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +11 -14
  6. package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +6 -0
  7. package/dist/components/Button/Button.d.ts +6 -13
  8. package/dist/components/Button/ButtonTypes.d.ts +5 -3
  9. package/dist/components/Card/Card.d.ts +59 -10
  10. package/dist/components/Card/CardTypes.d.ts +19 -0
  11. package/dist/components/CardEdition/CardEdition.d.ts +21 -0
  12. package/dist/components/{StyleGuide/Colors.stories.d.ts → CardEdition/CardEdition.stories.d.ts} +5 -2
  13. package/dist/components/Checkbox/Checkbox.d.ts +21 -16
  14. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +43 -0
  15. package/dist/components/CheckboxGroup/CheckboxGroupLayoutTypes.d.ts +4 -0
  16. package/dist/components/DatePicker/DatePicker.d.ts +79 -0
  17. package/dist/components/DatePicker/DatePickerTypes.d.ts +5 -0
  18. package/dist/components/Form/Form.d.ts +16 -8
  19. package/dist/components/Form/FormTypes.d.ts +2 -0
  20. package/dist/components/Grid/GridTypes.d.ts +9 -0
  21. package/dist/components/Grid/SimpleGrid.d.ts +14 -0
  22. package/dist/components/Heading/Heading.d.ts +9 -11
  23. package/dist/components/Heading/{HeadingDisplaySizes.d.ts → HeadingTypes.d.ts} +8 -0
  24. package/dist/components/HelperErrorText/HelperErrorText.stories.d.ts +2 -1
  25. package/dist/components/Hero/Hero.d.ts +19 -14
  26. package/dist/components/Hero/HeroTypes.d.ts +10 -5
  27. package/dist/components/Icons/Icon.d.ts +13 -16
  28. package/dist/components/Icons/IconSvgs.d.ts +4 -0
  29. package/dist/components/Icons/IconTypes.d.ts +78 -60
  30. package/dist/components/Image/Image.stories.d.ts +2 -1
  31. package/dist/components/Label/Label.d.ts +10 -26
  32. package/dist/components/Link/Link.d.ts +8 -12
  33. package/dist/components/List/List.stories.d.ts +1 -0
  34. package/dist/components/Radio/Radio.d.ts +30 -24
  35. package/dist/components/RadioGroup/RadioGroup.d.ts +40 -0
  36. package/dist/components/RadioGroup/RadioGroupLayoutTypes.d.ts +4 -0
  37. package/dist/components/SearchBar/SearchBar.d.ts +45 -27
  38. package/dist/components/Select/Select.d.ts +34 -35
  39. package/dist/components/Select/SelectTypes.d.ts +4 -0
  40. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +1 -1
  41. package/dist/components/SkeletonLoader/SkeletonLoaderTypes.d.ts +2 -2
  42. package/dist/components/StatusBadge/StatusBadge.d.ts +8 -6
  43. package/dist/components/StatusBadge/StatusBadgeTypes.d.ts +5 -0
  44. package/dist/components/Tabs/Tabs.d.ts +25 -0
  45. package/dist/components/Template/Template.d.ts +91 -0
  46. package/dist/components/Text/Text.d.ts +16 -0
  47. package/dist/components/Text/TextTypes.d.ts +6 -0
  48. package/dist/components/TextInput/TextInput.d.ts +37 -30
  49. package/dist/components/TextInput/TextInputTypes.d.ts +5 -0
  50. package/dist/design-system-react-components.cjs.development.js +4102 -917
  51. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  52. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  53. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  54. package/dist/design-system-react-components.esm.js +4023 -920
  55. package/dist/design-system-react-components.esm.js.map +1 -1
  56. package/dist/index.d.ts +23 -5
  57. package/dist/resources.scss +133 -24
  58. package/dist/styles.css +1 -1
  59. package/dist/theme/components/accordion.d.ts +25 -0
  60. package/dist/theme/components/breadcrumb.d.ts +90 -0
  61. package/dist/theme/components/button.d.ts +109 -0
  62. package/dist/theme/components/checkbox.d.ts +91 -0
  63. package/dist/theme/components/customCheckboxGroup.d.ts +18 -0
  64. package/dist/theme/components/customRadioGroup.d.ts +18 -0
  65. package/dist/theme/components/global.d.ts +55 -0
  66. package/dist/theme/components/globalMixins.d.ts +15 -0
  67. package/dist/theme/components/heading.d.ts +110 -0
  68. package/dist/theme/components/hero.d.ts +492 -0
  69. package/dist/theme/components/icon.d.ts +13 -0
  70. package/dist/theme/components/label.d.ts +16 -0
  71. package/dist/theme/components/link.d.ts +45 -0
  72. package/dist/theme/components/radio.d.ts +95 -0
  73. package/dist/theme/components/searchBar.d.ts +20 -0
  74. package/dist/theme/components/select.d.ts +58 -0
  75. package/dist/theme/components/statusBadge.d.ts +25 -0
  76. package/dist/theme/components/tabs.d.ts +85 -0
  77. package/dist/theme/components/template.d.ts +105 -0
  78. package/dist/theme/components/text.d.ts +20 -0
  79. package/dist/theme/components/textInput.d.ts +105 -0
  80. package/dist/theme/foundations/breakpoints.d.ts +23 -0
  81. package/dist/theme/foundations/colors.d.ts +3 -0
  82. package/dist/theme/foundations/global.d.ts +23 -0
  83. package/dist/theme/foundations/shadows.d.ts +4 -0
  84. package/dist/theme/foundations/spacing.d.ts +77 -0
  85. package/dist/theme/foundations/typography.d.ts +8 -0
  86. package/dist/theme/index.d.ts +20 -0
  87. package/dist/theme/provider.d.ts +5 -0
  88. package/dist/theme/types.d.ts +1 -0
  89. package/dist/utils/utils.d.ts +6 -0
  90. package/package.json +9 -2
  91. package/src/components/Accordion/Accordion.stories.mdx +233 -33
  92. package/src/components/Accordion/Accordion.test.tsx +135 -19
  93. package/src/components/Accordion/Accordion.tsx +81 -56
  94. package/src/components/Autosuggest/Autosuggest.stories.mdx +4 -3
  95. package/src/components/Autosuggest/Autosuggest.stories.tsx +1 -1
  96. package/src/components/Autosuggest/_Autosuggest.scss +2 -2
  97. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +57 -56
  98. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +31 -25
  99. package/src/components/Breadcrumbs/Breadcrumbs.tsx +71 -73
  100. package/src/components/Breadcrumbs/BreadcrumbsTypes.tsx +6 -0
  101. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +100 -0
  102. package/src/components/Button/Button.stories.mdx +125 -138
  103. package/src/components/Button/Button.test.tsx +65 -11
  104. package/src/components/Button/Button.tsx +72 -68
  105. package/src/components/Button/ButtonTypes.tsx +4 -2
  106. package/src/components/Button/_Button.scss +7 -92
  107. package/src/components/Button/__snapshots__/Button.test.tsx.snap +58 -3
  108. package/src/components/Card/Card.stories.mdx +694 -0
  109. package/src/components/Card/Card.test.tsx +97 -102
  110. package/src/components/Card/Card.tsx +182 -31
  111. package/src/components/Card/CardTypes.tsx +21 -0
  112. package/src/components/Card/_Card.scss +234 -49
  113. package/src/components/{Card/Card.stories.tsx → CardEdition/CardEdition.stories.tsx} +32 -22
  114. package/src/components/CardEdition/CardEdition.test.tsx +395 -0
  115. package/src/components/CardEdition/CardEdition.tsx +60 -0
  116. package/src/components/CardEdition/_CardEdition.scss +138 -0
  117. package/src/components/Chakra/Box.stories.mdx +57 -0
  118. package/src/components/Chakra/Center.stories.mdx +99 -0
  119. package/src/components/Chakra/Grid.stories.mdx +79 -0
  120. package/src/components/Chakra/Stack.stories.mdx +93 -0
  121. package/src/components/Checkbox/Checkbox.stories.mdx +57 -35
  122. package/src/components/Checkbox/Checkbox.test.tsx +117 -147
  123. package/src/components/Checkbox/Checkbox.tsx +76 -50
  124. package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +325 -0
  125. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +249 -0
  126. package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +345 -0
  127. package/src/components/CheckboxGroup/CheckboxGroup.tsx +148 -0
  128. package/src/components/CheckboxGroup/CheckboxGroupLayoutTypes.tsx +4 -0
  129. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +1360 -0
  130. package/src/components/DatePicker/DatePicker.stories.mdx +284 -0
  131. package/src/components/DatePicker/DatePicker.test.tsx +657 -0
  132. package/src/components/DatePicker/DatePicker.tsx +396 -0
  133. package/src/components/DatePicker/DatePickerTypes.tsx +5 -0
  134. package/src/components/DatePicker/_DatePicker.scss +76 -0
  135. package/src/components/Form/Form.stories.mdx +130 -27
  136. package/src/components/Form/Form.test.tsx +78 -36
  137. package/src/components/Form/Form.tsx +53 -19
  138. package/src/components/Form/FormTypes.tsx +3 -0
  139. package/src/components/Form/__snapshots__/Form.test.tsx.snap +38 -0
  140. package/src/components/Grid/GridTypes.tsx +9 -0
  141. package/src/components/Grid/SimpleGrid.stories.mdx +275 -0
  142. package/src/components/Grid/SimpleGrid.test.tsx +66 -0
  143. package/src/components/Grid/SimpleGrid.tsx +37 -0
  144. package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +8 -0
  145. package/src/components/Heading/Heading.stories.mdx +63 -33
  146. package/src/components/Heading/Heading.test.tsx +24 -16
  147. package/src/components/Heading/Heading.tsx +54 -38
  148. package/src/components/Heading/{HeadingDisplaySizes.tsx → HeadingTypes.tsx} +9 -0
  149. package/src/components/HelperErrorText/HelperErrorText.stories.tsx +2 -1
  150. package/src/components/HelperErrorText/_HelperErrorText.scss +1 -1
  151. package/src/components/Hero/Hero.stories.mdx +195 -85
  152. package/src/components/Hero/Hero.test.tsx +544 -113
  153. package/src/components/Hero/Hero.tsx +80 -93
  154. package/src/components/Hero/HeroTypes.tsx +17 -5
  155. package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +307 -0
  156. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +6 -1
  157. package/src/components/HorizontalRule/_HorizontalRule.scss +1 -1
  158. package/src/components/Icons/Icon.stories.mdx +89 -74
  159. package/src/components/Icons/Icon.test.tsx +30 -22
  160. package/src/components/Icons/Icon.tsx +63 -61
  161. package/src/components/Icons/IconSvgs.tsx +8 -0
  162. package/src/components/Icons/IconTypes.tsx +80 -60
  163. package/src/components/Image/Image.stories.tsx +2 -1
  164. package/src/components/Input/_Input.scss +2 -2
  165. package/src/components/Label/Label.stories.mdx +77 -0
  166. package/src/components/Label/Label.test.tsx +43 -12
  167. package/src/components/Label/Label.tsx +28 -45
  168. package/src/components/Label/__snapshots__/Label.test.tsx.snap +41 -0
  169. package/src/components/Link/Link.stories.mdx +47 -41
  170. package/src/components/Link/Link.test.tsx +33 -44
  171. package/src/components/Link/Link.tsx +114 -100
  172. package/src/components/List/List.stories.mdx +7 -3
  173. package/src/components/List/List.stories.tsx +14 -9
  174. package/src/components/List/List.test.tsx +12 -8
  175. package/src/components/List/List.tsx +9 -7
  176. package/src/components/List/_List.scss +3 -3
  177. package/src/components/Modal/Modal.stories.mdx +7 -3
  178. package/src/components/Modal/_Modal.scss +1 -1
  179. package/src/components/Notification/Notification.stories.mdx +99 -65
  180. package/src/components/Notification/Notification.test.tsx +3 -16
  181. package/src/components/Notification/Notification.tsx +12 -12
  182. package/src/components/Notification/_Notification.scss +5 -4
  183. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +1 -1
  184. package/src/components/Pagination/Pagination.stories.mdx +7 -1
  185. package/src/components/Pagination/Pagination.test.tsx +16 -10
  186. package/src/components/Radio/Radio.stories.mdx +57 -46
  187. package/src/components/Radio/Radio.test.tsx +92 -138
  188. package/src/components/Radio/Radio.tsx +70 -69
  189. package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +250 -0
  190. package/src/components/RadioGroup/RadioGroup.stories.mdx +247 -0
  191. package/src/components/RadioGroup/RadioGroup.test.tsx +327 -0
  192. package/src/components/RadioGroup/RadioGroup.tsx +154 -0
  193. package/src/components/RadioGroup/RadioGroupLayoutTypes.tsx +4 -0
  194. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +1101 -0
  195. package/src/components/SearchBar/SearchBar.Test.tsx +151 -16
  196. package/src/components/SearchBar/SearchBar.stories.mdx +196 -224
  197. package/src/components/SearchBar/SearchBar.tsx +151 -46
  198. package/src/components/Select/Select.stories.mdx +193 -168
  199. package/src/components/Select/Select.test.tsx +129 -324
  200. package/src/components/Select/Select.tsx +120 -160
  201. package/src/components/Select/SelectTypes.tsx +4 -0
  202. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +18 -29
  203. package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +7 -7
  204. package/src/components/SkeletonLoader/SkeletonLoader.tsx +4 -2
  205. package/src/components/SkeletonLoader/SkeletonLoaderTypes.tsx +2 -2
  206. package/src/components/SkeletonLoader/_SkeletonLoader.scss +3 -3
  207. package/src/components/StatusBadge/StatusBadge.stories.mdx +91 -0
  208. package/src/components/StatusBadge/StatusBadge.test.tsx +35 -7
  209. package/src/components/StatusBadge/StatusBadge.tsx +24 -25
  210. package/src/components/StatusBadge/StatusBadgeTypes.tsx +5 -0
  211. package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +28 -0
  212. package/src/components/StyleGuide/Bidirectionality.stories.mdx +112 -90
  213. package/src/components/StyleGuide/Buttons.stories.mdx +98 -100
  214. package/src/components/StyleGuide/Colors.stories.mdx +336 -0
  215. package/src/components/StyleGuide/Forms.stories.mdx +85 -0
  216. package/src/components/StyleGuide/Iconography.stories.mdx +86 -93
  217. package/src/components/StyleGuide/Spacing.stories.mdx +0 -1
  218. package/src/components/StyleGuide/Typography.stories.mdx +164 -166
  219. package/src/components/StyleGuide/UIDocCard.tsx +4 -4
  220. package/src/components/Tabs/Tabs.stories.mdx +221 -0
  221. package/src/components/Tabs/Tabs.test.tsx +264 -0
  222. package/src/components/Tabs/Tabs.tsx +220 -0
  223. package/src/components/Template/Template.stories.mdx +574 -0
  224. package/src/components/Template/Template.test.tsx +124 -0
  225. package/src/components/Template/Template.tsx +226 -0
  226. package/src/components/Text/Text.stories.mdx +70 -0
  227. package/src/components/Text/Text.test.tsx +63 -0
  228. package/src/components/Text/Text.tsx +55 -0
  229. package/src/components/Text/TextTypes.tsx +6 -0
  230. package/src/components/Text/__snapshots__/Text.test.tsx.snap +33 -0
  231. package/src/components/TextInput/TextInput.stories.mdx +90 -90
  232. package/src/components/TextInput/TextInput.test.tsx +103 -83
  233. package/src/components/TextInput/TextInput.tsx +108 -91
  234. package/src/components/TextInput/TextInputTypes.tsx +6 -0
  235. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +2 -1
  236. package/src/components/VideoPlayer/VideoPlayer.tsx +4 -2
  237. package/src/components/VideoPlayer/_VideoPlayer.scss +1 -1
  238. package/src/docs/Chakra.stories.mdx +341 -0
  239. package/src/docs/Intro.stories.mdx +31 -24
  240. package/src/index.ts +70 -5
  241. package/src/styles/01-colors/_colors-brand.scss +6 -4
  242. package/src/styles/01-colors/_colors-utility.scss +14 -15
  243. package/src/styles/03-space/_space-inline.scss +47 -7
  244. package/src/styles/03-space/_space-inset.scss +33 -5
  245. package/src/styles/03-space/_space-stack.scss +48 -8
  246. package/src/styles/base/_02-breakpoints.scss +5 -4
  247. package/src/styles/base/_04-base.scss +2 -1
  248. package/src/styles/base/_place-holder.scss +1 -1
  249. package/src/styles/base/_typography.scss +1 -29
  250. package/src/styles.scss +22 -25
  251. package/src/theme/components/accordion.ts +30 -0
  252. package/src/theme/components/breadcrumb.ts +77 -0
  253. package/src/theme/components/button.ts +125 -0
  254. package/src/theme/components/checkbox.ts +107 -0
  255. package/src/theme/components/customCheckboxGroup.ts +12 -0
  256. package/src/theme/components/customRadioGroup.ts +12 -0
  257. package/src/theme/components/global.ts +71 -0
  258. package/src/theme/components/globalMixins.ts +16 -0
  259. package/src/theme/components/heading.ts +72 -0
  260. package/src/theme/components/hero.ts +239 -0
  261. package/src/theme/components/icon.ts +79 -0
  262. package/src/theme/components/label.ts +17 -0
  263. package/src/theme/components/link.ts +47 -0
  264. package/src/theme/components/radio.ts +106 -0
  265. package/src/theme/components/searchBar.ts +21 -0
  266. package/src/theme/components/select.ts +50 -0
  267. package/src/theme/components/statusBadge.ts +27 -0
  268. package/src/theme/components/tabs.ts +79 -0
  269. package/src/theme/components/template.ts +114 -0
  270. package/src/theme/components/text.ts +31 -0
  271. package/src/theme/components/textInput.ts +61 -0
  272. package/src/theme/foundations/breakpoints.ts +24 -0
  273. package/src/theme/foundations/colors.ts +208 -0
  274. package/src/theme/foundations/global.ts +26 -0
  275. package/src/theme/foundations/shadows.ts +5 -0
  276. package/src/theme/foundations/spacing.ts +85 -0
  277. package/src/theme/foundations/typography.ts +35 -0
  278. package/src/theme/index.ts +88 -0
  279. package/src/theme/provider.tsx +9 -0
  280. package/src/theme/types.ts +1 -0
  281. package/src/utils/componentCategories.ts +56 -21
  282. package/src/utils/utils.ts +13 -0
  283. package/dist/components/Accordion/Accordion.stories.d.ts +0 -5
  284. package/dist/components/Card/Card.stories.d.ts +0 -27
  285. package/dist/components/Label/Label.stories.d.ts +0 -12
  286. package/dist/components/StatusBadge/StatusBadge.stories.d.ts +0 -8
  287. package/dist/components/Template/Template.stories.d.ts +0 -29
  288. package/src/components/Accordion/Accordion.stories.tsx +0 -65
  289. package/src/components/Accordion/_Accordion.scss +0 -81
  290. package/src/components/Breadcrumbs/_Breadcrumbs.scss +0 -97
  291. package/src/components/Checkbox/_Checkbox.scss +0 -97
  292. package/src/components/Form/_Form.scss +0 -28
  293. package/src/components/Heading/_Heading.scss +0 -163
  294. package/src/components/Hero/_Hero.scss +0 -256
  295. package/src/components/Icons/_Icons.scss +0 -116
  296. package/src/components/Label/Label.stories.tsx +0 -30
  297. package/src/components/Label/_Label.scss +0 -22
  298. package/src/components/Link/_Link.scss +0 -73
  299. package/src/components/Radio/_Radio.scss +0 -84
  300. package/src/components/SearchBar/_SearchBar.scss +0 -16
  301. package/src/components/Select/_Select.scss +0 -82
  302. package/src/components/StatusBadge/StatusBadge.stories.tsx +0 -33
  303. package/src/components/StatusBadge/_StatusBadge.scss +0 -23
  304. package/src/components/StyleGuide/Colors.stories.tsx +0 -288
  305. package/src/components/Template/Template.stories.tsx +0 -85
  306. package/src/components/Template/_Template.scss +0 -63
  307. 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,133 +38,130 @@ import { getCategory } from "../../utils/componentCategories";
35
38
  | Component Version | DS Version |
36
39
  | ----------------- | ---------- |
37
40
  | Added | `0.22.0` |
38
- | Latest | `0.23.2` |
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
- errorText: "Waaaaaaaa!",
55
- errored: false,
56
- required: true,
57
- disabled: false,
58
- attributes: {
59
- onFocus: action("focus"),
60
- onBlur: action("blur"),
61
- onChange: action("onChange"),
62
- maxLength: 10,
63
- tabIndex: 0,
64
- autoFocus: true,
65
- pattern: "[a-z0-9]",
66
- },
63
+ showLabel: true,
64
+ showOptReqLabel: true,
65
+ type: TextInputTypes.text,
67
66
  }}
68
67
  >
69
68
  {(args) => <TextInput {...args} />}
70
69
  </Story>
71
- </Preview>
70
+ </Canvas>
72
71
 
73
72
  <ArgsTable story="TextInput" />
74
73
 
75
74
  ## Labelling Variations
76
75
 
77
- A TextInput can be rendered with or without visible labels.
78
-
79
- <Preview withToolbar>
80
- <Story
81
- name="Labelling Variations"
82
- args={{
83
- labelText: "What is your favorite color?",
84
- showLabel: false,
85
- }}
86
- >
87
- {(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>
88
113
  </Story>
89
- </Preview>
90
-
91
- <Canvas>
92
- <TextInput labelText="What is your favorite color?" showLabel={true} />
93
114
  </Canvas>
94
115
 
95
- <Canvas>
96
- <TextInput
97
- labelText="What is your favorite color?"
98
- showLabel={false}
99
- placeholder="i.e. blue, green, etc."
100
- />
101
- </Canvas>
116
+ ### Errored
102
117
 
103
118
  <Canvas>
104
- <TextInput
105
- labelText="What is your favorite color?"
106
- showLabel={true}
107
- placeholder="i.e. blue, green, etc."
108
- />
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>
109
128
  </Canvas>
110
129
 
111
- <Canvas>
112
- <TextInput
113
- labelText="What is your favorite color?"
114
- showLabel={false}
115
- placeholder="i.e. blue, green, etc."
116
- helperText="Choose wisely!"
117
- />
118
- </Canvas>
130
+ ### Disabled
119
131
 
120
132
  <Canvas>
121
- <TextInput
122
- labelText="What is your favorite color?"
123
- showLabel={true}
124
- placeholder="i.e. blue, green, etc."
125
- helperText="Choose wisely!"
126
- />
127
- </Canvas>
128
-
129
- <Canvas>
130
- <TextInput
131
- labelText="What is your favorite color?"
132
- showLabel={false}
133
- placeholder="i.e. blue, green, etc."
134
- errorText="Waaaaaa!"
135
- errored={true}
136
- />
137
- </Canvas>
138
-
139
- <Canvas>
140
- <TextInput
141
- labelText="What is your favorite color?"
142
- showLabel={true}
143
- placeholder="i.e. blue, green, etc."
144
- errorText="Waaaaaa!"
145
- errored={true}
146
- />
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>
147
141
  </Canvas>
148
142
 
149
143
  ## Textarea
150
144
 
151
145
  The TextInput component includes a multiline `textarea` form field. To render a
152
- `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.
153
148
 
154
- <Preview withToolbar>
149
+ <Canvas withToolbar>
155
150
  <Story
156
151
  name="Textarea"
157
152
  args={{
158
- type: TextInputTypes.textarea,
153
+ helperText: "Let it all out.",
154
+ invalidText: "This is error text :(",
155
+ isDisabled: false,
156
+ isInvalid: false,
157
+ isRequired: true,
159
158
  labelText: "In less than 500 words, describe your favorite color?",
160
- showLabel: true,
161
159
  placeholder: "Essay question...",
162
- helperText: "Let it all out.",
160
+ showLabel: true,
161
+ showOptReqLabel: true,
162
+ type: TextInputTypes.textarea,
163
163
  }}
164
164
  >
165
165
  {(args) => <TextInput {...args} />}
166
166
  </Story>
167
- </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
  );
@@ -26,17 +36,18 @@ describe("TextInput Accessibility", () => {
26
36
  });
27
37
 
28
38
  describe("TextInput", () => {
39
+ let utils;
29
40
  let changeHandler;
30
41
  let focusHandler;
31
42
 
32
43
  beforeEach(() => {
33
44
  focusHandler = jest.fn();
34
45
  changeHandler = jest.fn();
35
- render(
46
+ utils = render(
36
47
  <TextInput
37
48
  id="myTextInput"
38
49
  labelText="Custom Input Label"
39
- required={true}
50
+ isRequired
40
51
  placeholder="Input Placeholder"
41
52
  type={TextInputTypes.text}
42
53
  attributes={{ onFocus: focusHandler }}
@@ -45,40 +56,80 @@ describe("TextInput", () => {
45
56
  );
46
57
  });
47
58
 
48
- it("Renders an input element", () => {
59
+ it("renders an input element", () => {
49
60
  expect(screen.getByLabelText(/Custom Input Label/i)).toBeInTheDocument();
50
61
  });
51
62
 
52
- it("Renders label with label text", () => {
63
+ it("renders label with label text", () => {
64
+ expect(screen.getByText("Custom Input Label")).toBeInTheDocument();
65
+ });
66
+
67
+ it("renders 'Required' along with the label text", () => {
68
+ expect(screen.getByText("Custom Input Label")).toBeInTheDocument();
69
+ expect(screen.getByText(/Required/i)).toBeInTheDocument();
70
+ });
71
+
72
+ it("renders 'Optional' along with the label text", () => {
73
+ utils.rerender(
74
+ <TextInput
75
+ id="myTextInput"
76
+ labelText="Custom Input Label"
77
+ isRequired={false}
78
+ placeholder="Input Placeholder"
79
+ type={TextInputTypes.text}
80
+ attributes={{ onFocus: focusHandler }}
81
+ onChange={changeHandler}
82
+ />
83
+ );
84
+
53
85
  expect(screen.getByText("Custom Input Label")).toBeInTheDocument();
86
+ expect(screen.getByText(/Optional/i)).toBeInTheDocument();
54
87
  });
55
88
 
56
- it("Renders label's `for` attribute pointing at ID from input", () => {
89
+ it("does not render 'Required' along with the label text", () => {
90
+ utils.rerender(
91
+ <TextInput
92
+ id="myTextInput"
93
+ labelText="Custom Input Label"
94
+ isRequired
95
+ showOptReqLabel={false}
96
+ placeholder="Input Placeholder"
97
+ type={TextInputTypes.text}
98
+ attributes={{ onFocus: focusHandler }}
99
+ onChange={changeHandler}
100
+ />
101
+ );
102
+
103
+ expect(screen.getByText("Custom Input Label")).toBeInTheDocument();
104
+ expect(screen.queryByText(/Required/i)).not.toBeInTheDocument();
105
+ });
106
+
107
+ it("renders label's `for` attribute pointing at ID from input", () => {
57
108
  expect(screen.getByText(/Custom Input Label/i)).toHaveAttribute(
58
109
  "for",
59
110
  "myTextInput"
60
111
  );
61
112
  });
62
113
 
63
- it("Renders placeholder text", () => {
114
+ it("renders placeholder text", () => {
64
115
  expect(
65
116
  screen.getByPlaceholderText("Input Placeholder")
66
117
  ).toBeInTheDocument();
67
118
  });
68
119
 
69
- it("Adds aria-required prop if input is required", () => {
120
+ it("adds aria-required prop if input is required", () => {
70
121
  expect(screen.getByLabelText(/Custom Input Label/i)).toHaveAttribute(
71
122
  "aria-required"
72
123
  );
73
124
  });
74
125
 
75
- it("Allows user to pass in additional attributes", () => {
126
+ it("allows user to pass in additional attributes", () => {
76
127
  expect(focusHandler).toHaveBeenCalledTimes(0);
77
128
  fireEvent.focus(screen.getByLabelText(/Custom Input Label/i));
78
129
  expect(focusHandler).toHaveBeenCalledTimes(1);
79
130
  });
80
131
 
81
- it("Changing the value calls the onChange handler", () => {
132
+ it("changing the value calls the onChange handler", () => {
82
133
  expect(changeHandler).toHaveBeenCalledTimes(0);
83
134
  userEvent.type(screen.getByLabelText(/Custom Input Label/i), "Hello");
84
135
  // Called 5 times because "Hello" has length of 5.
@@ -96,43 +147,36 @@ describe("Renders TextInput with auto-generated ID, hidden label and visible hel
96
147
  labelText="Custom Input Label"
97
148
  showLabel={false}
98
149
  helperText="Custom Helper Text"
99
- required={true}
150
+ isRequired
100
151
  placeholder="Input Placeholder"
101
152
  type={TextInputTypes.text}
102
153
  />
103
154
  );
104
155
  });
105
156
 
106
- it("Renders Input component", () => {
157
+ it("renders Input component", () => {
107
158
  expect(screen.getByLabelText(/Custom Input Label/i)).toBeInTheDocument();
108
159
  });
109
160
 
110
- 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", () => {
111
162
  // Called twice for the `TextInput` and the SVG icon components.
112
163
  expect(generateUUIDSpy).toHaveBeenCalledTimes(2);
113
164
  });
114
165
 
115
- it("Does not renders Label component", () => {
166
+ it("does not renders Label component", () => {
116
167
  expect(screen.queryByText(/Custom Input Label/i)).not.toBeInTheDocument();
117
168
  });
118
169
 
119
- it("Renders custom aria-label", () => {
170
+ it("renders custom aria-label", () => {
120
171
  expect(screen.getByLabelText(/Custom Input Label/i)).toHaveAttribute(
121
172
  "aria-label",
122
- "Custom Input Label"
173
+ "Custom Input Label - Custom Helper Text"
123
174
  );
124
175
  });
125
176
 
126
- it("Renders HelperErrorText component", () => {
177
+ it("renders HelperErrorText component", () => {
127
178
  expect(screen.getByText("Custom Helper Text")).toBeInTheDocument();
128
179
  });
129
-
130
- it("Renders aria-describedby with helper text", () => {
131
- expect(screen.getByLabelText(/Custom Input Label/i)).toHaveAttribute(
132
- "aria-describedby",
133
- "Custom Helper Text"
134
- );
135
- });
136
180
  });
137
181
 
138
182
  describe("TextInput shows error state", () => {
@@ -142,73 +186,34 @@ describe("TextInput shows error state", () => {
142
186
  id="myTextInputError"
143
187
  labelText="Custom Input Label"
144
188
  helperText="Custom Helper Text"
145
- errorText="Custom Error Text"
189
+ invalidText="Custom Error Text"
146
190
  placeholder="Input Placeholder"
147
- errored={true}
191
+ isInvalid={true}
148
192
  type={TextInputTypes.text}
149
193
  />
150
194
  );
151
195
  });
152
196
 
153
- it("Renders Input component", () => {
197
+ it("renders Input component", () => {
154
198
  expect(screen.getByLabelText(/Custom Input Label/i)).toBeInTheDocument();
155
199
  });
156
200
 
157
- it("Renders Label component", () => {
201
+ it("renders Label component", () => {
158
202
  expect(screen.getByText(/Custom Input Label/i)).toBeInTheDocument();
159
203
  });
160
204
 
161
- it("Renders HelperErrorText component", () => {
205
+ it("renders HelperErrorText component", () => {
162
206
  expect(screen.queryByText("Custom Helper Text")).not.toBeInTheDocument();
163
207
  expect(screen.getByText("Custom Error Text")).toBeInTheDocument();
164
208
  });
165
209
 
166
- it("Input shows error state", () => {
210
+ it("input shows error state", () => {
167
211
  expect(screen.getByLabelText(/Custom Input Label/i)).toHaveAttribute(
168
- "class",
169
- "inputfield inputfield--error "
212
+ "aria-invalid"
170
213
  );
171
214
  });
172
215
  });
173
216
 
174
- describe("TextInput Group", () => {
175
- beforeEach(() => {
176
- render(
177
- <fieldset>
178
- <legend>Input Group Label Legend</legend>
179
-
180
- <TextInput
181
- id="input1"
182
- required={true}
183
- type={TextInputTypes.text}
184
- labelText="For"
185
- helperText="Input 1 Helper Text"
186
- />
187
-
188
- <TextInput
189
- id="input2"
190
- required={true}
191
- type={TextInputTypes.text}
192
- labelText="To"
193
- helperText="Input 2 Helper Text"
194
- />
195
-
196
- <HelperErrorText isError={true} id={"sharedHelperText"}>
197
- Additional Error Text
198
- </HelperErrorText>
199
- </fieldset>
200
- );
201
- });
202
-
203
- it("Renders legend", () => {
204
- expect(screen.getByText("Input Group Label Legend")).toBeInTheDocument();
205
- });
206
-
207
- it("Renders two inputs", () => {
208
- expect(screen.getAllByRole("textbox")).toHaveLength(2);
209
- });
210
- });
211
-
212
217
  describe("Renders HTML attributes passed through the `attributes` prop", () => {
213
218
  const onChangeSpy = jest.fn();
214
219
  const onBlurSpy = jest.fn();
@@ -229,27 +234,27 @@ describe("Renders HTML attributes passed through the `attributes` prop", () => {
229
234
  );
230
235
  });
231
236
 
232
- it("Has a maxlength for the input element", () => {
237
+ it("has a maxlength for the input element", () => {
233
238
  expect(screen.getByLabelText(/Input Label/i)).toHaveAttribute(
234
239
  "maxLength",
235
240
  "10"
236
241
  );
237
242
  });
238
243
 
239
- it("Has a tabIndex", () => {
244
+ it("has a tabIndex", () => {
240
245
  expect(screen.getByLabelText(/Input Label/i)).toHaveAttribute(
241
246
  "tabIndex",
242
247
  "0"
243
248
  );
244
249
  });
245
250
 
246
- it("Calls the onChange function", () => {
251
+ it("calls the onChange function", () => {
247
252
  expect(onChangeSpy).toHaveBeenCalledTimes(0);
248
253
  userEvent.type(screen.getByLabelText(/Input Label/i), "Hello");
249
254
  expect(onChangeSpy).toHaveBeenCalledTimes(5);
250
255
  });
251
256
 
252
- it("Calls the onBlur function", () => {
257
+ it("calls the onBlur function", () => {
253
258
  expect(onBlurSpy).toHaveBeenCalledTimes(0);
254
259
  fireEvent.blur(screen.getByLabelText(/Input Label/i));
255
260
  expect(onBlurSpy).toHaveBeenCalledTimes(1);
@@ -288,7 +293,7 @@ describe("Renders HTML attributes passed through the `attributes` prop", () => {
288
293
  // });
289
294
 
290
295
  describe("Hidden input", () => {
291
- it("Renders a hidden type input", () => {
296
+ it("renders a hidden type input", () => {
292
297
  const utils = render(
293
298
  <TextInput
294
299
  id="inputID-hidden"
@@ -306,6 +311,21 @@ describe("Hidden input", () => {
306
311
  "hidden"
307
312
  );
308
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
+ });
309
329
  });
310
330
 
311
331
  describe("Textarea element type", () => {
@@ -320,11 +340,11 @@ describe("Textarea element type", () => {
320
340
  );
321
341
  });
322
342
 
323
- it("Renders a textarea element", () => {
343
+ it("renders a textarea element", () => {
324
344
  expect(screen.getByRole("textbox")).toBeInTheDocument();
325
345
  });
326
346
 
327
- it("Renders label with label text", () => {
347
+ it("renders label with label text", () => {
328
348
  expect(screen.getByLabelText(/Custom textarea Label/i)).toBeInTheDocument();
329
349
  });
330
350
  });