@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,99 +1,111 @@
1
1
  import * as React from "react";
2
- import bem from "../../utils/bem";
3
- import { TextInputTypes, TextInputFormats } from "./TextInputTypes";
2
+ import {
3
+ Box,
4
+ Input as ChakraInput,
5
+ Textarea as ChakraTextarea,
6
+ useMultiStyleConfig,
7
+ } from "@chakra-ui/react";
8
+
9
+ import {
10
+ TextInputTypes,
11
+ TextInputFormats,
12
+ TextInputVariants,
13
+ } from "./TextInputTypes";
4
14
  import Label from "../Label/Label";
5
15
  import HelperErrorText from "../HelperErrorText/HelperErrorText";
6
16
  import generateUUID from "../../helpers/generateUUID";
7
17
 
8
18
  export interface InputProps {
9
- /** Additional attributes to pass to the `<input>` tag */
19
+ /** Additional attributes to pass to the `<input>` or `<textarea>` element */
10
20
  attributes?: { [key: string]: any };
11
- /** HTML Input types as defined by MDN: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input */
12
- type?: TextInputTypes;
13
- /** Will add 'aria-required: true' to input */
14
- required?: boolean;
15
- /** Provides text for a `Label` component if `showLabel` is set to true; populates a `aria-label` sttribute if `showLabel` is set to false. */
16
- labelText: string;
17
- /** Offers the ability to show the label onscreen or hide it. Refer to the `labelText` property for more information. */
18
- showLabel?: boolean;
19
- /** Populates the HelperErrorText for standard state */
20
- helperText?: string;
21
- /** Populates the HelperErrorText for error state */
22
- errorText?: string;
23
- /** Populates the placeholder of the input */
24
- placeholder?: string;
25
- /** Populates the value of the input */
26
- value?: string;
27
- /** className you can add in addition to 'textinput' */
21
+ /** A class name for the TextInput parent div. */
28
22
  className?: string;
23
+ /** Populates the HelperErrorText for the standard state */
24
+ helperText?: string;
29
25
  /** ID that other components can cross reference for accessibility purposes */
30
26
  id?: string;
31
- /** Helper for modifiers array; adds 'errored' styling */
32
- errored?: boolean;
33
- /** Adds the 'disabled' prop to the input when true */
34
- disabled?: boolean;
35
- /** Modifiers array for use with BEM. See how to work with modifiers and BEM here: http://getbem.com/introduction/ */
36
- modifiers?: string[];
37
- /** The action to perform on the `<input>`'s onChange function */
27
+ /** Populates the HelperErrorText for the error state */
28
+ invalidText?: string;
29
+ /** Adds the `disabled` and `aria-disabled` prop to the input when true */
30
+ isDisabled?: boolean;
31
+ /** Adds errored styling to the input/textarea and helper text elements */
32
+ isInvalid?: boolean;
33
+ /** Will add `required` and `aria-required` props to the input/textarea elements */
34
+ isRequired?: boolean;
35
+ /** Provides text for a `Label` component if `showLabel` is set to true;
36
+ * populates an `aria-label` attribute if `showLabel` is set to false. */
37
+ labelText: string;
38
+ /** The action to perform on the `input`/`textarea`'s onChange function */
38
39
  onChange?: (
39
40
  event:
40
41
  | React.ChangeEvent<HTMLInputElement>
41
42
  | React.ChangeEvent<HTMLTextAreaElement>
42
43
  ) => void;
44
+ /** Populates the placeholder for the input/textarea elements */
45
+ placeholder?: string;
46
+ /** Offers the ability to show the label onscreen or hide it. Refer to the
47
+ * `labelText` property for more information. */
48
+ showLabel?: boolean;
49
+ /** Offers the ability to show the "Required"/"Optional" label onscreen or
50
+ * hide it. True by default. */
51
+ showOptReqLabel?: boolean;
52
+ /** HTML Input types as defined by MDN: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input */
53
+ type?: TextInputTypes;
54
+ /** Populates the value of the input/textarea elements */
55
+ value?: string;
56
+ /** The variant to display. */
57
+ variantType?: TextInputVariants;
43
58
  }
44
59
 
45
- /** The type used for `ref`s. We want to extend both `input` and `textarea`
60
+ /**
61
+ * The type used for `ref`s. We want to extend both `input` and `textarea`
46
62
  * since both are available to create through `TextInput`.
47
63
  */
