@nypl/design-system-react-components 0.25.5 → 0.25.9

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 (275) hide show
  1. package/CHANGELOG.md +91 -1
  2. package/README.md +1 -1
  3. package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +1 -0
  4. package/dist/components/Button/Button.d.ts +6 -6
  5. package/dist/components/Button/ButtonTypes.d.ts +0 -1
  6. package/dist/components/Card/Card.d.ts +6 -4
  7. package/dist/components/Checkbox/Checkbox.d.ts +3 -2
  8. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +3 -2
  9. package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +8 -2
  10. package/dist/components/DatePicker/DatePicker.d.ts +3 -2
  11. package/dist/components/Form/Form.d.ts +2 -2
  12. package/dist/components/Heading/Heading.d.ts +7 -3
  13. package/dist/components/Heading/HeadingTypes.d.ts +6 -6
  14. package/dist/components/HelperErrorText/HelperErrorText.d.ts +5 -2
  15. package/dist/components/HorizontalRule/HorizontalRule.d.ts +2 -2
  16. package/dist/components/Icons/Icon.d.ts +4 -4
  17. package/dist/components/Icons/IconSvgs.d.ts +1 -21
  18. package/dist/components/Icons/IconTypes.d.ts +1 -23
  19. package/dist/components/Image/Image.d.ts +11 -3
  20. package/dist/components/Image/ImageTypes.d.ts +3 -1
  21. package/dist/components/Link/LinkTypes.d.ts +1 -0
  22. package/dist/components/Logo/Logo.d.ts +28 -0
  23. package/dist/components/Logo/LogoSvgs.d.ts +18 -0
  24. package/dist/components/Logo/LogoTypes.d.ts +30 -0
  25. package/dist/components/Modal/Modal.d.ts +0 -4
  26. package/dist/components/Notification/Notification.d.ts +4 -2
  27. package/dist/components/Placeholder/Placeholder.d.ts +3 -5
  28. package/dist/components/Radio/Radio.d.ts +6 -5
  29. package/dist/components/RadioGroup/RadioGroup.d.ts +3 -2
  30. package/dist/components/SearchBar/SearchBar.d.ts +10 -2
  31. package/dist/components/Select/Select.d.ts +5 -2
  32. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +8 -4
  33. package/dist/components/Slider/Slider.d.ts +3 -2
  34. package/dist/components/StatusBadge/StatusBadge.d.ts +2 -1
  35. package/dist/components/StructuredContent/StructuredContent.d.ts +41 -0
  36. package/dist/components/StructuredContent/StructuredContentTypes.d.ts +5 -0
  37. package/dist/components/Table/Table.d.ts +23 -0
  38. package/dist/components/Template/Template.d.ts +8 -3
  39. package/dist/components/Text/Text.d.ts +2 -2
  40. package/dist/components/TextInput/TextInput.d.ts +4 -3
  41. package/dist/components/Toggle/Toggle.d.ts +48 -0
  42. package/dist/components/Toggle/ToggleSizes.d.ts +4 -0
  43. package/dist/components/VideoPlayer/VideoPlayer.d.ts +17 -6
  44. package/dist/design-system-react-components.cjs.development.js +5989 -5490
  45. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  46. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  47. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  48. package/dist/design-system-react-components.esm.js +6057 -5551
  49. package/dist/design-system-react-components.esm.js.map +1 -1
  50. package/dist/index.d.ts +11 -4
  51. package/dist/styles.css +2 -2
  52. package/dist/theme/components/breadcrumb.d.ts +9 -0
  53. package/dist/theme/components/button.d.ts +0 -12
  54. package/dist/theme/components/card.d.ts +14 -2
  55. package/dist/theme/components/customTable.d.ts +47 -0
  56. package/dist/theme/components/fieldset.d.ts +2 -2
  57. package/dist/theme/components/global.d.ts +1 -1
  58. package/dist/theme/components/heading.d.ts +4 -0
  59. package/dist/theme/components/label.d.ts +1 -1
  60. package/dist/theme/components/link.d.ts +14 -1
  61. package/dist/theme/components/list.d.ts +0 -2
  62. package/dist/theme/components/logo.d.ts +4 -0
  63. package/dist/theme/components/notification.d.ts +8 -4
  64. package/dist/theme/components/searchBar.d.ts +7 -13
  65. package/dist/theme/components/select.d.ts +1 -0
  66. package/dist/theme/components/structuredContent.d.ts +33 -0
  67. package/dist/theme/components/template.d.ts +10 -10
  68. package/dist/theme/components/textInput.d.ts +2 -0
  69. package/dist/theme/components/toggle.d.ts +71 -0
  70. package/dist/theme/foundations/spacing.d.ts +2 -0
  71. package/dist/utils/utils.d.ts +10 -0
  72. package/package.json +2 -3
  73. package/src/__tests__/utils/utils.test.ts +23 -1
  74. package/src/components/Accordion/Accordion.stories.mdx +15 -14
  75. package/src/components/Autosuggest/Autosuggest.stories.mdx +2 -1
  76. package/src/components/Autosuggest/Autosuggest.stories.tsx +24 -48
  77. package/src/components/Autosuggest/_Autosuggest.scss +2 -6
  78. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +50 -14
  79. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +20 -0
  80. package/src/components/Breadcrumbs/BreadcrumbsTypes.tsx +1 -0
  81. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +198 -0
  82. package/src/components/Button/Button.stories.mdx +93 -48
  83. package/src/components/Button/Button.test.tsx +0 -12
  84. package/src/components/Button/Button.tsx +7 -8
  85. package/src/components/Button/ButtonTypes.tsx +0 -1
  86. package/src/components/Button/__snapshots__/Button.test.tsx.snap +0 -12
  87. package/src/components/Card/Card.stories.mdx +246 -64
  88. package/src/components/Card/Card.test.tsx +45 -22
  89. package/src/components/Card/Card.tsx +26 -13
  90. package/src/components/Card/__snapshots__/Card.test.tsx.snap +75 -37
  91. package/src/components/Chakra/Box.stories.mdx +3 -3
  92. package/src/components/Chakra/Center.stories.mdx +5 -5
  93. package/src/components/Chakra/Grid.stories.mdx +14 -17
  94. package/src/components/Chakra/Stack.stories.mdx +2 -2
  95. package/src/components/Checkbox/Checkbox.stories.mdx +37 -15
  96. package/src/components/Checkbox/Checkbox.tsx +13 -8
  97. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +48 -16
  98. package/src/components/CheckboxGroup/CheckboxGroup.tsx +14 -10
  99. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +6 -3
  100. package/src/components/ComponentWrapper/ComponentWrapper.test.tsx +151 -0
  101. package/src/components/ComponentWrapper/ComponentWrapper.tsx +36 -23
  102. package/src/components/ComponentWrapper/__snapshots__/ComponentWrapper.test.tsx.snap +85 -0
  103. package/src/components/DatePicker/DatePicker.stories.mdx +63 -18
  104. package/src/components/DatePicker/DatePicker.test.tsx +8 -6
  105. package/src/components/DatePicker/DatePicker.tsx +10 -6
  106. package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +41 -22
  107. package/src/components/Fieldset/Fieldset.stories.mdx +19 -8
  108. package/src/components/Form/Form.stories.mdx +49 -41
  109. package/src/components/Form/Form.tsx +5 -4
  110. package/src/components/Grid/SimpleGrid.stories.mdx +26 -26
  111. package/src/components/Heading/Heading.stories.mdx +59 -23
  112. package/src/components/Heading/Heading.test.tsx +82 -18
  113. package/src/components/Heading/Heading.tsx +31 -31
  114. package/src/components/Heading/HeadingTypes.tsx +6 -6
  115. package/src/components/Heading/__snapshots__/Heading.test.tsx.snap +71 -0
  116. package/src/components/HelperErrorText/HelperErrorText.stories.mdx +55 -27
  117. package/src/components/HelperErrorText/HelperErrorText.test.tsx +42 -15
  118. package/src/components/HelperErrorText/HelperErrorText.tsx +24 -24
  119. package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +41 -4
  120. package/src/components/Hero/Hero.stories.mdx +72 -53
  121. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +9 -8
  122. package/src/components/HorizontalRule/HorizontalRule.tsx +2 -4
  123. package/src/components/Icons/Icon.stories.mdx +77 -75
  124. package/src/components/Icons/Icon.tsx +4 -5
  125. package/src/components/Icons/IconSvgs.tsx +2 -42
  126. package/src/components/Icons/IconTypes.tsx +1 -24
  127. package/src/components/Image/Image.stories.mdx +214 -104
  128. package/src/components/Image/Image.test.tsx +10 -0
  129. package/src/components/Image/Image.tsx +21 -10
  130. package/src/components/Image/ImageTypes.ts +2 -0
  131. package/src/components/Image/__snapshots__/Image.test.tsx.snap +24 -8
  132. package/src/components/Label/Label.stories.mdx +21 -20
  133. package/src/components/Link/Link.stories.mdx +103 -53
  134. package/src/components/Link/Link.test.tsx +108 -7
  135. package/src/components/Link/Link.tsx +58 -19
  136. package/src/components/Link/LinkTypes.tsx +1 -0
  137. package/src/components/Link/__snapshots__/Link.test.tsx.snap +261 -0
  138. package/src/components/List/List.stories.mdx +36 -24
  139. package/src/components/Logo/Logo.stories.mdx +220 -0
  140. package/src/components/Logo/Logo.test.tsx +98 -0
  141. package/src/components/Logo/Logo.tsx +97 -0
  142. package/src/components/Logo/LogoSvgs.tsx +34 -0
  143. package/src/components/Logo/LogoTypes.tsx +32 -0
  144. package/src/components/Logo/__snapshots__/Logo.test.tsx.snap +71 -0
  145. package/src/components/Modal/Modal.stories.mdx +20 -5
  146. package/src/components/Modal/Modal.tsx +2 -8
  147. package/src/components/Notification/Notification.stories.mdx +96 -40
  148. package/src/components/Notification/Notification.test.tsx +62 -16
  149. package/src/components/Notification/Notification.tsx +26 -9
  150. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +121 -0
  151. package/src/components/Pagination/Pagination.stories.mdx +18 -8
  152. package/src/components/Pagination/Pagination.tsx +1 -1
  153. package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +42 -0
  154. package/src/components/Placeholder/Placeholder.tsx +7 -14
  155. package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +74 -46
  156. package/src/components/Radio/Radio.stories.mdx +39 -19
  157. package/src/components/Radio/Radio.tsx +13 -9
  158. package/src/components/RadioGroup/RadioGroup.stories.mdx +50 -16
  159. package/src/components/RadioGroup/RadioGroup.tsx +15 -11
  160. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +6 -3
  161. package/src/components/SearchBar/SearchBar.Test.tsx +114 -22
  162. package/src/components/SearchBar/SearchBar.stories.mdx +111 -33
  163. package/src/components/SearchBar/SearchBar.tsx +57 -33
  164. package/src/components/Select/Select.stories.mdx +177 -66
  165. package/src/components/Select/Select.test.tsx +2 -2
  166. package/src/components/Select/Select.tsx +22 -12
  167. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +50 -16
  168. package/src/components/SkeletonLoader/SkeletonLoader.tsx +8 -4
  169. package/src/components/Slider/Slider.stories.mdx +74 -23
  170. package/src/components/Slider/Slider.test.tsx +35 -0
  171. package/src/components/Slider/Slider.tsx +22 -11
  172. package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +60 -30
  173. package/src/components/StatusBadge/StatusBadge.stories.mdx +33 -18
  174. package/src/components/StatusBadge/StatusBadge.tsx +2 -1
  175. package/src/components/StructuredContent/StructuredContent.stories.mdx +427 -0
  176. package/src/components/StructuredContent/StructuredContent.test.tsx +376 -0
  177. package/src/components/StructuredContent/StructuredContent.tsx +153 -0
  178. package/src/components/StructuredContent/StructuredContentTypes.tsx +5 -0
  179. package/src/components/StructuredContent/__snapshots__/StructuredContent.test.tsx.snap +283 -0
  180. package/src/components/StyleGuide/Bidirectionality.stories.mdx +32 -83
  181. package/src/components/StyleGuide/Breakpoints.stories.mdx +1 -11
  182. package/src/components/StyleGuide/Buttons.stories.mdx +3 -18
  183. package/src/components/StyleGuide/ColorCard.tsx +1 -2
  184. package/src/components/StyleGuide/Colors.stories.mdx +3 -11
  185. package/src/components/StyleGuide/DesignTokens.stories.mdx +3 -8
  186. package/src/components/StyleGuide/Forms.stories.mdx +2 -10
  187. package/src/components/StyleGuide/Iconography.stories.mdx +8 -34
  188. package/src/components/StyleGuide/Spacing.stories.mdx +3 -14
  189. package/src/components/StyleGuide/Typography.stories.mdx +64 -76
  190. package/src/components/Table/Table.stories.mdx +66 -0
  191. package/src/components/Table/Table.test.tsx +60 -0
  192. package/src/components/Table/Table.tsx +116 -0
  193. package/src/components/Tabs/Tabs.stories.mdx +19 -13
  194. package/src/components/Tabs/Tabs.test.tsx +1 -1
  195. package/src/components/Template/Template.stories.mdx +57 -49
  196. package/src/components/Template/Template.test.tsx +65 -5
  197. package/src/components/Template/Template.tsx +35 -5
  198. package/src/components/Template/__snapshots__/Template.test.tsx.snap +76 -0
  199. package/src/components/Text/Text.stories.mdx +33 -11
  200. package/src/components/Text/Text.tsx +2 -2
  201. package/src/components/TextInput/TextInput.stories.mdx +84 -17
  202. package/src/components/TextInput/TextInput.test.tsx +96 -0
  203. package/src/components/TextInput/TextInput.tsx +12 -8
  204. package/src/components/TextInput/__snapshots__/TextInput.test.tsx.snap +240 -0
  205. package/src/components/Toggle/Toggle.stories.mdx +200 -0
  206. package/src/components/Toggle/Toggle.test.tsx +140 -0
  207. package/src/components/Toggle/Toggle.tsx +123 -0
  208. package/src/components/Toggle/ToggleSizes.tsx +4 -0
  209. package/src/components/Toggle/__snapshots__/Toggle.test.tsx.snap +255 -0
  210. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +96 -25
  211. package/src/components/VideoPlayer/VideoPlayer.test.tsx +103 -1
  212. package/src/components/VideoPlayer/VideoPlayer.tsx +72 -22
  213. package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +57 -3
  214. package/src/docs/Chakra.stories.mdx +5 -8
  215. package/src/docs/Intro.stories.mdx +2 -2
  216. package/src/index.ts +13 -4
  217. package/src/styles/base/_03-base.scss +1 -1
  218. package/src/styles/base/_place-holder.scss +7 -7
  219. package/src/styles.scss +1 -5
  220. package/src/theme/components/breadcrumb.ts +14 -4
  221. package/src/theme/components/button.ts +5 -12
  222. package/src/theme/components/card.ts +9 -7
  223. package/src/theme/components/checkbox.ts +1 -1
  224. package/src/theme/components/customTable.ts +50 -0
  225. package/src/theme/components/datePicker.ts +1 -1
  226. package/src/theme/components/global.ts +7 -7
  227. package/src/theme/components/heading.ts +13 -11
  228. package/src/theme/components/helperErrorText.ts +1 -1
  229. package/src/theme/components/icon.ts +2 -2
  230. package/src/theme/components/image.ts +9 -1
  231. package/src/theme/components/link.ts +17 -5
  232. package/src/theme/components/list.ts +1 -3
  233. package/src/theme/components/logo.ts +54 -0
  234. package/src/theme/components/notification.ts +9 -7
  235. package/src/theme/components/searchBar.ts +7 -13
  236. package/src/theme/components/select.ts +1 -0
  237. package/src/theme/components/statusBadge.ts +1 -1
  238. package/src/theme/components/structuredContent.ts +54 -0
  239. package/src/theme/components/template.ts +10 -10
  240. package/src/theme/components/text.ts +6 -6
  241. package/src/theme/components/textInput.ts +1 -0
  242. package/src/theme/components/toggle.ts +69 -0
  243. package/src/theme/components/videoPlayer.ts +0 -2
  244. package/src/theme/foundations/global.ts +2 -2
  245. package/src/theme/foundations/spacing.ts +3 -0
  246. package/src/theme/foundations/typography.ts +84 -12
  247. package/src/theme/index.ts +8 -0
  248. package/src/utils/componentCategories.ts +4 -2
  249. package/src/utils/utils.ts +17 -0
  250. package/dist/__tests__/utils/bem.test.d.ts +0 -1
  251. package/dist/components/CardEdition/CardEdition.d.ts +0 -21
  252. package/dist/components/CardEdition/CardEdition.stories.d.ts +0 -27
  253. package/dist/components/Input/Input.d.ts +0 -36
  254. package/dist/components/Input/Input.stories.d.ts +0 -29
  255. package/dist/components/Input/InputTypes.d.ts +0 -6
  256. package/dist/components/StyleGuide/UIDocCard.d.ts +0 -11
  257. package/dist/helpers/CSSVariablesHelper.d.ts +0 -3
  258. package/dist/helpers/getCSSVariable.d.ts +0 -1
  259. package/dist/interfaces.d.ts +0 -3
  260. package/dist/utils/bem.d.ts +0 -1
  261. package/src/__tests__/utils/bem.test.ts +0 -37
  262. package/src/components/CardEdition/CardEdition.stories.tsx +0 -122
  263. package/src/components/CardEdition/CardEdition.test.tsx +0 -395
  264. package/src/components/CardEdition/CardEdition.tsx +0 -60
  265. package/src/components/CardEdition/_CardEdition.scss +0 -137
  266. package/src/components/Input/Input.stories.tsx +0 -133
  267. package/src/components/Input/Input.test.tsx +0 -266
  268. package/src/components/Input/Input.tsx +0 -81
  269. package/src/components/Input/InputTypes.tsx +0 -8
  270. package/src/components/Input/_Input.scss +0 -78
  271. package/src/components/StyleGuide/UIDocCard.tsx +0 -36
  272. package/src/helpers/CSSVariablesHelper.tsx +0 -34
  273. package/src/helpers/getCSSVariable.tsx +0 -5
  274. package/src/interfaces.ts +0 -3
  275. package/src/utils/bem.ts +0 -44
