@nypl/design-system-react-components 0.25.13 → 0.26.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 (299) hide show
  1. package/CHANGELOG.md +58 -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/Notification/Notification.d.ts +4 -4
  29. package/dist/components/Pagination/Pagination.d.ts +2 -2
  30. package/dist/components/ProgressIndicator/ProgressIndicator.d.ts +3 -3
  31. package/dist/components/Radio/Radio.d.ts +4 -6
  32. package/dist/components/RadioGroup/RadioGroup.d.ts +12 -6
  33. package/dist/components/SearchBar/SearchBar.d.ts +4 -4
  34. package/dist/components/Select/Select.d.ts +10 -6
  35. package/dist/components/Select/SelectTypes.d.ts +4 -0
  36. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +4 -3
  37. package/dist/components/Slider/Slider.d.ts +6 -4
  38. package/dist/components/StatusBadge/StatusBadge.d.ts +5 -1
  39. package/dist/components/StructuredContent/StructuredContent.d.ts +2 -2
  40. package/dist/components/Table/Table.d.ts +1 -1
  41. package/dist/components/Tabs/Tabs.d.ts +4 -3
  42. package/dist/components/Template/Template.d.ts +4 -3
  43. package/dist/components/Text/Text.d.ts +1 -1
  44. package/dist/components/TextInput/TextInput.d.ts +5 -5
  45. package/dist/components/Toggle/Toggle.d.ts +3 -4
  46. package/dist/components/VideoPlayer/VideoPlayer.d.ts +2 -1
  47. package/dist/design-system-react-components.cjs.development.js +1663 -1139
  48. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  49. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  50. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  51. package/dist/design-system-react-components.esm.js +1667 -1143
  52. package/dist/design-system-react-components.esm.js.map +1 -1
  53. package/dist/hooks/useCarouselStyles.d.ts +3 -2
  54. package/dist/hooks/useNYPLTheme.d.ts +12 -0
  55. package/dist/index.d.ts +4 -1
  56. package/dist/styles.css +1 -1
  57. package/dist/theme/components/button.d.ts +10 -2
  58. package/dist/theme/components/card.d.ts +42 -22
  59. package/dist/theme/components/checkbox.d.ts +5 -4
  60. package/dist/theme/components/checkboxGroup.d.ts +1 -1
  61. package/dist/theme/components/componentWrapper.d.ts +2 -2
  62. package/dist/theme/components/customTable.d.ts +84 -1
  63. package/dist/theme/components/fieldset.d.ts +4 -14
  64. package/dist/theme/components/global.d.ts +23 -17
  65. package/dist/theme/components/heading.d.ts +53 -0
  66. package/dist/theme/components/helperErrorText.d.ts +1 -0
  67. package/dist/theme/components/hero.d.ts +20 -14
  68. package/dist/theme/components/label.d.ts +9 -10
  69. package/dist/theme/components/list.d.ts +99 -9
  70. package/dist/theme/components/radio.d.ts +6 -4
  71. package/dist/theme/components/radioGroup.d.ts +1 -1
  72. package/dist/theme/components/select.d.ts +34 -5
  73. package/dist/theme/components/skeletonLoader.d.ts +2 -2
  74. package/dist/theme/components/slider.d.ts +6 -3
  75. package/dist/theme/components/structuredContent.d.ts +197 -0
  76. package/dist/theme/components/textInput.d.ts +18 -6
  77. package/dist/theme/components/toggle.d.ts +7 -4
  78. package/dist/theme/foundations/global.d.ts +2 -0
  79. package/dist/theme/foundations/radii.d.ts +1 -0
  80. package/dist/theme/foundations/spacing.d.ts +46 -43
  81. package/package.json +5 -6
  82. package/src/components/Accordion/Accordion.stories.mdx +9 -9
  83. package/src/components/Accordion/Accordion.test.tsx +21 -0
  84. package/src/components/Accordion/Accordion.tsx +13 -9
  85. package/src/components/Accordion/__snapshots__/Accordion.test.tsx.snap +276 -27
  86. package/src/components/Autosuggest/Autosuggest.stories.mdx +4 -3
  87. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +21 -5
  88. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +52 -31
  89. package/src/components/Breadcrumbs/Breadcrumbs.tsx +8 -7
  90. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +211 -12
  91. package/src/components/Button/Button.stories.mdx +87 -23
  92. package/src/components/Button/Button.test.tsx +25 -0
  93. package/src/components/Button/Button.tsx +18 -7
  94. package/src/components/Button/__snapshots__/Button.test.tsx.snap +27 -7
  95. package/src/components/Card/Card.stories.mdx +287 -194
  96. package/src/components/Card/Card.test.tsx +102 -0
  97. package/src/components/Card/Card.tsx +73 -32
  98. package/src/components/Card/__snapshots__/Card.test.tsx.snap +195 -35
  99. package/src/components/Chakra/Grid.stories.mdx +4 -4
  100. package/src/components/Checkbox/Checkbox.stories.mdx +62 -10
  101. package/src/components/Checkbox/Checkbox.test.tsx +32 -9
  102. package/src/components/Checkbox/Checkbox.tsx +20 -15
  103. package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +134 -7
  104. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +65 -17
  105. package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +137 -81
  106. package/src/components/CheckboxGroup/CheckboxGroup.tsx +31 -21
  107. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +332 -97
  108. package/src/components/ComponentWrapper/ComponentWrapper.test.tsx +12 -0
  109. package/src/components/ComponentWrapper/ComponentWrapper.tsx +39 -41
  110. package/src/components/ComponentWrapper/__snapshots__/ComponentWrapper.test.tsx.snap +47 -34
  111. package/src/components/DatePicker/DatePicker.stories.mdx +63 -27
  112. package/src/components/DatePicker/DatePicker.test.tsx +89 -13
  113. package/src/components/DatePicker/DatePicker.tsx +62 -56
  114. package/src/components/DatePicker/_DatePicker.scss +71 -13
  115. package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +250 -206
  116. package/src/components/Fieldset/Fieldset.stories.mdx +33 -3
  117. package/src/components/Fieldset/Fieldset.test.tsx +58 -28
  118. package/src/components/Fieldset/Fieldset.tsx +35 -30
  119. package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +40 -19
  120. package/src/components/Form/Form.stories.mdx +72 -39
  121. package/src/components/Form/Form.test.tsx +58 -15
  122. package/src/components/Form/Form.tsx +89 -67
  123. package/src/components/Form/__snapshots__/Form.test.tsx.snap +83 -5
  124. package/src/components/Grid/GridTypes.tsx +7 -7
  125. package/src/components/Grid/SimpleGrid.stories.mdx +34 -6
  126. package/src/components/Grid/SimpleGrid.test.tsx +9 -0
  127. package/src/components/Grid/SimpleGrid.tsx +29 -20
  128. package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +16 -1
  129. package/src/components/Heading/Heading.stories.mdx +36 -3
  130. package/src/components/Heading/Heading.test.tsx +10 -0
  131. package/src/components/Heading/Heading.tsx +56 -50
  132. package/src/components/Heading/__snapshots__/Heading.test.tsx.snap +26 -7
  133. package/src/components/HelperErrorText/HelperErrorText.stories.mdx +64 -42
  134. package/src/components/HelperErrorText/HelperErrorText.test.tsx +15 -0
  135. package/src/components/HelperErrorText/HelperErrorText.tsx +40 -35
  136. package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +35 -4
  137. package/src/components/Hero/Hero.stories.mdx +125 -95
  138. package/src/components/Hero/Hero.test.tsx +33 -0
  139. package/src/components/Hero/Hero.tsx +135 -126
  140. package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +89 -17
  141. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +26 -4
  142. package/src/components/HorizontalRule/HorizontalRule.test.tsx +9 -19
  143. package/src/components/HorizontalRule/HorizontalRule.tsx +9 -26
  144. package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +18 -5
  145. package/src/components/Icons/Icon.stories.mdx +31 -6
  146. package/src/components/Icons/Icon.test.tsx +38 -0
  147. package/src/components/Icons/Icon.tsx +93 -76
  148. package/src/components/Icons/__snapshots__/Icon.test.tsx.snap +129 -0
  149. package/src/components/Image/Image.stories.mdx +29 -5
  150. package/src/components/Image/Image.test.tsx +8 -0
  151. package/src/components/Image/Image.tsx +38 -26
  152. package/src/components/Image/__snapshots__/Image.test.tsx.snap +24 -8
  153. package/src/components/Label/Label.stories.mdx +42 -20
  154. package/src/components/Label/Label.test.tsx +42 -17
  155. package/src/components/Label/Label.tsx +22 -13
  156. package/src/components/Label/__snapshots__/Label.test.tsx.snap +19 -15
  157. package/src/components/Link/Link.stories.mdx +25 -1
  158. package/src/components/Link/Link.test.tsx +21 -0
  159. package/src/components/Link/Link.tsx +8 -8
  160. package/src/components/Link/__snapshots__/Link.test.tsx.snap +37 -11
  161. package/src/components/List/List.stories.mdx +75 -40
  162. package/src/components/List/List.test.tsx +67 -19
  163. package/src/components/List/List.tsx +38 -25
  164. package/src/components/List/ListTypes.tsx +1 -1
  165. package/src/components/List/__snapshots__/List.test.tsx.snap +110 -8
  166. package/src/components/Logo/Logo.stories.mdx +30 -6
  167. package/src/components/Logo/Logo.test.tsx +17 -0
  168. package/src/components/Logo/Logo.tsx +18 -6
  169. package/src/components/Logo/LogoSvgs.tsx +4 -0
  170. package/src/components/Logo/LogoTypes.tsx +2 -0
  171. package/src/components/Logo/__snapshots__/Logo.test.tsx.snap +73 -2
  172. package/src/components/Modal/Modal.stories.mdx +13 -0
  173. package/src/components/Notification/Notification.stories.mdx +25 -1
  174. package/src/components/Notification/Notification.test.tsx +23 -0
  175. package/src/components/Notification/Notification.tsx +46 -44
  176. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +158 -29
  177. package/src/components/Pagination/Pagination.stories.mdx +24 -4
  178. package/src/components/Pagination/Pagination.test.tsx +25 -0
  179. package/src/components/Pagination/Pagination.tsx +6 -6
  180. package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +244 -27
  181. package/src/components/Placeholder/Placeholder.tsx +3 -1
  182. package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +76 -10
  183. package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +81 -11
  184. package/src/components/ProgressIndicator/ProgressIndicator.tsx +17 -9
  185. package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +101 -14
  186. package/src/components/Radio/Radio.stories.mdx +64 -12
  187. package/src/components/Radio/Radio.test.tsx +28 -8
  188. package/src/components/Radio/Radio.tsx +66 -63
  189. package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +103 -6
  190. package/src/components/RadioGroup/RadioGroup.stories.mdx +224 -89
  191. package/src/components/RadioGroup/RadioGroup.test.tsx +122 -62
  192. package/src/components/RadioGroup/RadioGroup.tsx +106 -100
  193. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +1236 -1020
  194. package/src/components/SearchBar/SearchBar.stories.mdx +101 -36
  195. package/src/components/SearchBar/{SearchBar.Test.tsx → SearchBar.test.tsx} +46 -4
  196. package/src/components/SearchBar/SearchBar.tsx +17 -8
  197. package/src/components/SearchBar/__snapshots__/SearchBar.test.tsx.snap +1039 -0
  198. package/src/components/Select/Select.stories.mdx +128 -49
  199. package/src/components/Select/Select.test.tsx +63 -16
  200. package/src/components/Select/Select.tsx +125 -92
  201. package/src/components/Select/SelectTypes.tsx +5 -0
  202. package/src/components/Select/__snapshots__/Select.test.tsx.snap +749 -409
  203. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +42 -10
  204. package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +8 -0
  205. package/src/components/SkeletonLoader/SkeletonLoader.tsx +76 -72
  206. package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +169 -10
  207. package/src/components/Slider/Slider.stories.mdx +91 -42
  208. package/src/components/Slider/Slider.test.tsx +65 -17
  209. package/src/components/Slider/Slider.tsx +26 -19
  210. package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +403 -226
  211. package/src/components/StatusBadge/StatusBadge.stories.mdx +19 -1
  212. package/src/components/StatusBadge/StatusBadge.test.tsx +16 -0
  213. package/src/components/StatusBadge/StatusBadge.tsx +25 -20
  214. package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +22 -3
  215. package/src/components/StructuredContent/StructuredContent.stories.mdx +131 -12
  216. package/src/components/StructuredContent/StructuredContent.test.tsx +34 -0
  217. package/src/components/StructuredContent/StructuredContent.tsx +80 -75
  218. package/src/components/StructuredContent/__snapshots__/StructuredContent.test.tsx.snap +102 -17
  219. package/src/components/StyleGuide/Bidirectionality.stories.mdx +5 -5
  220. package/src/components/StyleGuide/Breakpoints.stories.mdx +6 -6
  221. package/src/components/StyleGuide/Buttons.stories.mdx +2 -12
  222. package/src/components/StyleGuide/ColorCard.tsx +1 -1
  223. package/src/components/StyleGuide/Colors.stories.mdx +1 -2
  224. package/src/components/StyleGuide/DesignTokens.stories.mdx +56 -26
  225. package/src/components/StyleGuide/Forms.stories.mdx +27 -12
  226. package/src/components/StyleGuide/Iconography.stories.mdx +2 -12
  227. package/src/components/StyleGuide/Spacing.stories.mdx +80 -41
  228. package/src/components/StyleGuide/Typography.stories.mdx +30 -21
  229. package/src/components/Table/Table.stories.mdx +38 -11
  230. package/src/components/Table/Table.test.tsx +15 -0
  231. package/src/components/Table/Table.tsx +7 -7
  232. package/src/components/Table/__snapshots__/Table.test.tsx.snap +408 -5
  233. package/src/components/Tabs/Tabs.stories.mdx +52 -3
  234. package/src/components/Tabs/Tabs.test.tsx +16 -0
  235. package/src/components/Tabs/Tabs.tsx +10 -6
  236. package/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap +394 -5
  237. package/src/components/Template/Template.stories.mdx +47 -43
  238. package/src/components/Template/Template.test.tsx +33 -0
  239. package/src/components/Template/Template.tsx +65 -60
  240. package/src/components/Template/__snapshots__/Template.test.tsx.snap +191 -20
  241. package/src/components/Text/Text.stories.mdx +20 -1
  242. package/src/components/Text/Text.test.tsx +12 -0
  243. package/src/components/Text/Text.tsx +6 -4
  244. package/src/components/Text/__snapshots__/Text.test.tsx.snap +21 -4
  245. package/src/components/TextInput/TextInput.stories.mdx +65 -19
  246. package/src/components/TextInput/TextInput.test.tsx +42 -28
  247. package/src/components/TextInput/TextInput.tsx +121 -113
  248. package/src/components/TextInput/__snapshots__/TextInput.test.tsx.snap +96 -73
  249. package/src/components/Toggle/Toggle.stories.mdx +80 -22
  250. package/src/components/Toggle/Toggle.test.tsx +27 -9
  251. package/src/components/Toggle/Toggle.tsx +22 -18
  252. package/src/components/Toggle/__snapshots__/Toggle.test.tsx.snap +128 -5
  253. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +52 -4
  254. package/src/components/VideoPlayer/VideoPlayer.test.tsx +23 -0
  255. package/src/components/VideoPlayer/VideoPlayer.tsx +133 -126
  256. package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +81 -39
  257. package/src/docs/Chakra.stories.mdx +50 -9
  258. package/src/docs/Welcome.stories.mdx +160 -41
  259. package/src/hooks/useCarouselStyles.stories.mdx +22 -2
  260. package/src/hooks/useCarouselStyles.ts +3 -2
  261. package/src/hooks/useNYPLTheme.stories.mdx +101 -0
  262. package/src/hooks/useNYPLTheme.ts +30 -6
  263. package/src/hooks/useWindowSize.stories.mdx +23 -0
  264. package/src/index.ts +4 -1
  265. package/src/styles/base/_place-holder.scss +1 -1
  266. package/src/theme/components/button.ts +15 -7
  267. package/src/theme/components/card.ts +30 -19
  268. package/src/theme/components/checkbox.ts +10 -8
  269. package/src/theme/components/checkboxGroup.ts +1 -1
  270. package/src/theme/components/componentWrapper.ts +2 -2
  271. package/src/theme/components/customTable.ts +39 -31
  272. package/src/theme/components/fieldset.ts +1 -2
  273. package/src/theme/components/global.ts +25 -20
  274. package/src/theme/components/heading.ts +1 -1
  275. package/src/theme/components/helperErrorText.ts +1 -0
  276. package/src/theme/components/hero.ts +13 -15
  277. package/src/theme/components/label.ts +4 -3
  278. package/src/theme/components/list.ts +73 -66
  279. package/src/theme/components/notification.ts +2 -2
  280. package/src/theme/components/radio.ts +9 -9
  281. package/src/theme/components/radioGroup.ts +1 -1
  282. package/src/theme/components/select.ts +35 -22
  283. package/src/theme/components/skeletonLoader.ts +3 -3
  284. package/src/theme/components/slider.ts +8 -7
  285. package/src/theme/components/statusBadge.ts +2 -2
  286. package/src/theme/components/structuredContent.ts +66 -1
  287. package/src/theme/components/tabs.ts +2 -2
  288. package/src/theme/components/template.ts +9 -9
  289. package/src/theme/components/textInput.ts +13 -12
  290. package/src/theme/components/toggle.ts +17 -10
  291. package/src/theme/components/videoPlayer.ts +1 -1
  292. package/src/theme/foundations/colors.ts +1 -1
  293. package/src/theme/foundations/radii.ts +1 -0
  294. package/src/theme/foundations/spacing.ts +70 -22
  295. package/src/theme/foundations/typography.ts +2 -2
  296. package/src/utils/componentCategories.ts +1 -2
  297. package/dist/components/SearchBar/SearchBar.Test.d.ts +0 -1
  298. package/dist/helpers/generateUUID.d.ts +0 -1
  299. 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
  `;
@@ -52,10 +52,23 @@ export const enumValues = getStorybookEnumValues(LinkTypes, "LinkTypes");
52
52
  | Component Version | DS Version |
53
53
  | ----------------- | ---------- |
54
54
  | Added | `0.0.4` |
55
- | Latest | `0.25.9` |
55
+ | Latest | `0.26.0` |
56
+
57
+ ## Table of Contents
58
+
59
+ - [Overview](#overview)
60
+ - [Component Props](#component-props)
61
+ - [Accessibility](#accessibility)
62
+ - [Links With Icons](#links-with-icons)
63
+ - [Anchor Element Rendering](#anchor-element-rendering)
64
+ - [Link with Routers](#link-with-routers)
65
+
66
+ ## Overview
56
67
 
57
68
  <Description of={Link} />
58
69
 
70
+ ## Component Props
71
+
59
72
  <Canvas withToolbar>
60
73
  <Story
61
74
  name="Link with Controls"
@@ -81,6 +94,17 @@ export const enumValues = getStorybookEnumValues(LinkTypes, "LinkTypes");
81
94
 
82
95
  <ArgsTable story="Link with Controls" />
83
96
 
97
+ ## Accessibility
98
+
99
+ The `Link` component should be used for navigation. If an `onClick` user
100
+ interface action is required, a `Button` component should be used instead. The
101
+ `Link` component renders an `<a>` element with the `href` attribute.
102
+
103
+ Resources:
104
+
105
+ - [W3C WAI Link Examples](https://www.w3.org/TR/wai-aria-practices-1.1/examples/link/link.html)
106
+ - [Yale Usability & Web Accessibility Links](https://usability.yale.edu/web-accessibility/articles/links)
107
+
84
108
  ## Links With Icons
85
109
 
86
110
  To render an `Icon` as part of the link, make sure that the `Link` component
@@ -229,6 +229,25 @@ describe("Link", () => {
229
229
  </Link>
230
230
  )
231
231
  .toJSON();
232
+ const withChakraProps = renderer
233
+ .create(
234
+ <Link
235
+ href="#passed-in-link"
236
+ id="chakra"
237
+ p="20px"
238
+ color="ui.error.primary"
239
+ >
240
+ Standard
241
+ </Link>
242
+ )
243
+ .toJSON();
244
+ const withOtherProps = renderer
245
+ .create(
246
+ <Link href="#passed-in-link" id="props" data-testid="props">
247
+ Standard
248
+ </Link>
249
+ )
250
+ .toJSON();
232
251
 
233
252
  expect(standard).toMatchSnapshot();
234
253
  expect(typeForwards).toMatchSnapshot();
@@ -238,6 +257,8 @@ describe("Link", () => {
238
257
  expect(withIconChild).toMatchSnapshot();
239
258
  expect(withAchorChild).toMatchSnapshot();
240
259
  expect(withAchorChildAndIcon).toMatchSnapshot();
260
+ expect(withChakraProps).toMatchSnapshot();
261
+ expect(withOtherProps).toMatchSnapshot();
241
262
  });
242
263
 
243
264
  // 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;
@@ -2,7 +2,7 @@
2
2
 
3
3
  exports[`Link renders the UI snapshot correctly 1`] = `
