@nypl/design-system-react-components 0.25.8 → 0.25.11

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 (282) hide show
  1. package/CHANGELOG.md +110 -1
  2. package/README.md +1 -1
  3. package/dist/components/Button/Button.d.ts +6 -6
  4. package/dist/components/Button/ButtonTypes.d.ts +0 -1
  5. package/dist/components/Card/Card.d.ts +6 -4
  6. package/dist/components/Checkbox/Checkbox.d.ts +3 -2
  7. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +3 -2
  8. package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +8 -2
  9. package/dist/components/DatePicker/DatePicker.d.ts +4 -3
  10. package/dist/components/Fieldset/Fieldset.d.ts +1 -3
  11. package/dist/components/Form/Form.d.ts +15 -14
  12. package/dist/components/Form/FormTypes.d.ts +2 -2
  13. package/dist/components/Heading/Heading.d.ts +7 -3
  14. package/dist/components/Heading/HeadingTypes.d.ts +6 -6
  15. package/dist/components/HelperErrorText/HelperErrorText.d.ts +5 -2
  16. package/dist/components/HorizontalRule/HorizontalRule.d.ts +3 -3
  17. package/dist/components/Icons/Icon.d.ts +4 -4
  18. package/dist/components/Icons/IconSvgs.d.ts +0 -21
  19. package/dist/components/Icons/IconTypes.d.ts +0 -23
  20. package/dist/components/Image/Image.d.ts +11 -3
  21. package/dist/components/List/List.d.ts +1 -1
  22. package/dist/components/Logo/Logo.d.ts +28 -0
  23. package/dist/components/Logo/LogoSvgs.d.ts +34 -0
  24. package/dist/components/Logo/LogoTypes.d.ts +46 -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 +6 -5
  30. package/dist/components/SearchBar/SearchBar.d.ts +15 -7
  31. package/dist/components/Select/Select.d.ts +7 -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 +29 -0
  38. package/dist/components/Template/Template.d.ts +30 -6
  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 +3 -2
  42. package/dist/components/VideoPlayer/VideoPlayer.d.ts +14 -5
  43. package/dist/design-system-react-components.cjs.development.js +6721 -5777
  44. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  45. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  46. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  47. package/dist/design-system-react-components.esm.js +6774 -5839
  48. package/dist/design-system-react-components.esm.js.map +1 -1
  49. package/dist/index.d.ts +10 -8
  50. package/dist/resources.scss +0 -2
  51. package/dist/styles.css +2 -2
  52. package/dist/theme/components/breadcrumb.d.ts +1 -1
  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 +56 -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 +13 -4
  64. package/dist/theme/components/searchBar.d.ts +9 -11
  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 +4 -0
  69. package/dist/theme/components/toggle.d.ts +8 -5
  70. package/dist/utils/utils.d.ts +10 -0
  71. package/package.json +40 -37
  72. package/src/__tests__/utils/utils.test.ts +23 -1
  73. package/src/components/Accordion/Accordion.stories.mdx +15 -13
  74. package/src/components/Accordion/Accordion.test.tsx +45 -1
  75. package/src/components/Accordion/Accordion.tsx +20 -8
  76. package/src/components/Accordion/__snapshots__/Accordion.test.tsx.snap +243 -0
  77. package/src/components/Autosuggest/Autosuggest.stories.mdx +2 -1
  78. package/src/components/Autosuggest/Autosuggest.stories.tsx +24 -48
  79. package/src/components/Autosuggest/_Autosuggest.scss +2 -6
  80. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +43 -13
  81. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +15 -0
  82. package/src/components/Breadcrumbs/Breadcrumbs.tsx +9 -3
  83. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +5 -5
  84. package/src/components/Button/Button.stories.mdx +93 -48
  85. package/src/components/Button/Button.test.tsx +0 -12
  86. package/src/components/Button/Button.tsx +7 -7
  87. package/src/components/Button/ButtonTypes.tsx +0 -1
  88. package/src/components/Button/__snapshots__/Button.test.tsx.snap +0 -12
  89. package/src/components/Card/Card.stories.mdx +186 -71
  90. package/src/components/Card/Card.test.tsx +45 -22
  91. package/src/components/Card/Card.tsx +21 -6
  92. package/src/components/Card/__snapshots__/Card.test.tsx.snap +9 -3
  93. package/src/components/Chakra/Box.stories.mdx +3 -3
  94. package/src/components/Chakra/Center.stories.mdx +5 -5
  95. package/src/components/Chakra/Flex.stories.mdx +113 -0
  96. package/src/components/Chakra/Grid.stories.mdx +3 -3
  97. package/src/components/Chakra/Stack.stories.mdx +2 -2
  98. package/src/components/Checkbox/Checkbox.stories.mdx +37 -15
  99. package/src/components/Checkbox/Checkbox.tsx +13 -8
  100. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +48 -16
  101. package/src/components/CheckboxGroup/CheckboxGroup.tsx +14 -10
  102. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +6 -3
  103. package/src/components/ComponentWrapper/ComponentWrapper.test.tsx +151 -0
  104. package/src/components/ComponentWrapper/ComponentWrapper.tsx +36 -23
  105. package/src/components/ComponentWrapper/__snapshots__/ComponentWrapper.test.tsx.snap +85 -0
  106. package/src/components/DatePicker/DatePicker.stories.mdx +63 -18
  107. package/src/components/DatePicker/DatePicker.test.tsx +6 -6
  108. package/src/components/DatePicker/DatePicker.tsx +17 -11
  109. package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +50 -24
  110. package/src/components/Fieldset/Fieldset.stories.mdx +20 -9
  111. package/src/components/Fieldset/Fieldset.tsx +2 -4
  112. package/src/components/Form/Form.stories.mdx +75 -49
  113. package/src/components/Form/Form.test.tsx +92 -3
  114. package/src/components/Form/Form.tsx +28 -23
  115. package/src/components/Form/FormTypes.tsx +2 -2
  116. package/src/components/Form/__snapshots__/Form.test.tsx.snap +0 -1
  117. package/src/components/Grid/SimpleGrid.stories.mdx +26 -26
  118. package/src/components/Heading/Heading.stories.mdx +59 -23
  119. package/src/components/Heading/Heading.test.tsx +82 -18
  120. package/src/components/Heading/Heading.tsx +31 -31
  121. package/src/components/Heading/HeadingTypes.tsx +6 -6
  122. package/src/components/Heading/__snapshots__/Heading.test.tsx.snap +71 -0
  123. package/src/components/HelperErrorText/HelperErrorText.stories.mdx +55 -27
  124. package/src/components/HelperErrorText/HelperErrorText.test.tsx +42 -15
  125. package/src/components/HelperErrorText/HelperErrorText.tsx +24 -24
  126. package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +41 -4
  127. package/src/components/Hero/Hero.stories.mdx +72 -53
  128. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +11 -9
  129. package/src/components/HorizontalRule/HorizontalRule.tsx +4 -6
  130. package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +4 -4
  131. package/src/components/Icons/Icon.stories.mdx +78 -77
  132. package/src/components/Icons/Icon.test.tsx +1 -1
  133. package/src/components/Icons/Icon.tsx +5 -6
  134. package/src/components/Icons/IconSvgs.tsx +0 -42
  135. package/src/components/Icons/IconTypes.tsx +0 -24
  136. package/src/components/Image/Image.stories.mdx +66 -18
  137. package/src/components/Image/Image.tsx +21 -10
  138. package/src/components/Label/Label.stories.mdx +20 -19
  139. package/src/components/Link/Link.stories.mdx +102 -51
  140. package/src/components/Link/Link.test.tsx +38 -8
  141. package/src/components/Link/Link.tsx +19 -12
  142. package/src/components/Link/__snapshots__/Link.test.tsx.snap +60 -0
  143. package/src/components/List/List.stories.mdx +60 -29
  144. package/src/components/List/List.test.tsx +1 -1
  145. package/src/components/List/List.tsx +2 -2
  146. package/src/components/List/__snapshots__/List.test.tsx.snap +3 -1
  147. package/src/components/Logo/Logo.stories.mdx +222 -0
  148. package/src/components/Logo/Logo.test.tsx +98 -0
  149. package/src/components/Logo/Logo.tsx +97 -0
  150. package/src/components/Logo/LogoSvgs.tsx +66 -0
  151. package/src/components/Logo/LogoTypes.tsx +48 -0
  152. package/src/components/Logo/__snapshots__/Logo.test.tsx.snap +71 -0
  153. package/src/components/Modal/Modal.stories.mdx +20 -5
  154. package/src/components/Modal/Modal.tsx +2 -8
  155. package/src/components/Notification/Notification.stories.mdx +128 -38
  156. package/src/components/Notification/Notification.test.tsx +49 -1
  157. package/src/components/Notification/Notification.tsx +25 -12
  158. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +4 -0
  159. package/src/components/Pagination/Pagination.stories.mdx +18 -7
  160. package/src/components/Pagination/Pagination.tsx +3 -3
  161. package/src/components/Placeholder/Placeholder.tsx +7 -14
  162. package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +72 -43
  163. package/src/components/Radio/Radio.stories.mdx +39 -19
  164. package/src/components/Radio/Radio.tsx +13 -9
  165. package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +5 -5
  166. package/src/components/RadioGroup/RadioGroup.stories.mdx +50 -16
  167. package/src/components/RadioGroup/RadioGroup.test.tsx +13 -11
  168. package/src/components/RadioGroup/RadioGroup.tsx +97 -94
  169. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +24 -21
  170. package/src/components/SearchBar/SearchBar.Test.tsx +160 -34
  171. package/src/components/SearchBar/SearchBar.stories.mdx +115 -33
  172. package/src/components/SearchBar/SearchBar.tsx +72 -51
  173. package/src/components/Select/Select.stories.mdx +48 -14
  174. package/src/components/Select/Select.test.tsx +89 -0
  175. package/src/components/Select/Select.tsx +27 -12
  176. package/src/components/Select/__snapshots__/Select.test.tsx.snap +545 -0
  177. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +50 -16
  178. package/src/components/SkeletonLoader/SkeletonLoader.tsx +8 -4
  179. package/src/components/Slider/Slider.stories.mdx +72 -22
  180. package/src/components/Slider/Slider.tsx +15 -10
  181. package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +67 -30
  182. package/src/components/StatusBadge/StatusBadge.stories.mdx +33 -18
  183. package/src/components/StatusBadge/StatusBadge.tsx +2 -1
  184. package/src/components/StructuredContent/StructuredContent.stories.mdx +427 -0
  185. package/src/components/StructuredContent/StructuredContent.test.tsx +376 -0
  186. package/src/components/StructuredContent/StructuredContent.tsx +153 -0
  187. package/src/components/StructuredContent/StructuredContentTypes.tsx +5 -0
  188. package/src/components/StructuredContent/__snapshots__/StructuredContent.test.tsx.snap +283 -0
  189. package/src/components/StyleGuide/Bidirectionality.stories.mdx +32 -83
  190. package/src/components/StyleGuide/Breakpoints.stories.mdx +1 -11
  191. package/src/components/StyleGuide/Buttons.stories.mdx +3 -18
  192. package/src/components/StyleGuide/ColorCard.tsx +1 -2
  193. package/src/components/StyleGuide/Colors.stories.mdx +3 -11
  194. package/src/components/StyleGuide/DesignTokens.stories.mdx +3 -8
  195. package/src/components/StyleGuide/Forms.stories.mdx +2 -10
  196. package/src/components/StyleGuide/Iconography.stories.mdx +8 -34
  197. package/src/components/StyleGuide/Spacing.stories.mdx +3 -14
  198. package/src/components/StyleGuide/Typography.stories.mdx +64 -76
  199. package/src/components/Table/Table.stories.mdx +165 -0
  200. package/src/components/Table/Table.test.tsx +137 -0
  201. package/src/components/Table/Table.tsx +126 -0
  202. package/src/components/Table/__snapshots__/Table.test.tsx.snap +1179 -0
  203. package/src/components/Tabs/Tabs.stories.mdx +20 -14
  204. package/src/components/Tabs/Tabs.test.tsx +21 -5
  205. package/src/components/Tabs/Tabs.tsx +35 -20
  206. package/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap +195 -0
  207. package/src/components/Template/Template.stories.mdx +132 -48
  208. package/src/components/Template/Template.test.tsx +128 -6
  209. package/src/components/Template/Template.tsx +93 -13
  210. package/src/components/Template/__snapshots__/Template.test.tsx.snap +169 -0
  211. package/src/components/Text/Text.stories.mdx +33 -11
  212. package/src/components/Text/Text.tsx +2 -2
  213. package/src/components/TextInput/TextInput.stories.mdx +84 -17
  214. package/src/components/TextInput/TextInput.test.tsx +96 -0
  215. package/src/components/TextInput/TextInput.tsx +12 -8
  216. package/src/components/TextInput/__snapshots__/TextInput.test.tsx.snap +240 -0
  217. package/src/components/Toggle/Toggle.stories.mdx +33 -9
  218. package/src/components/Toggle/Toggle.tsx +14 -9
  219. package/src/components/Toggle/__snapshots__/Toggle.test.tsx.snap +4 -4
  220. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +64 -14
  221. package/src/components/VideoPlayer/VideoPlayer.tsx +17 -7
  222. package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +12 -6
  223. package/src/docs/Chakra.stories.mdx +5 -8
  224. package/src/docs/Intro.stories.mdx +2 -2
  225. package/src/index.ts +13 -6
  226. package/src/styles/base/_03-base.scss +1 -1
  227. package/src/styles/base/_place-holder.scss +7 -7
  228. package/src/styles.scss +1 -5
  229. package/src/theme/components/breadcrumb.ts +4 -4
  230. package/src/theme/components/button.ts +5 -12
  231. package/src/theme/components/card.ts +5 -2
  232. package/src/theme/components/checkbox.ts +1 -1
  233. package/src/theme/components/customTable.ts +63 -0
  234. package/src/theme/components/datePicker.ts +1 -1
  235. package/src/theme/components/global.ts +7 -7
  236. package/src/theme/components/heading.ts +13 -11
  237. package/src/theme/components/helperErrorText.ts +1 -1
  238. package/src/theme/components/image.ts +1 -1
  239. package/src/theme/components/link.ts +17 -5
  240. package/src/theme/components/list.ts +3 -5
  241. package/src/theme/components/logo.ts +54 -0
  242. package/src/theme/components/notification.ts +19 -9
  243. package/src/theme/components/searchBar.ts +11 -13
  244. package/src/theme/components/select.ts +1 -0
  245. package/src/theme/components/statusBadge.ts +1 -1
  246. package/src/theme/components/structuredContent.ts +74 -0
  247. package/src/theme/components/template.ts +10 -10
  248. package/src/theme/components/text.ts +6 -6
  249. package/src/theme/components/textInput.ts +2 -0
  250. package/src/theme/components/toggle.ts +10 -6
  251. package/src/theme/components/videoPlayer.ts +0 -2
  252. package/src/theme/foundations/global.ts +2 -2
  253. package/src/theme/foundations/typography.ts +84 -12
  254. package/src/theme/index.ts +6 -0
  255. package/src/utils/componentCategories.ts +2 -1
  256. package/src/utils/utils.ts +17 -0
  257. package/dist/__tests__/utils/bem.test.d.ts +0 -1
  258. package/dist/components/CardEdition/CardEdition.d.ts +0 -21
  259. package/dist/components/CardEdition/CardEdition.stories.d.ts +0 -27
  260. package/dist/components/Input/Input.d.ts +0 -36
  261. package/dist/components/Input/Input.stories.d.ts +0 -29
  262. package/dist/components/Input/InputTypes.d.ts +0 -6
  263. package/dist/components/StyleGuide/UIDocCard.d.ts +0 -11
  264. package/dist/helpers/CSSVariablesHelper.d.ts +0 -3
  265. package/dist/helpers/getCSSVariable.d.ts +0 -1
  266. package/dist/interfaces.d.ts +0 -3
  267. package/dist/utils/bem.d.ts +0 -1
  268. package/src/__tests__/utils/bem.test.ts +0 -37
  269. package/src/components/CardEdition/CardEdition.stories.tsx +0 -122
  270. package/src/components/CardEdition/CardEdition.test.tsx +0 -395
  271. package/src/components/CardEdition/CardEdition.tsx +0 -60
  272. package/src/components/CardEdition/_CardEdition.scss +0 -137
  273. package/src/components/Input/Input.stories.tsx +0 -133
  274. package/src/components/Input/Input.test.tsx +0 -266
  275. package/src/components/Input/Input.tsx +0 -81
  276. package/src/components/Input/InputTypes.tsx +0 -8
  277. package/src/components/Input/_Input.scss +0 -78
  278. package/src/components/StyleGuide/UIDocCard.tsx +0 -36
  279. package/src/helpers/CSSVariablesHelper.tsx +0 -34
  280. package/src/helpers/getCSSVariable.tsx +0 -5
  281. package/src/interfaces.ts +0 -3
  282. package/src/utils/bem.ts +0 -44
