@nypl/design-system-react-components 0.25.13 → 0.27.0

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 (305) hide show
  1. package/CHANGELOG.md +85 -0
  2. package/README.md +10 -10
  3. package/dist/components/Accordion/Accordion.d.ts +1 -1
  4. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +1 -1
  5. package/dist/components/Button/Button.d.ts +2 -2
  6. package/dist/components/Card/Card.d.ts +11 -9
  7. package/dist/components/Checkbox/Checkbox.d.ts +2 -2
  8. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +5 -4
  9. package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +1 -1
  10. package/dist/components/DatePicker/DatePicker.d.ts +5 -6
  11. package/dist/components/Fieldset/Fieldset.d.ts +5 -6
  12. package/dist/components/Form/Form.d.ts +6 -6
  13. package/dist/components/Grid/GridTypes.d.ts +7 -7
  14. package/dist/components/Grid/SimpleGrid.d.ts +1 -1
  15. package/dist/components/Heading/Heading.d.ts +1 -1
  16. package/dist/components/HelperErrorText/HelperErrorText.d.ts +9 -8
  17. package/dist/components/Hero/Hero.d.ts +2 -1
  18. package/dist/components/HorizontalRule/HorizontalRule.d.ts +2 -10
  19. package/dist/components/Icons/Icon.d.ts +2 -1
  20. package/dist/components/Image/Image.d.ts +2 -2
  21. package/dist/components/Label/Label.d.ts +7 -4
  22. package/dist/components/Link/Link.d.ts +1 -1
  23. package/dist/components/List/List.d.ts +11 -11
  24. package/dist/components/List/ListTypes.d.ts +1 -1
  25. package/dist/components/Logo/Logo.d.ts +2 -1
  26. package/dist/components/Logo/LogoSvgs.d.ts +2 -0
  27. package/dist/components/Logo/LogoTypes.d.ts +2 -0
  28. package/dist/components/Modal/Modal.d.ts +28 -8
  29. package/dist/components/Notification/Notification.d.ts +4 -4
  30. package/dist/components/Pagination/Pagination.d.ts +2 -2
  31. package/dist/components/ProgressIndicator/ProgressIndicator.d.ts +3 -3
  32. package/dist/components/Radio/Radio.d.ts +4 -6
  33. package/dist/components/RadioGroup/RadioGroup.d.ts +12 -6
  34. package/dist/components/SearchBar/SearchBar.d.ts +4 -4
  35. package/dist/components/Select/Select.d.ts +10 -6
  36. package/dist/components/Select/SelectTypes.d.ts +4 -0
  37. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +4 -3
  38. package/dist/components/Slider/Slider.d.ts +6 -4
  39. package/dist/components/StatusBadge/StatusBadge.d.ts +5 -1
  40. package/dist/components/StructuredContent/StructuredContent.d.ts +2 -2
  41. package/dist/components/Table/Table.d.ts +1 -1
  42. package/dist/components/Tabs/Tabs.d.ts +4 -3
  43. package/dist/components/Template/Template.d.ts +4 -3
  44. package/dist/components/Text/Text.d.ts +1 -1
  45. package/dist/components/TextInput/TextInput.d.ts +5 -5
  46. package/dist/components/Toggle/Toggle.d.ts +3 -4
  47. package/dist/components/VideoPlayer/VideoPlayer.d.ts +2 -1
  48. package/dist/design-system-react-components.cjs.development.js +1767 -1180
  49. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  50. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  51. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  52. package/dist/design-system-react-components.esm.js +1774 -1188
  53. package/dist/design-system-react-components.esm.js.map +1 -1
  54. package/dist/hooks/useCarouselStyles.d.ts +3 -2
  55. package/dist/hooks/useNYPLTheme.d.ts +12 -0
  56. package/dist/index.d.ts +5 -2
  57. package/dist/styles.css +1 -1
  58. package/dist/theme/components/button.d.ts +10 -2
  59. package/dist/theme/components/card.d.ts +42 -22
  60. package/dist/theme/components/checkbox.d.ts +5 -4
  61. package/dist/theme/components/checkboxGroup.d.ts +1 -1
  62. package/dist/theme/components/componentWrapper.d.ts +2 -2
  63. package/dist/theme/components/customTable.d.ts +84 -1
  64. package/dist/theme/components/fieldset.d.ts +4 -14
  65. package/dist/theme/components/global.d.ts +23 -17
  66. package/dist/theme/components/heading.d.ts +53 -0
  67. package/dist/theme/components/helperErrorText.d.ts +1 -0
  68. package/dist/theme/components/hero.d.ts +20 -14
  69. package/dist/theme/components/label.d.ts +9 -10
  70. package/dist/theme/components/list.d.ts +99 -9
  71. package/dist/theme/components/radio.d.ts +6 -4
  72. package/dist/theme/components/radioGroup.d.ts +1 -1
  73. package/dist/theme/components/select.d.ts +28 -5
  74. package/dist/theme/components/skeletonLoader.d.ts +2 -2
  75. package/dist/theme/components/slider.d.ts +6 -3
  76. package/dist/theme/components/structuredContent.d.ts +197 -0
  77. package/dist/theme/components/textInput.d.ts +18 -6
  78. package/dist/theme/components/toggle.d.ts +7 -4
  79. package/dist/theme/foundations/global.d.ts +2 -0
  80. package/dist/theme/foundations/radii.d.ts +1 -0
  81. package/dist/theme/foundations/spacing.d.ts +46 -43
  82. package/package.json +17 -19
  83. package/src/components/Accordion/Accordion.stories.mdx +9 -9
  84. package/src/components/Accordion/Accordion.test.tsx +21 -0
  85. package/src/components/Accordion/Accordion.tsx +13 -9
  86. package/src/components/Accordion/__snapshots__/Accordion.test.tsx.snap +276 -27
  87. package/src/components/Autosuggest/Autosuggest.stories.mdx +4 -3
  88. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +21 -5
  89. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +52 -31
  90. package/src/components/Breadcrumbs/Breadcrumbs.tsx +8 -7
  91. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +211 -12
  92. package/src/components/Button/Button.stories.mdx +87 -23
  93. package/src/components/Button/Button.test.tsx +25 -0
  94. package/src/components/Button/Button.tsx +18 -7
  95. package/src/components/Button/__snapshots__/Button.test.tsx.snap +27 -7
  96. package/src/components/Card/Card.stories.mdx +287 -194
  97. package/src/components/Card/Card.test.tsx +102 -0
  98. package/src/components/Card/Card.tsx +73 -32
  99. package/src/components/Card/__snapshots__/Card.test.tsx.snap +196 -36
  100. package/src/components/Chakra/Grid.stories.mdx +4 -4
  101. package/src/components/Checkbox/Checkbox.stories.mdx +62 -10
  102. package/src/components/Checkbox/Checkbox.test.tsx +32 -9
  103. package/src/components/Checkbox/Checkbox.tsx +20 -15
  104. package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +134 -7
  105. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +65 -17
  106. package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +137 -81
  107. package/src/components/CheckboxGroup/CheckboxGroup.tsx +31 -21
  108. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +332 -97
  109. package/src/components/ComponentWrapper/ComponentWrapper.test.tsx +12 -0
  110. package/src/components/ComponentWrapper/ComponentWrapper.tsx +39 -41
  111. package/src/components/ComponentWrapper/__snapshots__/ComponentWrapper.test.tsx.snap +47 -34
  112. package/src/components/DatePicker/DatePicker.stories.mdx +63 -27
  113. package/src/components/DatePicker/DatePicker.test.tsx +89 -13
  114. package/src/components/DatePicker/DatePicker.tsx +62 -56
  115. package/src/components/DatePicker/_DatePicker.scss +71 -13
  116. package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +250 -206
  117. package/src/components/Fieldset/Fieldset.stories.mdx +33 -3
  118. package/src/components/Fieldset/Fieldset.test.tsx +58 -28
  119. package/src/components/Fieldset/Fieldset.tsx +35 -30
  120. package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +40 -19
  121. package/src/components/Form/Form.stories.mdx +72 -39
  122. package/src/components/Form/Form.test.tsx +58 -15
  123. package/src/components/Form/Form.tsx +89 -67
  124. package/src/components/Form/__snapshots__/Form.test.tsx.snap +83 -5
  125. package/src/components/Grid/GridTypes.tsx +7 -7
  126. package/src/components/Grid/SimpleGrid.stories.mdx +34 -6
  127. package/src/components/Grid/SimpleGrid.test.tsx +9 -0
  128. package/src/components/Grid/SimpleGrid.tsx +29 -20
  129. package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +16 -1
  130. package/src/components/Heading/Heading.stories.mdx +36 -3
  131. package/src/components/Heading/Heading.test.tsx +10 -0
  132. package/src/components/Heading/Heading.tsx +56 -50
  133. package/src/components/Heading/__snapshots__/Heading.test.tsx.snap +26 -7
  134. package/src/components/HelperErrorText/HelperErrorText.stories.mdx +64 -42
  135. package/src/components/HelperErrorText/HelperErrorText.test.tsx +15 -0
  136. package/src/components/HelperErrorText/HelperErrorText.tsx +40 -35
  137. package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +35 -4
  138. package/src/components/Hero/Hero.stories.mdx +125 -95
  139. package/src/components/Hero/Hero.test.tsx +33 -0
  140. package/src/components/Hero/Hero.tsx +135 -126
  141. package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +89 -17
  142. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +26 -4
  143. package/src/components/HorizontalRule/HorizontalRule.test.tsx +9 -19
  144. package/src/components/HorizontalRule/HorizontalRule.tsx +9 -26
  145. package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +18 -5
  146. package/src/components/Icons/Icon.stories.mdx +31 -6
  147. package/src/components/Icons/Icon.test.tsx +38 -0
  148. package/src/components/Icons/Icon.tsx +93 -76
  149. package/src/components/Icons/__snapshots__/Icon.test.tsx.snap +129 -0
  150. package/src/components/Image/Image.stories.mdx +29 -5
  151. package/src/components/Image/Image.test.tsx +8 -0
  152. package/src/components/Image/Image.tsx +38 -26
  153. package/src/components/Image/__snapshots__/Image.test.tsx.snap +24 -8
  154. package/src/components/Label/Label.stories.mdx +42 -20
  155. package/src/components/Label/Label.test.tsx +42 -17
  156. package/src/components/Label/Label.tsx +22 -13
  157. package/src/components/Label/__snapshots__/Label.test.tsx.snap +19 -15
  158. package/src/components/Link/Link.stories.mdx +25 -15
  159. package/src/components/Link/Link.test.tsx +21 -22
  160. package/src/components/Link/Link.tsx +8 -8
  161. package/src/components/Link/__snapshots__/Link.test.tsx.snap +37 -11
  162. package/src/components/List/List.stories.mdx +75 -40
  163. package/src/components/List/List.test.tsx +67 -19
  164. package/src/components/List/List.tsx +38 -25
  165. package/src/components/List/ListTypes.tsx +1 -1
  166. package/src/components/List/__snapshots__/List.test.tsx.snap +110 -8
  167. package/src/components/Logo/Logo.stories.mdx +30 -6
  168. package/src/components/Logo/Logo.test.tsx +17 -0
  169. package/src/components/Logo/Logo.tsx +18 -6
  170. package/src/components/Logo/LogoSvgs.tsx +4 -0
  171. package/src/components/Logo/LogoTypes.tsx +2 -0
  172. package/src/components/Logo/__snapshots__/Logo.test.tsx.snap +73 -2
  173. package/src/components/Modal/Modal.stories.mdx +256 -136
  174. package/src/components/Modal/Modal.test.tsx +151 -9
  175. package/src/components/Modal/Modal.tsx +140 -20
  176. package/src/components/Modal/__snapshots__/Modal.test.tsx.snap +25 -0
  177. package/src/components/Notification/Notification.stories.mdx +25 -1
  178. package/src/components/Notification/Notification.test.tsx +23 -0
  179. package/src/components/Notification/Notification.tsx +46 -44
  180. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +158 -29
  181. package/src/components/Pagination/Pagination.stories.mdx +25 -6
  182. package/src/components/Pagination/Pagination.test.tsx +25 -0
  183. package/src/components/Pagination/Pagination.tsx +6 -6
  184. package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +244 -27
  185. package/src/components/Placeholder/Placeholder.tsx +3 -1
  186. package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +76 -10
  187. package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +81 -11
  188. package/src/components/ProgressIndicator/ProgressIndicator.tsx +17 -9
  189. package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +101 -14
  190. package/src/components/Radio/Radio.stories.mdx +64 -12
  191. package/src/components/Radio/Radio.test.tsx +28 -8
  192. package/src/components/Radio/Radio.tsx +66 -63
  193. package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +103 -6
  194. package/src/components/RadioGroup/RadioGroup.stories.mdx +224 -89
  195. package/src/components/RadioGroup/RadioGroup.test.tsx +122 -62
  196. package/src/components/RadioGroup/RadioGroup.tsx +106 -100
  197. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +1236 -1020
  198. package/src/components/SearchBar/SearchBar.stories.mdx +101 -36
  199. package/src/components/SearchBar/{SearchBar.Test.tsx → SearchBar.test.tsx} +46 -4
  200. package/src/components/SearchBar/SearchBar.tsx +17 -8
  201. package/src/components/SearchBar/__snapshots__/SearchBar.test.tsx.snap +1039 -0
  202. package/src/components/Select/Select.stories.mdx +128 -49
  203. package/src/components/Select/Select.test.tsx +63 -16
  204. package/src/components/Select/Select.tsx +131 -92
  205. package/src/components/Select/SelectTypes.tsx +5 -0
  206. package/src/components/Select/__snapshots__/Select.test.tsx.snap +765 -425
  207. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +42 -10
  208. package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +8 -0
  209. package/src/components/SkeletonLoader/SkeletonLoader.tsx +76 -72
  210. package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +169 -10
  211. package/src/components/Slider/Slider.stories.mdx +91 -42
  212. package/src/components/Slider/Slider.test.tsx +65 -17
  213. package/src/components/Slider/Slider.tsx +26 -19
  214. package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +403 -226
  215. package/src/components/StatusBadge/StatusBadge.stories.mdx +19 -1
  216. package/src/components/StatusBadge/StatusBadge.test.tsx +16 -0
  217. package/src/components/StatusBadge/StatusBadge.tsx +25 -20
  218. package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +22 -3
  219. package/src/components/StructuredContent/StructuredContent.stories.mdx +131 -12
  220. package/src/components/StructuredContent/StructuredContent.test.tsx +34 -0
  221. package/src/components/StructuredContent/StructuredContent.tsx +80 -75
  222. package/src/components/StructuredContent/__snapshots__/StructuredContent.test.tsx.snap +102 -17
  223. package/src/components/StyleGuide/Bidirectionality.stories.mdx +5 -5
  224. package/src/components/StyleGuide/Breakpoints.stories.mdx +6 -6
  225. package/src/components/StyleGuide/Buttons.stories.mdx +2 -12
  226. package/src/components/StyleGuide/ColorCard.tsx +1 -1
  227. package/src/components/StyleGuide/Colors.stories.mdx +1 -2
  228. package/src/components/StyleGuide/DesignTokens.stories.mdx +56 -26
  229. package/src/components/StyleGuide/Forms.stories.mdx +27 -12
  230. package/src/components/StyleGuide/Iconography.stories.mdx +2 -12
  231. package/src/components/StyleGuide/Spacing.stories.mdx +80 -41
  232. package/src/components/StyleGuide/Typography.stories.mdx +30 -21
  233. package/src/components/Table/Table.stories.mdx +38 -11
  234. package/src/components/Table/Table.test.tsx +15 -0
  235. package/src/components/Table/Table.tsx +7 -7
  236. package/src/components/Table/__snapshots__/Table.test.tsx.snap +408 -5
  237. package/src/components/Tabs/Tabs.stories.mdx +52 -3
  238. package/src/components/Tabs/Tabs.test.tsx +16 -0
  239. package/src/components/Tabs/Tabs.tsx +10 -6
  240. package/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap +394 -5
  241. package/src/components/Template/Template.stories.mdx +47 -43
  242. package/src/components/Template/Template.test.tsx +33 -0
  243. package/src/components/Template/Template.tsx +65 -60
  244. package/src/components/Template/__snapshots__/Template.test.tsx.snap +191 -20
  245. package/src/components/Text/Text.stories.mdx +20 -1
  246. package/src/components/Text/Text.test.tsx +12 -0
  247. package/src/components/Text/Text.tsx +6 -4
  248. package/src/components/Text/__snapshots__/Text.test.tsx.snap +21 -4
  249. package/src/components/TextInput/TextInput.stories.mdx +65 -19
  250. package/src/components/TextInput/TextInput.test.tsx +42 -28
  251. package/src/components/TextInput/TextInput.tsx +121 -113
  252. package/src/components/TextInput/__snapshots__/TextInput.test.tsx.snap +96 -73
  253. package/src/components/Toggle/Toggle.stories.mdx +80 -22
  254. package/src/components/Toggle/Toggle.test.tsx +27 -9
  255. package/src/components/Toggle/Toggle.tsx +22 -18
  256. package/src/components/Toggle/__snapshots__/Toggle.test.tsx.snap +128 -5
  257. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +52 -4
  258. package/src/components/VideoPlayer/VideoPlayer.test.tsx +23 -0
  259. package/src/components/VideoPlayer/VideoPlayer.tsx +133 -126
  260. package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +81 -39
  261. package/src/docs/Chakra.stories.mdx +50 -9
  262. package/src/docs/Welcome.stories.mdx +160 -41
  263. package/src/hooks/useCarouselStyles.stories.mdx +22 -2
  264. package/src/hooks/useCarouselStyles.ts +3 -2
  265. package/src/hooks/useNYPLTheme.stories.mdx +101 -0
  266. package/src/hooks/useNYPLTheme.ts +30 -6
  267. package/src/hooks/useWindowSize.stories.mdx +23 -0
  268. package/src/index.ts +5 -2
  269. package/src/styles/base/_place-holder.scss +1 -1
  270. package/src/styles.scss +0 -1
  271. package/src/theme/components/button.ts +15 -7
  272. package/src/theme/components/card.ts +30 -19
  273. package/src/theme/components/checkbox.ts +10 -8
  274. package/src/theme/components/checkboxGroup.ts +1 -1
  275. package/src/theme/components/componentWrapper.ts +2 -2
  276. package/src/theme/components/customTable.ts +39 -31
  277. package/src/theme/components/fieldset.ts +1 -2
  278. package/src/theme/components/global.ts +25 -20
  279. package/src/theme/components/heading.ts +1 -1
  280. package/src/theme/components/helperErrorText.ts +1 -0
  281. package/src/theme/components/hero.ts +13 -15
  282. package/src/theme/components/label.ts +4 -3
  283. package/src/theme/components/list.ts +73 -66
  284. package/src/theme/components/notification.ts +2 -2
  285. package/src/theme/components/radio.ts +9 -9
  286. package/src/theme/components/radioGroup.ts +1 -1
  287. package/src/theme/components/select.ts +31 -22
  288. package/src/theme/components/skeletonLoader.ts +3 -3
  289. package/src/theme/components/slider.ts +8 -7
  290. package/src/theme/components/statusBadge.ts +2 -2
  291. package/src/theme/components/structuredContent.ts +66 -1
  292. package/src/theme/components/tabs.ts +2 -2
  293. package/src/theme/components/template.ts +9 -9
  294. package/src/theme/components/textInput.ts +13 -12
  295. package/src/theme/components/toggle.ts +17 -10
  296. package/src/theme/components/videoPlayer.ts +1 -1
  297. package/src/theme/foundations/colors.ts +1 -1
  298. package/src/theme/foundations/radii.ts +1 -0
  299. package/src/theme/foundations/spacing.ts +70 -22
  300. package/src/theme/foundations/typography.ts +2 -2
  301. package/src/utils/componentCategories.ts +1 -2
  302. package/dist/components/SearchBar/SearchBar.Test.d.ts +0 -1
  303. package/dist/helpers/generateUUID.d.ts +0 -1
  304. package/src/components/Modal/_Modal.scss +0 -18
  305. package/src/helpers/generateUUID.tsx +0 -5