4
4
  <a
5
- className="css-0"
5
+ className="css-1xdhyk6"
6
6
  href="#passed-in-link"
7
7
  id="standard-link"
8
8
  rel={null}
@@ -14,7 +14,7 @@ exports[`Link renders the UI snapshot correctly 1`] = `
14
14
 
15
15
  exports[`Link renders the UI snapshot correctly 2`] = `
16
16
  <a
17
- className="css-0"
17
+ className="css-1xdhyk6"
18
18
  href="#passed-in-link"
19
19
  id="forwards-link"
20
20
  rel={null}
@@ -23,7 +23,7 @@ exports[`Link renders the UI snapshot correctly 2`] = `
23
23
  Forwards
24
24
  <svg
25
25
  aria-hidden={true}
26
- className="chakra-icon more-link css-onkibi"
26
+ className="chakra-icon more-link css-1grhd2q"
27
27
  focusable={false}
28
28
  id="forwards-link-icon"
29
29
  role="img"
@@ -58,7 +58,7 @@ exports[`Link renders the UI snapshot correctly 2`] = `
58
58
 
59
59
  exports[`Link renders the UI snapshot correctly 3`] = `
60
60
  <a
61
- className="css-0"
61
+ className="css-1xdhyk6"
62
62
  href="#passed-in-link"
63
63
  id="backwards-link"
64
64
  rel={null}
@@ -66,7 +66,7 @@ exports[`Link renders the UI snapshot correctly 3`] = `
66
66
  >
