@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,4 +1,4 @@
|
|
|
1
|
-
import React from 'react'
|
|
1
|
+
import React, { forwardRef } from 'react'
|
|
2
2
|
import PropTypes from 'prop-types'
|
|
3
3
|
|
|
4
4
|
import ItemContent from './ItemContent'
|
|
@@ -16,52 +16,59 @@ import { useThemeTokensCallback } from '../ThemeProvider'
|
|
|
16
16
|
## Usage Criteria
|
|
17
17
|
- Use `SideNav.ItemsGroup` with large pages that have multiple sections
|
|
18
18
|
*/
|
|
19
|
-
const ItemsGroup = (
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
19
|
+
const ItemsGroup = forwardRef(
|
|
20
|
+
(
|
|
21
|
+
{
|
|
22
|
+
children,
|
|
23
|
+
label,
|
|
24
|
+
openGroups,
|
|
25
|
+
groupId,
|
|
26
|
+
isActive = false,
|
|
27
|
+
variant,
|
|
28
|
+
tokens,
|
|
29
|
+
itemTokens,
|
|
30
|
+
onToggle
|
|
31
|
+
},
|
|
32
|
+
ref
|
|
33
|
+
) => {
|
|
34
|
+
// A SideNav control uses the same style and theme as SideNavItem, with a 'parent' variant,
|
|
35
|
+
// plus control-specific tokens from the SideNavItemsGroup theme (e.g. open/close icon, etc).
|
|
36
|
+
const getAppearance = (appearance) => ({ ...variant, ...appearance, active: isActive })
|
|
37
|
+
const getItemAppearance = (appearance) => ({ ...getAppearance(appearance), type: 'parent' })
|
|
34
38
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
39
|
+
const getGroupTokens = useThemeTokensCallback('SideNavItemsGroup', tokens, variant)
|
|
40
|
+
const getPanelTokens = (appearance) =>
|
|
41
|
+
selectTokens('ExpandCollapsePanel', getGroupTokens(getAppearance(appearance)))
|
|
38
42
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
const getItemTokens = useThemeTokensCallback('SideNavItem', itemTokens, variant)
|
|
44
|
+
const getControlTokens = (appearance) =>
|
|
45
|
+
selectTokens('ExpandCollapseControl', {
|
|
46
|
+
...getItemTokens(getItemAppearance(appearance)), // main style from SideNavItem
|
|
47
|
+
...getGroupTokens(getAppearance(appearance)) // control-specific tokens like icon etc
|
|
48
|
+
})
|
|
45
49
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
+
const controlContent = (controlState) => {
|
|
51
|
+
const currentItemTokens = getItemTokens(getItemAppearance(controlState))
|
|
52
|
+
return <ItemContent tokens={currentItemTokens}>{label}</ItemContent>
|
|
53
|
+
}
|
|
50
54
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
55
|
+
return (
|
|
56
|
+
<ExpandCollapse.Panel
|
|
57
|
+
ref={ref}
|
|
58
|
+
openIds={openGroups}
|
|
59
|
+
panelId={groupId}
|
|
60
|
+
onToggle={onToggle}
|
|
61
|
+
tokens={getPanelTokens}
|
|
62
|
+
controlTokens={getControlTokens}
|
|
63
|
+
control={controlContent}
|
|
64
|
+
accessibilityState={{ active: isActive }} // ExpandCollapse.Panel handles expanded state
|
|
65
|
+
>
|
|
66
|
+
{children}
|
|
67
|
+
</ExpandCollapse.Panel>
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
)
|
|
71
|
+
ItemsGroup.displayName = 'ItemsGroup'
|
|
65
72
|
|
|
66
73
|
ItemsGroup.propTypes = {
|
|
67
74
|
/**
|
package/src/SideNav/SideNav.jsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useState } from 'react'
|
|
1
|
+
import React, { forwardRef, useState } from 'react'
|
|
2
2
|
import PropTypes from 'prop-types'
|
|
3
3
|
|
|
4
4
|
import ExpandCollapse from '../ExpandCollapse'
|
|
@@ -20,73 +20,81 @@ function selectBorderStyles(tokens) {
|
|
|
20
20
|
- Use in conjunction with a large amount of educational / informational content
|
|
21
21
|
- Allow the user to navigate between options frequently and efficiently
|
|
22
22
|
*/
|
|
23
|
-
const SideNav = (
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
const SideNav = forwardRef(
|
|
24
|
+
({ children, variant = {}, tokens, accordion = true, itemTokens, groupTokens }, ref) => {
|
|
25
|
+
const themeTokens = useThemeTokens('SideNav', tokens, variant)
|
|
26
|
+
const [active, setActive] = useState({ groupId: undefined, itemId: undefined })
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const isItemActive = (itemId, groupId) => {
|
|
32
|
-
return active.groupId === groupId && active.itemId === itemId
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return (
|
|
36
|
-
<ExpandCollapse maxOpen={accordion ? 1 : null} style={selectBorderStyles(themeTokens)}>
|
|
37
|
-
{({ openIds, onToggle }) => {
|
|
38
|
-
const renderItem = (item, index, groupId) => {
|
|
39
|
-
const { itemId = `item-${index}`, onPress } = item.props
|
|
40
|
-
const handlePress = (...args) => {
|
|
41
|
-
onItemPress(...args)
|
|
42
|
-
if (onPress) onPress(...args)
|
|
43
|
-
}
|
|
44
|
-
return (
|
|
45
|
-
<Item
|
|
46
|
-
{...item.props}
|
|
47
|
-
key={itemId}
|
|
48
|
-
itemId={itemId}
|
|
49
|
-
groupId={groupId}
|
|
50
|
-
variant={groupId ? { ...variant, type: 'child' } : variant}
|
|
51
|
-
tokens={itemTokens}
|
|
52
|
-
isActive={isItemActive(itemId, groupId)}
|
|
53
|
-
onPress={handlePress}
|
|
54
|
-
/>
|
|
55
|
-
)
|
|
56
|
-
}
|
|
28
|
+
const onItemPress = (itemId, groupId) => {
|
|
29
|
+
setActive({ itemId, groupId })
|
|
30
|
+
}
|
|
57
31
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
32
|
+
const isItemActive = (itemId, groupId) => {
|
|
33
|
+
return active.groupId === groupId && active.itemId === itemId
|
|
34
|
+
}
|
|
61
35
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
36
|
+
return (
|
|
37
|
+
<ExpandCollapse
|
|
38
|
+
ref={ref}
|
|
39
|
+
maxOpen={accordion ? 1 : null}
|
|
40
|
+
style={selectBorderStyles(themeTokens)}
|
|
41
|
+
>
|
|
42
|
+
{({ openIds, onToggle }) => {
|
|
43
|
+
const renderItem = (item, index, groupId) => {
|
|
44
|
+
const { itemId = `item-${index}`, onPress } = item.props
|
|
45
|
+
const handlePress = (...args) => {
|
|
46
|
+
onItemPress(...args)
|
|
47
|
+
if (onPress) onPress(...args)
|
|
48
|
+
}
|
|
65
49
|
return (
|
|
66
|
-
<
|
|
67
|
-
{...
|
|
68
|
-
key={
|
|
50
|
+
<Item
|
|
51
|
+
{...item.props}
|
|
52
|
+
key={itemId}
|
|
53
|
+
itemId={itemId}
|
|
69
54
|
groupId={groupId}
|
|
70
|
-
variant={variant}
|
|
71
|
-
tokens={
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
onToggle={() => onToggle(groupId)}
|
|
76
|
-
>
|
|
77
|
-
{React.Children.map(child.props.children, (item, itemIndex) =>
|
|
78
|
-
renderItem(item, itemIndex, groupId)
|
|
79
|
-
)}
|
|
80
|
-
</ItemsGroup>
|
|
55
|
+
variant={groupId ? { ...variant, type: 'child' } : variant}
|
|
56
|
+
tokens={itemTokens}
|
|
57
|
+
isActive={isItemActive(itemId, groupId)}
|
|
58
|
+
onPress={handlePress}
|
|
59
|
+
/>
|
|
81
60
|
)
|
|
82
61
|
}
|
|
83
62
|
|
|
84
|
-
return
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
63
|
+
return React.Children.map(children, (child, index) => {
|
|
64
|
+
// iterate over children and identify them internally to later reference expanded groups and active items
|
|
65
|
+
if (child.type === Item) return renderItem(child, index)
|
|
66
|
+
|
|
67
|
+
if (child.type === ItemsGroup) {
|
|
68
|
+
const { groupId = `group-${index}` } = child.props
|
|
69
|
+
const isGroupActive = active.itemId !== undefined && active.groupId === groupId
|
|
70
|
+
const handleToggle = (event) => onToggle(groupId, event)
|
|
71
|
+
return (
|
|
72
|
+
<ItemsGroup
|
|
73
|
+
{...child.props}
|
|
74
|
+
key={groupId}
|
|
75
|
+
groupId={groupId}
|
|
76
|
+
variant={variant}
|
|
77
|
+
tokens={groupTokens}
|
|
78
|
+
itemTokens={itemTokens}
|
|
79
|
+
openGroups={openIds}
|
|
80
|
+
isActive={isGroupActive}
|
|
81
|
+
onToggle={handleToggle}
|
|
82
|
+
>
|
|
83
|
+
{React.Children.map(child.props.children, (item, itemIndex) =>
|
|
84
|
+
renderItem(item, itemIndex, groupId)
|
|
85
|
+
)}
|
|
86
|
+
</ItemsGroup>
|
|
87
|
+
)
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return null
|
|
91
|
+
})
|
|
92
|
+
}}
|
|
93
|
+
</ExpandCollapse>
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
)
|
|
97
|
+
SideNav.displayName = 'SideNav'
|
|
90
98
|
|
|
91
99
|
SideNav.propTypes = {
|
|
92
100
|
/**
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react'
|
|
2
|
+
import { Animated, Platform } from 'react-native'
|
|
3
|
+
import propTypes from 'prop-types'
|
|
4
|
+
import StackView from '../StackView'
|
|
5
|
+
import { useThemeTokens } from '../ThemeProvider'
|
|
6
|
+
import { getTokensPropType, useSpacingScale, variantProp } from '../utils'
|
|
7
|
+
import useSkeletonNativeAnimation from './useSkeletonNativeAnimation'
|
|
8
|
+
import skeletonWebAnimation from './skeletonWebAnimation'
|
|
9
|
+
|
|
10
|
+
const selectSkeletonStyles = ({ color, radius, fadeAnimation }) => ({
|
|
11
|
+
backgroundColor: color,
|
|
12
|
+
borderRadius: radius,
|
|
13
|
+
...fadeAnimation
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
const selectLineStyles = ({ skeletonHeight, lineWidth }) => ({
|
|
17
|
+
width: lineWidth,
|
|
18
|
+
height: skeletonHeight
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
const selectShapeStyles = ({ skeletonHeight }) => ({
|
|
22
|
+
height: skeletonHeight,
|
|
23
|
+
width: skeletonHeight
|
|
24
|
+
})
|
|
25
|
+
|
|
26
|
+
const selectSquareStyles = ({ radius }) => ({
|
|
27
|
+
borderRadius: radius
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
const Skeleton = forwardRef(({ tokens, variant, size, characters, lines, shape = 'line' }, ref) => {
|
|
31
|
+
const themeTokens = useThemeTokens('Skeleton', tokens, variant)
|
|
32
|
+
const skeletonHeight = useSpacingScale(size || themeTokens.size)
|
|
33
|
+
const nativeAnimation = useSkeletonNativeAnimation()
|
|
34
|
+
|
|
35
|
+
const getAnimationBaseOnPlatform = () => {
|
|
36
|
+
if (Platform.OS !== 'web') {
|
|
37
|
+
return nativeAnimation
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return skeletonWebAnimation
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const getLineWidth = () => {
|
|
44
|
+
if (characters) {
|
|
45
|
+
return characters * themeTokens.baseWidth
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return themeTokens.characters * themeTokens.baseWidth
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
const getStyledBasedOnShape = () => {
|
|
52
|
+
if (shape === 'circle') {
|
|
53
|
+
return selectShapeStyles({ skeletonHeight })
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (shape === 'box') {
|
|
57
|
+
return [
|
|
58
|
+
selectShapeStyles({ skeletonHeight }),
|
|
59
|
+
selectSquareStyles({ radius: themeTokens.squareRadius })
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return selectLineStyles({ skeletonHeight, lineWidth: getLineWidth() })
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const renderSkeleton = (index = 0) => (
|
|
67
|
+
<Animated.View
|
|
68
|
+
testID="skeleton"
|
|
69
|
+
key={`skeleton-${index + 1}`}
|
|
70
|
+
style={[
|
|
71
|
+
selectSkeletonStyles({ ...themeTokens, fadeAnimation: getAnimationBaseOnPlatform() }),
|
|
72
|
+
getStyledBasedOnShape()
|
|
73
|
+
]}
|
|
74
|
+
/>
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
return (
|
|
78
|
+
<StackView space={themeTokens.spaceBetweenLines} ref={ref}>
|
|
79
|
+
{lines > 1 ? [...Array(lines)].map((_, index) => renderSkeleton(index)) : renderSkeleton()}
|
|
80
|
+
</StackView>
|
|
81
|
+
)
|
|
82
|
+
})
|
|
83
|
+
Skeleton.displayName = 'Skeleton'
|
|
84
|
+
|
|
85
|
+
Skeleton.propTypes = {
|
|
86
|
+
tokens: getTokensPropType('Skeleton'),
|
|
87
|
+
variant: variantProp.propType,
|
|
88
|
+
size: propTypes.number,
|
|
89
|
+
characters: propTypes.number,
|
|
90
|
+
lines: propTypes.number,
|
|
91
|
+
shape: propTypes.oneOf(['line', 'circle', 'box'])
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export default Skeleton
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ANIMATION_DURATION, DEFAULT_OPACITY, OPACITY_STOP } from './skeleton.constant'
|
|
2
|
+
|
|
3
|
+
export default {
|
|
4
|
+
animationDuration: `${ANIMATION_DURATION}ms`,
|
|
5
|
+
animationTimingFunction: 'ease-in-out',
|
|
6
|
+
animationDelay: '0.5s',
|
|
7
|
+
animationIterationCount: 'infinite',
|
|
8
|
+
animationKeyframes: {
|
|
9
|
+
'0%': { opacity: DEFAULT_OPACITY },
|
|
10
|
+
'50%': { opacity: OPACITY_STOP },
|
|
11
|
+
'100%': { opacity: DEFAULT_OPACITY }
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { useEffect, useRef } from 'react'
|
|
2
|
+
import { Animated } from 'react-native'
|
|
3
|
+
import { ANIMATION_DURATION, DEFAULT_OPACITY, OPACITY_STOP } from './skeleton.constant'
|
|
4
|
+
|
|
5
|
+
const useSkeletonNativeAnimation = () => {
|
|
6
|
+
const fadeAnimation = useRef(new Animated.Value(DEFAULT_OPACITY)).current
|
|
7
|
+
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
const fade = Animated.sequence([
|
|
10
|
+
Animated.timing(fadeAnimation, {
|
|
11
|
+
toValue: OPACITY_STOP,
|
|
12
|
+
duration: ANIMATION_DURATION,
|
|
13
|
+
useNativeDriver: true
|
|
14
|
+
}),
|
|
15
|
+
Animated.timing(fadeAnimation, {
|
|
16
|
+
toValue: DEFAULT_OPACITY,
|
|
17
|
+
duration: ANIMATION_DURATION,
|
|
18
|
+
useNativeDriver: true
|
|
19
|
+
})
|
|
20
|
+
])
|
|
21
|
+
Animated.loop(fade).start()
|
|
22
|
+
}, [fadeAnimation])
|
|
23
|
+
|
|
24
|
+
return { opacity: fadeAnimation }
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export default useSkeletonNativeAnimation
|
package/src/Spacer/Spacer.jsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from 'react'
|
|
1
|
+
import React, { forwardRef } from 'react'
|
|
2
2
|
import PropTypes from 'prop-types'
|
|
3
3
|
import { StyleSheet, View } from 'react-native'
|
|
4
4
|
|
|
@@ -54,11 +54,14 @@ const selectSizeStyle = (size, direction) => ({
|
|
|
54
54
|
* Spacer has no content and is ignored by tools such as screen readers. Use `Divider` for
|
|
55
55
|
* separations between elements that may be treated as semantically meaningful on web.
|
|
56
56
|
*/
|
|
57
|
-
const Spacer = ({ space = 1, direction = 'column', testID }) => {
|
|
57
|
+
const Spacer = forwardRef(({ space = 1, direction = 'column', testID, dataSet }, ref) => {
|
|
58
58
|
const size = useSpacingScale(space)
|
|
59
59
|
const sizeStyle = selectSizeStyle(size, direction)
|
|
60
|
-
return
|
|
61
|
-
}
|
|
60
|
+
return (
|
|
61
|
+
<View ref={ref} testID={testID} style={[staticStyles.stretch, sizeStyle]} dataSet={dataSet} />
|
|
62
|
+
)
|
|
63
|
+
})
|
|
64
|
+
Spacer.displayName = 'Spacer'
|
|
62
65
|
|
|
63
66
|
Spacer.propTypes = {
|
|
64
67
|
/**
|
|
@@ -74,6 +77,10 @@ Spacer.propTypes = {
|
|
|
74
77
|
* - `'row'` applies space horizontally; has a fixed width and not height.
|
|
75
78
|
*/
|
|
76
79
|
direction: PropTypes.oneOf(['column', 'row']),
|
|
80
|
+
/**
|
|
81
|
+
* @ignore
|
|
82
|
+
*/
|
|
83
|
+
dataSet: PropTypes.object,
|
|
77
84
|
/**
|
|
78
85
|
* @ignore
|
|
79
86
|
* In tests, the only way to select Spacers is with testID prop and getByTestId, since they have no content,
|
|
@@ -1,9 +1,19 @@
|
|
|
1
|
-
import React from 'react'
|
|
1
|
+
import React, { forwardRef } from 'react'
|
|
2
2
|
import PropTypes from 'prop-types'
|
|
3
3
|
import { View } from 'react-native'
|
|
4
4
|
|
|
5
5
|
import Divider from '../Divider'
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
spacingProps,
|
|
8
|
+
a11yProps,
|
|
9
|
+
getTokensPropType,
|
|
10
|
+
responsiveProps,
|
|
11
|
+
variantProp,
|
|
12
|
+
viewProps,
|
|
13
|
+
useResponsiveProp,
|
|
14
|
+
getA11yPropsFromHtmlTag,
|
|
15
|
+
layoutTags
|
|
16
|
+
} from '../utils'
|
|
7
17
|
import { useThemeTokens } from '../ThemeProvider'
|
|
8
18
|
import { useViewport } from '../ViewportProvider'
|
|
9
19
|
import getStackedContent from './getStackedContent'
|
|
@@ -51,31 +61,44 @@ import { staticStyles, selectFlexStyles } from './common'
|
|
|
51
61
|
* It applies no accessibility props of its own, unless `divider` prop is passed (`Divider` has a
|
|
52
62
|
* semantic role but only on web, not within native apps).
|
|
53
63
|
*/
|
|
54
|
-
const StackView = (
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
64
|
+
const StackView = forwardRef(
|
|
65
|
+
(
|
|
66
|
+
{
|
|
67
|
+
space = 1,
|
|
68
|
+
divider,
|
|
69
|
+
direction: directionProp = 'column',
|
|
70
|
+
children,
|
|
71
|
+
variant,
|
|
72
|
+
tokens,
|
|
73
|
+
tag,
|
|
74
|
+
accessibilityRole,
|
|
75
|
+
...rest
|
|
76
|
+
},
|
|
77
|
+
ref
|
|
78
|
+
) => {
|
|
79
|
+
const viewport = useViewport()
|
|
80
|
+
const direction = useResponsiveProp(directionProp, 'column')
|
|
81
|
+
const props = {
|
|
82
|
+
...getA11yPropsFromHtmlTag(tag, accessibilityRole),
|
|
83
|
+
...a11yProps.select(rest),
|
|
84
|
+
...viewProps.select(rest)
|
|
85
|
+
}
|
|
86
|
+
const content = getStackedContent(children, { direction, divider, space })
|
|
87
|
+
const themeTokens = useThemeTokens('StackView', tokens, variant, { viewport })
|
|
88
|
+
const flexStyles = selectFlexStyles(themeTokens)
|
|
69
89
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
90
|
+
return (
|
|
91
|
+
<View ref={ref} {...props} style={[flexStyles, staticStyles[direction]]}>
|
|
92
|
+
{content}
|
|
93
|
+
</View>
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
)
|
|
97
|
+
StackView.displayName = 'StackView'
|
|
76
98
|
|
|
77
99
|
StackView.propTypes = {
|
|
78
100
|
...a11yProps.propTypes,
|
|
101
|
+
tokens: getTokensPropType('StackView'),
|
|
79
102
|
variant: variantProp.propType,
|
|
80
103
|
/**
|
|
81
104
|
* Sets the `flexDirection` of the container and, if `divider` is used, gives the Divider the appropriate direction.
|
|
@@ -94,6 +117,13 @@ StackView.propTypes = {
|
|
|
94
117
|
* or, a SpacingObject with viewport keys and options (see `useSpacingScale` for details).
|
|
95
118
|
*/
|
|
96
119
|
space: spacingProps.types.spacingValue,
|
|
120
|
+
/**
|
|
121
|
+
* Optional semantic HTML tag, to apply to the container on web. Does not change styling.
|
|
122
|
+
*
|
|
123
|
+
* In native apps, if a header tag is provided ("h1", "h2" etc) and accessibilityRole prop
|
|
124
|
+
* is not defined, the accessibilityRole will default to "heading".
|
|
125
|
+
*/
|
|
126
|
+
tag: PropTypes.oneOf(layoutTags),
|
|
97
127
|
/**
|
|
98
128
|
* A StackView may take any children, but will have no effect if it is only passed one child or is passed children
|
|
99
129
|
* wrapped in a component. If necessary, children may be wrapped in one React Fragment.
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import React from 'react'
|
|
1
|
+
import React, { forwardRef } from 'react'
|
|
2
|
+
import { Platform } from 'react-native'
|
|
2
3
|
|
|
3
4
|
import StackWrapBox from './StackWrapBox'
|
|
4
5
|
import StackWrapGap from './StackWrapGap'
|
|
@@ -14,20 +15,28 @@ const exampleGapValue = '1px'
|
|
|
14
15
|
* wrapped lines of items. By default, this `gap` is the same as the gap between spaced items.
|
|
15
16
|
* If a different spacing is desired between wrapped lines, pass a spacing value to the `gap` prop.
|
|
16
17
|
*/
|
|
17
|
-
const StackWrap = (props) => {
|
|
18
|
+
const StackWrap = forwardRef((props, ref) => {
|
|
18
19
|
const { space } = props
|
|
19
20
|
// Don't apply separate gap if `null` or `undefined`, so can be unset in Storybook etc
|
|
20
|
-
// eslint-disable-next-line react/destructuring-assignment
|
|
21
21
|
const gap = props.gap ?? space
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
const canUseCSSGap =
|
|
24
|
+
Platform.OS === 'web' &&
|
|
25
|
+
gap === space &&
|
|
26
|
+
// In Jest/CI, global CSS isn't always available and doesn't always have .supports method
|
|
27
|
+
typeof CSS?.supports === 'function' &&
|
|
28
|
+
CSS.supports('gap', exampleGapValue)
|
|
29
|
+
|
|
30
|
+
return canUseCSSGap ? (
|
|
24
31
|
// If possible, use the cleaner implementation that applies CSS `gap` styles to the container.
|
|
25
|
-
<StackWrapGap {...props} />
|
|
32
|
+
<StackWrapGap ref={ref} {...props} />
|
|
26
33
|
) : (
|
|
27
34
|
// Else, use the fallback implementation which renders a `Box` component around each child.
|
|
28
|
-
<StackWrapBox {...props} />
|
|
35
|
+
<StackWrapBox ref={ref} {...props} />
|
|
29
36
|
)
|
|
30
|
-
}
|
|
37
|
+
})
|
|
38
|
+
StackWrap.displayName = 'StackWrap'
|
|
39
|
+
|
|
31
40
|
StackWrap.propTypes = StackWrapBox.propTypes
|
|
32
41
|
|
|
33
42
|
export default StackWrap
|