@nypl/design-system-react-components 0.25.7 → 0.25.10

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