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

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 +118 -1
  2. package/README.md +98 -50
  3. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +4 -0
  4. package/dist/components/Button/Button.d.ts +13 -8
  5. package/dist/components/Button/ButtonTypes.d.ts +2 -1
  6. package/dist/components/Card/Card.d.ts +36 -52
  7. package/dist/components/Card/CardTypes.d.ts +0 -15
  8. package/dist/components/Checkbox/Checkbox.d.ts +17 -13
  9. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +4 -2
  10. package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +15 -0
  11. package/dist/components/DatePicker/DatePicker.d.ts +36 -34
  12. package/dist/components/Fieldset/Fieldset.d.ts +25 -0
  13. package/dist/components/Heading/Heading.d.ts +4 -4
  14. package/dist/components/HelperErrorText/HelperErrorText.d.ts +17 -14
  15. package/dist/components/HorizontalRule/HorizontalRule.d.ts +10 -9
  16. package/dist/components/Icons/Icon.d.ts +8 -0
  17. package/dist/components/Icons/IconSvgs.d.ts +11 -0
  18. package/dist/components/Icons/IconTypes.d.ts +11 -0
  19. package/dist/components/Image/Image.d.ts +19 -9
  20. package/dist/components/Image/ImageTypes.d.ts +20 -0
  21. package/dist/components/Link/Link.d.ts +4 -0
  22. package/dist/components/List/List.d.ts +19 -14
  23. package/dist/components/Notification/Notification.d.ts +37 -16
  24. package/dist/components/Pagination/Pagination.d.ts +16 -13
  25. package/dist/components/Pagination/Pagination.stories.d.ts +2 -0
  26. package/dist/components/ProgressIndicator/ProgressIndicator.d.ts +29 -0
  27. package/dist/components/ProgressIndicator/ProgressIndicatorTypes.d.ts +8 -0
  28. package/dist/components/Radio/Radio.d.ts +2 -0
  29. package/dist/components/RadioGroup/RadioGroup.d.ts +4 -2
  30. package/dist/components/SearchBar/SearchBar.d.ts +3 -3
  31. package/dist/components/Select/Select.d.ts +2 -0
  32. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +18 -14
  33. package/dist/components/Slider/Slider.d.ts +57 -0
  34. package/dist/components/StyleGuide/ColorCard.d.ts +12 -0
  35. package/dist/components/Tabs/Tabs.d.ts +1 -1
  36. package/dist/components/TextInput/TextInput.d.ts +12 -0
  37. package/dist/components/VideoPlayer/VideoPlayer.d.ts +6 -8
  38. package/dist/components/VideoPlayer/VideoPlayerTypes.d.ts +2 -2
  39. package/dist/design-system-react-components.cjs.development.js +6131 -3715
  40. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  41. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  42. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  43. package/dist/design-system-react-components.esm.js +6124 -3699
  44. package/dist/design-system-react-components.esm.js.map +1 -1
  45. package/dist/hooks/tests/useCarouselStyles.test.d.ts +1 -0
  46. package/dist/hooks/useCarouselStyles.d.ts +16 -0
  47. package/dist/hooks/useNYPLTheme.d.ts +54 -0
  48. package/dist/hooks/useWindowSize.d.ts +10 -0
  49. package/dist/index.d.ts +13 -8
  50. package/dist/resources.scss +180 -170
  51. package/dist/styles.css +1 -1
  52. package/dist/theme/components/button.d.ts +22 -8
  53. package/dist/theme/components/card.d.ts +168 -0
  54. package/dist/theme/components/checkbox.d.ts +5 -1
  55. package/dist/theme/components/checkboxGroup.d.ts +12 -0
  56. package/dist/theme/components/componentWrapper.d.ts +11 -0
  57. package/dist/theme/components/datePicker.d.ts +16 -0
  58. package/dist/theme/components/fieldset.d.ts +27 -0
  59. package/dist/theme/components/global.d.ts +23 -13
  60. package/dist/theme/components/globalMixins.d.ts +9 -1
  61. package/dist/theme/components/heading.d.ts +5 -0
  62. package/dist/theme/components/helperErrorText.d.ts +10 -0
  63. package/dist/theme/components/hero.d.ts +1 -0
  64. package/dist/theme/components/horizontalRule.d.ts +14 -0
  65. package/dist/theme/components/image.d.ts +31 -0
  66. package/dist/theme/components/label.d.ts +5 -3
  67. package/dist/theme/components/link.d.ts +4 -0
  68. package/dist/theme/components/list.d.ts +89 -0
  69. package/dist/theme/components/notification.d.ts +75 -0
  70. package/dist/theme/components/pagination.d.ts +19 -0
  71. package/dist/theme/components/progressIndicator.d.ts +50 -0
  72. package/dist/theme/components/radioGroup.d.ts +12 -0
  73. package/dist/theme/components/select.d.ts +11 -2
  74. package/dist/theme/components/skeletonLoader.d.ts +98 -0
  75. package/dist/theme/components/slider.d.ts +51 -0
  76. package/dist/theme/components/tabs.d.ts +54 -3
  77. package/dist/theme/components/textInput.d.ts +8 -1
  78. package/dist/theme/components/videoPlayer.d.ts +40 -0
  79. package/dist/theme/foundations/breakpoints.d.ts +8 -8
  80. package/dist/theme/foundations/global.d.ts +6 -1
  81. package/dist/theme/foundations/radii.d.ts +5 -0
  82. package/dist/theme/foundations/spacing.d.ts +16 -16
  83. package/package.json +72 -83
  84. package/src/__tests__/setup.ts +2 -2
  85. package/src/components/Accordion/Accordion.stories.mdx +39 -44
  86. package/src/components/Autosuggest/Autosuggest.stories.mdx +3 -3
  87. package/src/components/Autosuggest/Autosuggest.stories.tsx +2 -1
  88. package/src/components/Autosuggest/_Autosuggest.scss +5 -5
  89. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +14 -10
  90. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +23 -0
  91. package/src/components/Breadcrumbs/Breadcrumbs.tsx +5 -1
  92. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +199 -1
  93. package/src/components/Button/Button.stories.mdx +15 -10
  94. package/src/components/Button/Button.test.tsx +21 -7
  95. package/src/components/Button/Button.tsx +22 -34
  96. package/src/components/Button/ButtonTypes.tsx +1 -0
  97. package/src/components/Button/__snapshots__/Button.test.tsx.snap +41 -10
  98. package/src/components/Card/Card.stories.mdx +296 -259
  99. package/src/components/Card/Card.test.tsx +156 -84
  100. package/src/components/Card/Card.tsx +195 -145
  101. package/src/components/Card/CardTypes.tsx +0 -17
  102. package/src/components/Card/__snapshots__/Card.test.tsx.snap +410 -0
  103. package/src/components/CardEdition/CardEdition.stories.tsx +15 -47
  104. package/src/components/CardEdition/_CardEdition.scss +22 -23
  105. package/src/components/Chakra/Box.stories.mdx +15 -16
  106. package/src/components/Chakra/Center.stories.mdx +31 -16
  107. package/src/components/Chakra/Grid.stories.mdx +28 -15
  108. package/src/components/Chakra/Stack.stories.mdx +35 -18
  109. package/src/components/Checkbox/Checkbox.stories.mdx +33 -11
  110. package/src/components/Checkbox/Checkbox.test.tsx +47 -2
  111. package/src/components/Checkbox/Checkbox.tsx +39 -33
  112. package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +90 -2
  113. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +82 -2
  114. package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +29 -2
  115. package/src/components/CheckboxGroup/CheckboxGroup.tsx +22 -18
  116. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +47 -81
  117. package/src/components/ComponentWrapper/ComponentWrapper.tsx +63 -0
  118. package/src/components/DatePicker/DatePicker.stories.mdx +163 -62
  119. package/src/components/DatePicker/DatePicker.test.tsx +264 -64
  120. package/src/components/DatePicker/DatePicker.tsx +159 -128
  121. package/src/components/DatePicker/_DatePicker.scss +33 -67
  122. package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +818 -0
  123. package/src/components/Fieldset/Fieldset.stories.mdx +55 -0
  124. package/src/components/Fieldset/Fieldset.test.tsx +125 -0
  125. package/src/components/Fieldset/Fieldset.tsx +52 -0
  126. package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +68 -0
  127. package/src/components/Form/Form.stories.mdx +24 -6
  128. package/src/components/Form/Form.test.tsx +1 -1
  129. package/src/components/Form/Form.tsx +1 -0
  130. package/src/components/Grid/SimpleGrid.stories.mdx +32 -39
  131. package/src/components/Grid/SimpleGrid.test.tsx +4 -4
  132. package/src/components/Heading/Heading.stories.mdx +3 -4
  133. package/src/components/Heading/Heading.tsx +5 -5
  134. package/src/components/HelperErrorText/HelperErrorText.stories.mdx +124 -0
  135. package/src/components/HelperErrorText/HelperErrorText.test.tsx +39 -44
  136. package/src/components/HelperErrorText/HelperErrorText.tsx +37 -39
  137. package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +25 -0
  138. package/src/components/Hero/Hero.stories.mdx +12 -2
  139. package/src/components/Hero/Hero.tsx +1 -1
  140. package/src/components/Hero/HeroTypes.tsx +1 -0
  141. package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +7 -7
  142. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +8 -6
  143. package/src/components/HorizontalRule/HorizontalRule.test.tsx +33 -28
  144. package/src/components/HorizontalRule/HorizontalRule.tsx +27 -29
  145. package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +27 -9
  146. package/src/components/Icons/Icon.stories.mdx +12 -4
  147. package/src/components/Icons/Icon.test.tsx +18 -0
  148. package/src/components/Icons/Icon.tsx +16 -1
  149. package/src/components/Icons/IconSvgs.tsx +22 -0
  150. package/src/components/Icons/IconTypes.tsx +11 -0
  151. package/src/components/Image/Image.stories.mdx +220 -0
  152. package/src/components/Image/Image.test.tsx +131 -29
  153. package/src/components/Image/Image.tsx +84 -56
  154. package/src/components/Image/ImageTypes.ts +22 -0
  155. package/src/components/Image/__snapshots__/Image.test.tsx.snap +190 -0
  156. package/src/components/Input/Input.stories.tsx +23 -67
  157. package/src/components/Input/Input.test.tsx +4 -4
  158. package/src/components/Input/_Input.scss +23 -14
  159. package/src/components/Link/Link.tsx +4 -1
  160. package/src/components/List/List.stories.mdx +124 -49
  161. package/src/components/List/List.test.tsx +142 -63
  162. package/src/components/List/List.tsx +89 -93
  163. package/src/components/List/__snapshots__/List.test.tsx.snap +109 -0
  164. package/src/components/Modal/Modal.stories.mdx +3 -3
  165. package/src/components/Modal/_Modal.scss +2 -2
  166. package/src/components/Notification/Notification.stories.mdx +109 -112
  167. package/src/components/Notification/Notification.test.tsx +99 -110
  168. package/src/components/Notification/Notification.tsx +156 -159
  169. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +159 -8
  170. package/src/components/Pagination/Pagination.stories.mdx +26 -27
  171. package/src/components/Pagination/Pagination.stories.tsx +11 -16
  172. package/src/components/Pagination/Pagination.test.tsx +276 -146
  173. package/src/components/Pagination/Pagination.tsx +174 -154
  174. package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +285 -0
  175. package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +292 -0
  176. package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +225 -0
  177. package/src/components/ProgressIndicator/ProgressIndicator.tsx +126 -0
  178. package/src/components/ProgressIndicator/ProgressIndicatorTypes.ts +8 -0
  179. package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +357 -0
  180. package/src/components/Radio/Radio.test.tsx +20 -4
  181. package/src/components/Radio/Radio.tsx +6 -3
  182. package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +3 -0
  183. package/src/components/RadioGroup/RadioGroup.stories.mdx +3 -4
  184. package/src/components/RadioGroup/RadioGroup.test.tsx +24 -1
  185. package/src/components/RadioGroup/RadioGroup.tsx +19 -19
  186. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +42 -72
  187. package/src/components/SearchBar/SearchBar.Test.tsx +20 -1
  188. package/src/components/SearchBar/SearchBar.stories.mdx +113 -8
  189. package/src/components/SearchBar/SearchBar.tsx +20 -10
  190. package/src/components/Select/Select.test.tsx +12 -0
  191. package/src/components/Select/Select.tsx +5 -2
  192. package/src/components/Select/SelectTypes.tsx +1 -0
  193. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +28 -59
  194. package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +97 -177
  195. package/src/components/SkeletonLoader/SkeletonLoader.tsx +74 -71
  196. package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +739 -0
  197. package/src/components/Slider/Slider.stories.mdx +529 -0
  198. package/src/components/Slider/Slider.test.tsx +653 -0
  199. package/src/components/Slider/Slider.tsx +303 -0
  200. package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +1946 -0
  201. package/src/components/StyleGuide/Bidirectionality.stories.mdx +1 -1
  202. package/src/components/StyleGuide/Breakpoints.stories.mdx +34 -10
  203. package/src/components/StyleGuide/Buttons.stories.mdx +89 -73
  204. package/src/components/StyleGuide/ColorCard.tsx +46 -0
  205. package/src/components/StyleGuide/Colors.stories.mdx +171 -311
  206. package/src/components/StyleGuide/DesignTokens.stories.mdx +170 -0
  207. package/src/components/StyleGuide/Forms.stories.mdx +9 -7
  208. package/src/components/StyleGuide/Iconography.stories.mdx +85 -91
  209. package/src/components/StyleGuide/Spacing.stories.mdx +31 -23
  210. package/src/components/StyleGuide/Typography.stories.mdx +202 -189
  211. package/src/components/StyleGuide/UIDocCard.tsx +1 -1
  212. package/src/components/Tabs/Tabs.stories.mdx +73 -11
  213. package/src/components/Tabs/Tabs.tsx +87 -64
  214. package/src/components/Template/Template.stories.mdx +25 -27
  215. package/src/components/TextInput/TextInput.stories.mdx +1 -1
  216. package/src/components/TextInput/TextInput.test.tsx +22 -2
  217. package/src/components/TextInput/TextInput.tsx +28 -8
  218. package/src/components/TextInput/TextInputTypes.tsx +2 -0
  219. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +17 -4
  220. package/src/components/VideoPlayer/VideoPlayer.test.tsx +54 -53
  221. package/src/components/VideoPlayer/VideoPlayer.tsx +50 -51
  222. package/src/components/VideoPlayer/VideoPlayerTypes.tsx +2 -2
  223. package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +91 -0
  224. package/src/docs/Chakra.stories.mdx +244 -63
  225. package/src/docs/Intro.stories.mdx +5 -2
  226. package/src/hooks/tests/useCarouselStyles.test.ts +140 -0
  227. package/src/hooks/tests/useNYPLTheme.test.tsx +36 -0
  228. package/src/hooks/useCarouselStyles.ts +34 -0
  229. package/src/hooks/useNYPLTheme.ts +67 -0
  230. package/src/hooks/useWindowSize.ts +40 -0
  231. package/src/index.ts +22 -19
  232. package/src/resources.scss +5 -5
  233. package/src/styles/base/{_02-breakpoints.scss → _01-breakpoints.scss} +9 -10
  234. package/src/styles/base/{_03-mixins.scss → _02-mixins.scss} +16 -5
  235. package/src/styles/base/{_04-base.scss → _03-base.scss} +7 -2
  236. package/src/styles/base/{_05-focus.scss → _04-focus.scss} +0 -15
  237. package/src/styles/base/_place-holder.scss +14 -3
  238. package/src/styles/{03-space → space}/_space-inline.scss +14 -14
  239. package/src/styles/{03-space → space}/_space-inset.scss +10 -10
  240. package/src/styles/space/_space-stack.scss +116 -0
  241. package/src/styles.scss +13 -60
  242. package/src/theme/components/button.ts +21 -15
  243. package/src/theme/components/card.ts +174 -0
  244. package/src/theme/components/checkbox.ts +8 -3
  245. package/src/theme/components/checkboxGroup.ts +8 -0
  246. package/src/theme/components/componentWrapper.ts +10 -0
  247. package/src/theme/components/datePicker.ts +17 -0
  248. package/src/theme/components/fieldset.ts +18 -0
  249. package/src/theme/components/global.ts +26 -15
  250. package/src/theme/components/globalMixins.ts +9 -1
  251. package/src/theme/components/heading.ts +10 -5
  252. package/src/theme/components/helperErrorText.ts +9 -0
  253. package/src/theme/components/hero.ts +4 -3
  254. package/src/theme/components/horizontalRule.ts +13 -0
  255. package/src/theme/components/icon.ts +9 -9
  256. package/src/theme/components/image.ts +116 -0
  257. package/src/theme/components/label.ts +3 -10
  258. package/src/theme/components/link.ts +5 -1
  259. package/src/theme/components/list.ts +73 -0
  260. package/src/theme/components/notification.ts +93 -0
  261. package/src/theme/components/pagination.ts +20 -0
  262. package/src/theme/components/progressIndicator.ts +62 -0
  263. package/src/theme/components/radio.ts +2 -2
  264. package/src/theme/components/radioGroup.ts +8 -0
  265. package/src/theme/components/select.ts +6 -3
  266. package/src/theme/components/skeletonLoader.ts +107 -0
  267. package/src/theme/components/slider.ts +79 -0
  268. package/src/theme/components/statusBadge.ts +1 -2
  269. package/src/theme/components/tabs.ts +49 -19
  270. package/src/theme/components/template.ts +8 -8
  271. package/src/theme/components/textInput.ts +5 -4
  272. package/src/theme/components/videoPlayer.ts +49 -0
  273. package/src/theme/foundations/breakpoints.ts +8 -8
  274. package/src/theme/foundations/global.ts +6 -1
  275. package/src/theme/foundations/radii.ts +6 -0
  276. package/src/theme/foundations/spacing.ts +24 -24
  277. package/src/theme/index.ts +41 -10
  278. package/src/utils/componentCategories.ts +4 -3
  279. package/dist/components/HelperErrorText/HelperErrorText.stories.d.ts +0 -16
  280. package/dist/components/Image/Image.stories.d.ts +0 -18
  281. package/dist/components/List/List.stories.d.ts +0 -7
  282. package/dist/theme/components/customCheckboxGroup.d.ts +0 -18
  283. package/dist/theme/components/customRadioGroup.d.ts +0 -18
  284. package/src/components/Button/_Button.scss +0 -32
  285. package/src/components/Card/_Card.scss +0 -308
  286. package/src/components/HelperErrorText/HelperErrorText.stories.tsx +0 -48
  287. package/src/components/HelperErrorText/_HelperErrorText.scss +0 -9
  288. package/src/components/HorizontalRule/_HorizontalRule.scss +0 -15
  289. package/src/components/Image/Image.stories.tsx +0 -54
  290. package/src/components/Image/_Image.scss +0 -38
  291. package/src/components/List/List.stories.tsx +0 -139
  292. package/src/components/List/_List.scss +0 -76
  293. package/src/components/Notification/_Notification.scss +0 -110
  294. package/src/components/Pagination/_Pagination.scss +0 -40
  295. package/src/components/SkeletonLoader/_SkeletonLoader.scss +0 -142
  296. package/src/components/VideoPlayer/_VideoPlayer.scss +0 -38
  297. package/src/styles/01-colors/_colors-brand.scss +0 -62
  298. package/src/styles/01-colors/_colors-utility.scss +0 -67
  299. package/src/styles/02-typography/_type-scale.css +0 -11
  300. package/src/styles/02-typography/_type-weight.css +0 -7
  301. package/src/styles/02-typography/_typefaces.css +0 -4
  302. package/src/styles/03-space/_space-stack.scss +0 -116
  303. package/src/styles/03-space/_space.css +0 -30
  304. package/src/styles/base/_card-grid.scss +0 -78
  305. package/src/styles/base/_typography.scss +0 -11
  306. package/src/theme/components/customCheckboxGroup.ts +0 -12
  307. package/src/theme/components/customRadioGroup.ts +0 -12
