@nypl/design-system-react-components 0.25.1 → 0.25.5

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 (307) hide show
  1. package/CHANGELOG.md +118 -1
  2. package/README.md +98 -50
  3. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +4 -0
  4. package/dist/components/Button/Button.d.ts +13 -8
  5. package/dist/components/Button/ButtonTypes.d.ts +2 -1
  6. package/dist/components/Card/Card.d.ts +36 -52
  7. package/dist/components/Card/CardTypes.d.ts +0 -15
  8. package/dist/components/Checkbox/Checkbox.d.ts +17 -13
  9. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +4 -2
  10. package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +15 -0
  11. package/dist/components/DatePicker/DatePicker.d.ts +36 -34
  12. package/dist/components/Fieldset/Fieldset.d.ts +25 -0
  13. package/dist/components/Heading/Heading.d.ts +4 -4
  14. package/dist/components/HelperErrorText/HelperErrorText.d.ts +17 -14
  15. package/dist/components/HorizontalRule/HorizontalRule.d.ts +10 -9
  16. package/dist/components/Icons/Icon.d.ts +8 -0
  17. package/dist/components/Icons/IconSvgs.d.ts +11 -0
  18. package/dist/components/Icons/IconTypes.d.ts +11 -0
  19. package/dist/components/Image/Image.d.ts +19 -9
  20. package/dist/components/Image/ImageTypes.d.ts +20 -0
  21. package/dist/components/Link/Link.d.ts +4 -0
  22. package/dist/components/List/List.d.ts +19 -14
  23. package/dist/components/Notification/Notification.d.ts +37 -16
  24. package/dist/components/Pagination/Pagination.d.ts +16 -13
  25. package/dist/components/Pagination/Pagination.stories.d.ts +2 -0
  26. package/dist/components/ProgressIndicator/ProgressIndicator.d.ts +29 -0
  27. package/dist/components/ProgressIndicator/ProgressIndicatorTypes.d.ts +8 -0
  28. package/dist/components/Radio/Radio.d.ts +2 -0
  29. package/dist/components/RadioGroup/RadioGroup.d.ts +4 -2
  30. package/dist/components/SearchBar/SearchBar.d.ts +3 -3
  31. package/dist/components/Select/Select.d.ts +2 -0
  32. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +18 -14
  33. package/dist/components/Slider/Slider.d.ts +57 -0
  34. package/dist/components/StyleGuide/ColorCard.d.ts +12 -0
  35. package/dist/components/Tabs/Tabs.d.ts +1 -1
  36. package/dist/components/TextInput/TextInput.d.ts +12 -0
  37. package/dist/components/VideoPlayer/VideoPlayer.d.ts +6 -8
  38. package/dist/components/VideoPlayer/VideoPlayerTypes.d.ts +2 -2
  39. package/dist/design-system-react-components.cjs.development.js +6131 -3715
  40. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  41. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  42. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  43. package/dist/design-system-react-components.esm.js +6124 -3699
  44. package/dist/design-system-react-components.esm.js.map +1 -1
  45. package/dist/hooks/tests/useCarouselStyles.test.d.ts +1 -0
  46. package/dist/hooks/useCarouselStyles.d.ts +16 -0
  47. package/dist/hooks/useNYPLTheme.d.ts +54 -0
  48. package/dist/hooks/useWindowSize.d.ts +10 -0
  49. package/dist/index.d.ts +13 -8
  50. package/dist/resources.scss +180 -170
  51. package/dist/styles.css +1 -1
  52. package/dist/theme/components/button.d.ts +22 -8
  53. package/dist/theme/components/card.d.ts +168 -0
  54. package/dist/theme/components/checkbox.d.ts +5 -1
  55. package/dist/theme/components/checkboxGroup.d.ts +12 -0
  56. package/dist/theme/components/componentWrapper.d.ts +11 -0
  57. package/dist/theme/components/datePicker.d.ts +16 -0
  58. package/dist/theme/components/fieldset.d.ts +27 -0
  59. package/dist/theme/components/global.d.ts +23 -13
  60. package/dist/theme/components/globalMixins.d.ts +9 -1
  61. package/dist/theme/components/heading.d.ts +5 -0
  62. package/dist/theme/components/helperErrorText.d.ts +10 -0
  63. package/dist/theme/components/hero.d.ts +1 -0
  64. package/dist/theme/components/horizontalRule.d.ts +14 -0
  65. package/dist/theme/components/image.d.ts +31 -0
  66. package/dist/theme/components/label.d.ts +5 -3
  67. package/dist/theme/components/link.d.ts +4 -0
  68. package/dist/theme/components/list.d.ts +89 -0
  69. package/dist/theme/components/notification.d.ts +75 -0
  70. package/dist/theme/components/pagination.d.ts +19 -0
  71. package/dist/theme/components/progressIndicator.d.ts +50 -0
  72. package/dist/theme/components/radioGroup.d.ts +12 -0
  73. package/dist/theme/components/select.d.ts +11 -2
  74. package/dist/theme/components/skeletonLoader.d.ts +98 -0
  75. package/dist/theme/components/slider.d.ts +51 -0
  76. package/dist/theme/components/tabs.d.ts +54 -3
  77. package/dist/theme/components/textInput.d.ts +8 -1
  78. package/dist/theme/components/videoPlayer.d.ts +40 -0
  79. package/dist/theme/foundations/breakpoints.d.ts +8 -8
  80. package/dist/theme/foundations/global.d.ts +6 -1
  81. package/dist/theme/foundations/radii.d.ts +5 -0
  82. package/dist/theme/foundations/spacing.d.ts +16 -16
  83. package/package.json +72 -83
  84. package/src/__tests__/setup.ts +2 -2
  85. package/src/components/Accordion/Accordion.stories.mdx +39 -44
  86. package/src/components/Autosuggest/Autosuggest.stories.mdx +3 -3
  87. package/src/components/Autosuggest/Autosuggest.stories.tsx +2 -1
  88. package/src/components/Autosuggest/_Autosuggest.scss +5 -5
  89. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +14 -10
  90. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +23 -0
  91. package/src/components/Breadcrumbs/Breadcrumbs.tsx +5 -1
  92. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +199 -1
  93. package/src/components/Button/Button.stories.mdx +15 -10
  94. package/src/components/Button/Button.test.tsx +21 -7
  95. package/src/components/Button/Button.tsx +22 -34
  96. package/src/components/Button/ButtonTypes.tsx +1 -0
  97. package/src/components/Button/__snapshots__/Button.test.tsx.snap +41 -10
  98. package/src/components/Card/Card.stories.mdx +296 -259
  99. package/src/components/Card/Card.test.tsx +156 -84
  100. package/src/components/Card/Card.tsx +195 -145
  101. package/src/components/Card/CardTypes.tsx +0 -17
  102. package/src/components/Card/__snapshots__/Card.test.tsx.snap +410 -0
  103. package/src/components/CardEdition/CardEdition.stories.tsx +15 -47
  104. package/src/components/CardEdition/_CardEdition.scss +22 -23
  105. package/src/components/Chakra/Box.stories.mdx +15 -16
  106. package/src/components/Chakra/Center.stories.mdx +31 -16
  107. package/src/components/Chakra/Grid.stories.mdx +28 -15
  108. package/src/components/Chakra/Stack.stories.mdx +35 -18
  109. package/src/components/Checkbox/Checkbox.stories.mdx +33 -11
  110. package/src/components/Checkbox/Checkbox.test.tsx +47 -2
  111. package/src/components/Checkbox/Checkbox.tsx +39 -33
  112. package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +90 -2
  113. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +82 -2
  114. package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +29 -2
  115. package/src/components/CheckboxGroup/CheckboxGroup.tsx +22 -18
  116. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +47 -81
  117. package/src/components/ComponentWrapper/ComponentWrapper.tsx +63 -0
  118. package/src/components/DatePicker/DatePicker.stories.mdx +163 -62
  119. package/src/components/DatePicker/DatePicker.test.tsx +264 -64
  120. package/src/components/DatePicker/DatePicker.tsx +159 -128
  121. package/src/components/DatePicker/_DatePicker.scss +33 -67
  122. package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +818 -0
  123. package/src/components/Fieldset/Fieldset.stories.mdx +55 -0
  124. package/src/components/Fieldset/Fieldset.test.tsx +125 -0
  125. package/src/components/Fieldset/Fieldset.tsx +52 -0
  126. package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +68 -0
  127. package/src/components/Form/Form.stories.mdx +24 -6
  128. package/src/components/Form/Form.test.tsx +1 -1
  129. package/src/components/Form/Form.tsx +1 -0
  130. package/src/components/Grid/SimpleGrid.stories.mdx +32 -39
  131. package/src/components/Grid/SimpleGrid.test.tsx +4 -4
  132. package/src/components/Heading/Heading.stories.mdx +3 -4
  133. package/src/components/Heading/Heading.tsx +5 -5
  134. package/src/components/HelperErrorText/HelperErrorText.stories.mdx +124 -0
  135. package/src/components/HelperErrorText/HelperErrorText.test.tsx +39 -44
  136. package/src/components/HelperErrorText/HelperErrorText.tsx +37 -39
  137. package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +25 -0
  138. package/src/components/Hero/Hero.stories.mdx +12 -2
  139. package/src/components/Hero/Hero.tsx +1 -1
  140. package/src/components/Hero/HeroTypes.tsx +1 -0
  141. package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +7 -7
  142. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +8 -6
  143. package/src/components/HorizontalRule/HorizontalRule.test.tsx +33 -28
  144. package/src/components/HorizontalRule/HorizontalRule.tsx +27 -29
  145. package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +27 -9
  146. package/src/components/Icons/Icon.stories.mdx +12 -4
  147. package/src/components/Icons/Icon.test.tsx +18 -0
  148. package/src/components/Icons/Icon.tsx +16 -1
  149. package/src/components/Icons/IconSvgs.tsx +22 -0
  150. package/src/components/Icons/IconTypes.tsx +11 -0
  151. package/src/components/Image/Image.stories.mdx +220 -0
  152. package/src/components/Image/Image.test.tsx +131 -29
  153. package/src/components/Image/Image.tsx +84 -56
  154. package/src/components/Image/ImageTypes.ts +22 -0
  155. package/src/components/Image/__snapshots__/Image.test.tsx.snap +190 -0
  156. package/src/components/Input/Input.stories.tsx +23 -67
  157. package/src/components/Input/Input.test.tsx +4 -4
  158. package/src/components/Input/_Input.scss +23 -14
  159. package/src/components/Link/Link.tsx +4 -1
  160. package/src/components/List/List.stories.mdx +124 -49
  161. package/src/components/List/List.test.tsx +142 -63
  162. package/src/components/List/List.tsx +89 -93
  163. package/src/components/List/__snapshots__/List.test.tsx.snap +109 -0
  164. package/src/components/Modal/Modal.stories.mdx +3 -3
  165. package/src/components/Modal/_Modal.scss +2 -2
  166. package/src/components/Notification/Notification.stories.mdx +109 -112
  167. package/src/components/Notification/Notification.test.tsx +99 -110
  168. package/src/components/Notification/Notification.tsx +156 -159
  169. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +159 -8
  170. package/src/components/Pagination/Pagination.stories.mdx +26 -27
  171. package/src/components/Pagination/Pagination.stories.tsx +11 -16
  172. package/src/components/Pagination/Pagination.test.tsx +276 -146
  173. package/src/components/Pagination/Pagination.tsx +174 -154
  174. package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +285 -0
  175. package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +292 -0
  176. package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +225 -0
  177. package/src/components/ProgressIndicator/ProgressIndicator.tsx +126 -0
  178. package/src/components/ProgressIndicator/ProgressIndicatorTypes.ts +8 -0
  179. package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +357 -0
  180. package/src/components/Radio/Radio.test.tsx +20 -4
  181. package/src/components/Radio/Radio.tsx +6 -3
  182. package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +3 -0
  183. package/src/components/RadioGroup/RadioGroup.stories.mdx +3 -4
  184. package/src/components/RadioGroup/RadioGroup.test.tsx +24 -1
  185. package/src/components/RadioGroup/RadioGroup.tsx +19 -19
  186. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +42 -72
  187. package/src/components/SearchBar/SearchBar.Test.tsx +20 -1
  188. package/src/components/SearchBar/SearchBar.stories.mdx +113 -8
  189. package/src/components/SearchBar/SearchBar.tsx +20 -10
  190. package/src/components/Select/Select.test.tsx +12 -0
  191. package/src/components/Select/Select.tsx +5 -2
  192. package/src/components/Select/SelectTypes.tsx +1 -0
  193. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +28 -59
  194. package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +97 -177
  195. package/src/components/SkeletonLoader/SkeletonLoader.tsx +74 -71
  196. package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +739 -0
  197. package/src/components/Slider/Slider.stories.mdx +529 -0
  198. package/src/components/Slider/Slider.test.tsx +653 -0
  199. package/src/components/Slider/Slider.tsx +303 -0
  200. package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +1946 -0
  201. package/src/components/StyleGuide/Bidirectionality.stories.mdx +1 -1
  202. package/src/components/StyleGuide/Breakpoints.stories.mdx +34 -10
  203. package/src/components/StyleGuide/Buttons.stories.mdx +89 -73
  204. package/src/components/StyleGuide/ColorCard.tsx +46 -0
  205. package/src/components/StyleGuide/Colors.stories.mdx +171 -311
  206. package/src/components/StyleGuide/DesignTokens.stories.mdx +170 -0
  207. package/src/components/StyleGuide/Forms.stories.mdx +9 -7
  208. package/src/components/StyleGuide/Iconography.stories.mdx +85 -91
  209. package/src/components/StyleGuide/Spacing.stories.mdx +31 -23
  210. package/src/components/StyleGuide/Typography.stories.mdx +202 -189
  211. package/src/components/StyleGuide/UIDocCard.tsx +1 -1
  212. package/src/components/Tabs/Tabs.stories.mdx +73 -11
  213. package/src/components/Tabs/Tabs.tsx +87 -64
  214. package/src/components/Template/Template.stories.mdx +25 -27
  215. package/src/components/TextInput/TextInput.stories.mdx +1 -1
  216. package/src/components/TextInput/TextInput.test.tsx +22 -2
  217. package/src/components/TextInput/TextInput.tsx +28 -8
  218. package/src/components/TextInput/TextInputTypes.tsx +2 -0
  219. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +17 -4
  220. package/src/components/VideoPlayer/VideoPlayer.test.tsx +54 -53
  221. package/src/components/VideoPlayer/VideoPlayer.tsx +50 -51
  222. package/src/components/VideoPlayer/VideoPlayerTypes.tsx +2 -2
  223. package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +91 -0
  224. package/src/docs/Chakra.stories.mdx +244 -63
  225. package/src/docs/Intro.stories.mdx +5 -2
  226. package/src/hooks/tests/useCarouselStyles.test.ts +140 -0
  227. package/src/hooks/tests/useNYPLTheme.test.tsx +36 -0
  228. package/src/hooks/useCarouselStyles.ts +34 -0
  229. package/src/hooks/useNYPLTheme.ts +67 -0
  230. package/src/hooks/useWindowSize.ts +40 -0
  231. package/src/index.ts +22 -19
  232. package/src/resources.scss +5 -5
  233. package/src/styles/base/{_02-breakpoints.scss → _01-breakpoints.scss} +9 -10
  234. package/src/styles/base/{_03-mixins.scss → _02-mixins.scss} +16 -5
  235. package/src/styles/base/{_04-base.scss → _03-base.scss} +7 -2
  236. package/src/styles/base/{_05-focus.scss → _04-focus.scss} +0 -15
  237. package/src/styles/base/_place-holder.scss +14 -3
  238. package/src/styles/{03-space → space}/_space-inline.scss +14 -14
  239. package/src/styles/{03-space → space}/_space-inset.scss +10 -10
  240. package/src/styles/space/_space-stack.scss +116 -0
  241. package/src/styles.scss +13 -60
  242. package/src/theme/components/button.ts +21 -15
  243. package/src/theme/components/card.ts +174 -0
  244. package/src/theme/components/checkbox.ts +8 -3
  245. package/src/theme/components/checkboxGroup.ts +8 -0
  246. package/src/theme/components/componentWrapper.ts +10 -0
  247. package/src/theme/components/datePicker.ts +17 -0
  248. package/src/theme/components/fieldset.ts +18 -0
  249. package/src/theme/components/global.ts +26 -15
  250. package/src/theme/components/globalMixins.ts +9 -1
  251. package/src/theme/components/heading.ts +10 -5
  252. package/src/theme/components/helperErrorText.ts +9 -0
  253. package/src/theme/components/hero.ts +4 -3
  254. package/src/theme/components/horizontalRule.ts +13 -0
  255. package/src/theme/components/icon.ts +9 -9
  256. package/src/theme/components/image.ts +116 -0
  257. package/src/theme/components/label.ts +3 -10
  258. package/src/theme/components/link.ts +5 -1
  259. package/src/theme/components/list.ts +73 -0
  260. package/src/theme/components/notification.ts +93 -0
  261. package/src/theme/components/pagination.ts +20 -0
  262. package/src/theme/components/progressIndicator.ts +62 -0
  263. package/src/theme/components/radio.ts +2 -2
  264. package/src/theme/components/radioGroup.ts +8 -0
  265. package/src/theme/components/select.ts +6 -3
  266. package/src/theme/components/skeletonLoader.ts +107 -0
  267. package/src/theme/components/slider.ts +79 -0
  268. package/src/theme/components/statusBadge.ts +1 -2
  269. package/src/theme/components/tabs.ts +49 -19
  270. package/src/theme/components/template.ts +8 -8
  271. package/src/theme/components/textInput.ts +5 -4
  272. package/src/theme/components/videoPlayer.ts +49 -0
  273. package/src/theme/foundations/breakpoints.ts +8 -8
  274. package/src/theme/foundations/global.ts +6 -1
  275. package/src/theme/foundations/radii.ts +6 -0
  276. package/src/theme/foundations/spacing.ts +24 -24
  277. package/src/theme/index.ts +41 -10
  278. package/src/utils/componentCategories.ts +4 -3
  279. package/dist/components/HelperErrorText/HelperErrorText.stories.d.ts +0 -16
  280. package/dist/components/Image/Image.stories.d.ts +0 -18
  281. package/dist/components/List/List.stories.d.ts +0 -7
  282. package/dist/theme/components/customCheckboxGroup.d.ts +0 -18
  283. package/dist/theme/components/customRadioGroup.d.ts +0 -18
  284. package/src/components/Button/_Button.scss +0 -32
  285. package/src/components/Card/_Card.scss +0 -308
  286. package/src/components/HelperErrorText/HelperErrorText.stories.tsx +0 -48
  287. package/src/components/HelperErrorText/_HelperErrorText.scss +0 -9
  288. package/src/components/HorizontalRule/_HorizontalRule.scss +0 -15
  289. package/src/components/Image/Image.stories.tsx +0 -54
  290. package/src/components/Image/_Image.scss +0 -38
  291. package/src/components/List/List.stories.tsx +0 -139
  292. package/src/components/List/_List.scss +0 -76
  293. package/src/components/Notification/_Notification.scss +0 -110
  294. package/src/components/Pagination/_Pagination.scss +0 -40
  295. package/src/components/SkeletonLoader/_SkeletonLoader.scss +0 -142
  296. package/src/components/VideoPlayer/_VideoPlayer.scss +0 -38
  297. package/src/styles/01-colors/_colors-brand.scss +0 -62
  298. package/src/styles/01-colors/_colors-utility.scss +0 -67
  299. package/src/styles/02-typography/_type-scale.css +0 -11
  300. package/src/styles/02-typography/_type-weight.css +0 -7
  301. package/src/styles/02-typography/_typefaces.css +0 -4
  302. package/src/styles/03-space/_space-stack.scss +0 -116
  303. package/src/styles/03-space/_space.css +0 -30
  304. package/src/styles/base/_card-grid.scss +0 -78
  305. package/src/styles/base/_typography.scss +0 -11
  306. package/src/theme/components/customCheckboxGroup.ts +0 -12
  307. package/src/theme/components/customRadioGroup.ts +0 -12
