@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,69 +1,174 @@
1
1
  import * as React from "react";
2
- import bem from "../../utils/bem";
2
+ import { Box, useMultiStyleConfig } from "@chakra-ui/react";
3
+
4
+ import generateUUID from "../../helpers/generateUUID";
5
+ import Select from "../Select/Select";
6
+ import TextInput from "../TextInput/TextInput";
7
+ import { TextInputTypes, TextInputVariants } from "../TextInput/TextInputTypes";
8
+ import Button from "../Button/Button";
9
+ import { ButtonTypes } from "../Button/ButtonTypes";
10
+ import Icon from "../Icons/Icon";
11
+ import { IconAlign, IconNames, IconSizes } from "../Icons/IconTypes";
12
+ import HelperErrorText from "../HelperErrorText/HelperErrorText";
13
+ import { SelectTypes } from "../Select/SelectTypes";
14
+
15
+ // Internal interfaces that are used only for `SearchBar` props.
16
+ interface SelectProps {
17
+ labelText: string;
18
+ name: string;
19
+ optionsData: string[];
20
+ }
21
+ interface TextInputProps {
22
+ labelText: string;
23
+ placeholder: string;
24
+ }
3
25
 
4
26
  export interface SearchBarProps {
5
- /** Populates aria-label on the form;
6
- * defines a hidden string that labels
7
- * the SearchBar
8
- */
9
- ariaLabel?: string;
10
- /** Populates aria-labelledby on the form;
11
- * defines a visible string that labels
12
- * the SearchBar
13
- */
14
- ariaLabelledBy?: string;
15
- /** Additional attributes passed to the form */
16
- attributes?: { [key: string]: any };
17
- /** BlockName for use with BEM. See how to work with modifiers and BEM here: http://getbem.com/introduction/ */
18
- blockName?: string;
19
- /** ClassName that appears in addition to "search-bar" */
20
- className?: string;
21
- /** Adds 'method' property to the form */
22
- method?: string;
23
- /** Adds 'action' property to the form */
27
+ /** Adds 'action' property to the `form` element. */
24
28
  action?: string;
29
+ /** The onClick callback function for the `Button` component. */
30
+ buttonOnClick?: (event: React.MouseEvent | React.KeyboardEvent) => void;
31
+ /** A class name for the `form` element. */
32
+ className?: string;
33
+ /** The text to display below the form in a `HelperErrorText` component. */
34
+ helperErrorText?: string;
25
35
  /** ID that other components can cross reference for accessibility purposes */
26
36
  id?: string;
27
- /** Modifiers array for use with BEM. See how to work with modifiers and BEM here: http://getbem.com/introduction/ */
28
- modifiers?: string[];
29
- /** Handler on form submit */
37
+ /** Optional string to populate the `HelperErrorText` for the error state
38
+ * when `isInvalid` is true. */
39
+ invalidText?: string;
40
+ /** Sets children form components in the disabled state. */
41
+ isDisabled?: boolean;
42
+ /** Sets children form components in the error state. */
43
+ isInvalid?: boolean;
44
+ /** Sets children form components in the required state. */
45
+ isRequired?: boolean;
46
+ /** Populates the `aria-label` attribute on the form element. */
47
+ labelText: string;
48
+ /** Adds 'method' property to the `form` element. */
49
+ method?: string;
50
+ /** Handler function when the form is submitted. */
30
51
  onSubmit: (event: React.FormEvent) => void;
52
+ /** Required props to render a `Select` element. */
53
+ selectProps?: SelectProps | undefined;
54
+ /** Will be used to visually display the label text for this
55
+ * `SearchBar` component. False by default. */
56
+ showLabel?: boolean;
57
+ /** Custom input element to render instead of a `TextInput` element. */
58
+ textInputElement?: JSX.Element;
59
+ /** Required props to render a `TextInput` element. */
60
+ textInputProps?: TextInputProps | undefined;
31
61
  }
32
62
 
