@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
@@ -2,7 +2,7 @@
2
2
 
3
3
  exports[`Toggle Renders the UI snapshot correctly 1`] = `
4
4
  <div
5
- className="css-0"
5
+ className="css-1xdhyk6"
6
6
  >
7
7
  <label
8
8
  className="chakra-switch css-18x0has"
@@ -63,7 +63,7 @@ exports[`Toggle Renders the UI snapshot correctly 1`] = `
63
63
 
64
64
  exports[`Toggle Renders the UI snapshot correctly 2`] = `
65
65
  <div
66
- className="css-0"
66
+ className="css-1xdhyk6"
67
67
  >
68
68
  <label
69
69
  className="chakra-switch css-18x0has"
@@ -128,7 +128,7 @@ exports[`Toggle Renders the UI snapshot correctly 2`] = `
128
128
 
129
129
  exports[`Toggle Renders the UI snapshot correctly 3`] = `
130
130
  <div
131
- className="css-0"
131
+ className="css-1xdhyk6"
132
132
  >
133
133
  <label
134
134
  className="chakra-switch css-18x0has"
@@ -192,7 +192,7 @@ exports[`Toggle Renders the UI snapshot correctly 3`] = `
192
192
 
193
193
  exports[`Toggle Renders the UI snapshot correctly 4`] = `
194
194
  <div
195
- className="css-0"
195
+ className="css-1xdhyk6"
196
196
  >
197
197
  <label
198
198
  className="chakra-switch css-18x0has"
@@ -256,7 +256,7 @@ exports[`Toggle Renders the UI snapshot correctly 4`] = `
256
256
 
257
257
  exports[`Toggle Renders the UI snapshot correctly 5`] = `
258
258
  <div
259
- className="css-0"
259
+ className="css-1xdhyk6"
260
260
  >
261
261
  <label
262
262
  className="chakra-switch css-18x0has"
@@ -317,3 +317,126 @@ exports[`Toggle Renders the UI snapshot correctly 5`] = `
317
317
  </label>
318
318
  </div>