@@ -1,69 +1,78 @@
1
1
  import React, { useState, forwardRef } from "react";
2
2
  import ReactDatePicker from "react-datepicker";
3
3
 
4
- import { FormRow, FormField } from "../Form/Form";
5
4
  import { DatePickerTypes } from "./DatePickerTypes";
5
+ import Fieldset from "../Fieldset/Fieldset";
6
+ import { FormRow, FormField } from "../Form/Form";
7
+ import { FormSpacing } from "../Form/FormTypes";
8
+ import HelperErrorText from "../HelperErrorText/HelperErrorText";
6
9
  import TextInput, {
7
10
  InputProps,
8
11
  TextInputRefType,
9
12
  } from "../TextInput/TextInput";
10
- import HelperErrorText from "../HelperErrorText/HelperErrorText";
11
13
  import generateUUID from "../../helpers/generateUUID";
12
- import bem from "../../utils/bem";
14
+ import { useMultiStyleConfig } from "@chakra-ui/system";
13
15
 
14
16
  // The object shape for the DatePicker's start and end date state values.
15
17
  // Internal use only.
16
18
  interface FullDateType {
17
- startDate: Date;
19
+ /** Date object that gets returned for the onChange
20
+ * function only for date ranges. */
18
21
  endDate?: Date;
22
+ /** Date object that gets returned for the onChange function. */
23
+ startDate: Date;
19
24
  }