33
- /** Renders a wrapper `form` element to be used with `Select` (optional),
34
- * `Input`, and `Button` components together. */
35
- export default function SearchBar(
36
- props: React.PropsWithChildren<SearchBarProps>
37
- ) {
63
+ /**
64
+ * Renders a wrapper `form` element to be used with `Select` (optional),
65
+ * `Input`, and `Button` components together.
66
+ */
67
+ export default function SearchBar(props: SearchBarProps) {
38
68
  const {
39
- ariaLabel,
40
- ariaLabelledBy,
41
- blockName,
42
- children,
69
+ action,
70
+ buttonOnClick = null,
43
71
  className,
44
- id,
45
- modifiers = [],
46
- onSubmit,
47
- attributes,
72
+ helperErrorText,
73
+ id = generateUUID(),
74
+ invalidText,
75
+ isDisabled = false,
76
+ isInvalid = false,
77
+ isRequired = false,
78
+ labelText,
48
79
  method,
49
- action,
80
+ onSubmit,
81
+ selectProps,
82
+ textInputElement,
83
+ textInputProps,
50
84
  } = props;
51
-
52
- const baseClass = "search-bar";
85
+ const styles = useMultiStyleConfig("SearchBar", { hasSelect: selectProps });
86
+ const stateProps = { isDisabled, isInvalid, isRequired };
87
+ const helperErrorTextID = generateUUID();
88
+ const ariaDescribedby = helperErrorTextID;
89
+ const footnote = isInvalid ? invalidText : helperErrorText;
90
+ const finalAriaLabel = footnote ? `${labelText} - ${footnote}` : labelText;
91
+ // Render the `Select` component.
92
+ const selectElem = selectProps && (
93
+ <Select
94
+ id={generateUUID()}
95
+ name={selectProps?.name}
96
+ labelText={selectProps?.labelText}
97
+ showLabel={false}
98
+ helperText=""
99
+ type={SelectTypes.SearchBar}
100
+ {...stateProps}
101
+ >
102
+ {selectProps?.optionsData.map((option) => (
103
+ <option key={option} value={option}>
104
+ {option}
105
+ </option>
106
+ ))}
107
+ </Select>
108
+ );
109
+ // Render the `TextInput` component.
110
+ const textInputNative = textInputProps && (
111
+ <TextInput
112
+ id={generateUUID()}
113
+ labelText={textInputProps?.labelText}
114
+ placeholder={textInputProps?.placeholder}
115
+ type={TextInputTypes.text}
116
+ variantType={
117
+ selectElem
118
+ ? TextInputVariants.SearchBarSelect
119
+ : TextInputVariants.SearchBar
120
+ }
121
+ helperText=""
122
+ showLabel={false}
123
+ {...stateProps}
124
+ />
125
+ );
126
+ // Render the `Button` component.
127
+ const buttonElem = (
128
+ <Button
129
+ id={generateUUID()}
130
+ buttonType={ButtonTypes.SearchBar}
131
+ type="submit"
132
+ onClick={buttonOnClick}
133
+ disabled={isDisabled}
134
+ >
135
+ <Icon
136
+ name={IconNames.Search}
137
+ size={IconSizes.Small}
138
+ align={IconAlign.Left}
139
+ />
140
+ Search
141
+ </Button>
142
+ );
143
+ // Render the `HelperErrorText` component.
144
+ const helperErrorTextElem = footnote && (
145
+ <HelperErrorText id={helperErrorTextID} isError={isInvalid}>
146
+ {footnote}
147
+ </HelperErrorText>
148
+ );
149
+ // If a custom input element was passed, use that instead of the
150
+ // `TextInput` component.
151
+ const textInputElem = textInputElement || textInputNative;
53
152
 
54
153
  return (
55
- <form
56
- className={bem(baseClass, modifiers, blockName, [className])}
154
+ <Box
155
+ as="form"
57
156
  id={id}
157
+ className={className}
58
158
  role="search"
59
- aria-label={ariaLabel}
60
- aria-labelledby={ariaLabelledBy}
159
+ aria-label={finalAriaLabel}
160
+ aria-describedby={ariaDescribedby}
61
161
  onSubmit={onSubmit}
62
162
  method={method}
63
163
  action={action}
64
- {...attributes}
164
+ __css={styles}
65
165
  >
66
- {children}
67
- </form>
166
+ <Box __css={styles.topRow}>
167
+ {selectElem}
168
+ {textInputElem}
169
+ {buttonElem}
170
+ </Box>
171
+ {helperErrorTextElem}
172
+ </Box>
68
173
  );
69
174
  }
@@ -3,16 +3,14 @@ import {
3
3
  Story,
4
4
  Canvas,
5
5
  ArgsTable,
6
- Preview,
7
6
  Description,
8
7
  } from "@storybook/addon-docs/blocks";
9
8
  import { withDesign } from "storybook-addon-designs";
10
9
 
10
+ import { VStack } from "@chakra-ui/react";
11
11
  import Select from "./Select";
12
- import Label from "../Label/Label";
13
- import HelperErrorText from "../HelperErrorText/HelperErrorText";
14
- import { action } from "@storybook/addon-actions";
15
12
  import { getCategory } from "../../utils/componentCategories";
13
+ import DSProvider from "../../theme/provider";
16
14
 
17
15
  <Meta
18
16
  title={getCategory("Select")}
@@ -27,203 +25,230 @@ import { getCategory } from "../../utils/componentCategories";
27
25
  jest: ["Select.test.tsx"],
28
26
  }}
