@nypl/design-system-react-components 0.25.2 → 0.25.6

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 (238) hide show
  1. package/CHANGELOG.md +101 -0
  2. package/README.md +47 -11
  3. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +4 -0
  4. package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +1 -0
  5. package/dist/components/Button/Button.d.ts +9 -8
  6. package/dist/components/Button/ButtonTypes.d.ts +2 -1
  7. package/dist/components/Card/Card.d.ts +36 -52
  8. package/dist/components/Card/CardTypes.d.ts +0 -15
  9. package/dist/components/Checkbox/Checkbox.d.ts +8 -9
  10. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +2 -2
  11. package/dist/components/DatePicker/DatePicker.d.ts +36 -36
  12. package/dist/components/Fieldset/Fieldset.d.ts +25 -0
  13. package/dist/components/HelperErrorText/HelperErrorText.d.ts +4 -0
  14. package/dist/components/HorizontalRule/HorizontalRule.d.ts +10 -3
  15. package/dist/components/Icons/Icon.d.ts +4 -0
  16. package/dist/components/Icons/IconSvgs.d.ts +11 -0
  17. package/dist/components/Icons/IconTypes.d.ts +11 -0
  18. package/dist/components/Image/Image.d.ts +19 -9
  19. package/dist/components/Image/ImageTypes.d.ts +20 -0
  20. package/dist/components/Link/Link.d.ts +4 -0
  21. package/dist/components/List/List.d.ts +7 -1
  22. package/dist/components/Notification/Notification.d.ts +6 -4
  23. package/dist/components/Pagination/Pagination.d.ts +16 -13
  24. package/dist/components/Pagination/Pagination.stories.d.ts +2 -0
  25. package/dist/components/ProgressIndicator/ProgressIndicator.d.ts +29 -0
  26. package/dist/components/ProgressIndicator/ProgressIndicatorTypes.d.ts +8 -0
  27. package/dist/components/RadioGroup/RadioGroup.d.ts +2 -2
  28. package/dist/components/SearchBar/SearchBar.d.ts +3 -3
  29. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +18 -14
  30. package/dist/components/Slider/Slider.d.ts +57 -0
  31. package/dist/components/Tabs/Tabs.d.ts +1 -1
  32. package/dist/components/TextInput/TextInput.d.ts +10 -0
  33. package/dist/design-system-react-components.cjs.development.js +3058 -936
  34. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  35. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  36. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  37. package/dist/design-system-react-components.esm.js +3049 -921
  38. package/dist/design-system-react-components.esm.js.map +1 -1
  39. package/dist/index.d.ts +12 -6
  40. package/dist/resources.scss +180 -170
  41. package/dist/styles.css +1 -1
  42. package/dist/theme/components/breadcrumb.d.ts +9 -0
  43. package/dist/theme/components/button.d.ts +22 -8
  44. package/dist/theme/components/card.d.ts +168 -0
  45. package/dist/theme/components/checkbox.d.ts +5 -1
  46. package/dist/theme/components/checkboxGroup.d.ts +12 -0
  47. package/dist/theme/components/datePicker.d.ts +16 -0
  48. package/dist/theme/components/fieldset.d.ts +27 -0
  49. package/dist/theme/components/global.d.ts +23 -13
  50. package/dist/theme/components/globalMixins.d.ts +9 -1
  51. package/dist/theme/components/heading.d.ts +5 -0
  52. package/dist/theme/components/image.d.ts +31 -0
  53. package/dist/theme/components/label.d.ts +5 -3
  54. package/dist/theme/components/link.d.ts +4 -0
  55. package/dist/theme/components/list.d.ts +5 -1
  56. package/dist/theme/components/notification.d.ts +4 -14
  57. package/dist/theme/components/pagination.d.ts +19 -0
  58. package/dist/theme/components/progressIndicator.d.ts +50 -0
  59. package/dist/theme/components/radioGroup.d.ts +12 -0
  60. package/dist/theme/components/select.d.ts +11 -2
  61. package/dist/theme/components/skeletonLoader.d.ts +98 -0
  62. package/dist/theme/components/slider.d.ts +51 -0
  63. package/dist/theme/components/textInput.d.ts +8 -0
  64. package/dist/theme/foundations/breakpoints.d.ts +8 -8
  65. package/dist/theme/foundations/global.d.ts +6 -1
  66. package/package.json +72 -84
  67. package/src/__tests__/setup.ts +2 -2
  68. package/src/components/Accordion/Accordion.stories.mdx +39 -42
  69. package/src/components/Autosuggest/Autosuggest.stories.mdx +3 -3
  70. package/src/components/Autosuggest/Autosuggest.stories.tsx +1 -0
  71. package/src/components/Autosuggest/_Autosuggest.scss +5 -5
  72. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +24 -8
  73. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +33 -0
  74. package/src/components/Breadcrumbs/Breadcrumbs.tsx +5 -1
  75. package/src/components/Breadcrumbs/BreadcrumbsTypes.tsx +1 -0
  76. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +298 -1
  77. package/src/components/Button/Button.stories.mdx +15 -10
  78. package/src/components/Button/Button.test.tsx +21 -7
  79. package/src/components/Button/Button.tsx +18 -33
  80. package/src/components/Button/ButtonTypes.tsx +1 -0
  81. package/src/components/Button/__snapshots__/Button.test.tsx.snap +41 -10
  82. package/src/components/Card/Card.stories.mdx +296 -259
  83. package/src/components/Card/Card.test.tsx +156 -84
  84. package/src/components/Card/Card.tsx +195 -145
  85. package/src/components/Card/CardTypes.tsx +0 -17
  86. package/src/components/Card/__snapshots__/Card.test.tsx.snap +410 -0
  87. package/src/components/CardEdition/CardEdition.stories.tsx +15 -47
  88. package/src/components/CardEdition/_CardEdition.scss +22 -23
  89. package/src/components/Chakra/Box.stories.mdx +14 -15
  90. package/src/components/Chakra/Center.stories.mdx +15 -8
  91. package/src/components/Chakra/Grid.stories.mdx +16 -7
  92. package/src/components/Chakra/Stack.stories.mdx +35 -18
  93. package/src/components/Checkbox/Checkbox.stories.mdx +33 -11
  94. package/src/components/Checkbox/Checkbox.test.tsx +30 -3
  95. package/src/components/Checkbox/Checkbox.tsx +27 -27
  96. package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +90 -2
  97. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +82 -2
  98. package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +1 -1
  99. package/src/components/CheckboxGroup/CheckboxGroup.tsx +14 -15
  100. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +44 -80
  101. package/src/components/DatePicker/DatePicker.stories.mdx +163 -62
  102. package/src/components/DatePicker/DatePicker.test.tsx +248 -65
  103. package/src/components/DatePicker/DatePicker.tsx +158 -130
  104. package/src/components/DatePicker/_DatePicker.scss +33 -67
  105. package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +818 -0
  106. package/src/components/Fieldset/Fieldset.stories.mdx +55 -0
  107. package/src/components/Fieldset/Fieldset.test.tsx +125 -0
  108. package/src/components/Fieldset/Fieldset.tsx +52 -0
  109. package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +68 -0
  110. package/src/components/Form/Form.stories.mdx +4 -5
  111. package/src/components/Form/Form.tsx +1 -0
  112. package/src/components/Grid/SimpleGrid.stories.mdx +32 -39
  113. package/src/components/Grid/SimpleGrid.test.tsx +4 -4
  114. package/src/components/Heading/Heading.stories.mdx +3 -4
  115. package/src/components/HelperErrorText/HelperErrorText.stories.mdx +1 -1
  116. package/src/components/HelperErrorText/HelperErrorText.tsx +5 -1
  117. package/src/components/Hero/HeroTypes.tsx +1 -0
  118. package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +7 -7
  119. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +6 -5
  120. package/src/components/HorizontalRule/HorizontalRule.test.tsx +17 -0
  121. package/src/components/HorizontalRule/HorizontalRule.tsx +21 -4
  122. package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +5 -5
  123. package/src/components/Icons/Icon.stories.mdx +11 -3
  124. package/src/components/Icons/Icon.test.tsx +18 -0
  125. package/src/components/Icons/Icon.tsx +6 -0
  126. package/src/components/Icons/IconSvgs.tsx +22 -0
  127. package/src/components/Icons/IconTypes.tsx +11 -0
  128. package/src/components/Image/Image.stories.mdx +220 -0
  129. package/src/components/Image/Image.test.tsx +131 -29
  130. package/src/components/Image/Image.tsx +84 -56
  131. package/src/components/Image/ImageTypes.ts +22 -0
  132. package/src/components/Image/__snapshots__/Image.test.tsx.snap +190 -0
  133. package/src/components/Input/Input.stories.tsx +20 -64
  134. package/src/components/Input/_Input.scss +23 -14
  135. package/src/components/Link/Link.tsx +4 -1
  136. package/src/components/List/List.stories.mdx +1 -1
  137. package/src/components/List/List.tsx +11 -4
  138. package/src/components/Modal/Modal.stories.mdx +3 -3
  139. package/src/components/Modal/_Modal.scss +2 -2
  140. package/src/components/Notification/Notification.stories.mdx +1 -3
  141. package/src/components/Notification/Notification.tsx +24 -9
  142. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +2 -0
  143. package/src/components/Pagination/Pagination.stories.mdx +26 -27
  144. package/src/components/Pagination/Pagination.stories.tsx +11 -16
  145. package/src/components/Pagination/Pagination.test.tsx +276 -146
  146. package/src/components/Pagination/Pagination.tsx +174 -154
  147. package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +285 -0
  148. package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +292 -0
  149. package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +225 -0
  150. package/src/components/ProgressIndicator/ProgressIndicator.tsx +126 -0
  151. package/src/components/ProgressIndicator/ProgressIndicatorTypes.ts +8 -0
  152. package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +357 -0
  153. package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +3 -0
  154. package/src/components/RadioGroup/RadioGroup.stories.mdx +3 -4
  155. package/src/components/RadioGroup/RadioGroup.tsx +11 -16
  156. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +39 -71
  157. package/src/components/SearchBar/SearchBar.Test.tsx +66 -21
  158. package/src/components/SearchBar/SearchBar.stories.mdx +114 -10
  159. package/src/components/SearchBar/SearchBar.tsx +15 -5
  160. package/src/components/Select/SelectTypes.tsx +1 -0
  161. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +28 -59
  162. package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +97 -177
  163. package/src/components/SkeletonLoader/SkeletonLoader.tsx +74 -71
  164. package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +739 -0
  165. package/src/components/Slider/Slider.stories.mdx +529 -0
  166. package/src/components/Slider/Slider.test.tsx +653 -0
  167. package/src/components/Slider/Slider.tsx +303 -0
  168. package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +1946 -0
  169. package/src/components/StyleGuide/Bidirectionality.stories.mdx +1 -1
  170. package/src/components/StyleGuide/Breakpoints.stories.mdx +21 -7
  171. package/src/components/StyleGuide/Buttons.stories.mdx +69 -15
  172. package/src/components/StyleGuide/ColorCard.tsx +0 -1
  173. package/src/components/StyleGuide/DesignTokens.stories.mdx +170 -0
  174. package/src/components/StyleGuide/Iconography.stories.mdx +51 -62
  175. package/src/components/Tabs/Tabs.tsx +5 -5
  176. package/src/components/Template/Template.stories.mdx +11 -16
  177. package/src/components/TextInput/TextInput.stories.mdx +1 -1
  178. package/src/components/TextInput/TextInput.tsx +23 -6
  179. package/src/components/TextInput/TextInputTypes.tsx +2 -0
  180. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +2 -3
  181. package/src/docs/Chakra.stories.mdx +2 -2
  182. package/src/index.ts +20 -12
  183. package/src/resources.scss +5 -5
  184. package/src/styles/base/{_02-breakpoints.scss → _01-breakpoints.scss} +9 -10
  185. package/src/styles/base/{_03-mixins.scss → _02-mixins.scss} +16 -5
  186. package/src/styles/base/{_04-base.scss → _03-base.scss} +7 -2
  187. package/src/styles/base/{_05-focus.scss → _04-focus.scss} +0 -15
  188. package/src/styles/base/_place-holder.scss +14 -3
  189. package/src/styles/{03-space → space}/_space-inline.scss +14 -14
  190. package/src/styles/{03-space → space}/_space-inset.scss +10 -10
  191. package/src/styles/space/_space-stack.scss +116 -0
  192. package/src/styles.scss +13 -55
  193. package/src/theme/components/breadcrumb.ts +10 -0
  194. package/src/theme/components/button.ts +18 -12
  195. package/src/theme/components/card.ts +174 -0
  196. package/src/theme/components/checkbox.ts +7 -2
  197. package/src/theme/components/checkboxGroup.ts +8 -0
  198. package/src/theme/components/datePicker.ts +17 -0
  199. package/src/theme/components/fieldset.ts +18 -0
  200. package/src/theme/components/global.ts +26 -15
  201. package/src/theme/components/globalMixins.ts +9 -1
  202. package/src/theme/components/heading.ts +5 -0
  203. package/src/theme/components/image.ts +116 -0
  204. package/src/theme/components/label.ts +3 -10
  205. package/src/theme/components/link.ts +4 -0
  206. package/src/theme/components/list.ts +6 -3
  207. package/src/theme/components/notification.ts +12 -14
  208. package/src/theme/components/pagination.ts +20 -0
  209. package/src/theme/components/progressIndicator.ts +62 -0
  210. package/src/theme/components/radioGroup.ts +8 -0
  211. package/src/theme/components/select.ts +5 -2
  212. package/src/theme/components/skeletonLoader.ts +107 -0
  213. package/src/theme/components/slider.ts +79 -0
  214. package/src/theme/components/textInput.ts +2 -0
  215. package/src/theme/foundations/breakpoints.ts +8 -8
  216. package/src/theme/foundations/global.ts +6 -1
  217. package/src/theme/index.ts +22 -4
  218. package/src/utils/componentCategories.ts +4 -3
  219. package/dist/components/Image/Image.stories.d.ts +0 -18
  220. package/dist/theme/components/customCheckboxGroup.d.ts +0 -18
  221. package/dist/theme/components/customRadioGroup.d.ts +0 -18
  222. package/src/components/Button/_Button.scss +0 -32
  223. package/src/components/Card/_Card.scss +0 -308
  224. package/src/components/Image/Image.stories.tsx +0 -54
  225. package/src/components/Image/_Image.scss +0 -38
  226. package/src/components/Pagination/_Pagination.scss +0 -40
  227. package/src/components/SkeletonLoader/_SkeletonLoader.scss +0 -142
  228. package/src/styles/01-colors/_colors-brand.scss +0 -62
  229. package/src/styles/01-colors/_colors-utility.scss +0 -67
  230. package/src/styles/02-typography/_type-scale.css +0 -11
  231. package/src/styles/02-typography/_type-weight.css +0 -7
  232. package/src/styles/02-typography/_typefaces.css +0 -4
  233. package/src/styles/03-space/_space-stack.scss +0 -116
  234. package/src/styles/03-space/_space.css +0 -30
  235. package/src/styles/base/_card-grid.scss +0 -77
  236. package/src/styles/base/_typography.scss +0 -11
  237. package/src/theme/components/customCheckboxGroup.ts +0 -12
  238. package/src/theme/components/customRadioGroup.ts +0 -12