20
25
 
21
26
  // Used for the input fields' parent wrapper. Internal use only.
22
27
  interface DateRangeRowProps {
28
+ /** ID that other components can cross reference for accessibility purposes. */
29
+ id?: string;
23
30
  /** Whether to render a single date input or two for a range of two dates. */
24
- dateRange?: boolean;
31
+ isDateRange?: boolean;
25
32
  }
26
33
 
27
34
  // Interface used by the `div` or `fieldset` parent wrapper element.
28
35
  // Internal use only.
29
36
  interface DatePickerWrapperProps extends DateRangeRowProps {
30
- /** ID that other components can cross reference for accessibility purposes. */
31
- id?: string;
37
+ /** Additional className. */
38
+ className?: string;
39
+ /** Adds the 'required' property to the input element(s). */
40
+ isRequired?: boolean;
32
41
  /** Passed to the `TextInput` component to render a label associated with an input field. */
33
42
  labelText: string;
34
43
  /** Offers the ability to show the label onscreen or hide it. */
35
44
  showLabel?: boolean;
36
- /** Additional className for use with BEM. See how to work with blockNames and
37
- * BEM here: http://getbem.com/introduction/ */
38
- className?: string;
45
+ /** Whether or not to display the "Required"/"Optional" text in the label text. */
46
+ showOptReqLabel?: boolean;
39
47
  }