319
319
  `;
320
+
321
+ exports[`Toggle Renders the UI snapshot correctly 6`] = `
322
+ <div
323
+ className="css-13xjm0o"
324
+ >
325
+ <label
326
+ className="chakra-switch css-18x0has"
327
+ onClick={[Function]}
328
+ >
329
+ <input
330
+ aria-disabled={false}
331
+ aria-invalid={false}
332
+ aria-label="Test Label"
333
+ checked={false}
334
+ className="chakra-switch__input"
335
+ disabled={false}
336
+ id="chakra"
337
+ name="default"
338
+ onBlur={[Function]}
339
+ onChange={[Function]}
340
+ onFocus={[Function]}
341
+ onKeyDown={[Function]}
342
+ onKeyUp={[Function]}
343
+ required={false}
344
+ style={
345
+ Object {
346
+ "border": "0px",
347
+ "clip": "rect(0px, 0px, 0px, 0px)",
348
+ "height": "1px",
349
+ "margin": "-1px",
350
+ "overflow": "hidden",
351
+ "padding": "0px",
352
+ "position": "absolute",
353
+ "whiteSpace": "nowrap",
354
+ "width": "1px",
355
+ }
356
+ }
357
+ type="checkbox"
358
+ />
359
+ <span
360
+ aria-hidden={true}
361
+ className="chakra-switch__track css-14qxnv8"
362
+ onMouseDown={[Function]}
363
+ onMouseEnter={[Function]}
364
+ onMouseLeave={[Function]}
365
+ onMouseUp={[Function]}
366
+ >
367
+ <span
368
+ className="chakra-switch__thumb css-0"
369
+ />
370
+ </span>
371
+ <span
372
+ className="chakra-switch__label css-1y8kf23"
373
+ onMouseDown={[Function]}
374
+ onTouchStart={[Function]}
375
+ >
376
+ Test Label
377
+ </span>
378
+ </label>
379
+ </div>
380
+ `;
381
+
382
+ exports[`Toggle Renders the UI snapshot correctly 7`] = `
383
+ <div
384
+ className="css-1xdhyk6"
385
+ data-testid="props"
386
+ >
387
+ <label
388
+ className="chakra-switch css-18x0has"
389
+ onClick={[Function]}
390
+ >
391
+ <input
392
+ aria-disabled={false}
393
+ aria-invalid={false}
394
+ aria-label="Test Label"
395
+ checked={false}
396
+ className="chakra-switch__input"
397
+ disabled={false}
398
+ id="props"
399
+ name="default"
400
+ onBlur={[Function]}
401
+ onChange={[Function]}
402
+ onFocus={[Function]}
403
+ onKeyDown={[Function]}
404
+ onKeyUp={[Function]}
405
+ required={false}
406
+ style={
407
+ Object {
408
+ "border": "0px",
409
+ "clip": "rect(0px, 0px, 0px, 0px)",
410
+ "height": "1px",
411
+ "margin": "-1px",
412
+ "overflow": "hidden",
413
+ "padding": "0px",
414
+ "position": "absolute",
415
+ "whiteSpace": "nowrap",
416
+ "width": "1px",
417
+ }
418
+ }
419
+ type="checkbox"
420
+ />
421
+ <span
422
+ aria-hidden={true}
423
+ className="chakra-switch__track css-14qxnv8"
424
+ onMouseDown={[Function]}
425
+ onMouseEnter={[Function]}
426
+ onMouseLeave={[Function]}
427
+ onMouseUp={[Function]}
428
+ >
429
+ <span
430
+ className="chakra-switch__thumb css-0"
431
+ />
432
+ </span>
433
+ <span
434
+ className="chakra-switch__label css-1y8kf23"
435
+ onMouseDown={[Function]}
436
+ onTouchStart={[Function]}
437
+ >
438
+ Test Label
439
+ </span>
440
+ </label>
441
+ </div>
442
+ `;
@@ -59,15 +59,36 @@ export const typesEnumValues = getStorybookEnumValues(
59
59
  | Component Version | DS Version |
60
60
  | ----------------- | ---------- |
61
61
  | Added | `0.23.2` |
62
- | Latest | `0.25.9` |
62
+ | Latest | `0.26.0` |
63
+
64
+ ## Table of Contents
65
+
66
+ - [Overview](#overview)
67
+ - [Component Props](#component-props)
68
+ - [Accessibility](#accessibility)
69
+ - [Extracting Video IDs](#extracting-video-ids)
70
+ - [Example Embed Code Snippets](#example-embed-code-snippets)
71
+ - [Errored](#errored)
72
+ - [HTML in Helper Text](#html-in-helper-text)
73
+
74
+ ## Overview
63
75
 
64
76
  <Description of={VideoPlayer} />
65
77
 
66
- The `VideoPlayer` component is used to embed a `Vimeo` or `YouTube` video player on a page. The component requires the `embedCode` prop or both the `videoType` and `videoId` props. The component will not function properly if you try to set all of them.
78
+ The `VideoPlayer` component is used to embed a `Vimeo` or `YouTube` video player
79
+ on a page. The component requires the `embedCode` prop or both the `videoType`
80
+ and `videoId` props. The component will not function properly if you try to set
81
+ all of them.
67
82
 
68
- You can extract the videoId from the video's URL. **IMPORTANT:** Do not try to enter the full video URL as the `videoId` value.
83
+ You can extract the videoId from the video's URL. **IMPORTANT:** Do not try to
84
+ enter the full video URL as the `videoId` value.
69
85
 
70
- The `aspectRatio` prop is used to control the sizing of the space allotted for the video rendering. Ultimately, the `aspectRatio` prop should be set to match the aspect ratio of the video that is being rendered. The default aspect ratio is `16:9`.
86
+ The `aspectRatio` prop is used to control the sizing of the space allotted for
87
+ the video rendering. Ultimately, the `aspectRatio` prop should be set to match
88
+ the aspect ratio of the video that is being rendered. The default aspect ratio
89
+ is `16:9`.
90
+
91
+ ## Component Props
71
92
 
72
93
  <Canvas withToolbar>
73
94
  <Story
@@ -104,6 +125,33 @@ The `aspectRatio` prop is used to control the sizing of the space allotted for t
104
125
  **Example Vimeo IDs:** `474719268`, `491405018`, `493795778` (square)<br />
105
126
  **Example YouTube IDs:** `PfqgDG1qrKg`, `roi5V8ppi7Y`, `nm-dD2tx6bk`
106
127
 
128
+ ## Accessibility
129
+
130
+ The `VideoPlayer` component renders an `iframe` element with either a Vimeo or
131
+ YouTube video. `iframe`s can be accessible if a `title` attribute is provided.
132
+ When passing in a video type and a video `id`, make sure to pass a title. Otherwise,
133
+ the title must already be provided in the embed code value that is passed to the
134
+ `embedCode` prop. A default one is provided but a custom one is recommended.
135
+
136
+ Not all the Vimeo or YouTube videos passed to the `VideoPlayer` component will
137
+ be owned by The New York Public Library. Because these videos are hosted on a
138
+ third-party platform, we cannot guarantee that the video will be accessible.
139
+ Besides setting the `title` in the embedded `iframe`, there are _some_ ways we
140
+ can reduce accessibility issues.
141
+
142
+ - Never use autoplay on videos; a user must click the play button to start the
143
+ video.
144
+ - Always show all the video player's controls for the user to interact with
145
+ the video.
146
+ - Keep the full screen option available.
147
+
148
+ Resources:
149
+
150
+ - [W3C Making Audio and Video Media Accessible](https://www.w3.org/WAI/media/av/)
151
+ - [WebAIM Creating Accessible Frames and Iframes](https://webaim.org/techniques/frames/)
152
+ - [MDN iframe: The Inline Frame element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe)
153
+ - [Deque University Be Sure to Provide Titles for Iframes](https://dequeuniversity.com/tips/provide-iframe-titles)
154
+
107
155
  ## Extracting Video IDs
108
156
 
109
157
  ### Vimeo
@@ -281,10 +281,33 @@ describe("VideoPlayer", () => {
281
281
  />
282
282
  )
283
283
  .toJSON();
284
+ const withChakraProps = renderer
285
+ .create(
286
+ <VideoPlayer
287
+ id="chakra"
288
+ videoId="474719268"
289
+ videoType={VideoPlayerTypes.Vimeo}
290
+ p="20px"
291
+ color="ui.error.primary"
292
+ />
293
+ )
294
+ .toJSON();
295
+ const withOtherProps = renderer
296
+ .create(
297
+ <VideoPlayer
298
+ id="props"
299
+ videoId="474719268"
300
+ videoType={VideoPlayerTypes.Vimeo}
301
+ data-testid="props"
302
+ />
303
+ )
304
+ .toJSON();
284
305
 
285
306
  expect(videoPlayerWithoutText).toMatchSnapshot();
286
307
  expect(videoPlayerWithText).toMatchSnapshot();
287
308
  expect(videoPlayerUsingEmbedCode).toMatchSnapshot();
288
309
  expect(videoPlayerError).toMatchSnapshot();
310
+ expect(withChakraProps).toMatchSnapshot();
311
+ expect(withOtherProps).toMatchSnapshot();
289
312
  });
290
313
  });
@@ -1,10 +1,9 @@
1
- import { Box, useMultiStyleConfig } from "@chakra-ui/react";
1
+ import { Box, chakra, useMultiStyleConfig } from "@chakra-ui/react";
2
2
  import * as React from "react";
3
3
 
4
4
  import ComponentWrapper from "../ComponentWrapper/ComponentWrapper";
5
5
  import { HelperErrorTextType } from "../HelperErrorText/HelperErrorText";
6
6
  import { VideoPlayerAspectRatios, VideoPlayerTypes } from "./VideoPlayerTypes";
7
- import generateUUID from "../../helpers/generateUUID";
8
7
  import { getVariant } from "../../utils/utils";
9
8
 
10
9
  export interface VideoPlayerProps {
@@ -40,139 +39,147 @@ export interface VideoPlayerProps {
40
39
  videoType?: VideoPlayerTypes;
41
40
  }
42
41
 
43
- export default function VideoPlayer(
44
- props: React.PropsWithChildren<VideoPlayerProps>
45
- ) {
46
- const {
47
- aspectRatio,
48
- className,
49
- descriptionText,
50
- embedCode,
51
- headingText,
52
- helperText,
53
- id = generateUUID(),
54
- iframeTitle,
55
- showHelperInvalidText = true,
56
- videoId,
57
- videoType,
58
- } = props;
42
+ export const VideoPlayer = chakra(
43
+ (props: React.PropsWithChildren<VideoPlayerProps>) => {
44
+ const {
45
+ aspectRatio,
46
+ className,
47
+ descriptionText,
48
+ embedCode,
49
+ headingText,
50
+ helperText,
51
+ id,
52
+ iframeTitle,
53
+ showHelperInvalidText = true,
54
+ videoId,
55
+ videoType,
56
+ ...rest
57
+ } = props;
59
58
 
60
- const iframeTitleFinal =
61
- videoType === VideoPlayerTypes.Vimeo
62
- ? iframeTitle || "Vimeo video player"
63
- : iframeTitle || "YouTube video player";
59
+ const iframeTitleFinal =
60
+ videoType === VideoPlayerTypes.Vimeo
61
+ ? iframeTitle || "Vimeo video player"
62
+ : iframeTitle || "YouTube video player";
64
63
 
65
- const videoSrc =
66
- videoType === VideoPlayerTypes.Vimeo
67
- ? `https://player.vimeo.com/video/${videoId}?autoplay=0&loop=0`
68
- : `https://www.youtube.com/embed/${videoId}?disablekb=1&autoplay=0&fs=1&modestbranding=0`;
64
+ const videoSrc =
65
+ videoType === VideoPlayerTypes.Vimeo
66
+ ? `https://player.vimeo.com/video/${videoId}?autoplay=0&loop=0`
67
+ : `https://www.youtube.com/embed/${videoId}?disablekb=1&autoplay=0&fs=1&modestbranding=0`;
69
68
 
