@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,13 +1,14 @@
1
1
  import {
2
- Meta,
3
- Story,
4
- Canvas,
5
2
  ArgsTable,
3
+ Canvas,
6
4
  Description,
7
- } from "@storybook/addon-docs/blocks";
5
+ Meta,
6
+ Story,
7
+ } from "@storybook/addon-docs";
8
8
  import { withDesign } from "storybook-addon-designs";
9
9
 
10
10
  import SimpleGrid from "./SimpleGrid";
11
+ import { GridGaps } from "./GridTypes";
11
12
  import Card, { CardHeading, CardContent, CardActions } from "../Card/Card";
12
13
  import { CardLayouts } from "../Card/CardTypes";
13
14
  import { HeadingDisplaySizes, HeadingLevels } from "../Heading/HeadingTypes";
@@ -20,9 +21,11 @@ import {
20
21
  } from "../Icons/IconTypes";
21
22
  import Image from "../Image/Image";
22
23
  import { ImageRatios } from "../Image/ImageTypes";
23
-
24
24
  import { getCategory } from "../../utils/componentCategories";
25
25
  import DSProvider from "../../theme/provider";
26
+ import { getStorybookEnumValues } from "../../utils/utils";
27
+
28
+ export const enumValues = getStorybookEnumValues(GridGaps, "GridGaps");
26
29
 
27
30
  <Meta
28
31
  title={getCategory("SimpleGrid")}
@@ -31,32 +34,21 @@ import DSProvider from "../../theme/provider";
31
34
  parameters={{
32
35
  design: {
33
36
  type: "figma",
34
- url:
35
- "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=36835%3A26613",
37
+ url: "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=36835%3A26613",
36
38
  },
37
39
  jest: ["SimpleGrid.test.tsx"],
38
40
  }}
39
41
  argTypes={{
42
+ className: { control: false },
40
43
  columns: {
41
- control: {
42
- type: "number",
43
- min: 2,
44
- },
45
- table: {
46
- defaultValue: {
47
- summary: 3,
48
- },
49
- },
44
+ control: { min: 2, type: "number" },
50
45
  },
51
46
  gap: {
52
- table: {
53
- defaultValue: {
54
- summary: "l",
55
- },
56
- },
47
+ control: { type: "select" },
48
+ options: enumValues.options,
49
+ table: { defaultValue: { summary: "GridGaps.Large" } },
57
50
  },
58
- className: { table: { disable: true } },
59
- id: { table: { disable: true } },
51
+ id: { control: false },
60
52
  }}
61
53
  />
62
54
 
@@ -74,9 +66,17 @@ The `SimpleGrid` component is used to render UI elements in a uniform grid layou
74
66
  The NYPL standards for the items per row in a grid is `3` for desktop, `2` for tablet and `1` for mobile. By default, the `SimpleGrid` component uses these standards and the `columns` prop is optional. If the `columns` prop is used, the tablet breakpoint will be dropped and only the mobile breakpoint (1 item per row) will be triggered.
75
67
 
76
68
  <Canvas withToolbar>