@@ -3,18 +3,18 @@ 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";
9
+ import { action } from "@storybook/addon-actions";
10
10
 
11
+ import { getCategory } from "../../utils/componentCategories";
11
12
  import SkeletonLoader from "./SkeletonLoader";
12
13
  import {
13
14
  SkeletonLoaderLayouts,
14
15
  SkeletonLoaderImageRatios,
15
16
  } from "./SkeletonLoaderTypes";
16
- import { action } from "@storybook/addon-actions";
17
- import { getCategory } from "../../utils/componentCategories";
17
+ import SimpleGrid from "../Grid/SimpleGrid";
18
18
 
19
19
  <Meta
20
20
  title={getCategory("SkeletonLoader")}
@@ -29,33 +29,15 @@ import { getCategory } from "../../utils/componentCategories";
29
29
  jest: ["SkeletonLoader.test.tsx"],
30
30
  }}
31
31
  argTypes={{
32
- attributes: { table: { disable: true } },
33
32
  className: { table: { disable: true } },
34
- modifiers: { table: { disable: true } },
35
- layout: {
36
- table: { defaultValue: { summary: "column" } },
37
- },
38
- showImage: {
39
- table: { defaultValue: { summary: "true" } },
40
- },
41
- showHeading: {
42
- table: { defaultValue: { summary: "true" } },
43
- },
44
- showContent: {
45
- table: { defaultValue: { summary: "true" } },
46
- },
47
- showButton: {
48
- table: { defaultValue: { summary: "false" } },
49
- },
50
- headingSize: {
51
- table: { defaultValue: { summary: "1" } },
52
- },
53
- contentSize: {
54
- table: { defaultValue: { summary: "3" } },
55
- },
56
- imageAspectRatio: {
57
- table: { defaultValue: { summary: "square" } },
58
- },
33
+ contentSize: { table: { defaultValue: { summary: "3" } } },
34
+ headingSize: { table: { defaultValue: { summary: "1" } } },
35
+ imageAspectRatio: { table: { defaultValue: { summary: "square" } } },
36
+ layout: { table: { defaultValue: { summary: "column" } } },
37
+ showButton: { table: { defaultValue: { summary: "false" } } },
38
+ showContent: { table: { defaultValue: { summary: "true" } } },
39
+ showHeading: { table: { defaultValue: { summary: "true" } } },
40
+ showImage: { table: { defaultValue: { summary: "true" } } },
59
41
  }}