@@ -1,31 +1,43 @@
1
- import * as React from "react";
2
1
  import { Box, useMultiStyleConfig } from "@chakra-ui/react";
2
+ import * as React from "react";
3
+
3
4
  import ComponentWrapper from "../ComponentWrapper/ComponentWrapper";
5
+ import { HelperErrorTextType } from "../HelperErrorText/HelperErrorText";
6
+ import { VideoPlayerAspectRatios, VideoPlayerTypes } from "./VideoPlayerTypes";
4
7
  import generateUUID from "../../helpers/generateUUID";
5
8
  import { getVariant } from "../../utils/utils";
6
- import { VideoPlayerAspectRatios, VideoPlayerTypes } from "./VideoPlayerTypes";
7
9
 
8
10
  export interface VideoPlayerProps {
9
- /** Optional aspect ratio prop to control the sizing of the video player; if omitted, the video player defaults to `sixteen-by-nine` */
11
+ /** Optional aspect ratio prop to control the sizing of the video player; if
12
+ * omitted, the video player defaults to `sixteen-by-nine` */
10
13
  aspectRatio?: VideoPlayerAspectRatios;
11
14
  /** Optional className you can add in addition to `video-player` */
12
15
  className?: string;
13
16
  /** Optional string to set the text for a video description */
14
17
  descriptionText?: string;
18
+ /** Optional string to set a code snippet provided by YouTube or Vimeo; the
19
+ * `videoPlayer` component will accept the `embedCode` prop or the `videoId`
20
+ * and `videoType` props */
21
+ embedCode?: string;
15
22
  /** Optional string to set the text for a `Heading` component */
16
23
  headingText?: string;
17
24
  /** Optional string to set the text for a `HelperErrorText` component */
18
- helperText?: string;
25
+ helperText?: HelperErrorTextType;
19
26
  /** ID that other components can cross reference for accessibility purposes */
20
27
  id?: string;
21
- /** Optional title to be added to the `<iframe>` element for improved accessibility; this title should describe in a few words the content of the video; if omitted, a generic title will be added */
28
+ /** Optional title to be added to the `<iframe>` element for improved
29
+ * accessibility; this title should describe in a few words the content of
30
+ * the video; if omitted, a generic title will be added; if a `title`
31
+ * attribute is already present in the `embedCode` prop, this prop will be
32
+ * ignored */
22
33
  iframeTitle?: string;
23
34
  /** Offers the ability to hide the helper/invalid text. */
24
35
  showHelperInvalidText?: boolean;
25
- /** Required YouTube or Vimeo video ID. This value can be pulled from a video's YouTube or Vimeo URL. */
26
- videoId: string;
36
+ /** Required YouTube or Vimeo video ID. This value can be pulled from a
37
+ * video's YouTube or Vimeo URL. */
38
+ videoId?: string;
27
39
  /** Required. Used to specify which video service is being used. */
28
- videoType: VideoPlayerTypes;
40
+ videoType?: VideoPlayerTypes;
29
41
  }