@@ -1,11 +1,11 @@
1
+ import { Box } from "@chakra-ui/react";
1
2
  import {
2
- Meta,
3
- Story,
4
- Canvas,
5
3
  ArgsTable,
4
+ Canvas,
6
5
  Description,
7
- } from "@storybook/addon-docs/blocks";
8
- import { Box } from "@chakra-ui/react";
6
+ Meta,
7
+ Story,
8
+ } from "@storybook/addon-docs";
9
9
 
10
10
  import Label from "./Label";
11
11
  import { getCategory } from "../../utils/componentCategories";
@@ -17,8 +17,15 @@ import { getCategory } from "../../utils/componentCategories";
17
17
  jest: ["Label.test.tsx"],
18
18
  }}
19
19
  argTypes={{
20
- className: { table: { disable: true } },
21
- id: { table: { disable: true } },
20
+ className: { control: false },
21
+ id: { control: false },
22
+ optReqFlag: {
23
+ control: { type: "select" },
24
+ options: ["Required", "Optional", ""],
25
+ },
26
+ text: {
27
+ description: "Only used for Storybook",
28
+ },
22
29
  }}
23
30
  />
24
31
 
@@ -33,26 +40,20 @@ import { getCategory } from "../../utils/componentCategories";
33
40
 
34
41
  <Canvas>