48
64
  export type TextInputRefType = HTMLInputElement & HTMLTextAreaElement;
49
65
 
50
- /** Renders either an `input` element with a specified type or a `textarea`
51
- * element. All types will render an accessible Label component and an optional
52
- * HelperErrorText component.
66
+ /**
67
+ * Renders either an `input` element with a specified type or a `textarea`
68
+ * element. All types will render an accessible `Label` component and an
69
+ * optional `HelperErrorText` component.
53
70
  */
54
71
  const TextInput = React.forwardRef<TextInputRefType, InputProps>(
55
72
  (props, ref: React.Ref<TextInputRefType>) => {
56
73
  const {
57
74
  attributes = {},
58
- type = TextInputTypes.text,
59
- required,
60
- labelText,
61
- showLabel = true,
75
+ className,
62
76
  helperText,
63
- errorText,
77
+ id = generateUUID(),
78
+ invalidText,
79
+ isDisabled = false,
80
+ isInvalid = false,
81
+ isRequired = false,
82
+ labelText,
83
+ onChange,
64
84
  placeholder,
85
+ showLabel = true,
86
+ showOptReqLabel = true,
87
+ type = TextInputTypes.text,
65
88
  value,
66
- className,
67
- disabled,
68
- errored,
69
- onChange,
70
- modifiers = [],
71
- id = generateUUID(),
89
+ variantType = TextInputVariants.Default,
72
90
  } = props;
73
-
91
+ const styles = useMultiStyleConfig("TextInput", { variant: variantType });
74
92
  const isTextArea = type === TextInputTypes.textarea;
75
93
  const isHidden = type === TextInputTypes.hidden;
76
- const optReqFlag = required ? "Required" : "Optional";
77
- const errorOutput = errorText
78
- ? errorText
94
+ const optReqFlag = isRequired ? "Required" : "Optional";
95
+ const finalInvalidText = invalidText
96
+ ? invalidText
79
97
  : "There is an error related to this field.";
80
- let footnote;
98
+ let footnote: string | React.ReactNode = isInvalid
99
+ ? finalInvalidText
100
+ : helperText;
101
+ let fieldOutput;
81
102
  let options;
82
103
 
83
- if (!showLabel) attributes["aria-label"] = labelText;
84
- if (helperText) attributes["aria-describedby"] = helperText;
85
-
86
- if (errored) {
87
- modifiers.push("error");
88
- }
89
- if (isTextArea) {
90
- modifiers.push("textarea");
91
- }
92
-
93
- if (errored) {
94
- footnote = errorOutput;
95
- } else {
96
- footnote = helperText;
104
+ if (!showLabel) {
105
+ attributes["aria-label"] =
106
+ labelText && footnote ? `${labelText} - ${footnote}` : labelText;
107
+ } else if (helperText) {
108
+ attributes["aria-describedby"] = `${id}-helperText`;
97
109
  }
98
110
 
99
111
  if (
@@ -111,50 +123,55 @@ const TextInput = React.forwardRef<TextInputRefType, InputProps>(
111
123
  );
112
124
  }
113
125
 
114
- options = {
115
- id,
116
- className: bem("inputfield", modifiers, "", [className]),
117
- "aria-required": required,
118
- "aria-hidden": isHidden,
119
- disabled,
120
- required,
121
- placeholder,
122
- onChange,
123
- ref,
124
- ...attributes,
125
- };
126
+ // When the type is "hidden", the input element needs fewer attributes.
127
+ options = isHidden
128
+ ? { id, "aria-hidden": isHidden, onChange, ref }
129
+ : {
130
+ id,
131
+ "aria-required": isRequired,
132
+ isDisabled,
133
+ isRequired,
134
+ isInvalid,
135
+ placeholder,
136
+ onChange,
137
+ ref,
138
+ ...attributes,
139
+ };
126
140
  // For `input` and `textarea`, all attributes are the same but `input`
127
141
  // also needs `type` and `value` to render correctly.
128
142
  if (!isTextArea) {
129
143
  options = { type, value, ...options } as any;
144
+ fieldOutput = <ChakraInput {...options} __css={styles.input} />;
145
+ } else {
146
+ fieldOutput = (
147
+ <ChakraTextarea {...options} __css={styles.textarea}>
148
+ {value}
149
+ </ChakraTextarea>
150
+ );
130
151
  }
131
152
 
132
- const fieldOutput = React.createElement(
133
- isTextArea ? "textarea" : "input",
134
- options,
135
- isTextArea ? value : null
136
- );
137
-
138
- const transformedInput = (
139
- <div className="textinput">
153
+ return (
154
+ <Box __css={styles} className={className}>
140
155
  {labelText && showLabel && !isHidden && (
141
- <Label htmlFor={id} optReqFlag={optReqFlag} id={id + `-label`}>
156
+ <Label
157
+ htmlFor={id}
158
+ optReqFlag={showOptReqLabel && optReqFlag}
159
+ id={`${id}-label`}
160
+ >
142
161
  {labelText}
143
162
  </Label>
144
163
  )}
145
164
  {fieldOutput}
146
- {((helperText && !isHidden) || errored) && (
147
- <HelperErrorText isError={errored} id={id + `-helperText`}>
148
- {footnote}
149
- </HelperErrorText>
165
+ {footnote && !isHidden && (
166
+ <Box __css={styles.helper} aria-disabled={isDisabled}>
167
+ <HelperErrorText isError={isInvalid} id={`${id}-helperText`}>
168
+ {footnote}
169
+ </HelperErrorText>
170
+ </Box>
150
171
  )}
151
- </div>
172
+ </Box>
152
173
  );
153
-
154
- return transformedInput;
155
174
  }
156
175
  );
157
176
 
158
- TextInput.displayName = "TextInput";
159
-
160
177
  export default TextInput;
@@ -23,6 +23,12 @@ export enum TextInputFormats {
23
23
  url = "https://domain.com",
24
24
  }
25
25
 
26
+ export enum TextInputVariants {
27
+ Default = "default",
28
+ SearchBar = "searchBar",
29
+ SearchBarSelect = "searchBarSelect",
30
+ }
31
+
26
32
  /*
27
33
  export enum TextInputPatterns {
28
34
  // eslint-disable-next-line prettier/prettier
@@ -11,9 +11,10 @@ import { withDesign } from "storybook-addon-designs";
11
11
  import VideoPlayer from "./VideoPlayer";
12
12
  import { VideoPlayerTypes } from "./VideoPlayerTypes";
13
13
  import { action } from "@storybook/addon-actions";
14
+ import { getCategory } from "../../utils/componentCategories";
14
15
 
15
16
  <Meta
16
- title="VideoPlayer"
17
+ title={getCategory("VideoPlayer")}
17
18
  component={VideoPlayer}
18
19
  decorators={[withDesign]}
19
20
  parameters={{
@@ -2,7 +2,7 @@ import * as React from "react";
2
2
  import bem from "../../utils/bem";
3
3
  import { VideoPlayerAspectRatios, VideoPlayerTypes } from "./VideoPlayerTypes";
4
4
  import Heading from "../Heading/Heading";
5
- // import { HeadingDisplaySizes } from "../Heading/HeadingDisplaySizes";
5
+ import { HeadingLevels } from "../Heading/HeadingTypes";
6
6
  import HelperErrorText from "../HelperErrorText/HelperErrorText";
7
7
 
8
8
  export interface VideoPlayerProps {
@@ -105,7 +105,9 @@ export default function VideoPlayer(
105
105
  <span dangerouslySetInnerHTML={{ __html: errorMessage }} />
106
106
  ) : (
107
107
  <>
108
- {headingText && <Heading level={2} text={headingText} />}
108
+ {headingText && (
109
+ <Heading level={HeadingLevels.Two} text={headingText} />
110
+ )}
109
111
  {descriptionText && <p>{descriptionText}</p>}
110
112
  <div className={bem("video-player__inside", modifiers, "", [])}>
111
113
  {embedCode}
@@ -14,7 +14,7 @@
14
14
  }
15
15
 
16
16
  &--errored {
17
- background-color: var(--ui-gray-warm-light);
17
+ background-color: var(--ui-gray-light-warm);
18
18
  height: auto;
19
19
  padding: var(--space-s);
20
20
  }
@@ -0,0 +1,341 @@
1
+ import { Meta } from "@storybook/addon-docs/blocks";
2
+
3
+ <Meta title="Chakra UI" />
4
+
5
+ # Chakra UI
6
+
7
+ | Table of Contents |
8
+ | ----------------------------------- |
9
+ | 1. [Why Chakra UI?](#why-chakra-ui) |
10
+ | 2. [DSProvider](#dsprovider) |
11
+ | 3. [Components](#components) |
12
+ | 4. [Styling](#styling) |
13
+ | 5. [Testing](#testing) |
14
+
15
+ ## Why Chakra UI?
16
+
17
+ The NYPL Design System (DS) project was influenced by other design systems but
18
+ ultimately we decided to initially build DS components from scratch rather than
19
+ use another design system as its foundation. To better help all the projects at
20
+ NYPL and to better scale with all the components we have built and still need to
21
+ build, we decided to integrate Chakra UI into the NYPL Design System.
22
+
23
+ Chakra UI is an open source component library that is opinionated and uses design
24
+ and development patterns that various projects at NYPL use. Since the NYPL DS
25
+ will be the foundation for all NYPL projects moving forward, using Chakra will
26
+ help us align all projects so similar patterns are used throughout various teams
27
+ and projects.
28
+
29
+ Chakra follows WAI-ARIA and WCAG 2.1 standards and guidelines which aligns with
30
+ the standards that NYPL follows for its own components and applications.
31
+
32
+ With design and development consistency, the ability to customize components
33
+ _if necessary_, and accessibility standards in place, developers at NYPL using
34
+ the Design System will be able to build out applications faster.
35
+
36
+ We recommend to read Chakra's own [documentation](https://chakra-ui.com/docs/getting-started)
37
+ to get up to speed on it. This file will provide information on how it is used
38
+ in the DS but we rely on Chakra's documentation.
39
+
40
+ ## DSProvider
41
+
42
+ While the Chakra UI integration into the DS is a work-in-progress, there is one
43
+ necessary step consuming applications need to take for component styles to
44
+ properly render. Consuming applications need to wrap all the DS components with
45
+ a simple provider component. Fortunately, this only needs to be done once at
46
+ the top level of the consuming application.
47
+
48
+ Once the following is completed, DS components that internally use Chakra UI
49
+ will render styles properly. Internally, the `DSProvider` is built on top of
50
+ Chakra's `ChakraProvider` with NYPL's custom theme.
51
+
52
+ ```jsx
53
+ // your main application file
54
+ import { DSProvider } from "@nypl/design-system-react-components";
55
+
56
+ // ...
57
+ const Application = (props) => {
58
+ // ...
59
+ return (
60
+ <DSProvider>
61
+ <header>...</header>
62
+ <div className="my-app nypl-ds">
63
+ // ...
64
+ {children}
65
+ </div>
66
+ <footer>...</footer>
67
+ </DSProvider>
68
+ );
69
+ };
70
+ ```
71
+
72
+ ### Chakra Components in Storybook
73
+
74
+ Storybook is configured to use the `DSProvider` so that components can render
75
+ appropriately. Unfortunately, this only works within the `Story` component.
76
+ When rendering components in documentation examples within a `Canvas` component,
77
+ wrap the elements in the `DSProvider` component.
78
+
79
+ ```jsx
80
+ // These buttons are not a part of a "story" but still appear only
81
+ // in the documentation.
82
+ <Canvas>
83
+ <DSProvider>
84
+ <ButtonGroup>
85
+ <Button disabled={false}>Enabled</Button>
86
+ <Button disabled={true}>Disabled</Button>
87
+ </ButtonGroup>
88
+ </DSProvider>
89
+ </Canvas>
90
+ ```
91
+
92
+ ## Components
93
+
94
+ The current work-in-progress is to use Chakra components to compose DS
95
+ components that align directly or to compose DS-specific components with Chakra.
96
+ For example, both the DS and Chakra have a `Button` component so we will use
97
+ Chakra's `Button` component to compose the DS `Button` component. However, the
98
+ DS has a `Hero` component that is not already built by Chakra. In this case,
99
+ the DS `Hero` component will internally use `Chakra` components.
100
+
101
+ ### Components Composed with Chakra
102
+
103
+ While we can directly use Chakra components that align with DS components, we
104
+ want to compose DS components using the Chakra component as a base instead. This
105
+ pattern allows the Design System to have control over props and standard styles.
106
+
107
+ These components composed from Chakra, therefore, do not have all styled props
108
+ available. For example, whereas `m` (`margin`), `mr` (`marginright`), and similar
109
+ props can be used in Chakra components, those props are not available for DS
110
+ components that internally are composed with Chakra components.
111
+
112
+ Components built from Chakra rename the component with the `Chakra` name prefix.
113
+
114
+ ```jsx
115
+ import { Tabs as ChakraTabs, useStyleConfig } from "@chakra-ui/react";
116
+ ```
117
+
118
+ In this example, the `ChakraTabs` component is returned with NYPL specific
119
+ functionality, styles, and other requirements.
120
+
121
+ ```jsx
122
+ function Tabs(props) {
123
+ // ...
124
+ const styles = useStyleConfig("Tabs", { variant: props.tabsType });
125
+
126
+ return (
127
+ <ChakraTabs
128
+ id={id}
129
+ __css={styles}
130
+ // ... other props
131
+ >
132
+ {children}
133
+ </ChakraTabs>
134
+ }
135
+ ```
136
+
137
+ #### Patterns
138
+
139
+ The NYPL DS uses the [CSS BEM](http://getbem.com/introduction/) pattern to structure
140
+ and write CSS. We are moving away from this and re-writing SCSS classes into
141
+ Javascript objects that work with Chakra's theme. Instead of creating a variant
142
+ for a component with a class name, now the `type` prop is used. Internally, the
143
+ `type` prop will be mapped to a Chakra theme variant that will provide all the
144
+ necessary styles.
145
+
146
+ For the `Button` component, for example, we would convert a SCSS class rule such
147
+ as `.button-outline` to a Javascript object (more on this in the [Anatomy of a
148
+ Component Styling Object](#anatomy-of-a-component-styling-object) section).
149
+
150
+ ### Components re-exported from Chakra
151
+
152
+ Some components are directly exported from Chakra. These components can be found
153
+ in the `/src/index.ts` file. Note that not _all_ Chakra components are re-exported
154
+ because we want to limit what developers should use in consuming applications.
155
+
156
+ Note: These components are harder to have snapshot tests for because, internally,
157
+ these components autogenerate ids and class names on every new render. We can't
158
+ override them so snapshot tests will fail.
159
+
160
+ ## Styling
161
+
162
+ As mentioned in the [Components composed with Chakra](#components-composed-with-chakra)
163
+ section, we are moving away from using the BEM structure to using Javascript objects
164
+ to extend Chakra's theme.
165
+
166
+ The NYPL DS' theme file can be found at `src/theme/index.ts`. This creates a new
167
+ theme that extends Chakra's theme and is set in the `DSProvider` component. Note
168
+ that the example below is the general structure of the `theme` object but the DS
169
+ `theme` object has values already set so it may look different. You would generally
170
+ only work and add new object values in the `components` attribute for new
171
+ components and their theme or variants.
172
+
173
+ ```jsx
174
+ const theme = extendTheme({
175
+ styles: { ... },
176
+ breakpoints: { ... },
177
+ colors: { ... },
178
+ typography: { ... },
179
+ space: { ... },
180
+ components: {
181
+ Button,
182
+ // ...
183
+ },
184
+ });
185
+ ```
186
+
187
+ ### Anatomy of a Component Styling Object
188
+
189
+ For in-depth information, read Chakra's [Component Style documentation](https://chakra-ui.com/docs/theming/component-style).
190
+
191
+ Component theme files can be found in the `src/theme/components/` directory.
192
+ Here is an example using the `Button` component.
193
+
194
+ ```jsx
195
+ // The basic structure for all component style objects.
196
+ const Button = {
197
+ baseStyle: {},
198
+ sizes: {},
199
+ variants: {},
200
+ defaultProps: {},
201
+ };
202
+ ```
203
+
204
+ A current variant class rule can be converted to a Javascript object and go in
205
+ the `variants` object as in the following example.
206
+
207
+ ```jsx
208
+ // Button.scss
209
+ // This is the "Secondary" variant.
210
+ .button--outline {
211
+ @include button-base;
212
+
213
+ background-color: var(--ui-white);
214
+ border: 1px solid var(--ui-gray-light-cool);
215
+ color: inherit;
216
+
217
+ &:hover {
218
+ background-color: var(--ui-gray-xx-light-cool);
219
+ }
220
+ }
221
+
222
+ // Button.ts
223
+ const Button = {
224
+ baseStyles: { ... },
225
+ sizes: { ... },
226
+ variants: {
227
+ secondary: {
228
+ bg: "ui.white",
229
+ border: "1px solid",
230
+ borderColor: "ui.gray.light-cool",
231
+ color: "inherit",
232
+ _hover: {
233
+ bg: "ui.gray.xx-light-cool",
234
+ },
235
+ },
236
+ // ... other variants,
237
+ },
238
+ defaultProps: { ... },
239
+ };
240
+ ```
241
+
242
+ Now this variant can be rendered:
243
+
244
+ ```jsx
245
+ <Button buttonType={ButtonTypes.Secondary}>Press me</Button>
246
+ ```
247
+
248
+ ### Breakpoints
249
+
250
+ TODO:
251
+
252
+ ### Colors
253
+
254
+ All available colors can be found in `src/theme/foundations/colors.ts`. Chakra
255
+ autogenerates the `colors` object into CSS variables. We will rely on these
256
+ variables rather than creating our own.
257
+
258
+ ```jsx
259
+ const colors: Colors = {
260
+ // ui fills
261
+ ui: {
262
+ /// State and link utilities
263
+ focus: "#4181F1",
264
+ link: {
265
+ primary: "#0576D3",
266
+ secondary: "#004B98",
267
+ },
268
+ // ...
269
+ },
270
+ section: {
271
+ /** What's On is used for Exhibitions & Events. */
272
+ "whats-on": {
273
+ primary: "#242424",
274
+ secondary: "#000000",
275
+ },
276
+ },
277
+ // ...
278
+ };
279
+ ```
280
+
281
+ In the shorten object example above, the following will be generated by Chakra:
282
+
283
+ | Theme object value | CSS variable |
284
+ | -------------------------------------- | -------------------------------------------- |
285
+ | `colors.ui.focus` | `--chakra-colors-ui-focus` |
286
+ | `colors.ui.link.primary` | `--chakra-colors-ui-link-primary` |
287
+ | `colors.ui.link.secondary` | `--chakra-colors-ui-link-secondary` |
288
+ | `colors.section["whats-on"].primary` | `--chakra-colors-section-whats-on-primary` |
289
+ | `colors.section["whats-on"].secondary` | `--chakra-colors-section-whats-on-secondary` |
290
+
291
+ The current prefix is `--chakra` but we expect to update that soon. DS specified
292
+ CSS variables are still exported but we will remove those in favor of the CSS
293
+ variables provided by Chakra for ease of use.
294
+
295
+ Note: while each Chakra color has number range values from 50 to 900 (such as
296
+ `red.400`, `blue.600`, etc) and each one is based on the color coming from
297
+ DS' Figma documentation, we recommend NOT to use them.
298
+
299
+ ### Spacing
300
+
301
+ All the spacing values can be found in the `src/theme/foundations/spacing.ts`
302
+ file. While Chakra provides many values, only use the eight DS defined values.
303
+
304
+ | Chakra Value | DS Variable |
305
+ | ------------ | ----------- |
306
+ | 1 | --space-xxs |
307
+ | 2 | --space-xs |
308
+ | 4 | --space-s |
309
+ | 6 | --space-m |
310
+ | 8 | --space-l |
311
+ | 12 | --space-xl |
312
+ | 16 | --space-xxl |
313
+ | 24 | --space-xxl |
314
+
315
+ For example, to make all `button`s have a `padding: 8px 16px` value:
316
+
317
+ ```jsx
318
+ // src/theme/components/button.ts
319
+ const Button = {
320
+ baseStyle: {
321
+ py: 2, // var(--space-xs) which results in a value of 8px or 0.5rem
322
+ px: 4, // var(--space-s) which results in a value of 16px or 1rem
323
+ // ... other styles
324
+ },
325
+ sizes: { ... },
326
+ variants: { ... },
327
+ defaultProps: { ... },
328
+ };
329
+ ```
330
+
331
+ ### Typography
332
+
333
+ All typography values can be found in the `src/theme/foundations/typography.ts`
334
+ file. These values declare the font family, font sizes, and font weights to use
335
+ for all text.
336
+
337
+ ## Testing
338
+
339
+ Do not re-test Chakra components that are re-exported since they are already
340
+ tested in the `@chakra-ui/react` package. We do expect all new components composed
341
+ from Chakra to have tests for functionality and styling (such as snapshots).