60
42
  />
61
43
 
@@ -64,41 +46,34 @@ import { getCategory } from "../../utils/componentCategories";
64
46
  | Component Version | DS Version |
65
47
  | ----------------- | ---------- |
66
48
  | Added | `0.17.3` |
67
- | Latest | `0.23.4` |
49
+ | Latest | `0.25.3` |
68
50
 
69
51
  <Description of={SkeletonLoader} />
70
52
 
71
- The `SkeletonLoader` component renders a placeholder to be used while dynamic
72
- content is loading. The `layout`, `width` and placeholder elements within the
73
- `SkeletonLoader` can be customized.
53
+ The `layout`, `width`, and placeholder elements within the `SkeletonLoader` can
54
+ be customized.
74
55
 
75
- Please note that the initial rendering below has the `width` prop set to `300px`.
76
- The default value is `100%`.
56
+ Please note that the initial rendering below has the `width` prop set to `300px`
57
+ to better view the example. The default value is `100%`.
77
58
 
78
- <Preview withToolbar>
59
+ <Canvas withToolbar>
79
60
  <Story
80
- name="SkeletonLoader"
61
+ name="Basic with Props"
81
62
  args={{
82
63
  width: "300px",
83
64
  }}
84
65
  >
85
66
  {(args) => <SkeletonLoader {...args} />}