35
42
  <Story
36
- name="Label"
43
+ name="Label with Controls"
37
44
  args={{
38
- text: "A label for a villager.",
39
- optReqFlag: "Required",
45
+ className: undefined,
40
46
  htmlFor: "id-of-input-element",
41
- }}
42
- argTypes={{
43
- optReqFlag: {
44
- control: {
45
- type: "select",
46
- },
47
- options: ["Required", "Optional", ""],
48
- },
47
+ id: "label-id",
48
+ optReqFlag: "Required",
49
+ text: "A label for a villager.",
49
50
  }}
50
51
  >
51
52
  {(args) => <Label {...args}>{args.text}</Label>}
52
53
  </Story>
53
54
  </Canvas>
54
55
 
55
- <ArgsTable story="Label" />
56
+ <ArgsTable story="Label with Controls" />
56
57
 
57
58
  ## Required/Optional helper text
58
59
 
@@ -1,23 +1,26 @@
1
+ import { VStack } from "@chakra-ui/react";
1
2
  import {
2
- Meta,
3
- Story,
4
- Canvas,
5
3
  ArgsTable,
4
+ Canvas,
6
5
  Description,
7
- } from "@storybook/addon-docs/blocks";
8
- import { withDesign } from "storybook-addon-designs";
6
+ Meta,
7
+ Story,
8
+ } from "@storybook/addon-docs";
9
9
  import {
10
10
  BrowserRouter as Router,
11
11
  Link as ReactRouterLink,
12
12
  } from "react-router-dom";