29
27
  argTypes={{
30
- blockName: { table: { disable: true } },
31
- className: { table: { disable: true } },
32
- modifiers: { table: { disable: true } },
33
- attributes: { table: { disable: true } },
28
+ children: { table: { disable: true } },
29
+ id: { table: { disable: true } },
30
+ name: { table: { disable: true } },
31
+ onChange: { table: { disable: true } },
32
+ value: { table: { disable: true } },
34
33
  }}
35
34
  />
36
35
 
37
36
  # Select
38
37
 
39
- <Description of={Select} />
38
+ | Component Version | DS Version |
39
+ | ----------------- | ---------- |
40
+ | Added | `0.7.0` |
41
+ | Latest | `0.25.1` |
40
42
 
41
- The `Select` component renders a `select` element along with its `option` children. For optimal accessibility, the `labelText` property is a required prop, regardless of the label visibility. Additionally, while the `id` prop is optional, a unique `id` attribute is necessary for accessibility. If the prop is left blank, a value will be generated for you.
43
+ <Description of={Select} />
42
44
 
43
- <Preview withToolbar>
45
+ The `Select` component renders a `select` element along with its `option`
46
+ children. For optimal accessibility, the `labelText` property is a required
47
+ prop, regardless of the label visibility. Additionally, while the `id` prop is
48
+ optional, a unique `id` attribute is necessary for accessibility. If the prop
49
+ is left blank, a value will be generated for you.
50
+
51
+ The `Select` component renders all the necessary wrapping and associated text
52
+ elements, but the select options _need_ to be child `<option>` HTML elements.
53
+
54
+ ```jsx
55
+ <Select labelText="What is your favorite color?" name="color">
56
+ <option value="red">Red</option>
57
+ <option value="green">Green</option>
58
+ <option value="blue">Blue</option>
59
+ <option value="black">Black</option>
60
+ <option value="white">White</option>
61
+ </Select>
62
+ ```
63
+
64
+ <Canvas withToolbar>
44
65
  <Story
45
66
  name="Select"
