@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.
- package/CHANGELOG.md +101 -0
- package/README.md +47 -11
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +4 -0
- package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +1 -0
- package/dist/components/Button/Button.d.ts +9 -8
- package/dist/components/Button/ButtonTypes.d.ts +2 -1
- package/dist/components/Card/Card.d.ts +36 -52
- package/dist/components/Card/CardTypes.d.ts +0 -15
- package/dist/components/Checkbox/Checkbox.d.ts +8 -9
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +2 -2
- package/dist/components/DatePicker/DatePicker.d.ts +36 -36
- package/dist/components/Fieldset/Fieldset.d.ts +25 -0
- package/dist/components/HelperErrorText/HelperErrorText.d.ts +4 -0
- package/dist/components/HorizontalRule/HorizontalRule.d.ts +10 -3
- package/dist/components/Icons/Icon.d.ts +4 -0
- package/dist/components/Icons/IconSvgs.d.ts +11 -0
- package/dist/components/Icons/IconTypes.d.ts +11 -0
- package/dist/components/Image/Image.d.ts +19 -9
- package/dist/components/Image/ImageTypes.d.ts +20 -0
- package/dist/components/Link/Link.d.ts +4 -0
- package/dist/components/List/List.d.ts +7 -1
- package/dist/components/Notification/Notification.d.ts +6 -4
- package/dist/components/Pagination/Pagination.d.ts +16 -13
- package/dist/components/Pagination/Pagination.stories.d.ts +2 -0
- package/dist/components/ProgressIndicator/ProgressIndicator.d.ts +29 -0
- package/dist/components/ProgressIndicator/ProgressIndicatorTypes.d.ts +8 -0
- package/dist/components/RadioGroup/RadioGroup.d.ts +2 -2
- package/dist/components/SearchBar/SearchBar.d.ts +3 -3
- package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +18 -14
- package/dist/components/Slider/Slider.d.ts +57 -0
- package/dist/components/Tabs/Tabs.d.ts +1 -1
- package/dist/components/TextInput/TextInput.d.ts +10 -0
- package/dist/design-system-react-components.cjs.development.js +3058 -936
- package/dist/design-system-react-components.cjs.development.js.map +1 -1
- package/dist/design-system-react-components.cjs.production.min.js +1 -1
- package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
- package/dist/design-system-react-components.esm.js +3049 -921
- package/dist/design-system-react-components.esm.js.map +1 -1
- package/dist/index.d.ts +12 -6
- package/dist/resources.scss +180 -170
- package/dist/styles.css +1 -1
- package/dist/theme/components/breadcrumb.d.ts +9 -0
- package/dist/theme/components/button.d.ts +22 -8
- package/dist/theme/components/card.d.ts +168 -0
- package/dist/theme/components/checkbox.d.ts +5 -1
- package/dist/theme/components/checkboxGroup.d.ts +12 -0
- package/dist/theme/components/datePicker.d.ts +16 -0
- package/dist/theme/components/fieldset.d.ts +27 -0
- package/dist/theme/components/global.d.ts +23 -13
- package/dist/theme/components/globalMixins.d.ts +9 -1
- package/dist/theme/components/heading.d.ts +5 -0
- package/dist/theme/components/image.d.ts +31 -0
- package/dist/theme/components/label.d.ts +5 -3
- package/dist/theme/components/link.d.ts +4 -0
- package/dist/theme/components/list.d.ts +5 -1
- package/dist/theme/components/notification.d.ts +4 -14
- package/dist/theme/components/pagination.d.ts +19 -0
- package/dist/theme/components/progressIndicator.d.ts +50 -0
- package/dist/theme/components/radioGroup.d.ts +12 -0
- package/dist/theme/components/select.d.ts +11 -2
- package/dist/theme/components/skeletonLoader.d.ts +98 -0
- package/dist/theme/components/slider.d.ts +51 -0
- package/dist/theme/components/textInput.d.ts +8 -0
- package/dist/theme/foundations/breakpoints.d.ts +8 -8
- package/dist/theme/foundations/global.d.ts +6 -1
- package/package.json +72 -84
- package/src/__tests__/setup.ts +2 -2
- package/src/components/Accordion/Accordion.stories.mdx +39 -42
- package/src/components/Autosuggest/Autosuggest.stories.mdx +3 -3
- package/src/components/Autosuggest/Autosuggest.stories.tsx +1 -0
- package/src/components/Autosuggest/_Autosuggest.scss +5 -5
- package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +24 -8
- package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +33 -0
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +5 -1
- package/src/components/Breadcrumbs/BreadcrumbsTypes.tsx +1 -0
- package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +298 -1
- package/src/components/Button/Button.stories.mdx +15 -10
- package/src/components/Button/Button.test.tsx +21 -7
- package/src/components/Button/Button.tsx +18 -33
- package/src/components/Button/ButtonTypes.tsx +1 -0
- package/src/components/Button/__snapshots__/Button.test.tsx.snap +41 -10
- package/src/components/Card/Card.stories.mdx +296 -259
- package/src/components/Card/Card.test.tsx +156 -84
- package/src/components/Card/Card.tsx +195 -145
- package/src/components/Card/CardTypes.tsx +0 -17
- package/src/components/Card/__snapshots__/Card.test.tsx.snap +410 -0
- package/src/components/CardEdition/CardEdition.stories.tsx +15 -47
- package/src/components/CardEdition/_CardEdition.scss +22 -23
- package/src/components/Chakra/Box.stories.mdx +14 -15
- package/src/components/Chakra/Center.stories.mdx +15 -8
- package/src/components/Chakra/Grid.stories.mdx +16 -7
- package/src/components/Chakra/Stack.stories.mdx +35 -18
- package/src/components/Checkbox/Checkbox.stories.mdx +33 -11
- package/src/components/Checkbox/Checkbox.test.tsx +30 -3
- package/src/components/Checkbox/Checkbox.tsx +27 -27
- package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +90 -2
- package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +82 -2
- package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +1 -1
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +14 -15
- package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +44 -80
- package/src/components/DatePicker/DatePicker.stories.mdx +163 -62
- package/src/components/DatePicker/DatePicker.test.tsx +248 -65
- package/src/components/DatePicker/DatePicker.tsx +158 -130
- package/src/components/DatePicker/_DatePicker.scss +33 -67
- package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +818 -0
- package/src/components/Fieldset/Fieldset.stories.mdx +55 -0
- package/src/components/Fieldset/Fieldset.test.tsx +125 -0
- package/src/components/Fieldset/Fieldset.tsx +52 -0
- package/src/components/Fieldset/__snapshots__/Fieldset.test.tsx.snap +68 -0
- package/src/components/Form/Form.stories.mdx +4 -5
- package/src/components/Form/Form.tsx +1 -0
- package/src/components/Grid/SimpleGrid.stories.mdx +32 -39
- package/src/components/Grid/SimpleGrid.test.tsx +4 -4
- package/src/components/Heading/Heading.stories.mdx +3 -4
- package/src/components/HelperErrorText/HelperErrorText.stories.mdx +1 -1
- package/src/components/HelperErrorText/HelperErrorText.tsx +5 -1
- package/src/components/Hero/HeroTypes.tsx +1 -0
- package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +7 -7
- package/src/components/HorizontalRule/HorizontalRule.stories.mdx +6 -5
- package/src/components/HorizontalRule/HorizontalRule.test.tsx +17 -0
- package/src/components/HorizontalRule/HorizontalRule.tsx +21 -4
- package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +5 -5
- package/src/components/Icons/Icon.stories.mdx +11 -3
- package/src/components/Icons/Icon.test.tsx +18 -0
- package/src/components/Icons/Icon.tsx +6 -0
- package/src/components/Icons/IconSvgs.tsx +22 -0
- package/src/components/Icons/IconTypes.tsx +11 -0
- package/src/components/Image/Image.stories.mdx +220 -0
- package/src/components/Image/Image.test.tsx +131 -29
- package/src/components/Image/Image.tsx +84 -56
- package/src/components/Image/ImageTypes.ts +22 -0
- package/src/components/Image/__snapshots__/Image.test.tsx.snap +190 -0
- package/src/components/Input/Input.stories.tsx +20 -64
- package/src/components/Input/_Input.scss +23 -14
- package/src/components/Link/Link.tsx +4 -1
- package/src/components/List/List.stories.mdx +1 -1
- package/src/components/List/List.tsx +11 -4
- package/src/components/Modal/Modal.stories.mdx +3 -3
- package/src/components/Modal/_Modal.scss +2 -2
- package/src/components/Notification/Notification.stories.mdx +1 -3
- package/src/components/Notification/Notification.tsx +24 -9
- package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +2 -0
- package/src/components/Pagination/Pagination.stories.mdx +26 -27
- package/src/components/Pagination/Pagination.stories.tsx +11 -16
- package/src/components/Pagination/Pagination.test.tsx +276 -146
- package/src/components/Pagination/Pagination.tsx +174 -154
- package/src/components/Pagination/__snapshots__/Pagination.test.tsx.snap +285 -0
- package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +292 -0
- package/src/components/ProgressIndicator/ProgressIndicator.test.tsx +225 -0
- package/src/components/ProgressIndicator/ProgressIndicator.tsx +126 -0
- package/src/components/ProgressIndicator/ProgressIndicatorTypes.ts +8 -0
- package/src/components/ProgressIndicator/__snapshots__/ProgressIndicator.test.tsx.snap +357 -0
- package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +3 -0
- package/src/components/RadioGroup/RadioGroup.stories.mdx +3 -4
- package/src/components/RadioGroup/RadioGroup.tsx +11 -16
- package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +39 -71
- package/src/components/SearchBar/SearchBar.Test.tsx +66 -21
- package/src/components/SearchBar/SearchBar.stories.mdx +114 -10
- package/src/components/SearchBar/SearchBar.tsx +15 -5
- package/src/components/Select/SelectTypes.tsx +1 -0
- package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +28 -59
- package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +97 -177
- package/src/components/SkeletonLoader/SkeletonLoader.tsx +74 -71
- package/src/components/SkeletonLoader/__snapshots__/SkeletonLoader.test.tsx.snap +739 -0
- package/src/components/Slider/Slider.stories.mdx +529 -0
- package/src/components/Slider/Slider.test.tsx +653 -0
- package/src/components/Slider/Slider.tsx +303 -0
- package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +1946 -0
- package/src/components/StyleGuide/Bidirectionality.stories.mdx +1 -1
- package/src/components/StyleGuide/Breakpoints.stories.mdx +21 -7
- package/src/components/StyleGuide/Buttons.stories.mdx +69 -15
- package/src/components/StyleGuide/ColorCard.tsx +0 -1
- package/src/components/StyleGuide/DesignTokens.stories.mdx +170 -0
- package/src/components/StyleGuide/Iconography.stories.mdx +51 -62
- package/src/components/Tabs/Tabs.tsx +5 -5
- package/src/components/Template/Template.stories.mdx +11 -16
- package/src/components/TextInput/TextInput.stories.mdx +1 -1
- package/src/components/TextInput/TextInput.tsx +23 -6
- package/src/components/TextInput/TextInputTypes.tsx +2 -0
- package/src/components/VideoPlayer/VideoPlayer.stories.mdx +2 -3
- package/src/docs/Chakra.stories.mdx +2 -2
- package/src/index.ts +20 -12
- package/src/resources.scss +5 -5
- package/src/styles/base/{_02-breakpoints.scss → _01-breakpoints.scss} +9 -10
- package/src/styles/base/{_03-mixins.scss → _02-mixins.scss} +16 -5
- package/src/styles/base/{_04-base.scss → _03-base.scss} +7 -2
- package/src/styles/base/{_05-focus.scss → _04-focus.scss} +0 -15
- package/src/styles/base/_place-holder.scss +14 -3
- package/src/styles/{03-space → space}/_space-inline.scss +14 -14
- package/src/styles/{03-space → space}/_space-inset.scss +10 -10
- package/src/styles/space/_space-stack.scss +116 -0
- package/src/styles.scss +13 -55
- package/src/theme/components/breadcrumb.ts +10 -0
- package/src/theme/components/button.ts +18 -12
- package/src/theme/components/card.ts +174 -0
- package/src/theme/components/checkbox.ts +7 -2
- package/src/theme/components/checkboxGroup.ts +8 -0
- package/src/theme/components/datePicker.ts +17 -0
- package/src/theme/components/fieldset.ts +18 -0
- package/src/theme/components/global.ts +26 -15
- package/src/theme/components/globalMixins.ts +9 -1
- package/src/theme/components/heading.ts +5 -0
- package/src/theme/components/image.ts +116 -0
- package/src/theme/components/label.ts +3 -10
- package/src/theme/components/link.ts +4 -0
- package/src/theme/components/list.ts +6 -3
- package/src/theme/components/notification.ts +12 -14
- package/src/theme/components/pagination.ts +20 -0
- package/src/theme/components/progressIndicator.ts +62 -0
- package/src/theme/components/radioGroup.ts +8 -0
- package/src/theme/components/select.ts +5 -2
- package/src/theme/components/skeletonLoader.ts +107 -0
- package/src/theme/components/slider.ts +79 -0
- package/src/theme/components/textInput.ts +2 -0
- package/src/theme/foundations/breakpoints.ts +8 -8
- package/src/theme/foundations/global.ts +6 -1
- package/src/theme/index.ts +22 -4
- package/src/utils/componentCategories.ts +4 -3
- package/dist/components/Image/Image.stories.d.ts +0 -18
- package/dist/theme/components/customCheckboxGroup.d.ts +0 -18
- package/dist/theme/components/customRadioGroup.d.ts +0 -18
- package/src/components/Button/_Button.scss +0 -32
- package/src/components/Card/_Card.scss +0 -308
- package/src/components/Image/Image.stories.tsx +0 -54
- package/src/components/Image/_Image.scss +0 -38
- package/src/components/Pagination/_Pagination.scss +0 -40
- package/src/components/SkeletonLoader/_SkeletonLoader.scss +0 -142
- package/src/styles/01-colors/_colors-brand.scss +0 -62
- package/src/styles/01-colors/_colors-utility.scss +0 -67
- package/src/styles/02-typography/_type-scale.css +0 -11
- package/src/styles/02-typography/_type-weight.css +0 -7
- package/src/styles/02-typography/_typefaces.css +0 -4
- package/src/styles/03-space/_space-stack.scss +0 -116
- package/src/styles/03-space/_space.css +0 -30
- package/src/styles/base/_card-grid.scss +0 -77
- package/src/styles/base/_typography.scss +0 -11
- package/src/theme/components/customCheckboxGroup.ts +0 -12
- 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
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
)
|
|
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
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
|
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
|
|
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
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
key={
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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
|
-
<
|
|
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
|
-
<
|
|
91
|
-
<
|
|
92
|
-
|
|
93
|
-
"skeleton-element",
|
|
94
|
-
])}
|
|
95
|
-
></div>
|
|
96
|
-
</div>
|
|
91
|
+
<ChakraSkeleton>
|
|
92
|
+
<Box __css={{ ...styles.element, ...styles.image }} />
|
|
93
|
+
</ChakraSkeleton>
|
|
97
94
|
)}
|
|
98
|
-
<
|
|
99
|
-
{showHeading &&
|
|
100
|
-
|
|
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
|
-
<
|
|
103
|
-
<
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
</
|
|
111
|
-
</
|
|
113
|
+
</Box>
|
|
114
|
+
</Box>
|
|
112
115
|
);
|
|
113
116
|
}
|