13
- import { VStack } from "@chakra-ui/react";
13
+ import { withDesign } from "storybook-addon-designs";
14
14
 
15
15
  import Link from "./Link";
16
16
  import { LinkTypes } from "./LinkTypes";
17
17
  import Icon from "../Icons/Icon";
18
- import { IconAlign, IconSizes } from "../Icons/IconTypes";
18
+ import { IconAlign, IconNames, IconSizes } from "../Icons/IconTypes";
19
19
  import { getCategory } from "../../utils/componentCategories";
20
20
  import DSProvider from "../../theme/provider";
21
+ import { getStorybookEnumValues } from "../../utils/utils";
22
+
23
+ export const enumValues = getStorybookEnumValues(LinkTypes, "LinkTypes");
21
24
 
22
25
  <Meta
23
26
  title={getCategory("Link")}
@@ -31,13 +34,15 @@ import DSProvider from "../../theme/provider";
31
34
  jest: ["Link.test.tsx"],
32
35
  }}
33
36
  argTypes={{
34
- attributes: { table: { disable: true } },
37
+ additionalStyles: { control: false },
38
+ attributes: { control: false },
35
39
  children: { table: { disable: true } },
40
+ key: { table: { disable: true } },
41
+ ref: { table: { disable: true } },
36
42
  type: {
37
- control: {
38
- type: "select",
39
- },
40
- options: LinkTypes,
43
+ control: { type: "select" },
44
+ table: { defaultValue: { summary: "LinkTypes.Default" } },
45
+ options: enumValues.options,
41
46
  },
42
47
  }}
