@telus-uds/components-base 0.0.2-prerelease.1 → 0.0.2-prerelease.10
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 +120 -0
- package/README.md +4 -2
- package/__fixtures__/Accessible.js +33 -0
- package/__fixtures__/Accessible.native.js +32 -0
- package/__fixtures__/test-utils.js +25 -0
- package/__fixtures__/testTheme.js +1146 -145
- package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +1 -1
- package/__tests__/Box/Box.test.jsx +81 -58
- package/__tests__/Button/ButtonBase.test.jsx +3 -32
- package/__tests__/Button/ButtonGroup.test.jsx +6 -7
- package/__tests__/Card/Card.test.jsx +63 -0
- package/__tests__/Checkbox/Checkbox.test.jsx +94 -0
- package/__tests__/Checkbox/CheckboxGroup.test.jsx +246 -0
- package/__tests__/Divider/Divider.test.jsx +26 -5
- package/__tests__/ExpandCollapse/ExpandCollapse.test.jsx +2 -2
- package/__tests__/Feedback/Feedback.test.jsx +42 -0
- package/__tests__/FlexGrid/Col.test.jsx +5 -0
- package/__tests__/HorizontalScroll/HorizontalScroll.test.jsx +164 -0
- package/__tests__/Icon/Icon.test.jsx +3 -3
- package/__tests__/IconButton/IconButton.test.jsx +52 -0
- package/__tests__/InputSupports/InputSupports.test.jsx +50 -0
- package/__tests__/Link/LinkBase.test.jsx +0 -14
- package/__tests__/List/List.test.jsx +60 -0
- package/__tests__/Modal/Modal.test.jsx +47 -0
- package/__tests__/Notification/Notification.test.jsx +20 -0
- package/__tests__/Pagination/Pagination.test.jsx +160 -0
- package/__tests__/Progress/Progress.test.jsx +79 -0
- package/__tests__/Radio/Radio.test.jsx +87 -0
- package/__tests__/Radio/RadioGroup.test.jsx +220 -0
- package/__tests__/RadioCard/RadioCard.test.jsx +87 -0
- package/__tests__/RadioCard/RadioCardGroup.test.jsx +246 -0
- package/__tests__/Search/Search.test.jsx +73 -0
- package/__tests__/Select/Select.test.jsx +94 -0
- package/__tests__/Skeleton/Skeleton.test.jsx +61 -0
- package/__tests__/Spacer/Spacer.test.jsx +63 -0
- package/__tests__/StackView/StackView.test.jsx +216 -0
- package/__tests__/StackView/StackWrap.test.jsx +47 -0
- package/__tests__/StackView/getStackedContent.test.jsx +295 -0
- package/__tests__/StepTracker/StepTracker.test.jsx +94 -0
- package/__tests__/Tabs/Tabs.test.jsx +40 -0
- package/__tests__/Tags/Tags.test.jsx +327 -0
- package/__tests__/TextInput/TextArea.test.jsx +35 -0
- package/__tests__/TextInput/TextInputBase.test.jsx +125 -0
- package/__tests__/ThemeProvider/ThemeProvider.test.jsx +77 -0
- package/__tests__/ThemeProvider/useThemeTokens.test.jsx +14 -8
- package/__tests__/ThemeProvider/utils/theme-tokens.test.js +41 -0
- package/__tests__/ToggleSwitch/ToggleSwitch.test.jsx +3 -2
- package/__tests__/Tooltip/Tooltip.test.jsx +65 -0
- package/__tests__/Tooltip/getTooltipPosition.test.js +79 -0
- package/__tests__/utils/children.test.jsx +128 -0
- package/__tests__/utils/input.test.js +59 -1
- package/__tests__/utils/useCopy.test.js +42 -0
- package/__tests__/utils/useResponsiveProp.test.jsx +202 -0
- package/__tests__/utils/useSpacingScale.test.jsx +273 -0
- package/__tests__/utils/useUniqueId.test.js +31 -0
- package/babel.config.js +18 -1
- package/jest.config.js +19 -9
- package/lib/A11yInfoProvider/index.js +54 -26
- package/lib/A11yText/index.js +36 -15
- 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 +214 -87
- package/lib/Box/index.js +13 -2
- package/lib/Button/Button.js +37 -11
- package/lib/Button/ButtonBase.js +119 -110
- package/lib/Button/ButtonGroup.js +98 -101
- package/lib/Button/ButtonLink.js +40 -14
- package/lib/Button/index.js +31 -4
- package/lib/Button/propTypes.js +32 -9
- package/lib/Card/Card.js +98 -0
- package/lib/Card/CardBase.js +78 -0
- package/lib/Card/PressableCardBase.js +137 -0
- package/lib/Card/index.js +40 -0
- 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 +80 -18
- package/lib/Divider/index.js +13 -2
- package/lib/ExpandCollapse/Accordion.js +19 -8
- package/lib/ExpandCollapse/Control.js +50 -29
- package/lib/ExpandCollapse/ExpandCollapse.js +41 -24
- package/lib/ExpandCollapse/Panel.js +77 -41
- package/lib/ExpandCollapse/index.js +25 -7
- package/lib/Feedback/Feedback.js +161 -0
- package/lib/Feedback/index.js +13 -0
- 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 +66 -39
- package/lib/FlexGrid/Col/index.js +13 -2
- package/lib/FlexGrid/FlexGrid.js +70 -47
- package/lib/FlexGrid/Row/Row.js +47 -28
- package/lib/FlexGrid/Row/index.js +13 -2
- package/lib/FlexGrid/helpers/index.js +9 -1
- package/lib/FlexGrid/index.js +13 -2
- package/lib/FlexGrid/providers/GutterContext.js +15 -3
- package/lib/HorizontalScroll/HorizontalScroll.js +199 -0
- package/lib/HorizontalScroll/HorizontalScrollButton.js +121 -0
- package/lib/HorizontalScroll/ScrollViewEnd.js +66 -0
- package/lib/HorizontalScroll/ScrollViewEnd.native.js +41 -0
- package/lib/HorizontalScroll/dictionary.js +18 -0
- package/lib/HorizontalScroll/index.js +35 -0
- package/lib/HorizontalScroll/itemPositions.js +128 -0
- package/lib/Icon/Icon.js +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 +145 -0
- package/lib/InputLabel/LabelContent.js +39 -0
- package/lib/InputLabel/LabelContent.native.js +16 -0
- package/lib/InputLabel/index.js +13 -0
- 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 +56 -16
- package/lib/Link/InlinePressable.js +50 -0
- package/lib/Link/InlinePressable.native.js +101 -0
- package/lib/Link/Link.js +29 -14
- package/lib/Link/LinkBase.js +120 -147
- package/lib/Link/TextButton.js +46 -18
- package/lib/Link/index.js +39 -4
- package/lib/List/List.js +80 -0
- package/lib/List/ListItem.js +239 -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 +215 -0
- package/lib/Notification/dictionary.js +15 -0
- package/lib/Notification/index.js +13 -0
- package/lib/Pagination/PageButton.js +89 -0
- package/lib/Pagination/Pagination.js +148 -0
- package/lib/Pagination/SideButton.js +124 -0
- package/lib/Pagination/dictionary.js +25 -0
- package/lib/Pagination/index.js +13 -0
- package/lib/Pagination/usePagination.js +80 -0
- 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 +234 -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 +243 -0
- package/lib/RadioCard/RadioCardGroup.js +251 -0
- package/lib/RadioCard/index.js +21 -0
- package/lib/Search/Search.js +250 -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 +127 -0
- package/lib/Select/Select.js +341 -0
- package/lib/Select/index.js +19 -0
- package/lib/SideNav/Item.js +54 -35
- package/lib/SideNav/ItemContent.js +41 -15
- package/lib/SideNav/ItemsGroup.js +53 -34
- package/lib/SideNav/SideNav.js +94 -70
- 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 +117 -0
- package/lib/Spacer/index.js +13 -0
- package/lib/StackView/StackView.js +130 -0
- package/lib/StackView/StackWrap.js +55 -0
- package/lib/StackView/StackWrap.native.js +14 -0
- package/lib/StackView/StackWrapBox.js +120 -0
- package/lib/StackView/StackWrapGap.js +71 -0
- package/lib/StackView/common.js +47 -0
- package/lib/StackView/getStackedContent.js +141 -0
- package/lib/StackView/index.js +29 -0
- 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/Tabs.js +118 -0
- package/lib/Tabs/TabsItem.js +237 -0
- package/lib/Tabs/index.js +13 -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 +75 -0
- package/lib/TextInput/TextInputBase.js +255 -0
- package/lib/TextInput/index.js +23 -0
- package/lib/TextInput/propTypes.js +42 -0
- package/lib/ThemeProvider/ThemeProvider.js +46 -18
- package/lib/ThemeProvider/index.js +61 -6
- package/lib/ThemeProvider/useSetTheme.js +19 -5
- package/lib/ThemeProvider/useTheme.js +13 -4
- package/lib/ThemeProvider/useThemeTokens.js +111 -16
- package/lib/ThemeProvider/utils/index.js +31 -2
- package/lib/ThemeProvider/utils/styles.js +52 -16
- package/lib/ThemeProvider/utils/theme-tokens.js +154 -19
- package/lib/ToggleSwitch/ToggleSwitch.js +87 -93
- 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 -49
- 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 +539 -17
- 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 +134 -0
- package/lib/utils/index.js +163 -3
- 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 +62 -38
- package/lib/utils/pressability.js +120 -0
- package/lib/utils/propTypes.js +360 -109
- package/lib/utils/useCopy.js +51 -0
- package/lib/utils/useHash.js +52 -0
- package/lib/utils/useHash.native.js +15 -0
- package/lib/utils/useResponsiveProp.js +59 -0
- package/lib/utils/useSpacingScale.js +135 -0
- package/lib/utils/useUniqueId.js +21 -0
- package/package.json +15 -14
- package/release-context.json +4 -4
- package/src/ActivityIndicator/{Spinner.web.jsx → Spinner.jsx} +0 -0
- package/src/Box/Box.jsx +180 -78
- package/src/Button/Button.jsx +9 -5
- package/src/Button/ButtonBase.jsx +74 -87
- package/src/Button/ButtonGroup.jsx +26 -43
- package/src/Button/ButtonLink.jsx +14 -4
- package/src/Button/propTypes.js +12 -2
- package/src/Card/Card.jsx +75 -0
- package/src/Card/CardBase.jsx +57 -0
- package/src/Card/PressableCardBase.jsx +112 -0
- package/src/Card/index.js +6 -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/Divider/Divider.jsx +38 -3
- package/src/ExpandCollapse/Control.jsx +3 -4
- package/src/ExpandCollapse/Panel.jsx +3 -3
- package/src/Feedback/Feedback.jsx +108 -0
- package/src/Feedback/index.js +3 -0
- 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/FlexGrid/Col/Col.jsx +4 -2
- package/src/HorizontalScroll/HorizontalScroll.jsx +165 -0
- package/src/HorizontalScroll/HorizontalScrollButton.jsx +108 -0
- package/src/HorizontalScroll/ScrollViewEnd.jsx +53 -0
- package/src/HorizontalScroll/ScrollViewEnd.native.jsx +24 -0
- package/src/HorizontalScroll/dictionary.js +11 -0
- package/src/HorizontalScroll/index.js +17 -0
- package/src/HorizontalScroll/itemPositions.js +101 -0
- package/src/Icon/Icon.jsx +23 -27
- 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 +124 -0
- package/src/InputLabel/LabelContent.jsx +23 -0
- package/src/InputLabel/LabelContent.native.jsx +6 -0
- package/src/InputLabel/index.js +3 -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 +71 -146
- 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 +184 -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 +161 -0
- package/src/Notification/dictionary.js +8 -0
- package/src/Notification/index.js +3 -0
- package/src/Pagination/PageButton.jsx +70 -0
- package/src/Pagination/Pagination.jsx +135 -0
- package/src/Pagination/SideButton.jsx +82 -0
- package/src/Pagination/dictionary.js +18 -0
- package/src/Pagination/index.js +3 -0
- package/src/Pagination/usePagination.js +69 -0
- 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 +199 -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 +215 -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 +108 -0
- package/src/Select/Select.jsx +286 -0
- package/src/Select/index.js +8 -0
- package/src/SideNav/Item.jsx +5 -5
- package/src/SideNav/ItemsGroup.jsx +11 -13
- package/src/SideNav/SideNav.jsx +2 -1
- 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/Spacer/Spacer.jsx +91 -0
- package/src/Spacer/index.js +3 -0
- package/src/StackView/StackView.jsx +113 -0
- package/src/StackView/StackWrap.jsx +41 -0
- package/src/StackView/StackWrap.native.jsx +4 -0
- package/src/StackView/StackWrapBox.jsx +102 -0
- package/src/StackView/StackWrapGap.jsx +49 -0
- package/src/StackView/common.jsx +29 -0
- package/src/StackView/getStackedContent.jsx +112 -0
- package/src/StackView/index.js +6 -0
- 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/Tabs.jsx +92 -0
- package/src/Tabs/TabsItem.jsx +205 -0
- package/src/Tabs/index.js +3 -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 +52 -0
- package/src/TextInput/TextInputBase.jsx +211 -0
- package/src/TextInput/index.js +4 -0
- package/src/TextInput/propTypes.js +29 -0
- package/src/ThemeProvider/ThemeProvider.jsx +11 -7
- package/src/ThemeProvider/useSetTheme.js +4 -0
- package/src/ThemeProvider/useThemeTokens.js +85 -7
- package/src/ThemeProvider/utils/styles.js +18 -5
- package/src/ThemeProvider/utils/theme-tokens.js +106 -8
- package/src/ToggleSwitch/ToggleSwitch.jsx +25 -46
- 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 -24
- 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 +38 -1
- package/src/utils/a11y/index.js +1 -0
- package/src/utils/a11y/textSize.js +30 -0
- package/src/utils/children.jsx +119 -0
- package/src/utils/index.js +11 -0
- package/src/utils/info/index.js +8 -0
- package/src/utils/info/platform/index.js +11 -0
- package/src/utils/info/platform/platform.android.js +1 -0
- package/src/utils/info/platform/platform.ios.js +1 -0
- package/src/utils/info/platform/platform.js +1 -0
- package/src/utils/info/platform/platform.native.js +4 -0
- package/src/utils/info/versions.js +6 -0
- package/src/utils/input.js +38 -26
- package/src/utils/pressability.js +96 -0
- package/src/utils/propTypes.js +298 -66
- package/src/utils/useCopy.js +39 -0
- package/src/utils/useHash.js +39 -0
- package/src/utils/useHash.native.js +6 -0
- package/src/utils/useResponsiveProp.js +50 -0
- package/src/utils/useSpacingScale.js +108 -0
- package/src/utils/useUniqueId.js +14 -0
- package/stories/A11yText/A11yText.stories.jsx +15 -13
- package/stories/ActivityIndicator/ActivityIndicator.stories.jsx +11 -2
- package/stories/Box/Box.stories.jsx +46 -17
- package/stories/Button/Button.stories.jsx +21 -20
- package/stories/Button/ButtonGroup.stories.jsx +2 -1
- package/stories/Button/ButtonLink.stories.jsx +6 -4
- package/stories/Card/Card.stories.jsx +62 -0
- package/stories/Checkbox/Checkbox.stories.jsx +94 -0
- package/stories/Divider/Divider.stories.jsx +26 -2
- package/stories/ExpandCollapse/ExpandCollapse.stories.jsx +74 -79
- package/stories/Feedback/Feedback.stories.jsx +96 -0
- package/stories/FlexGrid/01 FlexGrid.stories.jsx +20 -7
- package/stories/Icon/Icon.stories.jsx +35 -7
- package/stories/IconButton/IconButton.stories.jsx +50 -0
- package/stories/InputLabel/InputLabel.stories.jsx +42 -0
- package/stories/Link/ChevronLink.stories.jsx +20 -4
- package/stories/Link/Link.stories.jsx +51 -20
- package/stories/Link/TextButton.stories.jsx +24 -3
- package/stories/List/List.stories.jsx +117 -0
- package/stories/Modal/Modal.stories.jsx +29 -0
- package/stories/Notification/Notification.stories.jsx +82 -0
- package/stories/Pagination/Pagination.stories.jsx +64 -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/SideNav/SideNav.stories.jsx +17 -2
- package/stories/Skeleton/Skeleton.stories.jsx +36 -0
- package/stories/Spacer/Spacer.stories.jsx +38 -0
- package/stories/StackView/StackView.stories.jsx +75 -0
- package/stories/StackView/StackWrap.stories.jsx +64 -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/TextInput/TextInput.stories.jsx +103 -0
- package/stories/ToggleSwitch/ToggleSwitch.stories.jsx +16 -3
- package/stories/Tooltip/Tooltip.stories.jsx +81 -0
- package/stories/TooltipButton/TooltipButton.stories.jsx +11 -0
- package/stories/Typography/Typography.stories.jsx +12 -3
- package/stories/{platform-supports.web.jsx → platform-supports.jsx} +1 -1
- package/stories/supports.jsx +148 -14
- package/__fixtures__/accessible.icon.svg +0 -6
- 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 -57
- package/lib/config/svgr-icons-web.js +0 -9
- package/lib/config/svgr-icons.js +0 -52
- package/src/config/svgr-icons-web.js +0 -11
- package/src/config/svgr-icons.js +0 -46
package/src/Link/LinkBase.jsx
CHANGED
|
@@ -1,14 +1,6 @@
|
|
|
1
|
-
import React
|
|
1
|
+
import React from 'react'
|
|
2
2
|
import PropTypes from 'prop-types'
|
|
3
|
-
import {
|
|
4
|
-
Text,
|
|
5
|
-
Platform,
|
|
6
|
-
StyleSheet,
|
|
7
|
-
Pressable,
|
|
8
|
-
PixelRatio,
|
|
9
|
-
View,
|
|
10
|
-
TouchableWithoutFeedback
|
|
11
|
-
} from 'react-native'
|
|
3
|
+
import { Text, Platform, StyleSheet } from 'react-native'
|
|
12
4
|
import {
|
|
13
5
|
a11yProps,
|
|
14
6
|
hrefAttrsProp,
|
|
@@ -16,37 +8,47 @@ import {
|
|
|
16
8
|
linkProps,
|
|
17
9
|
getTokensPropType
|
|
18
10
|
} from '../utils/propTypes'
|
|
11
|
+
import { resolvePressableTokens } from '../utils/pressability'
|
|
19
12
|
|
|
20
|
-
import
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
color
|
|
24
|
-
})
|
|
13
|
+
import InlinePressable from './InlinePressable'
|
|
14
|
+
import { applyTextStyles, applyOuterBorder } from '../ThemeProvider'
|
|
15
|
+
import { IconText, iconComponentPropTypes } from '../Icon'
|
|
25
16
|
|
|
26
17
|
const selectOuterBorderStyles = ({
|
|
27
18
|
outerBorderColor,
|
|
28
19
|
outerBorderWidth,
|
|
29
20
|
outerBorderGap,
|
|
30
|
-
|
|
21
|
+
borderRadius,
|
|
31
22
|
outerBorderOutline
|
|
32
23
|
}) =>
|
|
33
24
|
// A view wrapper with a border on native messes up inline text alignment
|
|
34
25
|
// so for now make focus styles strictly web-only
|
|
35
26
|
Platform.OS === 'web'
|
|
36
27
|
? {
|
|
37
|
-
margin: -1 * (outerBorderGap + outerBorderWidth) || 0,
|
|
38
|
-
padding: outerBorderGap,
|
|
39
28
|
// Allow theme to define outline, or, turn off outline and use border if rounded corners required
|
|
40
29
|
outline: outerBorderOutline,
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
30
|
+
...applyOuterBorder({
|
|
31
|
+
outerBorderColor,
|
|
32
|
+
outerBorderWidth,
|
|
33
|
+
outerBorderGap,
|
|
34
|
+
borderRadius
|
|
35
|
+
}),
|
|
36
|
+
// Stops focus ring stretching horizontally if parent has display: block
|
|
37
|
+
// width: fit-content isn't supported on Firefox; can't cascade props like CSS `width: fit-content; width: --moz-fit-content;`
|
|
38
|
+
display: 'inline-flex'
|
|
44
39
|
}
|
|
45
40
|
: {}
|
|
46
41
|
|
|
47
|
-
const selectTextStyles = ({ textLine, textLineStyle }) => ({
|
|
42
|
+
const selectTextStyles = ({ color, textLine, textLineStyle }) => ({
|
|
43
|
+
color,
|
|
48
44
|
textDecorationLine: textLine,
|
|
49
|
-
textDecorationStyle: textLineStyle
|
|
45
|
+
textDecorationStyle: textLineStyle,
|
|
46
|
+
...Platform.select({
|
|
47
|
+
web: {
|
|
48
|
+
// TODO: https://github.com/telus/universal-design-system/issues/487
|
|
49
|
+
transition: 'color 200ms'
|
|
50
|
+
}
|
|
51
|
+
})
|
|
50
52
|
})
|
|
51
53
|
|
|
52
54
|
const selectBlockStyles = ({ blockFontWeight, blockFontSize, blockLineHeight, blockFontName }) =>
|
|
@@ -57,18 +59,11 @@ const selectBlockStyles = ({ blockFontWeight, blockFontSize, blockLineHeight, bl
|
|
|
57
59
|
fontName: blockFontName
|
|
58
60
|
})
|
|
59
61
|
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
iconGapBefore,
|
|
63
|
-
iconGapAfter,
|
|
64
|
-
iconScale,
|
|
65
|
-
iconTranslateX
|
|
66
|
-
}) => ({
|
|
67
|
-
scale: iconScale,
|
|
62
|
+
const selectIconTokens = ({ color, iconSize, iconTranslateX, iconTranslateY }) => ({
|
|
63
|
+
color,
|
|
68
64
|
translateX: iconTranslateX,
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
gapAfter: iconGapAfter
|
|
65
|
+
translateY: iconTranslateY,
|
|
66
|
+
size: iconSize
|
|
72
67
|
})
|
|
73
68
|
|
|
74
69
|
/**
|
|
@@ -98,135 +93,62 @@ const LinkBase = ({
|
|
|
98
93
|
onPress,
|
|
99
94
|
icon,
|
|
100
95
|
iconPosition = icon ? 'left' : undefined,
|
|
101
|
-
|
|
96
|
+
iconProps,
|
|
102
97
|
variant,
|
|
103
|
-
tokens,
|
|
98
|
+
tokens = {},
|
|
104
99
|
children,
|
|
105
100
|
accessibilityRole = 'link',
|
|
106
101
|
...props
|
|
107
102
|
}) => {
|
|
108
|
-
const handlePress = linkProps.handleHref({ href, onPress })
|
|
109
|
-
|
|
110
|
-
const [isFocused, setIsFocused] = useState(false)
|
|
111
|
-
const handleFocus = () => setIsFocused(true)
|
|
112
|
-
const handleBlur = () => setIsFocused(false)
|
|
113
|
-
|
|
114
|
-
const [isHovered, setIsHovered] = useState(false)
|
|
115
|
-
const handleHoverIn = () => setIsHovered(true)
|
|
116
|
-
const handleHoverOut = () => setIsHovered(false)
|
|
117
|
-
|
|
118
|
-
const [isPressed, setIsPressed] = useState(false)
|
|
119
|
-
const handlePressIn = () => setIsPressed(true)
|
|
120
|
-
const handlePressOut = () => setIsPressed(false)
|
|
121
|
-
|
|
122
103
|
const { hrefAttrs, rest } = hrefAttrsProp.bundle(props)
|
|
123
104
|
const linkPropSet = linkProps.select({
|
|
124
105
|
accessibilityRole,
|
|
125
106
|
href,
|
|
126
|
-
onPress:
|
|
127
|
-
|
|
128
|
-
onPressOut: handlePressOut,
|
|
129
|
-
onFocus: handleFocus,
|
|
130
|
-
onBlur: handleBlur,
|
|
131
|
-
onMouseEnter: handleHoverIn,
|
|
132
|
-
onMouseLeave: handleHoverOut,
|
|
133
|
-
...hrefAttrsProp.spread(hrefAttrs),
|
|
107
|
+
onPress: linkProps.handleHref({ href, onPress }),
|
|
108
|
+
hrefAttrs,
|
|
134
109
|
...rest
|
|
135
110
|
})
|
|
136
111
|
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
hover: isHovered,
|
|
140
|
-
pressed: isPressed,
|
|
141
|
-
iconPosition
|
|
142
|
-
})
|
|
143
|
-
const IconComponent = icon || themeTokens.icon
|
|
144
|
-
const hasIcon = !!IconComponent
|
|
145
|
-
|
|
146
|
-
const textStyles = selectTextStyles(themeTokens)
|
|
147
|
-
const outerBorderStyles = selectOuterBorderStyles(themeTokens)
|
|
148
|
-
const contentStyles = selectContentStyles(themeTokens)
|
|
149
|
-
const blockStyles = selectBlockStyles(themeTokens)
|
|
150
|
-
const iconStyles = selectIconStyles(themeTokens)
|
|
151
|
-
|
|
152
|
-
// TODO: re-apply support for inline links
|
|
153
|
-
const isNested = false
|
|
112
|
+
const resolveLinkTokens = (pressState) =>
|
|
113
|
+
resolvePressableTokens(tokens, pressState, { iconPosition })
|
|
154
114
|
|
|
155
115
|
// On web, this makes focus rings wrap only the link, not the entire block
|
|
156
116
|
const blockLeftStyle = Platform.OS === 'web' && staticStyles.blockLeft
|
|
157
117
|
|
|
158
|
-
// Apply typographic text styles if not inheriting, and block positioning if a block
|
|
159
|
-
const blockTextStyles = !isNested && blockStyles
|
|
160
|
-
|
|
161
|
-
if (!hasIcon) {
|
|
162
|
-
// onPressIn / onPressOut only work if on TouchableWithoutFeedback, onFocus only works if on Text
|
|
163
|
-
const { onPress: _onPress, onPressIn, onPressOut, ...textProps } = linkPropSet
|
|
164
|
-
return (
|
|
165
|
-
// TouchableWithoutFeedback modifies its child so this stack is all (touchable) Text: no Views
|
|
166
|
-
<TouchableWithoutFeedback onPressIn={onPressIn} onPressOut={onPressOut} onPress={_onPress}>
|
|
167
|
-
<Text
|
|
168
|
-
{...textProps}
|
|
169
|
-
style={[outerBorderStyles, blockLeftStyle, contentStyles, blockTextStyles, textStyles]}
|
|
170
|
-
>
|
|
171
|
-
{children}
|
|
172
|
-
</Text>
|
|
173
|
-
</TouchableWithoutFeedback>
|
|
174
|
-
)
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
// Scale icon with text, but with a cap so text isn't squashed at large scales
|
|
178
|
-
const iconScale = Math.min(PixelRatio.getFontScale(), 2)
|
|
179
|
-
|
|
180
|
-
const iconTokens = {
|
|
181
|
-
size: iconStyles.size ? iconStyles.size * iconScale : undefined,
|
|
182
|
-
color: contentStyles.color ?? undefined,
|
|
183
|
-
scale: iconStyles.scale ?? undefined,
|
|
184
|
-
translateX: iconStyles.translateX ?? undefined
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
const iconContent = <IconComponent tokens={iconTokens} variant={iconVariant} />
|
|
188
|
-
|
|
189
|
-
const iconBlock = isNested ? (
|
|
190
|
-
// TODO: when reimplementing inline support, insert an appropriate space character
|
|
191
|
-
// based on the value of gapBefore and gapAfter on native (no inline margins/padding)
|
|
192
|
-
iconContent
|
|
193
|
-
) : (
|
|
194
|
-
<View
|
|
195
|
-
style={[
|
|
196
|
-
iconPosition === 'left' && { marginRight: iconStyles.gapAfter * iconScale },
|
|
197
|
-
iconPosition === 'right' && { marginLeft: iconStyles.gapBefore * iconScale }
|
|
198
|
-
]}
|
|
199
|
-
>
|
|
200
|
-
{iconContent}
|
|
201
|
-
</View>
|
|
202
|
-
)
|
|
203
|
-
|
|
204
|
-
// TODO: this doesn't work well when nested inline but does allow block-links to have icons align
|
|
205
|
-
// properly on Android which purely inline links can't do. Add an isNested case that is similar to
|
|
206
|
-
// https://github.com/telus/universal-design-system/pull/233
|
|
207
118
|
return (
|
|
208
|
-
<
|
|
119
|
+
<InlinePressable
|
|
209
120
|
{...linkPropSet}
|
|
210
|
-
style={
|
|
121
|
+
style={(linkState) => {
|
|
122
|
+
const themeTokens = resolveLinkTokens(linkState)
|
|
123
|
+
const outerBorderStyles = selectOuterBorderStyles(themeTokens)
|
|
124
|
+
const hasIcon = Boolean(icon || themeTokens.icon)
|
|
125
|
+
return [outerBorderStyles, blockLeftStyle, hasIcon && staticStyles.rowContainer]
|
|
126
|
+
}}
|
|
211
127
|
>
|
|
212
|
-
{
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
128
|
+
{(linkState) => {
|
|
129
|
+
const themeTokens = resolveLinkTokens(linkState)
|
|
130
|
+
const textStyles = selectTextStyles(themeTokens)
|
|
131
|
+
const iconTokens = selectIconTokens(themeTokens)
|
|
132
|
+
|
|
133
|
+
// TODO: may need to apply some smarter text inheritance here if inline to avoid native
|
|
134
|
+
// issues like double-application of line heights breaking align-items: baseline
|
|
135
|
+
const blockTextStyles = selectBlockStyles(themeTokens)
|
|
136
|
+
|
|
137
|
+
const IconComponent = icon || themeTokens.icon
|
|
138
|
+
const { iconSpace } = themeTokens
|
|
139
|
+
|
|
140
|
+
return (
|
|
141
|
+
<IconText
|
|
142
|
+
icon={IconComponent}
|
|
143
|
+
iconPosition={iconPosition}
|
|
144
|
+
space={iconSpace}
|
|
145
|
+
iconProps={{ ...iconProps, tokens: iconTokens }}
|
|
146
|
+
>
|
|
147
|
+
<Text style={[textStyles, blockTextStyles, staticStyles.baseline]}>{children}</Text>
|
|
148
|
+
</IconText>
|
|
149
|
+
)
|
|
150
|
+
}}
|
|
151
|
+
</InlinePressable>
|
|
230
152
|
)
|
|
231
153
|
}
|
|
232
154
|
|
|
@@ -238,7 +160,7 @@ LinkBase.propTypes = {
|
|
|
238
160
|
/**
|
|
239
161
|
* Optional variant that may be passed down to the link's icon if there is one
|
|
240
162
|
*/
|
|
241
|
-
|
|
163
|
+
iconProps: PropTypes.exact(iconComponentPropTypes),
|
|
242
164
|
/**
|
|
243
165
|
* A function component for an SVG icon to render inside the link. Inherits size and color from
|
|
244
166
|
* the link and any Typography the link is nested inside.
|
|
@@ -250,7 +172,7 @@ LinkBase.propTypes = {
|
|
|
250
172
|
iconPosition: PropTypes.oneOf(['left', 'right']),
|
|
251
173
|
/**
|
|
252
174
|
* On Web if href is passed, React Native Web maps this object's props to
|
|
253
|
-
* `rel`, `target` and
|
|
175
|
+
* `rel`, `target` and `download` attrs.
|
|
254
176
|
*/
|
|
255
177
|
hrefAttrs: PropTypes.shape(hrefAttrsProp.types)
|
|
256
178
|
}
|
|
@@ -263,6 +185,9 @@ const staticStyles = StyleSheet.create({
|
|
|
263
185
|
flexDirection: 'row',
|
|
264
186
|
alignItems: 'center',
|
|
265
187
|
justifyContent: 'flex-start'
|
|
188
|
+
},
|
|
189
|
+
baseline: {
|
|
190
|
+
alignSelf: 'baseline'
|
|
266
191
|
}
|
|
267
192
|
})
|
|
268
193
|
|
package/src/Link/TextButton.jsx
CHANGED
|
@@ -1,24 +1,36 @@
|
|
|
1
1
|
import React from 'react'
|
|
2
2
|
import PropTypes from 'prop-types'
|
|
3
3
|
|
|
4
|
+
import { useThemeTokensCallback } from '../ThemeProvider'
|
|
4
5
|
import LinkBase from './LinkBase'
|
|
5
6
|
|
|
7
|
+
/**
|
|
8
|
+
* `TextButton` is a button that looks like a Link. It uses the same theming and variants as
|
|
9
|
+
* Link but has the accessibility role of a `Button`. It should be used for actions that
|
|
10
|
+
* take place on the current page, or for navigation within an app.
|
|
11
|
+
*/
|
|
6
12
|
const TextButton = ({
|
|
7
13
|
onPress,
|
|
8
14
|
children,
|
|
9
|
-
variant
|
|
15
|
+
variant,
|
|
16
|
+
tokens,
|
|
17
|
+
// TODO: this may need to use `link` role on Web in the case of being passed both `href` and
|
|
18
|
+
// `onPress` in an omniplatform app that uses React Navigation's useLinkProps for internal nav.
|
|
10
19
|
accessibilityRole = 'button',
|
|
11
20
|
...linkProps
|
|
12
|
-
}) =>
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
}) => {
|
|
22
|
+
const getTokens = useThemeTokensCallback('Link', tokens, variant)
|
|
23
|
+
return (
|
|
24
|
+
<LinkBase
|
|
25
|
+
onPress={onPress}
|
|
26
|
+
accessibilityRole={accessibilityRole}
|
|
27
|
+
tokens={getTokens}
|
|
28
|
+
{...linkProps}
|
|
29
|
+
>
|
|
30
|
+
{children}
|
|
31
|
+
</LinkBase>
|
|
32
|
+
)
|
|
33
|
+
}
|
|
22
34
|
|
|
23
35
|
TextButton.propTypes = {
|
|
24
36
|
...LinkBase.propTypes,
|
|
@@ -26,6 +38,8 @@ TextButton.propTypes = {
|
|
|
26
38
|
}
|
|
27
39
|
|
|
28
40
|
// Remove incompatible Link prop (if this build includes propTypes)
|
|
41
|
+
// TODO: test if this works with web navigation in omniplatform React Navigation
|
|
42
|
+
// https://github.com/telus/universal-design-system/issues/665
|
|
29
43
|
// eslint-disable-next-line react/forbid-foreign-prop-types
|
|
30
44
|
if (TextButton.propTypes?.href) delete TextButton.propTypes.href
|
|
31
45
|
|
package/src/Link/index.js
CHANGED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import React, { cloneElement, Children } from 'react'
|
|
2
|
+
import { View, Platform } from 'react-native'
|
|
3
|
+
import PropTypes from 'prop-types'
|
|
4
|
+
import { getTokensPropType, variantProp, componentPropType } from '../utils'
|
|
5
|
+
import { a11yProps } from '../utils/propTypes'
|
|
6
|
+
import ListItem from './ListItem'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* A Unordered List component has a child a ListItem that
|
|
10
|
+
* allows icon, dividers and customized typography
|
|
11
|
+
*/
|
|
12
|
+
const List = ({ children, showDivider, tokens, variant, ...rest }) => {
|
|
13
|
+
const accessibilityRole = Platform.select({ web: 'list', default: 'none' })
|
|
14
|
+
const a11y = a11yProps.select(rest)
|
|
15
|
+
const items = Children.map(children, (child, index) => {
|
|
16
|
+
if (child.type.name === ListItem.name) {
|
|
17
|
+
return cloneElement(child, {
|
|
18
|
+
showDivider,
|
|
19
|
+
isLastItem: index + 1 === Children.count(children),
|
|
20
|
+
tokens,
|
|
21
|
+
variant
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
return child
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<View accessibilityRole={accessibilityRole} {...a11y}>
|
|
29
|
+
{items}
|
|
30
|
+
</View>
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
List.Item = ListItem
|
|
35
|
+
|
|
36
|
+
List.propTypes = {
|
|
37
|
+
...a11yProps.types,
|
|
38
|
+
tokens: getTokensPropType('List'),
|
|
39
|
+
variant: variantProp.propType,
|
|
40
|
+
children: componentPropType('ListItem'),
|
|
41
|
+
/**
|
|
42
|
+
* In case it is not the last item allow display divider
|
|
43
|
+
*/
|
|
44
|
+
showDivider: PropTypes.bool
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export default List
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { View, Platform, Text, StyleSheet } from 'react-native'
|
|
3
|
+
import PropTypes from 'prop-types'
|
|
4
|
+
import { useThemeTokens, applyTextStyles } from '../ThemeProvider'
|
|
5
|
+
import { getTokensPropType, variantProp } from '../utils'
|
|
6
|
+
|
|
7
|
+
const selectBulletStyles = ({ itemBulletWidth, itemBulletHeight, itemBulletColor }) => ({
|
|
8
|
+
width: itemBulletWidth,
|
|
9
|
+
height: itemBulletHeight,
|
|
10
|
+
borderRadius: itemBulletHeight / 2,
|
|
11
|
+
backgroundColor: itemBulletColor
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
const selectBulletContainerStyles = ({ itemBulletContainerWidth, itemBulletContainerAlign }) => ({
|
|
15
|
+
width: itemBulletContainerWidth,
|
|
16
|
+
alignItems: itemBulletContainerAlign,
|
|
17
|
+
justifyContent: itemBulletContainerAlign
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
const selectItemIconTokens = ({ itemIconSize, itemIconColor }) => ({
|
|
21
|
+
size: itemIconSize,
|
|
22
|
+
color: itemIconColor
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
const selectSideItemContainerStyles = ({ listGutter }) => ({
|
|
26
|
+
marginRight: listGutter
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
const selectItemStyles = ({ itemFontWeight, itemFontSize, itemLineHeight, itemFontName }) =>
|
|
30
|
+
applyTextStyles({
|
|
31
|
+
fontWeight: itemFontWeight,
|
|
32
|
+
fontSize: itemFontSize,
|
|
33
|
+
lineHeight: itemLineHeight,
|
|
34
|
+
fontName: itemFontName
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
const selectItemBlockStyles = ({ interItemMargin }) => ({
|
|
38
|
+
marginBottom: interItemMargin
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
const selectDividerStyles = ({ dividerColor, dividerSize, interItemMarginWithDivider }) => ({
|
|
42
|
+
borderBottomWidth: dividerSize,
|
|
43
|
+
borderColor: dividerColor,
|
|
44
|
+
marginBottom: interItemMarginWithDivider,
|
|
45
|
+
paddingBottom: interItemMarginWithDivider
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* ListItem is responsible for rendering icon or a bullet as side item
|
|
50
|
+
*/
|
|
51
|
+
const ListItem = ({
|
|
52
|
+
tokens,
|
|
53
|
+
variant,
|
|
54
|
+
icon,
|
|
55
|
+
iconColor,
|
|
56
|
+
iconSize,
|
|
57
|
+
showDivider,
|
|
58
|
+
children,
|
|
59
|
+
isLastItem
|
|
60
|
+
}) => {
|
|
61
|
+
const themeTokens = useThemeTokens('List', tokens, variant)
|
|
62
|
+
|
|
63
|
+
const itemStyles = selectItemStyles(themeTokens)
|
|
64
|
+
const itemBlockStyles = selectItemBlockStyles(themeTokens)
|
|
65
|
+
const dividerStyles = selectDividerStyles(themeTokens)
|
|
66
|
+
const itemBulletContainerStyles = selectBulletContainerStyles(themeTokens)
|
|
67
|
+
const itemBulletStyles = selectBulletStyles(themeTokens)
|
|
68
|
+
const iconTokens = selectItemIconTokens(themeTokens)
|
|
69
|
+
const sideItemContainerStyles = selectSideItemContainerStyles(themeTokens)
|
|
70
|
+
const accessibilityRole = Platform.select({ web: 'listitem', default: 'item' })
|
|
71
|
+
|
|
72
|
+
const areChildrenStrings = () => {
|
|
73
|
+
if (Array.isArray(children)) {
|
|
74
|
+
return children.every((child) => typeof child === 'string')
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return typeof children === 'string'
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const renderItem = () => {
|
|
81
|
+
if (areChildrenStrings()) {
|
|
82
|
+
return <Text style={itemStyles}>{children}</Text>
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return <View style={staticStyles.wrap}>{children}</View>
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Function responsible returning styling, in case the item is the last shouldn't
|
|
90
|
+
* add extra margin on the bottom, if "showDivider" is true it should add a divider
|
|
91
|
+
* and custom margin and padding, otherwise just adds a margin to the bottom
|
|
92
|
+
*/
|
|
93
|
+
const getContainerStyle = () => {
|
|
94
|
+
if (isLastItem) {
|
|
95
|
+
return undefined
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (showDivider) {
|
|
99
|
+
return dividerStyles
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return itemBlockStyles
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Renders item bullet or Icon in case it's defined
|
|
107
|
+
* in case children are string the icon is centered otherwise
|
|
108
|
+
* it will align itself at start of the container
|
|
109
|
+
*/
|
|
110
|
+
const renderMarker = () => {
|
|
111
|
+
const IconComponent = icon || <></>
|
|
112
|
+
|
|
113
|
+
if (icon) {
|
|
114
|
+
return (
|
|
115
|
+
<View
|
|
116
|
+
style={[
|
|
117
|
+
sideItemContainerStyles,
|
|
118
|
+
areChildrenStrings() ? staticStyles.centeredIcons : undefined
|
|
119
|
+
]}
|
|
120
|
+
>
|
|
121
|
+
<IconComponent size={iconSize || iconTokens.size} color={iconColor || iconTokens.color} />
|
|
122
|
+
</View>
|
|
123
|
+
)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return (
|
|
127
|
+
<View style={[sideItemContainerStyles, itemBulletContainerStyles]}>
|
|
128
|
+
<View style={itemBulletStyles} testID="unordered-item-bullet" />
|
|
129
|
+
</View>
|
|
130
|
+
)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return (
|
|
134
|
+
<View
|
|
135
|
+
style={[staticStyles.itemContainer, getContainerStyle()]}
|
|
136
|
+
accessibilityRole={accessibilityRole}
|
|
137
|
+
>
|
|
138
|
+
{renderMarker()}
|
|
139
|
+
{renderItem()}
|
|
140
|
+
</View>
|
|
141
|
+
)
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const staticStyles = StyleSheet.create({
|
|
145
|
+
itemContainer: {
|
|
146
|
+
flexDirection: 'row'
|
|
147
|
+
},
|
|
148
|
+
centeredIcons: {
|
|
149
|
+
justifyContent: 'center'
|
|
150
|
+
},
|
|
151
|
+
wrap: {
|
|
152
|
+
flex: 1
|
|
153
|
+
}
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
ListItem.propTypes = {
|
|
157
|
+
tokens: getTokensPropType('List'),
|
|
158
|
+
variant: variantProp.propType,
|
|
159
|
+
children: PropTypes.node.isRequired,
|
|
160
|
+
/**
|
|
161
|
+
* Renders side item icon
|
|
162
|
+
*/
|
|
163
|
+
icon: PropTypes.func,
|
|
164
|
+
/**
|
|
165
|
+
* Will set display icon color
|
|
166
|
+
*/
|
|
167
|
+
iconColor: PropTypes.string,
|
|
168
|
+
/**
|
|
169
|
+
* Allow the user define the icon size if not defined the theme's file
|
|
170
|
+
*/
|
|
171
|
+
iconSize: PropTypes.number,
|
|
172
|
+
/**
|
|
173
|
+
* @ignore
|
|
174
|
+
* Defined by parent if it's last item on the list
|
|
175
|
+
*/
|
|
176
|
+
isLastItem: PropTypes.bool,
|
|
177
|
+
/**
|
|
178
|
+
* @ignore
|
|
179
|
+
* In case it is not the last item allow display divider
|
|
180
|
+
*/
|
|
181
|
+
showDivider: PropTypes.bool
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export default ListItem
|