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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/CHANGELOG.md +110 -1
  2. package/README.md +1 -1
  3. package/dist/components/Button/Button.d.ts +6 -6
  4. package/dist/components/Button/ButtonTypes.d.ts +0 -1
  5. package/dist/components/Card/Card.d.ts +6 -4
  6. package/dist/components/Checkbox/Checkbox.d.ts +3 -2
  7. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +3 -2
  8. package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +8 -2
  9. package/dist/components/DatePicker/DatePicker.d.ts +4 -3
  10. package/dist/components/Fieldset/Fieldset.d.ts +1 -3
  11. package/dist/components/Form/Form.d.ts +15 -14
  12. package/dist/components/Form/FormTypes.d.ts +2 -2
  13. package/dist/components/Heading/Heading.d.ts +7 -3
  14. package/dist/components/Heading/HeadingTypes.d.ts +6 -6
  15. package/dist/components/HelperErrorText/HelperErrorText.d.ts +5 -2
  16. package/dist/components/HorizontalRule/HorizontalRule.d.ts +3 -3
  17. package/dist/components/Icons/Icon.d.ts +4 -4
  18. package/dist/components/Icons/IconSvgs.d.ts +0 -21
  19. package/dist/components/Icons/IconTypes.d.ts +0 -23
  20. package/dist/components/Image/Image.d.ts +11 -3
  21. package/dist/components/List/List.d.ts +1 -1
  22. package/dist/components/Logo/Logo.d.ts +28 -0
  23. package/dist/components/Logo/LogoSvgs.d.ts +34 -0
  24. package/dist/components/Logo/LogoTypes.d.ts +46 -0
  25. package/dist/components/Modal/Modal.d.ts +0 -4
  26. package/dist/components/Notification/Notification.d.ts +4 -2
  27. package/dist/components/Placeholder/Placeholder.d.ts +3 -5
  28. package/dist/components/Radio/Radio.d.ts +6 -5
  29. package/dist/components/RadioGroup/RadioGroup.d.ts +6 -5
  30. package/dist/components/SearchBar/SearchBar.d.ts +15 -7
  31. package/dist/components/Select/Select.d.ts +7 -2
  32. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +8 -4
  33. package/dist/components/Slider/Slider.d.ts +3 -2
  34. package/dist/components/StatusBadge/StatusBadge.d.ts +2 -1
  35. package/dist/components/StructuredContent/StructuredContent.d.ts +41 -0
  36. package/dist/components/StructuredContent/StructuredContentTypes.d.ts +5 -0
  37. package/dist/components/Table/Table.d.ts +29 -0
  38. package/dist/components/Template/Template.d.ts +30 -6
  39. package/dist/components/Text/Text.d.ts +2 -2
  40. package/dist/components/TextInput/TextInput.d.ts +4 -3
  41. package/dist/components/Toggle/Toggle.d.ts +3 -2
  42. package/dist/components/VideoPlayer/VideoPlayer.d.ts +14 -5
  43. package/dist/design-system-react-components.cjs.development.js +6721 -5777
  44. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  45. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  46. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  47. package/dist/design-system-react-components.esm.js +6774 -5839
  48. package/dist/design-system-react-components.esm.js.map +1 -1
  49. package/dist/index.d.ts +10 -8
  50. package/dist/resources.scss +0 -2
  51. package/dist/styles.css +2 -2
  52. package/dist/theme/components/breadcrumb.d.ts +1 -1
  53. package/dist/theme/components/button.d.ts +0 -12
  54. package/dist/theme/components/card.d.ts +14 -2
  55. package/dist/theme/components/customTable.d.ts +56 -0
  56. package/dist/theme/components/fieldset.d.ts +2 -2
  57. package/dist/theme/components/global.d.ts +1 -1
  58. package/dist/theme/components/heading.d.ts +4 -0
  59. package/dist/theme/components/label.d.ts +1 -1
  60. package/dist/theme/components/link.d.ts +14 -1
  61. package/dist/theme/components/list.d.ts +0 -2
  62. package/dist/theme/components/logo.d.ts +4 -0
  63. package/dist/theme/components/notification.d.ts +13 -4
  64. package/dist/theme/components/searchBar.d.ts +9 -11
  65. package/dist/theme/components/select.d.ts +1 -0
  66. package/dist/theme/components/structuredContent.d.ts +33 -0
  67. package/dist/theme/components/template.d.ts +10 -10
  68. package/dist/theme/components/textInput.d.ts +4 -0
  69. package/dist/theme/components/toggle.d.ts +8 -5
  70. package/dist/utils/utils.d.ts +10 -0
  71. package/package.json +40 -37
  72. package/src/__tests__/utils/utils.test.ts +23 -1
  73. package/src/components/Accordion/Accordion.stories.mdx +15 -13
  74. package/src/components/Accordion/Accordion.test.tsx +45 -1
  75. package/src/components/Accordion/Accordion.tsx +20 -8
  76. package/src/components/Accordion/__snapshots__/Accordion.test.tsx.snap +243 -0
  77. package/src/components/Autosuggest/Autosuggest.stories.mdx +2 -1
  78. package/src/components/Autosuggest/Autosuggest.stories.tsx +24 -48
  79. package/src/components/Autosuggest/_Autosuggest.scss +2 -6
  80. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +43 -13
  81. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +15 -0
  82. package/src/components/Breadcrumbs/Breadcrumbs.tsx +9 -3
  83. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +5 -5
  84. package/src/components/Button/Button.stories.mdx +93 -48
  85. package/src/components/Button/Button.test.tsx +0 -12
  86. package/src/components/Button/Button.tsx +7 -7
  87. package/src/components/Button/ButtonTypes.tsx +0 -1
  88. package/src/components/Button/__snapshots__/Button.test.tsx.snap +0 -12
  89. package/src/components/Card/Card.stories.mdx +186 -71
  90. package/src/components/Card/Card.test.tsx +45 -22
  91. package/src/components/Card/Card.tsx +21 -6
  92. package/src/components/Card/__snapshots__/Card.test.tsx.snap +9 -3
  93. package/src/components/Chakra/Box.stories.mdx +3 -3
  94. package/src/components/Chakra/Center.stories.mdx +5 -5
  95. package/src/components/Chakra/Flex.stories.mdx +113 -0
  96. package/src/components/Chakra/Grid.stories.mdx +3 -3
  97. package/src/components/Chakra/Stack.stories.mdx +2 -2
  98. package/src/components/Checkbox/Checkbox.stories.mdx +37 -15
  99. package/src/components/Checkbox/Checkbox.tsx +13 -8
  100. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +48 -16
  101. package/src/components/CheckboxGroup/CheckboxGroup.tsx +14 -10
  102. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +6 -3
  103. package/src/components/ComponentWrapper/ComponentWrapper.test.tsx +151 -0
  104. package/src/components/ComponentWrapper/ComponentWrapper.tsx +36 -23
  105. package/src/components/ComponentWrapper/__snapshots__/ComponentWrapper.test.tsx.snap +85 -0
  106. package/src/components/DatePicker/DatePicker.stories.mdx +63 -18
  107. package/src/components/DatePicker/DatePicker.test.tsx +6 -6
  108. package/src/components/DatePicker/DatePicker.tsx +17 -11
  109. package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +50 -24
  110. package/src/components/Fieldset/Fieldset.stories.mdx +20 -9
  111. package/src/components/Fieldset/Fieldset.tsx +2 -4
  112. package/src/components/Form/Form.stories.mdx +75 -49
  113. package/src/components/Form/Form.test.tsx +92 -3
  114. package/src/components/Form/Form.tsx +28 -23
  115. package/src/components/Form/FormTypes.tsx +2 -2
  116. package/src/components/Form/__snapshots__/Form.test.tsx.snap +0 -1
  117. package/src/components/Grid/SimpleGrid.stories.mdx +26 -26
  118. package/src/components/Heading/Heading.stories.mdx +59 -23
  119. package/src/components/Heading/Heading.test.tsx +82 -18
  120. package/src/components/Heading/Heading.tsx +31 -31
  121. package/src/components/Heading/HeadingTypes.tsx +6 -6
  122. package/src/components/Heading/__snapshots__/Heading.test.tsx.snap +71 -0
  123. package/src/components/HelperErrorText/HelperErrorText.stories.mdx +55 -27
  124. package/src/components/HelperErrorText/HelperErrorText.test.tsx +42 -15
  125. package/src/components/HelperErrorText/HelperErrorText.tsx +24 -24
  126. package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +41 -4
  127. package/src/components/Hero/Hero.stories.mdx +72 -53
  128. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +11 -9
  129. package/src/components/HorizontalRule/HorizontalRule.tsx +4 -6
  130. package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +4 -4
  131. package/src/components/Icons/Icon.stories.mdx +78 -77
  132. package/src/components/Icons/Icon.test.tsx +1 -1
  133. package/src/components/Icons/Icon.tsx +5 -6
  134. package/src/components/Icons/IconSvgs.tsx +0 -42
  135. package/src/components/Icons/IconTypes.tsx +0 -24
  136. package/src/components/Image/Image.stories.mdx +66 -18
  137. package/src/components/Image/Image.tsx +21 -10
  138. package/src/components/Label/Label.stories.mdx +20 -19
  139. package/src/components/Link/Link.stories.mdx +102 -51
  140. package/src/components/Link/Link.test.tsx +38 -8
  141. package/src/components/Link/Link.tsx +19 -12
  142. package/src/components/Link/__snapshots__/Link.test.tsx.snap +60 -0
  143. package/src/components/List/List.stories.mdx +60 -29
  144. package/src/components/List/List.test.tsx +1 -1
  145. package/src/components/List/List.tsx +2 -2
  146. package/src/components/List/__snapshots__/List.test.tsx.snap +3 -1
  147. package/src/components/Logo/Logo.stories.mdx +222 -0
  148. package/src/components/Logo/Logo.test.tsx +98 -0
  149. package/src/components/Logo/Logo.tsx +97 -0
  150. package/src/components/Logo/LogoSvgs.tsx +66 -0
  151. package/src/components/Logo/LogoTypes.tsx +48 -0
  152. package/src/components/Logo/__snapshots__/Logo.test.tsx.snap +71 -0
  153. package/src/components/Modal/Modal.stories.mdx +20 -5
  154. package/src/components/Modal/Modal.tsx +2 -8
  155. package/src/components/Notification/Notification.stories.mdx +128 -38
  156. package/src/components/Notification/Notification.test.tsx +49 -1
  157. package/src/components/Notification/Notification.tsx +25 -12
  158. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +4 -0
  159. package/src/components/Pagination/Pagination.stories.mdx +18 -7
  160. package/src/components/Pagination/Pagination.tsx +3 -3
  161. package/src/components/Placeholder/Placeholder.tsx +7 -14
  162. package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +72 -43
  163. package/src/components/Radio/Radio.stories.mdx +39 -19
  164. package/src/components/Radio/Radio.tsx +13 -9
  165. package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +5 -5
  166. package/src/components/RadioGroup/RadioGroup.stories.mdx +50 -16
  167. package/src/components/RadioGroup/RadioGroup.test.tsx +13 -11
  168. package/src/components/RadioGroup/RadioGroup.tsx +97 -94
  169. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +24 -21
  170. package/src/components/SearchBar/SearchBar.Test.tsx +160 -34
  171. package/src/components/SearchBar/SearchBar.stories.mdx +115 -33
  172. package/src/components/SearchBar/SearchBar.tsx +72 -51
  173. package/src/components/Select/Select.stories.mdx +48 -14
  174. package/src/components/Select/Select.test.tsx +89 -0
  175. package/src/components/Select/Select.tsx +27 -12
  176. package/src/components/Select/__snapshots__/Select.test.tsx.snap +545 -0
  177. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +50 -16
  178. package/src/components/SkeletonLoader/SkeletonLoader.tsx +8 -4
  179. package/src/components/Slider/Slider.stories.mdx +72 -22
  180. package/src/components/Slider/Slider.tsx +15 -10
  181. package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +67 -30
  182. package/src/components/StatusBadge/StatusBadge.stories.mdx +33 -18
  183. package/src/components/StatusBadge/StatusBadge.tsx +2 -1
  184. package/src/components/StructuredContent/StructuredContent.stories.mdx +427 -0
  185. package/src/components/StructuredContent/StructuredContent.test.tsx +376 -0
  186. package/src/components/StructuredContent/StructuredContent.tsx +153 -0
  187. package/src/components/StructuredContent/StructuredContentTypes.tsx +5 -0
  188. package/src/components/StructuredContent/__snapshots__/StructuredContent.test.tsx.snap +283 -0
  189. package/src/components/StyleGuide/Bidirectionality.stories.mdx +32 -83
  190. package/src/components/StyleGuide/Breakpoints.stories.mdx +1 -11
  191. package/src/components/StyleGuide/Buttons.stories.mdx +3 -18
  192. package/src/components/StyleGuide/ColorCard.tsx +1 -2
  193. package/src/components/StyleGuide/Colors.stories.mdx +3 -11
  194. package/src/components/StyleGuide/DesignTokens.stories.mdx +3 -8
  195. package/src/components/StyleGuide/Forms.stories.mdx +2 -10
  196. package/src/components/StyleGuide/Iconography.stories.mdx +8 -34
  197. package/src/components/StyleGuide/Spacing.stories.mdx +3 -14
  198. package/src/components/StyleGuide/Typography.stories.mdx +64 -76
  199. package/src/components/Table/Table.stories.mdx +165 -0
  200. package/src/components/Table/Table.test.tsx +137 -0
  201. package/src/components/Table/Table.tsx +126 -0
  202. package/src/components/Table/__snapshots__/Table.test.tsx.snap +1179 -0
  203. package/src/components/Tabs/Tabs.stories.mdx +20 -14
  204. package/src/components/Tabs/Tabs.test.tsx +21 -5
  205. package/src/components/Tabs/Tabs.tsx +35 -20
  206. package/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap +195 -0
  207. package/src/components/Template/Template.stories.mdx +132 -48
  208. package/src/components/Template/Template.test.tsx +128 -6
  209. package/src/components/Template/Template.tsx +93 -13
  210. package/src/components/Template/__snapshots__/Template.test.tsx.snap +169 -0
  211. package/src/components/Text/Text.stories.mdx +33 -11
  212. package/src/components/Text/Text.tsx +2 -2
  213. package/src/components/TextInput/TextInput.stories.mdx +84 -17
  214. package/src/components/TextInput/TextInput.test.tsx +96 -0
  215. package/src/components/TextInput/TextInput.tsx +12 -8
  216. package/src/components/TextInput/__snapshots__/TextInput.test.tsx.snap +240 -0
  217. package/src/components/Toggle/Toggle.stories.mdx +33 -9
  218. package/src/components/Toggle/Toggle.tsx +14 -9
  219. package/src/components/Toggle/__snapshots__/Toggle.test.tsx.snap +4 -4
  220. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +64 -14
  221. package/src/components/VideoPlayer/VideoPlayer.tsx +17 -7
  222. package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +12 -6
  223. package/src/docs/Chakra.stories.mdx +5 -8
  224. package/src/docs/Intro.stories.mdx +2 -2
  225. package/src/index.ts +13 -6
  226. package/src/styles/base/_03-base.scss +1 -1
  227. package/src/styles/base/_place-holder.scss +7 -7
  228. package/src/styles.scss +1 -5
  229. package/src/theme/components/breadcrumb.ts +4 -4
  230. package/src/theme/components/button.ts +5 -12
  231. package/src/theme/components/card.ts +5 -2
  232. package/src/theme/components/checkbox.ts +1 -1
  233. package/src/theme/components/customTable.ts +63 -0
  234. package/src/theme/components/datePicker.ts +1 -1
  235. package/src/theme/components/global.ts +7 -7
  236. package/src/theme/components/heading.ts +13 -11
  237. package/src/theme/components/helperErrorText.ts +1 -1
  238. package/src/theme/components/image.ts +1 -1
  239. package/src/theme/components/link.ts +17 -5
  240. package/src/theme/components/list.ts +3 -5
  241. package/src/theme/components/logo.ts +54 -0
  242. package/src/theme/components/notification.ts +19 -9
  243. package/src/theme/components/searchBar.ts +11 -13
  244. package/src/theme/components/select.ts +1 -0
  245. package/src/theme/components/statusBadge.ts +1 -1
  246. package/src/theme/components/structuredContent.ts +74 -0
  247. package/src/theme/components/template.ts +10 -10
  248. package/src/theme/components/text.ts +6 -6
  249. package/src/theme/components/textInput.ts +2 -0
  250. package/src/theme/components/toggle.ts +10 -6
  251. package/src/theme/components/videoPlayer.ts +0 -2
  252. package/src/theme/foundations/global.ts +2 -2
  253. package/src/theme/foundations/typography.ts +84 -12
  254. package/src/theme/index.ts +6 -0
  255. package/src/utils/componentCategories.ts +2 -1
  256. package/src/utils/utils.ts +17 -0
  257. package/dist/__tests__/utils/bem.test.d.ts +0 -1
  258. package/dist/components/CardEdition/CardEdition.d.ts +0 -21
  259. package/dist/components/CardEdition/CardEdition.stories.d.ts +0 -27
  260. package/dist/components/Input/Input.d.ts +0 -36
  261. package/dist/components/Input/Input.stories.d.ts +0 -29
  262. package/dist/components/Input/InputTypes.d.ts +0 -6
  263. package/dist/components/StyleGuide/UIDocCard.d.ts +0 -11
  264. package/dist/helpers/CSSVariablesHelper.d.ts +0 -3
  265. package/dist/helpers/getCSSVariable.d.ts +0 -1
  266. package/dist/interfaces.d.ts +0 -3
  267. package/dist/utils/bem.d.ts +0 -1
  268. package/src/__tests__/utils/bem.test.ts +0 -37
  269. package/src/components/CardEdition/CardEdition.stories.tsx +0 -122
  270. package/src/components/CardEdition/CardEdition.test.tsx +0 -395
  271. package/src/components/CardEdition/CardEdition.tsx +0 -60
  272. package/src/components/CardEdition/_CardEdition.scss +0 -137
  273. package/src/components/Input/Input.stories.tsx +0 -133
  274. package/src/components/Input/Input.test.tsx +0 -266
  275. package/src/components/Input/Input.tsx +0 -81
  276. package/src/components/Input/InputTypes.tsx +0 -8
  277. package/src/components/Input/_Input.scss +0 -78
  278. package/src/components/StyleGuide/UIDocCard.tsx +0 -36
  279. package/src/helpers/CSSVariablesHelper.tsx +0 -34
  280. package/src/helpers/getCSSVariable.tsx +0 -5
  281. package/src/interfaces.ts +0 -3
  282. package/src/utils/bem.ts +0 -44