40
48
 
41
49
  // Interface used by the internal DS `TextInput` component as a custom
42
50
  // component for the ReactDatePicker plugin component. Internal use only.
43
51
  interface CustomTextInputProps extends InputProps {
44
- /** Data value used by the ReactDatePicker plugin and the custom TextInput component. */
45
- value?: string;
46
- /** Event handler used by the ReactDatePicker plugin to open the popup calendar. */
47
- onClick?: (data: any) => any;
48
- /** The ReactDatePicker plugin has its own `required` prop so we use this to
49
- * pass the value from the parent `DatePicker` component. */
50
- dsRequired?: boolean;
51
52
  /** The ReactDatePicker plugin has its own `id` prop so we use this to pass the
52
53
  * value from the parent `DatePicker` component. */
53
54
  dsId?: string;
54
55
  /** The ReactDatePicker plugin manipulates the ref value so we declare our
55
56
  * own for some cases. */
56
57
  dsRef?: React.Ref<TextInputRefType>;
58
+ /** The ReactDatePicker plugin has its own `required` prop so we use this to
59
+ * pass the value from the parent `DatePicker` component. */
60
+ isRequired?: boolean;
61
+ /** Event handler used by the ReactDatePicker plugin to open the popup calendar. */
62
+ onClick?: (data: any) => any;
57
63
  /** Whether or not to display the "Required"/"Optional" text in the label text. */
58
64
  showOptReqLabel?: boolean;
65
+ /** Data value used by the ReactDatePicker plugin and the custom TextInput component. */
66
+ value?: string;
59
67
  }