46
67
  args={{
47
- id: "mySelect",
68
+ helperText: "This is the helper text.",
69
+ invalidText: "This is the error text :(",
70
+ isDisabled: false,
71
+ isInvalid: false,
72
+ isRequired: false,
48
73
  labelText: "What is your favorite color?",
74
+ name: "color",
49
75
  showLabel: true,
50
- helperText: "Choose wisely.",
51
- errorText: "Waaaaaaaa!",
52
- errored: false,
53
- required: true,
54
- disabled: false,
55
- selectedOption: "Green",
56
- attributes: {
57
- onFocus: action("focus"),
58
- onBlur: action("blur"),
59
- onChange: action("onChange"),
60
- },
61
- }}
62
- argTypes={{
63
- ariaLabel: { table: { disable: true } },
64
- helperTextId: { table: { disable: true } },
65
- isRequired: { table: { disable: true } },
66
- labelId: { table: { disable: true } },
76
+ showOptReqLabel: true,
67
77
  }}
68
78
  >
69
79
  {(args) => (
70
80
  <Select {...args}>
71
- <option aria-selected={true}></option>
72
- <option aria-selected={false}>Red</option>
73
- <option aria-selected={false}>Green</option>
74
- <option aria-selected={false}>Blue</option>
75
- <option aria-selected={false}>Black</option>
76
- <option aria-selected={false}>White</option>
81
+ <option value="red">Red</option>
82
+ <option value="green">Green</option>
83
+ <option value="blue">Blue</option>
84
+ <option value="black">Black</option>
85
+ <option value="white">White</option>
77
86
  </Select>
78
87
  )}
79
88
  </Story>
80
- </Preview>
89
+ </Canvas>
81
90
 
82
91
  <ArgsTable story="Select" />
83
92
 
84
- ### Deprecated Props
85
-
86
- The following props have been deprecated: `ariaLabel`, `helperTextId`, `isRequired` and `labelId`. They are still available to use, but they will be removed in a future release.
87
-
88
93
  ## Labelling Variations
89
94
 
90
- A Select can be rendered with or without visible labels. When `showLabel` is set to `false`, an `aria-label` attribute is added to the select input to maintain accessibility.
91
-
92
- <Preview>
93
- <Story
94
- name="Labelling Variations"
95
- args={{
96
- labelText: "What is your favorite color?",
97
- showLabel: false,
98
- }}
99
- >
100
- {(args) => (
101
- <>
102
- <Select {...args}>
103
- <option aria-selected={true}></option>
104
- <option aria-selected={false}>Red</option>
105
- <option aria-selected={false}>Green</option>
106
- <option aria-selected={false}>Blue</option>
107
- <option aria-selected={false}>Black</option>
108
- <option aria-selected={false}>White</option>
109
- </Select>
110
- </>
111
- )}
112
- </Story>
113
- </Preview>
95
+ A Select can be rendered with or without a visible label. When `showLabel` is
96
+ set to `false`, an `aria-label` attribute is added to the select input to
97
+ maintain accessibility. If the component needs to be required, the
98
+ `showOptReqLabel` prop can be used to show or hide the "Required"/"Optional"
99
+ text within the `label` element.
114
100
 
115
101
  <Canvas>
