@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
@@ -1,6 +1,7 @@
1
1
  import * as React from "react";
2
2
  import { render } from "@testing-library/react";
3
3
  import { axe } from "jest-axe";
4
+ import renderer from "react-test-renderer";
4
5
 
5
6
  import SkeletonLoader from "./SkeletonLoader";
6
7
  import {
@@ -16,189 +17,108 @@ describe("SkeletonLoader Accessibility", () => {
16
17
  });
17
18
 
18
19
  describe("SkeletonLoader", () => {
19
- let container;
20
-
21
- describe("layout", () => {
22
- it("renders default layout", () => {
23
- const utils = render(<SkeletonLoader />);
24
- container = utils.container;
25
-
26
- expect(container.querySelector(".skeleton-loader")).toBeInTheDocument();
27
- expect(container.querySelector(".skeleton-loader")).toHaveAttribute(
28
- "class",
29
- "skeleton-loader skeleton-loader--column "
30
- );
31
- expect(container.querySelector(".skeleton-loader")).not.toHaveAttribute(
32
- "class",
33
- "skeleton-loader skeleton-loader--portrait "
34
- );
35
- });
36
-
37
- it("renders column layout", () => {
38
- const utils = render(
39
- <SkeletonLoader layout={SkeletonLoaderLayouts.Column} />
40
- );
41
- container = utils.container;
42
-
43
- expect(container.querySelector(".skeleton-loader")).toBeInTheDocument();
44
- expect(
45
- container.querySelector(".skeleton-loader--column")
46
- ).toBeInTheDocument();
47
- });
48
-
49
- it("renders row layout", () => {
50
- const utils = render(
51
- <SkeletonLoader layout={SkeletonLoaderLayouts.Row} />
52
- );
53
- container = utils.container;
54
-
55
- expect(container.querySelector(".skeleton-loader")).toBeInTheDocument();
56
- expect(
57
- container.querySelector(".skeleton-loader--row")
58
- ).toBeInTheDocument();
59
- });
20
+ it("renders default layout", () => {
21
+ const { container } = render(
22
+ <SkeletonLoader className="skeleton-loader" />
23
+ );
24
+
25
+ expect(container.querySelector(".skeleton-loader")).toBeInTheDocument();
60
26
  });
61
27
 
62
- describe("UI elements", () => {
63
- it("renders default elements", () => {
64
- const utils = render(<SkeletonLoader />);
65
- container = utils.container;
66
-
67
- expect(container.querySelector(".skeleton-loader")).toBeInTheDocument();
68
- expect(
69
- container.querySelector(".skeleton-loader-image")
70
- ).toBeInTheDocument();
71
- expect(
72
- container.querySelector(".skeleton-loader-heading")
73
- ).toBeInTheDocument();
74
- expect(
75
- container.querySelector(".skeleton-loader-content")
76
- ).toBeInTheDocument();
77
- expect(
78
- container.querySelector(".skeleton-loader-button")
79
- ).not.toBeInTheDocument();
80
- });
81
-
82
- it("renders without image", () => {
83
- const utils = render(<SkeletonLoader showImage={false} />);
84
- container = utils.container;
85
-
86
- expect(container.querySelector(".skeleton-loader")).toBeInTheDocument();
87
- expect(
88
- container.querySelector(".skeleton-loader-image")
89
- ).not.toBeInTheDocument();
90
- expect(
91
- container.querySelector(".skeleton-loader-heading")
92
- ).toBeInTheDocument();
93
- expect(
94
- container.querySelector(".skeleton-loader-content")
95
- ).toBeInTheDocument();
96
- expect(
97
- container.querySelector(".skeleton-loader-button")
98
- ).not.toBeInTheDocument();
99
- });
100
-
101
- it("renders without heading", () => {
102
- const utils = render(<SkeletonLoader showHeading={false} />);
103
- container = utils.container;
104
-
105
- expect(container.querySelector(".skeleton-loader")).toBeInTheDocument();
106
- expect(
107
- container.querySelector(".skeleton-loader-image")
108
- ).toBeInTheDocument();
109
- expect(
110
- container.querySelector(".skeleton-loader-heading")
111
- ).not.toBeInTheDocument();
112
- expect(
113
- container.querySelector(".skeleton-loader-content")
114
- ).toBeInTheDocument();
115
- expect(
116
- container.querySelector(".skeleton-loader-button")
117
- ).not.toBeInTheDocument();
118
- });
119
-
120
- it("renders without content", () => {
121
- const utils = render(<SkeletonLoader showContent={false} />);
122
- container = utils.container;
123
-
124
- expect(container.querySelector(".skeleton-loader")).toBeInTheDocument();
125
- expect(
126
- container.querySelector(".skeleton-loader-image")
127
- ).toBeInTheDocument();
128
- expect(
129
- container.querySelector(".skeleton-loader-heading")
130
- ).toBeInTheDocument();
131
- expect(
132
- container.querySelector(".skeleton-loader-content")
133
- ).not.toBeInTheDocument();
134
- expect(
135
- container.querySelector(".skeleton-loader-button")
136
- ).not.toBeInTheDocument();
137
- });
138
-
139
- it("renders with button", () => {
140
- const utils = render(<SkeletonLoader showButton={true} />);
141
- container = utils.container;
142
-
143
- expect(container.querySelector(".skeleton-loader")).toBeInTheDocument();
144
- expect(
145
- container.querySelector(".skeleton-loader-image")
146
- ).toBeInTheDocument();
147
- expect(
148
- container.querySelector(".skeleton-loader-heading")
149
- ).toBeInTheDocument();
150
- expect(
151
- container.querySelector(".skeleton-loader-content")
152
- ).toBeInTheDocument();
153
- expect(
154
- container.querySelector(".skeleton-loader-button")
155
- ).toBeInTheDocument();
156
- });
157
-
158
- it("renders with border", () => {
159
- const utils = render(<SkeletonLoader border />);
160
- container = utils.container;
161
- expect(container.querySelector(".skeleton-loader")).toBeInTheDocument();
162
- expect(
163
- container.querySelector(".skeleton-loader--border")
164
- ).toBeInTheDocument();
165
- });
28
+ it("renders in the column or row layout", () => {
29
+ const { container, rerender } = render(
30
+ <SkeletonLoader layout={SkeletonLoaderLayouts.Column} />
31
+ );
32
+
33
+ expect(container.querySelector(".column")).toBeInTheDocument();
34
+
35
+ rerender(<SkeletonLoader layout={SkeletonLoaderLayouts.Row} />);
36
+ expect(container.querySelector(".row")).toBeInTheDocument();
166
37
  });
167
38
 
168
- describe("image aspect ratio", () => {
169
- it("renders square image", () => {
170
- const utils = render(
171
- <SkeletonLoader imageAspectRatio={SkeletonLoaderImageRatios.Square} />
172
- );
173
- container = utils.container;
174
- expect(container.querySelector(".skeleton-loader")).toBeInTheDocument();
175
- expect(
176
- container.querySelector(".skeleton-loader-image--square")
177
- ).toBeInTheDocument();
178
- });
179
-
180
- it("renders portrait image", () => {
181
- const utils = render(
182
- <SkeletonLoader imageAspectRatio={SkeletonLoaderImageRatios.Portrait} />
183
- );
184
- container = utils.container;
185
- expect(container.querySelector(".skeleton-loader")).toBeInTheDocument();
186
- expect(
187
- container.querySelector(".skeleton-loader-image--portrait")
188
- ).toBeInTheDocument();
189
- });
190
-
191
- it("renders landscape image", () => {
192
- const utils = render(
39
+ it("renders default elements", () => {
40
+ const { container } = render(<SkeletonLoader />);
41
+
42
+ // By default, the `SkeletonLoader` renders one image, one heading, and
43
+ // three content elements.
44
+ expect(container.querySelectorAll(".chakra-skeleton")).toHaveLength(5);
45
+ });
46
+
47
+ it("renders without image", () => {
48
+ const { container } = render(<SkeletonLoader showImage={false} />);
49
+
50
+ // Only one image is rendered by default.
51
+ expect(container.querySelectorAll(".chakra-skeleton")).toHaveLength(4);
52
+ });
53
+
54
+ it("renders without heading", () => {
55
+ const { container } = render(<SkeletonLoader showHeading={false} />);
56
+
57
+ // Only one heading is rendered by default.
58
+ expect(container.querySelectorAll(".chakra-skeleton")).toHaveLength(4);
59
+ });
60
+
61
+ it("renders without content", () => {
62
+ const { container } = render(<SkeletonLoader showContent={false} />);
63
+
64
+ // Three content placeholders are rendered by default.
65
+ expect(container.querySelectorAll(".chakra-skeleton")).toHaveLength(2);
66
+ });
67
+
68
+ it("renders with button", () => {
69
+ const { container } = render(<SkeletonLoader showButton={true} />);
70
+
71
+ // Only one button is rendered by default.
72
+ expect(container.querySelectorAll(".chakra-skeleton")).toHaveLength(6);
73
+ });
74
+
75
+ it("renders the UI snapshot correctly", () => {
76
+ const basic = renderer.create(<SkeletonLoader />).toJSON();
77
+ const rowLayout = renderer
78
+ .create(<SkeletonLoader layout={SkeletonLoaderLayouts.Row} />)
79
+ .toJSON();
80
+ const columnLayout = renderer
81
+ .create(<SkeletonLoader layout={SkeletonLoaderLayouts.Column} />)
82
+ .toJSON();
83
+ const noImage = renderer
84
+ .create(<SkeletonLoader showImage={false} />)
85
+ .toJSON();
86
+ const noHeading = renderer
87
+ .create(<SkeletonLoader showHeading={false} />)
88
+ .toJSON();
89
+ const noContent = renderer
90
+ .create(<SkeletonLoader showContent={false} />)
91
+ .toJSON();
92
+ const withButton = renderer
93
+ .create(<SkeletonLoader showButton={true} />)
94
+ .toJSON();
95
+ const landscape = renderer
96
+ .create(
193
97
  <SkeletonLoader
194
98
  imageAspectRatio={SkeletonLoaderImageRatios.Landscape}
195
99
  />
196
- );
197
- container = utils.container;
198
- expect(container.querySelector(".skeleton-loader")).toBeInTheDocument();
199
- expect(
200
- container.querySelector(".skeleton-loader-image--landscape")
201
- ).toBeInTheDocument();
202
- });
100
+ )
101
+ .toJSON();
102
+ const portrait = renderer
103
+ .create(
104
+ <SkeletonLoader imageAspectRatio={SkeletonLoaderImageRatios.Portrait} />
105
+ )
106
+ .toJSON();
107
+ const square = renderer
108
+ .create(
109
+ <SkeletonLoader imageAspectRatio={SkeletonLoaderImageRatios.Square} />
110
+ )
111
+ .toJSON();
112
+
113
+ expect(basic).toMatchSnapshot();
114
+ expect(rowLayout).toMatchSnapshot();
115
+ expect(columnLayout).toMatchSnapshot();
116
+ expect(noImage).toMatchSnapshot();
117
+ expect(noHeading).toMatchSnapshot();
118
+ expect(noContent).toMatchSnapshot();
119
+ expect(withButton).toMatchSnapshot();
120
+ expect(landscape).toMatchSnapshot();
121
+ expect(portrait).toMatchSnapshot();
122
+ expect(square).toMatchSnapshot();
203
123
  });
204
124
  });
@@ -1,42 +1,51 @@
1
1
  import * as React from "react";
2
- import bem from "../../utils/bem";
2
+ import {
3
+ Box,
4
+ Skeleton as ChakraSkeleton,
5
+ useMultiStyleConfig,
6
+ } from "@chakra-ui/react";
7
+
3
8
  import {
4
9
  SkeletonLoaderImageRatios,
5
10
  SkeletonLoaderLayouts,
6
11
  } from "./SkeletonLoaderTypes";
7
12
 
8
13
  export interface SkeletonLoaderProps {
9
- /** Optional boolean value to control visibility of border around skeleton loader */
14
+ /** Optional boolean value to control visibility of border around skeleton loader. */
10
15
  border?: boolean;
11
- /** ClassName you can add in addition to `skeleton-loader` */
16
+ /** Additional class name for the Skeleton component. */
12
17
  className?: string;
13
- /** Optional numeric value to control the number of lines for content placeholder; default value is `3` */
18
+ /** Optional numeric value to control the number of lines for content placeholder; default value is `3`. */
14
19
  contentSize?: number;
15
- /** Optional numeric value to control the number of lines for heading placeholder; default value is `1` */
20
+ /** Optional numeric value to control the number of lines for heading placeholder; default value is `1`. */
16
21
  headingSize?: number;
17
- /** Optional value to control the aspect ratio of the image placeholder; default value is `square` */
22
+ /** Optional value to control the aspect ratio of the image placeholder; default value is `square`. */
18
23
  imageAspectRatio?: SkeletonLoaderImageRatios;
19
- /** Optional value to control the position of the image placeholder; default value is `column` */
24
+ /** Optional value to control the position of the image placeholder; default value is `column`. */
20
25
  layout?: SkeletonLoaderLayouts;
21
- /** Modifiers array for use with BEM. See how to work with modifiers and BEM here: http://getbem.com/introduction/ */
22
- modifiers?: string[];
23
- /** Optional boolean value to control visibility of button placeholder */
26
+ /** Optional boolean value to control visibility of button placeholder. */
24
27
  showButton?: boolean;
25
- /** Optional boolean value to control visibility of content placeholder */
28
+ /** Optional boolean value to control visibility of content placeholder. */
26
29
  showContent?: boolean;
27
- /** Optional boolean value to control visibility of image placeholder */
28
- showImage?: boolean;
29
- /** Optional boolean value to control visibility of heading placeholder */
30
+ /** Optional boolean value to control visibility of heading placeholder. */
30
31
  showHeading?: boolean;
31
- /** Optional width value. This value should be entered with the same formatting as a CSS width attribute (ex. `50%`, `640px`, `20rem`). If omitted, the skeleton loader will have a default width of 100%. */
32
+ /** Optional boolean value to control visibility of image placeholder. */
33
+ showImage?: boolean;
34
+ /** Optional width value. This value should be entered with the same
35
+ * formatting as a CSS width attribute (ex. `50%`, `640px`, `20rem`).
36
+ * If omitted, the skeleton loader will have a default width of 100%. */
32
37
  width?: string;
33
38
  }
34
39
 
40
+ /**
41
+ * The `SkeletonLoader` component renders a placeholder to be used while
42
+ * dynamic content is loading.
43
+ */
35
44
  export default function SkeletonLoader(
36
45
  props: React.PropsWithChildren<SkeletonLoaderProps>
37
46
  ) {
38
47
  const {
39
- border,
48
+ border = false,
40
49
  className,
41
50
  contentSize = 3,
42
51
  headingSize = 1,
@@ -44,70 +53,64 @@ export default function SkeletonLoader(
44
53
  layout = SkeletonLoaderLayouts.Column,
45
54
  showButton = false,
46
55
  showContent = true,
47
- showImage = true,
48
56
  showHeading = true,
57
+ showImage = true,
49
58
  width,
50
- modifiers = [],
51
59
  } = props;
60
+ const styles = useMultiStyleConfig("SkeletonLoader", {
61
+ border,
62
+ imageAspectRatio,
63
+ showImage,
64
+ variant: layout,
65
+ });
52
66
 
53
- modifiers.push(layout);
54
- {
55
- border && modifiers.push("border");
56
- }
57
-
58
- const imageModifiers = [imageAspectRatio];
59
-
60
- const headingItems = [];
61
- for (let i = 0; i < headingSize; i++) {
62
- headingItems.push(
63
- <div
64
- key={`heading-${i}`}
65
- className={bem("skeleton-loader-heading", imageModifiers, "", [
66
- "skeleton-element",
67
- ])}
68
- ></div>
69
- );
70
- }
71
-
72
- const contentItems = [];
73
- for (let i = 0; i < contentSize; i++) {
74
- contentItems.push(
75
- <div
76
- key={`content-${i}`}
77
- className={bem("skeleton-loader-content", imageModifiers, "", [
78
- "skeleton-element",
79
- ])}
80
- ></div>
81
- );
82
- }
67
+ /**
68
+ * Generates the Chakra skeleton loader `size` number of times for the
69
+ * "heading" and "content" areas defined by the `type` argument. The last
70
+ * element will have width of `lastWidth`.
71
+ */
72
+ const getSkeletonElements = (type, size = 1, lastWidth = "80%") => {
73
+ return new Array(size).fill(null).map((_, i) => {
74
+ const width = i === size - 1 ? lastWidth : "100%";
75
+ const marginBottomValue =
76
+ i === size - 1 && type === "content" ? "0" : null;
77
+ return (
78
+ <ChakraSkeleton key={`${type}-${i}`} width={width}>
79
+ <Box
80
+ __css={styles[type]}
81
+ style={{ marginBottom: marginBottomValue }}
82
+ />
83
+ </ChakraSkeleton>
84
+ );
85
+ });
86
+ };
83
87
 
84
88
  return (
85
- <div
86
- className={bem("skeleton-loader", modifiers, "", [className])}
87
- style={{ width: width }}
88
- >
89
+ <Box className={className} __css={styles} style={{ width: width }}>
89
90
  {showImage && (
90
- <div className="skeleton-section">
91
- <div
92
- className={bem("skeleton-loader-image", imageModifiers, "", [
93
- "skeleton-element",
94
- ])}
95
- ></div>
96
- </div>
91
+ <ChakraSkeleton>
92
+ <Box __css={{ ...styles.element, ...styles.image }} />
93
+ </ChakraSkeleton>
97
94
  )}
98
- <div style={{ width: "100%" }}>
99
- {showHeading && <div className="skeleton-section">{headingItems}</div>}
100
- {showContent && <div className="skeleton-section">{contentItems}</div>}
95
+ <Box className={layout} __css={styles.container}>
96
+ {showHeading && (
97
+ <Box __css={styles.section}>
98
+ {getSkeletonElements("heading", headingSize, "80%")}
99
+ </Box>
100
+ )}
101
+ {showContent && (
102
+ <Box __css={styles.section}>
103
+ {getSkeletonElements("content", contentSize, "30%")}
104
+ </Box>
105
+ )}
101
106
  {showButton && (
102
- <div className="skeleton-section">
103
- <div
104
- className={bem("skeleton-loader-button", imageModifiers, "", [
105
- "skeleton-element",
106
- ])}
107
- ></div>
108
- </div>
107
+ <Box __css={{ ...styles.section, ...styles.button }}>
108
+ <ChakraSkeleton borderRadius="16px">
109
+ <Box __css={styles.button} />
110
+ </ChakraSkeleton>
111
+ </Box>
109
112
  )}
110
- </div>
111
- </div>
113
+ </Box>
114
+ </Box>
112
115
  );
113
116
  }