77
- <Story name="SimpleGrid Props">
69
+ <Story
70
+ name="SimpleGrid with Controls"
71
+ args={{
72
+ className: undefined,
73
+ columns: undefined,
74
+ gap: "GridGaps.Large",
75
+ id: "simpleGrid-id",
76
+ }}
77
+ >
78
78
  {(args) => (
79
- <SimpleGrid {...args}>
79
+ <SimpleGrid {...args} gap={enumValues.getValue(args.gap)}>
80
80
  <Card
81
81
  imageSrc="https://placeimg.com/400/220/animals"
82
82
  imageAlt="Alt text"
@@ -148,7 +148,7 @@ The NYPL standards for the items per row in a grid is `3` for desktop, `2` for t
148
148
  </Story>
149
149
  </Canvas>
150
150
 
151
- <ArgsTable story="SimpleGrid Props" />
151
+ <ArgsTable story="SimpleGrid with Controls" />
152
152
 
153
153
  ## Other SimpleGrid Examples
154
154
 
@@ -1,16 +1,25 @@
1
1
  import {
2
- Meta,
3
- Story,
4
- Canvas,
5
2
  ArgsTable,
6
- Preview,
3
+ Canvas,
7
4
  Description,
8
- } from "@storybook/addon-docs/blocks";
5
+ Meta,
6
+ Story,
7
+ } from "@storybook/addon-docs";
9
8
  import { withDesign } from "storybook-addon-designs";
10
9
 
11
10
  import Heading from "./Heading";
12
11
  import { HeadingDisplaySizes, HeadingLevels } from "./HeadingTypes";
13
12
  import { getCategory } from "../../utils/componentCategories";
13
+ import { getStorybookEnumValues } from "../../utils/utils";
14
+
15
+ export const sizesEnumValues = getStorybookEnumValues(
16
+ HeadingDisplaySizes,
17
+ "HeadingDisplaySizes"
18
+ );
19
+ export const levelsEnumValues = getStorybookEnumValues(
20
+ HeadingLevels,
21
+ "HeadingLevels"
22
+ );
14
23
 
15
24
  <Meta
16
25
  title={getCategory("Heading")}
@@ -19,15 +28,23 @@ import { getCategory } from "../../utils/componentCategories";
19
28
  parameters={{
20
29
  design: {
21
30
  type: "figma",
22
- url:
23
- "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Master?node-id=10975%3A16",
31
+ url: "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Master?node-id=10975%3A16",
24
32
  },
25
33
  jest: ["Heading.test.tsx"],
26
34
  }}
27
35
  argTypes={{
28
- additionalStyles: { table: { disable: true } },
29
- className: { table: { disable: true } },
30
- id: { table: { disable: true } },
36
+ additionalStyles: { control: false },
37
+ className: { control: false },
38
+ displaySize: {
39
+ control: { type: "select" },
40
+ options: sizesEnumValues.options,
41
+ },
42
+ id: { control: false },
43
+ level: {
44
+ control: { type: "select" },
45
+ options: levelsEnumValues.options,
46
+ table: { defaultValue: { summary: "HeadingLevels.Two" } },
47
+ },
31
48
  }}
32
49
  />
33
50
 
@@ -36,25 +53,41 @@ import { getCategory } from "../../utils/componentCategories";
36
53
  | Component Version | DS Version |
37
54
  | ----------------- | ---------- |
38
55
  | Added | `0.0.4` |
39
- | Latest | `0.25.2` |
56
+ | Latest | `0.25.9` |
40
57
 
41
58
  <Description of={Heading} />
42
59
 
43
- A `Heading` component will render a standard HTML `<h>` tag (1-6). The heading's text can be passed in through a `text` prop or as a child. Default styles for semantic elements can be overwritten using the `displaySize` prop.
60
+ A `Heading` component will render a standard HTML `<h>` tag (1-6). The heading's
61
+ text can be passed in through a `text` prop or as a child. Default styles for
62
+ semantic elements can be overwritten using the `displaySize` prop.
44
63
 
45
64
  <Canvas withToolbar>
46
65
  <Story
47
- name="Heading Props"
66
+ name="Heading with Controls"
48
67
  args={{
49
- id: "default-heading",
68
+ additionalStyles: undefined,
69
+ className: undefined,
70
+ displaySize: undefined,
71
+ id: "heading-id",
72
+ level: "HeadingLevels.Two",
50
73
  text: "Default Heading",
74
+ url: undefined,
75
+ urlClass: undefined,
51
76
  }}
52
77
  >
53
- {(args) => <Heading {...args} />}
78
+ {(args) => (
79
+ <Heading
80
+ {...args}
81
+ displaySize={
82
+ args.displaySize && sizesEnumValues.getValue(args.displaySize)
83
+ }
84
+ level={levelsEnumValues.getValue(args.level)}
85
+ />
86
+ )}
54
87
  </Story>
55
88
  </Canvas>
56
89
 
57
- <ArgsTable story="Heading Props" />
90
+ <ArgsTable story="Heading with Controls" />
58
91
 
59
92
  ## Default Heading Styles
60
93
 
@@ -64,32 +97,32 @@ A `Heading` component will render a standard HTML `<h>` tag (1-6). The heading's
64
97
  <Heading
65
98
  id="heading-one"
66
99
  level={HeadingLevels.One}
67
- text="<h1> Heading 1"
100
+ text="<h1> Heading 1 - HeadingLevels.One"
68
101
  />
69
102
  <Heading
70
103
  id="heading-two"
71
104
  level={HeadingLevels.Two}
72
- text="<h2> Heading 2"
105
+ text="<h2> Heading 2 - HeadingLevels.Two"
73
106
  />
74
107
  <Heading
75
108
  id="heading-three"
76
109
  level={HeadingLevels.Three}
77
- text="<h3> Heading 3"
110
+ text="<h3> Heading 3 - HeadingLevels.Three"
78
111
  />
79
112
  <Heading
80
113
  id="heading-four"
81
114
  level={HeadingLevels.Four}
82
- text="<h4> Heading 4"
115
+ text="<h4> Heading 4 - HeadingLevels.Four"
83
116
  />
84
117
  <Heading
85
118
  id="heading-five"
86
119
  level={HeadingLevels.Five}
87
- text="<h5> Heading 5"
120
+ text="<h5> Heading 5 - HeadingLevels.Five"
88
121
  />
89
122
  <Heading
90
123
  id="heading-six"
91
124
  level={HeadingLevels.Six}
92
- text="<h6> Heading 6"
125
+ text="<h6> Heading 6 - HeadingLevels.Six"
93
126
  />
94
127
  </div>
95
128
  </Story>
@@ -97,6 +130,9 @@ A `Heading` component will render a standard HTML `<h>` tag (1-6). The heading's
97
130
 
98
131
  ## DisplaySize Styles
99
132
 
133
+ Note: The `level` prop for the `Heading`s in the next example are all set to
134
+ `level={HeadingLevels.One}`.
135
+
100
136
  <Canvas>
101
137
  <Story name="DisplaySize Styles">
102
138
  <div>
@@ -155,7 +191,7 @@ When the `url` prop is passed to `Heading`, a child `<a>` element is created and
155
191
  />
156
192
  <Heading id="heading-with-link-child" level={HeadingLevels.Two}>
157
193
  <>
158
- Heading with a Word <a href="hello">Link</a>
194
+ Heading with a Word <a href="#hello">Link</a>
159
195
  </>
160
196
  </Heading>
161
197
  </Story>
@@ -1,6 +1,7 @@
1
1
  import * as React from "react";
2
2
  import { render, screen } from "@testing-library/react";
3
3
  import { axe } from "jest-axe";
4
+ import renderer from "react-test-renderer";
4
5
 
5
6
  import Heading from "./Heading";
6
7
  import { HeadingDisplaySizes, HeadingLevels } from "./HeadingTypes";
@@ -15,12 +16,13 @@ describe("Heading Accessibility", () => {
15
16
  });
16
17
 
17
18
  describe("Heading", () => {
18
- it("Shows heading", () => {
19
+ it("renders and HTML heading element with the correct level", () => {
19
20
  render(<Heading id="h1" level={HeadingLevels.One} text="Heading 1" />);
20
21
  expect(screen.getByRole("heading", { level: 1 })).toBeInTheDocument();
21
22
  expect(screen.getByText("Heading 1")).toBeInTheDocument();
22
23
  });
23
- it("Can pass heading content as child", () => {
24
+
25
+ it("can pass heading content as child", () => {
24
26
  render(
25
27
  <Heading id="h1" level={HeadingLevels.Two}>
26
28
  Heading 2
@@ -30,13 +32,18 @@ describe("Heading", () => {
30
32
  expect(screen.getByText("Heading 2")).toBeInTheDocument();
31
33
  });
32
34
 
35
+ it("renders the default level two if no `level` prop is passed", () => {
36
+ render(<Heading id="h2">Heading 2</Heading>);
37
+ expect(screen.getByRole("heading", { level: 2 })).toBeInTheDocument();
38
+ });
39
+
33
40
  // TODO: check that header children are links
34
41
  // it("Throws error when invalid heading is passed as child", () => {
35
42
  // expect(() => render(<Heading id="h1" level={HeadingLevels.Three}><span>oh no</span></Heading>))
36
43
  // .to.throw("Headings can only be plain text or bold");
37
44
  // });
38
45
 
39
- it("Can pass heading content as child span", () => {
46
+ it("can pass a span element as a child", () => {
40
47
  render(
41
48
  <Heading id="h1" level={HeadingLevels.One}>
42
49
  <span>
@@ -47,7 +54,7 @@ describe("Heading", () => {
47
54
  expect(screen.getByText(/Text/i)).toBeInTheDocument();
48
55
  });
49
56
 
50
- it("uses child when both child and the text prop are passed", () => {
57
+ it("prioritizes the child when both child and the text prop are passed", () => {
51
58
  render(
52
59
  <Heading id="h1" level={HeadingLevels.One} text="prop text">
53
60
  child text
@@ -56,20 +63,20 @@ describe("Heading", () => {
56
63
  expect(screen.getByText("child text")).toBeInTheDocument();
57
64
  });
58
65
 
59
- it("Has <a> tag when passed URL", () => {
66
+ it("renders an anchor element when the `url` prop is passed", () => {
60
67
  render(
61
68
  <Heading
62
69
  id="h1"
63
70
  level={HeadingLevels.One}
64
- url="fake-url"
65
71
  text="Heading 1"
72
+ url="fake-url"
66
73
  />
67
74
  );
68
75
 
69
76
  expect(screen.getByRole("link")).toBeInTheDocument();
70
77
  });
71
78
 
72
- it("<a> has class when passed urlClass", () => {
79
+ it("adds the `urlClass` prop to the anchor element as its class name", () => {
73
80
  render(
74
81
  <Heading
75
82
  id="h1"
@@ -84,19 +91,13 @@ describe("Heading", () => {
84
91
  );
85
92
  });
86
93
 
87
- it("Throws error when invalid heading number passed", () => {
88
- expect(() =>
89
- render(<Heading id="h1" level={9} text="Heading 9" />)
90
- ).toThrow("Heading only supports levels 1-6");
91
- });
92
-
93
- it("Throws error when neither child nor text is passed", () => {
94
- expect(() => render(<Heading id="h1" level={9} />)).toThrow(
95
- "Heading only supports levels 1-6"
94
+ it("throws error when neither child nor text is passed", () => {
95
+ expect(() => render(<Heading id="h1" level={HeadingLevels.One} />)).toThrow(
96
+ "Heading has no children, please pass prop: text"
96
97
  );
97
98
  });
98
99
 
99
- it("Throws error when heading with many children is passed", () => {
100
+ it("throws error when heading with many children is passed", () => {
100
101
  expect(() =>
101
102
  render(
102
103
  <Heading id="h1" level={HeadingLevels.Four}>
@@ -107,7 +108,7 @@ describe("Heading", () => {
107
108
  ).toThrow("Please only pass one child into Heading, got span, span");
108
109
  });
109
110
 
110
- it("Uses custom display size", () => {
111
+ it("uses custom display size", () => {
111
112
  render(
112
113
  <Heading
113
114
  id="h1"
@@ -120,4 +121,67 @@ describe("Heading", () => {
120
121
  "font-size": "2em",
121
122
  });
122
123
  });
124
+
125
+ it("renders the UI snapshot correctly", () => {
126
+ const basic = renderer
127
+ .create(
128
+ <Heading id="basic" level={HeadingLevels.One} text="Heading text" />
129
+ )
130
+ .toJSON();
131
+ const basicWithChildText = renderer
132
+ .create(
133
+ <Heading id="basicWithChildText" level={HeadingLevels.One}>
134
+ Heading text
135
+ </Heading>
136
+ )
137
+ .toJSON();
138
+ const customDisplaySize = renderer
139
+ .create(
140
+ <Heading
141
+ id="customDisplaySize"
142
+ level={HeadingLevels.One}
143
+ text="Heading with Secondary displaySize"
144
+ displaySize={HeadingDisplaySizes.Secondary}
145
+ />
146
+ )
147
+ .toJSON();
148
+ const otherLevel = renderer
149
+ .create(
150
+ <Heading
151
+ id="otherLevel"
152
+ level={HeadingLevels.Six}
153
+ text="Heading level six"
154
+ />
155
+ )
156
+ .toJSON();
157
+ const withLink = renderer
158
+ .create(
159
+ <Heading
160
+ id="withLink"
161
+ level={HeadingLevels.One}
162
+ text="Heading text is a link"
163
+ url="fake-url"
164
+ />
165
+ )
166
+ .toJSON();
167
+ const withCustomLink = renderer
168
+ .create(
169
+ <Heading id="withCustomLink" level={HeadingLevels.One}>
170
+ <>
171
+ Part of the heading text is
172
+ <a href="fake-url" className="custom-link">
173
+ <span>a link</span>
174
+ </a>
175
+ </>
176
+ </Heading>
177
+ )
178
+ .toJSON();
179
+
180
+ expect(basic).toMatchSnapshot();
181
+ expect(basicWithChildText).toMatchSnapshot();
182
+ expect(customDisplaySize).toMatchSnapshot();
183
+ expect(otherLevel).toMatchSnapshot();
184
+ expect(withLink).toMatchSnapshot();
185
+ expect(withCustomLink).toMatchSnapshot();
186
+ });
123
187
  });
@@ -1,67 +1,67 @@
1
- // MT-82, MT 225, etc
1
+ import { Heading as ChakraHeading, useStyleConfig } from "@chakra-ui/react";
2
2
  import * as React from "react";
3
- import {
4
- Box,
5
- Heading as ChakraHeading,
6
- Link as ChakraLink,
7
- useStyleConfig,
8
- } from "@chakra-ui/react";
9
3
 
10
4
  import { HeadingDisplaySizes, HeadingLevels } from "./HeadingTypes";
5
+ import Link from "../Link/Link";
6
+ import { getVariant } from "../../utils/utils";
7
+ import generateUUID from "../../helpers/generateUUID";
11
8
 
12
9
  export interface HeadingProps {
13
10
  /** Optionally pass in additional Chakra-based styles. */
14
11
  additionalStyles?: { [key: string]: any };
15
12
  /** Optional className that appears in addition to `heading` */
16
13
  className?: string;
17
- /** Optional size used to override the default styles of the semantic HTML `<h>` elements */
14
+ /** Optional size used to override the default styles of the semantic HTM
15
+ * `<h>` elements */
18
16
  displaySize?: HeadingDisplaySizes;
19
17
  /** Optional ID that other components can cross reference for accessibility purposes */
20
18
  id?: string;
21
- /** Optional number 1-6 used to create the `<h*>` tag; if prop is not passed, `Heading` will default to `<h2>` */
19
+ /** Optional number 1-6 used to create the `<h*>` tag; if prop is not passed,
20
+ * `Heading` will default to `<h2>` */
22
21
  level?: HeadingLevels;
23
22
  /** Inner text of the `<h*>` element */
24
23
  text?: string;
25
- /** Optional URL that header points to; when `url` prop is passed to `Heading`, a child `<a>` element is created and the heading text becomes an active link */
24
+ /** Optional URL that header points to; when `url` prop is passed to
25
+ * `Heading`, a child `<a>` element is created and the heading text becomes
26
+ * an active link */
26
27
  url?: string;
27
28
  /** Optional className for the URL when the `url` prop is passed */
28
29
  urlClass?: string;
29
30
  }
30
31
 
31
- // Used to map between ButtonTypes enum values and Chakra variant options.
32
- const variantMap = {};
33
- for (const type in HeadingDisplaySizes) {
34
- variantMap[HeadingDisplaySizes[type]] = HeadingDisplaySizes[type];
35
- }
36
-
37
- /**
38
- * Map the HeadingDisplaySizes to the Heading Chakra theme variant object. If a wrong
39
- * value is passed (typically in non-Typescript scenarios), then the default
40
- * is "null" and displaySize is not envoked.
41
- */
42
- const getVariant = (displaySize) => variantMap[displaySize] || null;
32
+ /** Map the word heading level to the number heading level. The default is 2. */
33
+ const getMappedLevel = (level = HeadingLevels.Two) => {
34
+ const levelMap = {
35
+ one: 1,
36
+ two: 2,
37
+ three: 3,
38
+ four: 4,
39
+ five: 5,
40
+ six: 6,
41
+ };
42
+ return levelMap[level] || 2;
43
+ };
43
44
 
44
45
  function Heading(props: React.PropsWithChildren<HeadingProps>) {
45
46
  const {
46
47
  additionalStyles = {},
47
48
  className,
48
49
  displaySize,
49
- id,
50
+ id = generateUUID(),
50
51
  level = HeadingLevels.Two,
51
52
  text,
52
53
  url,
53
54
  urlClass,
54
55
  } = props;
55
- const variant = displaySize ? getVariant(displaySize) : `h${level}`;
56
+ const finalLevel = getMappedLevel(level);
57
+ const variant = displaySize
58
+ ? getVariant(displaySize, HeadingDisplaySizes)
59
+ : `h${finalLevel}`;
56
60
  const styles = useStyleConfig("Heading", { variant });
57
61
  // Combine native base styles with any additional styles.
58
62
  // This is used in the `Hero` and `Notification` components.
59
63
  const finalStyles = { ...styles, ...additionalStyles };
60
- const asHeading: any = `h${level}`;
61
-
62
- if (level < 1 || level > 6) {
63
- throw new Error("Heading only supports levels 1-6");
64
- }
64
+ const asHeading: any = `h${finalLevel}`;
65
65
 
66
66
  if (!props.children && !text) {
67
67
  throw new Error("Heading has no children, please pass prop: text");
@@ -80,9 +80,9 @@ function Heading(props: React.PropsWithChildren<HeadingProps>) {
80
80
 
81
81
  const contentToRender = props.children ? props.children : text;
82
82
  const content = url ? (
83
- <Box as={ChakraLink} href={url} className={urlClass}>
83
+ <Link className={urlClass} href={url} id={`${id}-link`}>
84
84
  {contentToRender}
85
- </Box>
85
+ </Link>
86
86
  ) : (
87
87
  contentToRender
88
88
  );
@@ -6,10 +6,10 @@ export enum HeadingDisplaySizes {
6
6
  }
7
7
 
8
8
  export enum HeadingLevels {
9
- One = 1,
10
- Two = 2,
11
- Three = 3,
12
- Four = 4,
13
- Five = 5,
14
- Six = 6,
9
+ One = "one",
10
+ Two = "two",
11
+ Three = "three",
12
+ Four = "four",
13
+ Five = "five",
14
+ Six = "six",
15
15
  }
@@ -0,0 +1,71 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Heading renders the UI snapshot correctly 1`] = `
4
+ <h1
5
+ className="chakra-heading css-0"
6
+ id="basic"
7
+ >
8
+ Heading text
9
+ </h1>
10
+ `;
11
+
12
+ exports[`Heading renders the UI snapshot correctly 2`] = `
13
+ <h1
14
+ className="chakra-heading css-0"
15
+ id="basicWithChildText"
16
+ >
17
+ Heading text
18
+ </h1>
19
+ `;
20
+
21
+ exports[`Heading renders the UI snapshot correctly 3`] = `
22
+ <h1
23
+ className="chakra-heading css-0"
24
+ id="customDisplaySize"
25
+ >
26
+ Heading with Secondary displaySize
27
+ </h1>
28
+ `;
29
+
30
+ exports[`Heading renders the UI snapshot correctly 4`] = `
31
+ <h6
32
+ className="chakra-heading css-0"
33
+ id="otherLevel"
34
+ >
35
+ Heading level six
36
+ </h6>
37
+ `;
38
+
39
+ exports[`Heading renders the UI snapshot correctly 5`] = `
40
+ <h1
41
+ className="chakra-heading css-0"
42
+ id="withLink"
43
+ >
44
+ <a
45
+ className="css-0"
46
+ href="fake-url"
47
+ id="withLink-link"
48
+ rel={null}
49
+ target={null}
50
+ >
51
+ Heading text is a link
52
+ </a>
53
+ </h1>
54
+ `;
55
+
56
+ exports[`Heading renders the UI snapshot correctly 6`] = `
57
+ <h1
58
+ className="chakra-heading css-0"
59
+ id="withCustomLink"
60
+ >
61
+ Part of the heading text is
62
+ <a
63
+ className="custom-link"
64
+ href="fake-url"
65
+ >
66
+ <span>
67
+ a link
68
+ </span>
69
+ </a>
70
+ </h1>
71
+ `;