116
- <Select labelText="What is your favorite color?" showLabel={true}>
117
- <option aria-selected={true}></option>
118
- <option aria-selected={false}>Red</option>
119
- <option aria-selected={false}>Green</option>
120
- <option aria-selected={false}>Blue</option>
121
- <option aria-selected={false}>Black</option>
122
- <option aria-selected={false}>White</option>
123
- </Select>
102
+ <Story name="Labelling Variations">
103
+ <VStack align="stretch" spacing={8}>
104
+ <Select
105
+ labelText="What is your favorite color?"
106
+ helperText="Display the label"
107
+ name="color"
108
+ >
109
+ <option value="red">Red</option>
110
+ <option value="green">Green</option>
111
+ <option value="blue">Blue</option>
112
+ <option value="black">Black</option>
113
+ <option value="white">White</option>
114
+ </Select>
115
+ <Select
116
+ labelText="What is your favorite color?"
117
+ helperText="Do not display the label"
118
+ name="color"
119
+ showLabel={false}
120
+ >
121
+ <option value="red">Red</option>
122
+ <option value="green">Green</option>
123
+ <option value="blue">Blue</option>
124
+ <option value="black">Black</option>
125
+ <option value="white">White</option>
126
+ </Select>
127
+ <Select
128
+ labelText="What is your favorite color?"
129
+ helperText="Display the Required/Optional text"
130
+ name="color"
131
+ isRequired
132
+ >
133
+ <option value="red">Red</option>
134
+ <option value="green">Green</option>
135
+ <option value="blue">Blue</option>
136
+ <option value="black">Black</option>
137
+ <option value="white">White</option>
138
+ </Select>
139
+ <Select
140
+ labelText="What is your favorite color?"
141
+ helperText="Do not display the Required/Optional text"
142
+ name="color"
143
+ showOptReqLabel={false}
144
+ isRequired
145
+ >
146
+ <option value="red">Red</option>
147
+ <option value="green">Green</option>
148
+ <option value="blue">Blue</option>
149
+ <option value="black">Black</option>
150
+ <option value="white">White</option>
151
+ </Select>
152
+ </VStack>
153
+ </Story>
124
154
  </Canvas>
125
155
 
126
- <Canvas>
127
- <Select
128
- labelText="What is your favorite color?"
129
- showLabel={false}
130
- helperText="Choose wisely!"
131
- >
132
- <option aria-selected={true}></option>
133
- <option aria-selected={false}>Red</option>
134
- <option aria-selected={false}>Green</option>
135
- <option aria-selected={false}>Blue</option>
136
- <option aria-selected={false}>Black</option>
137
- <option aria-selected={false}>White</option>
138
- </Select>
139
- </Canvas>
156
+ ## Errored
140
157
 
141
158
  <Canvas>
142
- <Select
143
- labelText="What is your favorite color?"
144
- showLabel={true}
145
- helperText="Choose wisely!"
146
- >
147
- <option aria-selected={true}></option>
148
- <option aria-selected={false}>Red</option>
149
- <option aria-selected={false}>Green</option>
150
- <option aria-selected={false}>Blue</option>
151
- <option aria-selected={false}>Black</option>
152
- <option aria-selected={false}>White</option>
153
- </Select>
159
+ <DSProvider>
160
+ <Select
161
+ labelText="What is your favorite color?"
162
+ helperText="This is the helper text."
163
+ invalidText="This is the error text :("
164
+ name="color"
165
+ isInvalid
166
+ >
167
+ <option value="red">Red</option>
168
+ <option value="green">Green</option>
169
+ <option value="blue">Blue</option>
170
+ <option value="black">Black</option>
171
+ <option value="white">White</option>
172
+ </Select>
173
+ </DSProvider>
154
174
  </Canvas>
155
175
 
156
- <Canvas>
157
- <Select
158
- labelText="What is your favorite color?"
159
- showLabel={false}
160
- helperText="Choose wisely!"
161
- errorText="Waaaaaa!"
162
- errored={true}
163
- >
164
- <option aria-selected={true}></option>
165
- <option aria-selected={false}>Red</option>
166
- <option aria-selected={false}>Green</option>
167
- <option aria-selected={false}>Blue</option>
168
- <option aria-selected={false}>Black</option>
169
- <option aria-selected={false}>White</option>
170
- </Select>
171
- </Canvas>
176
+ ## Disabled
172
177
 
173
178
  <Canvas>
174
- <Select
175
- labelText="What is your favorite color?"
176
- showLabel={true}
177
- helperText="Choose wisely!"
178
- errorText="Waaaaaa!"
179
- errored={true}
180
- >
181
- <option aria-selected={true}></option>
182
- <option aria-selected={false}>Red</option>
183
- <option aria-selected={false}>Green</option>
184
- <option aria-selected={false}>Blue</option>
185
- <option aria-selected={false}>Black</option>
186
- <option aria-selected={false}>White</option>
187
- </Select>
179
+ <DSProvider>
180
+ <Select
181
+ labelText="What is your favorite color?"
182
+ helperText="This is the helper text."
183
+ invalidText="This is the error text :("
184
+ name="color"
185
+ isDisabled
186
+ >
187
+ <option value="red">Red</option>
188
+ <option value="green">Green</option>
189
+ <option value="blue">Blue</option>
190
+ <option value="black">Black</option>
191
+ <option value="white">White</option>
192
+ </Select>
193
+ </DSProvider>
188
194
  </Canvas>
