@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
@@ -3,10 +3,7 @@ import React, { useState } from "react";
3
3
  import Autosuggest from "react-autosuggest";
4
4
  import Icon from "../Icons/Icon";
5
5
  import { IconNames } from "../Icons/IconTypes";
6
- import Label from "../Label/Label";
7
- import Input from "../Input/Input";
8
- import { InputTypes } from "../Input/InputTypes";
9
- import HelperErrorText from "../HelperErrorText/HelperErrorText";
6
+ import TextInput from "../TextInput/TextInput";
10
7
 
11
8
  /**
12
9
  * StoryWrapper
@@ -21,29 +18,16 @@ const libraryRenderInputComponent = (
21
18
  inputProps: React.HTMLProps<HTMLInputElement>
22
19
  ) => {
23
20
  return (
24
- <>
25
- <Label
26
- htmlFor="library-autosuggest"
27
- id="library-autosuggest-label"
28
- optReqFlag={"Required"}
29
- >
30
- Home Library
31
- </Label>
32
- <HelperErrorText id="id-helperText" isInvalid={false}>
33
- Select your home library. Start by typing the name of the library. Try{" "}
34
- {'"'}ba{'"'}.
35
- </HelperErrorText>
36
- <Input
37
- type={InputTypes.text}
38
- id="library-autosuggest"
39
- aria-required={true}
40
- aria-labelledby="library-autosuggest-label id-helperText"
41
- attributes={{
42
- name: "homeLibraryName",
43
- ...inputProps,
44
- }}
45
- />
46
- </>
21
+ <TextInput
22
+ attributes={{
23
+ ...inputProps,
24
+ }}
25
+ id="library-autosuggest"
26
+ isRequired
27
+ labelText="Home Library"
28
+ name="homeLibraryName"
29
+ helperText="Select your home library. Start by typing the name of the library. Try 'ba'."
30
+ />
47
31
  );
48
32
  };
49
33
 
@@ -148,20 +132,14 @@ const FishExample = () => {
148
132
  ];
149
133
  const renderInputComponent = (inputProps) => {
150
134
  return (
151
- <>
152
- <Label htmlFor="input-fish-autosuggest" id="fish-autosuggest-label">
153
- Fish in Animal Crossing
154
- </Label>
155
- <Input
156
- type={InputTypes.text}
157
- id="input-fish-autosuggest"
158
- aria-required={false}
159
- attributes={{
160
- name: "favoriteFish",
161
- ...inputProps,
162
- }}
163
- />
164
- </>
135
+ <TextInput
136
+ attributes={{
137
+ ...inputProps,
138
+ }}
139
+ id="library-fish-autosuggest"
140
+ labelText="Fish in Animal Crossing"
141
+ name="favoriteFish"
142
+ />
165
143
  );
166
144
  };
167
145
  const onChange = (_: any, { newValue }) => setValue(newValue);
@@ -218,16 +196,14 @@ const searchBarRenderInputComponent = (
218
196
  inputProps: React.HTMLProps<HTMLInputElement>
219
197
  ) => {
220
198
  return (
221
- <Input
222
- type={InputTypes.text}
223
- id="autosuggest-searchBar"
224
- aria-required={true}
225
- ariaLabelledBy="autosuggest-button"
199
+ <TextInput
226
200
  attributes={{
227
- name: "homeLibraryName",
228
- "aria-describedby": "autosuggest-helperText",
229
201
  ...inputProps,
230
202
  }}
203
+ id="autosuggest-searchBar"
204
+ isRequired
205
+ labelText="home library"
206
+ name="homeLibraryName"
231
207
  />
232
208
  );
233
209
  };
@@ -5,10 +5,6 @@
5
5
  width: 100%;
6
6
  }
7
7
 
8
- .react-autosuggest__input {
9
- @extend .input;
10
- }
11
-
12
8
  .react-autosuggest__input--focused {
13
9
  outline: none;
14
10
  }
@@ -28,9 +24,9 @@
28
24
  background-color: var(--nypl-colors-ui-white);
29
25
  display: block;
30
26
  font-weight: 300;
31
- margin-top: -6px; // accounts for the focus ring on the input
27
+ margin-top: 1px; // accounts for the focus ring on the input
32
28
  outline: 1px solid var(--nypl-colors-ui-gray-light-cool);
33
- position: absolute;
29
+ position: relative;
34
30
  width: 100%;
35
31
  z-index: 2;
36
32
  }
@@ -1,19 +1,25 @@
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 Breadcrumbs from "./Breadcrumbs";
11
11
  import { ColorVariants } from "./BreadcrumbsTypes";
12
- import DSProvider from "../../theme/provider";
13
12
  import Heading from "../Heading/Heading";
14
13
  import { HeadingLevels } from "../Heading/HeadingTypes";
15
14
  import Link from "../Link/Link";
16
15
  import { getCategory } from "../../utils/componentCategories";
16
+ import DSProvider from "../../theme/provider";
17
+ import { getStorybookEnumValues } from "../../utils/utils";
18
+
19
+ export const enumValues = getStorybookEnumValues(
20
+ ColorVariants,
21
+ "ColorVariants"
22
+ );
17
23
 
18
24
  <Meta
19
25
  title={getCategory("Breadcrumbs")}
@@ -28,8 +34,13 @@ import { getCategory } from "../../utils/componentCategories";
28
34
  }}
29
35
  argTypes={{
30
36
  additionalStyles: { control: false },
31
- className: { table: { disable: true } },
32
- id: { table: { disable: true } },
37
+ breadcrumbsData: { control: false },
38
+ className: { control: false },
39
+ colorVariant: {
40
+ control: { type: "select" },
41
+ options: enumValues.options,
42
+ },
43
+ id: { control: false },
33
44
  }}
34
45
  />
35
46
 
@@ -38,29 +49,48 @@ import { getCategory } from "../../utils/componentCategories";
38
49
  | Component Version | DS Version |
39
50
  | ----------------- | ---------- |
40
51
  | Added | `0.0.3` |
41
- | Latest | `0.25.8` |
52
+ | Latest | `0.25.10` |
42
53
 
43
54
  <Description of={Breadcrumbs} />
44
55
 
45
- The `Breadcrumbs` component is a navigation element that provides a breadcrumb path that reflects the site structure and allows a user to navigate to any page available in the breadcrumb hierarchy.
56
+ The `Breadcrumbs` component is a navigation element that provides a breadcrumb
57
+ path that reflects the site structure and allows a user to navigate to any page
58
+ available in the breadcrumb hierarchy.
46
59
 
47
60
  <Canvas withToolbar>
48
61
  <Story
49
- name="Breadcrumbs Props"
62
+ name="Breadcrumbs with Controls"
50
63
  args={{
64
+ additionalStyles: undefined,
51
65
  breadcrumbsData: [
52
66
  { url: "#", text: "Parent" },
53
67
  { url: "#", text: "Child" },
54
68
  { url: "#", text: "Grandchild" },
55
69
  ],
56
- id: "init-breadcrumbs",
70
+ className: undefined,
71
+ colorVariant: undefined,
72
+ id: "breadcrumbs-id",
57
73
  }}
58
74
  >
59
- {(args) => <Breadcrumbs {...args} />}
75
+ {(args) => (
76
+ <Breadcrumbs
77
+ {...args}
78
+ colorVariant={enumValues.getValue(args.colorVariant)}
79
+ />
80
+ )}
60
81
  </Story>
61
82
  </Canvas>
62
83
 
63
- <ArgsTable story="Breadcrumbs Props" />
84
+ <ArgsTable story="Breadcrumbs with Controls" />
85
+
86
+ ### Accessibility
87
+
88
+ Only one `Breadcrumbs` component should be rendered on a page. This is because
89
+ only one HTML `<nav>` element with `aria-label` attribute of "Breadcrumbs"
90
+ should be rendered. The DS `Breadcrumbs` component renders this HTML landmark
91
+ so only one component must be rendered on a page.
92
+
93
+ - [W3 Breadcrumbs Practice](https://www.w3.org/TR/wai-aria-practices/examples/breadcrumb/index.html)
64
94
 
65
95
  ### Long Titles
66
96
 
@@ -11,12 +11,27 @@ describe("Breadcrumbs Accessibility", () => {
11
11
  { url: "#string1", text: "string1" },
12
12
  { url: "#string2", text: "string2" },
13
13
  ];
14
+
14
15
  it("passes axe accessibility test", async () => {
15
16
  const { container } = render(
16
17
  <Breadcrumbs breadcrumbsData={breadcrumbsData} />
17
18
  );
18
19
  expect(await axe(container)).toHaveNoViolations();
19
20
  });
21
+
22
+ // This fails because there MUST only be one "breadcrumb" landmark item
23
+ // on a page. This specifically means there should be one `<nav>` element
24
+ // with `aria-label="Breadcrumb"`.
25
+ // https://www.w3.org/TR/wai-aria-practices/examples/breadcrumb/index.html
26
+ it("does not pass axe accessibility test", async () => {
27
+ const { container } = render(
28
+ <>
29
+ <Breadcrumbs breadcrumbsData={breadcrumbsData} />
30
+ <Breadcrumbs breadcrumbsData={breadcrumbsData} />
31
+ </>
32
+ );
33
+ expect(await axe(container)).not.toHaveNoViolations();
34
+ });
20
35
  });
21
36
 
22
37
  describe("Breadcrumbs Snapshot", () => {
@@ -6,8 +6,6 @@ import {
6
6
  useStyleConfig,
7
7
  } from "@chakra-ui/react";
8
8
 
9
- import generateUUID from "../../helpers/generateUUID";
10
- import { ColorVariants } from "./BreadcrumbsTypes";
11
9
  import Icon from "../Icons/Icon";
12
10
  import {
13
11
  IconNames,
@@ -15,6 +13,8 @@ import {
15
13
  IconSizes,
16
14
  IconTypes,
17
15
  } from "../Icons/IconTypes";
16
+ import generateUUID from "../../helpers/generateUUID";
17
+ import { ColorVariants } from "./BreadcrumbsTypes";
18
18
  import { getVariant } from "../../utils/utils";
19
19
 
20
20
  export interface BreadcrumbsDataProps {
@@ -83,9 +83,15 @@ function Breadcrumbs(props: React.PropsWithChildren<BreadcrumbProps>) {
83
83
  const styles = useStyleConfig("Breadcrumb", { variant });
84
84
  const finalStyles = { ...styles, ...additionalStyles };
85
85
  const breadcrumbItems = getElementsFromData(breadcrumbsData, id);
86
+ const ariaAttrs = { "aria-label": "Breadcrumb" };
86
87
 
87
88
  return (
88
- <ChakraBreadcrumb className={className} __css={finalStyles} id={id}>
89
+ <ChakraBreadcrumb
90
+ className={className}
91
+ id={id}
92
+ {...ariaAttrs}
93
+ __css={finalStyles}
94
+ >
89
95
  {breadcrumbItems}
90
96
  </ChakraBreadcrumb>
91
97
  );
@@ -2,7 +2,7 @@
2
2
 
3
3
  exports[`Breadcrumbs Snapshot Renders the UI snapshot correctly 1`] = `
4
4
  <nav
5
- aria-label="breadcrumb"
5
+ aria-label="Breadcrumb"
6
6
  className="chakra-breadcrumb css-0"
7
7
  id="breadcrumbs-test"
8
8
  >
@@ -101,7 +101,7 @@ exports[`Breadcrumbs Snapshot Renders the UI snapshot correctly 1`] = `
101
101
 
102
102
  exports[`Breadcrumbs Snapshot Renders the UI snapshot correctly 2`] = `
103
103
  <nav
104
- aria-label="breadcrumb"
104
+ aria-label="Breadcrumb"
105
105
  className="chakra-breadcrumb css-0"
106
106
  id="breadcrumbs-test"
107
107
  >
@@ -200,7 +200,7 @@ exports[`Breadcrumbs Snapshot Renders the UI snapshot correctly 2`] = `
200
200
 
201
201
  exports[`Breadcrumbs Snapshot Renders the UI snapshot correctly 3`] = `
202
202
  <nav
203
- aria-label="breadcrumb"
203
+ aria-label="Breadcrumb"
204
204
  className="chakra-breadcrumb css-0"
205
205
  id="breadcrumbs-test"
206
206
  >
@@ -299,7 +299,7 @@ exports[`Breadcrumbs Snapshot Renders the UI snapshot correctly 3`] = `
299
299
 
300
300
  exports[`Breadcrumbs Snapshot Renders the UI snapshot correctly 4`] = `
301
301
  <nav
302
- aria-label="breadcrumb"
302
+ aria-label="Breadcrumb"
303
303
  className="chakra-breadcrumb css-0"
304
304
  id="breadcrumbs-test"
305
305
  >
@@ -398,7 +398,7 @@ exports[`Breadcrumbs Snapshot Renders the UI snapshot correctly 4`] = `
398
398
 
399
399
  exports[`Breadcrumbs Snapshot Renders the UI snapshot correctly 5`] = `
400
400
  <nav
401
- aria-label="breadcrumb"
401
+ aria-label="Breadcrumb"
402
402
  className="chakra-breadcrumb css-1f2fw9u"
403
403
  id="breadcrumbs-test"
404
404
  >
@@ -1,14 +1,14 @@
1
+ import { ButtonGroup, VStack } from "@chakra-ui/react";
1
2
  import {
2
- Meta,
3
- Story,
4
- Canvas,
5
3
  ArgsTable,
4
+ Canvas,
6
5
  Description,
7
- } from "@storybook/addon-docs/blocks";
6
+ Meta,
7
+ Story,
8
+ } from "@storybook/addon-docs";
8
9
  import { withDesign } from "storybook-addon-designs";
9
- import { ButtonGroup } from "@chakra-ui/react";
10
10
 
11
- import Button from "./Button";
11
+ import Button, { ButtonElementType } from "./Button";
12
12
  import { ButtonTypes } from "./ButtonTypes";
13
13
  import Icon from "../Icons/Icon";
14
14
  import {
@@ -17,9 +17,11 @@ import {
17
17
  IconRotationTypes,
18
18
  IconSizes,
19
19
  } from "../Icons/IconTypes";
20
- import getCSSVariable from "../../helpers/getCSSVariable";
21
20
  import { getCategory } from "../../utils/componentCategories";
22
21
  import DSProvider from "../../theme/provider";
22
+ import { getStorybookEnumValues } from "../../utils/utils";
23
+
24
+ export const enumValues = getStorybookEnumValues(ButtonTypes, "ButtonTypes");
23
25
 
24
26
  <Meta
25
27
  title={getCategory("Button")}
@@ -32,6 +34,30 @@ import DSProvider from "../../theme/provider";
32
34
  },
33
35
  jest: ["Button.test.tsx"],
34
36
  }}
37
+ argTypes={{
38
+ additionalStyles: { control: false },
39
+ attributes: { control: false },
40
+ buttonText: { description: "Only used for Storybook" },
41
+ buttonType: {
42
+ control: { type: "select" },
43
+ table: { defaultValue: { summary: "ButtonType.Primary" } },
44
+ options: enumValues.options,
45
+ },
46
+ className: { control: false },
47
+ displayIcon: { description: "Only used for Storybook." },
48
+ displayIconLeft: {
49
+ description: "Move the icon left or right. Only used for Storybook.",
50
+ },
51
+ iconType: {
52
+ control: { type: "select" },
53
+ options: Object.values(IconNames).map((value) => value),
54
+ description: "Select the icon. Only used for Storybook.",
55
+ },
56
+ id: { control: false },
57
+ isDisabled: { table: { defaultValue: { summary: false } } },
58
+ mouseDown: { table: { defaultValue: { summary: false } } },
59
+ onClick: { control: false },
60
+ }}
35
61
  />
36
62
 
37
63
  # Button
@@ -39,7 +65,7 @@ import DSProvider from "../../theme/provider";
39
65
  | Component Version | DS Version |
40
66
  | ----------------- | ---------- |
41
67
  | Added | `0.0.4` |
42
- | Latest | `0.25.4` |
68
+ | Latest | `0.25.9` |
43
69
 
44
70
  <Description of={Button} />
45
71
 
@@ -51,7 +77,6 @@ that can be rendered.
51
77
  - `ButtonTypes.Callout` is used for call to action text such as "Donate".
52
78
  - `ButtonTypes.Pill` is used for equally weighted actions within cards and always in a set.
53
79
  - `ButtonTypes.Link` is used for equally weighted actions in a text based list.
54
- - `ButtonTypes.SearchBar` is a variant only used in the `SearchBar` component.
55
80
  - `ButtonTypes.NoBrand` is a variant used when there is no brand and will display
56
81
  the background color as black.
57
82
 
@@ -59,16 +84,53 @@ When one and only one `Icon` component is passed inside a `Button` component wit
59
84
  no text, it will automatically be configured to use the `"iconOnly"` type.
60
85
 
61
86
  <Canvas withToolbar>
62
- <Story name="Basic">{(args) => <Button {...args}>Button Text</Button>}</Story>
87
+ <Story
88
+ name="Button with Controls"
89
+ args={{
90
+ additionalStyles: undefined,
91
+ attributes: undefined,
92
+ buttonText: "Button Text",
93
+ buttonType: "ButtonTypes.Primary",
94
+ className: undefined,
95
+ displayIcon: false,
96
+ displayIconLeft: true,
97
+ iconType: IconNames.Search,
98
+ id: "button-id",
99
+ isDisabled: false,
100
+ mouseDown: undefined,
101
+ onClick: undefined,
102
+ type: "button",
103
+ }}
104
+ >
105
+ {(args) => (
106
+ <Button {...args} buttonType={enumValues.getValue(args.buttonType)}>
107
+ {args.displayIcon && args.displayIconLeft && (
108
+ <Icon
109
+ name={args.iconType}
110
+ align={IconAlign.Left}
111
+ size={IconSizes.Small}
112
+ />
113
+ )}
114
+ {args.buttonText}
115
+ {args.displayIcon && !args.displayIconLeft && (
116
+ <Icon
117
+ name={args.iconType}
118
+ align={IconAlign.Right}
119
+ size={IconSizes.Small}
120
+ />
121
+ )}
122
+ </Button>
123
+ )}
124
+ </Story>
63
125
  </Canvas>
64
126
 
65
- <ArgsTable story="Basic" />
127
+ <ArgsTable story="Button with Controls" />
66
128
 
67
129
  ## Button Groups
68
130
 
69
131
  Primary and secondary buttons should be grouped like in the following example.
70
132
  The `ButtonGroup` component, which is directly exported from Chakra UI, should
71
- be used to wrap the `Button` cmoponent.
133
+ be used to wrap the `Button` component.
72
134
 
73
135
  <Canvas>
74
136
  <Story name="Button Groups">
@@ -83,45 +145,28 @@ be used to wrap the `Button` cmoponent.
83
145
 
84
146
  The `Icon` component collaborates great with the `Button` component. Check out
85
147
  [`src/components/Icons/IconTypes`](https://github.com/NYPL/nypl-design-system/blob/development/src/components/Icons/IconTypes.tsx)
86
- to see the full list of icon and logo names that can be rendered. Use the
87
- Controls for this Story section to preview a `Button` with the selected icon.
148
+ to see the full list of icon and logo names that can be rendered.
88
149
 
89
150
  <Canvas>
90
- <Story
91
- name="With Icon"
92
- args={{
93
- displayLeft: true,
94
- buttonText: "Button Text",
95
- iconType: IconNames.Search,
96
- }}
97
- argTypes={{
98
- iconType: {
99
- control: {
100
- type: "select",
101
- },
102
- options: Object.values(IconNames).map((value) => value),
103
- },
104
- }}
105
- >
106
- {(args) => (
107
- <Button {...args}>
108
- {args.displayLeft && (
109
- <Icon
110
- name={args.iconType}
111
- align={IconAlign.Left}
112
- size={IconSizes.Small}
113
- />
114
- )}
115
- {args.buttonText}
116
- {!args.displayLeft && (
117
- <Icon
118
- name={args.iconType}
119
- align={IconAlign.Right}
120
- size={IconSizes.Small}
121
- />
122
- )}
151
+ <Story name="With Icon">
152
+ <VStack align="left" width="150px">
153
+ <Button>
154
+ <Icon
155
+ name={IconNames.Search}
156
+ align={IconAlign.Left}
157
+ size={IconSizes.Small}
158
+ />
159
+ Button Text
123
160
  </Button>
124
- )}
161
+ <Button>
162
+ Button Text
163
+ <Icon
164
+ name={IconNames.Search}
165
+ align={IconAlign.Right}
166
+ size={IconSizes.Small}
167
+ />
168
+ </Button>
169
+ </VStack>
125
170
  </Story>
126
171
  </Canvas>
127
172
 
@@ -150,17 +150,6 @@ describe("Button Snapshot", () => {
150
150
  </Button>
151
151
  )
152
152
  .toJSON();
153
- const searchBar = renderer
154
- .create(
155
- <Button
156
- id="button"
157
- onClick={jest.fn()}
158
- buttonType={ButtonTypes.SearchBar}
159
- >
160
- SearchBar
161
- </Button>
162
- )
163
- .toJSON();
164
153
  const noBrand = renderer
165
154
  .create(
166
155
  <Button
@@ -179,7 +168,6 @@ describe("Button Snapshot", () => {
179
168
  expect(callout).toMatchSnapshot();
180
169
  expect(pill).toMatchSnapshot();
181
170
  expect(link).toMatchSnapshot();
182
- expect(searchBar).toMatchSnapshot();
183
171
  expect(noBrand).toMatchSnapshot();
184
172
  });
185
173
  });
@@ -6,25 +6,25 @@ import Icon from "../Icons/Icon";
6
6
  import { getVariant } from "../../utils/utils";
7
7
  import generateUUID from "../../helpers/generateUUID";
8
8
 
9
- type ButtonElementType = "submit" | "button" | "reset";
9
+ export type ButtonElementType = "submit" | "button" | "reset";
10
10
 
11
11
  interface ButtonProps {
12
12
  /** Optionally pass in additional Chakra-based styles. */
