@nypl/design-system-react-components 0.25.2 → 0.25.6

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 (238) hide show
  1. package/CHANGELOG.md +101 -0
  2. package/README.md +47 -11
  3. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +4 -0
  4. package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +1 -0
  5. package/dist/components/Button/Button.d.ts +9 -8
  6. package/dist/components/Button/ButtonTypes.d.ts +2 -1
  7. package/dist/components/Card/Card.d.ts +36 -52
  8. package/dist/components/Card/CardTypes.d.ts +0 -15
  9. package/dist/components/Checkbox/Checkbox.d.ts +8 -9
  10. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +2 -2
  11. package/dist/components/DatePicker/DatePicker.d.ts +36 -36
  12. package/dist/components/Fieldset/Fieldset.d.ts +25 -0
  13. package/dist/components/HelperErrorText/HelperErrorText.d.ts +4 -0
  14. package/dist/components/HorizontalRule/HorizontalRule.d.ts +10 -3
  15. package/dist/components/Icons/Icon.d.ts +4 -0
  16. package/dist/components/Icons/IconSvgs.d.ts +11 -0
  17. package/dist/components/Icons/IconTypes.d.ts +11 -0
  18. package/dist/components/Image/Image.d.ts +19 -9
  19. package/dist/components/Image/ImageTypes.d.ts +20 -0
  20. package/dist/components/Link/Link.d.ts +4 -0
  21. package/dist/components/List/List.d.ts +7 -1
  22. package/dist/components/Notification/Notification.d.ts +6 -4
  23. package/dist/components/Pagination/Pagination.d.ts +16 -13
  24. package/dist/components/Pagination/Pagination.stories.d.ts +2 -0
  25. package/dist/components/ProgressIndicator/ProgressIndicator.d.ts +29 -0
  26. package/dist/components/ProgressIndicator/ProgressIndicatorTypes.d.ts +8 -0
  27. package/dist/components/RadioGroup/RadioGroup.d.ts +2 -2
  28. package/dist/components/SearchBar/SearchBar.d.ts +3 -3
  29. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +18 -14
  30. package/dist/components/Slider/Slider.d.ts +57 -0
  31. package/dist/components/Tabs/Tabs.d.ts +1 -1
  32. package/dist/components/TextInput/TextInput.d.ts +10 -0
  33. package/dist/design-system-react-components.cjs.development.js +3058 -936
  34. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  35. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  36. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  37. package/dist/design-system-react-components.esm.js +3049 -921
  38. package/dist/design-system-react-components.esm.js.map +1 -1
  39. package/dist/index.d.ts +12 -6
  40. package/dist/resources.scss +180 -170
  41. package/dist/styles.css +1 -1
  42. package/dist/theme/components/breadcrumb.d.ts +9 -0
  43. package/dist/theme/components/button.d.ts +22 -8
  44. package/dist/theme/components/card.d.ts +168 -0
  45. package/dist/theme/components/checkbox.d.ts +5 -1
  46. package/dist/theme/components/checkboxGroup.d.ts +12 -0
  47. package/dist/theme/components/datePicker.d.ts +16 -0
  48. package/dist/theme/components/fieldset.d.ts +27 -0
  49. package/dist/theme/components/global.d.ts +23 -13
  50. package/dist/theme/components/globalMixins.d.ts +9 -1
  51. package/dist/theme/components/heading.d.ts +5 -0
  52. package/dist/theme/components/image.d.ts +31 -0
  53. package/dist/theme/components/label.d.ts +5 -3
  54. package/dist/theme/components/link.d.ts +4 -0
  55. package/dist/theme/components/list.d.ts +5 -1
  56. package/dist/theme/components/notification.d.ts +4 -14
  57. package/dist/theme/components/pagination.d.ts +19 -0
  58. package/dist/theme/components/progressIndicator.d.ts +50 -0
  59. package/dist/theme/components/radioGroup.d.ts +12 -0
  60. package/dist/theme/components/select.d.ts +11 -2
  61. package/dist/theme/components/skeletonLoader.d.ts +98 -0
  62. package/dist/theme/components/slider.d.ts +51 -0
  63. package/dist/theme/components/textInput.d.ts +8 -0
  64. package/dist/theme/foundations/breakpoints.d.ts +8 -8
  65. package/dist/theme/foundations/global.d.ts +6 -1
  66. package/package.json +72 -84
  67. package/src/__tests__/setup.ts +2 -2
  68. package/src/components/Accordion/Accordion.stories.mdx +39 -42
  69. package/src/components/Autosuggest/Autosuggest.stories.mdx +3 -3
  70. package/src/components/Autosuggest/Autosuggest.stories.tsx +1 -0
  71. package/src/components/Autosuggest/_Autosuggest.scss +5 -5
  72. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +24 -8
  73. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +33 -0
  74. package/src/components/Breadcrumbs/Breadcrumbs.tsx +5 -1
  75. package/src/components/Breadcrumbs/BreadcrumbsTypes.tsx +1 -0
  76. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +298 -1
  77. package/src/components/Button/Button.stories.mdx +15 -10
  78. package/src/components/Button/Button.test.tsx +21 -7
  79. package/src/components/Button/Button.tsx +18 -33
  80. package/src/components/Button/ButtonTypes.tsx +1 -0
  81. package/src/components/Button/__snapshots__/Button.test.tsx.snap +41 -10
  82. package/src/components/Card/Card.stories.mdx +296 -259
  83. package/src/components/Card/Card.test.tsx +156 -84
  84. package/src/components/Card/Card.tsx +195 -145
  85. package/src/components/Card/CardTypes.tsx +0 -17
  86. package/src/components/Card/__snapshots__/Card.test.tsx.snap +410 -0
  87. package/src/components/CardEdition/CardEdition.stories.tsx +15 -47
  88. package/src/components/CardEdition/_CardEdition.scss +22 -23
  89. package/src/components/Chakra/Box.stories.mdx +14 -15
  90. package/src/components/Chakra/Center.stories.mdx +15 -8
  91. package/src/components/Chakra/Grid.stories.mdx +16 -7
  92. package/src/components/Chakra/Stack.stories.mdx +35 -18
  93. package/src/components/Checkbox/Checkbox.stories.mdx +33 -11
  94. package/src/components/Checkbox/Checkbox.test.tsx +30 -3
  95. package/src/components/Checkbox/Checkbox.tsx +27 -27
  96. package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +90 -2
  97. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +82 -2
  98. package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +1 -1
  99. package/src/components/CheckboxGroup/CheckboxGroup.tsx +14 -15
  100. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +44 -80
  101. package/src/components/DatePicker/DatePicker.stories.mdx +163 -62
  102. package/src/components/DatePicker/DatePicker.test.tsx +248 -65
  103. package/src/components/DatePicker/DatePicker.tsx +158 -130
  104. package/src/components/DatePicker/_DatePicker.scss +33 -67
  105. package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +818 -0
  106. package/src/components/Fieldset/Fieldset.stories.mdx +55 -0
  107. package/src/components/Fieldset/Fieldset.test.tsx +125 -0
  108. package/src/components/Fieldset/Fieldset.tsx +52 -0
  109. package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +68 -0
  110. package/src/components/Form/Form.stories.mdx +4 -5
  111. package/src/components/Form/Form.tsx +1 -0
  112. package/src/components/Grid/SimpleGrid.stories.mdx +32 -39
  113. package/src/components/Grid/SimpleGrid.test.tsx +4 -4
  114. package/src/components/Heading/Heading.stories.mdx +3 -4
  115. package/src/components/HelperErrorText/HelperErrorText.stories.mdx +1 -1
  116. package/src/components/HelperErrorText/HelperErrorText.tsx +5 -1
  117. package/src/components/Hero/HeroTypes.tsx +1 -0
  118. package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +7 -7
  119. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +6 -5
  120. package/src/components/HorizontalRule/HorizontalRule.test.tsx +17 -0
  121. package/src/components/HorizontalRule/HorizontalRule.tsx +21 -4
  122. package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +5 -5
  123. package/src/components/Icons/Icon.stories.mdx +11 -3
  124. package/src/components/Icons/Icon.test.tsx +18 -0
  125. package/src/components/Icons/Icon.tsx +6 -0
  126. package/src/components/Icons/IconSvgs.tsx +22 -0
  127. package/src/components/Icons/IconTypes.tsx +11 -0
  128. package/src/components/Image/Image.stories.mdx +220 -0
  129. package/src/components/Image/Image.test.tsx +131 -29
  130. package/src/components/Image/Image.tsx +84 -56
  131. package/src/components/Image/ImageTypes.ts +22 -0
  132. package/src/components/Image/__snapshots__/Image.test.tsx.snap +190 -0
  133. package/src/components/Input/Input.stories.tsx +20 -64
  134. package/src/components/Input/_Input.scss +23 -14
  135. package/src/components/Link/Link.tsx +4 -1
  136. package/src/components/List/List.stories.mdx +1 -1
  137. package/src/components/List/List.tsx +11 -4
  138. package/src/components/Modal/Modal.stories.mdx +3 -3
  139. package/src/components/Modal/_Modal.scss +2 -2
  140. package/src/components/Notification/Notification.stories.mdx +1 -3
  141. package/src/components/Notification/Notification.tsx +24 -9
  142. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +2 -0
  143. package/src/components/Pagination/Pagination.stories.mdx +26 -27
  144. package/src/components/Pagination/Pagination.stories.tsx +11 -16
  145. package/src/components/Pagination/Pagination.test.tsx +276 -146
  146. package/src/components/Pagination/Pagination.tsx +174 -154
  147. package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +285 -0
  148. package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +292 -0
  149. package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +225 -0
  150. package/src/components/ProgressIndicator/ProgressIndicator.tsx +126 -0
  151. package/src/components/ProgressIndicator/ProgressIndicatorTypes.ts +8 -0
  152. package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +357 -0
  153. package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +3 -0
  154. package/src/components/RadioGroup/RadioGroup.stories.mdx +3 -4
  155. package/src/components/RadioGroup/RadioGroup.tsx +11 -16
  156. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +39 -71
  157. package/src/components/SearchBar/SearchBar.Test.tsx +66 -21
  158. package/src/components/SearchBar/SearchBar.stories.mdx +114 -10
  159. package/src/components/SearchBar/SearchBar.tsx +15 -5
  160. package/src/components/Select/SelectTypes.tsx +1 -0
  161. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +28 -59
  162. package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +97 -177
  163. package/src/components/SkeletonLoader/SkeletonLoader.tsx +74 -71
  164. package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +739 -0
  165. package/src/components/Slider/Slider.stories.mdx +529 -0
  166. package/src/components/Slider/Slider.test.tsx +653 -0
  167. package/src/components/Slider/Slider.tsx +303 -0
  168. package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +1946 -0
  169. package/src/components/StyleGuide/Bidirectionality.stories.mdx +1 -1
  170. package/src/components/StyleGuide/Breakpoints.stories.mdx +21 -7
  171. package/src/components/StyleGuide/Buttons.stories.mdx +69 -15
  172. package/src/components/StyleGuide/ColorCard.tsx +0 -1
  173. package/src/components/StyleGuide/DesignTokens.stories.mdx +170 -0
  174. package/src/components/StyleGuide/Iconography.stories.mdx +51 -62
  175. package/src/components/Tabs/Tabs.tsx +5 -5
  176. package/src/components/Template/Template.stories.mdx +11 -16
  177. package/src/components/TextInput/TextInput.stories.mdx +1 -1
  178. package/src/components/TextInput/TextInput.tsx +23 -6
  179. package/src/components/TextInput/TextInputTypes.tsx +2 -0
  180. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +2 -3
  181. package/src/docs/Chakra.stories.mdx +2 -2
  182. package/src/index.ts +20 -12
  183. package/src/resources.scss +5 -5
  184. package/src/styles/base/{_02-breakpoints.scss → _01-breakpoints.scss} +9 -10
  185. package/src/styles/base/{_03-mixins.scss → _02-mixins.scss} +16 -5
  186. package/src/styles/base/{_04-base.scss → _03-base.scss} +7 -2
  187. package/src/styles/base/{_05-focus.scss → _04-focus.scss} +0 -15
  188. package/src/styles/base/_place-holder.scss +14 -3
  189. package/src/styles/{03-space → space}/_space-inline.scss +14 -14
  190. package/src/styles/{03-space → space}/_space-inset.scss +10 -10
  191. package/src/styles/space/_space-stack.scss +116 -0
  192. package/src/styles.scss +13 -55
  193. package/src/theme/components/breadcrumb.ts +10 -0
  194. package/src/theme/components/button.ts +18 -12
  195. package/src/theme/components/card.ts +174 -0
  196. package/src/theme/components/checkbox.ts +7 -2
  197. package/src/theme/components/checkboxGroup.ts +8 -0
  198. package/src/theme/components/datePicker.ts +17 -0
  199. package/src/theme/components/fieldset.ts +18 -0
  200. package/src/theme/components/global.ts +26 -15
  201. package/src/theme/components/globalMixins.ts +9 -1
  202. package/src/theme/components/heading.ts +5 -0
  203. package/src/theme/components/image.ts +116 -0
  204. package/src/theme/components/label.ts +3 -10
  205. package/src/theme/components/link.ts +4 -0
  206. package/src/theme/components/list.ts +6 -3
  207. package/src/theme/components/notification.ts +12 -14
  208. package/src/theme/components/pagination.ts +20 -0
  209. package/src/theme/components/progressIndicator.ts +62 -0
  210. package/src/theme/components/radioGroup.ts +8 -0
  211. package/src/theme/components/select.ts +5 -2
  212. package/src/theme/components/skeletonLoader.ts +107 -0
  213. package/src/theme/components/slider.ts +79 -0
  214. package/src/theme/components/textInput.ts +2 -0
  215. package/src/theme/foundations/breakpoints.ts +8 -8
  216. package/src/theme/foundations/global.ts +6 -1
  217. package/src/theme/index.ts +22 -4
  218. package/src/utils/componentCategories.ts +4 -3
  219. package/dist/components/Image/Image.stories.d.ts +0 -18
  220. package/dist/theme/components/customCheckboxGroup.d.ts +0 -18
  221. package/dist/theme/components/customRadioGroup.d.ts +0 -18
  222. package/src/components/Button/_Button.scss +0 -32
  223. package/src/components/Card/_Card.scss +0 -308
  224. package/src/components/Image/Image.stories.tsx +0 -54
  225. package/src/components/Image/_Image.scss +0 -38
  226. package/src/components/Pagination/_Pagination.scss +0 -40
  227. package/src/components/SkeletonLoader/_SkeletonLoader.scss +0 -142
  228. package/src/styles/01-colors/_colors-brand.scss +0 -62
  229. package/src/styles/01-colors/_colors-utility.scss +0 -67
  230. package/src/styles/02-typography/_type-scale.css +0 -11
  231. package/src/styles/02-typography/_type-weight.css +0 -7
  232. package/src/styles/02-typography/_typefaces.css +0 -4
  233. package/src/styles/03-space/_space-stack.scss +0 -116
  234. package/src/styles/03-space/_space.css +0 -30
  235. package/src/styles/base/_card-grid.scss +0 -77
  236. package/src/styles/base/_typography.scss +0 -11
  237. package/src/theme/components/customCheckboxGroup.ts +0 -12
  238. package/src/theme/components/customRadioGroup.ts +0 -12
