@nypl/design-system-react-components 0.25.0 → 0.25.1

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 (236) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/components/Accordion/Accordion.d.ts +14 -14
  3. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +11 -14
  4. package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +6 -0
  5. package/dist/components/Button/ButtonTypes.d.ts +2 -1
  6. package/dist/components/Card/Card.d.ts +1 -1
  7. package/dist/components/Card/CardTypes.d.ts +2 -2
  8. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +43 -0
  9. package/dist/components/CheckboxGroup/CheckboxGroupLayoutTypes.d.ts +4 -0
  10. package/dist/components/DatePicker/DatePicker.d.ts +3 -3
  11. package/dist/components/Form/Form.d.ts +13 -8
  12. package/dist/components/Form/FormTypes.d.ts +2 -8
  13. package/dist/components/Grid/GridTypes.d.ts +9 -0
  14. package/dist/components/Grid/SimpleGrid.d.ts +14 -0
  15. package/dist/components/Heading/Heading.d.ts +4 -4
  16. package/dist/components/Hero/Hero.d.ts +19 -14
  17. package/dist/components/Hero/HeroTypes.d.ts +10 -5
  18. package/dist/components/Icons/Icon.d.ts +13 -16
  19. package/dist/components/Icons/IconTypes.d.ts +78 -64
  20. package/dist/components/Label/Label.d.ts +5 -17
  21. package/dist/components/Link/Link.d.ts +8 -12
  22. package/dist/components/SearchBar/SearchBar.d.ts +45 -27
  23. package/dist/components/Select/Select.d.ts +32 -35
  24. package/dist/components/Select/SelectTypes.d.ts +4 -0
  25. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +1 -1
  26. package/dist/components/SkeletonLoader/SkeletonLoaderTypes.d.ts +2 -2
  27. package/dist/components/StatusBadge/StatusBadge.d.ts +8 -6
  28. package/dist/components/StatusBadge/StatusBadgeTypes.d.ts +5 -0
  29. package/dist/components/Template/Template.d.ts +91 -0
  30. package/dist/components/Text/Text.d.ts +16 -0
  31. package/dist/components/Text/TextTypes.d.ts +6 -0
  32. package/dist/components/TextInput/TextInput.d.ts +32 -31
  33. package/dist/components/TextInput/TextInputTypes.d.ts +5 -0
  34. package/dist/design-system-react-components.cjs.development.js +2597 -1170
  35. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  36. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  37. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  38. package/dist/design-system-react-components.esm.js +2580 -1173
  39. package/dist/design-system-react-components.esm.js.map +1 -1
  40. package/dist/index.d.ts +8 -1
  41. package/dist/styles.css +1 -1
  42. package/dist/theme/components/accordion.d.ts +25 -0
  43. package/dist/theme/components/breadcrumb.d.ts +90 -0
  44. package/dist/theme/components/button.d.ts +17 -7
  45. package/dist/theme/components/checkbox.d.ts +7 -7
  46. package/dist/theme/components/customCheckboxGroup.d.ts +18 -0
  47. package/dist/theme/components/customRadioGroup.d.ts +4 -3
  48. package/dist/theme/components/global.d.ts +55 -0
  49. package/dist/theme/components/globalMixins.d.ts +15 -0
  50. package/dist/theme/components/heading.d.ts +50 -20
  51. package/dist/theme/components/hero.d.ts +492 -0
  52. package/dist/theme/components/icon.d.ts +13 -0
  53. package/dist/theme/components/label.d.ts +16 -0
  54. package/dist/theme/components/link.d.ts +45 -0
  55. package/dist/theme/components/radio.d.ts +8 -7
  56. package/dist/theme/components/searchBar.d.ts +20 -0
  57. package/dist/theme/components/select.d.ts +58 -0
  58. package/dist/theme/components/statusBadge.d.ts +25 -0
  59. package/dist/theme/components/tabs.d.ts +9 -9
  60. package/dist/theme/components/template.d.ts +105 -0
  61. package/dist/theme/components/text.d.ts +20 -0
  62. package/dist/theme/components/textInput.d.ts +105 -0
  63. package/dist/theme/foundations/global.d.ts +3 -0
  64. package/dist/theme/foundations/shadows.d.ts +4 -0
  65. package/dist/utils/utils.d.ts +6 -0
  66. package/package.json +3 -2
  67. package/src/components/Accordion/Accordion.stories.mdx +227 -33
  68. package/src/components/Accordion/Accordion.test.tsx +135 -19
  69. package/src/components/Accordion/Accordion.tsx +81 -56
  70. package/src/components/Autosuggest/Autosuggest.stories.mdx +1 -1
  71. package/src/components/Autosuggest/Autosuggest.stories.tsx +1 -1
  72. package/src/components/Autosuggest/_Autosuggest.scss +2 -2
  73. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +46 -52
  74. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +31 -25
  75. package/src/components/Breadcrumbs/Breadcrumbs.tsx +71 -73
  76. package/src/components/Breadcrumbs/BreadcrumbsTypes.tsx +6 -0
  77. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +100 -0
  78. package/src/components/Button/Button.stories.mdx +31 -27
  79. package/src/components/Button/Button.test.tsx +17 -5
  80. package/src/components/Button/ButtonTypes.tsx +1 -0
  81. package/src/components/Button/_Button.scss +3 -27
  82. package/src/components/Button/__snapshots__/Button.test.tsx.snap +11 -0
  83. package/src/components/Card/Card.stories.mdx +24 -20
  84. package/src/components/Card/Card.test.tsx +13 -19
  85. package/src/components/Card/Card.tsx +1 -1
  86. package/src/components/Card/CardTypes.tsx +2 -2
  87. package/src/components/Card/_Card.scss +1 -1
  88. package/src/components/CardEdition/CardEdition.stories.tsx +11 -6
  89. package/src/components/CardEdition/CardEdition.test.tsx +23 -31
  90. package/src/components/CardEdition/_CardEdition.scss +2 -2
  91. package/src/components/Chakra/Center.stories.mdx +31 -14
  92. package/src/components/Chakra/Grid.stories.mdx +79 -0
  93. package/src/components/Chakra/Stack.stories.mdx +4 -4
  94. package/src/components/Checkbox/Checkbox.tsx +9 -12
  95. package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +2 -5
  96. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +249 -0
  97. package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +345 -0
  98. package/src/components/CheckboxGroup/CheckboxGroup.tsx +148 -0
  99. package/src/components/CheckboxGroup/CheckboxGroupLayoutTypes.tsx +4 -0
  100. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +1360 -0
  101. package/src/components/DatePicker/DatePicker.test.tsx +4 -4
  102. package/src/components/DatePicker/DatePicker.tsx +13 -13
  103. package/src/components/DatePicker/_DatePicker.scss +1 -0
  104. package/src/components/Form/Form.stories.mdx +46 -21
  105. package/src/components/Form/Form.test.tsx +58 -45
  106. package/src/components/Form/Form.tsx +49 -21
  107. package/src/components/Form/FormTypes.tsx +3 -8
  108. package/src/components/Form/__snapshots__/Form.test.tsx.snap +24 -14
  109. package/src/components/Grid/GridTypes.tsx +9 -0
  110. package/src/components/Grid/SimpleGrid.stories.mdx +275 -0
  111. package/src/components/Grid/SimpleGrid.test.tsx +66 -0
  112. package/src/components/Grid/SimpleGrid.tsx +37 -0
  113. package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +8 -0
  114. package/src/components/Heading/Heading.stories.mdx +1 -0
  115. package/src/components/Heading/Heading.tsx +12 -6
  116. package/src/components/HelperErrorText/_HelperErrorText.scss +1 -1
  117. package/src/components/Hero/Hero.stories.mdx +188 -121
  118. package/src/components/Hero/Hero.test.tsx +537 -107
  119. package/src/components/Hero/Hero.tsx +79 -92
  120. package/src/components/Hero/HeroTypes.tsx +17 -5
  121. package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +307 -0
  122. package/src/components/HorizontalRule/_HorizontalRule.scss +1 -1
  123. package/src/components/Icons/Icon.stories.mdx +83 -74
  124. package/src/components/Icons/Icon.test.tsx +30 -22
  125. package/src/components/Icons/Icon.tsx +63 -61
  126. package/src/components/Icons/IconTypes.tsx +80 -64
  127. package/src/components/Input/_Input.scss +2 -2
  128. package/src/components/Label/Label.stories.mdx +28 -7
  129. package/src/components/Label/Label.test.tsx +43 -12
  130. package/src/components/Label/Label.tsx +21 -34
  131. package/src/components/Label/__snapshots__/Label.test.tsx.snap +41 -0
  132. package/src/components/Link/Link.stories.mdx +41 -41
  133. package/src/components/Link/Link.test.tsx +33 -44
  134. package/src/components/Link/Link.tsx +114 -100
  135. package/src/components/List/List.stories.mdx +0 -2
  136. package/src/components/List/List.stories.tsx +5 -5
  137. package/src/components/List/_List.scss +3 -3
  138. package/src/components/Modal/_Modal.scss +1 -1
  139. package/src/components/Notification/Notification.stories.mdx +12 -1
  140. package/src/components/Notification/Notification.test.tsx +3 -16
  141. package/src/components/Notification/Notification.tsx +9 -10
  142. package/src/components/Notification/_Notification.scss +4 -4
  143. package/src/components/Pagination/Pagination.test.tsx +16 -10
  144. package/src/components/RadioGroup/RadioGroup.stories.mdx +1 -1
  145. package/src/components/RadioGroup/RadioGroup.tsx +2 -10
  146. package/src/components/SearchBar/SearchBar.Test.tsx +151 -16
  147. package/src/components/SearchBar/SearchBar.stories.mdx +189 -219
  148. package/src/components/SearchBar/SearchBar.tsx +151 -46
  149. package/src/components/Select/Select.stories.mdx +188 -170
  150. package/src/components/Select/Select.test.tsx +125 -380
  151. package/src/components/Select/Select.tsx +118 -165
  152. package/src/components/Select/SelectTypes.tsx +4 -0
  153. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +13 -25
  154. package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +7 -7
  155. package/src/components/SkeletonLoader/SkeletonLoader.tsx +4 -2
  156. package/src/components/SkeletonLoader/SkeletonLoaderTypes.tsx +2 -2
  157. package/src/components/SkeletonLoader/_SkeletonLoader.scss +3 -3
  158. package/src/components/StatusBadge/StatusBadge.stories.mdx +91 -0
  159. package/src/components/StatusBadge/StatusBadge.test.tsx +35 -7
  160. package/src/components/StatusBadge/StatusBadge.tsx +24 -25
  161. package/src/components/StatusBadge/StatusBadgeTypes.tsx +5 -0
  162. package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +28 -0
  163. package/src/components/StyleGuide/Bidirectionality.stories.mdx +16 -16
  164. package/src/components/StyleGuide/Buttons.stories.mdx +15 -15
  165. package/src/components/StyleGuide/Colors.stories.mdx +336 -0
  166. package/src/components/StyleGuide/Iconography.stories.mdx +88 -90
  167. package/src/components/StyleGuide/UIDocCard.tsx +1 -1
  168. package/src/components/Tabs/Tabs.tsx +7 -9
  169. package/src/components/Template/Template.stories.mdx +574 -0
  170. package/src/components/Template/Template.test.tsx +124 -0
  171. package/src/components/Template/Template.tsx +226 -0
  172. package/src/components/Text/Text.stories.mdx +70 -0
  173. package/src/components/Text/Text.test.tsx +63 -0
  174. package/src/components/Text/Text.tsx +55 -0
  175. package/src/components/Text/TextTypes.tsx +6 -0
  176. package/src/components/Text/__snapshots__/Text.test.tsx.snap +33 -0
  177. package/src/components/TextInput/TextInput.stories.mdx +89 -90
  178. package/src/components/TextInput/TextInput.test.tsx +65 -86
  179. package/src/components/TextInput/TextInput.tsx +101 -95
  180. package/src/components/TextInput/TextInputTypes.tsx +6 -0
  181. package/src/components/VideoPlayer/_VideoPlayer.scss +1 -1
  182. package/src/docs/Chakra.stories.mdx +4 -4
  183. package/src/docs/Intro.stories.mdx +15 -13
  184. package/src/index.ts +20 -0
  185. package/src/styles/01-colors/_colors-brand.scss +6 -0
  186. package/src/styles/01-colors/_colors-utility.scss +14 -12
  187. package/src/styles/base/_04-base.scss +2 -1
  188. package/src/styles/base/_place-holder.scss +1 -1
  189. package/src/styles.scss +10 -12
  190. package/src/theme/components/accordion.ts +30 -0
  191. package/src/theme/components/breadcrumb.ts +77 -0
  192. package/src/theme/components/button.ts +77 -63
  193. package/src/theme/components/checkbox.ts +15 -27
  194. package/src/theme/components/customCheckboxGroup.ts +12 -0
  195. package/src/theme/components/customRadioGroup.ts +4 -10
  196. package/src/theme/components/global.ts +71 -0
  197. package/src/theme/components/globalMixins.ts +16 -0
  198. package/src/theme/components/heading.ts +15 -8
  199. package/src/theme/components/hero.ts +239 -0
  200. package/src/theme/components/icon.ts +79 -0
  201. package/src/theme/components/label.ts +17 -0
  202. package/src/theme/components/link.ts +47 -0
  203. package/src/theme/components/radio.ts +20 -31
  204. package/src/theme/components/searchBar.ts +21 -0
  205. package/src/theme/components/select.ts +50 -0
  206. package/src/theme/components/statusBadge.ts +27 -0
  207. package/src/theme/components/tabs.ts +72 -69
  208. package/src/theme/components/template.ts +114 -0
  209. package/src/theme/components/text.ts +31 -0
  210. package/src/theme/components/textInput.ts +61 -0
  211. package/src/theme/foundations/colors.ts +29 -13
  212. package/src/theme/foundations/global.ts +3 -0
  213. package/src/theme/foundations/shadows.ts +5 -0
  214. package/src/theme/index.ts +37 -7
  215. package/src/utils/componentCategories.ts +8 -2
  216. package/src/utils/utils.ts +13 -0
  217. package/dist/components/Accordion/Accordion.stories.d.ts +0 -6
  218. package/dist/components/StatusBadge/StatusBadge.stories.d.ts +0 -8
  219. package/dist/components/StyleGuide/Colors.stories.d.ts +0 -25
  220. package/dist/components/Template/Template.stories.d.ts +0 -30
  221. package/src/components/Accordion/Accordion.stories.tsx +0 -66
  222. package/src/components/Accordion/_Accordion.scss +0 -81
  223. package/src/components/Breadcrumbs/_Breadcrumbs.scss +0 -97
  224. package/src/components/Form/_Form.scss +0 -67
  225. package/src/components/Hero/_Hero.scss +0 -256
  226. package/src/components/Icons/_Icons.scss +0 -116
  227. package/src/components/Label/_Label.scss +0 -22
  228. package/src/components/Link/_Link.scss +0 -73
  229. package/src/components/SearchBar/_SearchBar.scss +0 -16
  230. package/src/components/Select/_Select.scss +0 -82
  231. package/src/components/StatusBadge/StatusBadge.stories.tsx +0 -34
  232. package/src/components/StatusBadge/_StatusBadge.scss +0 -23
  233. package/src/components/StyleGuide/Colors.stories.tsx +0 -289
  234. package/src/components/Template/Template.stories.tsx +0 -86
  235. package/src/components/Template/_Template.scss +0 -63
  236. package/src/components/TextInput/_TextInput.scss +0 -59