86
67
  </Story>
87
- </Preview>
68
+ </Canvas>
88
69
 
89
- <ArgsTable story="SkeletonLoader" />
70
+ <ArgsTable story="Basic with Props" />
90
71
 
91
72
  # Card Placeholders in a Grid
92
73
 
93
- <Preview>
74
+ <Canvas>
94
75
  <Story name="Placeholders in a Grid">
95
- <div
96
- style={{
97
- display: "grid",
98
- gap: "2rem",
99
- gridTemplateColumns: "repeat(3, 1fr)",
100
- }}
101
- >
76
+ <SimpleGrid columns={3}>
102
77
  <SkeletonLoader
103
78
  imageAspectRatio={SkeletonLoaderImageRatios.Landscape}
104
79
  border
@@ -123,26 +98,20 @@ The default value is `100%`.
123
98
  imageAspectRatio={SkeletonLoaderImageRatios.Landscape}
124
99
  border
125
100
  />
126
- </div>
101
+ </SimpleGrid>
127
102
  </Story>
128
- </Preview>
103
+ </Canvas>
129
104
 
130
105
  # Text Placeholders in a List
131
106
 
132
- <Preview>
107
+ <Canvas>
133
108
  <Story name="Placeholders in a List">
134
- <div
135
- style={{
136
- display: "grid",
137
- gap: "2rem",
138
- gridTemplateColumns: "repeat(1, 1fr)",
139
- }}
140
- >
109
+ <SimpleGrid columns={1}>
141
110
  <SkeletonLoader layout={SkeletonLoaderLayouts.Row} showImage={false} />
142
111
  <SkeletonLoader layout={SkeletonLoaderLayouts.Row} showImage={false} />
143
112
  <SkeletonLoader layout={SkeletonLoaderLayouts.Row} showImage={false} />
144
113
  <SkeletonLoader layout={SkeletonLoaderLayouts.Row} showImage={false} />
145
114
  <SkeletonLoader layout={SkeletonLoaderLayouts.Row} showImage={false} />
146
- </div>
115
+ </SimpleGrid>
147
116
  </Story>
148
- </Preview>
117
+ </Canvas>
@@ -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
  }