@@ -9,14 +9,21 @@ import {
9
9
  import { withDesign } from "storybook-addon-designs";
10
10
 
11
11
  import Button from "../Button/Button";
12
- import Form from "../Form/Form";
12
+ import Form, { FormField } from "../Form/Form";
13
13
  import Select from "./Select";
14
- import { SelectTypes } from "./SelectTypes";
14
+ import { SelectTypes, LabelPositions } from "./SelectTypes";
15
15
  import { getCategory } from "../../utils/componentCategories";
16
16
  import DSProvider from "../../theme/provider";
17
17
  import { getStorybookEnumValues } from "../../utils/utils";
18
18
 
19
- export const enumValues = getStorybookEnumValues(SelectTypes, "SelectTypes");
19
+ export const selectTypesEnumValues = getStorybookEnumValues(
20
+ SelectTypes,
21
+ "SelectTypes"
22
+ );
23
+ export const labelPositionsEnumValues = getStorybookEnumValues(
24
+ LabelPositions,
25
+ "LabelPositions"
26
+ );
20
27
 
21
28
  <Meta
22
29
  title={getCategory("Select")}
@@ -41,6 +48,11 @@ export const enumValues = getStorybookEnumValues(SelectTypes, "SelectTypes");
41
48
  isRequired: {
42
49
  table: { defaultValue: { summary: false } },
43
50
  },
51
+ labelPosition: {
52
+ control: { type: "select" },
53
+ table: { defaultValue: { summary: "LabelPositions.Default" } },
54
+ options: labelPositionsEnumValues.options,
55
+ },
44
56
  name: { control: false },
45
57
  key: { table: { disable: true } },
46
58
  onChange: { control: false },
@@ -51,7 +63,7 @@ export const enumValues = getStorybookEnumValues(SelectTypes, "SelectTypes");
51
63
  showLabel: {
52
64
  table: { defaultValue: { summary: true } },
53
65
  },
54
- showOptReqLabel: {
66
+ showRequiredLabel: {
55
67
  table: { defaultValue: { summary: true } },
56
68
  },
57
69
  selectType: {
@@ -67,7 +79,20 @@ export const enumValues = getStorybookEnumValues(SelectTypes, "SelectTypes");
67
79
  | Component Version | DS Version |
68
80
  | ----------------- | ---------- |
69
81
  | Added | `0.7.0` |
70
- | Latest | `0.25.13` |
82
+ | Latest | `0.27.0` |
83
+
84
+ ## Table of Contents
85
+
86
+ - [Overview](#overview)
87
+ - [Component Props](#component-props)
88
+ - [Accessibility](#accessibility)
89
+ - [Option Elements](#option-elements)
90
+ - [Labelling Variations](#labelling-variations)
91
+ - [Errored](#errored)
92
+ - [Disabled](#disabled)
93
+ - [Getting Select Input Value](#getting-select-input-value)
94
+
95
+ ## Overview
71
96
 
72
97
  <Description of={Select} />
73
98
 
@@ -77,6 +102,8 @@ prop, regardless of the label visibility. Additionally, while the `id` prop is
77
102
  optional, a unique `id` attribute is necessary for accessibility. If the prop
78
103
  is left blank, a value will be generated for you.
79
104
 
105
+ ## Component Props
106
+
80
107
  <Canvas withToolbar>
81
108
  <Story
82
109
  name="Select with Controls"
@@ -88,18 +115,22 @@ is left blank, a value will be generated for you.
88
115
  isDisabled: false,
89
116
  isInvalid: false,
90
117
  isRequired: false,
118
+ labelPosition: "LabelPositions.Default",
91
119
  labelText: "What is your favorite color?",
92
120
  name: "color",
93
121
  onChange: undefined,
94
122
  showHelperInvalidText: undefined,
95
123
  showLabel: true,
96
- showOptReqLabel: true,
124
+ showRequiredLabel: true,
97
125
  selectType: SelectTypes.Default,
98
126
  value: undefined,
99
127
  }}
100
128
  >
101
129
  {(args) => (
102
- <Select {...args}>
130
+ <Select
131
+ {...args}
132
+ labelPosition={labelPositionsEnumValues.getValue(args.labelPosition)}
133
+ >
103
134
  <option value="red">Red</option>
104
135
  <option value="green">Green</option>
105
136
  <option value="blue">Blue</option>
@@ -112,13 +143,28 @@ is left blank, a value will be generated for you.
112
143
 
113
144
  <ArgsTable story="Select with Controls" />
114
145
 
146
+ ## Accessibility
147
+
148
+ The `Select` component renders an HTML `<select>` element which is accessible.
149
+ It's the developer's responsibility to ensure that the appropriate `<option>`
150
+ elements are provided as children. Internally, a `Label` is associated with the
151
+ `<select>` element.
152
+
153
+ When `showLabel` is set to false, the `labelText` value will be set to the
154
+ `<select>`'s `aria-label` attribute.
155
+
156
+ Resources:
157
+
158
+ - [MDN select: The HTML Select element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select)
159
+ - [Chakra UI Select](https://chakra-ui.com/docs/components/form/select)
160
+
115
161
  ## Option Elements
116
162
 
117
163
  The `Select` component renders all the necessary wrapping and associated text
118
164
  elements, but the select options _need_ to be child `<option>` HTML elements.
119
165
 
120
166
  ```jsx
121
- <Select labelText="What is your favorite color?" name="color">
167
+ <Select id="select" labelText="What is your favorite color?" name="color">
122
168
  <option value="red">Red</option>
123
169
  <option value="green">Green</option>
124
170
  <option value="blue">Blue</option>
@@ -137,17 +183,20 @@ and `option` HTML elements:
137
183
 
138
184
  ## Labelling Variations
139
185
 
140
- A Select can be rendered with or without a visible label. When `showLabel` is
141
- set to `false`, an `aria-label` attribute is added to the select input to
142
- maintain accessibility. If the component needs to be required, the
143
- `showOptReqLabel` prop can be used to show or hide the "Required"/"Optional"
144
- text within the `label` element.
186
+ A Select can be rendered with or without a visible label. If the label is visible,
187
+ it can be displayed above (the default) or inline with the select input using the
188
+ `labelPosition` prop. Note that the label will only display inline when the device
189
+ width exceeds the `--nypl-breakpoint-medium` breakpoint, or 600px. When `showLabel`
190
+ is set to `false`, an `aria-label` attribute is added to the select input to maintain
191
+ accessibility. If the component needs to be required, the `showRequiredLabel` prop
192
+ can be used to show or hide the "Required" text within the `label` element.
145
193
 
146
194
  <Canvas>
147
195
  <Story name="Labelling Variations">
148
196
  <VStack align="stretch" spacing={8}>
149
197
  <Select
150
198
  helperText="Display the label"
199
+ id="label-example1"
151
200
  labelText="What is your favorite color?"
152
201
  name="color"
153
202
  >
@@ -159,6 +208,7 @@ text within the `label` element.
159
208
  </Select>
160
209
  <Select
161
210
  helperText="Do not display the label"
211
+ id="label-example2"
162
212
  labelText="What is your favorite color?"
163
213
  name="color"
164
214
  showLabel={false}
@@ -170,7 +220,8 @@ text within the `label` element.
170
220
  <option value="white">White</option>
171
221
  </Select>
172
222
  <Select
173
- helperText="Display the Required/Optional text"
223
+ helperText="Display the Required text"
224
+ id="label-example3"
174
225
  isRequired
175
226
  labelText="What is your favorite color?"
176
227
  name="color"
@@ -182,11 +233,25 @@ text within the `label` element.
182
233
  <option value="white">White</option>
183
234
  </Select>
184
235
  <Select
185
- helperText="Do not display the Required/Optional text"
236
+ helperText="Do not display the Required text"
237
+ id="label-example4"
186
238
  isRequired
187
239
  labelText="What is your favorite color?"
188
240
  name="color"
189
- showOptReqLabel={false}
241
+ showRequiredLabel={false}
242
+ >
243
+ <option value="red">Red</option>
244
+ <option value="green">Green</option>
245
+ <option value="blue">Blue</option>
246
+ <option value="black">Black</option>
247
+ <option value="white">White</option>
248
+ </Select>
249
+ <Select
250
+ helperText="Display the label inline"
251
+ isRequired
252
+ labelText="What is your favorite color?"
253
+ name="color"
254
+ labelPosition={LabelPositions.Inline}
190
255
  >
191
256
  <option value="red">Red</option>
192
257
  <option value="green">Green</option>
@@ -204,6 +269,7 @@ text within the `label` element.
204
269
  <DSProvider>
205
270
  <Select
206
271
  helperText="This is the helper text."
272
+ id="errored"
207
273
  invalidText="This is the error text :("
208
274
  isInvalid
209
275
  labelText="What is your favorite color?"
@@ -224,6 +290,7 @@ text within the `label` element.
224
290
  <DSProvider>
225
291
  <Select
226
292
  helperText="This is the helper text."
293
+ id="disabled"
227
294
  invalidText="This is the error text :("
228
295
  isDisabled
229
296
  labelText="What is your favorite color?"
@@ -238,14 +305,14 @@ text within the `label` element.
238
305
  </DSProvider>
239
306
  </Canvas>
240
307
 
241
- ## Getting Select Data Value
308
+ ## Getting Select Input Value
242
309
 
243
310
  ### Controlled Component using `value` and `onChange` props
244
311
 
245
- If your application uses controlled React components and the DS `Select`
246
- component must be controlled, you can pass and extract the value through the
247
- `value` and `onChange` props. This will be called every time a new `option`
248
- value is selected.
312
+ If your application uses controlled React components and the Reservoir Design
313
+ System (DS) `Select` component must be controlled, you can pass and extract the
314
+ value through the `value` and `onChange` props. This will be called every time
315
+ a new `option` value is selected.
249
316
 
250
317
  Try it out: open up the browser's console to see new values being logged on
251
318
  each change.
@@ -261,6 +328,7 @@ export function SelectControlledExample() {
261
328
  return (
262
329
  <Select
263
330
  helperText="This is the helper text."
331
+ id="example-1"
264
332
  labelText="What is your favorite color?"
265
333
  name="color"
266
334
  onChange={onChange}
@@ -286,6 +354,7 @@ export function SelectControlledExample() {
286
354
  return (
287
355
  <Select
288
356
  helperText="This is the helper text."
357
+ id="example-1"
289
358
  labelText="What is your favorite color?"
290
359
  name="color"
291
360
  onChange={onChange}
@@ -324,20 +393,25 @@ export function SelectUncontrolledExample() {
324
393
  console.log("Using uncontrolled ref:", selectValue);
325
394
  };
326
395
  return (
327
- <Form>
328
- <Select
329
- helperText="This is the helper text."
330
- labelText="What is your favorite color?"
331
- name="color"
332
- ref={selectRef}
333
- >
334
- <option value="red">Red</option>
335
- <option value="green">Green</option>
336
- <option value="blue">Blue</option>
337
- <option value="black">Black</option>
338
- <option value="white">White</option>
339
- </Select>
340
- <Button onClick={onSubmit}>Submit</Button>
396
+ <Form id="form">
397
+ <FormField>
398
+ <Select
399
+ helperText="This is the helper text."
400
+ id="example-2"
401
+ labelText="What is your favorite color?"
402
+ name="color"
403
+ ref={selectRef}
404
+ >
405
+ <option value="red">Red</option>
406
+ <option value="green">Green</option>
407
+ <option value="blue">Blue</option>
408
+ <option value="black">Black</option>
409
+ <option value="white">White</option>
410
+ </Select>
411
+ <Button id="submit" onClick={onSubmit}>
412
+ Submit
413
+ </Button>
414
+ </FormField>
341
415
  </Form>
342
416
  );
343
417
  }
@@ -350,20 +424,25 @@ export function SelectUncontrolledExample() {
350
424
  console.log("Using uncontrolled ref:", selectValue);
351
425
  };
352
426
  return (
353
- <Form>
354
- <Select
355
- helperText="This is the helper text."
356
- labelText="What is your favorite color?"
357
- name="color"
358
- ref={selectRef}
359
- >
360
- <option value="red">Red</option>
361
- <option value="green">Green</option>
362
- <option value="blue">Blue</option>
363
- <option value="black">Black</option>
364
- <option value="white">White</option>
365
- </Select>
366
- <Button onClick={onSubmit}>Submit</Button>
427
+ <Form id="form">
428
+ <FormField>
429
+ <Select
430
+ helperText="This is the helper text."
431
+ id="example-2"
432
+ labelText="What is your favorite color?"
433
+ name="color"
434
+ ref={selectRef}
435
+ >
436
+ <option value="red">Red</option>
437
+ <option value="green">Green</option>
438
+ <option value="blue">Blue</option>
439
+ <option value="black">Black</option>
440
+ <option value="white">White</option>
441
+ </Select>
442
+ <Button id="submit" onClick={onSubmit}>
443
+ Submit
444
+ </Button>
445
+ </FormField>
367
446
  </Form>
368
447
  );
369
448
  }
@@ -4,9 +4,11 @@ import { axe } from "jest-axe";
4
4
  import renderer from "react-test-renderer";
5
5
 
6
6
  import Select from "./Select";
7
+ import { LabelPositions } from "./SelectTypes";
7
8
 
8
9
  const baseProps = {
9
10
  helperText: "This is the helper text.",
11
+ id: "select",
10
12
  labelText: "What is your favorite color?",
11
13
  name: "color",
12
14
  };
@@ -79,26 +81,17 @@ describe("Select", () => {
79
81
  ).toHaveAttribute("aria-describedby", `${id}-helperText`);
80
82
  });
81
83
 
82
- it("renders required or optional text in the label", () => {
83
- const { rerender } = render(<Select {...baseProps}>{baseOptions}</Select>);
84
- expect(screen.getByText(/Optional/i)).toBeInTheDocument();
85
-
86
- rerender(
84
+ it("renders '(Required)' text in the label", () => {
85
+ const { rerender } = render(
87
86
  <Select {...baseProps} isRequired>
88
87
  {baseOptions}
89
88
  </Select>
90
89
  );
91
- expect(screen.getByText(/Required/i)).toBeInTheDocument();
92
90
 
93
- rerender(
94
- <Select {...baseProps} showOptReqLabel={false}>
95
- {baseOptions}
96
- </Select>
97
- );
98
- expect(screen.queryByText(/Optional/i)).not.toBeInTheDocument();
91
+ expect(screen.getByText(/Required/i)).toBeInTheDocument();
99
92
 
100
93
  rerender(
101
- <Select {...baseProps} isRequired showOptReqLabel={false}>
94
+ <Select {...baseProps} isRequired showRequiredLabel={false}>
102
95
  {baseOptions}
103
96
  </Select>
104
97
  );
@@ -120,9 +113,9 @@ describe("Select", () => {
120
113
  ).toHaveAttribute("required");
121
114
  });
122
115
 
123
- it("should not render a required label if 'showOptReqLabel' flag is false, but still render the label", () => {
116
+ it("should not render a required label if 'showRequiredLabel' flag is false, but still render the label", () => {
124
117
  render(
125
- <Select {...baseProps} isRequired showOptReqLabel={false}>
118
+ <Select {...baseProps} isRequired showRequiredLabel={false}>
126
119
  {baseOptions}
127
120
  </Select>
128
121
  );
@@ -222,9 +215,22 @@ describe("Select", () => {
222
215
  expect(value).toEqual("white");
223
216
  });
224
217
 
218
+ it("logs a warning when there is no `id` passed", () => {
219
+ const warn = jest.spyOn(console, "warn");
220
+ render(
221
+ // @ts-ignore: Typescript complains when a required prop is not passed, but
222
+ // here we don't want to pass the required prop to make sure the warning appears.
223
+ <Select labelText="What is your favorite color?" name="color">
224
+ {baseOptions}
225
+ </Select>
226
+ );
227
+ expect(warn).toHaveBeenCalledWith(
228
+ "NYPL Reservoir Select: This component's required `id` prop was not passed."
229
+ );
230
+ });
231
+
225
232
  it("Renders the UI snapshot correctly", () => {
226
233
  const siblings = ["Kendall", "Shiv", "Connor", "Roman", "Tom"];
227
-
228
234
  const options = siblings.map((sibling) => (
229
235
  <option key={sibling}>{sibling}</option>
230
236
  ));
@@ -289,6 +295,19 @@ describe("Select", () => {
289
295
  </Select>
290
296
  )
291
297
  .toJSON();
298
+ const withLabelInline = renderer
299
+ .create(
300
+ <Select
301
+ id="select"
302
+ isRequired
303
+ labelPosition={LabelPositions.Inline}
304
+ labelText="Which Succession sibling are you?"
305
+ name="succession-sibling"
306
+ >
307
+ {options}
308
+ </Select>
309
+ )
310
+ .toJSON();
292
311
  const hasOnChange = renderer
293
312
  .create(
294
313
  <Select
@@ -301,12 +320,40 @@ describe("Select", () => {
301
320
  </Select>
302
321
  )
303
322
  .toJSON();
323
+ const withChakraProps = renderer
324
+ .create(
325
+ <Select
326
+ id="chakra"
327
+ labelText="Which Succession sibling are you?"
328
+ name="succession-sibling"
329
+ p="20px"
330
+ color="ui.error.primary"
331
+ >
332
+ {options}
333
+ </Select>
334
+ )
335
+ .toJSON();
336
+ const withOtherProps = renderer
337
+ .create(
338
+ <Select
339
+ id="props"
340
+ labelText="Which Succession sibling are you?"
341
+ name="succession-sibling"
342
+ data-testid="props"
343
+ >
344
+ {options}
345
+ </Select>
346
+ )
347
+ .toJSON();
304
348
 
305
349
  expect(primary).toMatchSnapshot();
306
350
  expect(disabled).toMatchSnapshot();
307
351
  expect(withInvalidText).toMatchSnapshot();
308
352
  expect(withHelperText).toMatchSnapshot();
309
353
  expect(required).toMatchSnapshot();
354
+ expect(withLabelInline).toMatchSnapshot();
310
355
  expect(hasOnChange).toMatchSnapshot();
356
+ expect(withChakraProps).toMatchSnapshot();
357
+ expect(withOtherProps).toMatchSnapshot();
311
358
  });
312
359
  });