@telus-uds/components-base 0.0.2-prerelease.6 → 1.0.0
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/.eslintrc.js +9 -0
- package/.ultra.cache.json +1 -1
- package/CHANGELOG.md +85 -0
- package/README.md +4 -2
- package/__fixtures__/Accessible.js +33 -0
- package/__fixtures__/Accessible.native.js +32 -0
- package/__fixtures__/test-utils.js +25 -0
- package/__fixtures__/testTheme.js +851 -57
- package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +1 -1
- package/__tests__/Button/ButtonBase.test.jsx +2 -31
- package/__tests__/Button/ButtonGroup.test.jsx +6 -7
- package/__tests__/Checkbox/Checkbox.test.jsx +94 -0
- package/__tests__/Checkbox/CheckboxGroup.test.jsx +246 -0
- package/__tests__/ExpandCollapse/ExpandCollapse.test.jsx +2 -2
- package/__tests__/HorizontalScroll/HorizontalScroll.test.jsx +164 -0
- package/__tests__/Icon/Icon.test.jsx +3 -3
- package/__tests__/IconButton/IconButton.test.jsx +52 -0
- package/__tests__/InputSupports/InputSupports.test.jsx +50 -0
- package/__tests__/Link/LinkBase.test.jsx +0 -14
- package/__tests__/List/List.test.jsx +60 -0
- package/__tests__/Modal/Modal.test.jsx +47 -0
- package/__tests__/Notification/Notification.test.jsx +20 -0
- package/__tests__/Pagination/Pagination.test.jsx +2 -2
- package/__tests__/Progress/Progress.test.jsx +79 -0
- package/__tests__/Radio/Radio.test.jsx +87 -0
- package/__tests__/Radio/RadioGroup.test.jsx +220 -0
- package/__tests__/RadioCard/RadioCard.test.jsx +87 -0
- package/__tests__/RadioCard/RadioCardGroup.test.jsx +246 -0
- package/__tests__/Search/Search.test.jsx +73 -0
- package/__tests__/Select/Select.test.jsx +94 -0
- package/__tests__/Skeleton/Skeleton.test.jsx +61 -0
- package/__tests__/StepTracker/StepTracker.test.jsx +94 -0
- package/__tests__/Tabs/Tabs.test.jsx +40 -0
- package/__tests__/Tags/Tags.test.jsx +327 -0
- package/__tests__/TextInput/TextArea.test.jsx +35 -0
- package/__tests__/TextInput/{TextInput.test.jsx → TextInputBase.test.jsx} +29 -50
- package/__tests__/ThemeProvider/ThemeProvider.test.jsx +77 -0
- package/__tests__/ThemeProvider/useThemeTokens.test.jsx +9 -5
- package/__tests__/ThemeProvider/utils/theme-tokens.test.js +41 -0
- package/__tests__/ToggleSwitch/ToggleSwitch.test.jsx +3 -2
- package/__tests__/utils/children.test.jsx +128 -0
- package/__tests__/utils/input.test.js +59 -1
- package/__tests__/utils/semantics.test.jsx +43 -0
- package/__tests__/utils/useCopy.test.js +14 -3
- package/babel.config.js +20 -0
- package/jest.config.js +8 -3
- package/lib/A11yInfoProvider/index.js +54 -26
- package/lib/A11yText/index.js +45 -17
- package/lib/ActivityIndicator/Spinner.js +81 -0
- package/lib/ActivityIndicator/Spinner.native.js +129 -91
- package/lib/ActivityIndicator/index.js +28 -12
- package/lib/ActivityIndicator/shared.js +27 -12
- package/lib/BaseProvider/index.js +34 -11
- package/lib/Box/Box.js +152 -35
- package/lib/Box/index.js +13 -2
- package/lib/Button/Button.js +41 -12
- package/lib/Button/ButtonBase.js +125 -97
- package/lib/Button/ButtonGroup.js +112 -89
- package/lib/Button/ButtonLink.js +48 -17
- package/lib/Button/index.js +31 -4
- package/lib/Button/propTypes.js +32 -9
- package/lib/Card/Card.js +38 -41
- package/lib/Card/CardBase.js +85 -0
- package/lib/Card/PressableCardBase.js +141 -0
- package/lib/Card/index.js +40 -2
- package/lib/Checkbox/Checkbox.js +355 -0
- package/lib/Checkbox/CheckboxGroup.js +241 -0
- package/lib/Checkbox/CheckboxInput.js +74 -0
- package/lib/Checkbox/CheckboxInput.native.js +14 -0
- package/lib/Checkbox/index.js +21 -0
- package/lib/Divider/Divider.js +59 -28
- package/lib/Divider/index.js +13 -2
- package/lib/ExpandCollapse/Accordion.js +26 -7
- package/lib/ExpandCollapse/Control.js +60 -31
- package/lib/ExpandCollapse/ExpandCollapse.js +50 -28
- package/lib/ExpandCollapse/Panel.js +83 -44
- package/lib/ExpandCollapse/index.js +25 -7
- package/lib/Feedback/Feedback.js +90 -39
- package/lib/Feedback/index.js +13 -2
- package/lib/Fieldset/Fieldset.js +165 -0
- package/lib/Fieldset/FieldsetContainer.js +46 -0
- package/lib/Fieldset/FieldsetContainer.native.js +38 -0
- package/lib/Fieldset/Legend.js +38 -0
- package/lib/Fieldset/Legend.native.js +48 -0
- package/lib/Fieldset/cssReset.js +21 -0
- package/lib/Fieldset/index.js +13 -0
- package/lib/FlexGrid/Col/Col.js +73 -41
- package/lib/FlexGrid/Col/index.js +13 -2
- package/lib/FlexGrid/FlexGrid.js +99 -49
- package/lib/FlexGrid/Row/Row.js +58 -30
- package/lib/FlexGrid/Row/index.js +13 -2
- package/lib/FlexGrid/helpers/index.js +9 -1
- package/lib/FlexGrid/index.js +13 -2
- package/lib/FlexGrid/providers/GutterContext.js +15 -3
- package/lib/HorizontalScroll/HorizontalScroll.js +200 -0
- package/lib/HorizontalScroll/HorizontalScrollButton.js +127 -0
- package/lib/HorizontalScroll/ScrollViewEnd.js +66 -0
- package/lib/HorizontalScroll/ScrollViewEnd.native.js +41 -0
- package/lib/HorizontalScroll/dictionary.js +18 -0
- package/lib/HorizontalScroll/index.js +35 -0
- package/lib/HorizontalScroll/itemPositions.js +128 -0
- package/lib/Icon/Icon.js +62 -50
- package/lib/Icon/IconText.js +101 -0
- package/lib/Icon/index.js +31 -3
- package/lib/IconButton/IconButton.js +140 -0
- package/lib/IconButton/index.js +13 -0
- package/lib/InputLabel/InputLabel.js +102 -40
- package/lib/InputLabel/LabelContent.js +41 -0
- package/lib/InputLabel/LabelContent.native.js +32 -6
- package/lib/InputLabel/index.js +13 -2
- package/lib/InputSupports/InputSupports.js +109 -0
- package/lib/InputSupports/index.js +13 -0
- package/lib/InputSupports/propTypes.js +66 -0
- package/lib/InputSupports/useInputSupports.js +41 -0
- package/lib/Link/ChevronLink.js +58 -31
- package/lib/Link/InlinePressable.js +56 -0
- package/lib/Link/InlinePressable.native.js +102 -0
- package/lib/Link/Link.js +39 -15
- package/lib/Link/LinkBase.js +126 -150
- package/lib/Link/TextButton.js +53 -18
- package/lib/Link/index.js +39 -4
- package/lib/List/List.js +81 -0
- package/lib/List/ListItem.js +245 -0
- package/lib/List/index.js +13 -0
- package/lib/Modal/Modal.js +231 -0
- package/lib/Modal/dictionary.js +16 -0
- package/lib/Modal/index.js +13 -0
- package/lib/Notification/Notification.js +216 -0
- package/lib/Notification/dictionary.js +15 -0
- package/lib/Notification/index.js +13 -0
- package/lib/Pagination/PageButton.js +58 -48
- package/lib/Pagination/Pagination.js +78 -43
- package/lib/Pagination/SideButton.js +79 -58
- package/lib/Pagination/dictionary.js +9 -2
- package/lib/Pagination/index.js +13 -2
- package/lib/Pagination/usePagination.js +12 -2
- package/lib/Progress/Progress.js +104 -0
- package/lib/Progress/ProgressBar.js +157 -0
- package/lib/Progress/ProgressBarBackground.js +61 -0
- package/lib/Progress/index.js +16 -0
- package/lib/Radio/Radio.js +293 -0
- package/lib/Radio/RadioButton.js +152 -0
- package/lib/Radio/RadioGroup.js +244 -0
- package/lib/Radio/RadioInput.js +76 -0
- package/lib/Radio/RadioInput.native.js +14 -0
- package/lib/Radio/index.js +21 -0
- package/lib/RadioCard/RadioCard.js +244 -0
- package/lib/RadioCard/RadioCardGroup.js +252 -0
- package/lib/RadioCard/index.js +21 -0
- package/lib/Search/Search.js +254 -0
- package/lib/Search/dictionary.js +19 -0
- package/lib/Search/index.js +13 -0
- package/lib/Select/Group.js +33 -0
- package/lib/Select/Group.native.js +25 -0
- package/lib/Select/Item.js +29 -0
- package/lib/Select/Item.native.js +19 -0
- package/lib/Select/Picker.js +84 -0
- package/lib/Select/Picker.native.js +130 -0
- package/lib/Select/Select.js +342 -0
- package/lib/Select/index.js +19 -0
- package/lib/SideNav/Item.js +63 -37
- package/lib/SideNav/ItemContent.js +41 -15
- package/lib/SideNav/ItemsGroup.js +55 -31
- package/lib/SideNav/SideNav.js +100 -73
- package/lib/SideNav/index.js +15 -1
- package/lib/Skeleton/Skeleton.js +137 -0
- package/lib/Skeleton/index.js +13 -0
- package/lib/Skeleton/skeleton.constant.js +12 -0
- package/lib/Skeleton/skeletonWebAnimation.js +27 -0
- package/lib/Skeleton/useSkeletonNativeAnimation.js +37 -0
- package/lib/Spacer/Spacer.js +49 -18
- package/lib/Spacer/index.js +13 -2
- package/lib/StackView/StackView.js +71 -31
- package/lib/StackView/StackWrap.js +43 -13
- package/lib/StackView/StackWrap.native.js +13 -2
- package/lib/StackView/StackWrapBox.js +76 -29
- package/lib/StackView/StackWrapGap.js +56 -26
- package/lib/StackView/common.js +23 -6
- package/lib/StackView/getStackedContent.js +47 -17
- package/lib/StackView/index.js +29 -5
- package/lib/StepTracker/Step.js +245 -0
- package/lib/StepTracker/StepTracker.js +202 -0
- package/lib/StepTracker/dictionary.js +17 -0
- package/lib/StepTracker/index.js +13 -0
- package/lib/Tabs/Tabs.js +124 -0
- package/lib/Tabs/TabsItem.js +238 -0
- package/lib/Tabs/index.js +13 -0
- package/lib/Tags/Tags.js +266 -0
- package/lib/Tags/index.js +13 -0
- package/lib/TextInput/TextArea.js +111 -0
- package/lib/TextInput/TextInput.js +50 -304
- package/lib/TextInput/TextInputBase.js +256 -0
- package/lib/TextInput/index.js +23 -2
- package/lib/TextInput/propTypes.js +42 -0
- package/lib/ThemeProvider/ThemeProvider.js +46 -18
- package/lib/ThemeProvider/index.js +61 -6
- package/lib/ThemeProvider/useSetTheme.js +19 -5
- package/lib/ThemeProvider/useTheme.js +13 -4
- package/lib/ThemeProvider/useThemeTokens.js +86 -19
- package/lib/ThemeProvider/utils/index.js +31 -2
- package/lib/ThemeProvider/utils/styles.js +50 -14
- package/lib/ThemeProvider/utils/theme-tokens.js +121 -12
- package/lib/ToggleSwitch/ToggleSwitch.js +86 -57
- package/lib/ToggleSwitch/index.js +13 -2
- package/lib/Tooltip/{Backdrop.web.js → Backdrop.js} +20 -8
- package/lib/Tooltip/Backdrop.native.js +39 -15
- package/lib/Tooltip/Tooltip.js +117 -74
- package/lib/Tooltip/dictionary.js +9 -2
- package/lib/Tooltip/getTooltipPosition.js +9 -1
- package/lib/Tooltip/index.js +13 -2
- package/lib/TooltipButton/TooltipButton.js +57 -38
- package/lib/TooltipButton/index.js +13 -2
- package/lib/Typography/Typography.js +86 -55
- package/lib/Typography/index.js +13 -2
- package/lib/ViewportProvider/ViewportProvider.js +34 -13
- package/lib/ViewportProvider/index.js +28 -3
- package/lib/ViewportProvider/useViewport.js +15 -3
- package/lib/ViewportProvider/useViewportListener.js +24 -10
- package/lib/index.js +539 -26
- package/lib/utils/a11y/index.js +31 -0
- package/lib/utils/a11y/semantics.js +173 -0
- package/lib/utils/a11y/textSize.js +49 -0
- package/lib/utils/animation/index.js +15 -2
- package/lib/utils/animation/useVerticalExpandAnimation.js +27 -10
- package/lib/utils/children.js +134 -0
- package/lib/utils/index.js +163 -7
- package/lib/utils/info/index.js +19 -0
- package/lib/utils/info/platform/index.js +23 -0
- package/lib/utils/info/platform/platform.android.js +8 -0
- package/lib/utils/info/platform/platform.ios.js +8 -0
- package/lib/utils/info/platform/platform.js +8 -0
- package/lib/utils/info/platform/platform.native.js +11 -0
- package/lib/utils/info/versions.js +16 -0
- package/lib/utils/input.js +53 -25
- package/lib/utils/pressability.js +120 -0
- package/lib/utils/propTypes.js +338 -132
- package/lib/utils/useCopy.js +40 -5
- package/lib/utils/useHash.js +52 -0
- package/lib/utils/useHash.native.js +15 -0
- package/lib/utils/useResponsiveProp.js +21 -9
- package/lib/utils/useSpacingScale.js +19 -9
- package/lib/utils/useUniqueId.js +12 -3
- package/package.json +16 -10
- package/release-context.json +4 -4
- package/src/A11yText/index.jsx +6 -4
- package/src/ActivityIndicator/{Spinner.web.jsx → Spinner.jsx} +5 -3
- package/src/ActivityIndicator/Spinner.native.jsx +5 -3
- package/src/Box/Box.jsx +131 -39
- package/src/Button/Button.jsx +13 -6
- package/src/Button/ButtonBase.jsx +134 -125
- package/src/Button/ButtonGroup.jsx +85 -86
- package/src/Button/ButtonLink.jsx +22 -7
- package/src/Button/propTypes.js +12 -2
- package/src/Card/Card.jsx +5 -31
- package/src/Card/CardBase.jsx +58 -0
- package/src/Card/PressableCardBase.jsx +119 -0
- package/src/Card/index.js +3 -0
- package/src/Checkbox/Checkbox.jsx +284 -0
- package/src/Checkbox/CheckboxGroup.jsx +206 -0
- package/src/Checkbox/CheckboxInput.jsx +55 -0
- package/src/Checkbox/CheckboxInput.native.jsx +6 -0
- package/src/Checkbox/index.js +5 -0
- package/src/Divider/Divider.jsx +7 -4
- package/src/ExpandCollapse/Accordion.jsx +3 -2
- package/src/ExpandCollapse/Control.jsx +40 -43
- package/src/ExpandCollapse/ExpandCollapse.jsx +26 -23
- package/src/ExpandCollapse/Panel.jsx +69 -63
- package/src/Feedback/Feedback.jsx +42 -30
- package/src/Fieldset/Fieldset.jsx +136 -0
- package/src/Fieldset/FieldsetContainer.jsx +31 -0
- package/src/Fieldset/FieldsetContainer.native.jsx +19 -0
- package/src/Fieldset/Legend.jsx +21 -0
- package/src/Fieldset/Legend.native.jsx +27 -0
- package/src/Fieldset/cssReset.js +14 -0
- package/src/Fieldset/index.js +3 -0
- package/src/FlexGrid/Col/Col.jsx +139 -132
- package/src/FlexGrid/FlexGrid.jsx +79 -51
- package/src/FlexGrid/Row/Row.jsx +55 -48
- package/src/HorizontalScroll/HorizontalScroll.jsx +168 -0
- package/src/HorizontalScroll/HorizontalScrollButton.jsx +105 -0
- package/src/HorizontalScroll/ScrollViewEnd.jsx +53 -0
- package/src/HorizontalScroll/ScrollViewEnd.native.jsx +24 -0
- package/src/HorizontalScroll/dictionary.js +11 -0
- package/src/HorizontalScroll/index.js +17 -0
- package/src/HorizontalScroll/itemPositions.js +101 -0
- package/src/Icon/Icon.jsx +46 -49
- package/src/Icon/IconText.jsx +68 -0
- package/src/Icon/index.js +3 -2
- package/src/IconButton/IconButton.jsx +114 -0
- package/src/IconButton/index.js +3 -0
- package/src/InputLabel/InputLabel.jsx +57 -35
- package/src/InputLabel/LabelContent.jsx +21 -0
- package/src/InputLabel/LabelContent.native.jsx +11 -2
- package/src/InputSupports/InputSupports.jsx +70 -0
- package/src/InputSupports/index.js +3 -0
- package/src/InputSupports/propTypes.js +44 -0
- package/src/InputSupports/useInputSupports.js +30 -0
- package/src/Link/ChevronLink.jsx +34 -21
- package/src/Link/InlinePressable.jsx +39 -0
- package/src/Link/InlinePressable.native.jsx +75 -0
- package/src/Link/Link.jsx +23 -13
- package/src/Link/LinkBase.jsx +98 -170
- package/src/Link/TextButton.jsx +37 -16
- package/src/Link/index.js +2 -1
- package/src/List/List.jsx +48 -0
- package/src/List/ListItem.jsx +182 -0
- package/src/List/index.js +3 -0
- package/src/Modal/Modal.jsx +190 -0
- package/src/Modal/dictionary.js +9 -0
- package/src/Modal/index.js +3 -0
- package/src/Notification/Notification.jsx +164 -0
- package/src/Notification/dictionary.js +8 -0
- package/src/Notification/index.js +3 -0
- package/src/Pagination/PageButton.jsx +42 -49
- package/src/Pagination/Pagination.jsx +88 -92
- package/src/Pagination/SideButton.jsx +58 -66
- package/src/Progress/Progress.jsx +78 -0
- package/src/Progress/ProgressBar.jsx +123 -0
- package/src/Progress/ProgressBarBackground.jsx +36 -0
- package/src/Progress/index.js +6 -0
- package/src/Radio/Radio.jsx +240 -0
- package/src/Radio/RadioButton.jsx +142 -0
- package/src/Radio/RadioGroup.jsx +209 -0
- package/src/Radio/RadioInput.jsx +57 -0
- package/src/Radio/RadioInput.native.jsx +6 -0
- package/src/Radio/index.js +5 -0
- package/src/RadioCard/RadioCard.jsx +198 -0
- package/src/RadioCard/RadioCardGroup.jsx +218 -0
- package/src/RadioCard/index.js +5 -0
- package/src/Search/Search.jsx +225 -0
- package/src/Search/dictionary.js +12 -0
- package/src/Search/index.js +3 -0
- package/src/Select/Group.jsx +15 -0
- package/src/Select/Group.native.jsx +14 -0
- package/src/Select/Item.jsx +11 -0
- package/src/Select/Item.native.jsx +10 -0
- package/src/Select/Picker.jsx +74 -0
- package/src/Select/Picker.native.jsx +102 -0
- package/src/Select/Select.jsx +298 -0
- package/src/Select/index.js +8 -0
- package/src/SideNav/Item.jsx +54 -47
- package/src/SideNav/ItemsGroup.jsx +50 -43
- package/src/SideNav/SideNav.jsx +68 -60
- package/src/Skeleton/Skeleton.jsx +94 -0
- package/src/Skeleton/index.js +3 -0
- package/src/Skeleton/skeleton.constant.js +3 -0
- package/src/Skeleton/skeletonWebAnimation.js +13 -0
- package/src/Skeleton/useSkeletonNativeAnimation.js +27 -0
- package/src/Spacer/Spacer.jsx +11 -4
- package/src/StackView/StackView.jsx +53 -23
- package/src/StackView/StackWrap.jsx +16 -7
- package/src/StackView/StackWrapBox.jsx +62 -28
- package/src/StackView/StackWrapGap.jsx +46 -24
- package/src/StackView/common.jsx +3 -2
- package/src/StackView/getStackedContent.jsx +8 -2
- package/src/StepTracker/Step.jsx +202 -0
- package/src/StepTracker/StepTracker.jsx +174 -0
- package/src/StepTracker/dictionary.js +10 -0
- package/src/StepTracker/index.js +3 -0
- package/src/Tabs/Tabs.jsx +97 -0
- package/src/Tabs/TabsItem.jsx +212 -0
- package/src/Tabs/index.js +3 -0
- package/src/Tags/Tags.jsx +219 -0
- package/src/Tags/index.js +3 -0
- package/src/TextInput/TextArea.jsx +79 -0
- package/src/TextInput/TextInput.jsx +18 -284
- package/src/TextInput/TextInputBase.jsx +217 -0
- package/src/TextInput/index.js +2 -1
- package/src/TextInput/propTypes.js +29 -0
- package/src/ThemeProvider/ThemeProvider.jsx +11 -7
- package/src/ThemeProvider/useSetTheme.js +4 -0
- package/src/ThemeProvider/useThemeTokens.js +56 -5
- package/src/ThemeProvider/utils/styles.js +18 -5
- package/src/ThemeProvider/utils/theme-tokens.js +74 -5
- package/src/ToggleSwitch/ToggleSwitch.jsx +51 -53
- package/src/Tooltip/{Backdrop.web.jsx → Backdrop.jsx} +0 -0
- package/src/Tooltip/Tooltip.jsx +135 -131
- package/src/TooltipButton/TooltipButton.jsx +23 -27
- package/src/Typography/Typography.jsx +72 -59
- package/src/index.js +31 -3
- package/src/utils/a11y/index.js +2 -0
- package/src/utils/a11y/semantics.js +162 -0
- package/src/utils/a11y/textSize.js +30 -0
- package/src/utils/children.jsx +119 -0
- package/src/utils/index.js +6 -0
- package/src/utils/info/index.js +8 -0
- package/src/utils/info/platform/index.js +11 -0
- package/src/utils/info/platform/platform.android.js +1 -0
- package/src/utils/info/platform/platform.ios.js +1 -0
- package/src/utils/info/platform/platform.js +1 -0
- package/src/utils/info/platform/platform.native.js +4 -0
- package/src/utils/info/versions.js +6 -0
- package/src/utils/input.js +36 -25
- package/src/utils/pressability.js +96 -0
- package/src/utils/propTypes.js +291 -90
- package/src/utils/useCopy.js +30 -4
- package/src/utils/useHash.js +39 -0
- package/src/utils/useHash.native.js +6 -0
- package/stories/A11yText/A11yText.stories.jsx +6 -10
- package/stories/ActivityIndicator/ActivityIndicator.stories.jsx +1 -1
- package/stories/Box/Box.stories.jsx +1 -1
- package/stories/Button/Button.stories.jsx +7 -2
- package/stories/Button/ButtonGroup.stories.jsx +1 -1
- package/stories/Button/ButtonLink.stories.jsx +1 -1
- package/stories/Card/Card.stories.jsx +1 -1
- package/stories/Checkbox/Checkbox.stories.jsx +94 -0
- package/stories/Divider/Divider.stories.jsx +1 -1
- package/stories/ExpandCollapse/ExpandCollapse.stories.jsx +2 -2
- package/stories/Feedback/Feedback.stories.jsx +5 -6
- package/stories/FlexGrid/01 FlexGrid.stories.jsx +1 -1
- package/stories/FlexGrid/02 Row.stories.jsx +1 -1
- package/stories/FlexGrid/03 Col.stories.jsx +1 -1
- package/stories/Icon/Icon.stories.jsx +27 -7
- package/stories/IconButton/IconButton.stories.jsx +50 -0
- package/stories/InputLabel/InputLabel.stories.jsx +1 -1
- package/stories/Link/ChevronLink.stories.jsx +1 -1
- package/stories/Link/Link.stories.jsx +28 -18
- package/stories/Link/TextButton.stories.jsx +1 -1
- package/stories/List/List.stories.jsx +117 -0
- package/stories/Modal/Modal.stories.jsx +29 -0
- package/stories/Notification/Notification.stories.jsx +82 -0
- package/stories/Pagination/Pagination.stories.jsx +1 -1
- package/stories/Progress/Progress.stories.jsx +93 -0
- package/stories/Radio/Radio.stories.jsx +100 -0
- package/stories/RadioCard/RadioCard.stories.jsx +98 -0
- package/stories/Search/Search.stories.jsx +16 -0
- package/stories/Select/Select.stories.jsx +55 -0
- package/stories/SideNav/SideNav.stories.jsx +1 -1
- package/stories/SideNav/SideNavItem.stories.jsx +1 -1
- package/stories/SideNav/SideNavItemsGroup.stories.jsx +1 -1
- package/stories/Skeleton/Skeleton.stories.jsx +36 -0
- package/stories/Spacer/Spacer.stories.jsx +1 -1
- package/stories/StackView/StackView.stories.jsx +1 -1
- package/stories/StackView/StackWrap.stories.jsx +1 -1
- package/stories/StepTracker/StepTracker.stories.jsx +71 -0
- package/stories/Tabs/Tabs.stories.jsx +97 -0
- package/stories/Tags/Tags.stories.jsx +69 -0
- package/stories/TextInput/TextArea.stories.jsx +100 -0
- package/stories/TextInput/TextInput.stories.jsx +1 -1
- package/stories/ToggleSwitch/ToggleSwitch.stories.jsx +1 -1
- package/stories/Tooltip/Tooltip.stories.jsx +1 -1
- package/stories/TooltipButton/TooltipButton.stories.jsx +1 -1
- package/stories/Typography/Typography.stories.jsx +1 -1
- package/stories/{platform-supports.web.jsx → platform-supports.jsx} +1 -1
- package/stories/supports.jsx +38 -4
- package/__fixtures__/accessible.icon.svg +0 -6
- package/babel.config.json +0 -8
- package/docs/Contributing.stories.mdx +0 -9
- package/docs/Fonts.stories.mdx +0 -104
- package/docs/Icons.stories.mdx +0 -144
- package/docs/Introduction.stories.mdx +0 -9
- package/lib/ActivityIndicator/Spinner.web.js +0 -55
- package/lib/InputLabel/LabelContent.web.js +0 -17
- package/lib/config/svgr-icons-web.js +0 -9
- package/lib/config/svgr-icons.js +0 -52
- package/src/InputLabel/LabelContent.web.jsx +0 -13
- package/src/config/svgr-icons-web.js +0 -11
- package/src/config/svgr-icons.js +0 -46
|
@@ -1,15 +1,13 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import { Text } from 'react-native'
|
|
1
|
+
import React, { forwardRef } from 'react'
|
|
3
2
|
import PropTypes from 'prop-types'
|
|
4
3
|
|
|
5
4
|
import ButtonBase from '../Button/ButtonBase'
|
|
6
|
-
import {
|
|
5
|
+
import { useThemeTokensCallback } from '../ThemeProvider'
|
|
7
6
|
import {
|
|
8
7
|
a11yProps,
|
|
9
8
|
copyPropTypes,
|
|
10
9
|
getTokensPropType,
|
|
11
10
|
hrefAttrsProp,
|
|
12
|
-
linkProps,
|
|
13
11
|
selectTokens,
|
|
14
12
|
variantProp
|
|
15
13
|
} from '../utils'
|
|
@@ -17,64 +15,59 @@ import {
|
|
|
17
15
|
import useCopy from '../utils/useCopy'
|
|
18
16
|
import dictionary from './dictionary'
|
|
19
17
|
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
fontName,
|
|
24
|
-
fontSize,
|
|
25
|
-
fontWeight,
|
|
26
|
-
lineHeight,
|
|
27
|
-
textDecorationLine: textLine
|
|
28
|
-
})
|
|
18
|
+
const PageButton = forwardRef(
|
|
19
|
+
({ label, onPress, href, isActive, copy, variant, tokens, ...props }, ref) => {
|
|
20
|
+
const getTokens = useThemeTokensCallback('PaginationPageButton', tokens, variant)
|
|
29
21
|
|
|
30
|
-
|
|
31
|
-
const getTokens = useThemeTokensCallback('PaginationPageButton', tokens, variant)
|
|
22
|
+
const getCopy = useCopy({ dictionary, copy })
|
|
32
23
|
|
|
33
|
-
|
|
24
|
+
const getButtonTokens = (buttonState) => selectTokens('Button', getTokens(buttonState))
|
|
34
25
|
|
|
35
|
-
|
|
36
|
-
|
|
26
|
+
const activeProps = isActive
|
|
27
|
+
? {
|
|
28
|
+
selected: true,
|
|
29
|
+
...a11yProps.nonFocusableProps,
|
|
30
|
+
// a brute fix for the focus state being stuck on an active item since it becomes non-focusable
|
|
31
|
+
// (see https://github.com/telus/universal-design-system/pull/577#issuecomment-931344107)
|
|
32
|
+
key: 'active-item'
|
|
33
|
+
}
|
|
34
|
+
: {}
|
|
37
35
|
|
|
38
|
-
|
|
39
|
-
? {
|
|
40
|
-
|
|
41
|
-
...a11yProps.nonFocusableProps,
|
|
42
|
-
// a brute fix for the focus state being stuck on an active item since it becomes non-focusable
|
|
43
|
-
// (see https://github.com/telus/universal-design-system/pull/577#issuecomment-931344107)
|
|
44
|
-
key: 'active-item'
|
|
45
|
-
}
|
|
46
|
-
: {}
|
|
36
|
+
const accessibilityRole = href !== undefined ? 'link' : 'button'
|
|
37
|
+
const activeLabel = isActive ? ` ${getCopy('currentLabel')}` : ''
|
|
38
|
+
const accessibilityLabel = `${getCopy('goToLabel')} ${label}${activeLabel}`
|
|
47
39
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
40
|
+
const { hrefAttrs, rest } = hrefAttrsProp.bundle(props)
|
|
41
|
+
const buttonProps = {
|
|
42
|
+
accessibilityRole,
|
|
43
|
+
accessibilityLabel,
|
|
44
|
+
onPress,
|
|
45
|
+
href,
|
|
46
|
+
hrefAttrs,
|
|
47
|
+
...rest
|
|
48
|
+
}
|
|
51
49
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
href,
|
|
58
|
-
hrefAttrs,
|
|
59
|
-
...rest
|
|
50
|
+
return (
|
|
51
|
+
<ButtonBase ref={ref} {...buttonProps} tokens={getButtonTokens} {...activeProps}>
|
|
52
|
+
{label}
|
|
53
|
+
</ButtonBase>
|
|
54
|
+
)
|
|
60
55
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
<ButtonBase {...buttonProps} tokens={getButtonTokens} {...activeProps}>
|
|
64
|
-
{(buttonState) => {
|
|
65
|
-
return <Text style={getTextStyles(buttonState)}>{label}</Text>
|
|
66
|
-
}}
|
|
67
|
-
</ButtonBase>
|
|
68
|
-
)
|
|
69
|
-
}
|
|
56
|
+
)
|
|
57
|
+
PageButton.displayName = 'PageButton'
|
|
70
58
|
|
|
71
59
|
PageButton.propTypes = {
|
|
60
|
+
// Spreading any props into a secondary component accessed like Pagination.PageButton
|
|
61
|
+
// crashes a Docusaurus props table, but only in production, not in development
|
|
62
|
+
onPress: PropTypes.func,
|
|
63
|
+
href: PropTypes.string,
|
|
64
|
+
// If the above is fixed, the above can be replaced with this which includes full a11y etc:
|
|
65
|
+
// ...linkProps.types,
|
|
72
66
|
label: PropTypes.string,
|
|
73
67
|
isActive: PropTypes.bool,
|
|
74
68
|
copy: copyPropTypes,
|
|
75
69
|
variant: variantProp.propType,
|
|
76
|
-
tokens: getTokensPropType('PaginationPageButton')
|
|
77
|
-
...linkProps.types
|
|
70
|
+
tokens: getTokensPropType('PaginationPageButton')
|
|
78
71
|
}
|
|
79
72
|
|
|
80
73
|
export default PageButton
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from 'react'
|
|
1
|
+
import React, { forwardRef } from 'react'
|
|
2
2
|
import { View, Text, StyleSheet } from 'react-native'
|
|
3
3
|
|
|
4
4
|
import { componentPropType, copyPropTypes, getTokensPropType, variantProp } from '../utils'
|
|
@@ -19,99 +19,95 @@ const selectTextStyles = ({ color, fontName, fontSize, fontWeight, lineHeight })
|
|
|
19
19
|
lineHeight
|
|
20
20
|
})
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
children,
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
items
|
|
48
|
-
truncateAbove
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
const ellipsisTextStyles = selectTextStyles(themeTokens)
|
|
52
|
-
|
|
53
|
-
if (items.length === 0) {
|
|
54
|
-
return null
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// TODO: replace with a spacing component when https://github.com/telus/universal-design-system/pull/531 is implemented
|
|
58
|
-
// concatenate all items to easily wrap them in identical spacing components
|
|
59
|
-
const buttons = [
|
|
60
|
-
showPrevious && (
|
|
61
|
-
<SideButton
|
|
62
|
-
{...previousItemProps}
|
|
63
|
-
direction="previous"
|
|
64
|
-
copy={copy}
|
|
65
|
-
variant={sideButtonVariant}
|
|
66
|
-
tokens={sideButtonTokens}
|
|
67
|
-
/>
|
|
68
|
-
),
|
|
69
|
-
...items.map((child, itemIndex) => {
|
|
70
|
-
const buttonLabel = `${itemIndex + 1}`
|
|
71
|
-
const itemProps = getItemProps(itemIndex)
|
|
72
|
-
|
|
73
|
-
if (shouldRenderButton(itemIndex)) {
|
|
74
|
-
return (
|
|
75
|
-
<PageButton
|
|
76
|
-
{...itemProps}
|
|
77
|
-
label={buttonLabel}
|
|
78
|
-
copy={copy}
|
|
79
|
-
isActive={isItemActive(itemIndex)}
|
|
80
|
-
/>
|
|
81
|
-
)
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
if (shouldRenderEllipsis(itemIndex)) {
|
|
85
|
-
return <Text style={ellipsisTextStyles}>...</Text>
|
|
86
|
-
}
|
|
87
|
-
|
|
22
|
+
const Pagination = forwardRef(
|
|
23
|
+
({ children, copy = 'en', variant, tokens, sideButtonVariant, sideButtonTokens }, ref) => {
|
|
24
|
+
const viewport = useViewport()
|
|
25
|
+
const { truncateAbove, gap, ...themeTokens } = useThemeTokens('Pagination', tokens, variant, {
|
|
26
|
+
viewport
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
const items = React.Children.toArray(children)
|
|
30
|
+
|
|
31
|
+
const {
|
|
32
|
+
isItemActive,
|
|
33
|
+
getItemProps,
|
|
34
|
+
showPrevious,
|
|
35
|
+
showNext,
|
|
36
|
+
nextItemProps,
|
|
37
|
+
previousItemProps,
|
|
38
|
+
shouldRenderButton,
|
|
39
|
+
shouldRenderEllipsis
|
|
40
|
+
} = usePagination({
|
|
41
|
+
items,
|
|
42
|
+
truncateAbove
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
const ellipsisTextStyles = selectTextStyles(themeTokens)
|
|
46
|
+
|
|
47
|
+
if (items.length === 0) {
|
|
88
48
|
return null
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// TODO: replace with a spacing component when https://github.com/telus/universal-design-system/pull/531 is implemented
|
|
52
|
+
// concatenate all items to easily wrap them in identical spacing components
|
|
53
|
+
const buttons = [
|
|
54
|
+
showPrevious && (
|
|
55
|
+
<SideButton
|
|
56
|
+
{...previousItemProps}
|
|
57
|
+
direction="previous"
|
|
58
|
+
copy={copy}
|
|
59
|
+
variant={sideButtonVariant}
|
|
60
|
+
tokens={sideButtonTokens}
|
|
61
|
+
/>
|
|
62
|
+
),
|
|
63
|
+
...items.map((child, itemIndex) => {
|
|
64
|
+
const buttonLabel = `${itemIndex + 1}`
|
|
65
|
+
const itemProps = getItemProps(itemIndex)
|
|
66
|
+
|
|
67
|
+
if (shouldRenderButton(itemIndex)) {
|
|
68
|
+
return (
|
|
69
|
+
<PageButton
|
|
70
|
+
{...itemProps}
|
|
71
|
+
label={buttonLabel}
|
|
72
|
+
copy={copy}
|
|
73
|
+
isActive={isItemActive(itemIndex)}
|
|
74
|
+
/>
|
|
75
|
+
)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (shouldRenderEllipsis(itemIndex)) {
|
|
79
|
+
return <Text style={ellipsisTextStyles}>...</Text>
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return null
|
|
83
|
+
}),
|
|
84
|
+
showNext && (
|
|
85
|
+
<SideButton
|
|
86
|
+
{...nextItemProps}
|
|
87
|
+
direction="next"
|
|
88
|
+
copy={copy}
|
|
89
|
+
variant={sideButtonVariant}
|
|
90
|
+
tokens={sideButtonTokens}
|
|
91
|
+
/>
|
|
92
|
+
)
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
return (
|
|
96
|
+
<View style={staticStyles.container} ref={ref}>
|
|
97
|
+
{buttons
|
|
98
|
+
// keep the keys in-line with the page numbers regardless of which buttons are actually rendered
|
|
99
|
+
.map((element, index) => [element, `page-${index + 1}`])
|
|
100
|
+
.filter(([element]) => element !== null)
|
|
101
|
+
.map(([element, key]) => (
|
|
102
|
+
<Box right={gap} key={key}>
|
|
103
|
+
{element}
|
|
104
|
+
</Box>
|
|
105
|
+
))}
|
|
106
|
+
</View>
|
|
98
107
|
)
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
<View style={staticStyles.container}>
|
|
103
|
-
{buttons
|
|
104
|
-
// keep the keys in-line with the page numbers regardless of which buttons are actually rendered
|
|
105
|
-
.map((element, index) => [element, `page-${index + 1}`])
|
|
106
|
-
.filter(([element]) => element !== null)
|
|
107
|
-
.map(([element, key]) => (
|
|
108
|
-
<Box right={gap} key={key}>
|
|
109
|
-
{element}
|
|
110
|
-
</Box>
|
|
111
|
-
))}
|
|
112
|
-
</View>
|
|
113
|
-
)
|
|
114
|
-
}
|
|
108
|
+
}
|
|
109
|
+
)
|
|
110
|
+
PageButton.displayName = 'PageButton'
|
|
115
111
|
|
|
116
112
|
Pagination.PageButton = PageButton
|
|
117
113
|
|
|
@@ -1,82 +1,80 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import {
|
|
1
|
+
import React, { forwardRef } from 'react'
|
|
2
|
+
import { Text } from 'react-native'
|
|
3
3
|
|
|
4
4
|
import PropTypes from 'prop-types'
|
|
5
5
|
|
|
6
6
|
import ButtonBase from '../Button/ButtonBase'
|
|
7
|
-
import {
|
|
7
|
+
import { IconText } from '../Icon'
|
|
8
|
+
import { useThemeTokensCallback } from '../ThemeProvider'
|
|
8
9
|
import { useViewport } from '../ViewportProvider'
|
|
9
10
|
import { copyPropTypes, hrefAttrsProp, linkProps, selectTokens } from '../utils'
|
|
10
11
|
|
|
11
12
|
import dictionary from './dictionary'
|
|
12
13
|
import useCopy from '../utils/useCopy'
|
|
13
14
|
|
|
14
|
-
const selectTextStyles = ({ color, fontName, fontSize, fontWeight, lineHeight }) =>
|
|
15
|
-
applyTextStyles({
|
|
16
|
-
color,
|
|
17
|
-
fontName,
|
|
18
|
-
fontSize,
|
|
19
|
-
fontWeight,
|
|
20
|
-
lineHeight
|
|
21
|
-
})
|
|
22
|
-
|
|
23
15
|
const selectIconTokens = ({ color, iconSize, iconDisplace }, direction) => {
|
|
24
|
-
// Scale icon with text, but with a cap so text isn't squashed at large scales
|
|
25
|
-
const iconScale = Math.min(PixelRatio.getFontScale(), 2)
|
|
26
|
-
|
|
27
16
|
return {
|
|
28
17
|
color,
|
|
29
|
-
size: iconSize
|
|
18
|
+
size: iconSize,
|
|
30
19
|
translateX: iconDisplace * (direction === 'previous' ? -1 : 1)
|
|
31
20
|
}
|
|
32
21
|
}
|
|
33
22
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const getCopy = useCopy({ dictionary, copy })
|
|
40
|
-
|
|
41
|
-
const { icon: IconComponent } = getTokens(tokens, buttonVariant)
|
|
42
|
-
|
|
43
|
-
const getButtonTokens = (buttonState) => selectTokens('Button', getTokens(buttonState))
|
|
44
|
-
const getIconTokens = (buttonState) => selectIconTokens(getTokens(buttonState), direction)
|
|
45
|
-
const getTextStyles = (buttonState) => selectTextStyles(getTokens(buttonState))
|
|
46
|
-
|
|
47
|
-
const label = direction === 'previous' ? getCopy('previousText') : getCopy('nextText')
|
|
48
|
-
const showLabel = viewport !== 'sm' && viewport !== 'xs'
|
|
49
|
-
|
|
50
|
-
const accessibilityLabel =
|
|
51
|
-
direction === 'previous' ? getCopy('previousLabel') : getCopy('nextLabel')
|
|
52
|
-
const accessibilityRole = href !== undefined ? 'link' : 'button'
|
|
23
|
+
const directionToSide = {
|
|
24
|
+
previous: 'left',
|
|
25
|
+
next: 'right'
|
|
26
|
+
}
|
|
53
27
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
28
|
+
const SideButton = forwardRef(
|
|
29
|
+
({ direction = 'previous', onPress, href, copy, variant, tokens, ...props }, ref) => {
|
|
30
|
+
const viewport = useViewport()
|
|
31
|
+
const buttonVariant = { direction, viewport, ...variant }
|
|
32
|
+
const getTokens = useThemeTokensCallback('PaginationSideButton', tokens, buttonVariant)
|
|
33
|
+
|
|
34
|
+
const getCopy = useCopy({ dictionary, copy })
|
|
35
|
+
|
|
36
|
+
const { icon } = getTokens(tokens, buttonVariant)
|
|
37
|
+
|
|
38
|
+
const getButtonTokens = (buttonState) => selectTokens('Button', getTokens(buttonState))
|
|
39
|
+
const getIconTokens = (buttonState) => selectIconTokens(getTokens(buttonState), direction)
|
|
40
|
+
|
|
41
|
+
const label = direction === 'previous' ? getCopy('previousText') : getCopy('nextText')
|
|
42
|
+
const showLabel = viewport !== 'sm' && viewport !== 'xs'
|
|
43
|
+
|
|
44
|
+
const accessibilityLabel =
|
|
45
|
+
direction === 'previous' ? getCopy('previousLabel') : getCopy('nextLabel')
|
|
46
|
+
const accessibilityRole = href !== undefined ? 'link' : 'button'
|
|
47
|
+
|
|
48
|
+
const { hrefAttrs, rest } = hrefAttrsProp.bundle(props)
|
|
49
|
+
const buttonProps = {
|
|
50
|
+
accessibilityRole,
|
|
51
|
+
accessibilityLabel,
|
|
52
|
+
onPress,
|
|
53
|
+
href,
|
|
54
|
+
hrefAttrs,
|
|
55
|
+
...rest
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return (
|
|
59
|
+
<ButtonBase ref={ref} {...buttonProps} tokens={getButtonTokens}>
|
|
60
|
+
{({ textStyles, ...buttonState }) => {
|
|
61
|
+
const iconProps = { tokens: getIconTokens(buttonState) }
|
|
62
|
+
return (
|
|
63
|
+
<IconText
|
|
64
|
+
icon={icon}
|
|
65
|
+
space={1}
|
|
66
|
+
iconPosition={directionToSide[direction]}
|
|
67
|
+
iconProps={iconProps}
|
|
68
|
+
>
|
|
69
|
+
{showLabel && <Text style={textStyles}>{label}</Text>}
|
|
70
|
+
</IconText>
|
|
71
|
+
)
|
|
72
|
+
}}
|
|
73
|
+
</ButtonBase>
|
|
74
|
+
)
|
|
62
75
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
<ButtonBase {...buttonProps} tokens={getButtonTokens}>
|
|
66
|
-
{(buttonState) => (
|
|
67
|
-
<View style={staticStyles.contentContainer}>
|
|
68
|
-
{direction === 'previous' && IconComponent && (
|
|
69
|
-
<IconComponent tokens={getIconTokens(buttonState)} />
|
|
70
|
-
)}
|
|
71
|
-
{showLabel && <Text style={getTextStyles(buttonState)}>{label}</Text>}
|
|
72
|
-
{direction === 'next' && IconComponent && (
|
|
73
|
-
<IconComponent tokens={getIconTokens(buttonState)} />
|
|
74
|
-
)}
|
|
75
|
-
</View>
|
|
76
|
-
)}
|
|
77
|
-
</ButtonBase>
|
|
78
|
-
)
|
|
79
|
-
}
|
|
76
|
+
)
|
|
77
|
+
SideButton.displayName = 'SideButton'
|
|
80
78
|
|
|
81
79
|
SideButton.propTypes = {
|
|
82
80
|
direction: PropTypes.oneOf(['previous', 'next']),
|
|
@@ -85,9 +83,3 @@ SideButton.propTypes = {
|
|
|
85
83
|
}
|
|
86
84
|
|
|
87
85
|
export default SideButton
|
|
88
|
-
|
|
89
|
-
const staticStyles = StyleSheet.create({
|
|
90
|
-
contentContainer: {
|
|
91
|
-
flexDirection: 'row'
|
|
92
|
-
}
|
|
93
|
-
})
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react'
|
|
2
|
+
import PropTypes from 'prop-types'
|
|
3
|
+
import { View } from 'react-native'
|
|
4
|
+
|
|
5
|
+
import { a11yProps } from '../utils/propTypes'
|
|
6
|
+
import { useThemeTokens } from '../ThemeProvider'
|
|
7
|
+
import { getTokensPropType, variantProp } from '../utils'
|
|
8
|
+
|
|
9
|
+
const selectProgressStyles = ({
|
|
10
|
+
backgroundColor,
|
|
11
|
+
borderWidth,
|
|
12
|
+
borderColor,
|
|
13
|
+
borderRadius,
|
|
14
|
+
height
|
|
15
|
+
}) => ({
|
|
16
|
+
backgroundColor,
|
|
17
|
+
borderWidth,
|
|
18
|
+
borderColor,
|
|
19
|
+
borderRadius,
|
|
20
|
+
height
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* The `Progress` is a container for displaying one or several `ProgressBar`s.
|
|
25
|
+
*
|
|
26
|
+
* ## Props
|
|
27
|
+
*
|
|
28
|
+
* - Use `children` prop to pass one or multiple `ProgressBar`s. Note that in case of stacked progress bars
|
|
29
|
+
* each next will be displayed on top of the previous one.
|
|
30
|
+
*
|
|
31
|
+
* ## Tokens
|
|
32
|
+
*
|
|
33
|
+
* - Use the following tokens to customize the appearance:
|
|
34
|
+
* - `backgroundColor` for the background color of the progress container,
|
|
35
|
+
* - `borderColor` to control the color of the border,
|
|
36
|
+
* - `borderRadius` for the rounded corners,
|
|
37
|
+
* - `borderWidth` to change the border width.
|
|
38
|
+
* - `height` to control the height of the progress bars displayed within the progress bar container.
|
|
39
|
+
*
|
|
40
|
+
* ## Variants
|
|
41
|
+
*
|
|
42
|
+
* - Use the `size` variant to control the height of your progress bars: passing `'mini'` will make your
|
|
43
|
+
* progress bar container narrower.
|
|
44
|
+
*
|
|
45
|
+
* ## Usability and A11y guidelines
|
|
46
|
+
*
|
|
47
|
+
* `Progress` component accepts the standard accessibility properties, however it's more important to make sure
|
|
48
|
+
* its children (instances of `ProgressBar`) receive the accessibility properties specific to the `progressbar`
|
|
49
|
+
* role.
|
|
50
|
+
*
|
|
51
|
+
*/
|
|
52
|
+
const Progress = forwardRef(({ children, tokens, variant, ...rest }, ref) => {
|
|
53
|
+
const themeTokens = useThemeTokens('Progress', tokens, variant)
|
|
54
|
+
|
|
55
|
+
return (
|
|
56
|
+
<View ref={ref} style={selectProgressStyles(themeTokens)} {...a11yProps.select(rest)}>
|
|
57
|
+
{children}
|
|
58
|
+
</View>
|
|
59
|
+
)
|
|
60
|
+
})
|
|
61
|
+
Progress.displayName = 'Progress'
|
|
62
|
+
|
|
63
|
+
Progress.propTypes = {
|
|
64
|
+
/**
|
|
65
|
+
* Use the `children` prop to supply one or several `ProgressBar`s.
|
|
66
|
+
*/
|
|
67
|
+
children: PropTypes.node.isRequired,
|
|
68
|
+
/**
|
|
69
|
+
* Progress tokens.
|
|
70
|
+
*/
|
|
71
|
+
tokens: getTokensPropType('Progress'),
|
|
72
|
+
/**
|
|
73
|
+
* Progress variant.
|
|
74
|
+
*/
|
|
75
|
+
variant: variantProp.propType
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export default Progress
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react'
|
|
2
|
+
import PropTypes from 'prop-types'
|
|
3
|
+
import { Platform, StyleSheet, View } from 'react-native'
|
|
4
|
+
|
|
5
|
+
import ProgressBarBackground from './ProgressBarBackground'
|
|
6
|
+
import { a11yProps } from '../utils/propTypes'
|
|
7
|
+
import { useThemeTokens } from '../ThemeProvider'
|
|
8
|
+
import { getTokensPropType, variantProp } from '../utils'
|
|
9
|
+
|
|
10
|
+
const selectBarStyles = (
|
|
11
|
+
{ backgroundColor, borderRadius, outlineWidth, outlineColor },
|
|
12
|
+
percentage
|
|
13
|
+
) => ({
|
|
14
|
+
backgroundColor,
|
|
15
|
+
borderRadius,
|
|
16
|
+
outlineWidth,
|
|
17
|
+
outlineColor,
|
|
18
|
+
width: `${percentage}%`
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The `ProgressBar` is a visual representation of linear progression.
|
|
23
|
+
* It provides simple but important information at a quick glance.
|
|
24
|
+
*
|
|
25
|
+
* ## Props
|
|
26
|
+
*
|
|
27
|
+
* - Use `percentage` prop to indicate completion
|
|
28
|
+
*
|
|
29
|
+
* ## Tokens
|
|
30
|
+
*
|
|
31
|
+
* - Use the following tokens to customize the appearance:
|
|
32
|
+
* - `backgroundColor` for the background color of the progress bar,
|
|
33
|
+
* - `borderRadius` for the rounded corners,
|
|
34
|
+
* - `outlineColor` to control the color of the border (outline),
|
|
35
|
+
* - `outlineWidth` to change the outline width.
|
|
36
|
+
*
|
|
37
|
+
* ## Variants
|
|
38
|
+
*
|
|
39
|
+
* - Use the following variants to render specific types of progress bars:
|
|
40
|
+
* - `negative`: set to `true` if you wish to use the negative theming for progress bar filling,
|
|
41
|
+
* - `inactive`: set to `true` if you wish to style the progress bar as inactive.
|
|
42
|
+
*
|
|
43
|
+
* ## Usability and A11y guidelines
|
|
44
|
+
*
|
|
45
|
+
* `ProgressBar` component accepts all the standard accessibility properties including the ones that
|
|
46
|
+
* are specific to the `progressbar` role. By default the following props are used:
|
|
47
|
+
*
|
|
48
|
+
* - `accessibilityRole` (`role`): `progressbar`,
|
|
49
|
+
* - `accessibilityValue.min` (`aria-valuemin`): `0`,
|
|
50
|
+
* - `accessibilityValue.max` (`aria-valuemax`): `100`,
|
|
51
|
+
* - `accessibilityValue.now` (`aria-valuenow`): `percentage`,
|
|
52
|
+
* - `accessibilityValue.text` (`aria-valuetext`): `%{percentage}%`,
|
|
53
|
+
*
|
|
54
|
+
*/
|
|
55
|
+
const ProgressBar = forwardRef(
|
|
56
|
+
({ children = null, percentage = 0, tokens, variant, ...rest }, ref) => {
|
|
57
|
+
const themeTokens = useThemeTokens('ProgressBar', tokens, variant)
|
|
58
|
+
if (percentage < 0) {
|
|
59
|
+
throw new Error('ProgressBar: `percentage` must be a positive number')
|
|
60
|
+
} else if (percentage > 100) {
|
|
61
|
+
throw new Error('ProgressBar: `percentage` cannot exceed 100')
|
|
62
|
+
}
|
|
63
|
+
const accessibilityProps = {
|
|
64
|
+
accessibilityRole: 'progressbar',
|
|
65
|
+
accessibilityValue: {
|
|
66
|
+
min: 0,
|
|
67
|
+
max: 100,
|
|
68
|
+
now: percentage,
|
|
69
|
+
text: `${percentage}%`
|
|
70
|
+
},
|
|
71
|
+
...a11yProps.select(rest)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return percentage > 0 ? (
|
|
75
|
+
<View
|
|
76
|
+
ref={ref}
|
|
77
|
+
style={[staticStyles.bar, selectBarStyles(themeTokens, percentage)]}
|
|
78
|
+
{...accessibilityProps}
|
|
79
|
+
>
|
|
80
|
+
{children ?? <ProgressBarBackground variant={variant} />}
|
|
81
|
+
</View>
|
|
82
|
+
) : null
|
|
83
|
+
}
|
|
84
|
+
)
|
|
85
|
+
ProgressBar.displayName = 'ProgressBar'
|
|
86
|
+
|
|
87
|
+
ProgressBar.propTypes = {
|
|
88
|
+
/**
|
|
89
|
+
* Optional children that can be used to customize the progress bar filling.
|
|
90
|
+
*/
|
|
91
|
+
children: PropTypes.node,
|
|
92
|
+
/**
|
|
93
|
+
* Accessibility label for the progress bar.
|
|
94
|
+
*/
|
|
95
|
+
accessibilityLabel: PropTypes.string.isRequired,
|
|
96
|
+
/**
|
|
97
|
+
* Percentage of completion.
|
|
98
|
+
*/
|
|
99
|
+
percentage: PropTypes.number,
|
|
100
|
+
/**
|
|
101
|
+
* Progress bar tokens.
|
|
102
|
+
*/
|
|
103
|
+
tokens: getTokensPropType('ProgressBar'),
|
|
104
|
+
/**
|
|
105
|
+
* Progress bar variant.
|
|
106
|
+
*/
|
|
107
|
+
variant: variantProp.propType
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export default ProgressBar
|
|
111
|
+
|
|
112
|
+
const staticStyles = StyleSheet.create({
|
|
113
|
+
bar: {
|
|
114
|
+
height: '100%',
|
|
115
|
+
overflow: 'hidden',
|
|
116
|
+
position: 'absolute',
|
|
117
|
+
...Platform.select({
|
|
118
|
+
web: {
|
|
119
|
+
outlineStyle: 'solid'
|
|
120
|
+
}
|
|
121
|
+
})
|
|
122
|
+
}
|
|
123
|
+
})
|