189
195
 
190
- ## Deprecated Implementation
191
-
192
- The `ariaLabel`, `helperTextId`, `isRequired` and `labelId` have been deprecated, but they are still available to use until they are removed in a future release. The code below uses all four deprecated props in conjunction with the `Label` and `HelperErrorText` components to render a fully functional and accessible select input.
193
-
194
- <Preview withToolbar>
195
- <Story
196
- name="Deprecated Implementation"
197
- args={{
198
- labelText: "What is your favorite color?",
199
- showLabel: false,
200
- }}
201
- >
202
- {(args) => (
203
- <>
204
- <Label htmlFor="select" optReqFlag="Required" id={"label"}>
205
- Fruit on your island
206
- </Label>
207
- <Select
208
- name="optionalLabelSelect"
209
- id={"select"}
210
- isRequired={false}
211
- ariaLabel="Select Label"
212
- labelId={"label"}
213
- helperTextId={"helperText"}
214
- selectedOption="Option Three"
215
- >
216
- <option aria-selected={true}>Option One</option>
217
- <option aria-selected={false}>Option Two</option>
218
- <option aria-selected={false}>Option Three</option>
219
- <option aria-selected={false}>Option Four</option>
220
- <option aria-selected={false}>Option Five</option>
221
- </Select>
222
- <HelperErrorText isError={false} id={"helperText"}>
223
- Once you pick a fruit for your island it cannot be changed, so choose
224
- wisely!
225
- </HelperErrorText>
226
- </>
227
- )}
228
- </Story>
229
- </Preview>
196
+ ## Getting Select Data Value
197
+
198
+ ### Controlled Component using `value` and `onChange` props
199
+
200
+ If your application uses controlled React components and the DS `Select`
201
+ component must be controlled, you can control and extract the data through the
202
+ `value` and `onChange` props. This will be called every time a new `option`
203
+ value is selected.
204
+
205
+ ```jsx
206
+ const value = "red";
207
+ const onChange = (e) => {
208
+ // This will return the value selected through the event object.
209
+ console.log(e.target.value);
210
+ };
211
+ // ...
212
+
213
+ <Select
214
+ labelText="What is your favorite color?"
215
+ helperText="This is the helper text."
216
+ name="color"
217
+ value={value}
218
+ onChange={onChange}
219
+ >
220
+ <option value="red">Red</option>
221
+ <option value="green">Green</option>
222
+ <option value="blue">Blue</option>
223
+ <option value="black">Black</option>
224
+ <option value="white">White</option>
225
+ </Select>;
226
+ ```
227
+
228
+ ### Uncontrolled Component using `ref`s
229
+
230
+ If your application uses uncontrolled components, you can pass a React `ref`
231
+ prop to the DS Select component to get the selected value from the DOM.
232
+
233
+ ```jsx
234
+ const selectRef = React.createRef<HTMLSelectElement>();
235
+ // ...
236
+ <Select
237
+ labelText="What is your favorite color?"
238
+ helperText="This is the helper text."
239
+ name="color"
240
+ >
241
+ <option value="red">Red</option>
242
+ <option value="green">Green</option>
243
+ <option value="blue">Blue</option>
244
+ <option value="black">Black</option>
245
+ <option value="white">White</option>
246
+ </Select>
247
+
248
+ // ...
249
+ // Get the value through:
250
+ const onSubmit = () => {
251
+ // ...
252
+ const selectValue = selectRef.current.value;
253
+ };
254
+ ```