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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/CHANGELOG.md +45 -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 +3 -2
  10. package/dist/components/Form/Form.d.ts +2 -2
  11. package/dist/components/Heading/Heading.d.ts +7 -3
  12. package/dist/components/Heading/HeadingTypes.d.ts +6 -6
  13. package/dist/components/HelperErrorText/HelperErrorText.d.ts +5 -2
  14. package/dist/components/HorizontalRule/HorizontalRule.d.ts +2 -2
  15. package/dist/components/Icons/Icon.d.ts +4 -4
  16. package/dist/components/Icons/IconSvgs.d.ts +0 -21
  17. package/dist/components/Icons/IconTypes.d.ts +0 -23
  18. package/dist/components/Image/Image.d.ts +11 -3
  19. package/dist/components/Logo/Logo.d.ts +28 -0
  20. package/dist/components/Logo/LogoSvgs.d.ts +18 -0
  21. package/dist/components/Logo/LogoTypes.d.ts +30 -0
  22. package/dist/components/Modal/Modal.d.ts +0 -4
  23. package/dist/components/Notification/Notification.d.ts +2 -2
  24. package/dist/components/Placeholder/Placeholder.d.ts +3 -5
  25. package/dist/components/Radio/Radio.d.ts +6 -5
  26. package/dist/components/RadioGroup/RadioGroup.d.ts +3 -2
  27. package/dist/components/SearchBar/SearchBar.d.ts +10 -2
  28. package/dist/components/Select/Select.d.ts +3 -2
  29. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +8 -4
  30. package/dist/components/Slider/Slider.d.ts +3 -2
  31. package/dist/components/StatusBadge/StatusBadge.d.ts +2 -1
  32. package/dist/components/StructuredContent/StructuredContent.d.ts +41 -0
  33. package/dist/components/StructuredContent/StructuredContentTypes.d.ts +5 -0
  34. package/dist/components/Table/Table.d.ts +23 -0
  35. package/dist/components/Template/Template.d.ts +8 -3
  36. package/dist/components/Text/Text.d.ts +2 -2
  37. package/dist/components/TextInput/TextInput.d.ts +4 -3
  38. package/dist/components/Toggle/Toggle.d.ts +3 -2
  39. package/dist/components/VideoPlayer/VideoPlayer.d.ts +14 -5
  40. package/dist/design-system-react-components.cjs.development.js +5630 -5692
  41. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  42. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  43. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  44. package/dist/design-system-react-components.esm.js +4304 -4362
  45. package/dist/design-system-react-components.esm.js.map +1 -1
  46. package/dist/index.d.ts +6 -4
  47. package/dist/styles.css +2 -2
  48. package/dist/theme/components/button.d.ts +0 -12
  49. package/dist/theme/components/card.d.ts +14 -2
  50. package/dist/theme/components/customTable.d.ts +47 -0
  51. package/dist/theme/components/fieldset.d.ts +2 -2
  52. package/dist/theme/components/global.d.ts +1 -1
  53. package/dist/theme/components/heading.d.ts +4 -0
  54. package/dist/theme/components/label.d.ts +1 -1
  55. package/dist/theme/components/link.d.ts +14 -1
  56. package/dist/theme/components/list.d.ts +0 -2
  57. package/dist/theme/components/logo.d.ts +4 -0
  58. package/dist/theme/components/searchBar.d.ts +7 -13
  59. package/dist/theme/components/select.d.ts +1 -0
  60. package/dist/theme/components/structuredContent.d.ts +33 -0
  61. package/dist/theme/components/template.d.ts +10 -10
  62. package/dist/theme/components/textInput.d.ts +2 -0
  63. package/dist/theme/components/toggle.d.ts +8 -5
  64. package/dist/utils/utils.d.ts +10 -0
  65. package/package.json +1 -2
  66. package/src/__tests__/utils/utils.test.ts +23 -1
  67. package/src/components/Accordion/Accordion.stories.mdx +14 -12
  68. package/src/components/Autosuggest/Autosuggest.stories.mdx +2 -1
  69. package/src/components/Autosuggest/Autosuggest.stories.tsx +24 -48
  70. package/src/components/Autosuggest/_Autosuggest.scss +2 -6
  71. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +30 -11
  72. package/src/components/Button/Button.stories.mdx +93 -48
  73. package/src/components/Button/Button.test.tsx +0 -12
  74. package/src/components/Button/Button.tsx +7 -7
  75. package/src/components/Button/ButtonTypes.tsx +0 -1
  76. package/src/components/Button/__snapshots__/Button.test.tsx.snap +0 -12
  77. package/src/components/Card/Card.stories.mdx +186 -71
  78. package/src/components/Card/Card.test.tsx +45 -22
  79. package/src/components/Card/Card.tsx +17 -5
  80. package/src/components/Card/__snapshots__/Card.test.tsx.snap +8 -2
  81. package/src/components/Chakra/Box.stories.mdx +3 -3
  82. package/src/components/Chakra/Center.stories.mdx +5 -5
  83. package/src/components/Chakra/Grid.stories.mdx +3 -3
  84. package/src/components/Chakra/Stack.stories.mdx +2 -2
  85. package/src/components/Checkbox/Checkbox.stories.mdx +37 -15
  86. package/src/components/Checkbox/Checkbox.tsx +13 -8
  87. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +48 -16
  88. package/src/components/CheckboxGroup/CheckboxGroup.tsx +14 -10
  89. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +6 -3
  90. package/src/components/ComponentWrapper/ComponentWrapper.test.tsx +151 -0
  91. package/src/components/ComponentWrapper/ComponentWrapper.tsx +36 -23
  92. package/src/components/ComponentWrapper/__snapshots__/ComponentWrapper.test.tsx.snap +85 -0
  93. package/src/components/DatePicker/DatePicker.stories.mdx +63 -18
  94. package/src/components/DatePicker/DatePicker.tsx +10 -6
  95. package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +36 -18
  96. package/src/components/Fieldset/Fieldset.stories.mdx +19 -8
  97. package/src/components/Form/Form.stories.mdx +49 -41
  98. package/src/components/Form/Form.tsx +5 -4
  99. package/src/components/Grid/SimpleGrid.stories.mdx +26 -26
  100. package/src/components/Heading/Heading.stories.mdx +59 -23
  101. package/src/components/Heading/Heading.test.tsx +82 -18
  102. package/src/components/Heading/Heading.tsx +31 -31
  103. package/src/components/Heading/HeadingTypes.tsx +6 -6
  104. package/src/components/Heading/__snapshots__/Heading.test.tsx.snap +71 -0
  105. package/src/components/HelperErrorText/HelperErrorText.stories.mdx +55 -27
  106. package/src/components/HelperErrorText/HelperErrorText.test.tsx +42 -15
  107. package/src/components/HelperErrorText/HelperErrorText.tsx +24 -24
  108. package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +41 -4
  109. package/src/components/Hero/Hero.stories.mdx +72 -53
  110. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +9 -8
  111. package/src/components/HorizontalRule/HorizontalRule.tsx +2 -4
  112. package/src/components/Icons/Icon.stories.mdx +77 -76
  113. package/src/components/Icons/Icon.tsx +4 -5
  114. package/src/components/Icons/IconSvgs.tsx +0 -42
  115. package/src/components/Icons/IconTypes.tsx +0 -24
  116. package/src/components/Image/Image.stories.mdx +66 -18
  117. package/src/components/Image/Image.tsx +21 -10
  118. package/src/components/Label/Label.stories.mdx +20 -19
  119. package/src/components/Link/Link.stories.mdx +102 -51
  120. package/src/components/Link/Link.test.tsx +38 -8
  121. package/src/components/Link/Link.tsx +19 -12
  122. package/src/components/Link/__snapshots__/Link.test.tsx.snap +60 -0
  123. package/src/components/List/List.stories.mdx +36 -24
  124. package/src/components/Logo/Logo.stories.mdx +220 -0
  125. package/src/components/Logo/Logo.test.tsx +98 -0
  126. package/src/components/Logo/Logo.tsx +97 -0
  127. package/src/components/Logo/LogoSvgs.tsx +34 -0
  128. package/src/components/Logo/LogoTypes.tsx +32 -0
  129. package/src/components/Logo/__snapshots__/Logo.test.tsx.snap +71 -0
  130. package/src/components/Modal/Modal.stories.mdx +20 -5
  131. package/src/components/Modal/Modal.tsx +2 -8
  132. package/src/components/Notification/Notification.stories.mdx +61 -38
  133. package/src/components/Notification/Notification.tsx +9 -4
  134. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +4 -0
  135. package/src/components/Pagination/Pagination.stories.mdx +17 -6
  136. package/src/components/Pagination/Pagination.tsx +1 -1
  137. package/src/components/Placeholder/Placeholder.tsx +7 -14
  138. package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +72 -43
  139. package/src/components/Radio/Radio.stories.mdx +39 -19
  140. package/src/components/Radio/Radio.tsx +13 -9
  141. package/src/components/RadioGroup/RadioGroup.stories.mdx +50 -16
  142. package/src/components/RadioGroup/RadioGroup.tsx +15 -11
  143. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +6 -3
  144. package/src/components/SearchBar/SearchBar.Test.tsx +58 -10
  145. package/src/components/SearchBar/SearchBar.stories.mdx +109 -30
  146. package/src/components/SearchBar/SearchBar.tsx +53 -32
  147. package/src/components/Select/Select.stories.mdx +48 -14
  148. package/src/components/Select/Select.tsx +16 -10
  149. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +50 -16
  150. package/src/components/SkeletonLoader/SkeletonLoader.tsx +8 -4
  151. package/src/components/Slider/Slider.stories.mdx +72 -22
  152. package/src/components/Slider/Slider.tsx +15 -10
  153. package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +60 -30
  154. package/src/components/StatusBadge/StatusBadge.stories.mdx +33 -18
  155. package/src/components/StatusBadge/StatusBadge.tsx +2 -1
  156. package/src/components/StructuredContent/StructuredContent.stories.mdx +427 -0
  157. package/src/components/StructuredContent/StructuredContent.test.tsx +376 -0
  158. package/src/components/StructuredContent/StructuredContent.tsx +153 -0
  159. package/src/components/StructuredContent/StructuredContentTypes.tsx +5 -0
  160. package/src/components/StructuredContent/__snapshots__/StructuredContent.test.tsx.snap +283 -0
  161. package/src/components/StyleGuide/Bidirectionality.stories.mdx +32 -83
  162. package/src/components/StyleGuide/Breakpoints.stories.mdx +1 -11
  163. package/src/components/StyleGuide/Buttons.stories.mdx +3 -18
  164. package/src/components/StyleGuide/ColorCard.tsx +1 -2
  165. package/src/components/StyleGuide/Colors.stories.mdx +3 -11
  166. package/src/components/StyleGuide/DesignTokens.stories.mdx +3 -8
  167. package/src/components/StyleGuide/Forms.stories.mdx +2 -10
  168. package/src/components/StyleGuide/Iconography.stories.mdx +8 -34
  169. package/src/components/StyleGuide/Spacing.stories.mdx +3 -14
  170. package/src/components/StyleGuide/Typography.stories.mdx +64 -76
  171. package/src/components/Table/Table.stories.mdx +66 -0
  172. package/src/components/Table/Table.test.tsx +60 -0
  173. package/src/components/Table/Table.tsx +116 -0
  174. package/src/components/Tabs/Tabs.stories.mdx +19 -13
  175. package/src/components/Tabs/Tabs.test.tsx +1 -1
  176. package/src/components/Template/Template.stories.mdx +56 -47
  177. package/src/components/Template/Template.test.tsx +65 -5
  178. package/src/components/Template/Template.tsx +35 -5
  179. package/src/components/Template/__snapshots__/Template.test.tsx.snap +76 -0
  180. package/src/components/Text/Text.stories.mdx +33 -11
  181. package/src/components/Text/Text.tsx +2 -2
  182. package/src/components/TextInput/TextInput.stories.mdx +84 -17
  183. package/src/components/TextInput/TextInput.test.tsx +96 -0
  184. package/src/components/TextInput/TextInput.tsx +12 -8
  185. package/src/components/TextInput/__snapshots__/TextInput.test.tsx.snap +240 -0
  186. package/src/components/Toggle/Toggle.stories.mdx +33 -9
  187. package/src/components/Toggle/Toggle.tsx +14 -9
  188. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +64 -14
  189. package/src/components/VideoPlayer/VideoPlayer.tsx +17 -7
  190. package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +12 -6
  191. package/src/docs/Chakra.stories.mdx +5 -8
  192. package/src/docs/Intro.stories.mdx +2 -2
  193. package/src/index.ts +5 -4
  194. package/src/styles/base/_03-base.scss +1 -1
  195. package/src/styles/base/_place-holder.scss +7 -7
  196. package/src/styles.scss +1 -5
  197. package/src/theme/components/breadcrumb.ts +3 -3
  198. package/src/theme/components/button.ts +5 -12
  199. package/src/theme/components/card.ts +5 -2
  200. package/src/theme/components/checkbox.ts +1 -1
  201. package/src/theme/components/customTable.ts +50 -0
  202. package/src/theme/components/datePicker.ts +1 -1
  203. package/src/theme/components/global.ts +6 -6
  204. package/src/theme/components/heading.ts +13 -11
  205. package/src/theme/components/helperErrorText.ts +1 -1
  206. package/src/theme/components/image.ts +1 -1
  207. package/src/theme/components/link.ts +17 -5
  208. package/src/theme/components/list.ts +1 -3
  209. package/src/theme/components/logo.ts +54 -0
  210. package/src/theme/components/notification.ts +1 -1
  211. package/src/theme/components/searchBar.ts +7 -13
  212. package/src/theme/components/select.ts +1 -0
  213. package/src/theme/components/statusBadge.ts +1 -1
  214. package/src/theme/components/structuredContent.ts +54 -0
  215. package/src/theme/components/template.ts +10 -10
  216. package/src/theme/components/text.ts +6 -6
  217. package/src/theme/components/textInput.ts +1 -0
  218. package/src/theme/components/toggle.ts +9 -5
  219. package/src/theme/components/videoPlayer.ts +0 -2
  220. package/src/theme/foundations/global.ts +2 -2
  221. package/src/theme/foundations/typography.ts +84 -12
  222. package/src/theme/index.ts +6 -0
  223. package/src/utils/componentCategories.ts +1 -1
  224. package/src/utils/utils.ts +17 -0
  225. package/dist/__tests__/utils/bem.test.d.ts +0 -1
  226. package/dist/components/CardEdition/CardEdition.d.ts +0 -21
  227. package/dist/components/CardEdition/CardEdition.stories.d.ts +0 -27
  228. package/dist/components/Input/Input.d.ts +0 -36
  229. package/dist/components/Input/Input.stories.d.ts +0 -29
  230. package/dist/components/Input/InputTypes.d.ts +0 -6
  231. package/dist/components/StyleGuide/UIDocCard.d.ts +0 -11
  232. package/dist/helpers/CSSVariablesHelper.d.ts +0 -3
  233. package/dist/helpers/getCSSVariable.d.ts +0 -1
  234. package/dist/interfaces.d.ts +0 -3
  235. package/dist/utils/bem.d.ts +0 -1
  236. package/src/__tests__/utils/bem.test.ts +0 -37
  237. package/src/components/CardEdition/CardEdition.stories.tsx +0 -122
  238. package/src/components/CardEdition/CardEdition.test.tsx +0 -395
  239. package/src/components/CardEdition/CardEdition.tsx +0 -60
  240. package/src/components/CardEdition/_CardEdition.scss +0 -137
  241. package/src/components/Input/Input.stories.tsx +0 -133
  242. package/src/components/Input/Input.test.tsx +0 -266
  243. package/src/components/Input/Input.tsx +0 -81
  244. package/src/components/Input/InputTypes.tsx +0 -8
  245. package/src/components/Input/_Input.scss +0 -78
  246. package/src/components/StyleGuide/UIDocCard.tsx +0 -36
  247. package/src/helpers/CSSVariablesHelper.tsx +0 -34
  248. package/src/helpers/getCSSVariable.tsx +0 -5
  249. package/src/interfaces.ts +0 -3
  250. package/src/utils/bem.ts +0 -44
