@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
@@ -118,7 +118,7 @@ exports[`Image Renders the UI snapshot correctly 9`] = `
118
118
 
119
119
  exports[`Image Renders the UI snapshot correctly 10`] = `
120
120
  <div
121
- className="the-wrap css-0"
121
+ className="the-wrap css-1u8qly9"
122
122
  >
123
123
  <div
124
124
  className="the-crop css-0"
@@ -134,7 +134,7 @@ exports[`Image Renders the UI snapshot correctly 10`] = `
134
134
 
135
135
  exports[`Image Renders the UI snapshot correctly 11`] = `
136
136
  <div
137
- className="the-wrap css-0"
137
+ className="the-wrap css-1u8qly9"
138
138
  >
139
139
  <div
140
140
  className="the-crop css-0"
@@ -158,7 +158,7 @@ exports[`Image Renders the UI snapshot correctly 12`] = `
158
158
 
159
159
  exports[`Image Renders the UI snapshot correctly 13`] = `
160
160
  <div
161
- className="the-wrap css-0"
161
+ className="the-wrap css-1u8qly9"
162
162
  >
163
163
  <div
164
164
  className="the-crop css-0"
@@ -174,7 +174,7 @@ exports[`Image Renders the UI snapshot correctly 13`] = `
174
174
 
175
175
  exports[`Image Renders the UI snapshot correctly 14`] = `
176
176
  <div
177
- className="the-wrap css-0"
177
+ className="the-wrap css-1u8qly9"
178
178
  >
179
179
  <div
180
180
  className="the-crop css-0"
@@ -190,7 +190,7 @@ exports[`Image Renders the UI snapshot correctly 14`] = `
190
190
 
191
191
  exports[`Image Renders the UI snapshot correctly 15`] = `
192
192
  <div
193
- className="the-wrap css-0"
193
+ className="the-wrap css-1u8qly9"
194
194
  >
195
195
  <div
196
196
  className="the-crop css-0"
@@ -206,7 +206,7 @@ exports[`Image Renders the UI snapshot correctly 15`] = `
206
206
 
207
207
  exports[`Image Renders the UI snapshot correctly 16`] = `
208
208
  <div
209
- className="the-wrap css-0"
209
+ className="the-wrap css-1u8qly9"
210
210
  >
211
211
  <div
212
212
  className="the-crop css-0"
@@ -222,7 +222,7 @@ exports[`Image Renders the UI snapshot correctly 16`] = `
222
222
 
223
223
  exports[`Image Renders the UI snapshot correctly 17`] = `
224
224
  <div
225
- className="the-wrap css-0"
225
+ className="the-wrap css-1u8qly9"
226
226
  >
227
227
  <div
228
228
  className="the-crop css-0"
@@ -238,7 +238,7 @@ exports[`Image Renders the UI snapshot correctly 17`] = `
238
238
 
239
239
  exports[`Image Renders the UI snapshot correctly 18`] = `
240
240
  <div
241
- className="the-wrap css-0"
241
+ className="the-wrap css-1u8qly9"
242
242
  >
243
243
  <div
244
244
  className="the-crop css-0"
@@ -251,3 +251,19 @@ exports[`Image Renders the UI snapshot correctly 18`] = `
251
251
  </div>
252
252
  </div>
253
253
  `;
