@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.
- package/CHANGELOG.md +118 -1
- package/README.md +98 -50
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +4 -0
- package/dist/components/Button/Button.d.ts +13 -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 +17 -13
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +4 -2
- package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +15 -0
- package/dist/components/DatePicker/DatePicker.d.ts +36 -34
- package/dist/components/Fieldset/Fieldset.d.ts +25 -0
- package/dist/components/Heading/Heading.d.ts +4 -4
- package/dist/components/HelperErrorText/HelperErrorText.d.ts +17 -14
- package/dist/components/HorizontalRule/HorizontalRule.d.ts +10 -9
- package/dist/components/Icons/Icon.d.ts +8 -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 +19 -14
- package/dist/components/Notification/Notification.d.ts +37 -16
- 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/Radio/Radio.d.ts +2 -0
- package/dist/components/RadioGroup/RadioGroup.d.ts +4 -2
- package/dist/components/SearchBar/SearchBar.d.ts +3 -3
- package/dist/components/Select/Select.d.ts +2 -0
- package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +18 -14
- package/dist/components/Slider/Slider.d.ts +57 -0
- package/dist/components/StyleGuide/ColorCard.d.ts +12 -0
- package/dist/components/Tabs/Tabs.d.ts +1 -1
- package/dist/components/TextInput/TextInput.d.ts +12 -0
- package/dist/components/VideoPlayer/VideoPlayer.d.ts +6 -8
- package/dist/components/VideoPlayer/VideoPlayerTypes.d.ts +2 -2
- package/dist/design-system-react-components.cjs.development.js +6131 -3715
- 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 +6124 -3699
- package/dist/design-system-react-components.esm.js.map +1 -1
- package/dist/hooks/tests/useCarouselStyles.test.d.ts +1 -0
- package/dist/hooks/useCarouselStyles.d.ts +16 -0
- package/dist/hooks/useNYPLTheme.d.ts +54 -0
- package/dist/hooks/useWindowSize.d.ts +10 -0
- package/dist/index.d.ts +13 -8
- package/dist/resources.scss +180 -170
- package/dist/styles.css +1 -1
- 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/componentWrapper.d.ts +11 -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/helperErrorText.d.ts +10 -0
- package/dist/theme/components/hero.d.ts +1 -0
- package/dist/theme/components/horizontalRule.d.ts +14 -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 +89 -0
- package/dist/theme/components/notification.d.ts +75 -0
- 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/tabs.d.ts +54 -3
- package/dist/theme/components/textInput.d.ts +8 -1
- package/dist/theme/components/videoPlayer.d.ts +40 -0
- package/dist/theme/foundations/breakpoints.d.ts +8 -8
- package/dist/theme/foundations/global.d.ts +6 -1
- package/dist/theme/foundations/radii.d.ts +5 -0
- package/dist/theme/foundations/spacing.d.ts +16 -16
- package/package.json +72 -83
- package/src/__tests__/setup.ts +2 -2
- package/src/components/Accordion/Accordion.stories.mdx +39 -44
- package/src/components/Autosuggest/Autosuggest.stories.mdx +3 -3
- package/src/components/Autosuggest/Autosuggest.stories.tsx +2 -1
- package/src/components/Autosuggest/_Autosuggest.scss +5 -5
- package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +14 -10
- package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +23 -0
- package/src/components/Breadcrumbs/Breadcrumbs.tsx +5 -1
- package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +199 -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 +22 -34
- 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 +15 -16
- package/src/components/Chakra/Center.stories.mdx +31 -16
- package/src/components/Chakra/Grid.stories.mdx +28 -15
- 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 +47 -2
- package/src/components/Checkbox/Checkbox.tsx +39 -33
- 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 +29 -2
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +22 -18
- package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +47 -81
- package/src/components/ComponentWrapper/ComponentWrapper.tsx +63 -0
- package/src/components/DatePicker/DatePicker.stories.mdx +163 -62
- package/src/components/DatePicker/DatePicker.test.tsx +264 -64
- package/src/components/DatePicker/DatePicker.tsx +159 -128
- 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 +24 -6
- package/src/components/Form/Form.test.tsx +1 -1
- 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/Heading/Heading.tsx +5 -5
- package/src/components/HelperErrorText/HelperErrorText.stories.mdx +124 -0
- package/src/components/HelperErrorText/HelperErrorText.test.tsx +39 -44
- package/src/components/HelperErrorText/HelperErrorText.tsx +37 -39
- package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +25 -0
- package/src/components/Hero/Hero.stories.mdx +12 -2
- package/src/components/Hero/Hero.tsx +1 -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 +8 -6
- package/src/components/HorizontalRule/HorizontalRule.test.tsx +33 -28
- package/src/components/HorizontalRule/HorizontalRule.tsx +27 -29
- package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +27 -9
- package/src/components/Icons/Icon.stories.mdx +12 -4
- package/src/components/Icons/Icon.test.tsx +18 -0
- package/src/components/Icons/Icon.tsx +16 -1
- 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 +23 -67
- package/src/components/Input/Input.test.tsx +4 -4
- package/src/components/Input/_Input.scss +23 -14
- package/src/components/Link/Link.tsx +4 -1
- package/src/components/List/List.stories.mdx +124 -49
- package/src/components/List/List.test.tsx +142 -63
- package/src/components/List/List.tsx +89 -93
- package/src/components/List/__snapshots__/List.test.tsx.snap +109 -0
- package/src/components/Modal/Modal.stories.mdx +3 -3
- package/src/components/Modal/_Modal.scss +2 -2
- package/src/components/Notification/Notification.stories.mdx +109 -112
- package/src/components/Notification/Notification.test.tsx +99 -110
- package/src/components/Notification/Notification.tsx +156 -159
- package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +159 -8
- 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/Radio.test.tsx +20 -4
- package/src/components/Radio/Radio.tsx +6 -3
- 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.test.tsx +24 -1
- package/src/components/RadioGroup/RadioGroup.tsx +19 -19
- package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +42 -72
- package/src/components/SearchBar/SearchBar.Test.tsx +20 -1
- package/src/components/SearchBar/SearchBar.stories.mdx +113 -8
- package/src/components/SearchBar/SearchBar.tsx +20 -10
- package/src/components/Select/Select.test.tsx +12 -0
- package/src/components/Select/Select.tsx +5 -2
- 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 +34 -10
- package/src/components/StyleGuide/Buttons.stories.mdx +89 -73
- package/src/components/StyleGuide/ColorCard.tsx +46 -0
- package/src/components/StyleGuide/Colors.stories.mdx +171 -311
- package/src/components/StyleGuide/DesignTokens.stories.mdx +170 -0
- package/src/components/StyleGuide/Forms.stories.mdx +9 -7
- package/src/components/StyleGuide/Iconography.stories.mdx +85 -91
- package/src/components/StyleGuide/Spacing.stories.mdx +31 -23
- package/src/components/StyleGuide/Typography.stories.mdx +202 -189
- package/src/components/StyleGuide/UIDocCard.tsx +1 -1
- package/src/components/Tabs/Tabs.stories.mdx +73 -11
- package/src/components/Tabs/Tabs.tsx +87 -64
- package/src/components/Template/Template.stories.mdx +25 -27
- package/src/components/TextInput/TextInput.stories.mdx +1 -1
- package/src/components/TextInput/TextInput.test.tsx +22 -2
- package/src/components/TextInput/TextInput.tsx +28 -8
- package/src/components/TextInput/TextInputTypes.tsx +2 -0
- package/src/components/VideoPlayer/VideoPlayer.stories.mdx +17 -4
- package/src/components/VideoPlayer/VideoPlayer.test.tsx +54 -53
- package/src/components/VideoPlayer/VideoPlayer.tsx +50 -51
- package/src/components/VideoPlayer/VideoPlayerTypes.tsx +2 -2
- package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +91 -0
- package/src/docs/Chakra.stories.mdx +244 -63
- package/src/docs/Intro.stories.mdx +5 -2
- package/src/hooks/tests/useCarouselStyles.test.ts +140 -0
- package/src/hooks/tests/useNYPLTheme.test.tsx +36 -0
- package/src/hooks/useCarouselStyles.ts +34 -0
- package/src/hooks/useNYPLTheme.ts +67 -0
- package/src/hooks/useWindowSize.ts +40 -0
- package/src/index.ts +22 -19
- 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 -60
- package/src/theme/components/button.ts +21 -15
- package/src/theme/components/card.ts +174 -0
- package/src/theme/components/checkbox.ts +8 -3
- package/src/theme/components/checkboxGroup.ts +8 -0
- package/src/theme/components/componentWrapper.ts +10 -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 +10 -5
- package/src/theme/components/helperErrorText.ts +9 -0
- package/src/theme/components/hero.ts +4 -3
- package/src/theme/components/horizontalRule.ts +13 -0
- package/src/theme/components/icon.ts +9 -9
- package/src/theme/components/image.ts +116 -0
- package/src/theme/components/label.ts +3 -10
- package/src/theme/components/link.ts +5 -1
- package/src/theme/components/list.ts +73 -0
- package/src/theme/components/notification.ts +93 -0
- package/src/theme/components/pagination.ts +20 -0
- package/src/theme/components/progressIndicator.ts +62 -0
- package/src/theme/components/radio.ts +2 -2
- package/src/theme/components/radioGroup.ts +8 -0
- package/src/theme/components/select.ts +6 -3
- package/src/theme/components/skeletonLoader.ts +107 -0
- package/src/theme/components/slider.ts +79 -0
- package/src/theme/components/statusBadge.ts +1 -2
- package/src/theme/components/tabs.ts +49 -19
- package/src/theme/components/template.ts +8 -8
- package/src/theme/components/textInput.ts +5 -4
- package/src/theme/components/videoPlayer.ts +49 -0
- package/src/theme/foundations/breakpoints.ts +8 -8
- package/src/theme/foundations/global.ts +6 -1
- package/src/theme/foundations/radii.ts +6 -0
- package/src/theme/foundations/spacing.ts +24 -24
- package/src/theme/index.ts +41 -10
- package/src/utils/componentCategories.ts +4 -3
- package/dist/components/HelperErrorText/HelperErrorText.stories.d.ts +0 -16
- package/dist/components/Image/Image.stories.d.ts +0 -18
- package/dist/components/List/List.stories.d.ts +0 -7
- 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/HelperErrorText/HelperErrorText.stories.tsx +0 -48
- package/src/components/HelperErrorText/_HelperErrorText.scss +0 -9
- package/src/components/HorizontalRule/_HorizontalRule.scss +0 -15
- package/src/components/Image/Image.stories.tsx +0 -54
- package/src/components/Image/_Image.scss +0 -38
- package/src/components/List/List.stories.tsx +0 -139
- package/src/components/List/_List.scss +0 -76
- package/src/components/Notification/_Notification.scss +0 -110
- package/src/components/Pagination/_Pagination.scss +0 -40
- package/src/components/SkeletonLoader/_SkeletonLoader.scss +0 -142
- package/src/components/VideoPlayer/_VideoPlayer.scss +0 -38
- 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 -78
- package/src/styles/base/_typography.scss +0 -11
- package/src/theme/components/customCheckboxGroup.ts +0 -12
- package/src/theme/components/customRadioGroup.ts +0 -12
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Meta,
|
|
3
|
+
Story,
|
|
4
|
+
ArgsTable,
|
|
5
|
+
Canvas,
|
|
6
|
+
Description,
|
|
7
|
+
} from "@storybook/addon-docs/blocks";
|
|
8
|
+
import { withDesign } from "storybook-addon-designs";
|
|
9
|
+
import { Box } from "@chakra-ui/react";
|
|
10
|
+
|
|
11
|
+
import ProgressIndicator from "./ProgressIndicator";
|
|
12
|
+
import {
|
|
13
|
+
ProgressIndicatorSizes,
|
|
14
|
+
ProgressIndicatorTypes,
|
|
15
|
+
} from "./ProgressIndicatorTypes";
|
|
16
|
+
import { getCategory } from "../../utils/componentCategories";
|
|
17
|
+
import DSProvider from "../../theme/provider";
|
|
18
|
+
import SimpleGrid from "../Grid/SimpleGrid";
|
|
19
|
+
import { GridGaps } from "../Grid/GridTypes";
|
|
20
|
+
|
|
21
|
+
<Meta
|
|
22
|
+
title={getCategory("ProgressIndicator")}
|
|
23
|
+
component={ProgressIndicator}
|
|
24
|
+
decorators={[withDesign]}
|
|
25
|
+
parameters={{
|
|
26
|
+
design: {
|
|
27
|
+
type: "figma",
|
|
28
|
+
url:
|
|
29
|
+
"https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=37638%3A23842",
|
|
30
|
+
},
|
|
31
|
+
jest: ["ProgressIndicator.test.tsx"],
|
|
32
|
+
}}
|
|
33
|
+
argTypes={{
|
|
34
|
+
id: { table: { disable: true } },
|
|
35
|
+
}}
|
|
36
|
+
/>
|
|
37
|
+
|
|
38
|
+
# ProgressIndicator
|
|
39
|
+
|
|
40
|
+
| Component Version | DS Version |
|
|
41
|
+
| ----------------- | ---------- |
|
|
42
|
+
| Added | `0.25.4` |
|
|
43
|
+
| Latest | `0.25.4` |
|
|
44
|
+
|
|
45
|
+
<Description of={ProgressIndicator} />
|
|
46
|
+
|
|
47
|
+
<Canvas withToolbar>
|
|
48
|
+
<Story
|
|
49
|
+
name="Basic with props"
|
|
50
|
+
args={{
|
|
51
|
+
darkMode: false,
|
|
52
|
+
indicatorType: ProgressIndicatorTypes.Linear,
|
|
53
|
+
isIndeterminate: false,
|
|
54
|
+
labelText: "Progress",
|
|
55
|
+
showLabel: true,
|
|
56
|
+
size: ProgressIndicatorSizes.Default,
|
|
57
|
+
value: 50,
|
|
58
|
+
}}
|
|
59
|
+
>
|
|
60
|
+
{(args) => <ProgressIndicator {...args} />}
|
|
61
|
+
</Story>
|
|
62
|
+
</Canvas>
|
|
63
|
+
|
|
64
|
+
<ArgsTable story="Basic with props" />
|
|
65
|
+
|
|
66
|
+
## Linear Type
|
|
67
|
+
|
|
68
|
+
Progress bars are preferred in vertically narrow areas such as tables, cards,
|
|
69
|
+
dialogs, etc.
|
|
70
|
+
|
|
71
|
+
<Canvas>
|
|
72
|
+
<Story
|
|
73
|
+
name="Linear Type"
|
|
74
|
+
args={{
|
|
75
|
+
darkMode: false,
|
|
76
|
+
indicatorType: ProgressIndicatorTypes.Linear,
|
|
77
|
+
isIndeterminate: false,
|
|
78
|
+
labelText: "Linear Progress Type",
|
|
79
|
+
showLabel: true,
|
|
80
|
+
size: ProgressIndicatorSizes.Default,
|
|
81
|
+
value: 50,
|
|
82
|
+
}}
|
|
83
|
+
argTypes={{
|
|
84
|
+
indicatorType: { table: { disable: true } },
|
|
85
|
+
}}
|
|
86
|
+
>
|
|
87
|
+
{(args) => <ProgressIndicator {...args} />}
|
|
88
|
+
</Story>
|
|
89
|
+
</Canvas>
|
|
90
|
+
|
|
91
|
+
## Circular Type
|
|
92
|
+
|
|
93
|
+
The circular progress type is preferred for large content areas and for
|
|
94
|
+
full-screen loading. Set the `indicatorType` prop to
|
|
95
|
+
`ProgressIndicatorTypes.Circular` for this type.
|
|
96
|
+
|
|
97
|
+
<Canvas>
|
|
98
|
+
<Story
|
|
99
|
+
name="Circular Type"
|
|
100
|
+
args={{
|
|
101
|
+
darkMode: false,
|
|
102
|
+
indicatorType: ProgressIndicatorTypes.Circular,
|
|
103
|
+
isIndeterminate: false,
|
|
104
|
+
labelText: "Circular Progress Type",
|
|
105
|
+
showLabel: true,
|
|
106
|
+
size: ProgressIndicatorSizes.Default,
|
|
107
|
+
value: 50,
|
|
108
|
+
}}
|
|
109
|
+
argTypes={{
|
|
110
|
+
indicatorType: { table: { disable: true } },
|
|
111
|
+
}}
|
|
112
|
+
>
|
|
113
|
+
{(args) => <ProgressIndicator {...args} />}
|
|
114
|
+
</Story>
|
|
115
|
+
</Canvas>
|
|
116
|
+
|
|
117
|
+
### Sizing
|
|
118
|
+
|
|
119
|
+
The starting height for the progress bar is 4px on mobile and 8px for desktop.
|
|
120
|
+
The `size` prop can be used to optionally set the height to 4px for desktop
|
|
121
|
+
through the `ProgressIndicatorSizes.Small` value.
|
|
122
|
+
|
|
123
|
+
`size={ProgressIndicatorSizes.Small}`
|
|
124
|
+
|
|
125
|
+
<Canvas>
|
|
126
|
+
<DSProvider>
|
|
127
|
+
<SimpleGrid columns={1} gap={GridGaps.Medium}>
|
|
128
|
+
<ProgressIndicator labelText="Default 8px size" value={50} />
|
|
129
|
+
<ProgressIndicator
|
|
130
|
+
labelText="Small 4px size"
|
|
131
|
+
size={ProgressIndicatorSizes.Small}
|
|
132
|
+
value={50}
|
|
133
|
+
/>
|
|
134
|
+
</SimpleGrid>
|
|
135
|
+
</DSProvider>
|
|
136
|
+
</Canvas>
|
|
137
|
+
|
|
138
|
+
The starting size for the circular progress is 48px and can be made smaller to
|
|
139
|
+
24px with the `size` prop. The small 24px size can be used for inline local
|
|
140
|
+
changes in content. Note that in the small size, the label text and the
|
|
141
|
+
percentage will not displayed.
|
|
142
|
+
|
|
143
|
+
`size={ProgressIndicatorSizes.Small}`
|
|
144
|
+
|
|
145
|
+
<Canvas>
|
|
146
|
+
<DSProvider>
|
|
147
|
+
<SimpleGrid columns={1} gap={GridGaps.Medium}>
|
|
148
|
+
<ProgressIndicator
|
|
149
|
+
labelText="Default 48px size"
|
|
150
|
+
indicatorType={ProgressIndicatorTypes.Circular}
|
|
151
|
+
value={50}
|
|
152
|
+
/>
|
|
153
|
+
<ProgressIndicator
|
|
154
|
+
labelText="Small 24px size"
|
|
155
|
+
indicatorType={ProgressIndicatorTypes.Circular}
|
|
156
|
+
size={ProgressIndicatorSizes.Small}
|
|
157
|
+
value={50}
|
|
158
|
+
/>
|
|
159
|
+
</SimpleGrid>
|
|
160
|
+
</DSProvider>
|
|
161
|
+
</Canvas>
|
|
162
|
+
|
|
163
|
+
### Labels
|
|
164
|
+
|
|
165
|
+
The `labelText` value and the `value` percentage are displayed by default. They
|
|
166
|
+
can be hidden through the `showLabel` prop.
|
|
167
|
+
|
|
168
|
+
`showLabel={false}`
|
|
169
|
+
|
|
170
|
+
Accessibility Note: when `showLabel` is false, the `aria-label` prop is set in
|
|
171
|
+
the progress element to provide a description of the progress for screen readers.
|
|
172
|
+
|
|
173
|
+
<Canvas>
|
|
174
|
+
<DSProvider>
|
|
175
|
+
<SimpleGrid columns={1} gap={GridGaps.Medium}>
|
|
176
|
+
<ProgressIndicator
|
|
177
|
+
labelText="This label will be added through aria-label"
|
|
178
|
+
value={50}
|
|
179
|
+
showLabel={false}
|
|
180
|
+
/>
|
|
181
|
+
<ProgressIndicator
|
|
182
|
+
labelText="This label will be added through aria-label"
|
|
183
|
+
indicatorType={ProgressIndicatorTypes.Circular}
|
|
184
|
+
value={50}
|
|
185
|
+
showLabel={false}
|
|
186
|
+
/>
|
|
187
|
+
</SimpleGrid>
|
|
188
|
+
</DSProvider>
|
|
189
|
+
</Canvas>
|
|
190
|
+
|
|
191
|
+
### Indeterminate State
|
|
192
|
+
|
|
193
|
+
When the `isIndeterminate` prop is set to true, the `value` prop is ignored and
|
|
194
|
+
the state is set to an animated indeterminate state. This is often used when the
|
|
195
|
+
exact value or progress of the task is unknown.
|
|
196
|
+
|
|
197
|
+
<Canvas>
|
|
198
|
+
<DSProvider>
|
|
199
|
+
<SimpleGrid columns={1} gap={GridGaps.Medium}>
|
|
200
|
+
<ProgressIndicator
|
|
201
|
+
labelText="Indeterminate state"
|
|
202
|
+
isIndeterminate
|
|
203
|
+
value={50}
|
|
204
|
+
/>
|
|
205
|
+
<ProgressIndicator
|
|
206
|
+
labelText="Indeterminate state"
|
|
207
|
+
indicatorType={ProgressIndicatorTypes.Circular}
|
|
208
|
+
isIndeterminate
|
|
209
|
+
value={50}
|
|
210
|
+
/>
|
|
211
|
+
</SimpleGrid>
|
|
212
|
+
</DSProvider>
|
|
213
|
+
</Canvas>
|
|
214
|
+
|
|
215
|
+
### Dark Mode
|
|
216
|
+
|
|
217
|
+
When in "dark mode", set the `darkMode` prop to true. This will render the
|
|
218
|
+
progress bar and the label text in white for better contrast.
|
|
219
|
+
|
|
220
|
+
Note: the background is manually set to better showcase the `darkMode` prop.
|
|
221
|
+
|
|
222
|
+
<Canvas>
|
|
223
|
+
<DSProvider>
|
|
224
|
+
<Box bg="black" w="100%" h="200px" p="20px">
|
|
225
|
+
<SimpleGrid columns={1} gap={GridGaps.Medium}>
|
|
226
|
+
<ProgressIndicator labelText="Dark Mode" value={50} darkMode />
|
|
227
|
+
<ProgressIndicator
|
|
228
|
+
labelText="Dark Mode"
|
|
229
|
+
indicatorType={ProgressIndicatorTypes.Circular}
|
|
230
|
+
value={50}
|
|
231
|
+
darkMode
|
|
232
|
+
/>
|
|
233
|
+
</SimpleGrid>
|
|
234
|
+
</Box>
|
|
235
|
+
</DSProvider>
|
|
236
|
+
</Canvas>
|
|
237
|
+
|
|
238
|
+
### Example
|
|
239
|
+
|
|
240
|
+
In the following example, we are setting the `value` prop based on a timer that
|
|
241
|
+
increases the value every second by 10. Once it reaches 100, it resets to 0.
|
|
242
|
+
This is a very simple example using `React.useState` to manage the state but in
|
|
243
|
+
a real application the value would come from a data source or server.
|
|
244
|
+
|
|
245
|
+
```tsx
|
|
246
|
+
// Example code
|
|
247
|
+
function ProgressIndicatorExample() {
|
|
248
|
+
const [value, setValue] = React.useState(0);
|
|
249
|
+
React.useEffect(() => {
|
|
250
|
+
const interval = setInterval(() => {
|
|
251
|
+
setValue((value) => (value === 100 ? 0 : value + 10));
|
|
252
|
+
}, 1000);
|
|
253
|
+
return () => clearInterval(interval);
|
|
254
|
+
}, []);
|
|
255
|
+
return (
|
|
256
|
+
<SimpleGrid columns={1} gap={GridGaps.Medium}>
|
|
257
|
+
<ProgressIndicator labelText="Progress example" value={value} />
|
|
258
|
+
<ProgressIndicator
|
|
259
|
+
labelText="Progress example"
|
|
260
|
+
indicatorType={ProgressIndicatorTypes.Circular}
|
|
261
|
+
value={value}
|
|
262
|
+
/>
|
|
263
|
+
</SimpleGrid>
|
|
264
|
+
);
|
|
265
|
+
}
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
export function ProgressIndicatorExample() {
|
|
269
|
+
const [value, setValue] = React.useState(0);
|
|
270
|
+
React.useEffect(() => {
|
|
271
|
+
const interval = setInterval(() => {
|
|
272
|
+
setValue((value) => (value === 100 ? 0 : value + 10));
|
|
273
|
+
}, 1000);
|
|
274
|
+
return () => clearInterval(interval);
|
|
275
|
+
}, []);
|
|
276
|
+
return (
|
|
277
|
+
<SimpleGrid columns={1} gap={GridGaps.Medium}>
|
|
278
|
+
<ProgressIndicator labelText="Progress example" value={value} />
|
|
279
|
+
<ProgressIndicator
|
|
280
|
+
labelText="Progress example"
|
|
281
|
+
indicatorType={ProgressIndicatorTypes.Circular}
|
|
282
|
+
value={value}
|
|
283
|
+
/>
|
|
284
|
+
</SimpleGrid>
|
|
285
|
+
);
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
<Canvas>
|
|
289
|
+
<DSProvider>
|
|
290
|
+
<ProgressIndicatorExample />
|
|
291
|
+
</DSProvider>
|
|
292
|
+
</Canvas>
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { render, screen } from "@testing-library/react";
|
|
3
|
+
import { axe } from "jest-axe";
|
|
4
|
+
import renderer from "react-test-renderer";
|
|
5
|
+
|
|
6
|
+
import ProgressIndicator from "./ProgressIndicator";
|
|
7
|
+
import { ProgressIndicatorTypes } from "./ProgressIndicatorTypes";
|
|
8
|
+
|
|
9
|
+
describe("ProgressIndicator Accessibility", () => {
|
|
10
|
+
it("passes axe accessibility for linear and circular types", async () => {
|
|
11
|
+
const linearUtils = render(
|
|
12
|
+
<ProgressIndicator labelText="Linear" value={50} />
|
|
13
|
+
);
|
|
14
|
+
const circularUtils = render(
|
|
15
|
+
<ProgressIndicator
|
|
16
|
+
labelText="Circular"
|
|
17
|
+
value={50}
|
|
18
|
+
indicatorType={ProgressIndicatorTypes.Circular}
|
|
19
|
+
/>
|
|
20
|
+
);
|
|
21
|
+
expect(await axe(linearUtils.container)).toHaveNoViolations();
|
|
22
|
+
expect(await axe(circularUtils.container)).toHaveNoViolations();
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("passes axe accessibility for linear and circular types without labels", async () => {
|
|
26
|
+
const linearUtils = render(
|
|
27
|
+
<ProgressIndicator labelText="Linear" value={50} showLabel={false} />
|
|
28
|
+
);
|
|
29
|
+
const circularUtils = render(
|
|
30
|
+
<ProgressIndicator
|
|
31
|
+
labelText="Circular"
|
|
32
|
+
value={50}
|
|
33
|
+
indicatorType={ProgressIndicatorTypes.Circular}
|
|
34
|
+
showLabel={false}
|
|
35
|
+
/>
|
|
36
|
+
);
|
|
37
|
+
expect(await axe(linearUtils.container)).toHaveNoViolations();
|
|
38
|
+
expect(await axe(circularUtils.container)).toHaveNoViolations();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("passes axe accessibility for linear and circular types for indeterminate state", async () => {
|
|
42
|
+
const linearUtils = render(
|
|
43
|
+
<ProgressIndicator labelText="Linear" value={50} isIndeterminate />
|
|
44
|
+
);
|
|
45
|
+
const circularUtils = render(
|
|
46
|
+
<ProgressIndicator
|
|
47
|
+
labelText="Circular"
|
|
48
|
+
value={50}
|
|
49
|
+
indicatorType={ProgressIndicatorTypes.Circular}
|
|
50
|
+
isIndeterminate
|
|
51
|
+
/>
|
|
52
|
+
);
|
|
53
|
+
expect(await axe(linearUtils.container)).toHaveNoViolations();
|
|
54
|
+
expect(await axe(circularUtils.container)).toHaveNoViolations();
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("passes axe accessibility for linear and circular types for dark mode", async () => {
|
|
58
|
+
const linearUtils = render(
|
|
59
|
+
<ProgressIndicator labelText="Linear" value={50} darkMode />
|
|
60
|
+
);
|
|
61
|
+
const circularUtils = render(
|
|
62
|
+
<ProgressIndicator
|
|
63
|
+
labelText="Circular"
|
|
64
|
+
value={50}
|
|
65
|
+
indicatorType={ProgressIndicatorTypes.Circular}
|
|
66
|
+
darkMode
|
|
67
|
+
/>
|
|
68
|
+
);
|
|
69
|
+
expect(await axe(linearUtils.container)).toHaveNoViolations();
|
|
70
|
+
expect(await axe(circularUtils.container)).toHaveNoViolations();
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
describe("ProgressIndicator", () => {
|
|
75
|
+
it("renders a label and a progressbar for the linear type", () => {
|
|
76
|
+
render(<ProgressIndicator labelText="Linear" value={50} />);
|
|
77
|
+
expect(screen.getByLabelText("Linear")).toBeInTheDocument();
|
|
78
|
+
expect(screen.getByRole("progressbar")).toBeInTheDocument();
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it("renders a label, a progressbar, and an svg for the circular type", () => {
|
|
82
|
+
const { container } = render(
|
|
83
|
+
<ProgressIndicator
|
|
84
|
+
labelText="Circular"
|
|
85
|
+
indicatorType={ProgressIndicatorTypes.Circular}
|
|
86
|
+
value={50}
|
|
87
|
+
/>
|
|
88
|
+
);
|
|
89
|
+
expect(screen.getByLabelText("Circular")).toBeInTheDocument();
|
|
90
|
+
expect(screen.getByRole("progressbar")).toBeInTheDocument();
|
|
91
|
+
expect(container.querySelector("svg")).toBeInTheDocument();
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it("renders the appropriate aria atttribute when the label is hidden", () => {
|
|
95
|
+
render(
|
|
96
|
+
<ProgressIndicator labelText="Linear" value={50} showLabel={false} />
|
|
97
|
+
);
|
|
98
|
+
expect(screen.getByLabelText("Linear")).toBeInTheDocument();
|
|
99
|
+
expect(screen.getByRole("progressbar")).toHaveAttribute(
|
|
100
|
+
"aria-label",
|
|
101
|
+
"Linear"
|
|
102
|
+
);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it("renders the value passed", () => {
|
|
106
|
+
const { rerender } = render(
|
|
107
|
+
<ProgressIndicator labelText="Linear" value={50} />
|
|
108
|
+
);
|
|
109
|
+
expect(screen.getByText("50%")).toBeInTheDocument();
|
|
110
|
+
|
|
111
|
+
rerender(<ProgressIndicator labelText="Linear" value={89} />);
|
|
112
|
+
expect(screen.getByText("89%")).toBeInTheDocument();
|
|
113
|
+
|
|
114
|
+
rerender(<ProgressIndicator labelText="Linear" value={4} />);
|
|
115
|
+
expect(screen.getByText("4%")).toBeInTheDocument();
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it("logs a warning if a value less than 0 is passed", () => {
|
|
119
|
+
const warn = jest.spyOn(console, "warn");
|
|
120
|
+
render(<ProgressIndicator labelText="Linear" value={-20} />);
|
|
121
|
+
|
|
122
|
+
expect(warn).toHaveBeenCalledWith(
|
|
123
|
+
"ProgressIndicator: pass in a `value` between 0 and 100. Defaulting to 0."
|
|
124
|
+
);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it("logs a warning if a value more than 100 is passed", () => {
|
|
128
|
+
const warn = jest.spyOn(console, "warn");
|
|
129
|
+
render(<ProgressIndicator labelText="Linear" value={150} />);
|
|
130
|
+
|
|
131
|
+
expect(warn).toHaveBeenCalledWith(
|
|
132
|
+
"ProgressIndicator: pass in a `value` between 0 and 100. Defaulting to 0."
|
|
133
|
+
);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it("Renders the UI snapshot correctly", () => {
|
|
137
|
+
const linearBasic = renderer
|
|
138
|
+
.create(
|
|
139
|
+
<ProgressIndicator id="linearBasic" labelText="Linear" value={50} />
|
|
140
|
+
)
|
|
141
|
+
.toJSON();
|
|
142
|
+
const circularBasic = renderer
|
|
143
|
+
.create(
|
|
144
|
+
<ProgressIndicator
|
|
145
|
+
id="circularBasic"
|
|
146
|
+
labelText="Circular"
|
|
147
|
+
value={50}
|
|
148
|
+
indicatorType={ProgressIndicatorTypes.Circular}
|
|
149
|
+
/>
|
|
150
|
+
)
|
|
151
|
+
.toJSON();
|
|
152
|
+
const linearNoLabel = renderer
|
|
153
|
+
.create(
|
|
154
|
+
<ProgressIndicator
|
|
155
|
+
id="linearNoLabel"
|
|
156
|
+
labelText="Linear"
|
|
157
|
+
value={50}
|
|
158
|
+
showLabel={false}
|
|
159
|
+
/>
|
|
160
|
+
)
|
|
161
|
+
.toJSON();
|
|
162
|
+
const circularNoLabel = renderer
|
|
163
|
+
.create(
|
|
164
|
+
<ProgressIndicator
|
|
165
|
+
id="circularNoLabel"
|
|
166
|
+
labelText="Circular"
|
|
167
|
+
value={50}
|
|
168
|
+
indicatorType={ProgressIndicatorTypes.Circular}
|
|
169
|
+
showLabel={false}
|
|
170
|
+
/>
|
|
171
|
+
)
|
|
172
|
+
.toJSON();
|
|
173
|
+
const linearIndeterminate = renderer
|
|
174
|
+
.create(
|
|
175
|
+
<ProgressIndicator
|
|
176
|
+
id="linearIndeterminate"
|
|
177
|
+
labelText="Linear"
|
|
178
|
+
value={50}
|
|
179
|
+
isIndeterminate
|
|
180
|
+
/>
|
|
181
|
+
)
|
|
182
|
+
.toJSON();
|
|
183
|
+
const circularIndeterminate = renderer
|
|
184
|
+
.create(
|
|
185
|
+
<ProgressIndicator
|
|
186
|
+
id="circularIndeterminate"
|
|
187
|
+
labelText="Circular"
|
|
188
|
+
value={50}
|
|
189
|
+
indicatorType={ProgressIndicatorTypes.Circular}
|
|
190
|
+
isIndeterminate
|
|
191
|
+
/>
|
|
192
|
+
)
|
|
193
|
+
.toJSON();
|
|
194
|
+
const linearDarkMode = renderer
|
|
195
|
+
.create(
|
|
196
|
+
<ProgressIndicator
|
|
197
|
+
id="linearDarkMode"
|
|
198
|
+
labelText="Linear"
|
|
199
|
+
value={50}
|
|
200
|
+
darkMode
|
|
201
|
+
/>
|
|
202
|
+
)
|
|
203
|
+
.toJSON();
|
|
204
|
+
const circularDarkMode = renderer
|
|
205
|
+
.create(
|
|
206
|
+
<ProgressIndicator
|
|
207
|
+
id="circularDarkMode"
|
|
208
|
+
labelText="Circular"
|
|
209
|
+
value={50}
|
|
210
|
+
indicatorType={ProgressIndicatorTypes.Circular}
|
|
211
|
+
darkMode
|
|
212
|
+
/>
|
|
213
|
+
)
|
|
214
|
+
.toJSON();
|
|
215
|
+
|
|
216
|
+
expect(linearBasic).toMatchSnapshot();
|
|
217
|
+
expect(circularBasic).toMatchSnapshot();
|
|
218
|
+
expect(linearNoLabel).toMatchSnapshot();
|
|
219
|
+
expect(circularNoLabel).toMatchSnapshot();
|
|
220
|
+
expect(linearIndeterminate).toMatchSnapshot();
|
|
221
|
+
expect(circularIndeterminate).toMatchSnapshot();
|
|
222
|
+
expect(linearDarkMode).toMatchSnapshot();
|
|
223
|
+
expect(circularDarkMode).toMatchSnapshot();
|
|
224
|
+
});
|
|
225
|
+
});
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import {
|
|
3
|
+
Box,
|
|
4
|
+
CircularProgress as ChakraCircularProgress,
|
|
5
|
+
CircularProgressLabel as ChakraCircularProgressLabel,
|
|
6
|
+
Progress as ChakraProgress,
|
|
7
|
+
useMultiStyleConfig,
|
|
8
|
+
} from "@chakra-ui/react";
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
ProgressIndicatorSizes,
|
|
12
|
+
ProgressIndicatorTypes,
|
|
13
|
+
} from "./ProgressIndicatorTypes";
|
|
14
|
+
import generateUUID from "../../helpers/generateUUID";
|
|
15
|
+
import Label from "../Label/Label";
|
|
16
|
+
|
|
17
|
+
export interface ProgressIndicatorProps {
|
|
18
|
+
/** Flag to render the component in a dark background. */
|
|
19
|
+
darkMode?: boolean;
|
|
20
|
+
/** ID that other components can cross reference for accessibility purposes. */
|
|
21
|
+
id?: string;
|
|
22
|
+
/** Whether the `ProgressIndicator` should be linear or circular. */
|
|
23
|
+
indicatorType?: ProgressIndicatorTypes;
|
|
24
|
+
/** Whether the progress animation should display because the `value` prop is
|
|
25
|
+
* not known. When this is set to `true`, the `value` prop will be ignored. */
|
|
26
|
+
isIndeterminate?: boolean;
|
|
27
|
+
/** The text to display in an HTML `label` element. */
|
|
28
|
+
labelText: string;
|
|
29
|
+
/** Visually show or hide the label text. When set to `false`, then the label
|
|
30
|
+
* text will be added to the parent component as its `aria-label` attribute. */
|
|
31
|
+
showLabel?: boolean;
|
|
32
|
+
/** The size of the linear or circular progress. */
|
|
33
|
+
size?: ProgressIndicatorSizes;
|
|
34
|
+
/** A number between 0 to 100 that defines the progress' value. */
|
|
35
|
+
value?: number;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* A component that displays a progress status for any task that takes a long
|
|
40
|
+
* time to complete or consists of multiple steps. Examples include downloading,
|
|
41
|
+
* uploading, or processing.
|
|
42
|
+
*/
|
|
43
|
+
const ProgressIndicator: React.FC<ProgressIndicatorProps> = (
|
|
44
|
+
props: ProgressIndicatorProps
|
|
45
|
+
) => {
|
|
46
|
+
const {
|
|
47
|
+
darkMode = false,
|
|
48
|
+
id = generateUUID(),
|
|
49
|
+
indicatorType = ProgressIndicatorTypes.Linear,
|
|
50
|
+
isIndeterminate = false,
|
|
51
|
+
labelText,
|
|
52
|
+
showLabel = true,
|
|
53
|
+
size = ProgressIndicatorSizes.Default,
|
|
54
|
+
value = 0,
|
|
55
|
+
} = props;
|
|
56
|
+
const styles = useMultiStyleConfig("ProgressIndicator", {
|
|
57
|
+
darkMode,
|
|
58
|
+
size,
|
|
59
|
+
});
|
|
60
|
+
let finalValue = value;
|
|
61
|
+
if (finalValue < 0 || finalValue > 100) {
|
|
62
|
+
console.warn(
|
|
63
|
+
"ProgressIndicator: pass in a `value` between 0 and 100. Defaulting to 0."
|
|
64
|
+
);
|
|
65
|
+
finalValue = 0;
|
|
66
|
+
}
|
|
67
|
+
const progressProps = {
|
|
68
|
+
id,
|
|
69
|
+
// If the label is visually shown, associate it with the progress indicator.
|
|
70
|
+
// Otherwise, the `aria-label` will be added.
|
|
71
|
+
"aria-label": showLabel ? null : labelText,
|
|
72
|
+
"aria-labelledby": showLabel ? `${id}-label` : null,
|
|
73
|
+
// If `isIndeterminate` is true, then it overrides the `value` prop.
|
|
74
|
+
isIndeterminate: isIndeterminate || null,
|
|
75
|
+
value: isIndeterminate ? null : finalValue,
|
|
76
|
+
};
|
|
77
|
+
const progressComponent = (indicatorType) => {
|
|
78
|
+
// Only display the percentage text for the default size, not in the
|
|
79
|
+
// indeterminate state, and when `showLabel` is true.
|
|
80
|
+
if (indicatorType === ProgressIndicatorTypes.Circular) {
|
|
81
|
+
// For the small size, since the label won't be visible, we need to add
|
|
82
|
+
// it to the parent component's `aria-label` attribute.
|
|
83
|
+
if (size === ProgressIndicatorSizes.Small) {
|
|
84
|
+
progressProps["aria-label"] = labelText;
|
|
85
|
+
}
|
|
86
|
+
return (
|
|
87
|
+
<Box __css={styles.circularContainer}>
|
|
88
|
+
<ChakraCircularProgress {...progressProps} sx={styles.circular}>
|
|
89
|
+
{showLabel &&
|
|
90
|
+
!isIndeterminate &&
|
|
91
|
+
size !== ProgressIndicatorSizes.Small && (
|
|
92
|
+
<ChakraCircularProgressLabel>
|
|
93
|
+
{finalValue}%
|
|
94
|
+
</ChakraCircularProgressLabel>
|
|
95
|
+
)}
|
|
96
|
+
</ChakraCircularProgress>
|
|
97
|
+
{showLabel && size !== ProgressIndicatorSizes.Small && (
|
|
98
|
+
<Label id={`${id}-label`} htmlFor={id}>
|
|
99
|
+
{labelText}
|
|
100
|
+
</Label>
|
|
101
|
+
)}
|
|
102
|
+
</Box>
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
// The Linear progress indicator is the default.
|
|
106
|
+
return (
|
|
107
|
+
<>
|
|
108
|
+
{showLabel && (
|
|
109
|
+
<Label id={`${id}-label`} htmlFor={id}>
|
|
110
|
+
{labelText}
|
|
111
|
+
</Label>
|
|
112
|
+
)}
|
|
113
|
+
<Box __css={styles.linearContainer}>
|
|
114
|
+
<ChakraProgress {...progressProps} sx={styles.linear} />
|
|
115
|
+
{showLabel && !isIndeterminate && (
|
|
116
|
+
<Box __css={styles.linearPercentage}>{finalValue}%</Box>
|
|
117
|
+
)}
|
|
118
|
+
</Box>
|
|
119
|
+
</>
|
|
120
|
+
);
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
return <Box __css={styles}>{progressComponent(indicatorType)}</Box>;
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
export default ProgressIndicator;
|