43
48
  />
@@ -47,29 +52,34 @@ import DSProvider from "../../theme/provider";
47
52
  | Component Version | DS Version |
48
53
  | ----------------- | ---------- |
49
54
  | Added | `0.0.4` |
50
- | Latest | `0.25.8` |
55
+ | Latest | `0.25.9` |
51
56
 
52
57
  <Description of={Link} />
53
58
 
54
59
  <Canvas withToolbar>
55
60
  <Story
56
- name="Basic"
61
+ name="Link with Controls"
57
62
  args={{
58
- id: "nypl-link",
59
- type: LinkTypes.Action,
60
- href: "https://nypl.org",
61
- className: "custom-class",
63
+ additionalStyles: undefined,
62
64
  attributes: {
63
65
  rel: "nofollow",
64
66
  onClick: (e) => e.preventDefault(),
65
67
  },
68
+ className: "custom-class",
69
+ href: "https://nypl.org",
70
+ id: "nypl-link",
71
+ type: "LinkTypes.Action",
66
72
  }}
67
73
  >
68
- {(args) => <Link {...args}>Link</Link>}
74
+ {(args) => (
75
+ <Link {...args} type={enumValues.getValue(args.type)}>
76
+ Link
77
+ </Link>
78
+ )}
69
79
  </Story>