60
68
 
61
69
  // Main interface for the exported DS DatePicker component.
62
70
  export interface DatePickerProps extends DatePickerWrapperProps {
71
+ /** The date format to display. Defaults to "yyyy-MM-dd".
72
+ * Must be in ISO-8601 format. */
73
+ dateFormat?: string;
63
74
  /** DatePicker date types that can be rendered. */
64
75
  dateType?: DatePickerTypes;
65
- /** The date format to display. Defaults to "yyyy-MM-dd". */
66
- dateFormat?: string;
67
76
  /** Populates the `HelperErrorText` component in this component. */
68
77
  helperText?: string;
69
78
  /** Populates the `HelperErrorText` component in the "From" `TextInput` component. */
@@ -73,73 +82,67 @@ export interface DatePickerProps extends DatePickerWrapperProps {
73
82
  /** The initial date value. This must be in the mm/dd/yyyy format. */
74
83
  initialDate?: string;
75
84
  /** The initialTo date value used for date ranges.
76
- * This must be in the mm/dd/yyyy format.
77
- */
85
+ * This must be in the mm/dd/yyyy format. */
78
86
  initialDateTo?: string;
79
- /** The minimum date value that applies to both input fields.
80
- * This must be in the mm/dd/yyyy format.
81
- */
82
- minDate?: string;
83
- /** The maximum date value that applies to both input fields.
84
- * This must be in the mm/dd/yyyy format.
85
- */
86
- maxDate?: string;
87
- /** Populates the `HelperErrorText` error state for both "From" and "To" input components. */
87
+ /** Populates the `HelperErrorText` error state for both "From"
88
+ * and "To" input components. */
88
89
  invalidText?: string;
89
- /** Helper for modifiers array; adds 'isInvalid' styling. */
90
- isInvalid?: boolean;
91
- /** Adds the 'required' property to the input element(s). */
92
- required?: boolean;
93
- /** Whether or not to display the "Required"/"Optional" text in the label text. */
94
- showOptReqLabel?: boolean;
95
90
  /** Adds the 'disabled' property to the input element(s). */
96
91
  isDisabled?: boolean;
97
- /** Modifiers array for use with BEM. See how to work with modifiers and BEM
98
- * here: http://getbem.com/introduction/ */
99
- modifiers?: string[];
100
- /** BlockName for use with BEM. See how to work with blockNames and BEM
101
- * here: http://getbem.com/introduction/ */
102
- blockName?: string;
92
+ /** Adds 'isInvalid' styling. */
93
+ isInvalid?: boolean;
94
+ /** Adds the 'required' property to the input element(s). */
95
+ isRequired?: boolean;
96
+ /** The maximum date value that applies to both input fields.
97
+ * This must be in the mm/dd/yyyy format. */
98
+ maxDate?: string;
99
+ /** The minimum date value that applies to both input fields.
100
+ * This must be in the mm/dd/yyyy format. */
101
+ minDate?: string;
103
102
  /** Value name for the single input field or the "From" input field in a date range. */
104
103
  nameFrom?: string;
105
104
  /** Value name for the "To" input field */
106
105
  nameTo?: string;
107
- /** An additional explicit React ref passed for a date range's "From" input field. */
108
- refTo?: React.Ref<TextInputRefType>;
109
106
  /** The action to perform on the `input`'s onChange function for both fields.
110
107
  * This will return the data in an object with `startDate` and `endDate` keys.
111
108
  */
112
109
  onChange?: (data: FullDateType) => void;
110
+ /** An additional explicit React ref passed for a date range's "To"
111
+ * input field. Note that the "From" input takes the initial "ref" value. */
112
+ refTo?: React.Ref<TextInputRefType>;
113
+ /** Offers the ability to hide the helper/invalid text. */
114
+ showHelperInvalidText?: boolean;
115
+ /** Whether or not to display the "Required"/"Optional" text in the label text. */
116
+ showOptReqLabel?: boolean;
113
117
  }
114
118
 
115
119
  /**
116
120
  * A Design System `TextInput` component that is used as the custom input
117
- * element for the `DatePicker` plugin. This uses `forwardRef` because,
118
- * internally, the `DatePicker` plugin needs to keep track of the input data.
121
+ * element for the `react-datepicker` plugin. This uses `forwardRef` because,
122
+ * internally, the `react-datepicker` plugin needs to keep track of the input data.
119
123
  * @note This is only used internally for this file.
120
- * @note we don't declare an `onClick` prop but the `DatePicker` plugin takes
121
- * care of that. That is used and needed to open/close the popup calendar.
122
- * @note we can't use the prop name "required" for the `required` prop we need.
123
- * Instead, we are calling it `dsRequired`. This is because the `DatePicker`
124
- * plugin internally makes use of the "required" name so we need a new name.
124
+ * @note we don't declare an `onClick` prop but the `react-datepicker` plugin
125
+ * takes care of that. That is used and needed to open/close the popup calendar.
125
126
  */
126
127
  const CustomTextInput = forwardRef<TextInputRefType, CustomTextInputProps>(
127
128
  (
128
129
  {
129
- showLabel,
130
- onChange,
131
- value,
132
- labelText,
133
- isDisabled,
134
- dsRequired,
135
- showOptReqLabel,
136
- isInvalid,
130
+ additionalStyles = {},
131
+ attributes,
132
+ dsId,
133
+ dsRef,
137
134
  helperText,
138
135
  invalidText,
136
+ isDisabled,
137
+ isInvalid,
138
+ isRequired,
139
+ labelText,
140
+ onChange,
139
141
  onClick,
140
- dsId,
141
- dsRef,
142
- attributes,
142
+ showLabel,
143
+ showHelperInvalidText,
144
+ showOptReqLabel,
145
+ value,
143
146
  },
144
147
  ref: React.Ref<TextInputRefType>
145
148
  ) => (
@@ -150,16 +153,18 @@ const CustomTextInput = forwardRef<TextInputRefType, CustomTextInputProps>(
150
153
  value={value}
151
154
  labelText={labelText}
152
155
  isDisabled={isDisabled}
153
- isRequired={dsRequired}
156
+ isRequired={isRequired}
157
+ showHelperInvalidText={showHelperInvalidText}
154
158
  showOptReqLabel={showOptReqLabel}
155
159
  isInvalid={isInvalid}
156
160
  helperText={helperText}
157
161
  invalidText={invalidText}
158
- // Use either the specific prop-based or the forwardRef value.
159
- // react-datepicker manipulates the `ref` value so sometimes we want a
160
- // specific ref through the `dsRef` prop.
162
+ // Use either the specific prop-based or the `forwardRef` value.
163
+ // `react-datepicker` manipulates the `ref` value so when we
164
+ // want a specific ref, use the `dsRef` prop.
161
165
  ref={dsRef || ref}
162
166
  attributes={{ ...attributes, onClick }}
167
+ additionalStyles={additionalStyles}
163
168
  />
164
169
  )
165
170
  );
@@ -171,23 +176,32 @@ const CustomTextInput = forwardRef<TextInputRefType, CustomTextInputProps>(
171
176
  * @note This is only used internally for this file.
172
177
  */
173
178
  const DatePickerWrapper: React.FC<DatePickerWrapperProps> = ({
179
+ children,
180
+ className,
174
181
  id,
175
- dateRange,
176
- showLabel,
182
+ isDateRange,
183
+ isRequired,
177
184
  labelText,
178
- className = "",
179
- children,
180
- }) =>
181
- dateRange ? (
182
- <fieldset id={`date-range-${id}`} className={className}>
183
- <legend className={showLabel ? "" : "sr-only"}>{labelText}</legend>
184
- {children}
185
- </fieldset>
186
- ) : (
187
- <div id={`date-range-${id}`} className={className}>
188
- {children}
189
- </div>
190
- );
185
+ showLabel,
186
+ showOptReqLabel,
187
+ }) => (
188
+ <FormField id={`${id}-form-field}`}>
189
+ {isDateRange ? (
190
+ <Fieldset
191
+ id={id}
192
+ className={className}
193
+ isLegendHidden={!showLabel}
194
+ legendText={labelText}
195
+ optReqFlag={showOptReqLabel}
196
+ isRequired={isRequired}
197
+ >
198
+ {children}
199
+ </Fieldset>
200
+ ) : (
201
+ children
202
+ )}
203
+ </FormField>
204
+ );
191
205
 
192
206
  /**
193
207
  * This is the wrapper component that conditionally renders the input fields
@@ -195,11 +209,15 @@ const DatePickerWrapper: React.FC<DatePickerWrapperProps> = ({
195
209
  * layout for the two side-by-side date input fields.
196
210
  * @note This is only used internally for this file.
197
211
  */
198
- const DateRangeRow: React.FC<DateRangeRowProps> = ({ dateRange, children }) =>
199
- dateRange ? (
200
- <div className="form form--spacing-extra-small">
201
- <FormRow>{children}</FormRow>
202
- </div>
212
+ const DateRangeRow: React.FC<DateRangeRowProps> = ({
213
+ id,
214
+ isDateRange,
215
+ children,
216
+ }) =>
217
+ isDateRange ? (
218
+ <FormRow id={`${id}-form-row`} gap={FormSpacing.ExtraSmall}>
219
+ {children}
220
+ </FormRow>
203
221
  ) : (
204
222
  <>{children}</>
205
223
  );
@@ -210,37 +228,38 @@ const DateRangeRow: React.FC<DateRangeRowProps> = ({ dateRange, children }) =>
210
228
  const DatePicker = React.forwardRef<TextInputRefType, DatePickerProps>(
211
229
  (props, ref?) => {
212
230
  const {
213
- id = generateUUID(),
214
- dateType = DatePickerTypes.Full,
231
+ className,
215
232
  dateFormat = "yyyy-MM-dd",
216
- dateRange = false,
217
- labelText = "From",
218
- showLabel = true,
233
+ dateType = DatePickerTypes.Full,
219
234
  helperText,
220
235
  helperTextFrom,
221
236
  helperTextTo,
237
+ id = generateUUID(),
238
+ initialDate,
239
+ initialDateTo,
222
240
  invalidText,
223
- isInvalid,
224
- required,
225
- showOptReqLabel = true,
241
+ isDateRange = false,
226
242
  isDisabled,
243
+ isInvalid,
244
+ isRequired,
245
+ labelText = "From",
246
+ maxDate,
247
+ minDate,
227
248
  nameFrom,
228
249
  nameTo,
229
- blockName,
230
- modifiers = [],
231
- className,
232
- refTo,
233
250
  onChange,
234
- initialDate,
235
- initialDateTo,
236
- minDate,
237
- maxDate,
251
+ refTo,
252
+ showHelperInvalidText = true,
253
+ showLabel = true,
254
+ showOptReqLabel = true,
238
255
  } = props;
256
+ const styles = useMultiStyleConfig("DatePicker", {});
257
+ const finalStyles = isDateRange ? styles : {};
239
258
  const initStartDate = initialDate ? new Date(initialDate) : new Date();
240
259
  const initEndDate = initialDateTo ? new Date(initialDateTo) : new Date();
241
260
  let initFullDate: FullDateType = { startDate: initStartDate };
242
261
  // Only include the `endDate` key for date ranges.
243
- if (dateRange) {
262
+ if (isDateRange) {
244
263
  initFullDate = { ...initFullDate, endDate: initEndDate };
245
264
  }
246
265
  const [fullDate, setFullDate] = useState<FullDateType>(initFullDate);
@@ -253,7 +272,7 @@ const DatePicker = React.forwardRef<TextInputRefType, DatePickerProps>(
253
272
  };
254
273
  // How many years to display in the DatePickerTypes.Year option.
255
274
  const yearsToDisplay = 12;
256
- // Both ReactDatePicker components share some props.
275
+ // Both `ReactDatePicker` components share some props.
257
276
  let baseDatePickerAttrs = {
258
277
  popperClassName: "date-picker-calendar",
259
278
  popperPlacement: "bottom-start",
@@ -268,24 +287,30 @@ const DatePicker = React.forwardRef<TextInputRefType, DatePickerProps>(
268
287
  minDate: minDate ? new Date(minDate) : null,
269
288
  maxDate: maxDate ? new Date(maxDate) : null,
270
289
  dateFormat,
271
- isDisabled,
272
290
  };
273
- // Both TextInput components share some props.
291
+ // Both custom `TextInput` components share some props.
274
292
  let baseCustomTextInputAttrs = {
275
- dsRequired: required,
276
- showOptReqLabel,
277
- // Always display the labels or the input fields when
278
- // the DatePicker component is a `dateRange` type.
279
- showLabel: dateRange ? true : showLabel,
293
+ dsId: `${id}-start`,
294
+ isRequired,
295
+ // In the date range type, don't display the "required"/"optional" text
296
+ // in individual input labels. It'll display in the legend element.
297
+ showOptReqLabel: isDateRange ? false : showOptReqLabel,
298
+ // Always display the labels for the input fields when
299
+ // the DatePicker component is a date range type.
300
+ showLabel: isDateRange ? true : showLabel,
280
301
  isDisabled,
281
302
  isInvalid,
282
- helperText: dateRange ? helperTextFrom : helperText,
303
+ helperText: isDateRange ? helperTextFrom : helperText,
304
+ showHelperInvalidText,
283
305
  invalidText,
306
+ additionalStyles: finalStyles.subLabels,
284
307
  };
308
+ // These are attribute objects for the `react-datepicker` package component.
285
309
  let startDatePickerAttrs = {};
286
310
  let endDatePickerAttrs = {};
311
+ // This sets set only for date ranges for the "To" input field.
287
312
  let endDatePickerElement = null;
288
- // This changes to "From" when `dateRange` is true.
313
+ // This changes to "From" when `isDateRange` is true.
289
314
  let startLabelText = labelText;
290
315
 
291
316
  // Update the appropriate props for the selected date type to render.
@@ -309,20 +334,20 @@ const DatePicker = React.forwardRef<TextInputRefType, DatePickerProps>(
309
334
  );
310
335
  }
311
336
 
312
- // Set the "From" DatePicker values here based off the base props. If a date
313
- // range is selected additional props get added automatically.
337
+ // Set the "From" DatePicker values here based on the base props. If a date
338
+ // range is selected, additional props get added automatically.
314
339
  startDatePickerAttrs = { ...baseDatePickerAttrs };
315
340
 
316
- // A date range is selected. We must now update the props for the start/"from"
317
- // input component and render an end/"To" input component.
318
- if (dateRange) {
319
- modifiers.push("date-range");
341
+ // A date range is selected. We must now update the props for the
342
+ // "start"/"from" input component and render an "end"/"To" input component.
343
+ if (isDateRange) {
320
344
  const endCustomTextInputAttrs = {
321
345
  ...baseCustomTextInputAttrs,
346
+ dsId: `${id}-end`,
322
347
  helperText: helperTextTo,
323
348
  };
324
- // These props are used to follow the pattern recommended by the
325
- // react-datepicker plugin.
349
+ // These props are used to follow the pattern recommended by
350
+ // the react-datepicker plugin.
326
351
  startDatePickerAttrs = {
327
352
  ...startDatePickerAttrs,
328
353
  selectsStart: true,
@@ -373,20 +398,26 @@ const DatePicker = React.forwardRef<TextInputRefType, DatePickerProps>(
373
398
  return (
374
399
  <DatePickerWrapper
375
400
  id={id}
376
- dateRange={dateRange}
401
+ isDateRange={isDateRange}
377
402
  showLabel={showLabel}
378
403
  labelText={labelText}
379
- className={bem("date-picker", modifiers, blockName, [className])}
404
+ className={className}
405
+ isRequired={isRequired}
406
+ showOptReqLabel={showOptReqLabel}
380
407
  >
381
- <DateRangeRow dateRange={dateRange}>
382
- <FormField>{startDatePickerElement}</FormField>
408
+ <DateRangeRow id={id} isDateRange={isDateRange}>
409
+ <FormField id={`${id}-start-form`}>
410
+ {startDatePickerElement}
411
+ </FormField>
383
412
 
384
413
  {endDatePickerElement && (
385
- <FormField>{endDatePickerElement}</FormField>
414
+ <FormField id={`${id}-end-form`}>{endDatePickerElement}</FormField>
386
415
  )}
387
416
  </DateRangeRow>
388
- {helperText && dateRange && (
389
- <HelperErrorText isError={false}>{helperText}</HelperErrorText>
417
+ {helperText && isDateRange && showHelperInvalidText && (
418
+ <HelperErrorText id={`${id}-helper-text`} isInvalid={false}>
419
+ {helperText}
420
+ </HelperErrorText>
390
421
  )}
391
422
  </DatePickerWrapper>
392
423
  );
@@ -1,76 +1,42 @@
1
- fieldset {
2
- legend {
3
- @include space-stack-xs;
4
-
5
- font-size: 14px;
6
- font-weight: var(--font-weight-medium);
7
- }
8
-
9
- &.date-picker {
10
- @include fieldset-reset;
11
- }
12
-
13
- .label,
14
- .label__required-helper {
15
- font-size: var(--font-size--2);
16
- font-weight: var(--font-weight-regular);
17
- margin-bottom: 0;
18
- }
19
- }
20
-
21
- .date-picker {
22
- .sr-only {
23
- @include screenreader-only();
1
+ // Styles needed to override `react-datepicker` plugin styles.
2
+ .date-picker-calendar {
3
+ // Make sure the width is enough to fit 12 selectable years.
4
+ .react-datepicker__year-wrapper {
5
+ max-width: 220px;
24
6
  }
25
7
 
26
- .form .form-row,
27
- .form-field {
28
- margin-bottom: 0;
29
- }
30
-
31
- .react-datepicker-wrapper {
32
- width: 100%;
33
- }
34
-
35
- .date-picker-calendar {
36
- // Make sure the width is enough to fit 12 selectable years
37
- .react-datepicker__year-wrapper {
38
- max-width: 220px;
8
+ // Moving away from React DatePickers default blue color theme:
9
+ .react-datepicker__year,
10
+ .react-datepicker__month,
11
+ .react-datepicker__day {
12
+ // For currently selected ranges
13
+ &--in-range.react-datepicker__day--in-range {
14
+ opacity: 0.5;
39
15
  }
40
16
 
41
- // Moving away from React DatePickers default blue color theme:
42
- .react-datepicker__year,
43
- .react-datepicker__month,
44
- .react-datepicker__day {
45
- // For currently selected ranges
46
- &--in-range.react-datepicker__day--in-range {
47
- opacity: 0.5;
48
- }
49
-
50
- // For ranges about to be selected
51
- &-text--keyboard-selected,
52
- &--keyboard-selected,
53
- &--in-range,
54
- &--in-selecting-range {
55
- background-color: $black;
56
- border-radius: 0;
57
- color: $white;
58
- opacity: 0.3;
59
- }
60
-
61
- // Selected states
62
- &-text--selected,
63
- &--selected {
64
- background-color: $black;
65
- border-radius: 0;
66
- color: $white;
67
- opacity: 1;
68
- }
17
+ // For ranges about to be selected.
18
+ &-text--keyboard-selected,
19
+ &--keyboard-selected,
20
+ &--in-range,
21
+ &--in-selecting-range {
22
+ background-color: var(--nypl-colors-ui-black);
23
+ border-radius: 0;
24
+ color: var(--nypl-colors-ui-white);
25
+ opacity: 0.3;
69
26
  }
70
27
 
71
- // Shift the traingle to the left
72
- .react-datepicker__triangle {
73
- transform: translate(32px, 0px) !important;
28
+ // Selected states.
29
+ &-text--selected,
30
+ &--selected {
31
+ background-color: var(--nypl-colors-ui-black);
32
+ border-radius: 0;
33
+ color: var(--nypl-colors-ui-white);
34
+ opacity: 1;
74
35
  }
75
36
  }
37
+
38
+ // Shift the triangle to the left.
39
+ .react-datepicker__triangle {
40
+ transform: translate(32px, 0px) !important;
41
+ }
76
42
  }