@@ -1,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
  />
@@ -47,7 +51,7 @@ import { getCategory } from "../../utils/componentCategories";
47
51
  | Component Version | DS Version |
48
52
  | ----------------- | ---------- |
49
53
  | Added | `0.7.0` |
50
- | Latest | `0.25.2` |
54
+ | Latest | `0.25.11` |
51
55
 
52
56
  <Description of={List} />
53
57
 
@@ -59,8 +63,15 @@ export const animalCrossingDefinitions = [
59
63
  },
60
64
  {
61
65
  term: "Golden trout",
62
- definition:
63
- "The golden trout is a beautifully colored fish that can only live in very clean waters. They are difficult to come across since they are found only in high mountain streams. As a side note, I find it much easier to appreciate fish that aren't such prima donnas about everything.",
66
+ definition: (
67
+ <p>
68
+ The golden trout is a <b>beautifully</b> colored fish that can only live
69
+ in very clean waters. They are difficult to come across since they are
70
+ found only in high mountain streams. As a side note, I find it much
71
+ easier to appreciate fish that aren't such prima donnas about
72
+ everything.
73
+ </p>
74
+ ),
64
75
  },
65
76
  {
66
77
  term: "Rainbowfish",
@@ -69,8 +80,20 @@ export const animalCrossingDefinitions = [
69
80
  },
70
81
  {
71
82
  term: "Suckerfish",
72
- definition:
73
- "The suckerfish is a curious fish that likes to attach itself with its sucker mouth to larger marine animals. The benefit to the suckerfish is that it gets to eat smaller parasites and dead skin off the host's body. Amusingly, some people have used suckerfish on cords to catch large turtles with the fish's own suction! I imagine this practice is the cause of some awkward conversations between fish and turtle, eh wot?",
83
+ definition: (
84
+ <p>
85
+ The{" "}
86
+ <Link href="https://animalcrossing.fandom.com/wiki/Suckerfish">
87
+ suckerfish
88
+ </Link>{" "}
89
+ is a curious fish that likes to attach itself with its sucker mouth to
90
+ larger marine animals. The benefit to the suckerfish is that it gets to
91
+ eat smaller parasites and dead skin off the host's body. Amusingly, some
92
+ people have used suckerfish on cords to catch large turtles with the
93
+ fish's own suction! I imagine this practice is the cause of some awkward
94
+ conversations between fish and turtle, eh wot?
95
+ </p>
96
+ ),
74
97
  },
75
98
  ];