@@ -9,10 +9,10 @@ import {
9
9
  Link as ReactRouterLink,
10
10
  } from "react-router-dom";
11
11
  import Icon from "../Icons/Icon";
12
- import { IconRotationTypes, IconNames } from "../Icons/IconTypes";
12
+ import { IconRotationTypes, IconNames, IconAlign } from "../Icons/IconTypes";
13
13
 
14
14
  describe("Link Accessibility", () => {
15
- it("passes axe accessibility test", async () => {
15
+ it("passes axe accessibility test for children component", async () => {
16
16
  const { container } = render(
17
17
  <Link>
18
18
  <a href="#test">Test</a>
@@ -20,26 +20,28 @@ describe("Link Accessibility", () => {
20
20
  );
21
21
  expect(await axe(container)).toHaveNoViolations();
22
22
  });
23
+
24
+ it("passes axe accessibility test for href prop", async () => {
25
+ const { container } = render(<Link href="#test">Test</Link>);
26
+ expect(await axe(container)).toHaveNoViolations();
27
+ });
23
28
  });
24
29
 
25
30
  describe("Link", () => {
26
- it("Can pass in icon, text as child and url as props", () => {
31
+ it("Can pass in an icon and text as children and url as prop", () => {
27
32
  const utils = render(
28
33
  <Link href="#passed-in-link" type={LinkTypes.Action}>
29
34
  <Icon
30
- name={IconNames.download}
31
- blockName="more-link"
32
- modifiers={["left"]}
33
- decorative={true}
34
- iconRotation={IconRotationTypes.rotate0}
35
+ className="more-link"
36
+ name={IconNames.Download}
37
+ align={IconAlign.Left}
38
+ iconRotation={IconRotationTypes.Rotate0}
35
39
  />
36
40
  Download
37
41
  </Link>
38
42
  );
39
43
  expect(screen.getByRole("link")).toBeInTheDocument();
40
- expect(
41
- utils.container.querySelector(".more-link__icon")
42
- ).toBeInTheDocument();
44
+ expect(utils.container.querySelector(".more-link")).toBeInTheDocument();
43
45
  });
44
46
 
45
47
  it("Can pass a link with <a> tag", () => {
@@ -56,20 +58,17 @@ describe("Link", () => {
56
58
  <Link type={LinkTypes.Action}>
57
59
  <a href="#test2">
58
60
  <Icon
59
- name={IconNames.download}
60
- blockName="more-link"
61
- modifiers={["left"]}
62
- decorative={true}
63
- iconRotation={IconRotationTypes.rotate0}
61
+ className="more-link"
62
+ name={IconNames.Download}
63
+ align={IconAlign.Left}
64
+ iconRotation={IconRotationTypes.Rotate0}
64
65
  />
65
66
  Test
66
67
  </a>
67
68
  </Link>
68
69
  );
69
70
  expect(screen.getByRole("link")).toBeInTheDocument();
70
- expect(
71
- utils.container.querySelector(".more-link__icon")
72
- ).toBeInTheDocument();
71
+ expect(utils.container.querySelector(".more-link")).toBeInTheDocument();
73
72
  });
74
73
 
75
74
  it("Generated back link has icon", () => {
@@ -78,13 +77,10 @@ describe("Link", () => {
78
77
  content
79
78
  </Link>
80
79
  );
80
+ expect(utils.container.querySelector(".more-link")).toBeInTheDocument();
81
81
  expect(
82
- utils.container.querySelector(".more-link__icon")
83
- ).toBeInTheDocument();
84
- expect(utils.container.querySelector(".more-link__icon")).toHaveAttribute(
85
- "class",
86
- "more-link__icon more-link__icon--left more-link__icon--rotate-90 "
87
- );
82
+ utils.container.querySelector(".more-link").getAttribute("class")
83
+ ).toContain("chakra-icon more-link");
88
84
  });
89
85
 
90
86
  it("Generated forwards link has icon", () => {
@@ -93,13 +89,10 @@ describe("Link", () => {
93
89
  content
94
90
  </Link>
95
91
  );
92
+ expect(utils.container.querySelector(".more-link")).toBeInTheDocument();
96
93
  expect(
97
- utils.container.querySelector(".more-link__icon")
98
- ).toBeInTheDocument();
99
- expect(utils.container.querySelector(".more-link__icon")).toHaveAttribute(
100
- "class",
101
- "more-link__icon more-link__icon--right more-link__icon--rotate-270 "
102
- );
94
+ utils.container.querySelector(".more-link").getAttribute("class")
95
+ ).toContain("chakra-icon more-link");
103
96
  });
104
97
 
105
98
  it("Can pass in text as child and url as props", () => {
@@ -113,12 +106,10 @@ describe("Link", () => {
113
106
  <Link type={LinkTypes.Action}>
114
107
  <ReactRouterLink to="#">
115
108
  <Icon
116
- name={IconNames.download}
117
- blockName="more-link"
118
- modifiers={["left"]}
119
- decorative={true}
120
- iconRotation={IconRotationTypes.rotate0}
121
- ></Icon>
109
+ name={IconNames.Download}
110
+ align={IconAlign.Left}
111
+ iconRotation={IconRotationTypes.Rotate0}
112
+ />
122
113
  Download
123
114
  </ReactRouterLink>
124
115
  </Link>
@@ -138,16 +129,14 @@ describe("Link", () => {
138
129
  render(
139
130
  <Link>
140
131
  <Icon
141
- name={IconNames.download}
142
- blockName="more-link"
143
- modifiers={["left"]}
144
- decorative={true}
145
- iconRotation={IconRotationTypes.rotate0}
146
- ></Icon>
132
+ name={IconNames.Download}
133
+ align={IconAlign.Left}
134
+ iconRotation={IconRotationTypes.Rotate0}
135
+ />
147
136
  <a href="#test">Test</a>
148
137
  </Link>
149
138
  )
150
- ).toThrowError("Please pass only one child into Link");
139
+ ).toThrowError("Please pass only one child into `Link`.");
151
140
  });
152
141
 
153
142
  // TODO:
@@ -1,128 +1,142 @@
1
1
  import * as React from "react";
2
- import bem from "../../utils/bem";
2
+ import { Box, useStyleConfig } from "@chakra-ui/react";
3
+
3
4
  import { LinkTypes } from "./LinkTypes";
4
- import Icon, { IconProps } from "../Icons/Icon";
5
- import { IconRotationTypes, IconNames } from "../Icons/IconTypes";
5
+ import Icon from "../Icons/Icon";
6
+ import { IconRotationTypes, IconNames, IconAlign } from "../Icons/IconTypes";
7
+ import generateUUID from "../../helpers/generateUUID";
6
8
 
7
9
  export interface LinkProps {
8
10
  /** Additional attributes, such as `rel=nofollow`, to pass to the `<a>` tag. */
9
11
  attributes?: { [key: string]: any };
10
- /** BlockName for use with BEM. See how to work with blockNames and BEM here: http://getbem.com/introduction/ */
11
- blockName?: string;
12
- /** className that appears in addition to "link" */
12
+ /** Any child node passed to the component. */
13
+ children: React.ReactNode;
14
+ /** Additional class name to render in the `Link` component. */
13
15
  className?: string;
14
- /** Href attribute */
16
+ /** The `href` attribute for the anchor element. */
15
17
  href?: string;
16
- /** ID */
18
+ /** ID used for accessibility purposes. */
17
19
  id?: string;
18
- /** Controls the link visualsaction, button, or default. */
20
+ /** Controls the link visuals: action, button, backwards, forwards, or default. */
19
21
  type?: LinkTypes;
20
- /** Modifiers array for use with BEM. See how to work with modifiers and BEM here: http://getbem.com/introduction/ */
21
- modifiers?: string[];
22
- /** Any child node passed to the component. */
23
- children: React.ReactNode;
24
22
  }
25
23
 
26
24
  /**
27
- * A component that uses an `href` prop or a child anchor element, to create an
28
- * anchor element with added styling and conventions.
25
+ * Renders the `Link` children components with a direction arrow icon based
26
+ * on the `Backwards` or `Forwards` `LinkTypes` type.
29
27
  */
30
- const Link = React.forwardRef<HTMLAnchorElement, LinkProps>((props, ref) => {
31
- const {
32
- attributes,
33
- blockName,
34
- className,
35
- href,
36
- id,
37
- type = LinkTypes.Default,
38
- modifiers = [],
39
- children,
40
- } = props;
41
-
42
- // Merge the necessary props alongside any extra props for the
43
- // anchor element.
44
- const linkProps = {
45
- id,
46
- href,
47
- ...attributes,
48
- };
49
- let baseClass = "link";
50
-
51
- let childProps = {};
28
+ function getWithDirectionIcon(children, type: LinkTypes) {
29
+ let iconRotation;
30
+ let iconAlign;
31
+ let icon = null;
52
32
 
53
- if (typeof children === "string" && !href) {
54
- throw new Error("Link needs prop 'href'");
55
- }
56
-
57
- if (
58
- type === LinkTypes.Action ||
59
- type === LinkTypes.Forwards ||
60
- type === LinkTypes.Backwards
61
- ) {
62
- baseClass = "more-link";
63
- } else if (type === LinkTypes.Button) {
64
- baseClass = "button";
65
- }
66
-
67
- let iconRotation, iconPosition, iconLeft, iconRight;
68
33
  // An icon needs a position in order for it to be created and
69
34
  // rendered in the link.
70
35
  if (type === LinkTypes.Backwards) {
71
- iconRotation = IconRotationTypes.rotate90;
72
- iconPosition = "left";
36
+ iconRotation = IconRotationTypes.Rotate90;
37
+ iconAlign = IconAlign.Left;
73
38
  } else if (type === LinkTypes.Forwards) {
74
- iconRotation = IconRotationTypes.rotate270;
75
- iconPosition = "right";
39
+ iconRotation = IconRotationTypes.Rotate270;
40
+ iconAlign = IconAlign.Right;
76
41
  }
77
42
 
78
- const navigationIconProps: IconProps = {
79
- name: IconNames.arrow,
80
- modifiers: [iconPosition, iconRotation, ...modifiers],
81
- blockName: "more-link",
82
- decorative: true,
83
- };
43
+ icon = (
44
+ <Icon
45
+ name={IconNames.Arrow}
46
+ align={iconAlign}
47
+ iconRotation={iconRotation}
48
+ className="more-link"
49
+ />
50
+ );
84
51
 
85
- if (type === LinkTypes.Backwards) {
86
- iconLeft = <Icon {...navigationIconProps} />;
87
- } else if (type === LinkTypes.Forwards) {
88
- iconRight = <Icon {...navigationIconProps} />;
89
- }
90
- const linkClassName = bem(baseClass, modifiers, blockName, [className]);
52
+ return (
53
+ <>
54
+ {type === LinkTypes.Backwards && icon}
55
+ {children}
56
+ {type === LinkTypes.Forwards && icon}
57
+ </>
58
+ );
59
+ }
60
+
61
+ /**
62
+ * A component that uses an `href` prop or a child anchor element, to create
63
+ * an anchor element with added styling and conventions.
64
+ */
65
+ const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(
66
+ (props, ref: any) => {
67
+ const {
68
+ attributes,
69
+ children,
70
+ className,
71
+ href,
72
+ id = generateUUID(),
73
+ type = LinkTypes.Default,
74
+ } = props;
91
75
 
92
- if (!props.href) {
93
- // React Types error makes this fail: https://github.com/DefinitelyTyped/DefinitelyTyped/issues/32832
94
- // let children = React.Children.only(props.children);
95
- if (React.Children.count(props.children) > 1) {
96
- throw new Error("Please pass only one child into Link");
76
+ // Merge the necessary props alongside any extra props for the
77
+ // anchor element.
78
+ const linkProps = {
79
+ id,
80
+ href,
81
+ ...attributes,
82
+ };
83
+ // The LinkTypes.Default type.
84
+ let variant = "link";
85
+
86
+ if (typeof children === "string" && !href) {
87
+ throw new Error("Link needs prop 'href'");
97
88
  }
98
- const children = props.children[0] ? props.children[0] : props.children;
99
- childProps = children.props;
100
89
 
101
- return React.cloneElement(
102
- children,
103
- {
104
- className: linkClassName,
105
- ...linkProps,
106
- ...childProps,
107
- ref,
108
- },
109
- [children.props.children]
110
- );
111
- } else {
112
- return React.createElement(
113
- "a",
114
- {
115
- ...linkProps,
116
- className: linkClassName,
117
- ref,
118
- },
119
- iconLeft,
120
- props.children,
121
- iconRight
122
- );
123
- }
124
- });
90
+ if (
91
+ type === LinkTypes.Action ||
92
+ type === LinkTypes.Forwards ||
93
+ type === LinkTypes.Backwards
94
+ ) {
95
+ variant = "moreLink";
96
+ } else if (type === LinkTypes.Button) {
97
+ variant = "button";
98
+ }
99
+ const style = useStyleConfig("Link", { variant });
100
+ // Render with specific direction arrows only if the type
101
+ // is Forwards or Backwards.
102
+ const newChildren =
103
+ type === LinkTypes.Forwards || type === LinkTypes.Backwards
104
+ ? getWithDirectionIcon(children, type)
105
+ : children;
125
106
 
126
- Link.displayName = "Link";
107
+ if (!href) {
108
+ // React Types error makes this fail:
109
+ // https://github.com/DefinitelyTyped/DefinitelyTyped/issues/32832
110
+ // let children = React.Children.only(children);
111
+ if (React.Children.count(children) > 1) {
112
+ throw new Error("Please pass only one child into `Link`.");
113
+ }
114
+ const childrenToClone: any = children[0] ? children[0] : children;
115
+ const childProps = childrenToClone.props;
116
+ return React.cloneElement(
117
+ childrenToClone,
118
+ {
119
+ className,
120
+ ...linkProps,
121
+ ...childProps,
122
+ ref,
123
+ },
124
+ [childrenToClone.props.children]
125
+ );
126
+ } else {
127
+ return (
128
+ <Box
129
+ as="a"
130
+ className={className}
131
+ ref={ref}
132
+ {...linkProps}
133
+ __css={style}
134
+ >
135
+ {newChildren}
136
+ </Box>
137
+ );
138
+ }
139
+ }
140
+ );
127
141
 
128
142
  export default Link;
@@ -9,8 +9,6 @@ import {
9
9
  import { withDesign } from "storybook-addon-designs";
10
10
  import Card from "../Card/Card";
11
11
  import Heading from "../Heading/Heading";
12
- import Icon from "../Icons/Icon";
13
- import { IconNames, IconRotationTypes } from "../Icons/IconTypes";
14
12
  import Image from "../Image/Image";
15
13
  import Link from "../Link/Link";
16
14
  import { LinkTypes } from "../Link/LinkTypes";
@@ -4,7 +4,7 @@ import CardEdition from "../CardEdition/CardEdition";
4
4
  import Heading from "../Heading/Heading";
5
5
  import { HeadingLevels } from "../Heading/HeadingTypes";
6
6
  import Icon from "../Icons/Icon";
7
- import { IconNames } from "../Icons/IconTypes";
7
+ import { IconAlign, IconNames, IconSizes } from "../Icons/IconTypes";
8
8
  import Image from "../Image/Image";
9
9
  import Link from "../Link/Link";
10
10
  import { LinkTypes } from "../Link/LinkTypes";
@@ -118,10 +118,10 @@ const exampleCard = (
118
118
  </div>
119
119
  <div className="book__filetype">
120
120
  <Icon
121
- name={IconNames.headset}
122
- decorative={true}
123
- modifiers={["left", "small"]}
124
- ></Icon>
121
+ name={IconNames.Headset}
122
+ align={IconAlign.Left}
123
+ size={IconSizes.Small}
124
+ />
125
125
  Audiobook
126
126
  </div>
127
127
  <div className="book__description">
@@ -11,7 +11,7 @@
11
11
  margin: unset; // browser automatically applies margin
12
12
 
13
13
  &__definition-list {
14
- border-bottom: 1px solid var(--ui-gray-light);
14
+ border-bottom: 1px solid var(--ui-gray-light-cool);
15
15
 
16
16
  h2 {
17
17
  border-top: 3px solid var(--section-research-primary);
@@ -26,7 +26,7 @@
26
26
  margin: var(--space-xs) 0 0;
27
27
 
28
28
  dt {
29
- border-top: 1px solid var(--ui-gray-light);
29
+ border-top: 1px solid var(--ui-gray-light-cool);
30
30
  font-size: var(--font-size-0);
31
31
  font-weight: bold;
32
32
  padding-bottom: 0;
@@ -45,7 +45,7 @@
45
45
  padding-bottom: var(--space-s);
46
46
 
47
47
  @include breakpoint($breakpoint-medium) {
48
- border-top: 1px solid var(--ui-gray-light);
48
+ border-top: 1px solid var(--ui-gray-light-cool);
49
49
  padding-top: var(--space-s);
50
50
  }
51
51
  }
@@ -7,7 +7,7 @@
7
7
  .modal {
8
8
  @include space-inset-s;
9
9
 
10
- background-color: var(--ui-gray-warm-xlight);
10
+ background-color: var(--ui-gray-x-light-warm);
11
11
  height: 100vh;
12
12
  left: 0;
13
13
  overflow-y: auto;
@@ -15,6 +15,12 @@ import Notification, {
15
15
  } from "./Notification";
16
16
  import { NotificationTypes } from "./NotificationTypes";
17
17
  import Icon from "../Icons/Icon";
18
+ import {
19
+ IconSizes,
20
+ IconColors,
21
+ IconNames,
22
+ IconAlign,
23
+ } from "../Icons/IconTypes";
18
24
  import { getCategory } from "../../utils/componentCategories";
19
25
  import DSProvider from "../../theme/provider";
20
26
 
@@ -183,7 +189,12 @@ The default icon can be overridden by using the `icon` prop to pass a custom `Ic
183
189
  {(args) => (
184
190
  <Notification
185
191
  icon={
186
- <Icon name="check" size="large" color="section-research-secondary" />
192
+ <Icon
193
+ align={IconAlign.Left}
194
+ name={IconNames.Check}
195
+ size={IconSizes.Large}
196
+ color={IconColors.SectionResearchSecondary}
197
+ />
187
198
  }
188
199
  >
189
200
  <NotificationHeading>Custom Icon</NotificationHeading>
@@ -86,13 +86,6 @@ describe("Notification: check for Announcement Notification", () => {
86
86
  utils.container.querySelector(".notification--announcement")
87
87
  ).toBeInTheDocument();
88
88
  });
89
- it("Renders Icon with proper color", () => {
90
- expect(
91
- utils.container.querySelector(
92
- ".notification-icon.icon--section-research-secondary"
93
- )
94
- ).toBeInTheDocument();
95
- });
96
89
  });
97
90
 
98
91
  describe("Notification: check for Warning Notification", () => {
@@ -114,12 +107,6 @@ describe("Notification: check for Warning Notification", () => {
114
107
  utils.container.querySelector(".notification--warning")
115
108
  ).toBeInTheDocument();
116
109
  });
117
-
118
- it("Renders Icon with proper color", () => {
119
- expect(
120
- utils.container.querySelector(".notification-icon.icon--brand-primary")
121
- ).toBeInTheDocument();
122
- });
123
110
  });
124
111
 
125
112
  describe("Notification: check for custom Icon", () => {
@@ -130,9 +117,9 @@ describe("Notification: check for custom Icon", () => {
130
117
  id="notificationID"
131
118
  icon={
132
119
  <Icon
133
- name={IconNames.check}
134
- size={IconSizes.large}
135
- color={IconColors.brand_primary}
120
+ name={IconNames.Check}
121
+ size={IconSizes.Large}
122
+ color={IconColors.BrandPrimary}
136
123
  className="custom-icon"
137
124
  />
138
125
  }
@@ -6,7 +6,7 @@ import { ButtonTypes } from "../Button/ButtonTypes";
6
6
  import Heading from "../Heading/Heading";
7
7
  import { HeadingLevels } from "../Heading/HeadingTypes";
8
8
  import Icon from "../Icons/Icon";
9
- import { IconColors, IconNames } from "../Icons/IconTypes";
9
+ import { IconColors, IconNames, IconSizes } from "../Icons/IconTypes";
10
10
  import { NotificationTypes } from "./NotificationTypes";
11
11
 
12
12
  export interface NotificationProps {
@@ -95,9 +95,9 @@ export default function Notification(
95
95
  <Icon
96
96
  decorative={false}
97
97
  className="notification-icon"
98
- name={IconNames.speaker_notes}
99
- color={IconColors.section_research_secondary}
100
- modifiers={["large"]}
98
+ name={IconNames.SpeakerNotes}
99
+ color={IconColors.SectionResearchSecondary}
100
+ size={IconSizes.Large}
101
101
  />
102
102
  );
103
103
  case "warning":
@@ -105,9 +105,9 @@ export default function Notification(
105
105
  <Icon
106
106
  decorative={false}
107
107
  className="notification-icon"
108
- name={IconNames.error_filled}
109
- color={IconColors.brand_primary}
110
- modifiers={["large"]}
108
+ name={IconNames.ErrorFilled}
109
+ color={IconColors.BrandPrimary}
110
+ size={IconSizes.Large}
111
111
  />
112
112
  );
113
113
  default:
@@ -190,10 +190,9 @@ export default function Notification(
190
190
  onClick={handleClose}
191
191
  >
192
192
  <Icon
193
- modifiers={["medium"]}
194
193
  decorative={false}
195
- name={IconNames.close}
196
- titleText={"Close notification"}
194
+ name={IconNames.Close}
195
+ size={IconSizes.Large}
197
196
  />
198
197
  </Button>
199
198
  ) : null}
@@ -45,7 +45,7 @@
45
45
  }
46
46
 
47
47
  &--announcement {
48
- background-color: var(--ui-gray-light);
48
+ background-color: var(--ui-gray-light-cool);
49
49
 
50
50
  .notification-heading {
51
51
  color: var(--section-research-secondary);
@@ -53,7 +53,7 @@
53
53
  }
54
54
 
55
55
  &--warning {
56
- background-color: var(--ui-gray-xxlight);
56
+ background-color: var(--ui-gray-xx-light-cool);
57
57
 
58
58
  .notification-heading {
59
59
  color: var(--brand-primary);
@@ -79,7 +79,7 @@
79
79
  }
80
80
  }
81
81
 
82
- .icon {
82
+ .chakra-icon {
83
83
  flex-shrink: 0;
84
84
  margin-right: var(--space-s);
85
85
  }
@@ -101,7 +101,7 @@
101
101
  width: var(--space-m);
102
102
  }
103
103
 
104
- .icon {
104
+ .chakra-icon {
105
105
  height: var(--space-m);
106
106
  margin-right: 0;
107
107
  width: var(--space-m);