70
- const iFrameTitleEmbedCode = iframeTitle ? `${iframeTitle}` : `Video player`;
69
+ const iFrameTitleEmbedCode = iframeTitle
70
+ ? `${iframeTitle}`
71
+ : `Video player`;
71
72
 
72
- const embedCodeFinal =
73
- embedCode && embedCode.includes("<iframe") && !embedCode.includes("title=")
74
- ? embedCode.replace(
75
- `<iframe `,
76
- `<iframe title="${iFrameTitleEmbedCode}" `
77
- )
78
- : embedCode;
73
+ const embedCodeFinal =
74
+ embedCode &&
75
+ embedCode.includes("<iframe") &&
76
+ !embedCode.includes("title=")
77
+ ? embedCode.replace(
78
+ `<iframe `,
79
+ `<iframe title="${iFrameTitleEmbedCode}" `
80
+ )
81
+ : embedCode;
79
82
 
80
- const errorMessage =
81
- "<strong>Error:</strong> This video player has not been configured " +
82
- "properly. Please contact the site administrator.";
83
+ const errorMessage =
84
+ "<strong>Error:</strong> This video player has not been configured " +
85
+ "properly. Please contact the site administrator.";
83
86
 
84
- let isInvalid = false;
85
- if (!embedCodeFinal && !videoType && !videoId) {
86
- console.warn(
87
- "NYPL Reservoir VideoPlayer: Pass in either the `embedCode` prop or " +
88
- "both the `videoType` and `videoId` props; none were passed."
89
- );
90
- isInvalid = true;
91
- } else if (!embedCodeFinal && !videoType) {
92
- console.warn(
93
- "NYPL Reservoir VideoPlayer: The `videoType` prop is also required. " +
94
- "Only the `videoId` prop was set."
95
- );
96
- isInvalid = true;
97
- } else if (!embedCodeFinal && !videoId) {
98
- console.warn(
99
- "NYPL Reservoir VideoPlayer: The `videoId` prop is also required. " +
100
- "Only the `videoType` prop was set."
101
- );
102
- isInvalid = true;
103
- } else if (embedCodeFinal && (videoType || videoId)) {
104
- console.warn(
105
- "NYPL Reservoir VideoPlayer: Pass in either the `embedCode` prop or " +
106
- "both the `videoType` and `videoId` props; all were set."
107
- );
108
- isInvalid = true;
109
- }
87
+ let isInvalid = false;
88
+ if (!embedCodeFinal && !videoType && !videoId) {
89
+ console.warn(
90
+ "NYPL Reservoir VideoPlayer: Pass in either the `embedCode` prop or " +
91
+ "both the `videoType` and `videoId` props; none were passed."
92
+ );
93
+ isInvalid = true;
94
+ } else if (!embedCodeFinal && !videoType) {
95
+ console.warn(
96
+ "NYPL Reservoir VideoPlayer: The `videoType` prop is also required. " +
97
+ "Only the `videoId` prop was set."
98
+ );
99
+ isInvalid = true;
100
+ } else if (!embedCodeFinal && !videoId) {
101
+ console.warn(
102
+ "NYPL Reservoir VideoPlayer: The `videoId` prop is also required. " +
103
+ "Only the `videoType` prop was set."
104
+ );
105
+ isInvalid = true;
106
+ } else if (embedCodeFinal && (videoType || videoId)) {
107
+ console.warn(
108
+ "NYPL Reservoir VideoPlayer: Pass in either the `embedCode` prop or " +
109
+ "both the `videoType` and `videoId` props; all were set."
110
+ );
111
+ isInvalid = true;
112
+ }
113
+
114
+ if (
115
+ videoId &&
116
+ (videoId.includes("://") ||
117
+ videoId.includes("http") ||
118
+ videoId.includes(".") ||
119
+ videoId.includes("youtube") ||
120
+ videoId.includes("vimeo"))
121
+ ) {
122
+ console.warn(
123
+ "NYPL Reservoir VideoPlayer: The `videoId` prop is not configured properly."
124
+ );
125
+ isInvalid = true;
126
+ }
110
127
 