70
80
  </Canvas>
71
81
 
72
- <ArgsTable story="Basic" />
82
+ <ArgsTable story="Link with Controls" />
73
83
 
74
84
  ## Links With Icons
75
85
 
@@ -89,12 +99,20 @@ links with icons. Icons can be rendered to the left or right of the link text.
89
99
  Clock Link
90
100
  </Link>
91
101
  <Link type={LinkTypes.Action} href="#passed-in-link">
92
- <Icon name="check" align={IconAlign.Left} size={IconSizes.Small} />
102
+ <Icon
103
+ name={IconNames.Check}
104
+ align={IconAlign.Left}
105
+ size={IconSizes.Small}
106
+ />
93
107
  Check Link
94
108
  </Link>
95
109
  <Link type={LinkTypes.Action} href="#passed-in-link-right">
96
110
  Check Link Right
97
- <Icon name="check" align={IconAlign.Right} size={IconSizes.Small} />
111
+ <Icon
112
+ name={IconNames.Check}
113
+ align={IconAlign.Right}
114
+ size={IconSizes.Small}
115
+ />
98
116
  </Link>
99
117
  </VStack>
100
118
  </Story>
@@ -102,8 +120,29 @@ links with icons. Icons can be rendered to the left or right of the link text.
102
120
 
103
121
  ## Anchor Element Rendering
104
122
 
105
- `Link` can wrap an existing `<a>` tag or it can use the `href` prop to generate
106
- an `<a>` tag.
123
+ `Link` can wrap an existing `<a>` element (and `Icon` component) or it
124
+ can use the `href` prop to generate an `<a>` element.
125
+
126
+ ```jsx
127
+ // Existing anchor element
128
+ <Link type={LinkTypes.Action}>
129
+ <a href="#existing-anchor-tag">link</a>
130
+ </Link>
131
+
132
+ // Also works with an icon component. Make sure to wrap the icon and anchor
133
+ // in a single element for this pattern.
134
+ <Link type={LinkTypes.Action}>
135
+ <>
136
+ <Icon name={IconNames.Check} align={IconAlign.Left} size={IconSizes.Small} />
137
+ <a href="#existing-anchor-tag">check link</a>
138
+ </>
139
+ </Link>
140
+
141
+ // Otherwise, the `href` prop will generate an `<a>` tag.
142
+ <Link type={LinkTypes.Action} href="#passed-in-link">
143
+ link
144
+ </Link>
145
+ ```
107
146
 
108
147
  <Canvas>
109
148
  <Story name="Anchor Element Rendering">
@@ -112,11 +151,23 @@ an `<a>` tag.
112
151
  <Link type={LinkTypes.Action}>
113
152
  <a href="#existing-anchor-tag">link</a>
114
153
  </Link>{" "}
115
- with the &lt;a&gt; tag as a child of the Link component. And this is a{" "}
154
+ with the &lt;a&gt; element as a child of the `Link` component. This is a{" "}
116
155
  <Link type={LinkTypes.Action} href="#passed-in-link">
117
156
  link
118
157
  </Link>{" "}
119
- where the Link component uses the `href` prop and has a string-only child.
158
+ where the `Link` component uses the `href` prop and has a string-only
159
+ child. Finally, this is a{" "}
160
+ <Link type={LinkTypes.Action}>
161
+ <>
162
+ <Icon
163
+ name={IconNames.Check}
164
+ align={IconAlign.Left}
165
+ size={IconSizes.Small}
166
+ />
167
+ <a href="#existing-anchor-tag">link</a>
168
+ </>
169
+ </Link>{" "}
170
+ with a check icon.
120
171
  </>
121
172
  </Story>
122
173
  </Canvas>
@@ -144,9 +195,11 @@ an `<a>` tag.
144
195
 
145
196
  The Design System's `Link` component should wrap around `react-router`'s own
146
197
  `Link` component. To avoid name conflicts, rename either the Design System's
147
- or `react-router`'s `Link` component.
198
+ or `react-router`'s `Link` component. Any of the following patterns are valid.
148
199
 