@@ -50,7 +50,7 @@ exports[`Hero Renders the UI snapshot correctly 2`] = `
50
50
  >
51
51
  <img
52
52
  alt="Image example"
53
- className="image "
53
+ className="css-0"
54
54
  src="https://placeimg.com/800/400/animals"
55
55
  />
56
56
  <h1
@@ -82,7 +82,7 @@ exports[`Hero Renders the UI snapshot correctly 3`] = `
82
82
  >
83
83
  <img
84
84
  alt="Image example"
85
- className="image "
85
+ className="css-0"
86
86
  src="https://placeimg.com/800/400/animals"
87
87
  />
88
88
  <h1
@@ -114,7 +114,7 @@ exports[`Hero Renders the UI snapshot correctly 4`] = `
114
114
  >
115
115
  <img
116
116
  alt="Image example"
117
- className="image "
117
+ className="css-0"
118
118
  src="https://placeimg.com/800/400/animals"
119
119
  />
120
120
  <h1
@@ -146,7 +146,7 @@ exports[`Hero Renders the UI snapshot correctly 5`] = `
146
146
  >
147
147
  <img
148
148
  alt="Image example"
149
- className="image "
149
+ className="css-0"
150
150
  src="https://placeimg.com/800/400/animals"
151
151
  />
152
152
  <h1