254
+
255
+ exports[`Image Renders the UI snapshot correctly 19`] = `
256
+ <img
257
+ alt=""
258
+ className="css-0"
259
+ src="test.png"
260
+ />
261
+ `;
262
+
263
+ exports[`Image Renders the UI snapshot correctly 20`] = `
264
+ <img
265
+ alt=""
266
+ className="css-0"
267
+ src="test.png"
268
+ />
269
+ `;
@@ -1,4 +1,4 @@
1
- import { Box } from "@chakra-ui/react";
1
+ import { Box, VStack } from "@chakra-ui/react";
2
2
  import {
3
3
  ArgsTable,
4
4
  Canvas,
@@ -19,10 +19,7 @@ import { getCategory } from "../../utils/componentCategories";
19
19
  argTypes={{
20
20
  className: { control: false },
21
21
  id: { control: false },
22
- optReqFlag: {
23
- control: { type: "select" },
24
- options: ["Required", "Optional", ""],
25
- },
22
+ isInlined: { table: { disable: true } },
26
23
  text: {
27
24
  description: "Only used for Storybook",
28
25
  },
@@ -34,10 +31,21 @@ import { getCategory } from "../../utils/componentCategories";
34
31
  | Component Version | DS Version |
35
32
  | ----------------- | ---------- |
36
33
  | Added | `0.0.10` |
37
- | Latest | `0.25.8` |
34
+ | Latest | `0.26.0` |
35
+
36
+ ## Table of Contents
37
+
38
+ - [Overview](#overview)
39
+ - [Component Props](#component-props)
40
+ - [Accessibility](#accessibility)
41
+ - [isRequired helper text](#isrequired-helper-text)
42
+
43
+ ## Overview
38
44
 
39
45
  <Description of={Label} />
40
46
 
47
+ ## Component Props
48
+
41
49
  <Canvas>
42
50
  <Story
43
51
  name="Label with Controls"
@@ -45,7 +53,7 @@ import { getCategory } from "../../utils/componentCategories";
45
53
  className: undefined,
46
54
  htmlFor: "id-of-input-element",
47
55
  id: "label-id",
48
- optReqFlag: "Required",
56
+ isRequired: false,
49
57
  text: "A label for a villager.",
50
58
  }}
51
59
  >
@@ -55,24 +63,38 @@ import { getCategory } from "../../utils/componentCategories";
55
63
 
56
64
  <ArgsTable story="Label with Controls" />
57
65
 
58
- ## Required/Optional helper text
66
+ ## Accessibility
67
+
68
+ The `Label` component is an accessible HTML `<label>` element. The JSX prop
69
+ `htmlFor` should be set to the `id` of the input element that the label is
70
+ associated with. This is the proper way to label inputs so that screenreaders
71
+ can read the label, without the use of the `aria-label` attribute on the input
72
+ element.
73
+
74
+ Note: All form-related Reservoir components already implement this `Label`
75
+ component so there is no need to use this component unless if you are building
76
+ a new form-related input component.
77
+
78
+ Resources:
79
+
80
+ - [WebAIM Creating Accessible Forms](https://webaim.org/techniques/forms/advanced)
81
+
82
+ ## isRequired helper text
59
83
 
60
84
  An optional helper string can be rendered at the end of the `Label` text through
61
- the `optReqFlag` prop. Pass in either `"Required"`, `"Optional"`, or `""`. The
62
- default value is undefined for no helper text to appear.
85
+ the `isRequired` prop. This is useful for visually labeling a field as required
86
+ with the `"(Required)"` text next to the label's text. This is set to `false`
87
+ by default.
63
88
 
64
89
  <Canvas>
65
- <Story name="Required/Optional helper text">
66
- <Box width="300px">
67
- <Label htmlFor="some-id1" optReqFlag="">
68
- No text
69
- </Label>
70
- <Label htmlFor="some-id2" optReqFlag="Required">
71
- Required helper text
90
+ <Story name="isRequired helper text">
91
+ <VStack>
92
+ <Label htmlFor="label-id1" id="regular">
93
+ A regular label
72
94
  </Label>
73
- <Label htmlFor="some-id3" optReqFlag="Optional">
74
- Optional helper text
95
+ <Label htmlFor="label-id2" id="required" isRequired>
96
+ A label that is required
75
97
  </Label>
76
- </Box>
98
+ </VStack>
77
99
  </Story>
78
100
  </Canvas>
@@ -14,6 +14,15 @@ describe("Label Accessibility", () => {
14
14
  );
15
15
  expect(await axe(container)).toHaveNoViolations();
16
16
  });
17
+
18
+ it("passes axe accessibility test with required text", async () => {
19
+ const { container } = render(
20
+ <Label id="label" htmlFor="some-input-id" isRequired>
21
+ Cupcakes
22
+ </Label>
23
+ );
24
+ expect(await axe(container)).toHaveNoViolations();
25
+ });
17
26
  });
18
27
 
19
28
  describe("Label", () => {
@@ -35,30 +44,33 @@ describe("Label", () => {
35
44
  expect(screen.getByText("Cupcakes")).toBeInTheDocument();
36
45
  });
37
46
 
38
- it("renders the optional or required helper text", () => {
47
+ it("renders the '(Required)' helper text", () => {
39
48
  const { rerender } = render(
40
49
  <Label id="label" htmlFor="some-input-id">
41
50
  <span>Cupcakes</span>
42
51
  </Label>
43
52
  );
44
- expect(screen.queryByText("Optional")).not.toBeInTheDocument();
45
- expect(screen.queryByText("Required")).not.toBeInTheDocument();
53
+ expect(screen.queryByText(/Required/i)).not.toBeInTheDocument();
46
54
 
47
55
  rerender(
48
- <Label id="label2" htmlFor="some-input-id" optReqFlag="Optional">
56
+ <Label id="label" htmlFor="some-input-id" isRequired>
49
57
  <span>Cupcakes</span>
50
58
  </Label>
51
59
  );
52
- expect(screen.getByText("Optional")).toBeInTheDocument();
53
- expect(screen.queryByText("Required")).not.toBeInTheDocument();
54
60
 
55
- rerender(
56
- <Label id="label3" htmlFor="some-input-id" optReqFlag="Required">
57
- <span>Cupcakes</span>
58
- </Label>
61
+ expect(screen.queryByText(/Required/i)).toBeInTheDocument();
62
+ });
63
+
64
+ it("Logs a warning when there is no `id` passed", () => {
65
+ const warn = jest.spyOn(console, "warn");
66
+ render(
67
+ // @ts-ignore: Typescript complains when a required prop is not passed, but
68
+ // here we don't want to pass the required prop to make sure the warning appears.
69
+ <Label htmlFor="some-input-id">Cupcakes</Label>
70
+ );
71
+ expect(warn).toHaveBeenCalledWith(
72
+ "NYPL Reservoir Label: This component's required `id` prop was not passed."
59
73
  );
60
- expect(screen.queryByText("Optional")).not.toBeInTheDocument();
61
- expect(screen.getByText("Required")).toBeInTheDocument();
62
74
  });
63
75
 
64
76
  it("Renders the UI snapshot correctly", () => {
@@ -69,23 +81,36 @@ describe("Label", () => {
69
81
  </Label>
70
82
  )
71
83
  .toJSON();
72
- const optional = renderer
84
+ const required = renderer
73
85
  .create(
74
- <Label id="label2" htmlFor="some-input-id" optReqFlag="Optional">
86
+ <Label id="label3" htmlFor="some-input-id" isRequired>
75
87
  Cupcakes
76
88
  </Label>
77
89
  )
78
90
  .toJSON();
79
- const required = renderer
91
+ const withChakraProps = renderer
92
+ .create(
93
+ <Label
94
+ id="chakra"
95
+ htmlFor="some-input-id"
96
+ p="20px"
97
+ color="ui.error.primary"
98
+ >
99
+ Cupcakes
100
+ </Label>
101
+ )
102
+ .toJSON();
103
+ const withOtherProps = renderer
80
104
  .create(
81
- <Label id="label3" htmlFor="some-input-id" optReqFlag="Required">
105
+ <Label id="props" htmlFor="some-input-id" data-testid="props">
82
106
  Cupcakes
83
107
  </Label>
84
108
  )
85
109
  .toJSON();
86
110
 
87
111
  expect(simple).toMatchSnapshot();
88
- expect(optional).toMatchSnapshot();
89
112
  expect(required).toMatchSnapshot();
113
+ expect(withChakraProps).toMatchSnapshot();
114
+ expect(withOtherProps).toMatchSnapshot();
90
115
  });
91
116
  });
@@ -1,9 +1,5 @@
1
+ import { Box, chakra, useStyleConfig } from "@chakra-ui/react";
1
2
  import * as React from "react";
2
- import { Box, useMultiStyleConfig } from "@chakra-ui/react";
3
-
4
- import generateUUID from "../../helpers/generateUUID";
5
-
6
- type optReqFlagType = "Required" | "Optional" | "" | undefined;
7
3
 
8
4
  interface LabelProps {
9
5
  /** Additional CSS class name to render in the `label` element. */
@@ -12,22 +8,34 @@ interface LabelProps {
12
8
  htmlFor: string;
13
9
  /** ID that other components can cross reference for accessibility purposes */
14
10
  id?: string;
15
- /** Displays "Required" or "Optional" string alongside the label */
16
- optReqFlag?: optReqFlagType;
11
+ /** Controls whether the label should be inline with the input it goes with.
12
+ * This prop should only be used internally. */
13
+ isInlined?: boolean;
14
+ /** Controls whether the "(Required)" text should be displayed alongside the
15
+ * label's text. False by default. */
16
+ isRequired?: boolean;
17
17
  }
18
18
 
19
19
  /**
20
20
  * A label for form inputs. It should never be used alone.
21
21
  */
22
- function Label(props: React.PropsWithChildren<LabelProps>) {
22
+ export const Label = chakra((props: React.PropsWithChildren<LabelProps>) => {
23
23
  const {
24
24
  children,
25
25
  className,
26
26
  htmlFor,
27
- id = generateUUID(),
28
- optReqFlag,
27
+ id,
28
+ isInlined = false,
29
+ isRequired = false,
30
+ ...rest
29
31
  } = props;
30
- const styles = useMultiStyleConfig("Label", {});
32
+ const styles = useStyleConfig("Label", { isInlined });
33
+
34
+ if (!id) {
35
+ console.warn(
36
+ "NYPL Reservoir Label: This component's required `id` prop was not passed."
37
+ );
38
+ }
31
39
 
32
40
  return (
33
41
  <Box
@@ -36,11 +44,12 @@ function Label(props: React.PropsWithChildren<LabelProps>) {
36
44
  className={className}
37
45
  htmlFor={htmlFor}
38
46
  __css={styles}
47
+ {...rest}
39
48
  >
40
49
  {children}
41
- {optReqFlag && <Box __css={styles.helper}>{optReqFlag}</Box>}
50
+ {isRequired && <span> (Required)</span>}
42
51
  </Box>
43
52
  );
44
- }
53
+ });
45
54
 
46
55
  export default Label;
@@ -2,7 +2,7 @@
2
2
 
3
3
  exports[`Label Renders the UI snapshot correctly 1`] = `
4
4
  <label
5
- className="css-0"
5
+ className="css-1xdhyk6"
6
6
  htmlFor="some-input-id"
7
7
  id="label"
8
8
  >
@@ -12,30 +12,34 @@ exports[`Label Renders the UI snapshot correctly 1`] = `
12
12
 
13
13
  exports[`Label Renders the UI snapshot correctly 2`] = `
14
14
  <label
15
- className="css-0"
15
+ className="css-1xdhyk6"
16
16
  htmlFor="some-input-id"
17
- id="label2"
17
+ id="label3"
18
18
  >
19
19
  Cupcakes
20
- <div
21
- className="css-0"
22
- >
23
- Optional
24
- </div>
20
+ <span>
21
+ (Required)
22
+ </span>
25
23
  </label>
26
24
  `;
27
25
 
28
26
  exports[`Label Renders the UI snapshot correctly 3`] = `
29
27
  <label
30
- className="css-0"
28
+ className="css-kle7zy"
31
29
  htmlFor="some-input-id"
32
- id="label3"
30
+ id="chakra"
31
+ >
32
+ Cupcakes
33
+ </label>
34
+ `;
35
+
36
+ exports[`Label Renders the UI snapshot correctly 4`] = `
37
+ <label
38
+ className="css-1xdhyk6"
39
+ data-testid="props"
40
+ htmlFor="some-input-id"
41
+ id="props"
33
42
  >
34
43
  Cupcakes
35
- <div
36
- className="css-0"
37
- >
38
- Required
39
- </div>
40
44
  </label>
41
45
  `;
@@ -6,10 +6,6 @@ import {
6
6
  Meta,
7
7
  Story,
8
8
  } from "@storybook/addon-docs";
9
- import {
10
- BrowserRouter as Router,
11
- Link as ReactRouterLink,
12
- } from "react-router-dom";
13
9
  import { withDesign } from "storybook-addon-designs";
14
10
 
15
11
  import Link from "./Link";
@@ -52,10 +48,23 @@ export const enumValues = getStorybookEnumValues(LinkTypes, "LinkTypes");
52
48
  | Component Version | DS Version |
53
49
  | ----------------- | ---------- |
54
50
  | Added | `0.0.4` |
55
- | Latest | `0.25.9` |
51
+ | Latest | `0.26.0` |
52
+
53
+ ## Table of Contents
54
+
55
+ - [Overview](#overview)
56
+ - [Component Props](#component-props)
57
+ - [Accessibility](#accessibility)
58
+ - [Links With Icons](#links-with-icons)
59
+ - [Anchor Element Rendering](#anchor-element-rendering)
60
+ - [Link with Routers](#link-with-routers)
61
+
62
+ ## Overview
56
63
 
57
64
  <Description of={Link} />
58
65
 
66
+ ## Component Props
67
+
59
68
  <Canvas withToolbar>
60
69
  <Story
61
70
  name="Link with Controls"
@@ -81,6 +90,17 @@ export const enumValues = getStorybookEnumValues(LinkTypes, "LinkTypes");
81
90
 
82
91
  <ArgsTable story="Link with Controls" />
83
92
 
93
+ ## Accessibility
94
+
95
+ The `Link` component should be used for navigation. If an `onClick` user
96
+ interface action is required, a `Button` component should be used instead. The
97
+ `Link` component renders an `<a>` element with the `href` attribute.
98
+
99
+ Resources:
100
+
101
+ - [W3C WAI Link Examples](https://www.w3.org/TR/wai-aria-practices-1.1/examples/link/link.html)
102
+ - [Yale Usability & Web Accessibility Links](https://usability.yale.edu/web-accessibility/articles/links)
103
+
84
104
  ## Links With Icons
85
105
 
86
106
  To render an `Icon` as part of the link, make sure that the `Link` component
@@ -234,16 +254,6 @@ import DS from "@nypl/design-system-react-components";
234
254
  </DS.Link>;
235
255
  ```
236
256
 
237
- <Canvas>
238
- <DSProvider>
239
- <Router>
240
- <Link type={LinkTypes.Action}>
241
- <ReactRouterLink to="#">Next Page</ReactRouterLink>
242
- </Link>
243
- </Router>
244
- </DSProvider>
245
- </Canvas>
246
-
247
257
  ### NextJS
248
258
 
249
259
  NextJS's `Link` component should wrap the Design System's `Link` component.
@@ -1,10 +1,6 @@
1
1
  import { render, screen } from "@testing-library/react";
2
2
  import { axe } from "jest-axe";
3
3
  import * as React from "react";
4
- import {
5
- BrowserRouter as Router,
6
- Link as ReactRouterLink,
7
- } from "react-router-dom";
8
4
  import renderer from "react-test-renderer";
9
5
 
10
6
  import Link from "./Link";
@@ -106,24 +102,6 @@ describe("Link", () => {
106
102
  expect(screen.getByRole("link")).toBeInTheDocument();
107
103
  });
108
104
 
109
- it("Can pass in a ReactRouter Link", () => {
110
- render(
111
- <Router>
112
- <Link type={LinkTypes.Action}>
113
- <ReactRouterLink to="#">
114
- <Icon
115
- name={IconNames.Download}
116
- align={IconAlign.Left}
117
- iconRotation={IconRotationTypes.Rotate0}
118
- />
119
- Download
120
- </ReactRouterLink>
121
- </Link>
122
- </Router>
123
- );
124
- expect(screen.getByRole("link")).toBeInTheDocument();
125
- });
126
-
127
105
  it("throws an error if text is passed but no url is passed", () => {
128
106
  expect(() => render(<Link>Test</Link>)).toThrowError(
129
107
  "`Link` needs the `href` prop."
@@ -229,6 +207,25 @@ describe("Link", () => {
229
207
  </Link>
230
208
  )
231
209
  .toJSON();
210
+ const withChakraProps = renderer
211
+ .create(
212
+ <Link
213
+ href="#passed-in-link"
214
+ id="chakra"
215
+ p="20px"
216
+ color="ui.error.primary"
217
+ >
218
+ Standard
219
+ </Link>
220
+ )
221
+ .toJSON();
222
+ const withOtherProps = renderer
223
+ .create(
224
+ <Link href="#passed-in-link" id="props" data-testid="props">
225
+ Standard
226
+ </Link>
227
+ )
228
+ .toJSON();
232
229
 
233
230
  expect(standard).toMatchSnapshot();
234
231
  expect(typeForwards).toMatchSnapshot();
@@ -238,6 +235,8 @@ describe("Link", () => {
238
235
  expect(withIconChild).toMatchSnapshot();
239
236
  expect(withAchorChild).toMatchSnapshot();
240
237
  expect(withAchorChildAndIcon).toMatchSnapshot();
238
+ expect(withChakraProps).toMatchSnapshot();
239
+ expect(withOtherProps).toMatchSnapshot();
241
240
  });
242
241
 
243
242
  // TODO:
@@ -1,5 +1,5 @@
1
+ import { Box, chakra, useStyleConfig } from "@chakra-ui/react";
1
2
  import * as React from "react";
2
- import { Box, useStyleConfig } from "@chakra-ui/react";
3
3
 
4
4
  import { LinkTypes } from "./LinkTypes";
5
5
  import Icon from "../Icons/Icon";
@@ -9,8 +9,6 @@ import {
9
9
  IconAlign,
10
10
  IconSizes,
11
11
  } from "../Icons/IconTypes";
12
- import generateUUID from "../../helpers/generateUUID";
13
-
14
12
  export interface LinkProps {
15
13
  /** Optionally pass in additional Chakra-based styles. */
16
14
  additionalStyles?: { [key: string]: any };
@@ -93,16 +91,17 @@ function getExternalIcon(children, linkId) {
93
91
  * A component that uses an `href` prop or a child anchor element, to create
94
92
  * an anchor element with added styling and conventions.
95
93
  */
96
- const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(
97
- (props, ref: any) => {
94
+ export const Link = chakra(
95
+ React.forwardRef<HTMLAnchorElement, LinkProps>((props, ref: any) => {
98
96
  const {
99
97
  additionalStyles = {},
100
98
  attributes,
101
99
  children,
102
100
  className,
103
101
  href,
104
- id = generateUUID(),
102
+ id,
105
103
  type = LinkTypes.Default,
104
+ ...rest
106
105
  } = props;
107
106
 
108
107
  // Merge the necessary props alongside any extra props for the
@@ -152,7 +151,7 @@ const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(
152
151
  const childrenToClone: any = children[0] ? children[0] : children;
153
152
  const childProps = childrenToClone.props;
154
153
  return (
155
- <Box as="span" __css={style}>
154
+ <Box as="span" __css={style} {...rest}>
156
155
  {React.cloneElement(
157
156
  childrenToClone,
158
157
  {
@@ -180,12 +179,13 @@ const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(
180
179
  target={target}
181
180
  {...linkProps}
182
181
  __css={{ ...style, ...additionalStyles }}
182
+ {...rest}
183
183
  >
184
184
  {newChildren}
185
185
  </Box>
186
186
  );
187
187
  }
188
- }
188
+ })
189
189
  );
190
190
 
191
191
  export default Link;