149
200
  ```jsx
201
+ // In this first example, React Router's `Link` component
202
+ // is renamed as `ReactRouterLink`.
150
203
  import {
151
204
  BrowserRouter as Router,
152
205
  Link as ReactRouterLink,
@@ -157,8 +210,9 @@ import { Link, LinkTypes } from "@nypl/design-system-react-components";
157
210
  <ReactRouterLink to="#">Next Page</ReactRouterLink>
158
211
  </Link>;
159
212
 
160
- // or
161
-
213
+ // In this second example, React Router's `Link` component
214
+ // is not renamed but the DS's `Link` component is renamed
215
+ // to `DSLink`.
162
216
  import { BrowserRouter, Link } from "react-router-dom";
163
217
  import {
164
218
  Link as DSLink,
@@ -169,8 +223,9 @@ import {
169
223
  <Link to="#">Next Page</Link>
170
224
  </DSLink>;
171
225
 
172
- // or
173
-
226
+ // In this third example, React Router's `Link` component
227
+ // is not renamed and the DS's `Link` component is
228
+ // imported and rendered as `DS.Link`.
174
229
  import { BrowserRouter, Link } from "react-router-dom";
175
230
  import DS from "@nypl/design-system-react-components";
176
231
 
@@ -200,34 +255,30 @@ pages in a NextJS app.
200
255
  ```jsx
201
256
  import { Link, LinkTypes } from "@nypl/design-system-react-components";
202
257
 
203
- /* This is just an example wrapper that works similarly to NextJS' `Link`
258
+ /**
259
+ * This is just an example wrapper that works similarly to NextJS' `Link`
204
260
  * component. In real life, NextJS's `Link` component will pass down the
205
261
  * `href` and `passHref` props and a `ref` to make routing functional.
206
262
  */
207
- export const NextJsLink = (props: HTMLAnchorElement) => (
208
- <div>
209
- {React.cloneElement(
210
- props.children,
211
- { ...props },
212
- props.children.props.children
213
- )}
214
- </div>
215
- );
216
-
263
+ export const NextJsLink = (props: HTMLAnchorElement) =>
264
+ React.cloneElement(
265
+ props.children,
266
+ { ...props },
267
+ props.children.props.children
268
+ );
269
+
270
+ // Note that NextJS' `href` and `passHref` props are required.
217
271
  <NextJsLink href="#" passHref>
218
272
  <Link type={LinkTypes.Action}>Next Page</Link>
219
273
  </NextJsLink>;