67
67
  <svg
68
68
  aria-hidden={true}
69
- className="chakra-icon more-link css-onkibi"
69
+ className="chakra-icon more-link css-1grhd2q"
70
70
  focusable={false}
71
71
  id="backwards-link-icon"
72
72
  role="img"
@@ -102,7 +102,7 @@ exports[`Link renders the UI snapshot correctly 3`] = `
102
102
 
103
103
  exports[`Link renders the UI snapshot correctly 4`] = `
104
104
  <a
105
- className="css-0"
105
+ className="css-1xdhyk6"
106
106
  href="#passed-in-link"
107
107
  id="external-link"
108
108
  rel="nofollow"
@@ -111,7 +111,7 @@ exports[`Link renders the UI snapshot correctly 4`] = `
111
111
  External
112
112
  <svg
113
113
  aria-hidden={true}
114
- className="chakra-icon more-link css-onkibi"
114
+ className="chakra-icon more-link css-1grhd2q"
115
115
  focusable={false}
116
116
  id="external-link-icon"
117
117
  role="img"
@@ -146,7 +146,7 @@ exports[`Link renders the UI snapshot correctly 4`] = `
146
146
 
147
147
  exports[`Link renders the UI snapshot correctly 5`] = `
148
148
  <a
149
- className="css-0"
149
+ className="css-1xdhyk6"
150
150
  href="#passed-in-link"
151
151
  id="button-link"
152
152
  rel={null}
@@ -158,7 +158,7 @@ exports[`Link renders the UI snapshot correctly 5`] = `
158
158
 
