@telus-uds/components-base 0.0.2-prerelease.5 → 0.0.2-prerelease.9
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/.ultra.cache.json +1 -0
- package/CHANGELOG.md +65 -0
- package/__fixtures__/Accessible.js +33 -0
- package/__fixtures__/Accessible.native.js +32 -0
- package/__fixtures__/testTheme.js +871 -52
- package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +1 -1
- package/__tests__/Button/ButtonBase.test.jsx +3 -32
- package/__tests__/Button/ButtonGroup.test.jsx +2 -2
- package/__tests__/Checkbox/Checkbox.test.jsx +94 -0
- package/__tests__/Checkbox/CheckboxGroup.test.jsx +247 -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__/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 +221 -0
- package/__tests__/RadioCard/RadioCard.test.jsx +87 -0
- package/__tests__/RadioCard/RadioCardGroup.test.jsx +247 -0
- package/__tests__/Search/Search.test.jsx +72 -0
- package/__tests__/Select/Select.test.jsx +93 -0
- package/__tests__/Skeleton/Skeleton.test.jsx +61 -0
- package/__tests__/StackView/StackView.test.jsx +0 -26
- package/__tests__/StepTracker/StepTracker.test.jsx +94 -0
- package/__tests__/Tabs/Tabs.test.jsx +200 -0
- package/__tests__/Tags/Tags.test.jsx +328 -0
- package/__tests__/TextInput/TextArea.test.jsx +34 -0
- package/__tests__/TextInput/{TextInput.test.jsx → TextInputBase.test.jsx} +20 -46
- package/__tests__/Tooltip/Tooltip.test.jsx +65 -0
- package/__tests__/Tooltip/getTooltipPosition.test.js +79 -0
- package/__tests__/utils/input.test.js +58 -0
- package/__tests__/utils/useCopy.test.js +42 -0
- package/__tests__/utils/useResponsiveProp.test.jsx +202 -0
- package/__tests__/utils/{spacing.test.jsx → useSpacingScale.test.jsx} +1 -1
- package/babel.config.js +20 -0
- package/jest.config.js +13 -4
- package/lib/A11yInfoProvider/index.js +54 -26
- package/lib/A11yText/index.js +37 -14
- package/lib/ActivityIndicator/Spinner.js +78 -0
- package/lib/ActivityIndicator/Spinner.native.js +121 -87
- 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 +54 -31
- package/lib/Box/index.js +13 -2
- package/lib/Button/Button.js +38 -10
- package/lib/Button/ButtonBase.js +115 -94
- package/lib/Button/ButtonGroup.js +94 -86
- package/lib/Button/ButtonLink.js +41 -13
- package/lib/Button/index.js +31 -4
- package/lib/Button/propTypes.js +32 -9
- package/lib/Card/Card.js +36 -41
- package/lib/Card/CardBase.js +78 -0
- package/lib/Card/PressableCardBase.js +137 -0
- package/lib/Card/index.js +40 -2
- package/lib/Checkbox/Checkbox.js +344 -0
- package/lib/Checkbox/CheckboxGroup.js +231 -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 +50 -24
- package/lib/Divider/index.js +13 -2
- package/lib/ExpandCollapse/Accordion.js +20 -7
- package/lib/ExpandCollapse/Control.js +50 -27
- package/lib/ExpandCollapse/ExpandCollapse.js +41 -24
- package/lib/ExpandCollapse/Panel.js +75 -37
- package/lib/ExpandCollapse/index.js +25 -7
- package/lib/Feedback/Feedback.js +85 -34
- package/lib/Feedback/index.js +13 -2
- package/lib/Fieldset/Fieldset.js +160 -0
- package/lib/Fieldset/FieldsetContainer.js +41 -0
- package/lib/Fieldset/FieldsetContainer.native.js +33 -0
- package/lib/Fieldset/Legend.js +33 -0
- package/lib/Fieldset/Legend.native.js +43 -0
- package/lib/Fieldset/cssReset.js +21 -0
- package/lib/Fieldset/index.js +13 -0
- package/lib/FlexGrid/Col/Col.js +67 -38
- package/lib/FlexGrid/Col/index.js +13 -2
- package/lib/FlexGrid/FlexGrid.js +70 -45
- package/lib/FlexGrid/Row/Row.js +48 -27
- 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/Icon/Icon.js +52 -47
- package/lib/Icon/IconText.js +100 -0
- package/lib/Icon/index.js +31 -3
- package/lib/IconButton/IconButton.js +135 -0
- package/lib/IconButton/index.js +13 -0
- package/lib/InputLabel/InputLabel.js +70 -34
- package/lib/InputLabel/LabelContent.js +31 -0
- package/lib/InputLabel/LabelContent.native.js +9 -1
- package/lib/InputLabel/index.js +13 -2
- package/lib/InputSupports/InputSupports.js +104 -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 +57 -15
- package/lib/Link/InlinePressable.js +50 -0
- package/lib/Link/InlinePressable.native.js +101 -0
- package/lib/Link/Link.js +30 -13
- package/lib/Link/LinkBase.js +114 -145
- package/lib/Link/TextButton.js +47 -17
- package/lib/Link/index.js +39 -4
- package/lib/List/List.js +80 -0
- package/lib/List/ListItem.js +237 -0
- package/lib/List/index.js +13 -0
- package/lib/Modal/Modal.js +226 -0
- package/lib/Modal/dictionary.js +16 -0
- package/lib/Modal/index.js +13 -0
- package/lib/Notification/Notification.js +200 -0
- package/lib/Notification/dictionary.js +15 -0
- package/lib/Notification/index.js +13 -0
- package/lib/Pagination/PageButton.js +45 -46
- package/lib/Pagination/Pagination.js +70 -40
- package/lib/Pagination/SideButton.js +74 -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 +99 -0
- package/lib/Progress/ProgressBar.js +146 -0
- package/lib/Progress/ProgressBarBackground.js +57 -0
- package/lib/Progress/index.js +16 -0
- package/lib/Radio/Radio.js +292 -0
- package/lib/Radio/RadioButton.js +141 -0
- package/lib/Radio/RadioGroup.js +233 -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 +240 -0
- package/lib/RadioCard/RadioCardGroup.js +251 -0
- package/lib/RadioCard/index.js +21 -0
- package/lib/Search/Search.js +243 -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 +79 -0
- package/lib/Select/Picker.native.js +115 -0
- package/lib/Select/Select.js +300 -0
- package/lib/Select/index.js +19 -0
- package/lib/SideNav/Item.js +54 -33
- package/lib/SideNav/ItemContent.js +41 -15
- package/lib/SideNav/ItemsGroup.js +46 -27
- package/lib/SideNav/SideNav.js +92 -69
- 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 +31 -12
- package/lib/Spacer/index.js +13 -2
- package/lib/StackView/StackView.js +57 -33
- package/lib/StackView/StackWrap.js +33 -10
- package/lib/StackView/StackWrap.native.js +13 -2
- package/lib/StackView/StackWrapBox.js +50 -23
- package/lib/StackView/StackWrapGap.js +45 -19
- package/lib/StackView/common.js +19 -4
- package/lib/StackView/getStackedContent.js +49 -19
- package/lib/StackView/index.js +29 -5
- package/lib/StepTracker/Step.js +245 -0
- package/lib/StepTracker/StepTracker.js +197 -0
- package/lib/StepTracker/dictionary.js +17 -0
- package/lib/StepTracker/index.js +13 -0
- package/lib/Tabs/HorizontalScroll.js +199 -0
- package/lib/Tabs/ScrollViewEnd.js +66 -0
- package/lib/Tabs/ScrollViewEnd.native.js +41 -0
- package/lib/Tabs/Tabs.js +117 -0
- package/lib/Tabs/TabsItem.js +234 -0
- package/lib/Tabs/TabsScrollButton.js +121 -0
- package/lib/Tabs/dictionary.js +18 -0
- package/lib/Tabs/index.js +13 -0
- package/lib/Tabs/itemPositions.js +128 -0
- package/lib/Tags/Tags.js +250 -0
- package/lib/Tags/index.js +13 -0
- package/lib/TextInput/TextArea.js +109 -0
- package/lib/TextInput/TextInput.js +41 -303
- package/lib/TextInput/TextInputBase.js +252 -0
- package/lib/TextInput/index.js +23 -2
- package/lib/TextInput/propTypes.js +42 -0
- package/lib/ThemeProvider/ThemeProvider.js +38 -14
- package/lib/ThemeProvider/index.js +61 -6
- package/lib/ThemeProvider/useSetTheme.js +14 -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 +52 -16
- package/lib/ThemeProvider/utils/theme-tokens.js +94 -16
- package/lib/ToggleSwitch/ToggleSwitch.js +76 -52
- package/lib/ToggleSwitch/index.js +13 -2
- package/lib/Tooltip/Backdrop.js +56 -0
- package/lib/Tooltip/Backdrop.native.js +59 -0
- package/lib/Tooltip/Tooltip.js +357 -0
- package/lib/Tooltip/dictionary.js +15 -0
- package/lib/Tooltip/getTooltipPosition.js +172 -0
- package/lib/Tooltip/index.js +13 -0
- package/lib/TooltipButton/TooltipButton.js +83 -0
- package/lib/TooltipButton/index.js +13 -0
- package/lib/Typography/Typography.js +58 -43
- package/lib/Typography/index.js +13 -2
- package/lib/ViewportProvider/ViewportProvider.js +46 -0
- package/lib/ViewportProvider/index.js +22 -38
- package/lib/ViewportProvider/useViewport.js +15 -0
- package/lib/ViewportProvider/useViewportListener.js +57 -0
- package/lib/index.js +518 -24
- package/lib/utils/a11y/index.js +18 -0
- package/lib/utils/a11y/textSize.js +49 -0
- package/lib/utils/animation/index.js +15 -2
- package/lib/utils/animation/useVerticalExpandAnimation.js +28 -11
- package/lib/utils/children.js +87 -0
- package/lib/utils/index.js +163 -4
- 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 +51 -33
- package/lib/utils/pressability.js +120 -0
- package/lib/utils/propTypes.js +269 -116
- package/lib/utils/useCopy.js +51 -0
- package/lib/utils/useHash.js +48 -0
- package/lib/utils/useHash.native.js +15 -0
- package/lib/utils/useResponsiveProp.js +59 -0
- package/lib/utils/{spacing/useSpacingScale.js → useSpacingScale.js} +45 -12
- package/lib/utils/useUniqueId.js +13 -4
- package/package.json +12 -9
- package/release-context.json +4 -4
- package/src/ActivityIndicator/{Spinner.web.jsx → Spinner.jsx} +0 -0
- package/src/Box/Box.jsx +11 -4
- package/src/Button/Button.jsx +9 -5
- package/src/Button/ButtonBase.jsx +69 -69
- package/src/Button/ButtonGroup.jsx +11 -24
- package/src/Button/ButtonLink.jsx +14 -4
- package/src/Button/propTypes.js +12 -2
- package/src/Card/Card.jsx +4 -30
- package/src/Card/CardBase.jsx +57 -0
- package/src/Card/PressableCardBase.jsx +112 -0
- package/src/Card/index.js +3 -0
- package/src/Checkbox/Checkbox.jsx +274 -0
- package/src/Checkbox/CheckboxGroup.jsx +196 -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/ExpandCollapse/Control.jsx +1 -1
- package/src/Feedback/Feedback.jsx +31 -22
- package/src/Fieldset/Fieldset.jsx +129 -0
- package/src/Fieldset/FieldsetContainer.jsx +22 -0
- package/src/Fieldset/FieldsetContainer.native.jsx +16 -0
- package/src/Fieldset/Legend.jsx +16 -0
- package/src/Fieldset/Legend.native.jsx +22 -0
- package/src/Fieldset/cssReset.js +14 -0
- package/src/Fieldset/index.js +3 -0
- package/src/Icon/Icon.jsx +21 -26
- package/src/Icon/IconText.jsx +63 -0
- package/src/Icon/index.js +3 -2
- package/src/IconButton/IconButton.jsx +107 -0
- package/src/IconButton/index.js +3 -0
- package/src/InputLabel/InputLabel.jsx +11 -4
- package/src/InputLabel/{LabelContent.web.jsx → LabelContent.jsx} +0 -0
- package/src/InputSupports/InputSupports.jsx +75 -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 +28 -7
- package/src/Link/InlinePressable.jsx +37 -0
- package/src/Link/InlinePressable.native.jsx +73 -0
- package/src/Link/Link.jsx +17 -13
- package/src/Link/LinkBase.jsx +67 -148
- package/src/Link/TextButton.jsx +25 -11
- package/src/Link/index.js +2 -1
- package/src/List/List.jsx +47 -0
- package/src/List/ListItem.jsx +187 -0
- package/src/List/index.js +3 -0
- package/src/Modal/Modal.jsx +185 -0
- package/src/Modal/dictionary.js +9 -0
- package/src/Modal/index.js +3 -0
- package/src/Notification/Notification.jsx +149 -0
- package/src/Notification/dictionary.js +8 -0
- package/src/Notification/index.js +3 -0
- package/src/Pagination/PageButton.jsx +3 -17
- package/src/Pagination/SideButton.jsx +27 -38
- package/src/Progress/Progress.jsx +77 -0
- package/src/Progress/ProgressBar.jsx +110 -0
- package/src/Progress/ProgressBarBackground.jsx +34 -0
- package/src/Progress/index.js +6 -0
- package/src/Radio/Radio.jsx +233 -0
- package/src/Radio/RadioButton.jsx +131 -0
- package/src/Radio/RadioGroup.jsx +198 -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 +191 -0
- package/src/RadioCard/RadioCardGroup.jsx +211 -0
- package/src/RadioCard/index.js +5 -0
- package/src/Search/Search.jsx +204 -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 +67 -0
- package/src/Select/Picker.native.jsx +95 -0
- package/src/Select/Select.jsx +255 -0
- package/src/Select/index.js +8 -0
- package/src/SideNav/Item.jsx +2 -2
- package/src/Skeleton/Skeleton.jsx +98 -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/StackView/StackView.jsx +25 -17
- package/src/StackView/StackWrap.jsx +9 -1
- package/src/StackView/StackWrapBox.jsx +19 -7
- package/src/StackView/StackWrapGap.jsx +15 -5
- package/src/StackView/getStackedContent.jsx +8 -2
- package/src/StepTracker/Step.jsx +202 -0
- package/src/StepTracker/StepTracker.jsx +163 -0
- package/src/StepTracker/dictionary.js +10 -0
- package/src/StepTracker/index.js +3 -0
- package/src/Tabs/HorizontalScroll.jsx +165 -0
- package/src/Tabs/ScrollViewEnd.jsx +53 -0
- package/src/Tabs/ScrollViewEnd.native.jsx +24 -0
- package/src/Tabs/Tabs.jsx +89 -0
- package/src/Tabs/TabsItem.jsx +204 -0
- package/src/Tabs/TabsScrollButton.jsx +100 -0
- package/src/Tabs/dictionary.js +11 -0
- package/src/Tabs/index.js +3 -0
- package/src/Tabs/itemPositions.js +101 -0
- package/src/Tags/Tags.jsx +207 -0
- package/src/Tags/index.js +3 -0
- package/src/TextInput/TextArea.jsx +78 -0
- package/src/TextInput/TextInput.jsx +17 -290
- package/src/TextInput/TextInputBase.jsx +210 -0
- package/src/TextInput/index.js +2 -1
- package/src/TextInput/propTypes.js +29 -0
- package/src/ThemeProvider/useThemeTokens.js +56 -5
- package/src/ThemeProvider/utils/styles.js +18 -5
- package/src/ThemeProvider/utils/theme-tokens.js +46 -5
- package/src/ToggleSwitch/ToggleSwitch.jsx +3 -4
- package/src/Tooltip/Backdrop.jsx +60 -0
- package/src/Tooltip/Backdrop.native.jsx +33 -0
- package/src/Tooltip/Tooltip.jsx +294 -0
- package/src/Tooltip/dictionary.js +8 -0
- package/src/Tooltip/getTooltipPosition.js +161 -0
- package/src/Tooltip/index.js +3 -0
- package/src/TooltipButton/TooltipButton.jsx +49 -0
- package/src/TooltipButton/index.js +3 -0
- package/src/Typography/Typography.jsx +10 -20
- package/src/ViewportProvider/ViewportProvider.jsx +21 -0
- package/src/ViewportProvider/index.jsx +2 -41
- package/src/ViewportProvider/useViewport.js +5 -0
- package/src/ViewportProvider/useViewportListener.js +43 -0
- package/src/index.js +31 -3
- package/src/utils/a11y/index.js +1 -0
- package/src/utils/a11y/textSize.js +30 -0
- package/src/utils/children.jsx +66 -0
- package/src/utils/index.js +11 -1
- 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 +20 -12
- package/src/utils/pressability.js +96 -0
- package/src/utils/propTypes.js +195 -56
- package/src/utils/useCopy.js +39 -0
- package/src/utils/useHash.js +34 -0
- package/src/utils/useHash.native.js +6 -0
- package/src/utils/useResponsiveProp.js +50 -0
- package/src/utils/{spacing/useSpacingScale.js → useSpacingScale.js} +25 -10
- package/stories/A11yText/A11yText.stories.jsx +4 -8
- package/stories/Button/Button.stories.jsx +5 -0
- package/stories/Card/Card.stories.jsx +1 -1
- package/stories/Checkbox/Checkbox.stories.jsx +94 -0
- package/stories/Feedback/Feedback.stories.jsx +5 -6
- package/stories/Icon/Icon.stories.jsx +27 -7
- package/stories/IconButton/IconButton.stories.jsx +50 -0
- package/stories/InputLabel/InputLabel.stories.jsx +8 -3
- package/stories/Link/ChevronLink.stories.jsx +3 -3
- package/stories/Link/Link.stories.jsx +28 -18
- 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/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/Skeleton/Skeleton.stories.jsx +36 -0
- package/stories/Spacer/Spacer.stories.jsx +7 -2
- package/stories/StackView/StackView.stories.jsx +10 -0
- package/stories/StackView/StackWrap.stories.jsx +12 -0
- 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/Tooltip/Tooltip.stories.jsx +81 -0
- package/stories/TooltipButton/TooltipButton.stories.jsx +11 -0
- package/stories/{platform-supports.web.jsx → platform-supports.jsx} +0 -0
- package/stories/supports.jsx +36 -2
- 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/Pagination/useCopy.js +0 -10
- package/lib/config/svgr-icons-web.js +0 -9
- package/lib/config/svgr-icons.js +0 -52
- package/lib/utils/spacing/index.js +0 -2
- package/lib/utils/spacing/utils.js +0 -32
- package/src/Pagination/useCopy.js +0 -7
- package/src/config/svgr-icons-web.js +0 -11
- package/src/config/svgr-icons.js +0 -46
- package/src/utils/spacing/index.js +0 -3
- package/src/utils/spacing/utils.js +0 -28
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.resolveResponsiveProp = void 0;
|
|
7
|
+
|
|
8
|
+
var _systemConstants = require("@telus-uds/system-constants");
|
|
9
|
+
|
|
10
|
+
var _ViewportProvider = require("../ViewportProvider");
|
|
11
|
+
|
|
12
|
+
const hasOwn = (objectProp, key) => Object.prototype.hasOwnProperty.call(objectProp, key);
|
|
13
|
+
|
|
14
|
+
const hasResponsiveProperties = objectProp => _systemConstants.viewports.keys.some(key => hasOwn(objectProp, key));
|
|
15
|
+
/**
|
|
16
|
+
* Resolves a prop which may be a responsive object with keys for viewports.
|
|
17
|
+
*
|
|
18
|
+
* Used internally in useResponsiveProp - see that for more details.
|
|
19
|
+
*
|
|
20
|
+
* @param {*} prop
|
|
21
|
+
* @param {"xs"|"sm"|"md"|"lg"|"xl"} viewport
|
|
22
|
+
* @param {*} [defaultValue]
|
|
23
|
+
* @returns {*}
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
const resolveResponsiveProp = (prop, viewport, defaultValue) => {
|
|
28
|
+
if (prop === undefined) return defaultValue;
|
|
29
|
+
if (!prop || typeof prop !== 'object' || !hasResponsiveProperties(prop)) return prop;
|
|
30
|
+
const value = _systemConstants.viewports.keys.includes(viewport) ? // If there's a current viewport, return the closest match at or below it
|
|
31
|
+
_systemConstants.viewports.inherit(prop)[viewport] : // If no current viewport is available, default to smallest viewport
|
|
32
|
+
prop[_systemConstants.viewports.keys.find(key => hasOwn(prop, key))];
|
|
33
|
+
return value === undefined ? defaultValue : value;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Takes any value and, if that value is a responsive prop (an object with one or more
|
|
37
|
+
* keys matching system viewport names), returns the value corresponding to the largest
|
|
38
|
+
* viewport key smaller than the current screen's viewport.
|
|
39
|
+
*
|
|
40
|
+
* For example, if passed `{ sm: 4, lg: 8 }`, it will return 8 on `xl` and `lg` viewports,
|
|
41
|
+
* 4 on `md` and `sm` viewports, and `undefined` (or a provided `defaultValue`) on `xs` viewports.
|
|
42
|
+
*
|
|
43
|
+
* To generate propTypes for responsive props, see `responsiveProps` in `./utils/propTypes.js`.
|
|
44
|
+
*
|
|
45
|
+
* @param {*} prop - any value which may be an object with viewport keys
|
|
46
|
+
* @param {*} [defaultValue] - default value to provide if no matches found for the current viewport
|
|
47
|
+
* @returns {*}
|
|
48
|
+
*/
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
exports.resolveResponsiveProp = resolveResponsiveProp;
|
|
52
|
+
|
|
53
|
+
const useResponsiveProp = (prop, defaultValue) => {
|
|
54
|
+
const viewport = (0, _ViewportProvider.useViewport)();
|
|
55
|
+
return resolveResponsiveProp(prop, viewport, defaultValue);
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
var _default = useResponsiveProp;
|
|
59
|
+
exports.default = _default;
|
|
@@ -1,14 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _ViewportProvider = require("../ViewportProvider");
|
|
9
|
+
|
|
10
|
+
var _ThemeProvider = require("../ThemeProvider");
|
|
11
|
+
|
|
12
|
+
var _useResponsiveProp = require("./useResponsiveProp");
|
|
13
|
+
|
|
4
14
|
/**
|
|
5
15
|
* @typedef {import('@telus-uds/system-constants/viewports').Viewport} Viewport
|
|
6
|
-
* @typedef {import('
|
|
7
|
-
* @typedef {import('
|
|
8
|
-
* @typedef {import('
|
|
9
|
-
* @typedef {import('
|
|
16
|
+
* @typedef {import('./propTypes.js').SpacingValue} SpacingValue
|
|
17
|
+
* @typedef {import('./propTypes.js').SpacingIndex} SpacingIndex
|
|
18
|
+
* @typedef {import('./propTypes.js').SpacingObject} SpacingObject
|
|
19
|
+
* @typedef {import('./propTypes.js').SpacingOptions} SpacingOptions
|
|
10
20
|
*/
|
|
21
|
+
const resolveSpacingOptions = space => {
|
|
22
|
+
if (!(space !== null && space !== void 0 && space.options)) return {};
|
|
23
|
+
const {
|
|
24
|
+
size,
|
|
25
|
+
variant,
|
|
26
|
+
subtract = 0
|
|
27
|
+
} = space.options;
|
|
28
|
+
const overridden = typeof size === 'number'; // Might need an option that adapts the size value by current user's system font scale, so that
|
|
29
|
+
// meaningful spacing between items doesn't disappear on the highest a11y font scale settings.
|
|
30
|
+
// https://github.com/telus/universal-design-system/issues/583
|
|
11
31
|
|
|
32
|
+
return {
|
|
33
|
+
tokens: {
|
|
34
|
+
size
|
|
35
|
+
},
|
|
36
|
+
variant,
|
|
37
|
+
overridden,
|
|
38
|
+
subtract
|
|
39
|
+
};
|
|
40
|
+
};
|
|
12
41
|
/**
|
|
13
42
|
* Pass a {@link SpacingValue}, which is one of:
|
|
14
43
|
*
|
|
@@ -79,24 +108,28 @@ import { resolveSpacingValue, resolveSpacingOptions } from './utils';
|
|
|
79
108
|
* @returns {number}
|
|
80
109
|
*/
|
|
81
110
|
|
|
111
|
+
|
|
82
112
|
const useSpacingScale = spaceValue => {
|
|
113
|
+
var _spaceValue$space;
|
|
114
|
+
|
|
83
115
|
// In future, may need to consider window height as well as width, particularly for native apps,
|
|
84
116
|
// e.g. to ensure designs don't look lost on large, tall, not-so-wide portrait screens.
|
|
85
|
-
const viewport = useViewport();
|
|
117
|
+
const viewport = (0, _ViewportProvider.useViewport)();
|
|
86
118
|
const {
|
|
87
119
|
tokens,
|
|
88
120
|
variant,
|
|
89
121
|
overridden,
|
|
90
122
|
subtract = 0
|
|
91
123
|
} = resolveSpacingOptions(spaceValue);
|
|
92
|
-
const space = overridden ? null :
|
|
124
|
+
const space = !overridden && ((_spaceValue$space = spaceValue === null || spaceValue === void 0 ? void 0 : spaceValue.space) !== null && _spaceValue$space !== void 0 ? _spaceValue$space : (0, _useResponsiveProp.resolveResponsiveProp)(spaceValue, viewport, 0));
|
|
93
125
|
const {
|
|
94
126
|
size
|
|
95
|
-
} = useThemeTokens('spacingScale', tokens, variant, {
|
|
96
|
-
space,
|
|
127
|
+
} = (0, _ThemeProvider.useThemeTokens)('spacingScale', tokens, variant, {
|
|
128
|
+
space: typeof space === 'number' ? space : 0,
|
|
97
129
|
viewport
|
|
98
130
|
});
|
|
99
131
|
return Math.max(size - subtract, 0);
|
|
100
132
|
};
|
|
101
133
|
|
|
102
|
-
|
|
134
|
+
var _default = useSpacingScale;
|
|
135
|
+
exports.default = _default;
|
package/lib/utils/useUniqueId.js
CHANGED
|
@@ -1,12 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = require("react");
|
|
9
|
+
|
|
2
10
|
let id = 0;
|
|
3
11
|
|
|
4
12
|
function useUniqueId(prefix = '') {
|
|
5
|
-
const [uniqueId] = useState(() => {
|
|
13
|
+
const [uniqueId] = (0, _react.useState)(() => {
|
|
6
14
|
id += 1;
|
|
7
|
-
return
|
|
15
|
+
return "".concat(prefix, "-").concat(id);
|
|
8
16
|
});
|
|
9
17
|
return uniqueId;
|
|
10
18
|
}
|
|
11
19
|
|
|
12
|
-
|
|
20
|
+
var _default = useUniqueId;
|
|
21
|
+
exports.default = _default;
|
package/package.json
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@telus-uds/components-base",
|
|
3
|
-
"version": "0.0.2-prerelease.
|
|
3
|
+
"version": "0.0.2-prerelease.9",
|
|
4
4
|
"description": "Base components",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"base"
|
|
7
7
|
],
|
|
8
8
|
"author": "TELUS Digital",
|
|
9
9
|
"homepage": "https://github.com/telus/universal-design-system#readme",
|
|
10
|
-
"license": "
|
|
10
|
+
"license": "UNLICENSED",
|
|
11
11
|
"main": "lib/index.js",
|
|
12
|
-
"
|
|
13
|
-
"react-native": "lib/index.js",
|
|
12
|
+
"react-native": "src/index.js",
|
|
14
13
|
"directories": {
|
|
15
14
|
"lib": "lib",
|
|
16
15
|
"test": "__tests__"
|
|
@@ -35,9 +34,10 @@
|
|
|
35
34
|
"skip": true
|
|
36
35
|
},
|
|
37
36
|
"peerDependencies": {
|
|
38
|
-
"react": "
|
|
37
|
+
"react": "^17.0.2",
|
|
38
|
+
"react-dom": "*",
|
|
39
39
|
"react-native": "*",
|
|
40
|
-
"react-native-web": "
|
|
40
|
+
"react-native-web": "^0.17.0"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@testing-library/jest-native": "^4.0.1",
|
|
@@ -46,9 +46,12 @@
|
|
|
46
46
|
"react-test-renderer": "^16.3.2"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"
|
|
50
|
-
"@telus-uds/
|
|
49
|
+
"airbnb-prop-types": "^2.16.0",
|
|
50
|
+
"@telus-uds/system-constants": "^0.0.2-prerelease.2",
|
|
51
|
+
"@telus-uds/system-themes": "^0.0.2-prerelease.2",
|
|
52
|
+
"lodash.debounce": "^4.0.8",
|
|
51
53
|
"lodash.merge": "^4.6.2",
|
|
52
|
-
"prop-types": "^15.7.2"
|
|
54
|
+
"prop-types": "^15.7.2",
|
|
55
|
+
"react-native-picker-select": "^8.0.4"
|
|
53
56
|
}
|
|
54
57
|
}
|
package/release-context.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
|
-
"previousReleaseTag": "@telus-uds/components-base/v0.0.2-prerelease.
|
|
3
|
-
"changelog": "### [0.0.2-prerelease.
|
|
4
|
-
"releaseTag": "@telus-uds/components-base/v0.0.2-prerelease.
|
|
5
|
-
"newVersion": "0.0.2-prerelease.
|
|
2
|
+
"previousReleaseTag": "@telus-uds/components-base/v0.0.2-prerelease.8",
|
|
3
|
+
"changelog": "### [0.0.2-prerelease.9](https://github.com/telus/universal-design-system/compare/@telus-uds/components-base/v0.0.2-prerelease.8...@telus-uds/components-base/v0.0.2-prerelease.9) (2021-12-29)\n\n\n### Features\n\n* **base:** implement IconButton ([#958](https://github.com/telus/universal-design-system/issues/958)) ([c3ff7dd](https://github.com/telus/universal-design-system/commit/c3ff7dd9fb76123d3ff8409e507c89ad91b7fef2))\n",
|
|
4
|
+
"releaseTag": "@telus-uds/components-base/v0.0.2-prerelease.9",
|
|
5
|
+
"newVersion": "0.0.2-prerelease.9",
|
|
6
6
|
"packageName": "@telus-uds/components-base"
|
|
7
7
|
}
|
|
File without changes
|
package/src/Box/Box.jsx
CHANGED
|
@@ -2,7 +2,14 @@ import React from 'react'
|
|
|
2
2
|
import PropTypes from 'prop-types'
|
|
3
3
|
import { View, ScrollView } from 'react-native'
|
|
4
4
|
import { useThemeTokens } from '../ThemeProvider'
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
a11yProps,
|
|
7
|
+
spacingProps,
|
|
8
|
+
variantProp,
|
|
9
|
+
getTokensPropType,
|
|
10
|
+
useSpacingScale,
|
|
11
|
+
viewProps
|
|
12
|
+
} from '../utils'
|
|
6
13
|
/**
|
|
7
14
|
* @typedef {import('../utils/propTypes.js').SpacingValue} SpacingValue
|
|
8
15
|
* @typedef {import('../utils/propTypes.js').SpacingIndex} SpacingIndex
|
|
@@ -102,7 +109,7 @@ const Box = ({
|
|
|
102
109
|
testID,
|
|
103
110
|
...rest
|
|
104
111
|
}) => {
|
|
105
|
-
const
|
|
112
|
+
const props = { ...a11yProps.select(rest), ...viewProps.select(rest) }
|
|
106
113
|
|
|
107
114
|
const themeTokens = useThemeTokens('Box', tokens, variant)
|
|
108
115
|
const styles = {
|
|
@@ -117,13 +124,13 @@ const Box = ({
|
|
|
117
124
|
const scrollProps = typeof scroll === 'object' ? scroll : {}
|
|
118
125
|
scrollProps.contentContainerStyle = [styles, scrollProps.contentContainerStyle]
|
|
119
126
|
return (
|
|
120
|
-
<ScrollView {...scrollProps} {...
|
|
127
|
+
<ScrollView {...scrollProps} {...props} testID={testID}>
|
|
121
128
|
{children}
|
|
122
129
|
</ScrollView>
|
|
123
130
|
)
|
|
124
131
|
}
|
|
125
132
|
return (
|
|
126
|
-
<View {...
|
|
133
|
+
<View {...props} style={styles} testID={testID}>
|
|
127
134
|
{children}
|
|
128
135
|
</View>
|
|
129
136
|
)
|
package/src/Button/Button.jsx
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
|
+
|
|
2
3
|
import ButtonBase from './ButtonBase'
|
|
3
|
-
import buttonPropTypes from './propTypes'
|
|
4
|
+
import buttonPropTypes, { textAndA11yText } from './propTypes'
|
|
5
|
+
import { useThemeTokensCallback } from '../ThemeProvider'
|
|
4
6
|
import { a11yProps } from '../utils/propTypes'
|
|
5
7
|
|
|
6
|
-
const Button = ({ accessibilityRole = 'button', ...props }) =>
|
|
7
|
-
|
|
8
|
-
|
|
8
|
+
const Button = ({ accessibilityRole = 'button', tokens, variant, ...props }) => {
|
|
9
|
+
const getTokens = useThemeTokensCallback('Button', tokens, variant)
|
|
10
|
+
return <ButtonBase {...props} tokens={getTokens} accessibilityRole={accessibilityRole} />
|
|
11
|
+
}
|
|
9
12
|
|
|
10
13
|
Button.propTypes = {
|
|
11
14
|
...a11yProps.types,
|
|
12
|
-
...buttonPropTypes
|
|
15
|
+
...buttonPropTypes,
|
|
16
|
+
children: textAndA11yText
|
|
13
17
|
}
|
|
14
18
|
|
|
15
19
|
export default Button
|
|
@@ -1,18 +1,16 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
|
-
import { Pressable,
|
|
2
|
+
import { Pressable, View, StyleSheet, Platform } from 'react-native'
|
|
3
3
|
|
|
4
|
-
import {
|
|
5
|
-
import { applyTextStyles, applyShadowToken } from '../ThemeProvider/utils'
|
|
4
|
+
import { applyTextStyles, applyShadowToken, applyOuterBorder } from '../ThemeProvider/utils'
|
|
6
5
|
import buttonPropTypes from './propTypes'
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
6
|
+
import {
|
|
7
|
+
a11yProps,
|
|
8
|
+
getCursorStyle,
|
|
9
|
+
linkProps,
|
|
10
|
+
resolvePressableState,
|
|
11
|
+
resolvePressableTokens,
|
|
12
|
+
wrapStringsInText
|
|
13
|
+
} from '../utils'
|
|
16
14
|
|
|
17
15
|
const getOuterBorderOffset = ({ outerBorderGap = 0, outerBorderWidth = 0 }) =>
|
|
18
16
|
outerBorderGap + outerBorderWidth
|
|
@@ -22,26 +20,26 @@ const selectOuterContainerStyles = ({
|
|
|
22
20
|
opacity,
|
|
23
21
|
outerBorderColor,
|
|
24
22
|
outerBorderWidth,
|
|
25
|
-
outerBorderGap
|
|
26
|
-
|
|
23
|
+
outerBorderGap,
|
|
24
|
+
borderRadius,
|
|
27
25
|
outerBackgroundColor
|
|
28
26
|
}) => ({
|
|
29
27
|
alignSelf,
|
|
30
|
-
padding: outerBorderGap,
|
|
31
|
-
borderWidth: outerBorderWidth,
|
|
32
|
-
borderColor: outerBorderColor,
|
|
33
|
-
borderRadius: outerBorderRadius + outerBorderGap,
|
|
34
28
|
backgroundColor: outerBackgroundColor,
|
|
35
|
-
opacity
|
|
29
|
+
opacity,
|
|
30
|
+
...applyOuterBorder({
|
|
31
|
+
outerBorderGap,
|
|
32
|
+
outerBorderWidth,
|
|
33
|
+
outerBorderColor,
|
|
34
|
+
borderRadius
|
|
35
|
+
})
|
|
36
36
|
})
|
|
37
37
|
|
|
38
38
|
const selectOuterWidthStyles = ({ outerBorderGap, outerBorderWidth, width }) => {
|
|
39
39
|
// The inner container's bounding box is the bounding box of the button overall
|
|
40
40
|
// so this many device pixels will sit outside of the overall bounding box
|
|
41
41
|
const outerBorderOffset = getOuterBorderOffset({ outerBorderGap, outerBorderWidth })
|
|
42
|
-
const widthStyles = {
|
|
43
|
-
margin: 0 - outerBorderOffset
|
|
44
|
-
}
|
|
42
|
+
const widthStyles = {}
|
|
45
43
|
|
|
46
44
|
if (!width) {
|
|
47
45
|
return {
|
|
@@ -83,7 +81,8 @@ const selectInnerContainerStyles = ({
|
|
|
83
81
|
paddingTop,
|
|
84
82
|
paddingBottom,
|
|
85
83
|
shadow,
|
|
86
|
-
borderWidth
|
|
84
|
+
borderWidth,
|
|
85
|
+
minWidth
|
|
87
86
|
}) => {
|
|
88
87
|
// Subtract border width from padding so overall button width/height doesn't
|
|
89
88
|
// jump around if the border width changes (avoiding NaN and negative padding)
|
|
@@ -98,6 +97,7 @@ const selectInnerContainerStyles = ({
|
|
|
98
97
|
paddingTop: offsetBorder(paddingTop),
|
|
99
98
|
paddingBottom: offsetBorder(paddingBottom),
|
|
100
99
|
backgroundColor,
|
|
100
|
+
minWidth,
|
|
101
101
|
...applyShadowToken(shadow)
|
|
102
102
|
}
|
|
103
103
|
}
|
|
@@ -118,76 +118,63 @@ const selectTextStyles = ({ fontSize, color, lineHeight, fontName, fontWeight, t
|
|
|
118
118
|
textAlign
|
|
119
119
|
})
|
|
120
120
|
|
|
121
|
-
const selectWebOnlyStyles = (inactive, themeTokens, { accessibilityRole }) =>
|
|
122
|
-
Platform.
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
: {}
|
|
121
|
+
const selectWebOnlyStyles = (inactive, themeTokens, { accessibilityRole }) => {
|
|
122
|
+
return Platform.select({
|
|
123
|
+
web: {
|
|
124
|
+
// if it would overflow the container, wraps instead
|
|
125
|
+
maxWidth: `calc(100% + ${getOuterBorderOffset(themeTokens) * 2}px)`,
|
|
126
|
+
outline: 'none', // removes the default browser :focus outline
|
|
127
|
+
...getCursorStyle(inactive, accessibilityRole)
|
|
128
|
+
},
|
|
129
|
+
default: {}
|
|
130
|
+
})
|
|
131
|
+
}
|
|
130
132
|
|
|
131
133
|
const ButtonBase = ({
|
|
132
134
|
href,
|
|
133
135
|
hrefAttrs,
|
|
134
136
|
children,
|
|
135
|
-
variant,
|
|
136
137
|
onPress,
|
|
137
|
-
tokens,
|
|
138
|
+
tokens = {},
|
|
138
139
|
disabled = false, // alias for inactive
|
|
139
140
|
inactive = disabled,
|
|
140
141
|
selected = false,
|
|
141
142
|
...rest
|
|
142
143
|
}) => {
|
|
143
|
-
const
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
focus: focused,
|
|
147
|
-
hover: hovered,
|
|
148
|
-
inactive,
|
|
149
|
-
selected
|
|
150
|
-
})
|
|
151
|
-
const getTokensByPressableState = (pressableState) => getTokens(getButtonState(pressableState))
|
|
144
|
+
const extraButtonState = { inactive, selected }
|
|
145
|
+
const resolveButtonTokens = (pressableState) =>
|
|
146
|
+
resolvePressableTokens(tokens, pressableState, extraButtonState)
|
|
152
147
|
|
|
153
148
|
const a11y = a11yProps.select(rest)
|
|
154
149
|
|
|
155
150
|
const getPressableStyle = (pressableState) => {
|
|
156
|
-
const themeTokens =
|
|
151
|
+
const themeTokens = resolveButtonTokens(pressableState)
|
|
157
152
|
return [
|
|
158
|
-
staticStyles.
|
|
153
|
+
staticStyles.row,
|
|
159
154
|
selectWebOnlyStyles(inactive, themeTokens, a11y),
|
|
160
155
|
selectOuterContainerStyles(themeTokens),
|
|
161
156
|
selectOuterWidthStyles(themeTokens)
|
|
162
157
|
]
|
|
163
158
|
}
|
|
164
159
|
|
|
165
|
-
const handlePress = linkProps.handleHref({ href, onPress })
|
|
166
|
-
|
|
167
160
|
return (
|
|
168
161
|
<Pressable
|
|
169
|
-
|
|
162
|
+
href={href}
|
|
163
|
+
onPress={linkProps.handleHref({ href, onPress })}
|
|
170
164
|
style={getPressableStyle}
|
|
171
165
|
disabled={inactive}
|
|
172
|
-
|
|
173
|
-
{...hrefAttrsProp.spread(hrefAttrs)}
|
|
166
|
+
hrefAttrs={hrefAttrs}
|
|
174
167
|
{...a11y}
|
|
175
168
|
>
|
|
176
169
|
{(pressableState) => {
|
|
177
|
-
const themeTokens =
|
|
170
|
+
const themeTokens = resolveButtonTokens(pressableState)
|
|
178
171
|
const containerStyles = selectInnerContainerStyles(themeTokens)
|
|
179
172
|
const borderStyles = selectBorderStyles(themeTokens)
|
|
180
|
-
const textStyles =
|
|
181
|
-
...selectTextStyles(themeTokens),
|
|
182
|
-
...Platform.select({
|
|
183
|
-
// TODO: https://github.com/telus/universal-design-system/issues/487
|
|
184
|
-
web: { transition: 'color 200ms' }
|
|
185
|
-
})
|
|
186
|
-
}
|
|
173
|
+
const textStyles = [selectTextStyles(themeTokens), staticStyles.text]
|
|
187
174
|
|
|
188
175
|
// If the container has a width set, fill it instead of sizing from content.
|
|
189
176
|
// If in future we support text alignments other than center, add here.
|
|
190
|
-
const stretchStyles =
|
|
177
|
+
const stretchStyles = themeTokens.width ? staticStyles.stretch : staticStyles.align
|
|
191
178
|
|
|
192
179
|
return (
|
|
193
180
|
<View
|
|
@@ -195,6 +182,7 @@ const ButtonBase = ({
|
|
|
195
182
|
containerStyles,
|
|
196
183
|
borderStyles,
|
|
197
184
|
stretchStyles,
|
|
185
|
+
staticStyles.row,
|
|
198
186
|
Platform.select({
|
|
199
187
|
web: {
|
|
200
188
|
maxWidth: '100%', // ensure overflowing content wraps
|
|
@@ -204,13 +192,14 @@ const ButtonBase = ({
|
|
|
204
192
|
})
|
|
205
193
|
]}
|
|
206
194
|
>
|
|
207
|
-
{
|
|
208
|
-
children
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
195
|
+
{wrapStringsInText(
|
|
196
|
+
typeof children === 'function'
|
|
197
|
+
? children({
|
|
198
|
+
...resolvePressableState(pressableState, extraButtonState),
|
|
199
|
+
textStyles
|
|
200
|
+
})
|
|
201
|
+
: children,
|
|
202
|
+
{ style: textStyles }
|
|
214
203
|
)}
|
|
215
204
|
</View>
|
|
216
205
|
)
|
|
@@ -226,10 +215,21 @@ ButtonBase.propTypes = {
|
|
|
226
215
|
}
|
|
227
216
|
|
|
228
217
|
const staticStyles = StyleSheet.create({
|
|
229
|
-
|
|
230
|
-
|
|
218
|
+
row: {
|
|
219
|
+
// Apply all button alignment horizontally; no vertical stacking within a button
|
|
220
|
+
flexDirection: 'row'
|
|
221
|
+
},
|
|
222
|
+
text: {
|
|
223
|
+
flexGrow: 1, // On native but not web, flexShrink here wraps text prematurely
|
|
224
|
+
...Platform.select({
|
|
225
|
+
// TODO: https://github.com/telus/universal-design-system/issues/487
|
|
226
|
+
web: { transition: 'color 200ms' }
|
|
227
|
+
})
|
|
228
|
+
},
|
|
229
|
+
align: {
|
|
230
|
+
alignItems: 'center'
|
|
231
231
|
},
|
|
232
|
-
|
|
232
|
+
stretch: {
|
|
233
233
|
flex: 1,
|
|
234
234
|
alignItems: 'center',
|
|
235
235
|
justifyContent: 'center'
|
|
@@ -5,7 +5,7 @@ import { Platform } from 'react-native'
|
|
|
5
5
|
import ButtonBase from './ButtonBase'
|
|
6
6
|
import { StackWrap } from '../StackView'
|
|
7
7
|
import { useViewport } from '../ViewportProvider'
|
|
8
|
-
import { useThemeTokens } from '../ThemeProvider'
|
|
8
|
+
import { useThemeTokens, useThemeTokensCallback } from '../ThemeProvider'
|
|
9
9
|
import {
|
|
10
10
|
a11yProps,
|
|
11
11
|
pressProps,
|
|
@@ -14,10 +14,10 @@ import {
|
|
|
14
14
|
selectTokens
|
|
15
15
|
} from '../utils/propTypes'
|
|
16
16
|
import { useMultipleInputValues } from '../utils/input'
|
|
17
|
+
import { getPressHandlersWithArgs } from '../utils/pressability'
|
|
17
18
|
|
|
18
19
|
const ButtonGroup = ({
|
|
19
20
|
variant,
|
|
20
|
-
buttonVariant = {},
|
|
21
21
|
tokens,
|
|
22
22
|
items = [],
|
|
23
23
|
values,
|
|
@@ -27,7 +27,7 @@ const ButtonGroup = ({
|
|
|
27
27
|
readOnly = false,
|
|
28
28
|
inactive = false,
|
|
29
29
|
accessibilityRole = maxValues === 1
|
|
30
|
-
? '
|
|
30
|
+
? 'radiogroup' // radiogroup is cross-platform; only web aria has generic groups
|
|
31
31
|
: Platform.select({ web: 'group', default: 'none' }),
|
|
32
32
|
...rest
|
|
33
33
|
}) => {
|
|
@@ -36,6 +36,8 @@ const ButtonGroup = ({
|
|
|
36
36
|
const stackTokens = selectTokens('StackView', themeTokens)
|
|
37
37
|
const { direction, space } = themeTokens
|
|
38
38
|
|
|
39
|
+
const getButtonTokens = useThemeTokensCallback('ButtonGroupItem', tokens, variant)
|
|
40
|
+
|
|
39
41
|
const { currentValues, toggleOneValue } = useMultipleInputValues({
|
|
40
42
|
initialValues,
|
|
41
43
|
values,
|
|
@@ -48,22 +50,16 @@ const ButtonGroup = ({
|
|
|
48
50
|
accessibilityRole,
|
|
49
51
|
...rest
|
|
50
52
|
})
|
|
51
|
-
const itemA11yRole = a11y.accessibilityRole === '
|
|
53
|
+
const itemA11yRole = a11y.accessibilityRole === 'radiogroup' ? 'radio' : 'checkbox'
|
|
52
54
|
|
|
53
55
|
return (
|
|
54
56
|
<StackWrap {...a11y} space={space} direction={direction} tokens={stackTokens}>
|
|
55
57
|
{items.map(({ label, id = label, accessibilityLabel }, index) => {
|
|
56
58
|
const isSelected = currentValues.includes(id)
|
|
57
59
|
|
|
58
|
-
//
|
|
59
|
-
const pressHandlers =
|
|
60
|
-
|
|
61
|
-
[key]: (args) => {
|
|
62
|
-
// Pass each handler data on this button and current selection
|
|
63
|
-
handler({ id, label, currentValues }, ...args)
|
|
64
|
-
}
|
|
65
|
-
}))
|
|
66
|
-
)
|
|
60
|
+
// Pass an object of relevant component state as first argument for any passed-in press handlers
|
|
61
|
+
const pressHandlers = getPressHandlersWithArgs(rest, [{ id, label, currentValues }])
|
|
62
|
+
|
|
67
63
|
const handlePress = () => {
|
|
68
64
|
if (pressHandlers.onPress) pressHandlers.onPress()
|
|
69
65
|
toggleOneValue(id)
|
|
@@ -73,15 +69,7 @@ const ButtonGroup = ({
|
|
|
73
69
|
accessibilityState: { checked: isSelected },
|
|
74
70
|
accessibilityRole: itemA11yRole,
|
|
75
71
|
accessibilityLabel,
|
|
76
|
-
...
|
|
77
|
-
web: {
|
|
78
|
-
// accessibilityPosInSet etc exists in React Native Web main branch
|
|
79
|
-
// but not in a release compatible with Expo etc; just use `aria-*`
|
|
80
|
-
'aria-setsize': items.length,
|
|
81
|
-
'aria-posinset': index + 1
|
|
82
|
-
},
|
|
83
|
-
default: {}
|
|
84
|
-
})
|
|
72
|
+
...a11yProps.getPositionInSet(items.length, index)
|
|
85
73
|
}
|
|
86
74
|
|
|
87
75
|
// Ensure button is direct child of group as MacOS voiceover only applies "X of Y" to
|
|
@@ -91,7 +79,7 @@ const ButtonGroup = ({
|
|
|
91
79
|
key={id}
|
|
92
80
|
{...pressHandlers}
|
|
93
81
|
onPress={handlePress}
|
|
94
|
-
|
|
82
|
+
tokens={getButtonTokens}
|
|
95
83
|
selected={isSelected}
|
|
96
84
|
inactive={inactive}
|
|
97
85
|
{...itemA11y}
|
|
@@ -109,7 +97,6 @@ ButtonGroup.propTypes = {
|
|
|
109
97
|
...pressProps.propTypes,
|
|
110
98
|
tokens: getTokensPropType('ButtonGroup'),
|
|
111
99
|
variant: variantProp.propType,
|
|
112
|
-
buttonVariant: variantProp.propType,
|
|
113
100
|
/**
|
|
114
101
|
* The maximum number of items a user may select at once. Defaults to 1 and behaves
|
|
115
102
|
* like radio buttons. To have no limit and allow any number of selections, pass `null`.
|