@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
@@ -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
+ });
@@ -0,0 +1,97 @@
1
+ import * as React from "react";
2
+ import { Icon as ChakraIcon, Box, useStyleConfig } from "@chakra-ui/react";
3
+
4
+ import generateUUID from "../../helpers/generateUUID";
5
+ import { LogoNames, LogoSizes } from "./LogoTypes";
6
+ import logoSvgs from "./LogoSvgs";
7
+
8
+ export interface LogoProps {
9
+ /** Optionally pass in additional Chakra-based styles. */
10
+ additionalStyles?: { [key: string]: any };
11
+ /** Optional className that will be added to the parent element */
12
+ className?: string;
13
+ /** Logos designated as decorative will be ignored by screenreaders. False
14
+ * by default. */
15
+ decorative?: boolean;
16
+ /** ID that other components can cross reference for accessibility purposes */
17
+ id?: string;
18
+ /** The name of the logo you want to use. */
19
+ name?: LogoNames;
20
+ /** Sets the logo size. */
21
+ size?: LogoSizes;
22
+ /** For accessibility purposes, the text passed in the `title` prop gets
23
+ * rendered in a `title` element in the SVG. This descriptive text is not
24
+ * visible but is needed for screenreaders to describe the graphic. */
25
+ title?: string;
26
+ }
27
+
28
+ /**
29
+ * The `Logo` component renders SVG-based logos and color variants that are
30
+ * commonly used by the New York Public Library.
31
+ */
32
+ export default function Logo(props: React.PropsWithChildren<LogoProps>) {
33
+ const {
34
+ additionalStyles = {},
35
+ children,
36
+ className,
37
+ decorative = false,
38
+ id = generateUUID(),
39
+ name,
40
+ size = LogoSizes.Medium,
41
+ title = `${name} logo`,
42
+ } = props;
43
+ const styles = useStyleConfig("Logo", {
44
+ size,
45
+ });
46
+ const logoProps = {
47
+ "aria-hidden": decorative,
48
+ className,
49
+ id,
50
+ role: "img",
51
+ title,
52
+ };
53
+ let childSVG = null;
54
+
55
+ // Component prop validation
56
+ if (name && children) {
57
+ console.warn(
58
+ "Logo accepts either a `name` prop or an `svg` element child. It can not accept both."
59
+ );
60
+ return null;
61
+ } else if (!name && !children) {
62
+ console.warn(
63
+ "Pass a logo `name` prop or an SVG child to `Logo` to ensure a logo appears."
64
+ );
65
+ return null;
66
+ }
67
+
68
+ // The user wants to render an existing logo. Load the logo and render it
69
+ // as a component through Chakra's Icon component. Otherwise, we're going to
70
+ // render the SVG child with NYPL-theme styling.
71
+ if (name) {
72
+ const SvgComponent: any = logoSvgs[name];
73
+ return (
74
+ <ChakraIcon
75
+ as={SvgComponent}
76
+ {...logoProps}
77
+ __css={{ ...styles, ...additionalStyles }}
78
+ />
79
+ );
80
+ }
81
+
82
+ // If no `name` prop was passed, we expect a child SVG element to be passed.
83
+ // Apply logo props to the SVG child.
84
+ if (
85
+ (children as JSX.Element).type === "svg" ||
86
+ (children as JSX.Element).props.type === "svg" ||
87
+ (children as JSX.Element).props.mdxType === "svg"
88
+ ) {
89
+ childSVG = React.cloneElement(children as JSX.Element, {
90
+ ...logoProps,
91
+ });
92
+ } else {
93
+ console.warn("You must pass an `svg` element to the `Logo` component.");
94
+ }
95
+
96
+ return <Box __css={styles}>{childSVG}</Box>;
97
+ }
@@ -0,0 +1,34 @@
1
+ /* eslint-disable camelcase */
2
+ import logo_bpl_black from "../../../icons/svg/logo_bpl_black.svg";
3
+ import logo_lpa_color from "../../../icons/svg/logo_lpa_color.svg";
4
+ import logo_lpa_white from "../../../icons/svg/logo_lpa_white.svg";
5
+ import logo_nypl_full_black from "../../../icons/svg/logo_nypl_full_black.svg";
6
+ import logo_nypl_full_white from "../../../icons/svg/logo_nypl_full_white.svg";
7
+ import logo_nypl_lion_black from "../../../icons/svg/logo_nypl_lion_black.svg";
8
+ import logo_nypl_lion_white from "../../../icons/svg/logo_nypl_lion_white.svg";
9
+ import logo_qpl_alt_black from "../../../icons/svg/logo_qpl_alt_black.svg";
10
+ import logo_qpl_color from "../../../icons/svg/logo_qpl_color.svg";
11
+ import logo_schomburg_circle_color from "../../../icons/svg/logo_schomburg_circle_color.svg";
12
+ import logo_schomburg_color from "../../../icons/svg/logo_schomburg_color.svg";
13
+ import logo_simplye_black from "../../../icons/svg/logo_simplye_black.svg";
14
+ import logo_simplye_color from "../../../icons/svg/logo_simplye_color.svg";
15
+ import logo_snfl_black from "../../../icons/svg/logo_snfl_black.svg";
16
+ import logo_snfl_white from "../../../icons/svg/logo_snfl_white.svg";
17
+
18
+ export default {
19
+ logo_bpl_black,
20
+ logo_lpa_color,
21
+ logo_lpa_white,
22
+ logo_nypl_full_black,
23
+ logo_nypl_full_white,
24
+ logo_nypl_lion_white,
25
+ logo_nypl_lion_black,
26
+ logo_qpl_alt_black,
27
+ logo_qpl_color,
28
+ logo_schomburg_circle_color,
29
+ logo_schomburg_color,
30
+ logo_simplye_black,
31
+ logo_simplye_color,
32
+ logo_snfl_black,
33
+ logo_snfl_white,
34
+ };
@@ -0,0 +1,32 @@
1
+ export enum LogoColors {
2
+ Default = "",
3
+ UiBlack = "ui.black",
4
+ UiWhite = "ui.white",
5
+ }
6
+
7
+ export enum LogoSizes {
8
+ ExtraExtraSmall = "xxsmall",
9
+ ExtraSmall = "xsmall",
10
+ Small = "small",
11
+ Medium = "medium",
12
+ Large = "large",
13
+ Default = "default",
14
+ }
15
+
16
+ export enum LogoNames {
17
+ BrooklynPublicLibraryBlack = "logo_bpl_black",
18
+ LPAColor = "logo_lpa_color",
19
+ LPAWhite = "logo_lpa_white",
20
+ NYPLBlack = "logo_nypl_full_black",
21
+ NYPLWhite = "logo_nypl_full_white",
22
+ NYPLLionBlack = "logo_nypl_lion_black",
23
+ NYPLLionWhite = "logo_nypl_lion_white",
24
+ QueensPublicLibraryColor = "logo_qpl_color",
25
+ QueensPublicLibraryAltBlack = "logo_qpl_alt_black",
26
+ SchomburgColor = "logo_schomburg_color",
27
+ SchomburgCircleColor = "logo_schomburg_circle_color",
28
+ SimplyEColor = "logo_simplye_color",
29
+ SimplyEBlack = "logo_simplye_black",
30
+ SNFLBlack = "logo_snfl_black",
31
+ SNFLWhite = "logo_snfl_white",
32
+ }
@@ -0,0 +1,71 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Logo renders the UI snapshot correctly 1`] = `
4
+ <svg
5
+ aria-hidden={false}
6
+ className="chakra-icon css-onkibi"
7
+ focusable={false}
8
+ id="test-logo"
9
+ role="img"
10
+ title="logo_nypl_full_black logo"
11
+ viewBox="0 0 24 24"
12
+ >
13
+ <g
14
+ stroke="currentColor"
15
+ strokeWidth="1.5"
16
+ >
17
+ <path
18
+ d="M9,9a3,3,0,1,1,4,2.829,1.5,1.5,0,0,0-1,1.415V14.25"
19
+ fill="none"
20
+ strokeLinecap="round"
21
+ />
22
+ <path
23
+ d="M12,17.25a.375.375,0,1,0,.375.375A.375.375,0,0,0,12,17.25h0"
24
+ fill="currentColor"
25
+ strokeLinecap="round"
26
+ />
27
+ <circle
28
+ cx="12"
29
+ cy="12"
30
+ fill="none"
31
+ r="11.25"
32
+ strokeMiterlimit="10"
33
+ />
34
+ </g>
35
+ </svg>
36
+ `;
37
+
38
+ exports[`Logo renders the UI snapshot correctly 2`] = `
39
+ <svg
40
+ aria-hidden={false}
41
+ className="chakra-icon css-onkibi"
42
+ focusable={false}
43
+ id="test-logo-size"
44
+ role="img"
45
+ title="logo_nypl_full_black logo"
46
+ viewBox="0 0 24 24"
47
+ >
48
+ <g
49
+ stroke="currentColor"
50
+ strokeWidth="1.5"
51
+ >
52
+ <path
53
+ d="M9,9a3,3,0,1,1,4,2.829,1.5,1.5,0,0,0-1,1.415V14.25"
54
+ fill="none"
55
+ strokeLinecap="round"
56
+ />
57
+ <path
58
+ d="M12,17.25a.375.375,0,1,0,.375.375A.375.375,0,0,0,12,17.25h0"
59
+ fill="currentColor"
60
+ strokeLinecap="round"
61
+ />
62
+ <circle
63
+ cx="12"
64
+ cy="12"
65
+ fill="none"
66
+ r="11.25"
67
+ strokeMiterlimit="10"
68
+ />
69
+ </g>
70
+ </svg>
71
+ `;
@@ -1,11 +1,12 @@
1
1
  import { useState } from "react";
2
2
  import {
3
- Meta,
4
- Story,
5
3
  ArgsTable,
6
4
  Canvas,
7
5
  Description,
8
- } from "@storybook/addon-docs/blocks";
6
+ Meta,
7
+ Story,
8
+ } from "@storybook/addon-docs";
9
+
9
10
  import Modal from "./Modal";
10
11
  import Button from "../Button/Button";
11
12
  import { getCategory } from "../../utils/componentCategories";
@@ -14,7 +15,12 @@ import { getCategory } from "../../utils/componentCategories";
14
15
  title={getCategory("Modal")}
15
16
  component={Modal}
16
17
  argTypes={{
18
+ blockName: { control: false },
17
19
  children: { table: { disable: true } },
20
+ className: { control: false },
21
+ id: { control: false },
22
+ modifiers: { control: false },
23
+ open: { description: "Only used in Storybook." },
18
24
  }}
19
25
  parameters={{
20
26
  jest: ["Modal.test.tsx"],
@@ -119,12 +125,21 @@ export const ModalStory = (args) => {
119
125
  };
120
126
 
121
127
  <Canvas withToolbar>
122
- <Story name="Basic" args={{ open: false }}>
128
+ <Story
129
+ name="Modal"
130
+ args={{
131
+ blockName: undefined,
132
+ className: undefined,
133
+ id: "modal-id",
134
+ modifiers: undefined,
135
+ open: false,
136
+ }}
137
+ >
123
138
  {(args) => <ModalStory {...args} />}
124
139
  </Story>
125
140
  </Canvas>
126
141
 
127
- <ArgsTable story="Basic" />
142
+ <ArgsTable story="Modal" />
128
143
 
129
144
  ## Code Implementation
130
145
 
@@ -1,15 +1,10 @@
1
1
  import * as React from "react";
2
- import bem from "../../utils/bem";
3
2
 
4
3
  export interface ModalProps {
5
- /** BlockName for use with BEM. See how to work with blockNames and BEM here: http://getbem.com/introduction/ */
6
- blockName?: string;
7
4
  /** ClassName that appears in addition to "modal" */
8
5
  className?: string;
9
6
  /** ID that other components can cross reference for accessibility purposes */
10
7
  id?: string;
11
- /** Modifiers array for use with BEM. See how to work with modifiers and BEM here: http://getbem.com/introduction/ */
12
- modifiers?: string[];
13
8
  }
14
9
 
15
10
  /** Full-screen modal that appears on top of the body of the page. */
@@ -23,14 +18,13 @@ export default class Modal extends React.Component<ModalProps, any> {
23
18
  }
24
19
 
25
20
  render() {
26
- const { modifiers = [], blockName, id, className } = this.props;
27
- const baseClass = "modal";
21
+ const { id, className } = this.props;
28
22
 
29
23
  return (
30
24
  <div
31
25
  // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex
32
26
  tabIndex={0}
33
- className={bem(baseClass, modifiers, blockName, [className])}
27
+ className={`modal ${className}`}
34
28
  id={id}
35
29
  >
36
30
  {this.props.children}
@@ -1,24 +1,24 @@
1
1
  import {
2
- Meta,
3
- Story,
4
- Canvas,
5
2
  ArgsTable,
6
- Preview,
3
+ Canvas,
7
4
  Description,
8
- } from "@storybook/addon-docs/blocks";
5
+ Meta,
6
+ Story,
7
+ } from "@storybook/addon-docs";
9
8
  import { withDesign } from "storybook-addon-designs";
10
9
 
10
+ import Icon from "../Icons/Icon";
11
+ import { IconColors, IconNames } from "../Icons/IconTypes";
11
12
  import Notification from "./Notification";
12
13
  import { NotificationTypes } from "./NotificationTypes";
13
- import Icon from "../Icons/Icon";
14
- import {
15
- IconSizes,
16
- IconColors,
17
- IconNames,
18
- IconAlign,
19
- } from "../Icons/IconTypes";
20
14
  import { getCategory } from "../../utils/componentCategories";
21
15
  import DSProvider from "../../theme/provider";
16
+ import { getStorybookEnumValues } from "../../utils/utils";
17
+
18
+ export const enumValues = getStorybookEnumValues(
19
+ NotificationTypes,
20
+ "NotificationTypes"
21
+ );
22
22
 
23
23
  <Meta
24
24
  title={getCategory("Notification")}
@@ -27,11 +27,29 @@ import DSProvider from "../../theme/provider";
27
27
  parameters={{
28
28
  design: {
29
29
  type: "figma",
30
- url:
31
- "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/?node-id=10734%3A812",
30
+ url: "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/?node-id=10734%3A812",
32
31
  },
33
32
  jest: ["Notification.test.tsx"],
34
33
  }}
34
+ argTypes={{
35
+ centered: {
36
+ table: { defaultValue: { summary: false } },
37
+ },
38
+ className: { control: false },
39
+ dismissible: {
40
+ table: { defaultValue: { summary: false } },
41
+ },
42
+ icon: { control: false },
43
+ id: { control: false },
44
+ noMargin: {
45
+ table: { defaultValue: { summary: false } },
46
+ },
47
+ notificationType: {
48
+ control: { type: "select" },
49
+ table: { defaultValue: { summary: "NotificationTypes.Standard" } },
50
+ options: enumValues.options,
51
+ },
52
+ }}
35
53
  />
36
54
 
37
55
  # Notification
@@ -39,7 +57,7 @@ import DSProvider from "../../theme/provider";
39
57
  | Component Version | DS Version |
40
58
  | ----------------- | ---------- |
41
59
  | Added | `0.23.2` |
42
- | Latest | `0.25.4` |
60
+ | Latest | `0.25.9` |
43
61
 
44
62
  <Description of={Notification} />
45
63
 
@@ -52,10 +70,14 @@ within a parent element.
52
70
 
53
71
  <Canvas>
54
72
  <Story
55
- name="Notification Props"
73
+ name="Notification with Controls"
56
74
  args={{
57
- id: "basic-notification",
58
- centered: true,
75
+ centered: false,
76
+ className: undefined,
77
+ dismissible: false,
78
+ icon: undefined,
79
+ id: "notification-id",
80
+ noMargin: false,
59
81
  notificationHeading: "Notification Heading",
60
82
  notificationContent: (
61
83
  <>
@@ -67,17 +89,21 @@ within a parent element.
67
89
  nisi erat porttitor ligula.
68
90
  </>
69
91
  ),
92
+ showIcon: true,
70
93
  }}
71
94
  >
72
95
  {(args) => (
73
96
  <div style={{ border: "1px solid #ccc" }}>
74
- <Notification {...args} />
97
+ <Notification
98
+ {...args}
99
+ notificationType={enumValues.getValue(args.notificationType)}
100
+ />
75
101
  </div>
76
102
  )}
77
103
  </Story>
78
104
  </Canvas>
79
105
 
80
- <ArgsTable story="Notification Props" />
106
+ <ArgsTable story="Notification with Controls" />
81
107
 
82
108
  ## Variants
83
109
 
@@ -194,31 +220,61 @@ within a parent element.
194
220
  </DSProvider>
195
221
  </Canvas>
196
222
 
223
+ ### Without Icon
224
+
225
+ The `Notification` icon can be hidden with the `showIcon` prop set to `false`.
226
+
227
+ <Canvas>
228
+ <DSProvider>
229
+ <Notification
230
+ notificationHeading="Standard Notification without Icon"
231
+ notificationContent={
232
+ <>
233
+ Cras mattis consectetur purus sit amet fermentum. Maecenas faucibus
234
+ mollis interdum. Morbi leo risus, porta ac consectetur ac, vestibulum
235
+ at eros. Cum sociis natoque penatibus et magnis dis parturient montes,
236
+ nascetur ridiculus mus.
237
+ </>
238
+ }
239
+ showIcon={false}
240
+ />
241
+ <Notification
242
+ notificationContent={
243
+ <>
244
+ This is an Standard Notification without a heading or icon. Cras
245
+ mattis consectetur purus sit amet fermentum. Maecenas faucibus mollis
246
+ interdum. Morbi leo risus, porta ac consectetur ac, vestibulum at
247
+ eros. Cum sociis natoque penatibus et magnis dis parturient montes,
248
+ nascetur ridiculus mus.
249
+ </>
250
+ }
251
+ showIcon={false}
252
+ />
253
+ </DSProvider>
254
+ </Canvas>
255
+
197
256
  ## Custom Icon
198
257
 
199
258
  The default icon can be overridden by using the `icon` prop to pass a custom `Icon` component.
200
259
 
201
260
  <Canvas>
202
261
  <Story name="Custom Icons">
203
- {(args) => (
204
- <Notification
205
- icon={
206
- <Icon
207
- name={IconNames.Check}
208
- color={IconColors.SectionResearchSecondary}
209
- />
210
- }
211
- notificationHeading="Custom Icon"
212
- notificationContent={
213
- <>
214
- This is a Notification with a custom icon. Cras mattis consectetur
215
- purus sit amet fermentum. Maecenas faucibus mollis interdum. Morbi
216
- leo risus, porta ac consectetur ac, vestibulum at eros. Cum sociis
217
- natoque penatibus et magnis dis parturient montes, nascetur
218
- ridiculus mus.
219
- </>
220
- }
221
- />
222
- )}
262
+ <Notification
263
+ icon={
264
+ <Icon
265
+ name={IconNames.Check}
266
+ color={IconColors.SectionResearchSecondary}
267
+ />
268
+ }
269
+ notificationHeading="Custom Icon"
270
+ notificationContent={
271
+ <>
272
+ This is a Notification with a custom icon. Cras mattis consectetur
273
+ purus sit amet fermentum. Maecenas faucibus mollis interdum. Morbi leo
274
+ risus, porta ac consectetur ac, vestibulum at eros. Cum sociis natoque
275
+ penatibus et magnis dis parturient montes, nascetur ridiculus mus.
276
+ </>
277
+ }
278
+ />
223
279
  </Story>
224
280
  </Canvas>