@telus-uds/components-base 1.2.0 → 1.4.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/.turbo/turbo-build.log +8 -0
- package/CHANGELOG.json +61 -0
- package/CHANGELOG.md +45 -2
- package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +35 -0
- package/__tests__/ActivityIndicator/__snapshots__/ActivityIndicator.test.jsx.snap +287 -0
- package/__tests__/FlexGrid/Col.test.jsx +6 -10
- package/__tests__/utils/props.test.js +36 -0
- package/__tests__/utils/semantics.test.jsx +1 -10
- package/babel.config.js +27 -5
- package/component-docs.json +170 -494
- package/generate-component-docs.js +3 -0
- package/lib/A11yText/index.js +6 -5
- package/lib/ActivityIndicator/Spinner.js +46 -37
- package/lib/ActivityIndicator/Spinner.native.js +26 -15
- package/lib/ActivityIndicator/index.js +3 -3
- package/lib/Box/Box.js +8 -8
- package/lib/Button/Button.js +2 -2
- package/lib/Button/ButtonBase.js +7 -8
- package/lib/Button/ButtonGroup.js +10 -12
- package/lib/Button/ButtonLink.js +4 -4
- package/lib/Button/propTypes.js +4 -2
- package/lib/Card/Card.js +6 -5
- package/lib/Card/CardBase.js +6 -9
- package/lib/Card/PressableCardBase.js +6 -11
- package/lib/Checkbox/Checkbox.js +4 -6
- package/lib/Divider/Divider.js +14 -13
- package/lib/ExpandCollapse/Control.js +7 -7
- package/lib/ExpandCollapse/ExpandCollapse.js +6 -2
- package/lib/ExpandCollapse/Panel.js +6 -7
- package/lib/Feedback/Feedback.js +6 -5
- package/lib/Fieldset/Fieldset.js +1 -3
- package/lib/FlexGrid/FlexGrid.js +4 -4
- package/lib/FlexGrid/helpers/index.js +1 -4
- package/lib/HorizontalScroll/HorizontalScroll.js +5 -6
- package/lib/IconButton/IconButton.js +6 -6
- package/lib/InputLabel/InputLabel.js +7 -2
- package/lib/InputSupports/InputSupports.js +2 -2
- package/lib/Link/LinkBase.js +12 -13
- package/lib/List/List.js +4 -6
- package/lib/List/ListItem.js +6 -2
- package/lib/Modal/Modal.js +6 -2
- package/lib/Notification/Notification.js +12 -8
- package/lib/Pagination/Pagination.js +8 -3
- package/lib/Progress/Progress.js +5 -4
- package/lib/Progress/ProgressBar.js +8 -7
- package/lib/Radio/Radio.js +4 -6
- package/lib/Radio/RadioButton.js +6 -3
- package/lib/Radio/RadioGroup.js +7 -2
- package/lib/RadioCard/RadioCard.js +4 -4
- package/lib/RadioCard/RadioCardGroup.js +9 -6
- package/lib/Search/Search.js +7 -2
- package/lib/Select/Select.js +10 -9
- package/lib/SideNav/Item.js +7 -7
- package/lib/SideNav/SideNav.js +7 -3
- package/lib/Skeleton/Skeleton.js +6 -2
- package/lib/Spacer/Spacer.js +9 -20
- package/lib/StackView/StackView.js +7 -7
- package/lib/StackView/StackWrapBox.js +6 -7
- package/lib/StackView/StackWrapGap.js +6 -5
- package/lib/StackView/getStackedContent.js +1 -1
- package/lib/StepTracker/Step.js +7 -3
- package/lib/StepTracker/StepTracker.js +7 -7
- package/lib/Tabs/Tabs.js +6 -2
- package/lib/Tabs/TabsItem.js +6 -5
- package/lib/Tags/Tags.js +11 -12
- package/lib/TextInput/TextArea.js +13 -14
- package/lib/TextInput/TextInput.js +13 -14
- package/lib/TextInput/TextInputBase.js +5 -3
- package/lib/ThemeProvider/useThemeTokens.js +3 -3
- package/lib/ThemeProvider/utils/theme-tokens.js +3 -3
- package/lib/ToggleSwitch/ToggleSwitch.js +10 -9
- package/lib/ToggleSwitch/ToggleSwitchGroup.js +10 -12
- package/lib/Tooltip/Tooltip.js +7 -2
- package/lib/TooltipButton/TooltipButton.js +7 -2
- package/lib/Typography/Typography.js +8 -6
- package/lib/index.js +7 -0
- package/lib/utils/a11y/semantics.js +4 -3
- package/lib/utils/children.js +5 -1
- package/lib/utils/index.js +18 -4
- package/lib/utils/pressability.js +2 -2
- package/lib/utils/props/a11yProps.js +153 -0
- package/lib/utils/props/clickProps.js +36 -0
- package/lib/utils/props/componentPropType.js +70 -0
- package/lib/utils/props/copyPropTypes.js +14 -0
- package/lib/utils/props/getPropSelector.js +13 -0
- package/lib/utils/props/hrefAttrsProp.js +41 -0
- package/lib/utils/props/index.js +158 -0
- package/lib/{InputSupports/propTypes.js → utils/props/inputSupportsProps.js} +2 -3
- package/lib/utils/props/linkProps.js +64 -0
- package/lib/utils/props/paddingProp.js +20 -0
- package/lib/utils/props/pressProps.js +57 -0
- package/lib/utils/props/rectProp.js +20 -0
- package/lib/utils/props/responsiveProps.js +40 -0
- package/lib/utils/props/selectSystemProps.js +31 -0
- package/lib/utils/props/spacingProps.js +71 -0
- package/lib/utils/props/tokens.js +145 -0
- package/lib/utils/props/variantProp.js +28 -0
- package/lib/utils/props/viewProps.js +34 -0
- package/lib/utils/ssr.js +51 -0
- package/lib/utils/useResponsiveProp.js +1 -1
- package/lib/utils/useSpacingScale.js +4 -4
- package/lib-module/A11yInfoProvider/index.js +62 -0
- package/lib-module/A11yText/index.js +55 -0
- package/lib-module/ActivityIndicator/Spinner.js +76 -0
- package/lib-module/ActivityIndicator/Spinner.native.js +143 -0
- package/lib-module/ActivityIndicator/index.js +40 -0
- package/lib-module/ActivityIndicator/shared.js +12 -0
- package/lib-module/BaseProvider/index.js +26 -0
- package/lib-module/Box/Box.js +243 -0
- package/lib-module/Box/index.js +2 -0
- package/lib-module/Button/Button.js +25 -0
- package/lib-module/Button/ButtonBase.js +254 -0
- package/lib-module/Button/ButtonGroup.js +164 -0
- package/lib-module/Button/ButtonLink.js +39 -0
- package/lib-module/Button/index.js +4 -0
- package/lib-module/Button/propTypes.js +36 -0
- package/lib-module/Card/Card.js +83 -0
- package/lib-module/Card/CardBase.js +62 -0
- package/lib-module/Card/PressableCardBase.js +113 -0
- package/lib-module/Card/index.js +4 -0
- package/lib-module/Checkbox/Checkbox.js +321 -0
- package/lib-module/Checkbox/CheckboxGroup.js +218 -0
- package/lib-module/Checkbox/CheckboxInput.js +58 -0
- package/lib-module/Checkbox/CheckboxInput.native.js +6 -0
- package/lib-module/Checkbox/index.js +3 -0
- package/lib-module/Divider/Divider.js +123 -0
- package/lib-module/Divider/index.js +2 -0
- package/lib-module/ExpandCollapse/Accordion.js +15 -0
- package/lib-module/ExpandCollapse/Control.js +130 -0
- package/lib-module/ExpandCollapse/ExpandCollapse.js +94 -0
- package/lib-module/ExpandCollapse/Panel.js +158 -0
- package/lib-module/ExpandCollapse/index.js +7 -0
- package/lib-module/Feedback/Feedback.js +144 -0
- package/lib-module/Feedback/index.js +2 -0
- package/lib-module/Fieldset/Fieldset.js +145 -0
- package/lib-module/Fieldset/FieldsetContainer.js +29 -0
- package/lib-module/Fieldset/FieldsetContainer.native.js +20 -0
- package/lib-module/Fieldset/Legend.js +21 -0
- package/lib-module/Fieldset/Legend.native.js +28 -0
- package/lib-module/Fieldset/cssReset.js +14 -0
- package/lib-module/Fieldset/index.js +2 -0
- package/lib-module/FlexGrid/Col/Col.js +265 -0
- package/lib-module/FlexGrid/Col/index.js +2 -0
- package/lib-module/FlexGrid/FlexGrid.js +147 -0
- package/lib-module/FlexGrid/Row/Row.js +177 -0
- package/lib-module/FlexGrid/Row/index.js +2 -0
- package/lib-module/FlexGrid/helpers/index.js +18 -0
- package/lib-module/FlexGrid/index.js +2 -0
- package/lib-module/FlexGrid/providers/GutterContext.js +3 -0
- package/lib-module/HorizontalScroll/HorizontalScroll.js +171 -0
- package/lib-module/HorizontalScroll/HorizontalScrollButton.js +102 -0
- package/lib-module/HorizontalScroll/ScrollViewEnd.js +47 -0
- package/lib-module/HorizontalScroll/ScrollViewEnd.native.js +24 -0
- package/lib-module/HorizontalScroll/dictionary.js +11 -0
- package/lib-module/HorizontalScroll/index.js +11 -0
- package/lib-module/HorizontalScroll/itemPositions.js +106 -0
- package/lib-module/Icon/Icon.js +61 -0
- package/lib-module/Icon/IconText.js +81 -0
- package/lib-module/Icon/index.js +4 -0
- package/lib-module/IconButton/IconButton.js +115 -0
- package/lib-module/IconButton/index.js +2 -0
- package/lib-module/InputLabel/InputLabel.js +131 -0
- package/lib-module/InputLabel/LabelContent.js +24 -0
- package/lib-module/InputLabel/LabelContent.native.js +16 -0
- package/lib-module/InputLabel/index.js +2 -0
- package/lib-module/InputSupports/InputSupports.js +88 -0
- package/lib-module/InputSupports/index.js +2 -0
- package/lib-module/InputSupports/useInputSupports.js +31 -0
- package/lib-module/Link/ChevronLink.js +51 -0
- package/lib-module/Link/InlinePressable.js +37 -0
- package/lib-module/Link/InlinePressable.native.js +85 -0
- package/lib-module/Link/Link.js +27 -0
- package/lib-module/Link/LinkBase.js +210 -0
- package/lib-module/Link/TextButton.js +43 -0
- package/lib-module/Link/index.js +5 -0
- package/lib-module/List/List.js +55 -0
- package/lib-module/List/ListItem.js +213 -0
- package/lib-module/List/index.js +5 -0
- package/lib-module/Modal/Modal.js +208 -0
- package/lib-module/Modal/dictionary.js +9 -0
- package/lib-module/Modal/index.js +2 -0
- package/lib-module/Notification/Notification.js +196 -0
- package/lib-module/Notification/dictionary.js +8 -0
- package/lib-module/Notification/index.js +2 -0
- package/lib-module/Pagination/PageButton.js +65 -0
- package/lib-module/Pagination/Pagination.js +140 -0
- package/lib-module/Pagination/SideButton.js +103 -0
- package/lib-module/Pagination/dictionary.js +18 -0
- package/lib-module/Pagination/index.js +2 -0
- package/lib-module/Pagination/usePagination.js +72 -0
- package/lib-module/Progress/Progress.js +85 -0
- package/lib-module/Progress/ProgressBar.js +134 -0
- package/lib-module/Progress/ProgressBarBackground.js +41 -0
- package/lib-module/Progress/index.js +4 -0
- package/lib-module/Radio/Radio.js +263 -0
- package/lib-module/Radio/RadioButton.js +128 -0
- package/lib-module/Radio/RadioGroup.js +225 -0
- package/lib-module/Radio/RadioInput.js +60 -0
- package/lib-module/Radio/RadioInput.native.js +6 -0
- package/lib-module/Radio/index.js +3 -0
- package/lib-module/RadioCard/RadioCard.js +218 -0
- package/lib-module/RadioCard/RadioCardGroup.js +232 -0
- package/lib-module/RadioCard/index.js +3 -0
- package/lib-module/Search/Search.js +233 -0
- package/lib-module/Search/dictionary.js +12 -0
- package/lib-module/Search/index.js +2 -0
- package/lib-module/Select/Group.js +20 -0
- package/lib-module/Select/Group.native.js +14 -0
- package/lib-module/Select/Item.js +17 -0
- package/lib-module/Select/Item.native.js +9 -0
- package/lib-module/Select/Picker.js +67 -0
- package/lib-module/Select/Picker.native.js +110 -0
- package/lib-module/Select/Select.js +317 -0
- package/lib-module/Select/index.js +6 -0
- package/lib-module/SideNav/Item.js +139 -0
- package/lib-module/SideNav/ItemContent.js +45 -0
- package/lib-module/SideNav/ItemsGroup.js +115 -0
- package/lib-module/SideNav/SideNav.js +133 -0
- package/lib-module/SideNav/index.js +1 -0
- package/lib-module/Skeleton/Skeleton.js +117 -0
- package/lib-module/Skeleton/index.js +2 -0
- package/lib-module/Skeleton/skeleton.constant.js +3 -0
- package/lib-module/Skeleton/skeletonWebAnimation.js +18 -0
- package/lib-module/Skeleton/useSkeletonNativeAnimation.js +24 -0
- package/lib-module/Spacer/Spacer.js +97 -0
- package/lib-module/Spacer/index.js +2 -0
- package/lib-module/StackView/StackView.js +124 -0
- package/lib-module/StackView/StackWrap.js +48 -0
- package/lib-module/StackView/StackWrap.native.js +3 -0
- package/lib-module/StackView/StackWrapBox.js +114 -0
- package/lib-module/StackView/StackWrapGap.js +58 -0
- package/lib-module/StackView/common.js +32 -0
- package/lib-module/StackView/getStackedContent.js +123 -0
- package/lib-module/StackView/index.js +5 -0
- package/lib-module/StepTracker/Step.js +229 -0
- package/lib-module/StepTracker/StepTracker.js +175 -0
- package/lib-module/StepTracker/dictionary.js +10 -0
- package/lib-module/StepTracker/index.js +2 -0
- package/lib-module/Tabs/Tabs.js +113 -0
- package/lib-module/Tabs/TabsItem.js +215 -0
- package/lib-module/Tabs/index.js +2 -0
- package/lib-module/Tags/Tags.js +238 -0
- package/lib-module/Tags/index.js +2 -0
- package/lib-module/TextInput/TextArea.js +88 -0
- package/lib-module/TextInput/TextInput.js +60 -0
- package/lib-module/TextInput/TextInputBase.js +233 -0
- package/lib-module/TextInput/index.js +3 -0
- package/lib-module/TextInput/propTypes.js +31 -0
- package/lib-module/ThemeProvider/ThemeProvider.js +35 -0
- package/lib-module/ThemeProvider/index.js +6 -0
- package/lib-module/ThemeProvider/useSetTheme.js +22 -0
- package/lib-module/ThemeProvider/useTheme.js +14 -0
- package/lib-module/ThemeProvider/useThemeTokens.js +105 -0
- package/lib-module/ThemeProvider/utils/index.js +2 -0
- package/lib-module/ThemeProvider/utils/styles.js +174 -0
- package/lib-module/ThemeProvider/utils/theme-tokens.js +151 -0
- package/lib-module/ToggleSwitch/ToggleSwitch.js +224 -0
- package/lib-module/ToggleSwitch/ToggleSwitchGroup.js +202 -0
- package/lib-module/ToggleSwitch/index.js +3 -0
- package/lib-module/Tooltip/Backdrop.js +52 -0
- package/lib-module/Tooltip/Backdrop.native.js +43 -0
- package/lib-module/Tooltip/Tooltip.js +332 -0
- package/lib-module/Tooltip/dictionary.js +8 -0
- package/lib-module/Tooltip/getTooltipPosition.js +164 -0
- package/lib-module/Tooltip/index.js +2 -0
- package/lib-module/TooltipButton/TooltipButton.js +71 -0
- package/lib-module/TooltipButton/index.js +2 -0
- package/lib-module/Typography/Typography.js +118 -0
- package/lib-module/Typography/index.js +2 -0
- package/lib-module/ViewportProvider/ViewportProvider.js +28 -0
- package/lib-module/ViewportProvider/index.js +3 -0
- package/lib-module/ViewportProvider/useViewport.js +3 -0
- package/lib-module/ViewportProvider/useViewportListener.js +43 -0
- package/lib-module/index.js +48 -0
- package/lib-module/utils/a11y/index.js +2 -0
- package/lib-module/utils/a11y/semantics.js +154 -0
- package/lib-module/utils/a11y/textSize.js +34 -0
- package/lib-module/utils/animation/index.js +2 -0
- package/lib-module/utils/animation/useVerticalExpandAnimation.js +49 -0
- package/lib-module/utils/children.js +118 -0
- package/lib-module/utils/index.js +15 -0
- package/lib-module/utils/info/index.js +7 -0
- package/lib-module/utils/info/platform/index.js +11 -0
- package/lib-module/utils/info/platform/platform.android.js +1 -0
- package/lib-module/utils/info/platform/platform.ios.js +1 -0
- package/lib-module/utils/info/platform/platform.js +1 -0
- package/lib-module/utils/info/platform/platform.native.js +4 -0
- package/lib-module/utils/info/versions.js +5 -0
- package/lib-module/utils/input.js +180 -0
- package/lib-module/utils/pressability.js +97 -0
- package/lib-module/utils/props/a11yProps.js +140 -0
- package/lib-module/utils/props/clickProps.js +25 -0
- package/lib-module/utils/props/componentPropType.js +63 -0
- package/lib-module/utils/props/copyPropTypes.js +2 -0
- package/lib-module/utils/props/getPropSelector.js +6 -0
- package/lib-module/utils/props/hrefAttrsProp.js +30 -0
- package/lib-module/utils/props/index.js +16 -0
- package/lib-module/utils/props/inputSupportsProps.js +54 -0
- package/lib-module/utils/props/linkProps.js +47 -0
- package/lib-module/utils/props/paddingProp.js +9 -0
- package/lib-module/utils/props/pressProps.js +42 -0
- package/lib-module/utils/props/rectProp.js +9 -0
- package/lib-module/utils/props/responsiveProps.js +30 -0
- package/lib-module/utils/props/selectSystemProps.js +24 -0
- package/lib-module/utils/props/spacingProps.js +56 -0
- package/lib-module/utils/props/tokens.js +120 -0
- package/lib-module/utils/props/variantProp.js +18 -0
- package/lib-module/utils/props/viewProps.js +22 -0
- package/lib-module/utils/ssr.js +35 -0
- package/lib-module/utils/useCopy.js +42 -0
- package/lib-module/utils/useHash.js +44 -0
- package/lib-module/utils/useHash.native.js +7 -0
- package/lib-module/utils/useResponsiveProp.js +47 -0
- package/lib-module/utils/useSpacingScale.js +123 -0
- package/lib-module/utils/useUniqueId.js +12 -0
- package/lib-module/utils/withLinkRouter.js +82 -0
- package/package.json +9 -5
- package/src/A11yText/index.jsx +7 -3
- package/src/ActivityIndicator/Spinner.jsx +56 -44
- package/src/ActivityIndicator/Spinner.native.jsx +20 -12
- package/src/ActivityIndicator/index.jsx +1 -1
- package/src/Box/Box.jsx +15 -13
- package/src/Button/Button.jsx +1 -1
- package/src/Button/ButtonBase.jsx +9 -8
- package/src/Button/ButtonGroup.jsx +17 -8
- package/src/Button/ButtonLink.jsx +1 -1
- package/src/Button/propTypes.js +2 -1
- package/src/Card/Card.jsx +7 -4
- package/src/Card/CardBase.jsx +6 -5
- package/src/Card/PressableCardBase.jsx +12 -12
- package/src/Checkbox/Checkbox.jsx +12 -5
- package/src/Divider/Divider.jsx +19 -12
- package/src/ExpandCollapse/Control.jsx +12 -7
- package/src/ExpandCollapse/ExpandCollapse.jsx +13 -3
- package/src/ExpandCollapse/Panel.jsx +15 -5
- package/src/Feedback/Feedback.jsx +13 -3
- package/src/Fieldset/Fieldset.jsx +1 -1
- package/src/FlexGrid/FlexGrid.jsx +11 -5
- package/src/FlexGrid/helpers/index.js +1 -3
- package/src/HorizontalScroll/HorizontalScroll.jsx +12 -5
- package/src/IconButton/IconButton.jsx +12 -8
- package/src/InputLabel/InputLabel.jsx +16 -2
- package/src/InputSupports/InputSupports.jsx +1 -1
- package/src/Link/LinkBase.jsx +11 -10
- package/src/List/List.jsx +12 -5
- package/src/List/ListItem.jsx +16 -2
- package/src/Modal/Modal.jsx +63 -50
- package/src/Notification/Notification.jsx +23 -6
- package/src/Pagination/Pagination.jsx +10 -3
- package/src/Progress/Progress.jsx +5 -3
- package/src/Progress/ProgressBar.jsx +8 -6
- package/src/Radio/Radio.jsx +13 -5
- package/src/Radio/RadioButton.jsx +13 -3
- package/src/Radio/RadioGroup.jsx +14 -2
- package/src/RadioCard/RadioCard.jsx +9 -6
- package/src/RadioCard/RadioCardGroup.jsx +16 -4
- package/src/Search/Search.jsx +15 -3
- package/src/Select/Select.jsx +21 -7
- package/src/SideNav/Item.jsx +15 -7
- package/src/SideNav/SideNav.jsx +13 -2
- package/src/Skeleton/Skeleton.jsx +55 -43
- package/src/Spacer/Spacer.jsx +10 -18
- package/src/StackView/StackView.jsx +13 -12
- package/src/StackView/StackWrapBox.jsx +12 -12
- package/src/StackView/StackWrapGap.jsx +9 -7
- package/src/StackView/getStackedContent.jsx +1 -1
- package/src/StepTracker/Step.jsx +7 -4
- package/src/StepTracker/StepTracker.jsx +8 -8
- package/src/Tabs/Tabs.jsx +16 -3
- package/src/Tabs/TabsItem.jsx +13 -9
- package/src/Tags/Tags.jsx +16 -7
- package/src/TextInput/TextArea.jsx +20 -8
- package/src/TextInput/TextInput.jsx +20 -8
- package/src/TextInput/TextInputBase.jsx +13 -3
- package/src/ThemeProvider/useThemeTokens.js +3 -3
- package/src/ThemeProvider/utils/theme-tokens.js +3 -3
- package/src/ToggleSwitch/ToggleSwitch.jsx +12 -7
- package/src/ToggleSwitch/ToggleSwitchGroup.jsx +14 -6
- package/src/Tooltip/Tooltip.jsx +13 -3
- package/src/TooltipButton/TooltipButton.jsx +6 -4
- package/src/Typography/Typography.jsx +10 -6
- package/src/index.js +1 -1
- package/src/utils/a11y/semantics.js +3 -2
- package/src/utils/children.jsx +2 -1
- package/src/utils/index.js +2 -1
- package/src/utils/pressability.js +1 -1
- package/src/utils/props/a11yProps.js +151 -0
- package/src/utils/props/clickProps.js +31 -0
- package/src/utils/props/componentPropType.js +67 -0
- package/src/utils/props/copyPropTypes.js +3 -0
- package/src/utils/props/getPropSelector.js +14 -0
- package/src/utils/props/hrefAttrsProp.js +25 -0
- package/src/utils/props/index.js +16 -0
- package/src/{InputSupports/propTypes.js → utils/props/inputSupportsProps.js} +2 -4
- package/src/utils/props/linkProps.js +43 -0
- package/src/utils/props/paddingProp.js +10 -0
- package/src/utils/props/pressProps.js +45 -0
- package/src/utils/props/rectProp.js +10 -0
- package/src/utils/props/responsiveProps.js +30 -0
- package/src/utils/props/selectSystemProps.js +25 -0
- package/src/utils/props/spacingProps.js +58 -0
- package/src/utils/props/tokens.js +150 -0
- package/src/utils/props/variantProp.js +20 -0
- package/src/utils/props/viewProps.js +23 -0
- package/src/utils/ssr.js +35 -0
- package/src/utils/useResponsiveProp.js +1 -1
- package/src/utils/useSpacingScale.js +4 -4
- package/.ultra.cache.json +0 -1
- package/lib/utils/a11y/propTypes.js +0 -61
- package/lib/utils/a11y/propTypes.native.js +0 -47
- package/lib/utils/propTypes.js +0 -566
- package/release-context.json +0 -7
- package/src/utils/a11y/propTypes.js +0 -61
- package/src/utils/a11y/propTypes.native.js +0 -39
- package/src/utils/propTypes.js +0 -561
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import View from "react-native-web/dist/exports/View";
|
|
4
|
+
import ScrollView from "react-native-web/dist/exports/ScrollView";
|
|
5
|
+
import { useThemeTokens } from '../ThemeProvider';
|
|
6
|
+
import { a11yProps, getA11yPropsFromHtmlTag, getTokensPropType, layoutTags, selectSystemProps, spacingProps, useSpacingScale, variantProp, viewProps } from '../utils';
|
|
7
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
8
|
+
const [selectProps, selectedSystemPropTypes] = selectSystemProps([a11yProps, viewProps]);
|
|
9
|
+
/**
|
|
10
|
+
* @typedef {import('../utils/props/spacingProps.js').SpacingValue} SpacingValue
|
|
11
|
+
* @typedef {import('../utils/props/spacingProps.js').SpacingIndex} SpacingIndex
|
|
12
|
+
* @typedef {import('../utils/props/spacingProps.js').SpacingObject} SpacingObject
|
|
13
|
+
* @typedef {import('../utils/props/spacingProps.js').SpacingOptions} SpacingOptions
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const selectBoxStyles = tokens => {
|
|
17
|
+
const styles = {
|
|
18
|
+
backgroundColor: tokens.backgroundColor
|
|
19
|
+
};
|
|
20
|
+
const paddings = ['paddingLeft', 'paddingRight', 'paddingTop', 'paddingBottom']; // Only set on styles if token provided because we spread this object after the spacing scale values
|
|
21
|
+
|
|
22
|
+
paddings.forEach(side => {
|
|
23
|
+
if (tokens[side]) {
|
|
24
|
+
styles[side] = tokens[side];
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
return styles;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* A layout utility component. Use Box to create space (padding) around content.
|
|
31
|
+
*
|
|
32
|
+
* ## Spacing
|
|
33
|
+
*
|
|
34
|
+
* For most simple uses, pass a number to Box's `space` prop referring to an index in the theme's
|
|
35
|
+
* spacing scale. For example, for a box with the theme's smallest non-zero amount of padding on all sides:
|
|
36
|
+
*
|
|
37
|
+
* ```jsx
|
|
38
|
+
* <Box space={1}>
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* #### Targetting specific sides
|
|
42
|
+
*
|
|
43
|
+
* Box allows spacing value props to be assigned to any side or all sides using the following props:
|
|
44
|
+
*
|
|
45
|
+
* - `space` sets the default for all sides, which is overridden by other props below
|
|
46
|
+
* - `horizontal` sets defaults for `left` and `right` (overriding `space` there if it is set)
|
|
47
|
+
* - `vertical` sets defaults for `top` and `bottom` (overriding `space` there if it is set)
|
|
48
|
+
* - `left` sets the left side padding, inside the box's bounds
|
|
49
|
+
* - `right` sets the right side padding, inside the box's bounds
|
|
50
|
+
* - `top` sets the top side padding, inside the box's bounds
|
|
51
|
+
* - `bottom` sets the bottom side padding, inside the box's bounds
|
|
52
|
+
*
|
|
53
|
+
* Box only controls spacing within its bounds. If space is needed around a box outside of its bounds,
|
|
54
|
+
* use `Spacer`, `StackView` or wrap the `Box` inside another `Box`.
|
|
55
|
+
*
|
|
56
|
+
* #### Viewport-specific spacing
|
|
57
|
+
*
|
|
58
|
+
* Responsive behaviours may be set by passing any of the above props an object keyed by viewports.
|
|
59
|
+
*
|
|
60
|
+
* For example, if a theme's spacing scale is [0, 4, 8...], this below will have padding of 4px on top,
|
|
61
|
+
* bottom, and right, and its left padding will be 0px on xs, sm and md viewports and 8px on lg and xl viewports:
|
|
62
|
+
*
|
|
63
|
+
* ```jsx
|
|
64
|
+
* <Box space={1} left={{ xs: 0, lg: 2 }} />`
|
|
65
|
+
* ```
|
|
66
|
+
*
|
|
67
|
+
* #### Subtracting from spacing
|
|
68
|
+
*
|
|
69
|
+
* A parent may sometimes need to reduce the spacing size on one or more sides of a `Box` by some variable.
|
|
70
|
+
* For example, the parent may have a border on one side and want to reduce the spacing of a child box
|
|
71
|
+
* by the width of that border on that side. This can be achieved using the `subtract` option of the
|
|
72
|
+
* spacing object, for example:
|
|
73
|
+
*
|
|
74
|
+
* ```jsx
|
|
75
|
+
* <Box space={2} left={{ space: 2, options: { subtract: themeTokens.borderWidthLeft } }} />`
|
|
76
|
+
* ```
|
|
77
|
+
*
|
|
78
|
+
* See `useSpacingScale` hook for other spacing value options and documentation.
|
|
79
|
+
*
|
|
80
|
+
* ## Theming
|
|
81
|
+
*
|
|
82
|
+
* Box is intended for layout, so minimal theming is supported. Use components like `Card` for
|
|
83
|
+
* more sophisticated theming.
|
|
84
|
+
*
|
|
85
|
+
* ## Scroll
|
|
86
|
+
*
|
|
87
|
+
* If passed, the box will be scrollable. If an object is passed, it will be passed to React Native's
|
|
88
|
+
* `ScrollView` component as props.
|
|
89
|
+
*
|
|
90
|
+
* When building native iOS and Android apps, it is important to remember to ensure any screen containing
|
|
91
|
+
* text content is inside a scrollable box, as screens are not scrollable by default and even very
|
|
92
|
+
* short text will require scrolling on small devices at the highest accessibility text scaling settings.
|
|
93
|
+
*/
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
const Box = /*#__PURE__*/forwardRef(({
|
|
97
|
+
space,
|
|
98
|
+
horizontal = space,
|
|
99
|
+
vertical = space,
|
|
100
|
+
top = vertical,
|
|
101
|
+
bottom = vertical,
|
|
102
|
+
left = horizontal,
|
|
103
|
+
right = horizontal,
|
|
104
|
+
flex,
|
|
105
|
+
children,
|
|
106
|
+
variant,
|
|
107
|
+
tokens,
|
|
108
|
+
scroll,
|
|
109
|
+
tag,
|
|
110
|
+
accessibilityRole,
|
|
111
|
+
testID,
|
|
112
|
+
dataSet,
|
|
113
|
+
...rest
|
|
114
|
+
}, ref) => {
|
|
115
|
+
const props = { ...getA11yPropsFromHtmlTag(tag, accessibilityRole),
|
|
116
|
+
...selectProps(rest)
|
|
117
|
+
};
|
|
118
|
+
const themeTokens = useThemeTokens('Box', tokens, variant);
|
|
119
|
+
const styles = {
|
|
120
|
+
flex,
|
|
121
|
+
paddingLeft: useSpacingScale(left),
|
|
122
|
+
paddingRight: useSpacingScale(right),
|
|
123
|
+
paddingTop: useSpacingScale(top),
|
|
124
|
+
paddingBottom: useSpacingScale(bottom),
|
|
125
|
+
...selectBoxStyles(themeTokens)
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
if (scroll) {
|
|
129
|
+
const scrollProps = typeof scroll === 'object' ? scroll : {};
|
|
130
|
+
scrollProps.contentContainerStyle = [styles, scrollProps.contentContainerStyle];
|
|
131
|
+
return /*#__PURE__*/_jsx(ScrollView, { ...scrollProps,
|
|
132
|
+
...props,
|
|
133
|
+
testID: testID,
|
|
134
|
+
dataSet: dataSet,
|
|
135
|
+
ref: ref,
|
|
136
|
+
children: children
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return /*#__PURE__*/_jsx(View, { ...props,
|
|
141
|
+
style: styles,
|
|
142
|
+
testID: testID,
|
|
143
|
+
dataSet: dataSet,
|
|
144
|
+
ref: ref,
|
|
145
|
+
children: children
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
Box.displayName = 'Box';
|
|
149
|
+
Box.propTypes = { ...selectedSystemPropTypes,
|
|
150
|
+
variant: variantProp.propType,
|
|
151
|
+
tokens: getTokensPropType('Box'),
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Sets default padding on all sides of the box using the theme's spacing scale.
|
|
155
|
+
*
|
|
156
|
+
* @see {@link SpacingValue}
|
|
157
|
+
*/
|
|
158
|
+
space: spacingProps.types.spacingValue,
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Sets top and bottom padding using the theme's spacing scale.
|
|
162
|
+
*
|
|
163
|
+
* @see {@link SpacingValue}
|
|
164
|
+
*/
|
|
165
|
+
vertical: spacingProps.types.spacingValue,
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Sets left and right padding using the theme's spacing scale.
|
|
169
|
+
*
|
|
170
|
+
* @see {@link SpacingValue}
|
|
171
|
+
*/
|
|
172
|
+
horizontal: spacingProps.types.spacingValue,
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Sets bottom padding using the theme's spacing scale.
|
|
176
|
+
*
|
|
177
|
+
* @see {@link SpacingValue}
|
|
178
|
+
*/
|
|
179
|
+
bottom: spacingProps.types.spacingValue,
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Sets left padding using the theme's spacing scale.
|
|
183
|
+
*
|
|
184
|
+
* @see {@link SpacingValue}
|
|
185
|
+
*/
|
|
186
|
+
left: spacingProps.types.spacingValue,
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Sets right padding using the theme's spacing scale.
|
|
190
|
+
*
|
|
191
|
+
* @see {@link SpacingValue}
|
|
192
|
+
*/
|
|
193
|
+
right: spacingProps.types.spacingValue,
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Sets top padding using the theme's spacing scale.
|
|
197
|
+
*
|
|
198
|
+
* @see {@link SpacingValue}
|
|
199
|
+
*/
|
|
200
|
+
top: spacingProps.types.spacingValue,
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Sets the `flex` style, which controls `flexGrow`, `flexShrink` and `flexBasis` styles.
|
|
204
|
+
*
|
|
205
|
+
* Set as 1 for the box to stretch and grow to fit in the available space, or another number to share
|
|
206
|
+
* space disproportionately with siblings. See https://reactnative.dev/docs/flexbox#flex for details.
|
|
207
|
+
*
|
|
208
|
+
* With the default `0`, the box takes its minimum width from its content.
|
|
209
|
+
*/
|
|
210
|
+
flex: PropTypes.number,
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Renders a scrollable ScrollView instead of an unscrollable View.
|
|
214
|
+
*
|
|
215
|
+
* May take an object of ScrollView props which are passed to the rendered ScrollView.
|
|
216
|
+
*/
|
|
217
|
+
scroll: PropTypes.oneOfType([PropTypes.bool, ScrollView.propTypes ? PropTypes.shape(ScrollView.propTypes) : PropTypes.object]),
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Optional semantic HTML tag, to apply to the container on web. Does not change styling.
|
|
221
|
+
*
|
|
222
|
+
* In native apps, if a header tag is provided ("h1", "h2" etc) and accessibilityRole prop
|
|
223
|
+
* is not defined, the accessibilityRole will default to "heading".
|
|
224
|
+
*/
|
|
225
|
+
tag: PropTypes.oneOf(layoutTags),
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Use in tests if the box itself needs to be targetted and no other way of selecting the
|
|
229
|
+
* box is available (e.g. it cannot be targetted using an appropriate `accessibilityRole`).
|
|
230
|
+
*/
|
|
231
|
+
testID: PropTypes.string,
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* @ignore
|
|
235
|
+
*/
|
|
236
|
+
dataSet: PropTypes.object,
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Box accepts any content as children.
|
|
240
|
+
*/
|
|
241
|
+
children: PropTypes.node.isRequired
|
|
242
|
+
};
|
|
243
|
+
export default Box;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
|
+
import ButtonBase from './ButtonBase';
|
|
3
|
+
import buttonPropTypes, { textAndA11yText } from './propTypes';
|
|
4
|
+
import { useThemeTokensCallback } from '../ThemeProvider';
|
|
5
|
+
import { a11yProps } from '../utils/props';
|
|
6
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
7
|
+
const Button = /*#__PURE__*/forwardRef(({
|
|
8
|
+
accessibilityRole = 'button',
|
|
9
|
+
tokens,
|
|
10
|
+
variant,
|
|
11
|
+
...props
|
|
12
|
+
}, ref) => {
|
|
13
|
+
const getTokens = useThemeTokensCallback('Button', tokens, variant);
|
|
14
|
+
return /*#__PURE__*/_jsx(ButtonBase, { ...props,
|
|
15
|
+
tokens: getTokens,
|
|
16
|
+
accessibilityRole: accessibilityRole,
|
|
17
|
+
ref: ref
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
Button.displayName = 'Button';
|
|
21
|
+
Button.propTypes = { ...a11yProps.types,
|
|
22
|
+
...buttonPropTypes,
|
|
23
|
+
children: textAndA11yText
|
|
24
|
+
};
|
|
25
|
+
export default Button;
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import Pressable from "react-native-web/dist/exports/Pressable";
|
|
4
|
+
import View from "react-native-web/dist/exports/View";
|
|
5
|
+
import StyleSheet from "react-native-web/dist/exports/StyleSheet";
|
|
6
|
+
import Platform from "react-native-web/dist/exports/Platform";
|
|
7
|
+
import { applyTextStyles, applyShadowToken, applyOuterBorder } from '../ThemeProvider/utils';
|
|
8
|
+
import buttonPropTypes from './propTypes';
|
|
9
|
+
import { a11yProps, getCursorStyle, clickProps, linkProps, resolvePressableState, resolvePressableTokens, selectSystemProps, viewProps, wrapStringsInText, withLinkRouter } from '../utils';
|
|
10
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
11
|
+
const [selectProps, selectedSystemPropTypes] = selectSystemProps([a11yProps, linkProps, viewProps]);
|
|
12
|
+
|
|
13
|
+
const getOuterBorderOffset = ({
|
|
14
|
+
outerBorderGap = 0,
|
|
15
|
+
outerBorderWidth = 0
|
|
16
|
+
}) => outerBorderGap + outerBorderWidth;
|
|
17
|
+
|
|
18
|
+
const selectOuterContainerStyles = ({
|
|
19
|
+
alignSelf,
|
|
20
|
+
opacity,
|
|
21
|
+
outerBorderColor,
|
|
22
|
+
outerBorderWidth,
|
|
23
|
+
outerBorderGap,
|
|
24
|
+
borderRadius,
|
|
25
|
+
outerBackgroundColor
|
|
26
|
+
}) => ({
|
|
27
|
+
alignSelf,
|
|
28
|
+
backgroundColor: outerBackgroundColor,
|
|
29
|
+
opacity,
|
|
30
|
+
...applyOuterBorder({
|
|
31
|
+
outerBorderGap,
|
|
32
|
+
outerBorderWidth,
|
|
33
|
+
outerBorderColor,
|
|
34
|
+
borderRadius
|
|
35
|
+
})
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const selectOuterWidthStyles = ({
|
|
39
|
+
outerBorderGap,
|
|
40
|
+
outerBorderWidth,
|
|
41
|
+
width
|
|
42
|
+
}) => {
|
|
43
|
+
// The inner container's bounding box is the bounding box of the button overall
|
|
44
|
+
// so this many device pixels will sit outside of the overall bounding box
|
|
45
|
+
const outerBorderOffset = getOuterBorderOffset({
|
|
46
|
+
outerBorderGap,
|
|
47
|
+
outerBorderWidth
|
|
48
|
+
});
|
|
49
|
+
const widthStyles = {};
|
|
50
|
+
|
|
51
|
+
if (!width) {
|
|
52
|
+
return { ...widthStyles,
|
|
53
|
+
// Wrap content, stopping a flex parent's default align-items: stretch stretching focus ring beyond content
|
|
54
|
+
...Platform.select({
|
|
55
|
+
// width: fit-content isn't supported on Firefox; can't cascade props like CSS `width: fit-content; width: --moz-fit-content;`
|
|
56
|
+
web: {
|
|
57
|
+
display: 'inline-flex'
|
|
58
|
+
}
|
|
59
|
+
})
|
|
60
|
+
};
|
|
61
|
+
} // Apply width tokens: number === pixels, string === explicit units e.g. %
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
if (typeof width === 'number') {
|
|
65
|
+
widthStyles.width = width + outerBorderOffset * 2;
|
|
66
|
+
return widthStyles;
|
|
67
|
+
} // Ensure the negative margin doesn't make element off-centre
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
if (Platform.OS === 'web') {
|
|
71
|
+
widthStyles.width = `calc(${width} + ${outerBorderOffset * 2}px)`;
|
|
72
|
+
return widthStyles;
|
|
73
|
+
} // Can't use calc() on native but (unlike on web) flexGrow fills the container width here
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
if (width === '100%') {
|
|
77
|
+
widthStyles.flexGrow = 1;
|
|
78
|
+
return widthStyles;
|
|
79
|
+
} // Slight offset not such a concern if % width < 100%, as the button isn't centered anyway.
|
|
80
|
+
// If centering support is added (e.g. alignSelf: center), set marginHorizontal 0 when centered.
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
widthStyles.width = width;
|
|
84
|
+
return widthStyles;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const selectInnerContainerStyles = ({
|
|
88
|
+
backgroundColor,
|
|
89
|
+
paddingLeft,
|
|
90
|
+
paddingRight,
|
|
91
|
+
paddingTop,
|
|
92
|
+
paddingBottom,
|
|
93
|
+
shadow,
|
|
94
|
+
borderWidth,
|
|
95
|
+
minWidth
|
|
96
|
+
}) => {
|
|
97
|
+
// Subtract border width from padding so overall button width/height doesn't
|
|
98
|
+
// jump around if the border width changes (avoiding NaN and negative padding)
|
|
99
|
+
const offsetBorder = value => typeof value === 'number' && typeof borderWidth === 'number' ? Math.max(0, value - borderWidth) : value;
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
paddingLeft: offsetBorder(paddingLeft),
|
|
103
|
+
paddingRight: offsetBorder(paddingRight),
|
|
104
|
+
paddingTop: offsetBorder(paddingTop),
|
|
105
|
+
paddingBottom: offsetBorder(paddingBottom),
|
|
106
|
+
backgroundColor,
|
|
107
|
+
minWidth,
|
|
108
|
+
...applyShadowToken(shadow)
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
const selectBorderStyles = ({
|
|
113
|
+
borderColor,
|
|
114
|
+
borderWidth,
|
|
115
|
+
borderRadius
|
|
116
|
+
}) => ({
|
|
117
|
+
borderColor,
|
|
118
|
+
borderWidth,
|
|
119
|
+
borderRadius
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
const selectTextStyles = ({
|
|
123
|
+
fontSize,
|
|
124
|
+
color,
|
|
125
|
+
lineHeight,
|
|
126
|
+
fontName,
|
|
127
|
+
fontWeight,
|
|
128
|
+
textAlign
|
|
129
|
+
}) => applyTextStyles({
|
|
130
|
+
fontSize,
|
|
131
|
+
color,
|
|
132
|
+
lineHeight,
|
|
133
|
+
fontName,
|
|
134
|
+
fontWeight,
|
|
135
|
+
textAlign
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
const selectWebOnlyStyles = (inactive, themeTokens, {
|
|
139
|
+
accessibilityRole
|
|
140
|
+
}) => {
|
|
141
|
+
return Platform.select({
|
|
142
|
+
web: {
|
|
143
|
+
// if it would overflow the container, wraps instead
|
|
144
|
+
maxWidth: `calc(100% + ${getOuterBorderOffset(themeTokens) * 2}px)`,
|
|
145
|
+
outline: 'none',
|
|
146
|
+
// removes the default browser :focus outline
|
|
147
|
+
...getCursorStyle(inactive, accessibilityRole)
|
|
148
|
+
},
|
|
149
|
+
default: {}
|
|
150
|
+
});
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
const ButtonBase = /*#__PURE__*/forwardRef(({
|
|
154
|
+
id,
|
|
155
|
+
href,
|
|
156
|
+
hrefAttrs,
|
|
157
|
+
children,
|
|
158
|
+
tokens = {},
|
|
159
|
+
disabled = false,
|
|
160
|
+
// alias for inactive
|
|
161
|
+
inactive = disabled,
|
|
162
|
+
selected = false,
|
|
163
|
+
...rawRest
|
|
164
|
+
}, ref) => {
|
|
165
|
+
const {
|
|
166
|
+
onPress,
|
|
167
|
+
...rest
|
|
168
|
+
} = clickProps.toPressProps(rawRest);
|
|
169
|
+
const extraButtonState = {
|
|
170
|
+
inactive,
|
|
171
|
+
selected
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
const resolveButtonTokens = pressableState => resolvePressableTokens(tokens, pressableState, extraButtonState);
|
|
175
|
+
|
|
176
|
+
const systemProps = selectProps(rest);
|
|
177
|
+
|
|
178
|
+
const getPressableStyle = pressableState => {
|
|
179
|
+
const themeTokens = resolveButtonTokens(pressableState);
|
|
180
|
+
return [staticStyles.row, selectWebOnlyStyles(inactive, themeTokens, systemProps), selectOuterContainerStyles(themeTokens), selectOuterWidthStyles(themeTokens)];
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
return /*#__PURE__*/_jsx(Pressable, {
|
|
184
|
+
ref: ref,
|
|
185
|
+
href: href,
|
|
186
|
+
onPress: linkProps.handleHref({
|
|
187
|
+
href,
|
|
188
|
+
onPress
|
|
189
|
+
}),
|
|
190
|
+
style: getPressableStyle,
|
|
191
|
+
disabled: inactive,
|
|
192
|
+
hrefAttrs: hrefAttrs,
|
|
193
|
+
...systemProps,
|
|
194
|
+
children: pressableState => {
|
|
195
|
+
const themeTokens = resolveButtonTokens(pressableState);
|
|
196
|
+
const containerStyles = selectInnerContainerStyles(themeTokens);
|
|
197
|
+
const borderStyles = selectBorderStyles(themeTokens);
|
|
198
|
+
const textStyles = [selectTextStyles(themeTokens), staticStyles.text]; // If the container has a width set, fill it instead of sizing from content.
|
|
199
|
+
// If in future we support text alignments other than center, add here.
|
|
200
|
+
|
|
201
|
+
const stretchStyles = themeTokens.width ? staticStyles.stretch : staticStyles.align;
|
|
202
|
+
return /*#__PURE__*/_jsx(View, {
|
|
203
|
+
id: id,
|
|
204
|
+
style: [containerStyles, borderStyles, stretchStyles, staticStyles.row, Platform.select({
|
|
205
|
+
web: {
|
|
206
|
+
maxWidth: '100%',
|
|
207
|
+
// ensure overflowing content wraps
|
|
208
|
+
// TODO: https://github.com/telus/universal-design-system/issues/487
|
|
209
|
+
transition: 'background-color 200ms, border-color 200ms'
|
|
210
|
+
}
|
|
211
|
+
})],
|
|
212
|
+
children: wrapStringsInText(typeof children === 'function' ? children({ ...resolvePressableState(pressableState, extraButtonState),
|
|
213
|
+
textStyles
|
|
214
|
+
}) : children, {
|
|
215
|
+
style: textStyles
|
|
216
|
+
})
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
ButtonBase.displayName = 'ButtonBase';
|
|
222
|
+
ButtonBase.propTypes = {
|
|
223
|
+
id: PropTypes.string,
|
|
224
|
+
...selectedSystemPropTypes,
|
|
225
|
+
...buttonPropTypes
|
|
226
|
+
};
|
|
227
|
+
ButtonBase.defaultProps = {
|
|
228
|
+
id: undefined
|
|
229
|
+
};
|
|
230
|
+
const staticStyles = StyleSheet.create({
|
|
231
|
+
row: {
|
|
232
|
+
// Apply all button alignment horizontally; no vertical stacking within a button
|
|
233
|
+
flexDirection: 'row'
|
|
234
|
+
},
|
|
235
|
+
text: {
|
|
236
|
+
flexGrow: 1,
|
|
237
|
+
// On native but not web, flexShrink here wraps text prematurely
|
|
238
|
+
...Platform.select({
|
|
239
|
+
// TODO: https://github.com/telus/universal-design-system/issues/487
|
|
240
|
+
web: {
|
|
241
|
+
transition: 'color 200ms'
|
|
242
|
+
}
|
|
243
|
+
})
|
|
244
|
+
},
|
|
245
|
+
align: {
|
|
246
|
+
alignItems: 'center'
|
|
247
|
+
},
|
|
248
|
+
stretch: {
|
|
249
|
+
flex: 1,
|
|
250
|
+
alignItems: 'center',
|
|
251
|
+
justifyContent: 'center'
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
export default withLinkRouter(ButtonBase);
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import ABBPropTypes from 'airbnb-prop-types';
|
|
4
|
+
import Platform from "react-native-web/dist/exports/Platform";
|
|
5
|
+
import ButtonBase from './ButtonBase';
|
|
6
|
+
import { StackWrap } from '../StackView';
|
|
7
|
+
import { useViewport } from '../ViewportProvider';
|
|
8
|
+
import { useThemeTokens, useThemeTokensCallback } from '../ThemeProvider';
|
|
9
|
+
import { a11yProps, pressProps, getTokensPropType, selectSystemProps, selectTokens, variantProp, viewProps } from '../utils/props';
|
|
10
|
+
import { useMultipleInputValues } from '../utils/input';
|
|
11
|
+
import { getPressHandlersWithArgs } from '../utils/pressability';
|
|
12
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
|
+
const [selectProps, selectedSystemPropTypes] = selectSystemProps([a11yProps, pressProps, viewProps]);
|
|
14
|
+
const ButtonGroup = /*#__PURE__*/forwardRef(({
|
|
15
|
+
variant,
|
|
16
|
+
tokens,
|
|
17
|
+
items = [],
|
|
18
|
+
values,
|
|
19
|
+
initialValues,
|
|
20
|
+
maxValues = 1,
|
|
21
|
+
onChange,
|
|
22
|
+
readOnly = false,
|
|
23
|
+
inactive = false,
|
|
24
|
+
accessibilityRole = maxValues === 1 ? 'radiogroup' // radiogroup is cross-platform; only web aria has generic groups
|
|
25
|
+
: Platform.select({
|
|
26
|
+
web: 'group',
|
|
27
|
+
default: 'none'
|
|
28
|
+
}),
|
|
29
|
+
...rest
|
|
30
|
+
}, ref) => {
|
|
31
|
+
const viewport = useViewport();
|
|
32
|
+
const themeTokens = useThemeTokens('ButtonGroup', tokens, variant, {
|
|
33
|
+
viewport
|
|
34
|
+
});
|
|
35
|
+
const stackTokens = selectTokens('StackView', themeTokens);
|
|
36
|
+
const {
|
|
37
|
+
direction,
|
|
38
|
+
space
|
|
39
|
+
} = themeTokens;
|
|
40
|
+
const getButtonTokens = useThemeTokensCallback('ButtonGroupItem', tokens, variant);
|
|
41
|
+
const {
|
|
42
|
+
currentValues,
|
|
43
|
+
toggleOneValue
|
|
44
|
+
} = useMultipleInputValues({
|
|
45
|
+
initialValues,
|
|
46
|
+
values,
|
|
47
|
+
maxValues,
|
|
48
|
+
onChange,
|
|
49
|
+
readOnly
|
|
50
|
+
});
|
|
51
|
+
const systemProps = selectProps({
|
|
52
|
+
accessibilityRole,
|
|
53
|
+
...rest
|
|
54
|
+
});
|
|
55
|
+
const itemA11yRole = systemProps.accessibilityRole === 'radiogroup' ? 'radio' : 'checkbox';
|
|
56
|
+
return /*#__PURE__*/_jsx(StackWrap, { ...systemProps,
|
|
57
|
+
space: space,
|
|
58
|
+
direction: direction,
|
|
59
|
+
tokens: stackTokens,
|
|
60
|
+
ref: ref,
|
|
61
|
+
children: items.map(({
|
|
62
|
+
label,
|
|
63
|
+
id = label,
|
|
64
|
+
accessibilityLabel,
|
|
65
|
+
ref: itemRef
|
|
66
|
+
}, index) => {
|
|
67
|
+
const isSelected = currentValues.includes(id); // Pass an object of relevant component state as first argument for any passed-in press handlers
|
|
68
|
+
|
|
69
|
+
const pressHandlers = getPressHandlersWithArgs(rest, [{
|
|
70
|
+
id,
|
|
71
|
+
label,
|
|
72
|
+
currentValues
|
|
73
|
+
}]);
|
|
74
|
+
|
|
75
|
+
const handlePress = event => {
|
|
76
|
+
if (pressHandlers.onPress) pressHandlers.onPress();
|
|
77
|
+
toggleOneValue(id, event);
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const itemA11y = {
|
|
81
|
+
accessibilityState: {
|
|
82
|
+
checked: isSelected
|
|
83
|
+
},
|
|
84
|
+
accessibilityRole: itemA11yRole,
|
|
85
|
+
accessibilityLabel,
|
|
86
|
+
...a11yProps.getPositionInSet(items.length, index)
|
|
87
|
+
}; // Ensure button is direct child of group as MacOS voiceover only applies "X of Y" to
|
|
88
|
+
// "radio" if it's a direct child of "radiogroup", even if aria-posinset etc exists
|
|
89
|
+
|
|
90
|
+
return /*#__PURE__*/_jsx(ButtonBase, {
|
|
91
|
+
ref: itemRef,
|
|
92
|
+
...pressHandlers,
|
|
93
|
+
onPress: handlePress,
|
|
94
|
+
tokens: getButtonTokens,
|
|
95
|
+
selected: isSelected,
|
|
96
|
+
inactive: inactive,
|
|
97
|
+
...itemA11y,
|
|
98
|
+
children: label
|
|
99
|
+
}, id);
|
|
100
|
+
})
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
ButtonGroup.displayName = 'ButtonGroup';
|
|
104
|
+
ButtonGroup.propTypes = { ...selectedSystemPropTypes,
|
|
105
|
+
tokens: getTokensPropType('ButtonGroup'),
|
|
106
|
+
variant: variantProp.propType,
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* The maximum number of items a user may select at once. Defaults to 1 and behaves
|
|
110
|
+
* like radio buttons. To have no limit and allow any number of selections, pass `null`.
|
|
111
|
+
*/
|
|
112
|
+
maxValues: PropTypes.number,
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* The options a user may select
|
|
116
|
+
*/
|
|
117
|
+
items: PropTypes.arrayOf(PropTypes.shape({
|
|
118
|
+
/**
|
|
119
|
+
* The text displayed to the user in the button, describing this option,
|
|
120
|
+
* passed to the button as its child.
|
|
121
|
+
*/
|
|
122
|
+
label: PropTypes.string.isRequired,
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* An optional accessibility label may be passed to ButtonGroup Buttons
|
|
126
|
+
* which is applied as normal for a React Native accessibilityLabel prop.
|
|
127
|
+
*/
|
|
128
|
+
accessibilityLabel: PropTypes.string,
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* An optional unique string may be provided to identify this option,
|
|
132
|
+
* which will be used in code and passed to any onChange function.
|
|
133
|
+
* If not provided, the label is used.
|
|
134
|
+
*/
|
|
135
|
+
id: PropTypes.string,
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* An optional ref for one individual button in the ButtonGroup
|
|
139
|
+
*/
|
|
140
|
+
ref: ABBPropTypes.ref()
|
|
141
|
+
})),
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* If provided, this function is called when the current selection is changed
|
|
145
|
+
* and is passed an array of the `id`s of all currently selected `items`.
|
|
146
|
+
*/
|
|
147
|
+
onChange: PropTypes.func,
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* If the selected item(s) in the button group are to be controlled externally by
|
|
151
|
+
* a parent component, pass an array of strings as well as an `onChange` handler.
|
|
152
|
+
* Passing an array for "values" makes the ButtonGroup a "controlled" component that
|
|
153
|
+
* expects its state to be handled via `onChange` and so doesn't handle it itself.
|
|
154
|
+
*/
|
|
155
|
+
values: PropTypes.arrayOf(PropTypes.string),
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* If `values` is not passed, making the ButtonGroup an "uncontrolled" component
|
|
159
|
+
* managing its own selected state, a default set of selections may be provided.
|
|
160
|
+
* Changing the `initialValues` does not change the user's selections.
|
|
161
|
+
*/
|
|
162
|
+
initialValues: PropTypes.arrayOf(PropTypes.string)
|
|
163
|
+
};
|
|
164
|
+
export default ButtonGroup;
|