13
13
  additionalStyles?: { [key: string]: any };
14
- /** Additional attributes passed to the button */
14
+ /** Additional attributes passed to the button. */
15
15
  attributes?: { [key: string]: any };
16
- /** The kind of button assigned through the `ButtonTypes` enum */
16
+ /** The kind of button assigned through the `ButtonTypes` enum. */
17
17
  buttonType?: ButtonTypes;
18
18
  /** Additional className to use. */
19
19
  className?: string;
20
- /** ID that other components can cross reference for accessibility purposes */
20
+ /** ID that other components can cross reference for accessibility purposes. */
21
21
  id?: string;
22
- /** Adds 'disabled' property to the button */
22
+ /** Adds 'disabled' property to the button. */
23
23
  isDisabled?: boolean;
24
24
  /** Trigger the Button's action through the `mouseDown` event handler instead
25
25
  * of `onClick`. `false` by default. */
26
26
  mouseDown?: boolean;
27
- /** The action to perform on the `<button>`'s onClick function */
27
+ /** The action to perform on the `<button>`'s onClick function. */
28
28
  onClick?: (event: React.MouseEvent | React.KeyboardEvent) => void;
29
29
  /** The HTML button type attribute. */
30
30
  type?: ButtonElementType;
@@ -40,8 +40,8 @@ function Button(props: React.PropsWithChildren<ButtonProps>) {
40
40
  buttonType,
41
41
  children,
42
42
  className = "",
43
- isDisabled,
44
43
  id = generateUUID(),
44
+ isDisabled = false,
45
45
  mouseDown = false,
46
46
  onClick,
47
47
  type = "button",
@@ -4,6 +4,5 @@ export enum ButtonTypes {
4
4
  Callout = "callout",
5
5
  Pill = "pill",
6
6
  Link = "link",
7
- SearchBar = "searchBar",
8
7
  NoBrand = "noBrand",
9
8
  }
@@ -74,18 +74,6 @@ exports[`Button Snapshot Renders the UI snapshot correctly 6`] = `
74
74
  `;
75
75
 
76
76
  exports[`Button Snapshot Renders the UI snapshot correctly 7`] = `
77
- <button
78
- className="chakra-button css-0"
79
- data-testid="button"
80
- id="button"
81
- onClick={[MockFunction]}
82
- type="button"
83
- >
84
- SearchBar
85
- </button>
86
- `;
87
-
88
- exports[`Button Snapshot Renders the UI snapshot correctly 8`] = `
89
77
  <button
90
78
  className="chakra-button css-0"
91
79
  data-testid="button"