@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
@@ -195,7 +195,7 @@ describe("DatePicker", () => {
195
195
  labelText="Select the date you want to visit NYPL"
196
196
  helperText="Note that the Library may be closed on Sundays."
197
197
  invalidText="Please select a valid date."
198
- errored={true}
198
+ isInvalid={true}
199
199
  />
200
200
  );
201
201
  // When errored, we expect only the error text to appear.
@@ -212,7 +212,7 @@ describe("DatePicker", () => {
212
212
  <DatePicker
213
213
  labelText="Select the date you want to visit NYPL"
214
214
  helperText="Note that the Library may be closed on Sundays."
215
- disabled={true}
215
+ isDisabled={true}
216
216
  />
217
217
  );
218
218
 
@@ -383,7 +383,7 @@ describe("DatePicker", () => {
383
383
  helperText="Note that the Library may be closed on Sundays."
384
384
  helperTextTo="Note for the 'to' field."
385
385
  invalidText="Please select a valid date range."
386
- errored={true}
386
+ isInvalid={true}
387
387
  />
388
388
  );
389
389
 
@@ -398,7 +398,7 @@ describe("DatePicker", () => {
398
398
  helperText="Note that the Library may be closed on Sundays."
399
399
  helperTextTo="Note for the 'to' field."
400
400
  invalidText="Please select a valid date range."
401
- disabled={true}
401
+ isDisabled={true}
402
402
  />
403
403
  );
404
404
 
@@ -86,14 +86,14 @@ export interface DatePickerProps extends DatePickerWrapperProps {
86
86
  maxDate?: string;
87
87
  /** Populates the `HelperErrorText` error state for both "From" and "To" input components. */
88
88
  invalidText?: string;
89
- /** Helper for modifiers array; adds 'errored' styling. */
90
- errored?: boolean;
89
+ /** Helper for modifiers array; adds 'isInvalid' styling. */
90
+ isInvalid?: boolean;
91
91
  /** Adds the 'required' property to the input element(s). */
92
92
  required?: boolean;
93
93
  /** Whether or not to display the "Required"/"Optional" text in the label text. */
94
94
  showOptReqLabel?: boolean;
95
95
  /** Adds the 'disabled' property to the input element(s). */
96
- disabled?: boolean;
96
+ isDisabled?: boolean;
97
97
  /** Modifiers array for use with BEM. See how to work with modifiers and BEM
98
98
  * here: http://getbem.com/introduction/ */
99
99
  modifiers?: string[];
@@ -130,10 +130,10 @@ const CustomTextInput = forwardRef<TextInputRefType, CustomTextInputProps>(
130
130
  onChange,
131
131
  value,
132
132
  labelText,
133
- disabled,
133
+ isDisabled,
134
134
  dsRequired,
135
135
  showOptReqLabel,
136
- errored,
136
+ isInvalid,
137
137
  helperText,
138
138
  invalidText,
139
139
  onClick,
@@ -149,10 +149,10 @@ const CustomTextInput = forwardRef<TextInputRefType, CustomTextInputProps>(
149
149
  onChange={onChange}
150
150
  value={value}
151
151
  labelText={labelText}
152
- disabled={disabled}
153
- required={dsRequired}
152
+ isDisabled={isDisabled}
153
+ isRequired={dsRequired}
154
154
  showOptReqLabel={showOptReqLabel}
155
- errored={errored}
155
+ isInvalid={isInvalid}
156
156
  helperText={helperText}
157
157
  invalidText={invalidText}
158
158
  // Use either the specific prop-based or the forwardRef value.
@@ -220,10 +220,10 @@ const DatePicker = React.forwardRef<TextInputRefType, DatePickerProps>(
220
220
  helperTextFrom,
221
221
  helperTextTo,
222
222
  invalidText,
223
- errored,
223
+ isInvalid,
224
224
  required,
225
225
  showOptReqLabel = true,
226
- disabled,
226
+ isDisabled,
227
227
  nameFrom,
228
228
  nameTo,
229
229
  blockName,
@@ -268,7 +268,7 @@ const DatePicker = React.forwardRef<TextInputRefType, DatePickerProps>(
268
268
  minDate: minDate ? new Date(minDate) : null,
269
269
  maxDate: maxDate ? new Date(maxDate) : null,
270
270
  dateFormat,
271
- disabled,
271
+ isDisabled,
272
272
  };
273
273
  // Both TextInput components share some props.
274
274
  let baseCustomTextInputAttrs = {
@@ -277,8 +277,8 @@ const DatePicker = React.forwardRef<TextInputRefType, DatePickerProps>(
277
277
  // Always display the labels or the input fields when
278
278
  // the DatePicker component is a `dateRange` type.
279
279
  showLabel: dateRange ? true : showLabel,
280
- disabled,
281
- errored,
280
+ isDisabled,
281
+ isInvalid,
282
282
  helperText: dateRange ? helperTextFrom : helperText,
283
283
  invalidText,
284
284
  };
@@ -2,6 +2,7 @@ fieldset {
2
2
  legend {
3
3
  @include space-stack-xs;
4
4
 
5
+ font-size: 14px;
5
6
  font-weight: var(--font-weight-medium);
6
7
  }
7
8
 
@@ -13,7 +13,9 @@ import Form, { FormRow, FormField } from "./Form";
13
13
  import { FormSpacing } from "./FormTypes";
14
14
  import TextInput from "../TextInput/TextInput";
15
15
  import Radio from "../Radio/Radio";
16
+ import RadioGroup from "../RadioGroup/RadioGroup";
16
17
  import Checkbox from "../Checkbox/Checkbox";
18
+ import CheckboxGroup from "../CheckboxGroup/CheckboxGroup";
17
19
  import Label from "../Label/Label";
18
20
  import Button from "../Button/Button";
19
21
  import Select from "../Select/Select";
@@ -22,6 +24,8 @@ import { HeadingLevels } from "../Heading/HeadingTypes";
22
24
  import HorizontalRule from "../HorizontalRule/HorizontalRule";
23
25
  import { action } from "@storybook/addon-actions";
24
26
 
27
+ import SimpleGrid from "../Grid/SimpleGrid";
28
+
25
29
  <Meta
26
30
  title={getCategory("Form")}
27
31
  component={Form}
@@ -41,7 +45,7 @@ import { action } from "@storybook/addon-actions";
41
45
  | Component Version | DS Version |
42
46
  | ----------------- | ---------- |
43
47
  | Added | `0.23.2` |
44
- | Latest | `0.24.1` |
48
+ | Latest | `0.25.1` |
45
49
 
46
50
  <Description of={Form} />
47
51
 
@@ -70,18 +74,34 @@ The `Form` component renders a standard `<form>` element and should be used to h
70
74
  >
71
75
  {(args) => (
72
76
  <Form {...args}>
77
+ <FormRow>
78
+ <FormField>
79
+ <TextInput
80
+ labelText="First Name"
81
+ helperText="Make sure to complete this field."
82
+ isRequired
83
+ />
84
+ </FormField>
85
+ <FormField>
86
+ <TextInput
87
+ labelText="Last Name"
88
+ helperText="Make sure to complete this field."
89
+ isRequired
90
+ />
91
+ </FormField>
92
+ </FormRow>
73
93
  <FormField>
74
94
  <TextInput
75
95
  labelText="Username"
76
96
  helperText="Make sure to complete this field."
77
- required
97
+ isRequired
78
98
  />
79
99
  </FormField>
80
100
  <FormField>
81
101
  <TextInput
82
102
  labelText="Password"
83
103
  helperText="Make sure to complete this field."
84
- required
104
+ isRequired
85
105
  />
86
106
  </FormField>
87
107
  <FormRow>
@@ -109,24 +129,24 @@ The `Form` component renders a standard `<form>` element and should be used to h
109
129
  </FormRow>
110
130
  <FormRow>
111
131
  <FormField>
112
- <Label>Checkbox Group</Label>
113
- <Checkbox labelText="Checkbox 1" showLabel />
114
- <br />
115
- <Checkbox labelText="Checkbox 1" showLabel />
116
- <br />
117
- <Checkbox labelText="Checkbox 1" showLabel />
118
- <br />
119
- <Checkbox labelText="Checkbox 1" showLabel />
132
+ <CheckboxGroup
133
+ labelText="Checkbox Group"
134
+ name="cbg1"
135
+ optReqFlag={false}
136
+ >
137
+ <Checkbox labelText="Checkbox 1" showLabel />
138
+ <Checkbox labelText="Checkbox 2" showLabel />
139
+ <Checkbox labelText="Checkbox 3" showLabel />
140
+ <Checkbox labelText="Checkbox 4" showLabel />
141
+ </CheckboxGroup>
120
142
  </FormField>
121
143
  <FormField>
122
- <Label>Radio Group</Label>
123
- <Radio labelText="Radio 1" showLabel />
124
- <br />
125
- <Radio labelText="Radio 2" showLabel />
126
- <br />
127
- <Radio labelText="Radio 3" showLabel />
128
- <br />
129
- <Radio labelText="Radio 4" showLabel />
144
+ <RadioGroup labelText="Radio Group" name="rg1" optReqFlag={false}>
145
+ <Radio labelText="Radio 1" showLabel />
146
+ <Radio labelText="Radio 2" showLabel />
147
+ <Radio labelText="Radio 3" showLabel />
148
+ <Radio labelText="Radio 4" showLabel />
149
+ </RadioGroup>
130
150
  </FormField>
131
151
  <FormField>
132
152
  <Select
@@ -137,6 +157,8 @@ The `Form` component renders a standard `<form>` element and should be used to h
137
157
  <option>Option 1</option>
138
158
  <option>Option 2</option>
139
159
  <option>Option 3</option>
160
+ <option>Option 4</option>
161
+ <option>Option 5</option>
140
162
  </Select>
141
163
  </FormField>
142
164
  </FormRow>
@@ -168,6 +190,7 @@ export const formRow = (size) => {
168
190
  <option>Option 1</option>
169
191
  <option>Option 2</option>
170
192
  <option>Option 3</option>
193
+ <option>Option 4</option>
171
194
  </Select>
172
195
  </FormField>
173
196
  <FormField>
@@ -179,6 +202,7 @@ export const formRow = (size) => {
179
202
  <option>Option 1</option>
180
203
  <option>Option 2</option>
181
204
  <option>Option 3</option>
205
+ <option>Option 4</option>
182
206
  </Select>
183
207
  </FormField>
184
208
  <FormField>
@@ -190,6 +214,7 @@ export const formRow = (size) => {
190
214
  <option>Option 1</option>
191
215
  <option>Option 2</option>
192
216
  <option>Option 3</option>
217
+ <option>Option 4</option>
193
218
  </Select>
194
219
  </FormField>
195
220
  </FormRow>
@@ -231,14 +256,14 @@ Below are the spacing variants available with the `FormSpacing` enum.
231
256
  <TextInput
232
257
  labelText="Username"
233
258
  helperText="Make sure to complete this field."
234
- required
259
+ isRequired
235
260
  />
236
261
  </FormField>
237
262
  <FormField>
238
263
  <TextInput
239
264
  labelText="Password"
240
265
  helperText="Make sure to complete this field."
241
- required
266
+ isRequired
242
267
  />
243
268
  </FormField>
244
269
  <FormRow>
@@ -1,10 +1,10 @@
1
1
  import * as React from "react";
2
- import { render } from "@testing-library/react";
2
+ import { render, screen } from "@testing-library/react";
3
3
  import { axe } from "jest-axe";
4
4
  import renderer from "react-test-renderer";
5
5
 
6
6
  import Form, { FormRow, FormField } from "./Form";
7
- import { FormSpacing } from "./FormTypes";
7
+ // import { FormSpacing } from "./FormTypes";
8
8
  import TextInput from "../TextInput/TextInput";
9
9
 
10
10
  describe("Form Accessibility", () => {
@@ -32,40 +32,43 @@ describe("Form Snapshot", () => {
32
32
  });
33
33
 
34
34
  describe("Form", () => {
35
- let container;
36
35
  it("Renders a <form> element", () => {
37
- const utils = render(<Form />);
38
- container = utils.container;
39
-
40
- expect(container.querySelector(".form")).toBeInTheDocument();
36
+ render(<Form />);
37
+ expect(screen.getByRole("form")).toBeInTheDocument();
41
38
  });
42
39
 
43
- it("Renders a <form> element with child .form-row element", () => {
44
- const utils = render(
40
+ it("Renders a <form> element with child FormRow element", () => {
41
+ render(
45
42
  <Form>
46
43
  <FormRow />
47
44
  </Form>
48
45
  );
49
- container = utils.container;
50
-
51
- expect(container.querySelector(".form")).toBeInTheDocument();
52
- expect(container.querySelector(".form-row")).toBeInTheDocument();
46
+ const form = screen.getByRole("form");
47
+ const formRow = form.firstChild;
48
+ expect(form).toBeInTheDocument();
49
+ expect(formRow).toBeInTheDocument();
50
+ expect(formRow).toHaveStyle({
51
+ display: "grid",
52
+ });
53
53
  });
54
54
 
55
- it("Renders a <form> element with child .form-field element", () => {
56
- const utils = render(
55
+ it("Renders a <form> element with child FormField element", () => {
56
+ render(
57
57
  <Form>
58
58
  <FormField />
59
59
  </Form>
60
60
  );
61
- container = utils.container;
62
-
63
- expect(container.querySelector(".form")).toBeInTheDocument();
64
- expect(container.querySelector(".form-field")).toBeInTheDocument();
61
+ const form = screen.getByRole("form");
62
+ const formField = form.firstChild;
63
+ expect(form).toBeInTheDocument();
64
+ expect(formField).toBeInTheDocument();
65
+ expect(formField).toHaveStyle({
66
+ display: "grid",
67
+ });
65
68
  });
66
69
 
67
- it("Renders a <form> element with .form-row, .form-field and input elements properly nested", () => {
68
- const utils = render(
70
+ it("Renders a <form> element with FormRow, FormField and input elements properly nested", () => {
71
+ render(
69
72
  <Form>
70
73
  <FormRow>
71
74
  <FormField>
@@ -74,33 +77,43 @@ describe("Form", () => {
74
77
  </FormRow>
75
78
  </Form>
76
79
  );
77
- container = utils.container;
78
-
79
- expect(container.querySelector(".form")).toBeInTheDocument();
80
- expect(container.querySelector(".form-row")).toBeInTheDocument();
81
- expect(container.querySelector(".form-field")).toBeInTheDocument();
82
- expect(container.querySelector(".textinput")).toBeInTheDocument();
80
+ const form = screen.getByRole("form");
81
+ const formRow = form.firstChild;
82
+ const formField = formRow.firstChild;
83
+ const textInput = screen.getByRole("textbox");
84
+ expect(form).toBeInTheDocument();
85
+ expect(formRow).toBeInTheDocument();
86
+ expect(formRow).toHaveStyle({
87
+ display: "grid",
88
+ });
89
+ expect(formField).toBeInTheDocument();
90
+ expect(formField).toHaveStyle({
91
+ display: "grid",
92
+ });
93
+ expect(textInput).toBeInTheDocument();
83
94
  });
84
95
 
85
96
  it("Renders a <form> element with custom `action` and `method` attributes", () => {
86
- const utils = render(<Form action="/end/point" method="get" />);
87
- container = utils.container;
88
-
89
- expect(container.querySelector(".form")).toBeInTheDocument();
90
- expect(container.querySelector(".form")).toHaveAttribute(
91
- "action",
92
- "/end/point"
93
- );
94
- expect(container.querySelector(".form")).toHaveAttribute("method", "get");
97
+ render(<Form action="/end/point" method="get" />);
98
+ const form = screen.getByRole("form");
99
+ expect(form).toBeInTheDocument();
100
+ expect(form).toHaveAttribute("action", "/end/point");
101
+ expect(form).toHaveAttribute("method", "get");
95
102
  });
96
103
 
97
- it("Renders a <form> element with spacing variant applied", () => {
98
- const utils = render(<Form spacing={FormSpacing.ExtraSmall} />);
99
- container = utils.container;
100
-
101
- expect(container.querySelector(".form")).toBeInTheDocument();
102
- expect(
103
- container.querySelector(".form--spacing-extra-small")
104
- ).toBeInTheDocument();
105
- });
104
+ // TO DO: There's somethign weird about checking for the "grid-gap" style.
105
+ // Other styles can be validated, but "grid-gap" is being ellusive.
106
+ // it("Renders a <form> element with spacing variant applied", () => {
107
+ // render(
108
+ // <Form spacing={FormSpacing.ExtraSmall}>
109
+ // <FormRow />
110
+ // </Form>
111
+ // );
112
+ // const form = screen.getByRole("form");
113
+ // const formRow = form.firstChild;
114
+ // expect(form).toBeInTheDocument();
115
+ // expect(formRow).toHaveStyle({
116
+ // "grid-gap": "var(--chakra-space-xs)",
117
+ // });
118
+ // });
106
119
  });
@@ -1,66 +1,94 @@
1
1
  import * as React from "react";
2
- import bem from "../../utils/bem";
3
- import generateUUID from "../../helpers/generateUUID";
4
2
  import { FormSpacing } from "./FormTypes";
3
+ import SimpleGrid from "../Grid/SimpleGrid";
4
+ import { Box } from "@chakra-ui/react";
5
+ import generateUUID from "../../helpers/generateUUID";
6
+
7
+ export interface FormChildProps {
8
+ /** className to be applied to FormRow */
9
+ className?: string;
10
+ /** Spacing size (internal use) */
11
+ gap?: FormSpacing;
12
+ /** ID that other components can cross reference (internal use) */
13
+ id?: string;
14
+ }
5
15
 
6
16
  export interface FormProps {
7
17
  /** Optional form `action` attribute */
8
18
  action?: string;
9
- /** Optional additional attributes passed to the `<form>` element */
10
- attributes?: { [key: string]: any };
11
19
  /** Optional className you can add in addition to `form` */
12
20
  className?: string;
13
21
  /** Optional ID that other components can cross reference */
14
22
  id?: string;
15
23
  /** Optional form `method` attribute */
16
24
  method?: "get" | "post";
17
- /** Optional modifiers array for use with BEM. See how to work with modifiers and BEM here: http://getbem.com/introduction/ */
18
- modifiers?: string[];
19
25
  /** Optional spacing size; if omitted, the default `large` (2rem / 32px) spacing will be used; ```IMPORTANT: for general form layout, this prop should not be used``` */
20
26
  spacing?: FormSpacing;
21
27
  }
22
28
 
23
- // FormRow child-component
24
- export function FormRow(props) {
25
- const { children, className } = props;
26
- return <div className={bem("form-row", [], "", [className])}>{children}</div>;
29
+ /** FormRow child-component */
30
+ export function FormRow(props: React.PropsWithChildren<FormChildProps>) {
31
+ const { children, className, gap, id } = props;
32
+ const count = React.Children.count(children);
33
+ const alteredChildren = React.Children.map(
34
+ children,
35
+ (child: React.ReactElement, i) => {
36
+ return React.cloneElement(child, { id: `${id}-grandchild${i}` });
37
+ }
38
+ );
39
+ return (
40
+ <SimpleGrid columns={count} className={className} gap={gap} id={id}>
41
+ {alteredChildren}
42
+ </SimpleGrid>
43
+ );
27
44
  }
28
45
 
29
- // FormField child-component
30
- export function FormField(props) {
31
- const { children, className } = props;
46
+ /** FormField child-component */
47
+ export function FormField(props: React.PropsWithChildren<FormChildProps>) {
48
+ const { children, className, gap, id } = props;
32
49
  return (
33
- <div className={bem("form-field", [], "", [className])}>{children}</div>
50
+ <SimpleGrid columns={1} className={className} gap={gap} id={id}>
51
+ {children}
52
+ </SimpleGrid>
34
53
  );
35
54
  }
36
55
 
56
+ /** main Form component */
37
57
  export default function Form(props: React.ComponentProps<"form"> & FormProps) {
38
58
  const {
39
59
  action,
40
- attributes = {},
41
60
  children,
42
61
  className,
43
62
  id = generateUUID(),
44
63
  method,
45
- modifiers = [],
46
64
  spacing,
47
65
  } = props;
48
66
 
67
+ let attributes = {};
49
68
  action && (attributes["action"] = action);
50
69
 
51
70
  method &&
52
71
  (method === "get" || method === "post") &&
53
72
  (attributes["method"] = method);
54
73
 
55
- spacing && modifiers.push(`spacing-${spacing}`);
74
+ const alteredChildren = React.Children.map(
75
+ children,
76
+ (child: React.ReactElement, i) => {
77
+ return React.cloneElement(child, { gap: spacing, id: `${id}-child${i}` });
78
+ }
79
+ );
56
80
 
57
81
  return (
58
- <form
59
- className={bem("form", modifiers, "", [className])}
82
+ <Box
83
+ as="form"
84
+ aria-label="form"
60
85
  id={id}
61
86
  {...attributes}
87
+ className={className}
62
88
  >
63
- {children}
64
- </form>
89
+ <SimpleGrid columns={1} gap={spacing} id={id + "-parent"}>
90
+ {alteredChildren}
91
+ </SimpleGrid>
92
+ </Box>
65
93
  );
66
94
  }
@@ -1,8 +1,3 @@
1
- export enum FormSpacing {
2
- ExtraExtraSmall = "extra-extra-small",
3
- ExtraSmall = "extra-small",
4
- Small = "small",
5
- Medium = "medium",
6
- Large = "large",
7
- ExtraLarge = "extra-large",
8
- }
1
+ import { GridGaps as FormSpacing } from "../Grid/GridTypes";
2
+
3
+ export { FormSpacing };
@@ -2,26 +2,36 @@
2
2
 
3
3
  exports[`Form Snapshot Renders the UI snapshot correctly 1`] = `
4
4
  <form
5
- className="form "
5
+ aria-label="form"
6
+ className="css-0"
6
7
  id="snapshot-form"
7
8
  >
8
9
  <div
9
- className="form-row "
10
+ className="css-aq1pyb"
11
+ id="snapshot-form-parent"
10
12
  >
11
13
  <div
12
- className="form-field "
14
+ className="css-1ao258g"
15
+ id="snapshot-form-child0"
13
16
  >
14
- Form Field 1
15
- </div>
16
- <div
17
- className="form-field "
18
- >
19
- Form Field 2
20
- </div>
21
- <div
22
- className="form-field "
23
- >
24
- Form Field 3
17
+ <div
18
+ className="css-aq1pyb"
19
+ id="snapshot-form-child0-grandchild0"
20
+ >
21
+ Form Field 1
22
+ </div>
23
+ <div
24
+ className="css-aq1pyb"
25
+ id="snapshot-form-child0-grandchild1"
26
+ >
27
+ Form Field 2
28
+ </div>
29
+ <div
30
+ className="css-aq1pyb"
31
+ id="snapshot-form-child0-grandchild2"
32
+ >
33
+ Form Field 3
34
+ </div>
25
35
  </div>
26
36
  </div>
27
37
  </form>
@@ -0,0 +1,9 @@
1
+ export enum GridGaps {
2
+ ExtraExtraSmall = "xxs",
3
+ ExtraSmall = "xs",
4
+ Small = "s",
5
+ Medium = "m",
6
+ Large = "l",
7
+ ExtraLarge = "xl",
8
+ ExtraExtraLarge = "xxl",
9
+ }