@@ -178,7 +178,7 @@ exports[`Hero Renders the UI snapshot correctly 6`] = `
178
178
  >
179
179
  <img
180
180
  alt="Image example"
181
- className="image "
181
+ className="css-0"
182
182
  src="https://placeimg.com/800/400/animals"
183
183
  />
184
184
  <h1
@@ -253,7 +253,7 @@ exports[`Hero Renders the UI snapshot correctly 8`] = `
253
253
  >
254
254
  <img
255
255
  alt="Image example"
256
- className="image "
256
+ className="css-0"
257
257
  src="https://placeimg.com/800/400/animals"
258
258
  />
259
259
  <div
@@ -294,7 +294,7 @@ exports[`Hero Renders the UI snapshot correctly 9`] = `
294
294
  >
295
295
  <img
296
296
  alt="Image example"
297
- className="image "
297
+ className="css-0"
298
298
  src="https://placeimg.com/800/400/animals"
299
299
  />
300
300
  <div
@@ -3,7 +3,6 @@ import {
3
3
  Story,
4
4
  Canvas,
5
5
  ArgsTable,
6
- Preview,
7
6
  Description,
8
7
  } from "@storybook/addon-docs/blocks";
9
8
  import { withDesign } from "storybook-addon-designs";
@@ -34,15 +33,17 @@ import { getCategory } from "../../utils/componentCategories";
34
33
  | Component Version | DS Version |
35
34
  | ----------------- | ---------- |
36
35
  | Added | `0.23.0` |
37
- | Latest | `0.25.2` |
36
+ | Latest | `0.25.3` |
38
37
 
39
38
  <Description of={HorizontalRule} />
40
39
 
41
40
  The `HorizontalRule` component renders a basic `<hr>` element. The `height`,
42
- `width`, and `align` props can be customized.
41
+ `width`, and `align` props can be customized. For the `height` prop, use a whole
42
+ number, a `px` value, a `em` value, or a `rem` value. Otherwise, the default
43
+ value of "2px" will be used.
43
44
 
44
- <Preview withToolbar>
45
+ <Canvas withToolbar>
45
46
  <Story name="HorizontalRule">{(args) => <HorizontalRule {...args} />}</Story>
46
- </Preview>
47
+ </Canvas>
47
48
 
48
49
  <ArgsTable story="HorizontalRule" />
@@ -24,6 +24,23 @@ describe("HorizontalRule", () => {
24
24
  expect(hrClass).toContain("custom-hr");
25
25
  });
26
26
 
27
+ it("renders with proper custom class", () => {
28
+ const warn = jest.spyOn(console, "warn");
29
+ const { rerender } = render(
30
+ <HorizontalRule className="custom-hr" height="20px" />
31
+ );
32
+ expect(warn).not.toHaveBeenCalledWith(
33
+ "`HorizontalRule`: For the `height` prop, use a whole number, a `px` " +
34
+ "value, a `em` value, or a `rem` value. Using the default of 2px."
35
+ );
36
+
37
+ rerender(<HorizontalRule className="custom-hr" height="20%" />);
38
+ expect(warn).toHaveBeenCalledWith(
39
+ "`HorizontalRule`: For the `height` prop, use a whole number, a `px` " +
40
+ "value, a `em` value, or a `rem` value. Using the default of 2px."
41
+ );
42
+ });
43
+
27
44
  it("renders the UI snapshot correctly", () => {
28
45
  const basic = renderer.create(<HorizontalRule />).toJSON();
29
46
  const updatedHeight = renderer
@@ -3,13 +3,20 @@ import * as React from "react";
3
3
  import { Box, useStyleConfig } from "@chakra-ui/react";
4
4
 
5
5
  export interface HorizontalRuleProps {
6
- /** Optional alignment value to align the horizontal rule to one side or the other when the width is less than 100%. If omitted, the horizobntal rule will have a default center alignment. */
6
+ /** Optional alignment value to align the horizontal rule to one side or the
7
+ * other when the width is less than 100%. If omitted, the horizontal rule
8
+ * will have a default center alignment. */
7
9
  align?: "left" | "right";
8
10
  /** ClassName you can add in addition to `horizontal-rule` */
9
11
  className?: string;
10
- /** Optional height value. This value should be entered with the same formatting as a CSS height attribute (ex. `2%`, `5px`, `1.5rem`). If omitted, the horizobntal rule will have a default height of 2px. */
12
+ /** Optional height value. This value should be entered with the same
13
+ * formatting as a CSS height attribute except for percent values (ex. `2`,
14
+ * `5px`, `1.5rem`). If this prop is omitted or a percent value is used, the
15
+ * horizontal rule will have a default height of 2px. */
11
16
  height?: string;
12
- /** Optional width value. This value should be entered with the same formatting as a CSS width attribute (ex. `50%`, `640px`, `20rem`). If omitted, the horizobntal rule will have a default width of 100%. */
17
+ /** Optional width value. This value should be entered with the same
18
+ * formatting as a CSS width attribute (ex. `50%`, `640px`, `20rem`). If
19
+ * omitted, the horizontal rule will have a default width of "auto". */
13
20
  width?: string;
14
21
  }
15
22
 
@@ -18,10 +25,20 @@ export default function HorizontalRule(
18
25
  ) {
19
26
  const { align, className, height = "2px", width = "auto" } = props;
20
27
  const styles = useStyleConfig("HorizontalRule", { align });
28
+ let finalHeight = height;
29
+
30
+ if (height.endsWith("%")) {
31
+ console.warn(
32
+ "`HorizontalRule`: For the `height` prop, use a whole number, a `px`" +
33
+ " value, a `em` value, or a `rem` value. Using the default of 2px."
34
+ );
35
+ finalHeight = "2px";
36
+ }
37
+
21
38
  const finalStyles = {
22
39
  ...styles,
40
+ height: finalHeight,
23
41
  width,
24
- height,
25
42
  };
26
43
 
27
44
  return <Box as="hr" className={className} __css={finalStyles} />;
@@ -2,30 +2,30 @@
2
2
 
3
3
  exports[`HorizontalRule renders the UI snapshot correctly 1`] = `