@@ -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
+ `;
@@ -1,10 +1,10 @@
1
1
  import {
2
- Meta,
3
- Story,
4
- Canvas,
5
2
  ArgsTable,
3
+ Canvas,
6
4
  Description,
7
- } from "@storybook/addon-docs/blocks";
5
+ Meta,
6
+ Story,
7
+ } from "@storybook/addon-docs";
8
8
  import { withDesign } from "storybook-addon-designs";
9
9
 
10
10
  import Heading from "../Heading/Heading";
@@ -15,6 +15,9 @@ import { LinkTypes } from "../Link/LinkTypes";
15
15
  import List from "./List";
16
16
  import { ListTypes } from "./ListTypes";
17
17
  import { getCategory } from "../../utils/componentCategories";
18
+ import { getStorybookEnumValues } from "../../utils/utils";
19
+
20
+ export const enumValues = getStorybookEnumValues(ListTypes, "ListTypes");
18
21
 
19
22
  <Meta
20
23
  title={getCategory("List")}
@@ -23,21 +26,22 @@ import { getCategory } from "../../utils/componentCategories";
23
26
  parameters={{
24
27
  design: {
25
28
  type: "figma",
26
- url:
27
- "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Master?node-id=16115%3A304",
29
+ url: "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Master?node-id=16115%3A304",
28
30
  },
29
31
  jest: ["List.test.tsx"],
30
32
  }}
31
33
  argTypes={{
34
+ additionalStyles: { control: false },
32
35
  children: { table: { disable: true } },
33
- className: { table: { disable: true } },
34
- id: { table: { disable: true } },
35
- listItems: { table: { disable: true } },
36
+ className: { control: false },
37
+ id: { control: false },
38
+ inline: { table: { defaultValue: { summary: false } } },
39
+ listItems: { control: false },
40
+ noStyling: { table: { defaultValue: { summary: false } } },
36
41
  type: {
37
- control: {
38
- type: "radio",
39
- },
40
- options: Object.keys(ListTypes),
42
+ control: { type: "select" },
43
+ options: enumValues.options,
44
+ table: { defaultValue: { summary: "ListTypes.Unordered" } },
41
45
  },
42
46
  }}
43
47
  />
@@ -118,17 +122,21 @@ export const definitions = [
118
122
 
119
123
  <Canvas withToolbar>
120
124
  <Story
121
- name="List"
125
+ name="List with Controls"
122
126
  args={{
127
+ additionalStyles: undefined,
128
+ className: undefined,
123
129
  id: "nypl-list",
130
+ inline: false,
131
+ listItems: undefined,
124
132
  noStyling: false,
125
133
  title: "Middle-Earth Peoples",
126
- type: ListTypes.Unordered,
134
+ type: "ListTypes.Unordered",
127
135
  }}
128
136
  >
129
137
  {(args) => (
130
- <List {...args} type={ListTypes[args.type]}>
131
- {ListTypes[args.type] !== ListTypes.Definition
138
+ <List {...args} type={enumValues.getValue(args.type)}>
139
+ {args.type !== "ListTypes.Definition"
132
140
  ? itemGroups.map((item, i) => <li key={i}>{item}</li>)
133
141
  : definitions.map((item, i) => [
134
142
  <dt key={`dt_${i}`}>{item.term}</dt>,
@@ -139,7 +147,7 @@ export const definitions = [
139
147
  </Story>
140
148
  </Canvas>
141
149
 
142
- <ArgsTable story="List" />
150
+ <ArgsTable story="List with Controls" />
143
151
 
144
152
  ## Definition List
145
153
 
@@ -163,13 +171,14 @@ This type of list renders `dt` and `dd` elements.
163
171
  title: "Middle-Earth Peoples",
164
172
  }}
165
173
  argTypes={{
166
- type: { table: { disable: true } },
174
+ inline: { control: false },
175
+ noStyling: { control: false },
176
+ type: { control: false },
167
177
  }}
168
178
  parameters={{
169
179
  design: {
170
180
  type: "figma",
171
- url:
172
- "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=10734%3A5178",
181
+ url: "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=10734%3A5178",
173
182
  },
174
183
  }}
175
184
  >
@@ -196,13 +205,14 @@ An example with HTML elements inside of the `dd` elements.
196
205
  title: "Details",
197
206
  }}
198
207
  argTypes={{
208
+ inline: { control: false },
209
+ noStyling: { control: false },
199
210
  type: { table: { disable: true } },
200
211
  }}
201
212
  parameters={{
202
213
  design: {
203
214
  type: "figma",
204
- url:
205
- "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=10734%3A5178",
215
+ url: "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=10734%3A5178",
206
216
  },
207
217
  }}
208
218
  >
@@ -330,7 +340,9 @@ const fishDefinitions = [
330
340
  title: "Animal Crossing Fish",
331
341
  }}
332
342
  argTypes={{
333
- type: { table: { disable: true } },
343
+ inline: { control: false },
344
+ noStyling: { control: false },
345
+ type: { control: false },
334
346
  }}
335
347
  >
336
348
  {(args) => <List {...args} type={ListTypes.Definition} />}
@@ -0,0 +1,220 @@
1
+ import {
2
+ ArgsTable,
3
+ Canvas,
4
+ Description,
5
+ Meta,
6
+ Story,
7
+ } from "@storybook/addon-docs";
8
+ import { withDesign } from "storybook-addon-designs";
9
+
10
+ import Logo from "./Logo";
11
+ import { LogoNames, LogoSizes } from "./LogoTypes";
12
+ import logoSvgs from "./LogoSvgs";
13
+ import Heading from "../Heading/Heading";
14
+ import { HeadingLevels } from "../Heading/HeadingTypes";
15
+ import List from "../List/List";
16
+ import { ListTypes } from "../List/ListTypes";
17
+ import SimpleGrid from "../Grid/SimpleGrid";
18
+ import { getCategory } from "../../utils/componentCategories";
19
+ import { getStorybookEnumValues } from "../../utils/utils";
20
+
21
+ export const namesEnumValues = getStorybookEnumValues(LogoNames, "LogoNames");
22
+ export const sizesEnumValues = getStorybookEnumValues(LogoSizes, "LogoSizes");
23
+
24
+ <Meta
25
+ title={getCategory("Logo")}
26
+ component={Logo}
27
+ decorators={[withDesign]}
28
+ parameters={{
29
+ design: {
30
+ type: "figma",
31
+ url: "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=10734%3A3945",
32
+ },
33
+ jest: ["Logo.test.tsx"],
34
+ }}
35
+ argTypes={{
36
+ children: { table: { disable: true } },
37
+ className: { control: false },
38
+ id: { control: false },
39
+ name: {
40
+ control: { type: "select" },
41
+ options: namesEnumValues.options,
42
+ },
43
+ size: {
44
+ control: { type: "select" },
45
+ table: { defaultValue: { summary: "LogoSizes.Medium" } },
46
+ options: sizesEnumValues.options,
47
+ },
48
+ title: {
49
+ control: false,
50
+ table: { defaultValue: { summary: "`${name} logo`" } },
51
+ },
52
+ }}
53
+ />
54
+
55
+ # Logo
56
+
57
+ | Component Version | DS Version |
58
+ | ----------------- | ---------- |
59
+ | Added | `0.25.9` |
60
+ | Latest | `0.25.9` |
61
+
62
+ <Description of={Logo} />
63
+
64
+ <Canvas withToolbar>
65
+ <Story
66
+ name="Logo with Controls"
67
+ args={{
68
+ additionalStyles: undefined,
69
+ className: undefined,
70
+ decorative: true,
71
+ id: "logo-id",
72
+ name: "LogoNames.NYPLBlack",
73
+ size: "LogoSizes.Large",
74
+ title: undefined,
75
+ }}
76
+ >
77
+ {(args) => (
78
+ <div
79
+ style={
80
+ args.name.indexOf("White") !== -1
81
+ ? {
82
+ backgroundColor: "var(--nypl-colors-ui-gray-xdark)",
83
+ display: "inline-block",
84
+ padding: "var(--nypl-space-l)",
85
+ }
86
+ : undefined
87
+ }
88
+ >
89
+ <Logo
90
+ name={namesEnumValues.getValue(args.name)}
91
+ size={sizesEnumValues.getValue(args.size)}
92
+ title={args.title}
93
+ />
94
+ </div>
95
+ )}
96
+ </Story>
97
+ </Canvas>
98
+
99
+ <ArgsTable story="Logo with Controls" />
100
+
101
+ export const logoRow = (logo, opts = {}) => {
102
+ // We'll use this setup function to render all the logos in a list item.
103
+ // Some logos display better with a dark background.
104
+ const styles = { textAlign: "center" };
105
+ const { size = LogoSizes.Large, displayValue } = opts;
106
+ let key = logo;
107
+ if (logo.indexOf("White") !== -1) {
108
+ styles.backgroundColor = "var(--nypl-colors-ui-gray-xdark)";
109
+ styles.paddingBottom = "32px";
110
+ styles.paddingTop = "32px";
111
+ styles.color = "var(--nypl-colors-ui-white)";
112
+ }
113
+ if (size !== LogoSizes.Large) {
114
+ key += `-${size}`;
115
+ }
116
+ return (
117
+ <div style={styles} key={key}>
118
+ <Heading level={HeadingLevels.Four}>{displayValue}</Heading>
119
+ <Logo name={LogoNames[logo]} size={size} />
120
+ </div>
121
+ );
122
+ };
123
+ export const logos = [];
124
+ export const sizes = [];
125
+ for (const logo in LogoNames) {
126
+ logos.push(logoRow(logo, { displayValue: `LogoNames.${logo}` }));
127
+ }
128
+ for (const logoSize in LogoSizes) {
129
+ sizes.push(
130
+ logoRow("NYPLBlack", {
131
+ displayValue: `LogoSizes.${logoSize}`,
132
+ size: LogoSizes[logoSize],
133
+ })
134
+ );
135
+ }
136
+
137
+ export const allLogosGrid = (list) => (
138
+ <SimpleGrid columns={1}>{list}</SimpleGrid>
139
+ );
140
+
141
+ ## Accessibility
142
+
143
+ For accessibility purposes, every DS `Logo` will render the `svg` element with
144
+ its `svg` file name in the `title` element. The default text in the `title` element
145
+ is the logo's code name. Pass in better descriptive text in the `title` prop
146
+ when using the `Logo` component in your application. This will give screenreaders
147
+ a better descriptive title for the `svg` graphic.
148
+
149
+ ## All Logos
150
+
151
+ The `Logo` component contains the logos most commonly used by are listed available
152
+ logos are listed in the `LogoNames` enum in `src/components/Logos/LogoTypes.tsx`.
153
+
154
+ If you feel a necessary logo should be added to the `Logo` component, please reach out
155
+ to the DS team.
156
+
157
+ <Canvas withToolbar>
158
+ <Story name="All Logos">{allLogosGrid(logos)}</Story>
159
+ </Canvas>
160
+
161
+ ## Logo Sizes
162
+
163
+ Update the size of the `Logo` component by passing the `size` prop with a value from
164
+ `LogoSizes`. The `LogoSizes` enum can be found in`src/components/Logo/LogoTypes.tsx`.
165
+
166
+ Note: `LogoSizes.Default` sets the width to `100%` and the logo will expand to
167
+ fill the full width of the parent element.
168
+
169
+ ```jsx
170
+ // Example
171
+ <Logo name={LogoNames.NYPLBlack} size={LogoSizes.Large} />
172
+ ```
173
+
174
+ <Canvas>
175
+ <Story name="Logo Sizes">{allLogosGrid(sizes)}</Story>
176
+ </Canvas>
177
+
178
+ ## Custom Logos
179
+
180
+ If you'd like to pass a custom `svg` to your application, you can pass it a
181
+ child to the `Logo` component.
182
+
183
+ ```jsx
184
+ <Logo {...props}>
185
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192.756 192.756">
186
+ <g fill-rule="evenodd" clip-rule="evenodd">
187
+ <path fill="#fff" d="M0 0h192.756v192.756H0V0z" />
188
+ <path
189
+ d="M59.73 117.578c-9.859-4.912-23.261-15.887-23.413-27.06C36.149 78.129 44.451 75.087 50 75.087c5.701 0 8.286 3.345 10.637 5.777 2.352-2.433 4.936-5.777 10.637-5.777 5.549 0 13.851 3.042 13.682 15.431-.151 11.173-13.553 22.148-23.412 27.06-.35.174-.629.262-.907.262s-.557-.088-.907-.262z"
190
+ fill="#c23c40"
191
+ />
192
+ <path d="M184.252 78.225c-.027 1.111-.355 1.921-.799 2.399-.871.945-3.1 1.067-4.283.854-.668-.12-1.309-.167-1.66-.137-1.551.136-2.398 1.115-3.242 2.45l-10.377 16.423-.154 6.727c-.033 1.535.287 2.881 2.066 2.799l2.865-.135c1.725-.08 3.35 1.029 3.4 2.867.064 2.359-1.807 3.393-3.943 3.275-1.338-.072-2.559-.275-3.666-.477-2.355-.428-3.977-.279-6.332 0-2.189.262-3.879.43-5.055.4-1.895-.045-3.725-.988-3.91-2.957-.178-1.898 1.297-3.191 3.186-3.041l2.5.199c.963.076 2.232-.406 2.256-1.533l.152-7.555-10.803-17.373c-.588-.948-1.52-1.538-2.42-1.877-1.156-.435-2.35-.464-3.568-.309-.988.125-1.16.01-1.414-.001-2.166-.093-3.1-1.048-2.988-3.064.139-2.505 1.543-2.885 3.936-2.885.412 0 1.391.005 3.344.285 1.43.206 2.609.099 3.531.067 2.436-.083 4.973-.545 7.377-.479 1.334.037 2.285.338 2.943.667.92.459 1.506 1.161 1.473 2.348-.031 1.144-.484 2.161-1.139 2.645-.496.367-1.848.417-2.902.417-1.92-.046-1.844 1.094-1.24 1.651l7.008 11.204 7.336-11.487c.148-.59.916-1.602-1.146-1.365-.637.073-.715.087-1.48.064-1.1-.033-1.854-.247-2.266-.544-1.348-.974-1.18-1.916-.943-3.322.17-1.019.986-1.48 1.877-1.744.928-.275 1.896-.259 2.871-.267 1.105-.009 2.221.111 3.295.272 1.99.297 3.414.306 5.398.066 1.379-.167 3.006-.5 4.559-.488 1.062.008 2.092.056 2.984.551.867.484 1.4 1.278 1.373 2.41zM31.561 112.531c-.116 2.684-2.242 2.799-4.345 2.799-2.14 0-4.302-.387-6.455-.387-2.396 0-4.788.17-7.178.396-2.739.262-4.681-.342-4.576-2.869.07-1.703 1.047-2.818 3.117-2.814l2.783.004c1.497.002 2.085-1.572 2.082-2.721l-.098-23.305c-.004-1.258-.422-2.46-1.917-2.431l-3.169.064c-2.091.042-3.322-1.33-3.301-3.214.026-2.372 1.934-2.958 3.873-2.897.678.021 2.127.043 3.023.136 1.53.157 3.13.141 4.67.141 2.369 0 4.682-.372 7.012-.372 2.197 0 4.145.564 4.274 3.233.078 1.624-1.636 2.807-3.479 2.776l-2.155-.035c-1.634-.027-2.604 1.158-2.587 2.501l.294 23.462c.028 2.24 1.216 2.869 3.008 2.85l2.109-.025c1.58-.02 3.098.777 3.015 2.708zM135.311 78.065c-.084 2.73-1.73 3.344-4.244 3.344 0-.041-4.09-.461-4.09 1.686v26.908c0 3.244-1.57 6.314-5.01 6.314-2.217 0-4.641-1.143-5.557-3.271l-12.846-29.84-.061 23.363c-.004 1.895.496 2.963 2.393 2.908l2.344-.066c2.098-.061 3.543 1.082 3.482 3.266-.066 2.418-1.879 2.932-3.93 2.932-2.467 0-4.818-.783-7.248-.666-2.58.123-5.081.484-7.668.484-2.227 0-3.915-.693-3.915-3.283 0-2.166 1.352-2.596 3.254-2.637l2.58-.055c1.54-.031 2.489-.662 2.489-1.975V82.78c0-1.262-.493-1.895-2.204-1.835l-2.213.079c-2.608.092-3.612-.421-3.543-3.023.061-2.28 1.595-3.273 4.478-3.052 1.569.12 3.148.301 4.722.301 1.721 0 3.434-.042 5.148-.042 2.891 0 4.029 1.753 5.182 4.37l11.777 26.751V83.664c0-1.012-.412-1.794-.732-2.11-.322-.316-.822-.481-1.475-.478l-2.693.019c-1.971.012-3.658-.844-3.623-2.685.055-3.006 2.82-3.496 5.285-3.399 2.385.094 4.965.742 7.32.667 2.227-.071 4.461-.646 6.697-.533 2.885.147 3.951 1.244 3.901 2.92zM179.455 107.746c1.111 0 2.096.396 2.951 1.186.896.832 1.346 1.836 1.346 3.012 0 1.426-.506 2.523-1.518 3.297a4.258 4.258 0 0 1-2.643.902h-.211c-1.004 0-1.926-.42-2.766-1.26-.838-.84-1.258-1.791-1.258-2.852v-.174c0-1.16.398-2.135 1.197-2.926.801-.788 1.767-1.185 2.902-1.185zm.408 3.951c.346 0 .615-.082.809-.246.193-.166.291-.363.291-.594a.77.77 0 0 0-.266-.58c-.178-.164-.422-.246-.736-.246h-1.543v1.666h1.445zm-.308-3.345c-.814 0-1.576.279-2.283.84-.891.699-1.334 1.646-1.334 2.84 0 .914.359 1.742 1.08 2.486.721.746 1.533 1.117 2.438 1.117h.148c.906 0 1.723-.367 2.451-1.104s1.092-1.6 1.092-2.588c0-.971-.359-1.812-1.08-2.523-.719-.713-1.557-1.068-2.512-1.068zm-1.741 1.171h2.221c.504 0 .902.141 1.199.42.264.256.395.561.395.914 0 .338-.125.633-.377.883-.25.252-.6.377-1.043.377l-.174-.012 1.408 2.172h-.703l-1.359-2.074h-.963v2.074h-.604v-4.754z" />
193
+ </g>
194
+ </svg>
195
+ </Logo>
196
+ ```
197
+
198
+ <Canvas>
199
+ <Story
200
+ name="Custom Logos"
201
+ args={{
202
+ size: LogoSizes.Large,
203
+ }}
204
+ >
205
+ {(args) => (
206
+ <Logo {...args}>
207
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192.756 192.756">
208
+ <g fill-rule="evenodd" clip-rule="evenodd">
209
+ <path fill="#fff" d="M0 0h192.756v192.756H0V0z" />
210
+ <path
211
+ d="M59.73 117.578c-9.859-4.912-23.261-15.887-23.413-27.06C36.149 78.129 44.451 75.087 50 75.087c5.701 0 8.286 3.345 10.637 5.777 2.352-2.433 4.936-5.777 10.637-5.777 5.549 0 13.851 3.042 13.682 15.431-.151 11.173-13.553 22.148-23.412 27.06-.35.174-.629.262-.907.262s-.557-.088-.907-.262z"
212
+ fill="#c23c40"
213
+ />
214
+ <path d="M184.252 78.225c-.027 1.111-.355 1.921-.799 2.399-.871.945-3.1 1.067-4.283.854-.668-.12-1.309-.167-1.66-.137-1.551.136-2.398 1.115-3.242 2.45l-10.377 16.423-.154 6.727c-.033 1.535.287 2.881 2.066 2.799l2.865-.135c1.725-.08 3.35 1.029 3.4 2.867.064 2.359-1.807 3.393-3.943 3.275-1.338-.072-2.559-.275-3.666-.477-2.355-.428-3.977-.279-6.332 0-2.189.262-3.879.43-5.055.4-1.895-.045-3.725-.988-3.91-2.957-.178-1.898 1.297-3.191 3.186-3.041l2.5.199c.963.076 2.232-.406 2.256-1.533l.152-7.555-10.803-17.373c-.588-.948-1.52-1.538-2.42-1.877-1.156-.435-2.35-.464-3.568-.309-.988.125-1.16.01-1.414-.001-2.166-.093-3.1-1.048-2.988-3.064.139-2.505 1.543-2.885 3.936-2.885.412 0 1.391.005 3.344.285 1.43.206 2.609.099 3.531.067 2.436-.083 4.973-.545 7.377-.479 1.334.037 2.285.338 2.943.667.92.459 1.506 1.161 1.473 2.348-.031 1.144-.484 2.161-1.139 2.645-.496.367-1.848.417-2.902.417-1.92-.046-1.844 1.094-1.24 1.651l7.008 11.204 7.336-11.487c.148-.59.916-1.602-1.146-1.365-.637.073-.715.087-1.48.064-1.1-.033-1.854-.247-2.266-.544-1.348-.974-1.18-1.916-.943-3.322.17-1.019.986-1.48 1.877-1.744.928-.275 1.896-.259 2.871-.267 1.105-.009 2.221.111 3.295.272 1.99.297 3.414.306 5.398.066 1.379-.167 3.006-.5 4.559-.488 1.062.008 2.092.056 2.984.551.867.484 1.4 1.278 1.373 2.41zM31.561 112.531c-.116 2.684-2.242 2.799-4.345 2.799-2.14 0-4.302-.387-6.455-.387-2.396 0-4.788.17-7.178.396-2.739.262-4.681-.342-4.576-2.869.07-1.703 1.047-2.818 3.117-2.814l2.783.004c1.497.002 2.085-1.572 2.082-2.721l-.098-23.305c-.004-1.258-.422-2.46-1.917-2.431l-3.169.064c-2.091.042-3.322-1.33-3.301-3.214.026-2.372 1.934-2.958 3.873-2.897.678.021 2.127.043 3.023.136 1.53.157 3.13.141 4.67.141 2.369 0 4.682-.372 7.012-.372 2.197 0 4.145.564 4.274 3.233.078 1.624-1.636 2.807-3.479 2.776l-2.155-.035c-1.634-.027-2.604 1.158-2.587 2.501l.294 23.462c.028 2.24 1.216 2.869 3.008 2.85l2.109-.025c1.58-.02 3.098.777 3.015 2.708zM135.311 78.065c-.084 2.73-1.73 3.344-4.244 3.344 0-.041-4.09-.461-4.09 1.686v26.908c0 3.244-1.57 6.314-5.01 6.314-2.217 0-4.641-1.143-5.557-3.271l-12.846-29.84-.061 23.363c-.004 1.895.496 2.963 2.393 2.908l2.344-.066c2.098-.061 3.543 1.082 3.482 3.266-.066 2.418-1.879 2.932-3.93 2.932-2.467 0-4.818-.783-7.248-.666-2.58.123-5.081.484-7.668.484-2.227 0-3.915-.693-3.915-3.283 0-2.166 1.352-2.596 3.254-2.637l2.58-.055c1.54-.031 2.489-.662 2.489-1.975V82.78c0-1.262-.493-1.895-2.204-1.835l-2.213.079c-2.608.092-3.612-.421-3.543-3.023.061-2.28 1.595-3.273 4.478-3.052 1.569.12 3.148.301 4.722.301 1.721 0 3.434-.042 5.148-.042 2.891 0 4.029 1.753 5.182 4.37l11.777 26.751V83.664c0-1.012-.412-1.794-.732-2.11-.322-.316-.822-.481-1.475-.478l-2.693.019c-1.971.012-3.658-.844-3.623-2.685.055-3.006 2.82-3.496 5.285-3.399 2.385.094 4.965.742 7.32.667 2.227-.071 4.461-.646 6.697-.533 2.885.147 3.951 1.244 3.901 2.92zM179.455 107.746c1.111 0 2.096.396 2.951 1.186.896.832 1.346 1.836 1.346 3.012 0 1.426-.506 2.523-1.518 3.297a4.258 4.258 0 0 1-2.643.902h-.211c-1.004 0-1.926-.42-2.766-1.26-.838-.84-1.258-1.791-1.258-2.852v-.174c0-1.16.398-2.135 1.197-2.926.801-.788 1.767-1.185 2.902-1.185zm.408 3.951c.346 0 .615-.082.809-.246.193-.166.291-.363.291-.594a.77.77 0 0 0-.266-.58c-.178-.164-.422-.246-.736-.246h-1.543v1.666h1.445zm-.308-3.345c-.814 0-1.576.279-2.283.84-.891.699-1.334 1.646-1.334 2.84 0 .914.359 1.742 1.08 2.486.721.746 1.533 1.117 2.438 1.117h.148c.906 0 1.723-.367 2.451-1.104s1.092-1.6 1.092-2.588c0-.971-.359-1.812-1.08-2.523-.719-.713-1.557-1.068-2.512-1.068zm-1.741 1.171h2.221c.504 0 .902.141 1.199.42.264.256.395.561.395.914 0 .338-.125.633-.377.883-.25.252-.6.377-1.043.377l-.174-.012 1.408 2.172h-.703l-1.359-2.074h-.963v2.074h-.604v-4.754z" />
215
+ </g>
216
+ </svg>
217
+ </Logo>
218
+ )}
219
+ </Story>
220
+ </Canvas>
@@ -0,0 +1,98 @@
1
+ import * as React from "react";
2
+ import { render } from "@testing-library/react";
3
+ import { axe } from "jest-axe";
4
+ import renderer from "react-test-renderer";
5
+
6
+ import Logo from "./Logo";
7
+ import { LogoNames, LogoSizes } from "./LogoTypes";
8
+
9
+ describe("Logo Accessibility", () => {
10
+ it("passes axe accessibility test", async () => {
11
+ const { container } = render(<Logo name={LogoNames.NYPLBlack} />);
12
+ expect(await axe(container)).toHaveNoViolations();
13
+ });
14
+ });
15
+
16
+ describe("Logo", () => {
17
+ it("consoles a warning if both name and children are passed to Logo", () => {
18
+ const warn = jest.spyOn(console, "warn");
19
+ render(
20
+ <Logo name={LogoNames.NYPLBlack}>
21
+ <svg viewBox="0 0 24 14" xmlns="http://www.w3.org/2000/svg">
22
+ <path
23
+ fillRule="evenodd"
24
+ clipRule="evenodd"
25
+ d="M10.526 12.871L.263 1.676 1.737.324 12 11.52 22.263.324l1.474 1.352L13.474 12.87a2 2 0 01-2.948 0z"
26
+ />
27
+ </svg>
28
+ </Logo>
29
+ );
30
+ expect(warn).toHaveBeenCalledWith(
31
+ "Logo accepts either a `name` prop or an `svg` element child. It can not accept both."
32
+ );
33
+ });
34
+
35
+ it("consoles a warning if both name and children are not passed", () => {
36
+ const warn = jest.spyOn(console, "warn");
37
+ render(<Logo />);
38
+ expect(warn).toHaveBeenCalledWith(
39
+ "Pass a logo `name` prop or an SVG child to `Logo` to ensure a logo appears."
40
+ );
41
+ });
42
+
43
+ it("renders a logo based on the logo `name` prop", () => {
44
+ const { container } = render(<Logo name={LogoNames.NYPLBlack} />);
45
+ expect(container.querySelector("svg")).toBeInTheDocument();
46
+ });
47
+
48
+ // NOTE: the svg logo is dynamically generated by the "svgr" package. At build
49
+ // time, it generate the `title` element but it doesn't generate it for tests.
50
+ // In order to test this, we can check the `title` attribute in the svg
51
+ // element itself. Inspect the `Logo` in Storybook to see the `title` element.
52
+ it("renders a title element", () => {
53
+ const { container, rerender } = render(<Logo name={LogoNames.NYPLBlack} />);
54
+ expect(container.querySelector("svg")).toHaveAttribute(
55
+ "title",
56
+ "logo_nypl_full_black logo"
57
+ );
58
+
59
+ rerender(<Logo name={LogoNames.NYPLBlack} title="title content" />);
60
+ expect(container.querySelector("svg")).toHaveAttribute(
61
+ "title",
62
+ "title content"
63
+ );
64
+ });
65
+
66
+ it("renders a logo based on the child", () => {
67
+ const { container } = render(
68
+ <Logo>
69
+ <svg viewBox="0 0 24 14" xmlns="http://www.w3.org/2000/svg">
70
+ <path
71
+ fillRule="evenodd"
72
+ clipRule="evenodd"
73
+ d="M10.526 12.871L.263 1.676 1.737.324 12 11.52 22.263.324l1.474 1.352L13.474 12.87a2 2 0 01-2.948 0z"
74
+ />
75
+ </svg>
76
+ </Logo>
77
+ );
78
+ expect(container.querySelector("svg")).toBeInTheDocument();
79
+ });
80
+
81
+ it("renders the UI snapshot correctly", () => {
82
+ const standard = renderer
83
+ .create(<Logo id="test-logo" name={LogoNames.NYPLBlack} />)
84
+ .toJSON();
85
+ const withCustomSize = renderer
86
+ .create(
87
+ <Logo
88
+ id="test-logo-size"
89
+ name={LogoNames.NYPLBlack}
90
+ size={LogoSizes.Large}
91
+ />
92
+ )
93
+ .toJSON();
94
+
95
+ expect(standard).toMatchSnapshot();
96
+ expect(withCustomSize).toMatchSnapshot();
97
+ });
98
+ });