76
99
  export const itemGroups = [
@@ -118,17 +141,21 @@ export const definitions = [
118
141
 
119
142
  <Canvas withToolbar>
120
143
  <Story
121
- name="List"
144
+ name="List with Controls"
122
145
  args={{
146
+ additionalStyles: undefined,
147
+ className: undefined,
123
148
  id: "nypl-list",
149
+ inline: false,
150
+ listItems: undefined,
124
151
  noStyling: false,
125
152
  title: "Middle-Earth Peoples",
126
- type: ListTypes.Unordered,
153
+ type: "ListTypes.Unordered",
127
154
  }}
128
155
  >
129
156
  {(args) => (
130
- <List {...args} type={ListTypes[args.type]}>
131
- {ListTypes[args.type] !== ListTypes.Definition
157
+ <List {...args} type={enumValues.getValue(args.type)}>
158
+ {args.type !== "ListTypes.Definition"
132
159
  ? itemGroups.map((item, i) => <li key={i}>{item}</li>)
133
160
  : definitions.map((item, i) => [
134
161
  <dt key={`dt_${i}`}>{item.term}</dt>,
@@ -139,7 +166,7 @@ export const definitions = [
139
166
  </Story>
140
167
  </Canvas>
141
168
 
142
- <ArgsTable story="List" />
169
+ <ArgsTable story="List with Controls" />
143
170
 
144
171
  ## Definition List
145
172
 
@@ -163,13 +190,14 @@ This type of list renders `dt` and `dd` elements.
163
190
  title: "Middle-Earth Peoples",
164
191
  }}
165
192
  argTypes={{
166
- type: { table: { disable: true } },
193
+ inline: { control: false },
194
+ noStyling: { control: false },
195
+ type: { control: false },
167
196
  }}
168
197
  parameters={{
169
198
  design: {
170
199
  type: "figma",
171
- url:
172
- "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=10734%3A5178",
200
+ url: "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=10734%3A5178",
173
201
  },
174
202
  }}
175
203
  >
@@ -196,13 +224,14 @@ An example with HTML elements inside of the `dd` elements.
196
224
  title: "Details",
197
225
  }}
198
226
  argTypes={{
227
+ inline: { control: false },
228
+ noStyling: { control: false },
199
229
  type: { table: { disable: true } },
200
230
  }}
201
231
  parameters={{
202
232
  design: {
203
233
  type: "figma",
204
- url:
205
- "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=10734%3A5178",
234
+ url: "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=10734%3A5178",
206
235
  },
207
236
  }}
208
237
  >
@@ -330,7 +359,9 @@ const fishDefinitions = [
330
359
  title: "Animal Crossing Fish",
331
360
  }}
332
361
  argTypes={{
333
- type: { table: { disable: true } },
362
+ inline: { control: false },
363
+ noStyling: { control: false },
364
+ type: { control: false },
334
365
  }}
335
366
  >
336
367
  {(args) => <List {...args} type={ListTypes.Definition} />}
@@ -10,7 +10,7 @@ const fishArray = ["Mahi-mahi", "Golden trout", "Rainbowfish", "Suckerfish"];
10
10
  const fishDefinitions = [
11
11
  {
12
12
  term: "Mahi-mahi",
13
- definition: "The mahi-mahi is an ocean fish known...",
13
+ definition: <p>The mahi-mahi is an ocean fish known...</p>,
14
14
  },
15
15
  {
16
16
  term: "Golden trout",
@@ -8,7 +8,7 @@ import generateUUID from "../../helpers/generateUUID";
8
8
 
9
9
  interface DefinitionProps {
10
10
  term: string;
11
- definition: string;
11
+ definition: string | JSX.Element;
12
12
  }
13
13
  export interface ListProps {
14
14
  /** Optionally pass in additional Chakra-based styles. */
@@ -98,7 +98,7 @@ export default function List(props: React.PropsWithChildren<ListProps>) {
98
98
  */
99
99
  const checkListChildrenError = (listType: ListTypes) => {
100
100
  React.Children.map(children, (child: React.ReactElement) => {
101
- if (child?.type !== "li" && child?.props?.mdxType !== "li") {
101
+ if (child && child?.type !== "li" && child?.props?.mdxType !== "li") {
102
102
  console.warn(
103
103
  `Direct children of \`List\` (${listType}) should be \`<li>\`s.`
104
104
  );
@@ -96,7 +96,9 @@ exports[`List Renders the UI snapshot correctly 5`] = `
96
96
  Mahi-mahi
97
97
  </dt>
98
98
  <dd>
99
- The mahi-mahi is an ocean fish known...
99
+ <p>
100
+ The mahi-mahi is an ocean fish known...
101
+ </p>
100
102
  </dd>
101
103
  <dt>
102
104
  Golden trout
@@ -0,0 +1,222 @@
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.11` |
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
+ args.name.indexOf("Negative") !== -1
82
+ ? {
83
+ backgroundColor: "var(--nypl-colors-ui-gray-xdark)",
84
+ display: "inline-block",
85
+ padding: "var(--nypl-space-l)",
86
+ width: "100%",
87
+ }
88
+ : undefined
89
+ }
90
+ >
91
+ <Logo
92
+ name={namesEnumValues.getValue(args.name)}
93
+ size={sizesEnumValues.getValue(args.size)}
94
+ title={args.title}
95
+ />
96
+ </div>
97
+ )}
98
+ </Story>
99
+ </Canvas>
100
+
101
+ <ArgsTable story="Logo with Controls" />
102
+
103
+ export const logoRow = (logo, opts = {}) => {
104
+ // We'll use this setup function to render all the logos in a list item.
105
+ // Some logos display better with a dark background.
106
+ const styles = { textAlign: "center" };
107
+ const { size = LogoSizes.Large, displayValue } = opts;
108
+ let key = logo;
109
+ if (logo.indexOf("White") !== -1 || logo.indexOf("Negative") !== -1) {
110
+ styles.backgroundColor = "var(--nypl-colors-ui-gray-xdark)";
111
+ styles.color = "var(--nypl-colors-ui-white)";
112
+ styles.paddingBottom = "var(--nypl-space-l)";
113
+ styles.paddingTop = "var(--nypl-space-l)";
114
+ }
115
+ if (size !== LogoSizes.Large) {
116
+ key += `-${size}`;
117
+ }
118
+ return (
119
+ <div style={styles} key={key}>
120
+ <Heading level={HeadingLevels.Four}>{displayValue}</Heading>
121
+ <Logo name={LogoNames[logo]} size={size} />
122
+ </div>
123
+ );
124
+ };
125
+ export const logos = [];
126
+ export const sizes = [];
127
+ for (const logo in LogoNames) {
128
+ logos.push(logoRow(logo, { displayValue: `LogoNames.${logo}` }));
129
+ }
130
+ for (const logoSize in LogoSizes) {
131
+ sizes.push(
132
+ logoRow("NYPLBlack", {
133
+ displayValue: `LogoSizes.${logoSize}`,
134
+ size: LogoSizes[logoSize],
135
+ })
136
+ );
137
+ }
138
+
139
+ export const allLogosGrid = (list) => (
140
+ <SimpleGrid columns={1}>{list}</SimpleGrid>
141
+ );
142
+
143
+ ## Accessibility
144
+
145
+ For accessibility purposes, every DS `Logo` will render the `svg` element with
146
+ its `svg` file name in the `title` element. The default text in the `title` element
147
+ is the logo's code name. Pass in better descriptive text in the `title` prop
148
+ when using the `Logo` component in your application. This will give screenreaders
149
+ a better descriptive title for the `svg` graphic.
150
+
151
+ ## All Logos
152
+
153
+ The `Logo` component contains the logos most commonly used by are listed available
154
+ logos are listed in the `LogoNames` enum in `src/components/Logos/LogoTypes.tsx`.
155
+
156
+ If you feel a necessary logo should be added to the `Logo` component, please reach out
157
+ to the DS team.
158
+
159
+ <Canvas withToolbar>
160
+ <Story name="All Logos">{allLogosGrid(logos)}</Story>
161
+ </Canvas>
162
+
163
+ ## Logo Sizes
164
+
165
+ Update the size of the `Logo` component by passing the `size` prop with a value from
166
+ `LogoSizes`. The `LogoSizes` enum can be found in`src/components/Logo/LogoTypes.tsx`.
167
+
168
+ Note: `LogoSizes.Default` sets the width to `100%` and the logo will expand to
169
+ fill the full width of the parent element.
170
+
171
+ ```jsx
172
+ // Example
173
+ <Logo name={LogoNames.NYPLBlack} size={LogoSizes.Large} />
174
+ ```
175
+
176
+ <Canvas>
177
+ <Story name="Logo Sizes">{allLogosGrid(sizes)}</Story>
178
+ </Canvas>
179
+
180
+ ## Custom Logos
181
+
182
+ If you'd like to pass a custom `svg` to your application, you can pass it a
183
+ child to the `Logo` component.
184
+
185
+ ```jsx
186
+ <Logo {...props}>
187
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192.756 192.756">
188
+ <g fill-rule="evenodd" clip-rule="evenodd">
189
+ <path fill="#fff" d="M0 0h192.756v192.756H0V0z" />
190
+ <path
191
+ 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"
192
+ fill="#c23c40"
193
+ />
194
+ <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" />
195
+ </g>
196
+ </svg>
197
+ </Logo>
198
+ ```
199
+
200
+ <Canvas>
201
+ <Story
202
+ name="Custom Logos"
203
+ args={{
204
+ size: LogoSizes.Large,
205
+ }}
206
+ >
207
+ {(args) => (
208
+ <Logo {...args}>
209
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192.756 192.756">
210
+ <g fill-rule="evenodd" clip-rule="evenodd">
211
+ <path fill="#fff" d="M0 0h192.756v192.756H0V0z" />
212
+ <path
213
+ 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"
214
+ fill="#c23c40"
215
+ />
216
+ <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" />
217
+ </g>
218
+ </svg>
219
+ </Logo>
220
+ )}
221
+ </Story>
222
+ </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
+ });
@@ -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
+ }