159
159
  exports[`Link renders the UI snapshot correctly 6`] = `
160
160
  <a
161
- className="css-0"
161
+ className="css-1xdhyk6"
162
162
  href="#passed-in-link"
163
163
  id="icon-link"
164
164
  rel={null}
@@ -166,7 +166,7 @@ exports[`Link renders the UI snapshot correctly 6`] = `
166
166
  >
167
167
  <svg
168
168
  aria-hidden={true}
169
- className="chakra-icon more-link css-onkibi"
169
+ className="chakra-icon more-link css-1grhd2q"
170
170
  focusable={false}
171
171
  id="link-icon"
172
172
  role="img"
@@ -205,6 +205,7 @@ exports[`Link renders the UI snapshot correctly 7`] = `
205
205
  className="css-0"
206
206
  >
207
207
  <a
208
+ className="css-0"
208
209
  href="#existing-anchor-tag"
209
210
  id="anchor-link"
210
211
  rel={null}
@@ -222,7 +223,7 @@ exports[`Link renders the UI snapshot correctly 8`] = `
222
223
  >
223
224
  <svg
224
225
  aria-hidden={true}
225
- className="chakra-icon css-onkibi"
226
+ className="chakra-icon css-1grhd2q"
226
227
  focusable={false}
227
228
  id="link-icon"
228
229
  role="img"
@@ -259,3 +260,28 @@ exports[`Link renders the UI snapshot correctly 8`] = `
259
260
  </a>
260
261
  </span>
261
262
  `;
263
+
264
+ exports[`Link renders the UI snapshot correctly 9`] = `
265
+ <a
266
+ className="css-kle7zy"
267
+ href="#passed-in-link"
268
+ id="chakra"
269
+ rel={null}
270
+ target={null}
271
+ >
272
+ Standard
273
+ </a>
274
+ `;
275
+
276
+ exports[`Link renders the UI snapshot correctly 10`] = `
277
+ <a
278
+ className="css-1xdhyk6"
279
+ data-testid="props"
280
+ href="#passed-in-link"
281
+ id="props"
282
+ rel={null}
283
+ target={null}
284
+ >
285
+ Standard
286
+ </a>
287
+ `;