220
274
  ```
221
275
 
222
- export const NextJsLink = (props) => (
223
- <div>
224
- {React.cloneElement(
225
- props.children,
226
- { ...props },
227
- props.children.props.children
228
- )}
229
- </div>
230
- );
276
+ export const NextJsLink = (props) =>
277
+ React.cloneElement(
278
+ props.children,
279
+ { ...props },
280
+ props.children.props.children
281
+ );
231
282
 
232
283
  <Canvas>
233
284
  <DSProvider>
@@ -1,16 +1,21 @@
1
- import * as React from "react";
2
1
  import { render, screen } from "@testing-library/react";
3
2
  import { axe } from "jest-axe";
4
- import renderer from "react-test-renderer";
5
-
6
- import Link from "./Link";
7
- import { LinkTypes } from "./LinkTypes";
3
+ import * as React from "react";
8
4
  import {
9
5
  BrowserRouter as Router,
10
6
  Link as ReactRouterLink,
11
7
  } from "react-router-dom";
8
+ import renderer from "react-test-renderer";
9
+
10
+ import Link from "./Link";
11
+ import { LinkTypes } from "./LinkTypes";
12
12
  import Icon from "../Icons/Icon";
13
- import { IconRotationTypes, IconNames, IconAlign } from "../Icons/IconTypes";
13
+ import {
14
+ IconAlign,
15
+ IconNames,
16
+ IconRotationTypes,
17
+ IconSizes,
18
+ } from "../Icons/IconTypes";
14
19
 
15
20
  describe("Link Accessibility", () => {
16
21
  it("passes axe accessibility test for children component", async () => {
@@ -121,11 +126,11 @@ describe("Link", () => {
121
126
 
122
127
  it("throws an error if text is passed but no url is passed", () => {
123
128
  expect(() => render(<Link>Test</Link>)).toThrowError(
124
- "Link needs prop 'href'"
129
+ "`Link` needs the `href` prop."
125
130
  );
126
131
  });
127
132
 
128
- it("throws an error if more than one child is passed", () => {
133
+ it("throws an error if more than one child element is passed", () => {
129
134
  expect(() =>
130
135
  render(
131
136
  <Link>
@@ -202,12 +207,37 @@ describe("Link", () => {
202
207
  </Link>
203
208
  )
204
209
  .toJSON();
210
+ const withAchorChild = renderer
211
+ .create(
212
+ <Link id="anchor-link" type={LinkTypes.Action}>
213
+ <a href="#existing-anchor-tag">check link</a>
214
+ </Link>
215
+ )
216
+ .toJSON();
217
+ const withAchorChildAndIcon = renderer
218
+ .create(
219
+ <Link id="anchor-icon-link" type={LinkTypes.Action}>
220
+ <>
221
+ <Icon
222
+ align={IconAlign.Left}
223
+ id="link-icon"
224
+ name={IconNames.Check}
225
+ size={IconSizes.Small}
226
+ />
227
+ <a href="#existing-anchor-tag">check link</a>
228
+ </>
229
+ </Link>
230
+ )
231
+ .toJSON();
232
+
205
233
  expect(standard).toMatchSnapshot();
206
234
  expect(typeForwards).toMatchSnapshot();
207
235
  expect(typeBackwards).toMatchSnapshot();
208
236
  expect(typeExternal).toMatchSnapshot();
209
237
  expect(typeButton).toMatchSnapshot();
210
238
  expect(withIconChild).toMatchSnapshot();
239
+ expect(withAchorChild).toMatchSnapshot();
240
+ expect(withAchorChildAndIcon).toMatchSnapshot();
211
241
  });
212
242
 
213
243
  // TODO:
@@ -109,7 +109,7 @@ const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(
109
109
  let variant = "link";
110
110
 
111
111
  if (typeof children === "string" && !href) {
112
- throw new Error("Link needs prop 'href'");
112
+ throw new Error("`Link` needs the `href` prop.");
113
113
  }
114
114
 
115
115
  if (
@@ -144,17 +144,24 @@ const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(
144
144
  }
145
145
  const childrenToClone: any = children[0] ? children[0] : children;
146
146
  const childProps = childrenToClone.props;
147
- return React.cloneElement(
148
- childrenToClone,
149
- {
150
- className,
151
- ...linkProps,
152
- ...childProps,
153
- ref,
154
- rel,
155
- target,
156
- },
157
- [childrenToClone.props.children]
147
+ return (
148
+ <Box as="span" __css={style}>
149
+ {React.cloneElement(
150
+ childrenToClone,
151
+ {
152
+ className,
153
+ ...linkProps,
154
+ ...childProps,
155
+ ref,
156
+ rel,
157
+ target,
158
+ // Useful if more styles are needed for the custom
159
+ // anchor element or link component.
160
+ style: additionalStyles,
161
+ },
162
+ [childrenToClone.props.children]
163
+ )}
164
+ </Box>
158
165
  );
159
166
  } else {
160
167
  return (
@@ -199,3 +199,63 @@ exports[`Link renders the UI snapshot correctly 6`] = `
199
199
  Download
200
200
  </a>
201
201
  `;
202
+
203
+ exports[`Link renders the UI snapshot correctly 7`] = `
204
+ <span
205
+ className="css-0"
206
+ >
207
+ <a
208
+ href="#existing-anchor-tag"
209
+ id="anchor-link"
210
+ rel={null}
211
+ style={Object {}}
212
+ target={null}
213
+ >
214
+ check link
215
+ </a>
216
+ </span>
217
+ `;
218
+
219
+ exports[`Link renders the UI snapshot correctly 8`] = `
220
+ <span
221
+ className="css-0"
222
+ >
223
+ <svg
224
+ aria-hidden={true}
225
+ className="chakra-icon css-onkibi"
226
+ focusable={false}
227
+ id="link-icon"
228
+ role="img"
229
+ title="check icon"
230
+ viewBox="0 0 24 24"
231
+ >
232
+ <g
233
+ stroke="currentColor"
234
+ strokeWidth="1.5"
235
+ >
236
+ <path
237
+ d="M9,9a3,3,0,1,1,4,2.829,1.5,1.5,0,0,0-1,1.415V14.25"
238
+ fill="none"
239
+ strokeLinecap="round"
240
+ />
241
+ <path
242
+ d="M12,17.25a.375.375,0,1,0,.375.375A.375.375,0,0,0,12,17.25h0"
243
+ fill="currentColor"
244
+ strokeLinecap="round"
245
+ />
246
+ <circle
247
+ cx="12"
248
+ cy="12"
249
+ fill="none"
250
+ r="11.25"
251
+ strokeMiterlimit="10"
252
+ />
253
+ </g>
254
+ </svg>
255
+ <a
256
+ href="#existing-anchor-tag"
257
+ >
258
+ check link
259
+ </a>
260
+ </span>
261
+ `;