@@ -1,209 +1,259 @@
1
1
  import * as React from "react";
2
- import bem from "../../utils/bem";
2
+ import {
3
+ Box,
4
+ LinkBox as ChakraLinkBox,
5
+ LinkOverlay as ChakraLinkOverlay,
6
+ useMultiStyleConfig,
7
+ useStyleConfig,
8
+ } from "@chakra-ui/react";
3
9
 
4
- import { CardImageRatios, CardImageSizes, CardLayouts } from "./CardTypes";
10
+ import { CardLayouts } from "./CardTypes";
5
11
  import Heading from "../Heading/Heading";
6
- import Image from "../Image/Image";
7
-
8
- interface CardImageProps {
9
- /** Text description of the image */
10
- alt: string;
11
- /** Custom image component used in place of DS `Image` component */
12
- component?: React.ReactNode;
13
- /** ClassName you can add in addition to 'image' */
14
- className?: string;
15
- /** Optional value to control the aspect ratio of the cartd image; default value is `square` */
16
- imageAspectRatio?: CardImageRatios;
17
- /** Optional value to control the size of the card image */
18
- imageSize?: CardImageSizes;
19
- /** The src attribute is required, and contains the path to the image you want to embed. */
20
- src: string;
12
+ import Image, { ImageProps } from "../Image/Image";
13
+ import { ImageRatios, ImageSizes } from "../Image/ImageTypes";
14
+ import generateUUID from "../../helpers/generateUUID";
15
+
16
+ interface CardBaseProps {
17
+ /** Optional value to control the alignment of the text and elements. */
18
+ center?: boolean;
19
+ /** Optional value to render the layout in a row or column (default). */
20
+ layout?: CardLayouts;
21
21
  }
22
22
 
23
- interface CardContentProps {
24
- /** Optional className that would be applied to the `card-content` element */
25
- className?: string;
23
+ interface CardLinkBoxProps {
24
+ /** Main link to use when the full `Card` component should be clickable. */
25
+ mainActionLink?: string;
26
26
  }
27
27
 
28
- interface CardActionsProps {
29
- /** Optional boolean value to control visibility of border on the bottom edge of the card actions element */
28
+ interface CardActionsProps extends CardBaseProps {
29
+ /** Optional boolean value to control visibility of border on the bottom edge
30
+ * of the card actions element */
30
31
  bottomBorder?: boolean;
31
- /** Optional className that would be applied to the `card-actions` element */
32
- className?: string;
33
- /** Modifiers array for use with BEM. See how to work with modifiers and BEM here: http://getbem.com/introduction/ */
34
- modifiers?: string[];
35
- /** Optional boolean value to control visibility of border on the top edge of the card actions element */
32
+ /** Optional boolean value to control visibility of border on the top edge of
33
+ * the card actions element */
36
34
  topBorder?: boolean;
37
35
  }
38
36
 
39
- export interface CardProps {
40
- /** Optional hex color value used to set the card background color */
37
+ interface CardImageProps extends CardBaseProps, ImageProps {
38
+ /** Optional boolean value to control the position of the `CardImage`. */
39
+ imageAtEnd?: boolean;
40
+ }
41
+
42
+ export interface CardProps extends CardBaseProps, CardLinkBoxProps {
43
+ /** Optional hex color value used to set the card background color. */
41
44
  backgroundColor?: string;
42
- /** BlockName for use with BEM. See how to work with blockNames and BEM here: http://getbem.com/introduction/ */
43
- blockName?: string;
44
- /** Optional boolean value to control the visibility of a border around the card */
45
+ /** Optional boolean value to control the visibility of a border around
46
+ * the card. */
45
47
  border?: boolean;
46
- /** Optional boolean value to control the alignment of the text and elements within the card */
47
- center?: boolean;
48
- /** ClassName that appears in addition to "card" */
48
+ /** Optional CSS class name to add. */
49
49
  className?: string;
50
- /** Optional hex color value used to override the default text color */
50
+ /** Optional hex color value used to override the default text color. */
51
51
  foregroundColor?: string;
52
- /** ID that other components can cross reference for accessibility purposes */
52
+ /** ID that other components can cross reference for accessibility purposes. */
53
53
  id?: string;
54
- /** Text description of the image; to follow best practices for accessibility, this prop should not be left blank if `imageSrc` is passed */
54
+ /** Text description of the image; to follow best practices for accessibility,
55
+ * this prop should not be left blank if `imageSrc` is passed. */
55
56
  imageAlt?: string;
56
- /** Optional value to control the aspect ratio of the card image; default value is `square` */
57
- imageAspectRatio?: CardImageRatios;
58
- /** Optional boolean value to control the position of the card image */
57
+ /** Optional value to control the aspect ratio of the `CardIage`; default
58
+ * value is `square`. */
59
+ imageAspectRatio?: ImageRatios;
60
+ /** Optional boolean value to control the position of the `CardImage`. */
59
61
  imageAtEnd?: boolean;
60
- /** Custom image component used in place of DS `Image` component */
61
- imageComponent?: React.ReactNode;
62
- /** Optional value to control the size of the card image */
63
- imageSize?: CardImageSizes;
64
- /** The path to the image displayed with the card */
62
+ /** Custom image component used in place of DS `Image` component. */
63
+ imageComponent?: JSX.Element;
64
+ /** Optional value to control the size of the `CardImage`. */
65
+ imageSize?: ImageSizes;
66
+ /** The path to the image displayed within the `Card` component. */
65
67
  imageSrc?: string;
66
- /** Optional value to control the position of the image placeholder; default value is `column` */
67
- layout?: CardLayouts;
68
- /** Modifiers array for use with BEM. See how to work with modifiers and BEM here: http://getbem.com/introduction/ */
69
- modifiers?: string[];
70
- /** Optional padding value. This value should be entered with the same formatting as a CSS padding attribute (ex. `5%`, `20px`, `2rem`). If omitted, the Card will use the default padding. */
71
- padding?: string;
72
68
  }
73
69
 
74
- // CardImage component
75
- export function CardImage(props: React.PropsWithChildren<CardImageProps>) {
76
- const { src, alt, className, imageAspectRatio, imageSize, component } = props;
77
- const classNames = ["image-wrap"];
78
- imageAspectRatio && classNames.push(`image-wrap--` + imageAspectRatio);
79
- const imageModifiers = [];
80
- imageSize && imageModifiers.push(imageSize);
70
+ /**
71
+ * The CardImage component is used internally in the `Card` component. It
72
+ * renders an `Image` component but with overriding styles specific to the
73
+ * `Card` component.
74
+ */
75
+ function CardImage(props: React.ComponentProps<"img"> & CardImageProps) {
76
+ const {
77
+ alt,
78
+ center,
79
+ component,
80
+ imageSize,
81
+ imageAspectRatio,
82
+ src,
83
+ imageAtEnd,
84
+ layout,
85
+ } = props;
86
+ // Additional styles to add to the `Image` component.
87
+ const styles = useStyleConfig("CardImage", {
88
+ center,
89
+ imageAtEnd,
90
+ imageSize,
91
+ layout,
92
+ });
81
93
  return (
82
- (src || component) && (
83
- <>
84
- <div className={bem("image", imageModifiers, "card", [])}>
85
- <div className={classNames.join(" ")}>
86
- <div className="image-crop">
87
- {component ? (
88
- component
89
- ) : (
90
- <Image className={className} src={src} alt={alt} />
91
- )}
92
- </div>
93
- </div>
94
- </div>
95
- </>
96
- )
94
+ <Image
95
+ alt={alt}
96
+ component={component}
97
+ imageAspectRatio={imageAspectRatio}
98
+ imageSize={imageSize}
99
+ src={src}
100
+ additionalStyles={styles}
101
+ />
97
102
  );
98
103
  }
99
104
 
100
105
  // CardHeading child-component
101
- export const CardHeading = (props) => <Heading {...props} />;
106
+ export const CardHeading = Heading;
102
107
 
103
108
  // CardContent child-component
104
- export function CardContent(props: React.PropsWithChildren<CardContentProps>) {
105
- const { children, className } = props;
106
- return (
107
- children && (
108
- <div className={bem("card-content", [], "", [className])}>{children}</div>
109
- )
110
- );
109
+ export function CardContent(props: React.PropsWithChildren<{}>) {
110
+ const { children } = props;
111
+ const styles = useStyleConfig("CardContent");
112
+ return children && <Box __css={styles}>{children}</Box>;
111
113
  }
112
114
 
113
115
  // CardActions child-component
114
116
  export function CardActions(props: React.PropsWithChildren<CardActionsProps>) {
115
- const {
117
+ const { bottomBorder, children, topBorder, center, layout } = props;
118
+ const styles = useStyleConfig("CardActions", {
116
119
  bottomBorder,
117
- children,
118
- className,
119
- modifiers = [],
120
120
  topBorder,
121
- } = props;
121
+ center,
122
+ layout,
123
+ });
122
124
 
123
- bottomBorder && modifiers.push("bottom-border");
124
- topBorder && modifiers.push("top-border");
125
+ return children && <Box __css={styles}>{children}</Box>;
126
+ }
125
127
 
126
- return (
127
- children && (
128
- <div className={bem("card-actions", modifiers, "", [className])}>
129
- {children}
130
- </div>
131
- )
128
+ /**
129
+ * If `mainActionLink` is passed, then this adds Chakra's `LinkBox` wrapper
130
+ * component to the entire `Card` component. This works together with the
131
+ * `CardLinkOverlay` component to provide a clickable overlay.
132
+ */
133
+ function CardLinkBox({
134
+ children,
135
+ mainActionLink,
136
+ }: React.PropsWithChildren<CardLinkBoxProps>) {
137
+ return mainActionLink ? (
138
+ <ChakraLinkBox>{children}</ChakraLinkBox>
139
+ ) : (
140
+ <>{children}</>
141
+ );
142
+ }
143
+
144
+ /**
145
+ * If `mainActionLink` is passed, then this adds Chakra's `LinkOverlay` around
146
+ * text that should be linked, in this case the `CardHeading` text. This works
147
+ * together with the `CardLinkBox` component to provide a clickable overlay to
148
+ * the `Card` component while still allowing links in the `CardActions` to be
149
+ * clickable.
150
+ */
151
+ function CardLinkOverlay({
152
+ children,
153
+ mainActionLink,
154
+ }: React.PropsWithChildren<CardLinkBoxProps>) {
155
+ return mainActionLink ? (
156
+ <ChakraLinkOverlay href={mainActionLink}>{children}</ChakraLinkOverlay>
157
+ ) : (
158
+ <>{children}</>
132
159
  );
133
160
  }
134
161
 
135
162
  export default function Card(props: React.PropsWithChildren<CardProps>) {
136
163
  const {
137
164
  backgroundColor,
138
- blockName,
139
- center,
165
+ border,
166
+ center = false,
140
167
  children,
141
168
  className,
142
169
  foregroundColor,
143
- id,
170
+ id = generateUUID(),
171
+ imageAlt = "",
172
+ imageAspectRatio = ImageRatios.Square,
144
173
  imageAtEnd,
145
- layout,
146
- border,
147
- padding,
148
- modifiers = [],
149
- imageAlt,
150
174
  imageComponent,
151
- imageAspectRatio,
152
- imageSize,
175
+ imageSize = ImageSizes.Default,
153
176
  imageSrc,
177
+ layout = CardLayouts.Column,
178
+ mainActionLink,
154
179
  } = props;
155
- const baseClass = "card";
156
-
157
- const styles = {};
158
- let imageCount = 0;
180
+ const hasImage = imageSrc || imageComponent;
181
+ const customColors = {};
159
182
  const cardContents = [];
183
+ let cardHeadingCount = 0;
160
184
 
161
- layout && modifiers.push(layout);
162
- border && modifiers.push("with-border");
163
- center && modifiers.push("center");
164
- (imageSrc || imageComponent) && modifiers.push("has-image");
165
- imageAtEnd && modifiers.push("at-end");
185
+ backgroundColor && (customColors["backgroundColor"] = backgroundColor);
186
+ foregroundColor && (customColors["color"] = foregroundColor);
166
187
 
167
- padding && (styles["padding"] = padding);
168
- backgroundColor && (styles["backgroundColor"] = backgroundColor);
169
- foregroundColor && (styles["color"] = foregroundColor);
188
+ const styles = useMultiStyleConfig("Card", {
189
+ border,
190
+ center,
191
+ hasImage,
192
+ imageAtEnd,
193
+ layout,
194
+ });
170
195
 
171
- React.Children.map(children, (child: React.ReactElement) => {
172
- if (
173
- child.type === CardHeading ||
174
- child.props.mdxType === "CardHeading" ||
196
+ React.Children.map(children, (child: React.ReactElement, key) => {
197
+ if (child.type === CardHeading || child.props.mdxType === "CardHeading") {
198
+ // If the child is a `CardHeading` component, then we add the
199
+ // `CardLinkOverlay` inside of the `Heading` component and wrap its text.
200
+ // This allows other links in the `CardActions` to be clickable. This is
201
+ // only done for the first `CardHeading` component but does not affect
202
+ // the full-click feature.
203
+ const newChildren =
204
+ cardHeadingCount === 0 ? (
205
+ <CardLinkOverlay mainActionLink={mainActionLink}>
206
+ {child.props.children}
207
+ </CardLinkOverlay>
208
+ ) : (
209
+ child.props.children
210
+ );
211
+ const elem = React.cloneElement(child, {
212
+ additionalStyles: styles.heading,
213
+ key,
214
+ center,
215
+ // Override the child text with the potential `CardLinkOverlay`.
216
+ children: newChildren,
217
+ layout,
218
+ });
219
+ cardContents.push(elem);
220
+ cardHeadingCount++;
221
+ } else if (
175
222
  child.type === CardContent ||
176
223
  child.props.mdxType === "CardContent" ||
177
224
  child.type === CardActions ||
178
225
  child.props.mdxType === "CardActions"
179
226
  ) {
180
- cardContents.push(child);
227
+ const elem = React.cloneElement(child, { key, center, layout });
228
+ cardContents.push(elem);
181
229
  }
182
230
  });
183
231
 
184
- if (imageCount > 1) {
185
- console.error(`Only one CardIimage child component may be passed to Card.`);
186
- cardContents.length = 0;
187
- cardContents.push(
188
- "Error: Only one CardImage child component may be passed to Card."
189
- );
190
- }
191
232
  return (
192
- <div
193
- className={bem(baseClass, modifiers, blockName, [className])}
194
- id={id}
195
- style={styles}
196
- >
197
- {(imageSrc || imageComponent) && (
198
- <CardImage
199
- src={imageSrc ? imageSrc : null}
200
- component={imageComponent ? imageComponent : null}
201
- alt={imageAlt ? imageAlt : null}
202
- imageSize={imageSize ? imageSize : null}
203
- imageAspectRatio={imageAspectRatio ? imageAspectRatio : null}
204
- />
205
- )}
206
- <div className={bem("body", [], baseClass)}>{cardContents}</div>
207
- </div>
233
+ <CardLinkBox mainActionLink={mainActionLink}>
234
+ <Box
235
+ id={id}
236
+ className={className}
237
+ __css={{
238
+ ...styles,
239
+ ...customColors,
240
+ }}
241
+ >
242
+ {hasImage && (
243
+ <CardImage
244
+ src={imageSrc ? imageSrc : null}
245
+ component={imageComponent}
246
+ alt={imageAlt}
247
+ imageSize={imageSize}
248
+ imageAspectRatio={imageAspectRatio}
249
+ imageAtEnd={imageAtEnd}
250
+ layout={layout}
251
+ />
252
+ )}
253
+ <Box className="card-body" __css={styles.body}>
254
+ {cardContents}
255
+ </Box>
256
+ </Box>
257
+ </CardLinkBox>
208
258
  );
209
259
  }
@@ -2,20 +2,3 @@ export enum CardLayouts {
2
2
  Row = "row",
3
3
  Column = "column",
4
4
  }
5
-
6
- export enum CardImageRatios {
7
- FourByThree = "four-by-three",
8
- OneByTwo = "one-by-two",
9
- Original = "original",
10
- SixteenByNine = "sixteen-by-nine",
11
- Square = "square",
12
- ThreeByFour = "three-by-four",
13
- ThreeByTwo = "three-by-two",
14
- TwoByOne = "two-by-one",
15
- }
16
-
17
- export enum CardImageSizes {
18
- Large = "large",
19
- Medium = "medium",
20
- Small = "small",
21
- }