4
4
  <hr
5
- className="css-14epzr5"
5
+ className="css-ili6fu"
6
6
  />
7
7
  `;
8
8
 
9
9
  exports[`HorizontalRule renders the UI snapshot correctly 2`] = `
10
10
  <hr
11
- className="css-21umwa"
11
+ className="css-1pwp4fu"
12
12
  />
13
13
  `;
14
14
 
15
15
  exports[`HorizontalRule renders the UI snapshot correctly 3`] = `
16
16
  <hr
17
- className="css-bbdxhg"
17
+ className="css-gj8znx"
18
18
  />
19
19
  `;
20
20
 
21
21
  exports[`HorizontalRule renders the UI snapshot correctly 4`] = `
22
22
  <hr
23
- className="css-14epzr5"
23
+ className="css-ili6fu"
24
24
  />
25
25
  `;
26
26
 
27
27
  exports[`HorizontalRule renders the UI snapshot correctly 5`] = `
28
28
  <hr
29
- className="css-14epzr5"
29
+ className="css-ili6fu"
30
30
  />
31
31
  `;
@@ -28,8 +28,7 @@ import { getCategory } from "../../utils/componentCategories";
28
28
  parameters={{
29
29
  design: {
30
30
  type: "figma",
31
- url:
32
- "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=10734%3A3945",
31
+ url: "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=10734%3A3945",
33
32
  },
34
33
  jest: ["Icon.test.tsx"],
35
34
  }}
@@ -45,7 +44,7 @@ import { getCategory } from "../../utils/componentCategories";
45
44
  | Component Version | DS Version |
46
45
  | ----------------- | ---------- |
47
46
  | Added | `0.0.4` |
48
- | Latest | `0.25.1` |
47
+ | Latest | `0.25.4` |
49
48
 
50
49
  <Description of={Icon} />
51
50
 
@@ -100,6 +99,7 @@ import { getCategory } from "../../utils/componentCategories";
100
99
  iconRotation={IconRotationTypes[args.iconRotation]}
101
100
  name={IconNames[args.name]}
102
101
  size={IconSizes[args.size]}
102
+ title={args.title}
103
103
  />
104
104
  )}
105
105
  </Story>
@@ -186,6 +186,14 @@ export const allIconsType = (list) => (
186
186
  <ul style={{ listStyle: "none" }}>{list}</ul>
187
187
  );
188
188
 
189
+ ## Accessibility
190
+
191
+ For accessibility purposes, every DS `Icon` will render the `svg` element with
192
+ its icon name in the `title` element. The default text in the `title` element
193
+ is the icon's code name. Pass in better descriptive text in the `title` prop
194
+ when using the `Icon` component in your application. This will give screenreaders
195
+ a better descriptive title for the `svg` graphic.
196
+
189
197
  ## Rotation Types
190
198
 
191
199
  Passing an `iconRotation` prop with a value from `IconRotationTypes` allows
@@ -44,6 +44,24 @@ describe("Icon", () => {
44
44
  expect(container.querySelector("svg")).toBeInTheDocument();
45
45
  });
46
46
 
47
+ // NOTE: the svg icon is dynamically generated by the "svgr" package. At build
48
+ // time, it generate the `title` element but it doesn't generate it for tests.
49
+ // In order to test this, we can check the `title` attribute in the svg
50
+ // element itself. Inspect the `Icon` in Storybook to see the `title` element.
51
+ it("renders a title element", () => {
52
+ const { container, rerender } = render(<Icon name={IconNames.Download} />);
53
+ expect(container.querySelector("svg")).toHaveAttribute(
54
+ "title",
55
+ "download icon"
56
+ );
57
+
58
+ rerender(<Icon name={IconNames.Download} title="title content" />);
59
+ expect(container.querySelector("svg")).toHaveAttribute(
60
+ "title",
61
+ "title content"
62
+ );
63
+ });
64
+
47
65
  it("renders an icon based on the child", () => {
48
66
  const { container } = render(
49
67
  <Icon>
@@ -33,6 +33,10 @@ export interface IconProps {
33
33
  name?: IconNames | LogoNames;
34
34
  /** Sets the icon size. */
35
35
  size?: IconSizes;
36
+ /** For accessibility purposes, the text passed in the `title` prop gets
37
+ * rendered in a `title` element in the SVG. This descriptive text is not
38
+ * visible but is needed for screenreaders to describe the graphic. */
39
+ title?: string;
36
40
  /** Sets the icon variant type. */
37
41
  type?: IconTypes;
38
42
  }
@@ -52,6 +56,7 @@ export default function Icon(props: React.PropsWithChildren<IconProps>) {
52
56
  id = generateUUID(),
53
57
  name,
54
58
  size = IconSizes.Medium,
59
+ title = `${name} icon`,
55
60
  type = IconTypes.Default,
56
61
  } = props;
57
62
  const styles = useStyleConfig("Icon", {
@@ -66,6 +71,7 @@ export default function Icon(props: React.PropsWithChildren<IconProps>) {
66
71
  className,
67
72
  id,
68
73
  role: "img",
74
+ title,
69
75
  };
70
76
  let childSVG = null;
71
77
 
@@ -1,11 +1,22 @@
1
1
  /* eslint-disable camelcase */
2
2
  import accessibility_full from "../../../icons/svg/accessibility_full.svg";
3
3
  import accessibility_partial from "../../../icons/svg/accessibility_partial.svg";
4
+ import action_check_circle from "../../../icons/svg/action_check_circle.svg";
5
+ import action_help_default from "../../../icons/svg/action_help_default.svg";
6
+ import action_help_outline from "../../../icons/svg/action_help_outline.svg";
7
+ import action_launch from "../../../icons/svg/action_launch.svg";
4
8
  import arrow from "../../../icons/svg/arrow.svg";
5
9
  import brooklyn from "../../../icons/svg/brooklyn.svg";
6
10
  import check from "../../../icons/svg/check.svg";
7
11
  import clock from "../../../icons/svg/clock.svg";
8
12
  import close from "../../../icons/svg/close.svg";
13
+ import file_type_audio from "../../../icons/svg/file_type_audio.svg";
14
+ import file_type_doc from "../../../icons/svg/file_type_doc.svg";
15
+ import file_type_generic_doc from "../../../icons/svg/file_type_generic_doc.svg";
16
+ import file_type_image from "../../../icons/svg/file_type_image.svg";
17
+ import file_type_pdf from "../../../icons/svg/file_type_pdf.svg";
18
+ import file_type_spreadsheet from "../../../icons/svg/file_type_spreadsheet.svg";
19
+ import file_type_video from "../../../icons/svg/file_type_video.svg";
9
20
  import download from "../../../icons/svg/download.svg";
10
21
  import error_filled from "../../../icons/svg/error_filled.svg";
11
22
  import error_outline from "../../../icons/svg/error_outline.svg";
@@ -42,6 +53,10 @@ import utility_search from "../../../icons/svg/search.svg";
42
53
  export default {
43
54
  accessibility_full,
44
55
  accessibility_partial,
56
+ action_check_circle,
57
+ action_help_default,
58
+ action_help_outline,
59
+ action_launch,
45
60
  arrow,
46
61
  brooklyn,
47
62
  check,
@@ -50,6 +65,13 @@ export default {
50
65
  download,
51
66
  error_filled,
52
67
  error_outline,
68
+ file_type_audio,
69
+ file_type_doc,
70
+ file_type_generic_doc,
71
+ file_type_image,
72
+ file_type_pdf,
73
+ file_type_spreadsheet,
74
+ file_type_video,
53
75
  headset,
54
76
  logo_brooklyn,
55
77
  logo_nypl,
@@ -49,6 +49,10 @@ export enum IconSizes {
49
49
  export enum IconNames {
50
50
  AccessibilityFull = "accessibility_full",
51
51
  AccessibilityPartial = "accessibility_partial",
52
+ ActionCheckCircle = "action_check_circle",
53
+ ActionHelpDefault = "action_help_default",
54
+ ActionHelpOutline = "action_help_outline",
55
+ ActionLaunch = "action_launch",
52
56
  Arrow = "arrow",
53
57
  Check = "check",
54
58
  Clock = "clock",
@@ -56,6 +60,13 @@ export enum IconNames {
56
60
  Download = "download",
57
61
  ErrorFilled = "error_filled",
58
62
  ErrorOutline = "error_outline",
63
+ FileTypeAudio = "file_type_audio",
64
+ FileTypeDoc = "file_type_doc",
65
+ FileTypeGenericDoc = "file_type_generic_doc",
66
+ FileTypeImage = "file_type_image",
67
+ FileTypePdf = "file_type_pdf",
68
+ FileTypeSpreadsheet = "file_type_spreadsheet",
69
+ FileTypeVideo = "file_type_video",
59
70
  Headset = "headset",
60
71
  Minus = "minus",
61
72
  Plus = "plus",
@@ -0,0 +1,220 @@
1
+ import {
2
+ Meta,
3
+ Story,
4
+ Canvas,
5
+ ArgsTable,
6
+ Description,
7
+ } from "@storybook/addon-docs/blocks";
8
+ import { withDesign } from "storybook-addon-designs";
9
+ import { VStack } from "@chakra-ui/react";
10
+
11
+ import Image from "./Image";
12
+ import { ImageRatios, ImageSizes, ImageTypes } from "./ImageTypes";
13
+ import Heading from "../Heading/Heading";
14
+ import { getCategory } from "../../utils/componentCategories";
15
+
16
+ <Meta
17
+ title={getCategory("Image")}
18
+ component={Image}
19
+ decorators={[withDesign]}
20
+ parameters={{
21
+ design: {
22
+ type: "figma",
23
+ url: "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Master?node-id=11896%3A45379",
24
+ },
25
+ jest: ["Image.test.tsx"],
26
+ }}
27
+ argTypes={{
28
+ alt: { table: { disable: true } },
29
+ className: { table: { disable: true } },
30
+ component: { table: { disable: true } },
31
+ }}
32
+ />
33
+
34
+ # Image
35
+
36
+ | Component Version | DS Version |
37
+ | ----------------- | ---------- |
38
+ | Added | `0.0.6` |
39
+ | Latest | `0.25.3` |
40
+
41
+ <Description of={Image} />
42
+
43
+ <p>
44
+ If you want a simple HTML `img` element then don't pass in values for the
45
+ `imageAspectRatio` or `imageSize` props.
46
+ </p>
47
+
48
+ <Canvas>
49
+ <Story
50
+ name="Image Props"
51
+ args={{
52
+ alt: "Alt text",
53
+ imageAspectRatio: ImageRatios.TwoByOne,
54
+ imageCaption: "Image caption",
55
+ imageCredit: "Image credit",
56
+ imageSize: ImageSizes.Medium,
57
+ imageType: ImageTypes.Default,
58
+ src: "https://placeimg.com/400/300/animals",
59
+ }}
60
+ >
61
+ {(args) => <Image {...args} />}
62
+ </Story>
63
+ </Canvas>
64
+
65
+ <ArgsTable story="Image Props" />
66
+
67
+ ## Image Figure
68
+
69
+ By passing in `imageCredit` or `imageCaption`, the `Image` component will
70
+ render an HTML `figure` element and render an `img` element inside with the
71
+ proper props. If no `imageCredit` or `imageCaption` prop values are passed,
72
+ then an `img` element will be rendered with or without wrapper style divs.
73
+
74
+ <Canvas>
75
+ <Story
76
+ name="Figure and figcaption"
77
+ args={{
78
+ alt: "Alt text",
79
+ imageAspectRatio: ImageRatios.ThreeByTwo,
80
+ imageCaption: "Image caption",
81
+ imageCredit: "Image credit",
82
+ imageSize: ImageSizes.Medium,
83
+ imageType: ImageTypes.Default,
84
+ src: "https://placeimg.com/400/300/animals",
85
+ }}
86
+ argTypes={{
87
+ imageAspectRatio: { table: { disable: true } },
88
+ imageCaption: { table: { disable: true } },
89
+ imageCredit: { table: { disable: true } },
90
+ imageSize: { table: { disable: true } },
91
+ imageType: { table: { disable: true } },
92
+ src: { table: { disable: true } },
93
+ }}
94
+ >
95
+ {(args) => <Image {...args} />}
96
+ </Story>
97
+ </Canvas>
98
+
99
+ ## Image Sizes
100
+
101
+ Use the `ImageSizes` prop to set the desired size.
102
+
103
+ <Canvas>
104
+ <Story name="Image Sizes">
105
+ <VStack spacing="xs">
106
+ <Heading id="Small" text="ImageSizes.Small" />
107
+ <Image
108
+ alt="Alt text"
109
+ imageSize={ImageSizes.Small}
110
+ src="https://placeimg.com/400/300/animals"
111
+ />
112
+ <Heading id="Medium" text="ImageSizes.Medium" />
113
+ <Image
114
+ alt="Alt text"
115
+ imageSize={ImageSizes.Medium}
116
+ src="https://placeimg.com/400/300/animals"
117
+ />
118
+ <Heading id="Large" text="ImageSizes.Large" />
119
+ <Image
120
+ alt="Alt text"
121
+ imageSize={ImageSizes.Large}
122
+ src="https://placeimg.com/400/300/animals"
123
+ />
124
+ <Heading id="Default" text="ImageSizes.Default" />
125
+ <Image alt="Alt text" src="https://placeimg.com/400/300/animals" />
126
+ </VStack>
127
+ </Story>
128
+ </Canvas>
129
+
130
+ ## Image Aspect Ratios
131
+
132
+ Use the `imageAspectRatio` prop to set the desired aspect ratio. Note: the
133
+ following example has `imageSize` set to `ImageSizes.Small`.
134
+
135
+ For a better viewing experience, the `Image` components below have been wrapped
136
+ in an element with a fixed width value.
137
+
138
+ <Canvas>
139
+ <Story name="Image Aspect Ratios">
140
+ <VStack spacing="xs" maxWidth="360px" margin="auto">
141
+ <Heading id="fourbythree" text="ImageRatios.FourByThree" />
142
+ <Image
143
+ alt="Alt text"
144
+ imageAspectRatio={ImageRatios.FourByThree}
145
+ src="https://placeimg.com/400/300/animals"
146
+ />
147
+ <Heading id="onebytwo" text="ImageRatios.OneByTwo" />
148
+ <Image
149
+ alt="Alt text"
150
+ imageAspectRatio={ImageRatios.OneByTwo}
151
+ src="https://placeimg.com/400/300/animals"
152
+ />
153
+ <Heading id="original" text="ImageRatios.Original" />
154
+ <Image
155
+ alt="Alt text"
156
+ imageAspectRatio={ImageRatios.Original}
157
+ src="https://placeimg.com/400/300/animals"
158
+ />
159
+ <Heading id="sixteenbynine" text="ImageRatios.SixteenByNine" />
160
+ <Image
161
+ alt="Alt text"
162
+ imageAspectRatio={ImageRatios.SixteenByNine}
163
+ src="https://placeimg.com/400/300/animals"
164
+ />
165
+ <Heading id="square" text="ImageRatios.Square" />
166
+ <Image
167
+ alt="Alt text"
168
+ imageAspectRatio={ImageRatios.Square}
169
+ src="https://placeimg.com/400/300/animals"
170
+ />
171
+ <Heading id="threebyfour" text="ImageRatios.ThreeByFour" />
172
+ <Image
173
+ alt="Alt text"
174
+ imageAspectRatio={ImageRatios.ThreeByFour}
175
+ src="https://placeimg.com/400/300/animals"
176
+ />
177
+ <Heading id="threebytwo" text="ImageRatios.ThreeByTwo" />
178
+ <Image
179
+ alt="Alt text"
180
+ imageAspectRatio={ImageRatios.ThreeByTwo}
181
+ src="https://placeimg.com/400/300/animals"
182
+ />
183
+ <Heading id="twobyone" text="ImageRatios.TwoByOne" />
184
+ <Image
185
+ alt="Alt text"
186
+ imageAspectRatio={ImageRatios.TwoByOne}
187
+ src="https://placeimg.com/400/300/animals"
188
+ />
189
+ </VStack>
190
+ </Story>
191
+ </Canvas>
192
+
193
+ ## Image Types
194
+
195
+ Use the `imageType` prop to get an image variant. Note that to get a perfect
196
+ circle, the `imageAspectRatio` prop _must_ be set to `ImageRatios.Square`.
197
+
198
+ For a better viewing experience, the `Image` components below have been wrapped
199
+ in an element with a fixed width value.
200
+
201
+ <Canvas>
202
+ <Story name="Image Types">
203
+ <VStack spacing="xs" maxWidth="360px" margin="auto">
204
+ <Heading id="default" text="ImageTypes.Default" />
205
+ <Image
206
+ alt="Alt text"
207
+ imageAspectRatio={ImageRatios.Square}
208
+ imageType={ImageTypes.Default}
209
+ src="https://placeimg.com/400/400/animals"
210
+ />
211
+ <Heading id="circle" text="ImageTypes.Circle" />
212
+ <Image
213
+ alt="Alt text"
214
+ imageAspectRatio={ImageRatios.Square}
215
+ imageType={ImageTypes.Circle}
216
+ src="https://placeimg.com/400/400/animals"
217
+ />
218
+ </VStack>
219
+ </Story>
220
+ </Canvas>