30
42
 
31
43
  export default function VideoPlayer(
@@ -35,6 +47,7 @@ export default function VideoPlayer(
35
47
  aspectRatio,
36
48
  className,
37
49
  descriptionText,
50
+ embedCode,
38
51
  headingText,
39
52
  helperText,
40
53
  id = generateUUID(),
@@ -54,29 +67,64 @@ export default function VideoPlayer(
54
67
  ? `https://player.vimeo.com/video/${videoId}?autoplay=0&loop=0`
55
68
  : `https://www.youtube.com/embed/${videoId}?disablekb=1&autoplay=0&fs=1&modestbranding=0`;
56
69
 
70
+ const iFrameTitleEmbedCode = iframeTitle ? `${iframeTitle}` : `Video player`;
71
+
72
+ const embedCodeFinal =
73
+ embedCode && embedCode.includes("<iframe") && !embedCode.includes("title=")
74
+ ? embedCode.replace(
75
+ `<iframe `,
76
+ `<iframe title="${iFrameTitleEmbedCode}" `
77
+ )
78
+ : embedCode;
79
+
57
80
  const errorMessage =
58
81
  "<strong>Error:</strong> This video player has not been configured properly. Please contact the site administrator.";
59
82
 
60
83
  let isInvalid = false;
61
- if (!videoType && !videoId) {
62
- console.warn("VideoPlayer requires the `videoType` and `videoId` props");
84
+ if (!embedCodeFinal && !videoType && !videoId) {
85
+ console.warn(
86
+ "VideoPlayer requires either the `embedCode` prop or both the `videoType` and `videoId` props."
87
+ );
63
88
  isInvalid = true;
64
- } else if (!videoType) {
65
- console.warn("VideoPlayer requires the `videoType` prop");
89
+ } else if (!embedCodeFinal && !videoType) {
90
+ console.warn(
91
+ "VideoPlayer also requires the `videoType` prop. You have only set the `videoId` prop."
92
+ );
66
93
  isInvalid = true;
67
- } else if (!videoId) {
68
- console.warn("VideoPlayer requires the `videoId` prop");
94
+ } else if (!embedCodeFinal && !videoId) {
95
+ console.warn(
96
+ "VideoPlayer also requires the `videoId` prop. You have only set the `videoType` prop."
97
+ );
98
+ isInvalid = true;
99
+ } else if (embedCodeFinal && (videoType || videoId)) {
100
+ console.warn(
101
+ "VideoPlayer can accept the `embedCode` prop or the `videoType` and `videoId` props. You have set both."
102
+ );
103
+ isInvalid = true;
104
+ }
105
+
106
+ if (
107
+ videoId &&
108
+ (videoId.includes("://") ||
109
+ videoId.includes("http") ||
110
+ videoId.includes(".") ||
111
+ videoId.includes("youtube") ||
112
+ videoId.includes("vimeo"))
113
+ ) {
114
+ console.warn("The VideoPlayer `videoId` prop is not configured properly.");
69
115
  isInvalid = true;
70
116
  }
71
117
 
72
118
  if (
73
- videoId.includes("://") ||
74
- videoId.includes("http") ||
75
- videoId.includes(".") ||
76
- videoId.includes("youtube") ||
77
- videoId.includes("vimeo")
119
+ embedCodeFinal &&
120
+ ((!embedCodeFinal.includes("vimeo.com") &&
121
+ !embedCodeFinal.includes("youtube.com")) ||
122
+ !embedCodeFinal.includes("<iframe") ||
123
+ !embedCodeFinal.includes("</iframe"))
78
124
  ) {
79
- console.warn("VideoPlayer `videoId` prop is not configured properly");
125
+ console.warn(
126
+ "The VideoPlayer `embedCode` prop is not configured properly."
127
+ );
80
128
  isInvalid = true;
81
129
  }
82
130
 
@@ -85,7 +133,9 @@ export default function VideoPlayer(
85
133
  : getVariant(aspectRatio, VideoPlayerAspectRatios);
86
134
  const styles = useMultiStyleConfig("VideoPlayer", { variant });
87
135
 
88
- const embedCode = (
136
+ const embedElement = embedCodeFinal ? (
137
+ <span dangerouslySetInnerHTML={{ __html: embedCodeFinal }} />
138
+ ) : (
89
139
  <Box
90
140
  as="iframe"
91
141
  src={videoSrc}
@@ -113,7 +163,7 @@ export default function VideoPlayer(
113
163
  helperText={helperText && showHelperInvalidText ? helperText : null}
114
164
  id={`${id}-componentWrapper`}
115
165
  >
116
- <Box __css={styles.inside}>{embedCode}</Box>
166
+ <Box __css={styles.inside}>{embedElement}</Box>
117
167
  </ComponentWrapper>
118
168
  )}
119
169
  </Box>
@@ -64,17 +64,71 @@ exports[`VideoPlayer renders the UI snapshot correctly 2`] = `
64
64
  aria-atomic={true}
65
65
  aria-live="off"
66
66
  className=" css-0"
67
+ dangerouslySetInnerHTML={
68
+ Object {
69
+ "__html": "VideoPlayer helper test.",
70
+ }
71
+ }
67
72
  data-isinvalid={false}
68
73
  id="video-player-with-text-componentWrapper-helperText"
69
- >
70
- VideoPlayer helper test.
71
- </div>
74
+ />
72
75
  </div>
73
76
  </div>
74
77
  </div>
75
78
  `;
76
79
 
77
80
  exports[`VideoPlayer renders the UI snapshot correctly 3`] = `
81
+ <div
82
+ className="css-0"
83
+ data-testid="video-player-component"
84
+ id="video-player-with-text"
85
+ >
86
+ <div
87
+ className="css-0"
88
+ >
89
+ <h2
90
+ className="chakra-heading css-0"
91
+ id="video-player-with-text-componentWrapper-heading"
92
+ >
93
+ VideoPlayer Heading
94
+ </h2>
95
+ <p
96
+ className="chakra-text css-0"
97
+ >
98
+ VideoPlayer description
99
+ </p>
100
+ <div
101
+ className="css-0"
102
+ >
103
+ <span
104
+ dangerouslySetInnerHTML={
105
+ Object {
106
+ "__html": "<iframe title=\\"Video player\\" src='https://player.vimeo.com/video/421404144?h=5467db7edd' width='640' height='360' frameborder='0' allow='autoplay; fullscreen; picture-in-picture' allowfullscreen></iframe>",
107
+ }
108
+ }
109
+ />
110
+ </div>
111
+ <div
112
+ className="css-0"
113
+ >
114
+ <div
115
+ aria-atomic={true}
116
+ aria-live="off"
117
+ className=" css-0"
118
+ dangerouslySetInnerHTML={
119
+ Object {
120
+ "__html": "VideoPlayer helper test.",
121
+ }
122
+ }
123
+ data-isinvalid={false}
124
+ id="video-player-with-text-componentWrapper-helperText"
125
+ />
126
+ </div>
127
+ </div>
128
+ </div>
129
+ `;
130
+
131
+ exports[`VideoPlayer renders the UI snapshot correctly 4`] = `
78
132
  <div
79
133
  className="css-0"
80
134
  data-testid="video-player-component"
@@ -1,4 +1,4 @@
1
- import { Meta } from "@storybook/addon-docs/blocks";
1
+ import { Meta } from "@storybook/addon-docs";
2
2
 
3
3
  <Meta title="Chakra UI" />
4
4
 
@@ -141,9 +141,7 @@ function Tabs(props) {
141
141
 
142
142
  #### Patterns
143
143
 
144
- The NYPL DS uses the [CSS BEM](http://getbem.com/introduction/) pattern to
145
- structure and write CSS, but it is slowly being phased out. We are moving away
146
- from this and re-writing SCSS classes into Javascript objects that work with
144
+ We are writing CSS style object rules into Javascript objects that work with
147
145
  Chakra's theme. Instead of creating a variant for a component with a class name,
148
146
  now different props or internal logic are used to get the appropriate variant.
149
147
  Internally, the right variant will be mapped to a Chakra theme variant that will
@@ -172,10 +170,6 @@ to test them ourselves.
172
170
 
173
171
  ## Styling
174
172
 
175
- As mentioned in the [Components composed with Chakra](#components-composed-with-chakra)
176
- section, we are moving away from using the BEM structure to using Javascript
177
- objects to extend Chakra's theme.
178
-
179
173
  The NYPL DS' theme file can be found at `src/theme/index.ts`. This creates a new
180
174
  theme that extends Chakra's theme and is set in the `DSProvider` component. Note
181
175
  that the example below is the general structure of the `theme` object but the DS
@@ -183,6 +177,9 @@ that the example below is the general structure of the `theme` object but the DS
183
177
  only work and add new object values in the `components` obejct key for new
184
178
  components and their theme or variants.
185
179
 
180
+ _Note_: There are some SCSS files used to style third party plugins and to
181
+ generate SCSS mixins.
182
+
186
183
  ```ts
187
184
  const theme = extendTheme({
188
185
  styles: { ... },
@@ -1,9 +1,9 @@
1
- import { Meta } from "@storybook/addon-docs/blocks";
1
+ import { Meta } from "@storybook/addon-docs";
2
+
2
3
  import Hero from "../components/Hero/Hero.tsx";
3
4
  import { HeroTypes } from "../components/Hero/HeroTypes.tsx";
4
5
  import Heading from "../components/Heading/Heading.tsx";
5
6
  import Image from "../components/Image/Image.tsx";
6
- import getCSSVariable from "../helpers/getCSSVariable";
7
7
  import DSProvider from "../theme/provider";
8
8
 
9
9
  <Meta title="Introduction" />
package/src/index.ts CHANGED
@@ -26,7 +26,6 @@ export {
26
26
  CardHeading,
27
27
  } from "./components/Card/Card";
28
28
  export { CardLayouts } from "./components/Card/CardTypes";
29
- export { default as CardEdition } from "./components/CardEdition/CardEdition";
30
29
  export { default as Checkbox } from "./components/Checkbox/Checkbox";
31
30
  export { default as CheckboxGroup } from "./components/CheckboxGroup/CheckboxGroup";
32
31
  export { CheckboxGroupLayoutTypes } from "./components/CheckboxGroup/CheckboxGroupLayoutTypes";
@@ -54,7 +53,6 @@ export {
54
53
  IconRotationTypes,
55
54
  IconSizes,
56
55
  IconTypes,
57
- LogoNames,
58
56
  } from "./components/Icons/IconTypes";
59
57
  export { default as Image } from "./components/Image/Image";
60
58
  export {
@@ -62,17 +60,22 @@ export {
62
60
  ImageSizes,
63
61
  ImageTypes,
64
62
  } from "./components/Image/ImageTypes";
65
- export { default as Input } from "./components/Input/Input";
66
- export { InputTypes } from "./components/Input/InputTypes";
67
63
  export { default as Label } from "./components/Label/Label";
68
64
  export { default as Link } from "./components/Link/Link";
69
65
  export { LinkTypes } from "./components/Link/LinkTypes";
70
66
  export { default as List } from "./components/List/List";
71
67
  export { ListTypes } from "./components/List/ListTypes";
68
+ export { default as Logo } from "./components/Logo/Logo";
69
+ export { LogoColors, LogoNames, LogoSizes } from "./components/Logo/LogoTypes";
72
70
  export { default as Modal } from "./components/Modal/Modal";
73
71
  export { default as Notification } from "./components/Notification/Notification";
74
72
  export { NotificationTypes } from "./components/Notification/NotificationTypes";
75
73
  export { default as Pagination } from "./components/Pagination/Pagination";
74
+ export { default as ProgressIndicator } from "./components/ProgressIndicator/ProgressIndicator";
75
+ export {
76
+ ProgressIndicatorSizes,
77
+ ProgressIndicatorTypes,
78
+ } from "./components/ProgressIndicator/ProgressIndicatorTypes";
76
79
  export { default as Radio } from "./components/Radio/Radio";
77
80
  export { default as RadioGroup } from "./components/RadioGroup/RadioGroup";
78
81
  export { RadioGroupLayoutTypes } from "./components/RadioGroup/RadioGroupLayoutTypes";
@@ -84,8 +87,11 @@ export {
84
87
  SkeletonLoaderImageRatios,
85
88
  SkeletonLoaderLayouts,
86
89
  } from "./components/SkeletonLoader/SkeletonLoaderTypes";
90
+ export { default as Slider } from "./components/Slider/Slider";
87
91
  export { default as StatusBadge } from "./components/StatusBadge/StatusBadge";
88
92
  export { StatusBadgeTypes } from "./components/StatusBadge/StatusBadgeTypes";
93
+ export { default as StructuredContent } from "./components/StructuredContent/StructuredContent";
94
+ export { StructuredContentImagePosition } from "./components/StructuredContent/StructuredContentTypes";
89
95
  export {
90
96
  Tabs,
91
97
  TabList,
@@ -111,9 +117,12 @@ export {
111
117
  TextInputRefType,
112
118
  } from "./components/TextInput/TextInput";
113
119
  export { TextInputTypes } from "./components/TextInput/TextInputTypes";
120
+ export { default as Toggle } from "./components/Toggle/Toggle";
121
+ export { ToggleSizes } from "./components/Toggle/ToggleSizes";
114
122
  export { default as useNYPLTheme } from "./hooks/useNYPLTheme";
115
123
  export { default as VideoPlayer } from "./components/VideoPlayer/VideoPlayer";
116
124
  export {
117
125
  VideoPlayerAspectRatios,
118
126
  VideoPlayerTypes,
119
127
  } from "./components/VideoPlayer/VideoPlayerTypes";
128
+ export { default as Table } from "./components/Table/Table";
@@ -5,7 +5,7 @@
5
5
  font-family: var(--nypl-fonts-body);
6
6
 
7
7
  // Sets up the base font-size, 1rem, for the system
8
- font-size: 16px;
8
+ font-size: var(--nypl-fontSizes-text-default);
9
9
  font-weight: 300;
10
10
  line-height: 1.5;
11
11
 
@@ -6,13 +6,6 @@
6
6
  margin-bottom: var(--nypl-space-xl);
7
7
  }
8
8
 
9
- &--full {
10
- margin-bottom: var(--nypl-space-xxl);
11
- @include breakpoint($nypl-breakpoint-large) {
12
- margin-bottom: var(--nypl-space-xxxl);
13
- }
14
- }
15
-
16
9
  padding: var(--nypl-space-s);
17
10
 
18
11
  align-items: center;
@@ -25,6 +18,13 @@
25
18
  padding: 4rem 1rem;
26
19
  width: 100%;
27
20
 
21
+ &--full {
22
+ margin-bottom: var(--nypl-space-xxl);
23
+ @include breakpoint($nypl-breakpoint-large) {
24
+ margin-bottom: var(--nypl-space-xxxl);
25
+ }
26
+ }
27
+
28
28
  &--short {
29
29
  padding: 1rem 1rem;
30
30
  }
package/src/styles.scss CHANGED
@@ -20,11 +20,7 @@
20
20
  @import "./styles/space/_space-inset";
21
21
  @import "./styles/space/_space-stack";
22
22
 
23
- // Legacy/deprecated components:
24
- @import "./components/CardEdition/_CardEdition.scss";
25
- @import "./components/Input/_Input.scss";
26
-
27
23
  // Components.
28
- @import "./components/Autosuggest/_Autosuggest.scss"; // Depends on _Input.scss
24
+ @import "./components/Autosuggest/_Autosuggest.scss";
29
25
  @import "./components/DatePicker/_DatePicker.scss";
30
26
  @import "./components/Modal/_Modal.scss";
@@ -1,9 +1,18 @@
1
1
  // Variant styling
2
+ const blogs = {
3
+ bg: "section.blogs.secondary",
4
+ color: "ui.black",
5
+ a: {
6
+ _hover: {
7
+ color: "ui.gray.xdark",
8
+ },
9
+ },
10
+ };
2
11
  const booksAndMore = {
3
12
  bg: "section.books-and-more.secondary",
4
13
  };
5
14
  const locations = {
6
- bg: "section.locations.secondary",
15
+ bg: "section.locations.primary",
7
16
  };
8
17
  const research = {
9
18
  bg: "section.research.secondary",
@@ -16,8 +25,8 @@ const Breadcrumb = {
16
25
  baseStyle: {
17
26
  bg: "ui.black",
18
27
  color: "ui.white",
19
- fontSize: "-1",
20
- fontWeight: "regular",
28
+ fontSize: "breadcrumbs.default",
29
+ fontWeight: "breadcrumbs.default",
21
30
  paddingBottom: "xs",
22
31
  paddingTop: "xs",
23
32
  ol: {
@@ -34,7 +43,7 @@ const Breadcrumb = {
34
43
  },
35
44
  },
36
45
  "li:last-child": {
37
- fontWeight: { base: "regular", md: "bold" },
46
+ fontWeight: { base: "breadcrumbs.default", md: "breadcrumbs.lastChild" },
38
47
  ".chakra-breadcrumb__link": {
39
48
  _hover: {
40
49
  cursor: "default",
@@ -67,6 +76,7 @@ const Breadcrumb = {
67
76
  },
68
77
  // Available variants:
69
78
  variants: {
79
+ blogs,
70
80
  booksAndMore,
71
81
  locations,
72
82
  research,
@@ -10,7 +10,7 @@ const baseStyle = {
10
10
  px: "s",
11
11
  textDecoration: "none",
12
12
  wordWrap: "normal",
13
- fontWeight: "regular",
13
+ fontWeight: "button.default",
14
14
  svg: {
15
15
  fill: "currentColor",
16
16
  marginTop: "xxs",
@@ -34,14 +34,14 @@ const primary = {
34
34
  bg: "ui.link.primary",
35
35
  minWidth: "none",
36
36
  height: "none",
37
- fontSize: "-1",
37
+ fontSize: "button.default",
38
38
  };
39
39
  const secondary = {
40
40
  bg: "ui.white",
41
41
  border: "1px solid",
42
42
  borderColor: "ui.gray.light-cool",
43
43
  color: "inherit",
44
- fontSize: "-1",
44
+ fontSize: "button.default",
45
45
  _hover: {
46
46
  bg: "ui.gray.xx-light-cool",
47
47
  },
@@ -68,7 +68,7 @@ const pill = {
68
68
  py: "xs",
69
69
  paddingInlineStart: "m",
70
70
  paddingInlineEnd: "m",
71
- fontSize: "-1",
71
+ fontSize: "button.default",
72
72
  _hover: {
73
73
  bg: "ui.gray.xx-light-cool",
74
74
  },
@@ -86,7 +86,7 @@ const iconOnly = {
86
86
  };
87
87
  const callout = {
88
88
  bg: "brand.primary",
89
- fontSize: "-1",
89
+ fontSize: "button.default",
90
90
  _hover: {
91
91
  bg: "brand.secondary",
92
92
  },
@@ -94,12 +94,6 @@ const callout = {
94
94
  bg: "brand.secondary",
95
95
  },
96
96
  };
97
- const searchBar = {
98
- ...primary,
99
- borderLeftRadius: "none",
100
- borderRightRadius: { base: "none", md: "sm" },
101
- lineHeight: "1.75",
102
- };
103
97
  const noBrand = {
104
98
  ...primary,
105
99
  bg: "ui.black",
@@ -119,7 +113,6 @@ const Button = {
119
113
  pill,
120
114
  iconOnly,
121
115
  callout,
122
- searchBar,
123
116
  noBrand,
124
117
  },
125
118
  // Default values
@@ -1,4 +1,6 @@
1
1
  const imageSizes = {
2
+ xxsmall: { flex: { base: "0 0 100%", md: "0 0 64px" }, width: "100%" },
3
+ xsmall: { flex: { md: "0 0 96px" } },
2
4
  small: { flex: { md: "0 0 165px" } },
3
5
  medium: { flex: { md: "0 0 225px" } },
4
6
  large: { flex: { md: "0 0 360px" } },
@@ -32,7 +34,8 @@ const getBodyPaddingStyles = ({ border, hasImage, imageAtEnd, isRow }) => {
32
34
  const Card = {
33
35
  parts: ["body", "heading"],
34
36
  baseStyle: (props) => {
35
- const { border, center, hasImage, imageAtEnd, layout } = props;
37
+ const { border, center, hasImage, imageAtEnd, layout, mainActionLink } =
38
+ props;
36
39
  const isRow = layout === "row";
37
40
  const layoutStyles = isRow
38
41
  ? {
@@ -72,6 +75,7 @@ const Card = {
72
75
  textAlign: center ? "center" : null,
73
76
  heading: {
74
77
  marginBottom: "xs",
78
+ a: mainActionLink ? { color: "ui.black" } : null,
75
79
  },
76
80
  body: {
77
81
  display: { md: "block" },
@@ -131,17 +135,12 @@ const CardContent = {
131
135
  };
132
136
 
133
137
  const CardImage = {
134
- baseStyle: ({ center, imageSize, imageAtEnd, layout }) => {
138
+ baseStyle: ({ center, imageAtEnd, imageSize, layout }) => {
135
139
  // These sizes are only for the "row" layout.
136
140
  const size = imageSizes[imageSize] || {};
137
141
  const layoutStyles =
138
142
  layout === "row"
139
143
  ? {
140
- display: "flex",
141
- flexFlow: {
142
- base: "column nowrap",
143
- md: "row",
144
- },
145
144
  flex: { md: "0 0 225px" },
146
145
  maxWidth: { base: "100%", md: "50%" },
147
146
  textAlign: "left",
@@ -152,10 +151,12 @@ const CardImage = {
152
151
  ? "0 0 0 var(--nypl-space-m)"
153
152
  : "0 var(--nypl-space-m) 0 0",
154
153
  },
154
+ width: { base: "100%", md: null },
155
155
  ...size,
156
156
  }
157
157
  : {
158
158
  marginBottom: "xs",
159
+ width: "100%",
159
160
  };
160
161
  const imageAtEndStyles = imageAtEnd
161
162
  ? {
@@ -164,6 +165,7 @@ const CardImage = {
164
165
  order: "2",
165
166
  }
166
167
  : {};
168
+
167
169
  return {
168
170
  ...imageAtEndStyles,
169
171
  ...layoutStyles,
@@ -94,7 +94,7 @@ const sizes = {
94
94
  borderRadius: "sm",
95
95
  },
96
96
  // Controls the font-size of the label only.
97
- label: { fontSize: "md" },
97
+ label: { fontSize: "text.default" },
98
98
  },
99
99
  };
100
100
 
@@ -0,0 +1,50 @@
1
+ const baseStyle = ({
2
+ columnHeadersTextColor,
3
+ showRowDividers,
4
+ useRowHeaders,
5
+ }) => ({
6
+ th: {
7
+ border: showRowDividers ? undefined : "none",
8
+ borderBottom: showRowDividers ? undefined : "0px",
9
+ color: columnHeadersTextColor ? columnHeadersTextColor : "ui.black",
10
+ fontSize: "0",
11
+ fontWeight: "bold",
12
+ letterSpacing: "0",
13
+ paddingLeft: 0,
14
+ paddingRight: "m",
15
+ textTransform: "capitalize",
16
+ _first: {
17
+ paddingLeft: showRowDividers ? "m" : null,
18
+ },
19
+ _last: {
20
+ paddingRight: showRowDividers ? "m" : "0",
21
+ },
22
+ },
23
+ td: {
24
+ border: showRowDividers ? undefined : "none",
25
+ borderBottom: showRowDividers ? undefined : "0px",
26
+ letterSpacing: "0",
27
+ paddingLeft: 0,
28
+ paddingRight: "m",
29
+ _first: {
30
+ paddingLeft: showRowDividers && !useRowHeaders ? "m" : null,
31
+ },
32
+ _last: {
33
+ paddingRight: showRowDividers ? "m" : "0",
34
+ },
35
+ },
36
+ caption: {
37
+ captionSide: "top",
38
+ textAlign: "left",
39
+ fontSize: "heading.secondary",
40
+ color: "ui.black",
41
+ textTransform: "capitalize",
42
+ fontWeight: "heading.secondary",
43
+ },
44
+ });
45
+
46
+ const CustomTable = {
47
+ baseStyle,
48
+ };
49
+
50
+ export default CustomTable;
@@ -7,7 +7,7 @@ const DatePicker = {
7
7
  baseStyle: {
8
8
  subLabels: {
9
9
  label: {
10
- fontSize: "12px",
10
+ fontSize: "label.secondary",
11
11
  marginBottom: "0",
12
12
  },
13
13
  },
@@ -19,8 +19,8 @@ const helperTextMargin = {
19
19
  // Used in `Checkbox` and `Radio`.
20
20
  const checkboxRadioLabelStyles = {
21
21
  userSelect: "none",
22
- fontSize: "0",
23
- fontWeight: "light",
22
+ fontSize: "text.default",
23
+ fontWeight: "text.default",
24
24
  marginBottom: "0",
25
25
  marginLeft: "xs",
26
26
  verticalAlign: "middle",
@@ -51,15 +51,15 @@ const checkboxRadioHelperStyle = {
51
51
  const labelLegendText = {
52
52
  alignItems: "baseline",
53
53
  width: "100%",
54
- marginBottom: "s",
55
- fontSize: "14px",
56
- fontWeight: "medium",
54
+ marginBottom: "xs",
55
+ fontSize: "label.default",
56
+ fontWeight: "label.default",
57
57
  display: "flex",
58
58
  justifyContent: "space-between",
59
59
  helper: {
60
60
  marginLeft: "m",
61
- fontWeight: "300",
62
- fontSize: "-1",
61
+ fontSize: "helper.default",
62
+ fontWeight: "helper.default",
63
63
  },
64
64
  };
65
65
  const checkboxRadioGroupStyles = {