111
- if (
112
- videoId &&
113
- (videoId.includes("://") ||
114
- videoId.includes("http") ||
115
- videoId.includes(".") ||
116
- videoId.includes("youtube") ||
117
- videoId.includes("vimeo"))
118
- ) {
119
- console.warn(
120
- "NYPL Reservoir VideoPlayer: The `videoId` prop is not configured properly."
128
+ if (
129
+ embedCodeFinal &&
130
+ ((!embedCodeFinal.includes("vimeo.com") &&
131
+ !embedCodeFinal.includes("youtube.com")) ||
132
+ !embedCodeFinal.includes("<iframe") ||
133
+ !embedCodeFinal.includes("</iframe"))
134
+ ) {
135
+ console.warn(
136
+ "NYPL Reservoir VideoPlayer: The `embedCode` prop is not configured properly."
137
+ );
138
+ isInvalid = true;
139
+ }
140
+
141
+ const variant = isInvalid
142
+ ? "invalid"
143
+ : getVariant(aspectRatio, VideoPlayerAspectRatios);
144
+ const styles = useMultiStyleConfig("VideoPlayer", { variant });
145
+
146
+ const embedElement = embedCodeFinal ? (
147
+ <span dangerouslySetInnerHTML={{ __html: embedCodeFinal }} />
148
+ ) : (
149
+ <Box
150
+ as="iframe"
151
+ src={videoSrc}
152
+ title={iframeTitleFinal}
153
+ frameBorder="0"
154
+ allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture"
155
+ allowFullScreen
156
+ __css={styles.iframe}
157
+ />
121
158
  );
122
- isInvalid = true;
123
- }
124
159
 
125
- if (
126
- embedCodeFinal &&
127
- ((!embedCodeFinal.includes("vimeo.com") &&
128
- !embedCodeFinal.includes("youtube.com")) ||
129
- !embedCodeFinal.includes("<iframe") ||
130
- !embedCodeFinal.includes("</iframe"))
131
- ) {
132
- console.warn(
133
- "NYPL Reservoir VideoPlayer: The `embedCode` prop is not configured properly."
160
+ return (
161
+ <Box
162
+ className={className}
163
+ data-testid="video-player-component"
164
+ id={id}
165
+ __css={styles}
166
+ {...rest}
167
+ >
168
+ {isInvalid ? (
169
+ <span dangerouslySetInnerHTML={{ __html: errorMessage }} />
170
+ ) : (
171
+ <ComponentWrapper
172
+ headingText={headingText ? headingText : null}
173
+ descriptionText={descriptionText ? descriptionText : null}
174
+ helperText={helperText && showHelperInvalidText ? helperText : null}
175
+ id={`${id}-componentWrapper`}
176
+ >
177
+ <Box __css={styles.inside}>{embedElement}</Box>
178
+ </ComponentWrapper>
179
+ )}
180
+ </Box>
134
181
  );
135
- isInvalid = true;
136
182
  }
183
+ );
137
184
 
138
- const variant = isInvalid
139
- ? "invalid"
140
- : getVariant(aspectRatio, VideoPlayerAspectRatios);
141
- const styles = useMultiStyleConfig("VideoPlayer", { variant });
142
-
143
- const embedElement = embedCodeFinal ? (
144
- <span dangerouslySetInnerHTML={{ __html: embedCodeFinal }} />
145
- ) : (
146
- <Box
147
- as="iframe"
148
- src={videoSrc}
149
- title={iframeTitleFinal}
150
- frameBorder="0"
151
- allow="accelerometer; autoplay; clipboard-write; encrypted-media; fullscreen; gyroscope; picture-in-picture"
152
- allowFullScreen
153
- __css={styles.iframe}
154
- />
155
- );
156
-
157
- return (
158
- <Box
159
- className={className}
160
- data-testid="video-player-component"
161
- id={id}
162
- __css={styles}
163
- >
164
- {isInvalid ? (
165
- <span dangerouslySetInnerHTML={{ __html: errorMessage }} />
166
- ) : (
167
- <ComponentWrapper
168
- headingText={headingText ? headingText : null}
169
- descriptionText={descriptionText ? descriptionText : null}
170
- helperText={helperText && showHelperInvalidText ? helperText : null}
171
- id={`${id}-componentWrapper`}
172
- >
173
- <Box __css={styles.inside}>{embedElement}</Box>
174
- </ComponentWrapper>
175
- )}
176
- </Box>
177
- );
178
- }
185
+ export default VideoPlayer;