@telus-uds/components-base 0.0.2-prerelease.6 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +9 -0
- package/.ultra.cache.json +1 -1
- package/CHANGELOG.md +85 -0
- package/README.md +4 -2
- package/__fixtures__/Accessible.js +33 -0
- package/__fixtures__/Accessible.native.js +32 -0
- package/__fixtures__/test-utils.js +25 -0
- package/__fixtures__/testTheme.js +851 -57
- package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +1 -1
- package/__tests__/Button/ButtonBase.test.jsx +2 -31
- package/__tests__/Button/ButtonGroup.test.jsx +6 -7
- package/__tests__/Checkbox/Checkbox.test.jsx +94 -0
- package/__tests__/Checkbox/CheckboxGroup.test.jsx +246 -0
- package/__tests__/ExpandCollapse/ExpandCollapse.test.jsx +2 -2
- package/__tests__/HorizontalScroll/HorizontalScroll.test.jsx +164 -0
- package/__tests__/Icon/Icon.test.jsx +3 -3
- package/__tests__/IconButton/IconButton.test.jsx +52 -0
- package/__tests__/InputSupports/InputSupports.test.jsx +50 -0
- package/__tests__/Link/LinkBase.test.jsx +0 -14
- package/__tests__/List/List.test.jsx +60 -0
- package/__tests__/Modal/Modal.test.jsx +47 -0
- package/__tests__/Notification/Notification.test.jsx +20 -0
- package/__tests__/Pagination/Pagination.test.jsx +2 -2
- package/__tests__/Progress/Progress.test.jsx +79 -0
- package/__tests__/Radio/Radio.test.jsx +87 -0
- package/__tests__/Radio/RadioGroup.test.jsx +220 -0
- package/__tests__/RadioCard/RadioCard.test.jsx +87 -0
- package/__tests__/RadioCard/RadioCardGroup.test.jsx +246 -0
- package/__tests__/Search/Search.test.jsx +73 -0
- package/__tests__/Select/Select.test.jsx +94 -0
- package/__tests__/Skeleton/Skeleton.test.jsx +61 -0
- package/__tests__/StepTracker/StepTracker.test.jsx +94 -0
- package/__tests__/Tabs/Tabs.test.jsx +40 -0
- package/__tests__/Tags/Tags.test.jsx +327 -0
- package/__tests__/TextInput/TextArea.test.jsx +35 -0
- package/__tests__/TextInput/{TextInput.test.jsx → TextInputBase.test.jsx} +29 -50
- package/__tests__/ThemeProvider/ThemeProvider.test.jsx +77 -0
- package/__tests__/ThemeProvider/useThemeTokens.test.jsx +9 -5
- package/__tests__/ThemeProvider/utils/theme-tokens.test.js +41 -0
- package/__tests__/ToggleSwitch/ToggleSwitch.test.jsx +3 -2
- package/__tests__/utils/children.test.jsx +128 -0
- package/__tests__/utils/input.test.js +59 -1
- package/__tests__/utils/semantics.test.jsx +43 -0
- package/__tests__/utils/useCopy.test.js +14 -3
- package/babel.config.js +20 -0
- package/jest.config.js +8 -3
- package/lib/A11yInfoProvider/index.js +54 -26
- package/lib/A11yText/index.js +45 -17
- package/lib/ActivityIndicator/Spinner.js +81 -0
- package/lib/ActivityIndicator/Spinner.native.js +129 -91
- package/lib/ActivityIndicator/index.js +28 -12
- package/lib/ActivityIndicator/shared.js +27 -12
- package/lib/BaseProvider/index.js +34 -11
- package/lib/Box/Box.js +152 -35
- package/lib/Box/index.js +13 -2
- package/lib/Button/Button.js +41 -12
- package/lib/Button/ButtonBase.js +125 -97
- package/lib/Button/ButtonGroup.js +112 -89
- package/lib/Button/ButtonLink.js +48 -17
- package/lib/Button/index.js +31 -4
- package/lib/Button/propTypes.js +32 -9
- package/lib/Card/Card.js +38 -41
- package/lib/Card/CardBase.js +85 -0
- package/lib/Card/PressableCardBase.js +141 -0
- package/lib/Card/index.js +40 -2
- package/lib/Checkbox/Checkbox.js +355 -0
- package/lib/Checkbox/CheckboxGroup.js +241 -0
- package/lib/Checkbox/CheckboxInput.js +74 -0
- package/lib/Checkbox/CheckboxInput.native.js +14 -0
- package/lib/Checkbox/index.js +21 -0
- package/lib/Divider/Divider.js +59 -28
- package/lib/Divider/index.js +13 -2
- package/lib/ExpandCollapse/Accordion.js +26 -7
- package/lib/ExpandCollapse/Control.js +60 -31
- package/lib/ExpandCollapse/ExpandCollapse.js +50 -28
- package/lib/ExpandCollapse/Panel.js +83 -44
- package/lib/ExpandCollapse/index.js +25 -7
- package/lib/Feedback/Feedback.js +90 -39
- package/lib/Feedback/index.js +13 -2
- package/lib/Fieldset/Fieldset.js +165 -0
- package/lib/Fieldset/FieldsetContainer.js +46 -0
- package/lib/Fieldset/FieldsetContainer.native.js +38 -0
- package/lib/Fieldset/Legend.js +38 -0
- package/lib/Fieldset/Legend.native.js +48 -0
- package/lib/Fieldset/cssReset.js +21 -0
- package/lib/Fieldset/index.js +13 -0
- package/lib/FlexGrid/Col/Col.js +73 -41
- package/lib/FlexGrid/Col/index.js +13 -2
- package/lib/FlexGrid/FlexGrid.js +99 -49
- package/lib/FlexGrid/Row/Row.js +58 -30
- package/lib/FlexGrid/Row/index.js +13 -2
- package/lib/FlexGrid/helpers/index.js +9 -1
- package/lib/FlexGrid/index.js +13 -2
- package/lib/FlexGrid/providers/GutterContext.js +15 -3
- package/lib/HorizontalScroll/HorizontalScroll.js +200 -0
- package/lib/HorizontalScroll/HorizontalScrollButton.js +127 -0
- package/lib/HorizontalScroll/ScrollViewEnd.js +66 -0
- package/lib/HorizontalScroll/ScrollViewEnd.native.js +41 -0
- package/lib/HorizontalScroll/dictionary.js +18 -0
- package/lib/HorizontalScroll/index.js +35 -0
- package/lib/HorizontalScroll/itemPositions.js +128 -0
- package/lib/Icon/Icon.js +62 -50
- package/lib/Icon/IconText.js +101 -0
- package/lib/Icon/index.js +31 -3
- package/lib/IconButton/IconButton.js +140 -0
- package/lib/IconButton/index.js +13 -0
- package/lib/InputLabel/InputLabel.js +102 -40
- package/lib/InputLabel/LabelContent.js +41 -0
- package/lib/InputLabel/LabelContent.native.js +32 -6
- package/lib/InputLabel/index.js +13 -2
- package/lib/InputSupports/InputSupports.js +109 -0
- package/lib/InputSupports/index.js +13 -0
- package/lib/InputSupports/propTypes.js +66 -0
- package/lib/InputSupports/useInputSupports.js +41 -0
- package/lib/Link/ChevronLink.js +58 -31
- package/lib/Link/InlinePressable.js +56 -0
- package/lib/Link/InlinePressable.native.js +102 -0
- package/lib/Link/Link.js +39 -15
- package/lib/Link/LinkBase.js +126 -150
- package/lib/Link/TextButton.js +53 -18
- package/lib/Link/index.js +39 -4
- package/lib/List/List.js +81 -0
- package/lib/List/ListItem.js +245 -0
- package/lib/List/index.js +13 -0
- package/lib/Modal/Modal.js +231 -0
- package/lib/Modal/dictionary.js +16 -0
- package/lib/Modal/index.js +13 -0
- package/lib/Notification/Notification.js +216 -0
- package/lib/Notification/dictionary.js +15 -0
- package/lib/Notification/index.js +13 -0
- package/lib/Pagination/PageButton.js +58 -48
- package/lib/Pagination/Pagination.js +78 -43
- package/lib/Pagination/SideButton.js +79 -58
- package/lib/Pagination/dictionary.js +9 -2
- package/lib/Pagination/index.js +13 -2
- package/lib/Pagination/usePagination.js +12 -2
- package/lib/Progress/Progress.js +104 -0
- package/lib/Progress/ProgressBar.js +157 -0
- package/lib/Progress/ProgressBarBackground.js +61 -0
- package/lib/Progress/index.js +16 -0
- package/lib/Radio/Radio.js +293 -0
- package/lib/Radio/RadioButton.js +152 -0
- package/lib/Radio/RadioGroup.js +244 -0
- package/lib/Radio/RadioInput.js +76 -0
- package/lib/Radio/RadioInput.native.js +14 -0
- package/lib/Radio/index.js +21 -0
- package/lib/RadioCard/RadioCard.js +244 -0
- package/lib/RadioCard/RadioCardGroup.js +252 -0
- package/lib/RadioCard/index.js +21 -0
- package/lib/Search/Search.js +254 -0
- package/lib/Search/dictionary.js +19 -0
- package/lib/Search/index.js +13 -0
- package/lib/Select/Group.js +33 -0
- package/lib/Select/Group.native.js +25 -0
- package/lib/Select/Item.js +29 -0
- package/lib/Select/Item.native.js +19 -0
- package/lib/Select/Picker.js +84 -0
- package/lib/Select/Picker.native.js +130 -0
- package/lib/Select/Select.js +342 -0
- package/lib/Select/index.js +19 -0
- package/lib/SideNav/Item.js +63 -37
- package/lib/SideNav/ItemContent.js +41 -15
- package/lib/SideNav/ItemsGroup.js +55 -31
- package/lib/SideNav/SideNav.js +100 -73
- package/lib/SideNav/index.js +15 -1
- package/lib/Skeleton/Skeleton.js +137 -0
- package/lib/Skeleton/index.js +13 -0
- package/lib/Skeleton/skeleton.constant.js +12 -0
- package/lib/Skeleton/skeletonWebAnimation.js +27 -0
- package/lib/Skeleton/useSkeletonNativeAnimation.js +37 -0
- package/lib/Spacer/Spacer.js +49 -18
- package/lib/Spacer/index.js +13 -2
- package/lib/StackView/StackView.js +71 -31
- package/lib/StackView/StackWrap.js +43 -13
- package/lib/StackView/StackWrap.native.js +13 -2
- package/lib/StackView/StackWrapBox.js +76 -29
- package/lib/StackView/StackWrapGap.js +56 -26
- package/lib/StackView/common.js +23 -6
- package/lib/StackView/getStackedContent.js +47 -17
- package/lib/StackView/index.js +29 -5
- package/lib/StepTracker/Step.js +245 -0
- package/lib/StepTracker/StepTracker.js +202 -0
- package/lib/StepTracker/dictionary.js +17 -0
- package/lib/StepTracker/index.js +13 -0
- package/lib/Tabs/Tabs.js +124 -0
- package/lib/Tabs/TabsItem.js +238 -0
- package/lib/Tabs/index.js +13 -0
- package/lib/Tags/Tags.js +266 -0
- package/lib/Tags/index.js +13 -0
- package/lib/TextInput/TextArea.js +111 -0
- package/lib/TextInput/TextInput.js +50 -304
- package/lib/TextInput/TextInputBase.js +256 -0
- package/lib/TextInput/index.js +23 -2
- package/lib/TextInput/propTypes.js +42 -0
- package/lib/ThemeProvider/ThemeProvider.js +46 -18
- package/lib/ThemeProvider/index.js +61 -6
- package/lib/ThemeProvider/useSetTheme.js +19 -5
- package/lib/ThemeProvider/useTheme.js +13 -4
- package/lib/ThemeProvider/useThemeTokens.js +86 -19
- package/lib/ThemeProvider/utils/index.js +31 -2
- package/lib/ThemeProvider/utils/styles.js +50 -14
- package/lib/ThemeProvider/utils/theme-tokens.js +121 -12
- package/lib/ToggleSwitch/ToggleSwitch.js +86 -57
- package/lib/ToggleSwitch/index.js +13 -2
- package/lib/Tooltip/{Backdrop.web.js → Backdrop.js} +20 -8
- package/lib/Tooltip/Backdrop.native.js +39 -15
- package/lib/Tooltip/Tooltip.js +117 -74
- package/lib/Tooltip/dictionary.js +9 -2
- package/lib/Tooltip/getTooltipPosition.js +9 -1
- package/lib/Tooltip/index.js +13 -2
- package/lib/TooltipButton/TooltipButton.js +57 -38
- package/lib/TooltipButton/index.js +13 -2
- package/lib/Typography/Typography.js +86 -55
- package/lib/Typography/index.js +13 -2
- package/lib/ViewportProvider/ViewportProvider.js +34 -13
- package/lib/ViewportProvider/index.js +28 -3
- package/lib/ViewportProvider/useViewport.js +15 -3
- package/lib/ViewportProvider/useViewportListener.js +24 -10
- package/lib/index.js +539 -26
- package/lib/utils/a11y/index.js +31 -0
- package/lib/utils/a11y/semantics.js +173 -0
- package/lib/utils/a11y/textSize.js +49 -0
- package/lib/utils/animation/index.js +15 -2
- package/lib/utils/animation/useVerticalExpandAnimation.js +27 -10
- package/lib/utils/children.js +134 -0
- package/lib/utils/index.js +163 -7
- package/lib/utils/info/index.js +19 -0
- package/lib/utils/info/platform/index.js +23 -0
- package/lib/utils/info/platform/platform.android.js +8 -0
- package/lib/utils/info/platform/platform.ios.js +8 -0
- package/lib/utils/info/platform/platform.js +8 -0
- package/lib/utils/info/platform/platform.native.js +11 -0
- package/lib/utils/info/versions.js +16 -0
- package/lib/utils/input.js +53 -25
- package/lib/utils/pressability.js +120 -0
- package/lib/utils/propTypes.js +338 -132
- package/lib/utils/useCopy.js +40 -5
- package/lib/utils/useHash.js +52 -0
- package/lib/utils/useHash.native.js +15 -0
- package/lib/utils/useResponsiveProp.js +21 -9
- package/lib/utils/useSpacingScale.js +19 -9
- package/lib/utils/useUniqueId.js +12 -3
- package/package.json +16 -10
- package/release-context.json +4 -4
- package/src/A11yText/index.jsx +6 -4
- package/src/ActivityIndicator/{Spinner.web.jsx → Spinner.jsx} +5 -3
- package/src/ActivityIndicator/Spinner.native.jsx +5 -3
- package/src/Box/Box.jsx +131 -39
- package/src/Button/Button.jsx +13 -6
- package/src/Button/ButtonBase.jsx +134 -125
- package/src/Button/ButtonGroup.jsx +85 -86
- package/src/Button/ButtonLink.jsx +22 -7
- package/src/Button/propTypes.js +12 -2
- package/src/Card/Card.jsx +5 -31
- package/src/Card/CardBase.jsx +58 -0
- package/src/Card/PressableCardBase.jsx +119 -0
- package/src/Card/index.js +3 -0
- package/src/Checkbox/Checkbox.jsx +284 -0
- package/src/Checkbox/CheckboxGroup.jsx +206 -0
- package/src/Checkbox/CheckboxInput.jsx +55 -0
- package/src/Checkbox/CheckboxInput.native.jsx +6 -0
- package/src/Checkbox/index.js +5 -0
- package/src/Divider/Divider.jsx +7 -4
- package/src/ExpandCollapse/Accordion.jsx +3 -2
- package/src/ExpandCollapse/Control.jsx +40 -43
- package/src/ExpandCollapse/ExpandCollapse.jsx +26 -23
- package/src/ExpandCollapse/Panel.jsx +69 -63
- package/src/Feedback/Feedback.jsx +42 -30
- package/src/Fieldset/Fieldset.jsx +136 -0
- package/src/Fieldset/FieldsetContainer.jsx +31 -0
- package/src/Fieldset/FieldsetContainer.native.jsx +19 -0
- package/src/Fieldset/Legend.jsx +21 -0
- package/src/Fieldset/Legend.native.jsx +27 -0
- package/src/Fieldset/cssReset.js +14 -0
- package/src/Fieldset/index.js +3 -0
- package/src/FlexGrid/Col/Col.jsx +139 -132
- package/src/FlexGrid/FlexGrid.jsx +79 -51
- package/src/FlexGrid/Row/Row.jsx +55 -48
- package/src/HorizontalScroll/HorizontalScroll.jsx +168 -0
- package/src/HorizontalScroll/HorizontalScrollButton.jsx +105 -0
- package/src/HorizontalScroll/ScrollViewEnd.jsx +53 -0
- package/src/HorizontalScroll/ScrollViewEnd.native.jsx +24 -0
- package/src/HorizontalScroll/dictionary.js +11 -0
- package/src/HorizontalScroll/index.js +17 -0
- package/src/HorizontalScroll/itemPositions.js +101 -0
- package/src/Icon/Icon.jsx +46 -49
- package/src/Icon/IconText.jsx +68 -0
- package/src/Icon/index.js +3 -2
- package/src/IconButton/IconButton.jsx +114 -0
- package/src/IconButton/index.js +3 -0
- package/src/InputLabel/InputLabel.jsx +57 -35
- package/src/InputLabel/LabelContent.jsx +21 -0
- package/src/InputLabel/LabelContent.native.jsx +11 -2
- package/src/InputSupports/InputSupports.jsx +70 -0
- package/src/InputSupports/index.js +3 -0
- package/src/InputSupports/propTypes.js +44 -0
- package/src/InputSupports/useInputSupports.js +30 -0
- package/src/Link/ChevronLink.jsx +34 -21
- package/src/Link/InlinePressable.jsx +39 -0
- package/src/Link/InlinePressable.native.jsx +75 -0
- package/src/Link/Link.jsx +23 -13
- package/src/Link/LinkBase.jsx +98 -170
- package/src/Link/TextButton.jsx +37 -16
- package/src/Link/index.js +2 -1
- package/src/List/List.jsx +48 -0
- package/src/List/ListItem.jsx +182 -0
- package/src/List/index.js +3 -0
- package/src/Modal/Modal.jsx +190 -0
- package/src/Modal/dictionary.js +9 -0
- package/src/Modal/index.js +3 -0
- package/src/Notification/Notification.jsx +164 -0
- package/src/Notification/dictionary.js +8 -0
- package/src/Notification/index.js +3 -0
- package/src/Pagination/PageButton.jsx +42 -49
- package/src/Pagination/Pagination.jsx +88 -92
- package/src/Pagination/SideButton.jsx +58 -66
- package/src/Progress/Progress.jsx +78 -0
- package/src/Progress/ProgressBar.jsx +123 -0
- package/src/Progress/ProgressBarBackground.jsx +36 -0
- package/src/Progress/index.js +6 -0
- package/src/Radio/Radio.jsx +240 -0
- package/src/Radio/RadioButton.jsx +142 -0
- package/src/Radio/RadioGroup.jsx +209 -0
- package/src/Radio/RadioInput.jsx +57 -0
- package/src/Radio/RadioInput.native.jsx +6 -0
- package/src/Radio/index.js +5 -0
- package/src/RadioCard/RadioCard.jsx +198 -0
- package/src/RadioCard/RadioCardGroup.jsx +218 -0
- package/src/RadioCard/index.js +5 -0
- package/src/Search/Search.jsx +225 -0
- package/src/Search/dictionary.js +12 -0
- package/src/Search/index.js +3 -0
- package/src/Select/Group.jsx +15 -0
- package/src/Select/Group.native.jsx +14 -0
- package/src/Select/Item.jsx +11 -0
- package/src/Select/Item.native.jsx +10 -0
- package/src/Select/Picker.jsx +74 -0
- package/src/Select/Picker.native.jsx +102 -0
- package/src/Select/Select.jsx +298 -0
- package/src/Select/index.js +8 -0
- package/src/SideNav/Item.jsx +54 -47
- package/src/SideNav/ItemsGroup.jsx +50 -43
- package/src/SideNav/SideNav.jsx +68 -60
- package/src/Skeleton/Skeleton.jsx +94 -0
- package/src/Skeleton/index.js +3 -0
- package/src/Skeleton/skeleton.constant.js +3 -0
- package/src/Skeleton/skeletonWebAnimation.js +13 -0
- package/src/Skeleton/useSkeletonNativeAnimation.js +27 -0
- package/src/Spacer/Spacer.jsx +11 -4
- package/src/StackView/StackView.jsx +53 -23
- package/src/StackView/StackWrap.jsx +16 -7
- package/src/StackView/StackWrapBox.jsx +62 -28
- package/src/StackView/StackWrapGap.jsx +46 -24
- package/src/StackView/common.jsx +3 -2
- package/src/StackView/getStackedContent.jsx +8 -2
- package/src/StepTracker/Step.jsx +202 -0
- package/src/StepTracker/StepTracker.jsx +174 -0
- package/src/StepTracker/dictionary.js +10 -0
- package/src/StepTracker/index.js +3 -0
- package/src/Tabs/Tabs.jsx +97 -0
- package/src/Tabs/TabsItem.jsx +212 -0
- package/src/Tabs/index.js +3 -0
- package/src/Tags/Tags.jsx +219 -0
- package/src/Tags/index.js +3 -0
- package/src/TextInput/TextArea.jsx +79 -0
- package/src/TextInput/TextInput.jsx +18 -284
- package/src/TextInput/TextInputBase.jsx +217 -0
- package/src/TextInput/index.js +2 -1
- package/src/TextInput/propTypes.js +29 -0
- package/src/ThemeProvider/ThemeProvider.jsx +11 -7
- package/src/ThemeProvider/useSetTheme.js +4 -0
- package/src/ThemeProvider/useThemeTokens.js +56 -5
- package/src/ThemeProvider/utils/styles.js +18 -5
- package/src/ThemeProvider/utils/theme-tokens.js +74 -5
- package/src/ToggleSwitch/ToggleSwitch.jsx +51 -53
- package/src/Tooltip/{Backdrop.web.jsx → Backdrop.jsx} +0 -0
- package/src/Tooltip/Tooltip.jsx +135 -131
- package/src/TooltipButton/TooltipButton.jsx +23 -27
- package/src/Typography/Typography.jsx +72 -59
- package/src/index.js +31 -3
- package/src/utils/a11y/index.js +2 -0
- package/src/utils/a11y/semantics.js +162 -0
- package/src/utils/a11y/textSize.js +30 -0
- package/src/utils/children.jsx +119 -0
- package/src/utils/index.js +6 -0
- package/src/utils/info/index.js +8 -0
- package/src/utils/info/platform/index.js +11 -0
- package/src/utils/info/platform/platform.android.js +1 -0
- package/src/utils/info/platform/platform.ios.js +1 -0
- package/src/utils/info/platform/platform.js +1 -0
- package/src/utils/info/platform/platform.native.js +4 -0
- package/src/utils/info/versions.js +6 -0
- package/src/utils/input.js +36 -25
- package/src/utils/pressability.js +96 -0
- package/src/utils/propTypes.js +291 -90
- package/src/utils/useCopy.js +30 -4
- package/src/utils/useHash.js +39 -0
- package/src/utils/useHash.native.js +6 -0
- package/stories/A11yText/A11yText.stories.jsx +6 -10
- package/stories/ActivityIndicator/ActivityIndicator.stories.jsx +1 -1
- package/stories/Box/Box.stories.jsx +1 -1
- package/stories/Button/Button.stories.jsx +7 -2
- package/stories/Button/ButtonGroup.stories.jsx +1 -1
- package/stories/Button/ButtonLink.stories.jsx +1 -1
- package/stories/Card/Card.stories.jsx +1 -1
- package/stories/Checkbox/Checkbox.stories.jsx +94 -0
- package/stories/Divider/Divider.stories.jsx +1 -1
- package/stories/ExpandCollapse/ExpandCollapse.stories.jsx +2 -2
- package/stories/Feedback/Feedback.stories.jsx +5 -6
- package/stories/FlexGrid/01 FlexGrid.stories.jsx +1 -1
- package/stories/FlexGrid/02 Row.stories.jsx +1 -1
- package/stories/FlexGrid/03 Col.stories.jsx +1 -1
- package/stories/Icon/Icon.stories.jsx +27 -7
- package/stories/IconButton/IconButton.stories.jsx +50 -0
- package/stories/InputLabel/InputLabel.stories.jsx +1 -1
- package/stories/Link/ChevronLink.stories.jsx +1 -1
- package/stories/Link/Link.stories.jsx +28 -18
- package/stories/Link/TextButton.stories.jsx +1 -1
- package/stories/List/List.stories.jsx +117 -0
- package/stories/Modal/Modal.stories.jsx +29 -0
- package/stories/Notification/Notification.stories.jsx +82 -0
- package/stories/Pagination/Pagination.stories.jsx +1 -1
- package/stories/Progress/Progress.stories.jsx +93 -0
- package/stories/Radio/Radio.stories.jsx +100 -0
- package/stories/RadioCard/RadioCard.stories.jsx +98 -0
- package/stories/Search/Search.stories.jsx +16 -0
- package/stories/Select/Select.stories.jsx +55 -0
- package/stories/SideNav/SideNav.stories.jsx +1 -1
- package/stories/SideNav/SideNavItem.stories.jsx +1 -1
- package/stories/SideNav/SideNavItemsGroup.stories.jsx +1 -1
- package/stories/Skeleton/Skeleton.stories.jsx +36 -0
- package/stories/Spacer/Spacer.stories.jsx +1 -1
- package/stories/StackView/StackView.stories.jsx +1 -1
- package/stories/StackView/StackWrap.stories.jsx +1 -1
- package/stories/StepTracker/StepTracker.stories.jsx +71 -0
- package/stories/Tabs/Tabs.stories.jsx +97 -0
- package/stories/Tags/Tags.stories.jsx +69 -0
- package/stories/TextInput/TextArea.stories.jsx +100 -0
- package/stories/TextInput/TextInput.stories.jsx +1 -1
- package/stories/ToggleSwitch/ToggleSwitch.stories.jsx +1 -1
- package/stories/Tooltip/Tooltip.stories.jsx +1 -1
- package/stories/TooltipButton/TooltipButton.stories.jsx +1 -1
- package/stories/Typography/Typography.stories.jsx +1 -1
- package/stories/{platform-supports.web.jsx → platform-supports.jsx} +1 -1
- package/stories/supports.jsx +38 -4
- package/__fixtures__/accessible.icon.svg +0 -6
- package/babel.config.json +0 -8
- package/docs/Contributing.stories.mdx +0 -9
- package/docs/Fonts.stories.mdx +0 -104
- package/docs/Icons.stories.mdx +0 -144
- package/docs/Introduction.stories.mdx +0 -9
- package/lib/ActivityIndicator/Spinner.web.js +0 -55
- package/lib/InputLabel/LabelContent.web.js +0 -17
- package/lib/config/svgr-icons-web.js +0 -9
- package/lib/config/svgr-icons.js +0 -52
- package/src/InputLabel/LabelContent.web.jsx +0 -13
- package/src/config/svgr-icons-web.js +0 -11
- package/src/config/svgr-icons.js +0 -46
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import PropTypes from 'prop-types'
|
|
3
|
+
import { render } from '@testing-library/react-native'
|
|
4
|
+
import { Text, View } from 'react-native'
|
|
5
|
+
|
|
6
|
+
import { wrapStringsInText } from '../../src/utils'
|
|
7
|
+
import A11yText from '../../src/A11yText'
|
|
8
|
+
|
|
9
|
+
const TestComponent = ({ children }) => (
|
|
10
|
+
<View testID="wrapper">{wrapStringsInText(children, { testID: 'text' })}</View>
|
|
11
|
+
)
|
|
12
|
+
TestComponent.propTypes = {
|
|
13
|
+
children: PropTypes.node
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
describe('wrapStringsInText', () => {
|
|
17
|
+
it('combines adjacent strings into one text', () => {
|
|
18
|
+
const secondString = 'Second string'
|
|
19
|
+
const { queryAllByTestId } = render(
|
|
20
|
+
<TestComponent>
|
|
21
|
+
First string
|
|
22
|
+
{secondString}
|
|
23
|
+
Third string
|
|
24
|
+
</TestComponent>
|
|
25
|
+
)
|
|
26
|
+
expect(queryAllByTestId('text')).toHaveLength(1)
|
|
27
|
+
})
|
|
28
|
+
it('combines adjacent strings and numbers into one `Text`', () => {
|
|
29
|
+
const { queryAllByTestId } = render(
|
|
30
|
+
<TestComponent>
|
|
31
|
+
First string
|
|
32
|
+
{12345}
|
|
33
|
+
Third string
|
|
34
|
+
</TestComponent>
|
|
35
|
+
)
|
|
36
|
+
expect(queryAllByTestId('text')).toHaveLength(1)
|
|
37
|
+
})
|
|
38
|
+
it('combines adjacent strings, numbers and A11yText into one `Text`', () => {
|
|
39
|
+
const { queryAllByTestId } = render(
|
|
40
|
+
<TestComponent>
|
|
41
|
+
First string
|
|
42
|
+
<A11yText text="Some inserted A11yText" />
|
|
43
|
+
Third string
|
|
44
|
+
</TestComponent>
|
|
45
|
+
)
|
|
46
|
+
expect(queryAllByTestId('text')).toHaveLength(1)
|
|
47
|
+
})
|
|
48
|
+
it('combines clusters seperated by another component into multiple `Text`s', () => {
|
|
49
|
+
const { queryAllByTestId } = render(
|
|
50
|
+
<TestComponent>
|
|
51
|
+
First string
|
|
52
|
+
{12345}
|
|
53
|
+
Third string
|
|
54
|
+
<View />
|
|
55
|
+
Fourth string
|
|
56
|
+
<A11yText text="Some inserted A11yText" />
|
|
57
|
+
Fifth string
|
|
58
|
+
<View />
|
|
59
|
+
Sixth string
|
|
60
|
+
{12345}
|
|
61
|
+
<A11yText text="Some inserted A11yText" />
|
|
62
|
+
Seventh string
|
|
63
|
+
</TestComponent>
|
|
64
|
+
)
|
|
65
|
+
expect(queryAllByTestId('text')).toHaveLength(3)
|
|
66
|
+
})
|
|
67
|
+
it('does not wrap elements that do not need wrapping', () => {
|
|
68
|
+
const { getByTestId, queryAllByTestId } = render(
|
|
69
|
+
<TestComponent>
|
|
70
|
+
Unwrapped text
|
|
71
|
+
{12345}
|
|
72
|
+
<View>
|
|
73
|
+
<Text>
|
|
74
|
+
Wrapped text inside View
|
|
75
|
+
{12345}
|
|
76
|
+
</Text>
|
|
77
|
+
</View>
|
|
78
|
+
More unwrapped text
|
|
79
|
+
{12345}
|
|
80
|
+
<Text>
|
|
81
|
+
Wrapped text separate from above unwrapped text
|
|
82
|
+
{12345}
|
|
83
|
+
</Text>
|
|
84
|
+
</TestComponent>
|
|
85
|
+
)
|
|
86
|
+
expect(queryAllByTestId('text')).toHaveLength(2)
|
|
87
|
+
expect(getByTestId('wrapper').children.map((child) => child.type)).toEqual([
|
|
88
|
+
Text,
|
|
89
|
+
View,
|
|
90
|
+
Text,
|
|
91
|
+
Text
|
|
92
|
+
])
|
|
93
|
+
})
|
|
94
|
+
it('does not wrap a singular A11yText in `Text`', () => {
|
|
95
|
+
const { queryAllByTestId } = render(
|
|
96
|
+
<TestComponent>
|
|
97
|
+
<A11yText text="Some inserted A11yText" />
|
|
98
|
+
</TestComponent>
|
|
99
|
+
)
|
|
100
|
+
expect(queryAllByTestId('text')).toHaveLength(0)
|
|
101
|
+
})
|
|
102
|
+
it('does not wrap an A11yText in `Text` if it is sandwiched by non-text', () => {
|
|
103
|
+
const { queryAllByTestId } = render(
|
|
104
|
+
<TestComponent>
|
|
105
|
+
First string
|
|
106
|
+
{12345}
|
|
107
|
+
Third string
|
|
108
|
+
<View />
|
|
109
|
+
<A11yText text="Some inserted A11yText" />
|
|
110
|
+
<View />
|
|
111
|
+
Sixth string
|
|
112
|
+
{12345}
|
|
113
|
+
<A11yText text="Some inserted A11yText" />
|
|
114
|
+
Seventh string
|
|
115
|
+
</TestComponent>
|
|
116
|
+
)
|
|
117
|
+
expect(queryAllByTestId('text')).toHaveLength(2)
|
|
118
|
+
})
|
|
119
|
+
it('does not double-wrap already wrapped `Text`', () => {
|
|
120
|
+
const { queryAllByTestId } = render(
|
|
121
|
+
<TestComponent>
|
|
122
|
+
<Text>Already wrapped</Text>
|
|
123
|
+
<Text>Also already wrapped</Text>
|
|
124
|
+
</TestComponent>
|
|
125
|
+
)
|
|
126
|
+
expect(queryAllByTestId('text')).toHaveLength(0)
|
|
127
|
+
})
|
|
128
|
+
})
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { renderHook, act } from '@testing-library/react-hooks'
|
|
2
2
|
|
|
3
|
-
import { useInputValue, useMultipleInputValues } from '../../
|
|
3
|
+
import { useInputValue, useMultipleInputValues } from '../../src/utils'
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Tests for errors thrown on incorrect props usage
|
|
@@ -90,6 +90,17 @@ describe('useInputValue (uncontrolled)', () => {
|
|
|
90
90
|
expect(result.current.currentValue).toBe('some value')
|
|
91
91
|
})
|
|
92
92
|
|
|
93
|
+
it('Changes currentValue based on old value when `setValue` is passed a function', () => {
|
|
94
|
+
const { result } = renderHook(() => useInputValue({ initialValue: 1 }))
|
|
95
|
+
expect(result.current.currentValue).toBe(1)
|
|
96
|
+
|
|
97
|
+
act(() => result.current.setValue((oldValue) => oldValue + 1))
|
|
98
|
+
expect(result.current.currentValue).toBe(2)
|
|
99
|
+
|
|
100
|
+
act(() => result.current.setValue((oldValue) => oldValue + 2))
|
|
101
|
+
expect(result.current.currentValue).toBe(4)
|
|
102
|
+
})
|
|
103
|
+
|
|
93
104
|
it('Sets currentValue to initialValue if provided, which may be changed', () => {
|
|
94
105
|
const { result } = renderHook(() => useInputValue({ initialValue: 'first value' }))
|
|
95
106
|
expect(result.current.currentValue).toBe('first value')
|
|
@@ -210,6 +221,29 @@ describe('useMultipleInputValues (uncontrolled)', () => {
|
|
|
210
221
|
expect(result.current.currentValues).toEqual(['second value', 'third value'])
|
|
211
222
|
})
|
|
212
223
|
|
|
224
|
+
it('Replaces values on calling setValues', () => {
|
|
225
|
+
const { result } = renderHook(() =>
|
|
226
|
+
useMultipleInputValues({
|
|
227
|
+
initialValues: ['first value', 'second value', 'third value']
|
|
228
|
+
})
|
|
229
|
+
)
|
|
230
|
+
act(() => result.current.setValues(['new value', 'another value']))
|
|
231
|
+
expect(result.current.currentValues).toEqual(['new value', 'another value'])
|
|
232
|
+
})
|
|
233
|
+
|
|
234
|
+
it('Replaces values based on old values on passing function to setValues', () => {
|
|
235
|
+
const { result } = renderHook(() =>
|
|
236
|
+
useMultipleInputValues({
|
|
237
|
+
initialValues: [1, 2, 3, 4]
|
|
238
|
+
})
|
|
239
|
+
)
|
|
240
|
+
act(() => result.current.setValues((oldValues) => oldValues.map((value) => value + 1)))
|
|
241
|
+
expect(result.current.currentValues).toEqual([2, 3, 4, 5])
|
|
242
|
+
|
|
243
|
+
act(() => result.current.setValues((oldValues) => oldValues.map((value) => value + 2)))
|
|
244
|
+
expect(result.current.currentValues).toEqual([4, 5, 6, 7])
|
|
245
|
+
})
|
|
246
|
+
|
|
213
247
|
it('Empties values on calling unsetValues', () => {
|
|
214
248
|
const { result } = renderHook(() =>
|
|
215
249
|
useMultipleInputValues({
|
|
@@ -237,6 +271,18 @@ describe('useInputValue (controlled)', () => {
|
|
|
237
271
|
expect(onChange.mock.calls[0][0]).toEqual('second value')
|
|
238
272
|
})
|
|
239
273
|
|
|
274
|
+
it('Calls `onChange` with result from old value when `setValue` is passed a function', () => {
|
|
275
|
+
const onChange = jest.fn((arg) => arg)
|
|
276
|
+
const { result } = renderHook(() => useInputValue({ value: 1, onChange }))
|
|
277
|
+
expect(result.current.currentValue).toBe(1)
|
|
278
|
+
expect(onChange).toHaveBeenCalledTimes(0)
|
|
279
|
+
|
|
280
|
+
act(() => result.current.setValue((oldValue) => oldValue + 1))
|
|
281
|
+
expect(result.current.currentValue).toBe(1)
|
|
282
|
+
expect(onChange).toHaveBeenCalledTimes(1)
|
|
283
|
+
expect(onChange.mock.calls[0][0]).toEqual(2)
|
|
284
|
+
})
|
|
285
|
+
|
|
240
286
|
it('Returns updated `currentValue` when non-undefined `value` prop changes', () => {
|
|
241
287
|
const onChange = () => {}
|
|
242
288
|
const { result, rerender } = renderHook(({ value }) => useInputValue({ value, onChange }), {
|
|
@@ -296,6 +342,18 @@ describe('useMultipleInputValues (controlled)', () => {
|
|
|
296
342
|
expect(onChange.mock.calls[0][0]).toEqual(['second value', 'third value'])
|
|
297
343
|
})
|
|
298
344
|
|
|
345
|
+
it('Calls `onChange` with results from old values when `setValues` is passed a function', () => {
|
|
346
|
+
const onChange = jest.fn((arg) => arg)
|
|
347
|
+
const { result } = renderHook(() => useMultipleInputValues({ values: [1, 2, 3, 4], onChange }))
|
|
348
|
+
expect(result.current.currentValues).toEqual([1, 2, 3, 4])
|
|
349
|
+
expect(onChange).toHaveBeenCalledTimes(0)
|
|
350
|
+
|
|
351
|
+
act(() => result.current.setValues((oldValues) => oldValues.map((value) => value + 1)))
|
|
352
|
+
expect(result.current.currentValues).toEqual([1, 2, 3, 4])
|
|
353
|
+
expect(onChange).toHaveBeenCalledTimes(1)
|
|
354
|
+
expect(onChange.mock.calls[0][0]).toEqual([2, 3, 4, 5])
|
|
355
|
+
})
|
|
356
|
+
|
|
299
357
|
it('Calls onChange with an empty array on calling unsetValues', () => {
|
|
300
358
|
const onChange = jest.fn((arg) => arg)
|
|
301
359
|
const { result, rerender } = renderHook(
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Platform } from 'react-native'
|
|
2
|
+
|
|
3
|
+
import { getA11yPropsFromHtmlTag, tagsToRoles, supportedTags } from '../../src'
|
|
4
|
+
|
|
5
|
+
// Note that currently all tests run as ios so only native logic can be tested here
|
|
6
|
+
// until cross-platform tests are set up. See issue:
|
|
7
|
+
// https://github.com/telus/universal-design-system/issues/319
|
|
8
|
+
|
|
9
|
+
// As a temporary measure, there are tests on web-context HTML output for Box component
|
|
10
|
+
// in @telus-uds/ds-allium which test the actual output when the tags are rendered.
|
|
11
|
+
|
|
12
|
+
// These tests will therefore just test the values returned in a native context.
|
|
13
|
+
describe('getA11yPropsFromHtmlTag', () => {
|
|
14
|
+
it.each(Object.entries(tagsToRoles))(
|
|
15
|
+
'responds to tag "%s" with accessibilityRole "%s"',
|
|
16
|
+
(tag, role) => {
|
|
17
|
+
expect(getA11yPropsFromHtmlTag(tag)).toEqual({ accessibilityRole: role })
|
|
18
|
+
}
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
it.each([
|
|
22
|
+
[1, 'h1'],
|
|
23
|
+
[2, 'h2'],
|
|
24
|
+
[3, 'h3'],
|
|
25
|
+
[4, 'h4'],
|
|
26
|
+
[5, 'h5'],
|
|
27
|
+
[6, 'h6']
|
|
28
|
+
])('returns accessibility role "header" and level "%s" for header tag "%s"', (level, tag) => {
|
|
29
|
+
expect(getA11yPropsFromHtmlTag(tag)).toEqual({
|
|
30
|
+
accessibilityRole: 'header',
|
|
31
|
+
accessibilityLevel: level
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
if (Platform.OS !== 'web') {
|
|
36
|
+
it.each(supportedTags.map((tag) => [tag]))(
|
|
37
|
+
'responds to tag "%s" and an arbitrary nativeRole with given nativeRole override',
|
|
38
|
+
(tag) => {
|
|
39
|
+
expect(getA11yPropsFromHtmlTag(tag, 'link')).toEqual({ accessibilityRole: 'link' })
|
|
40
|
+
}
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
})
|
|
@@ -14,18 +14,29 @@ describe('useCopy hook', () => {
|
|
|
14
14
|
it('returns a correct english translation', () => {
|
|
15
15
|
const { result } = renderHook(() => useCopy({ dictionary, copy: 'en' }))
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
const getCopy = result.current
|
|
18
|
+
expect(getCopy('translation key')).toBe('english version')
|
|
18
19
|
})
|
|
19
20
|
|
|
20
21
|
it('returns a correct french translation', () => {
|
|
21
22
|
const { result } = renderHook(() => useCopy({ dictionary, copy: 'fr' }))
|
|
22
23
|
|
|
23
|
-
|
|
24
|
+
const getCopy = result.current
|
|
25
|
+
expect(getCopy('translation key')).toBe('french version')
|
|
24
26
|
})
|
|
25
27
|
|
|
26
28
|
it('returns undefined when no translation is found', () => {
|
|
27
29
|
const { result } = renderHook(() => useCopy({ dictionary, copy: 'en' }))
|
|
28
30
|
|
|
29
|
-
|
|
31
|
+
const getCopy = result.current
|
|
32
|
+
expect(getCopy('non-existing key')).toBe(undefined)
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it('allows for overriding the entire dictionary with a copy object (ignoring the dictionary argument)', () => {
|
|
36
|
+
const { result } = renderHook(() => useCopy({ dictionary, copy: dictionary.en }))
|
|
37
|
+
|
|
38
|
+
const getCopy = result.current
|
|
39
|
+
expect(getCopy('non-existing key')).toBe(undefined)
|
|
40
|
+
expect(getCopy('translation key')).toBe('english version')
|
|
30
41
|
})
|
|
31
42
|
})
|
package/babel.config.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
env: {
|
|
3
|
+
/*
|
|
4
|
+
* we actually want this setup to be used whenever we're not in `test` but
|
|
5
|
+
* babel merges plugins array rather than replacing so we can't set it as a
|
|
6
|
+
* default. However the default BABEL_ENV value is development (jest sets it
|
|
7
|
+
* to test)
|
|
8
|
+
*/
|
|
9
|
+
development: {
|
|
10
|
+
presets: ['@babel/preset-env', ['@babel/preset-react', { runtime: 'automatic' }]],
|
|
11
|
+
plugins: [['react-native-web', { commonjs: true }]]
|
|
12
|
+
},
|
|
13
|
+
/*
|
|
14
|
+
* jest is testing for just ios at the moment, use a preset which best matches that env
|
|
15
|
+
*/
|
|
16
|
+
test: {
|
|
17
|
+
presets: ['module:metro-react-native-babel-preset']
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
package/jest.config.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
const preset = require('react-native/jest-preset')
|
|
2
|
-
const
|
|
2
|
+
const name = require('./package.json').name.split('@telus-uds/').pop()
|
|
3
3
|
|
|
4
4
|
// cherry-pick the bits of the preset we want to avoid it overriding the fix we have on L14
|
|
5
5
|
module.exports = {
|
|
6
6
|
haste: preset.haste,
|
|
7
|
-
displayName
|
|
7
|
+
displayName: {
|
|
8
|
+
name,
|
|
9
|
+
color: 'blue'
|
|
10
|
+
},
|
|
8
11
|
setupFiles: preset.setupFiles,
|
|
9
12
|
transform: {
|
|
10
13
|
// Use babel-jest instead of react-native/jest/preprocessor.js so that the coverage report is correct as per:
|
|
@@ -21,7 +24,9 @@ module.exports = {
|
|
|
21
24
|
moduleNameMapper: {
|
|
22
25
|
'.+\\.(otf|svg|png|jpg)$': 'identity-obj-proxy'
|
|
23
26
|
},
|
|
24
|
-
transformIgnorePatterns:
|
|
27
|
+
transformIgnorePatterns: [
|
|
28
|
+
'node_modules/(?!(jest-)?react-native|@react-native|@react-native-community|@react-native-picker)'
|
|
29
|
+
],
|
|
25
30
|
// Count everything in src when calculating coverage
|
|
26
31
|
collectCoverageFrom: ['src/**/*.{js,jsx}']
|
|
27
32
|
}
|
|
@@ -1,58 +1,86 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useA11yInfo = exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
11
|
+
|
|
12
|
+
var _AccessibilityInfo = _interopRequireDefault(require("react-native-web/dist/cjs/exports/AccessibilityInfo"));
|
|
13
|
+
|
|
14
|
+
var _Platform = _interopRequireDefault(require("react-native-web/dist/cjs/exports/Platform"));
|
|
15
|
+
|
|
16
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
17
|
+
|
|
18
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
+
|
|
20
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
21
|
+
|
|
22
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
23
|
+
|
|
24
|
+
const ScreenReaderContext = /*#__PURE__*/(0, _react.createContext)(false);
|
|
25
|
+
const ReducedMotionContext = /*#__PURE__*/(0, _react.createContext)(false);
|
|
6
26
|
|
|
7
27
|
const A11yInfoProvider = ({
|
|
8
28
|
children
|
|
9
29
|
}) => {
|
|
10
|
-
const [reduceMotionEnabled, setReduceMotionEnabled] = useState(false);
|
|
11
|
-
const [screenReaderEnabled, setScreenReaderEnabled] = useState(false);
|
|
12
|
-
useEffect(() => {
|
|
30
|
+
const [reduceMotionEnabled, setReduceMotionEnabled] = (0, _react.useState)(false);
|
|
31
|
+
const [screenReaderEnabled, setScreenReaderEnabled] = (0, _react.useState)(false);
|
|
32
|
+
(0, _react.useEffect)(() => {
|
|
13
33
|
if (process.env.NODE_ENV === 'test') {
|
|
14
34
|
// On Jest these effects do nothing but can cause `act` state change warnings
|
|
15
35
|
// and "...after the Jest environment has been torn down" errors, so skip them.
|
|
16
36
|
return () => {};
|
|
17
37
|
}
|
|
18
38
|
|
|
19
|
-
|
|
20
|
-
|
|
39
|
+
_AccessibilityInfo.default.addEventListener('reduceMotionChanged', setReduceMotionEnabled);
|
|
40
|
+
|
|
41
|
+
_AccessibilityInfo.default.addEventListener('screenReaderChanged', setScreenReaderEnabled);
|
|
21
42
|
|
|
22
43
|
const setInitialA11yInfo = async () => {
|
|
23
|
-
const [initialReduceMotionEnabled, initialScreenReaderEnabled] = await Promise.all([
|
|
44
|
+
const [initialReduceMotionEnabled, initialScreenReaderEnabled] = await Promise.all([_AccessibilityInfo.default.isReduceMotionEnabled(), _AccessibilityInfo.default.isScreenReaderEnabled()]); // Browsers can't detect screen readers; in RNW isScreenReaderEnabled() is always `true`
|
|
24
45
|
// https://github.com/necolas/react-native-web/blob/master/packages/react-native-web/src/exports/AccessibilityInfo/index.js#L14
|
|
25
46
|
|
|
26
|
-
setScreenReaderEnabled(
|
|
47
|
+
setScreenReaderEnabled(_Platform.default.OS !== 'web' && !!initialScreenReaderEnabled); // RNW does support isReduceMotionEnabled looking for 'prefers-reduced-motion' state
|
|
27
48
|
|
|
28
49
|
setReduceMotionEnabled(!!initialReduceMotionEnabled);
|
|
29
50
|
};
|
|
30
51
|
|
|
31
|
-
if (
|
|
52
|
+
if (_AccessibilityInfo.default.isReduceMotionEnabled && _AccessibilityInfo.default.isScreenReaderEnabled) {
|
|
32
53
|
setInitialA11yInfo();
|
|
33
54
|
}
|
|
34
55
|
|
|
35
56
|
return () => {
|
|
36
|
-
|
|
37
|
-
|
|
57
|
+
_AccessibilityInfo.default.removeEventListener('reduceMotionChanged', setReduceMotionEnabled);
|
|
58
|
+
|
|
59
|
+
_AccessibilityInfo.default.removeEventListener('screenReaderChanged', setScreenReaderEnabled);
|
|
38
60
|
};
|
|
39
61
|
}, []);
|
|
40
|
-
return /*#__PURE__*/
|
|
41
|
-
value: reduceMotionEnabled
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
62
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(ReducedMotionContext.Provider, {
|
|
63
|
+
value: reduceMotionEnabled,
|
|
64
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(ScreenReaderContext.Provider, {
|
|
65
|
+
value: screenReaderEnabled,
|
|
66
|
+
children: children
|
|
67
|
+
})
|
|
68
|
+
});
|
|
45
69
|
};
|
|
46
70
|
|
|
47
71
|
A11yInfoProvider.propTypes = {
|
|
48
|
-
children:
|
|
72
|
+
children: _propTypes.default.node.isRequired
|
|
49
73
|
};
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
74
|
+
var _default = A11yInfoProvider;
|
|
75
|
+
exports.default = _default;
|
|
76
|
+
|
|
77
|
+
const useA11yInfo = () => {
|
|
78
|
+
const screenReaderEnabled = (0, _react.useContext)(ScreenReaderContext);
|
|
79
|
+
const reduceMotionEnabled = (0, _react.useContext)(ReducedMotionContext);
|
|
54
80
|
return {
|
|
55
81
|
reduceMotionEnabled,
|
|
56
82
|
screenReaderEnabled
|
|
57
83
|
};
|
|
58
|
-
};
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
exports.useA11yInfo = useA11yInfo;
|
package/lib/A11yText/index.js
CHANGED
|
@@ -1,39 +1,65 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _Platform = _interopRequireDefault(require("react-native-web/dist/cjs/exports/Platform"));
|
|
11
|
+
|
|
12
|
+
var _StyleSheet = _interopRequireDefault(require("react-native-web/dist/cjs/exports/StyleSheet"));
|
|
13
|
+
|
|
14
|
+
var _View = _interopRequireDefault(require("react-native-web/dist/cjs/exports/View"));
|
|
15
|
+
|
|
16
|
+
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
17
|
+
|
|
18
|
+
var _propTypes2 = require("../utils/propTypes");
|
|
19
|
+
|
|
20
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
21
|
+
|
|
22
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
|
+
|
|
24
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
25
|
+
|
|
26
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
27
|
+
|
|
5
28
|
/**
|
|
6
29
|
* A11yText is a zero-size invisible element that adds text to be read by screen readers.
|
|
7
30
|
*
|
|
8
31
|
* It should be used to add selectable screen-reader-only text to the main document flow,
|
|
9
32
|
* as a sibling to blocks of text like paragraphs and interactive elements like buttons.
|
|
10
33
|
*/
|
|
11
|
-
|
|
12
|
-
const A11yText = ({
|
|
34
|
+
const A11yText = /*#__PURE__*/(0, _react.forwardRef)(({
|
|
13
35
|
text,
|
|
14
36
|
heading,
|
|
15
37
|
...rest
|
|
16
|
-
}) => {
|
|
17
|
-
const a11y = a11yProps.select({
|
|
38
|
+
}, ref) => {
|
|
39
|
+
const a11y = _propTypes2.a11yProps.select({
|
|
18
40
|
// On iOS, needs `accessible` to be true to be focusable without non-a11y content.
|
|
19
41
|
// On Web, `accessible` causes RNW to set attributes that may make the element be treated as a group.
|
|
20
42
|
// On Android, may cause this to be skipped when with `<Text>` siblings in an `accessible` View,
|
|
21
43
|
// see https://github.com/facebook/react-native/issues/30851#issuecomment-790165489
|
|
22
|
-
accessible:
|
|
44
|
+
accessible: _Platform.default.OS === 'ios',
|
|
23
45
|
accessibilityLabel: text,
|
|
24
46
|
accessibilityRole: heading ? 'header' : 'text',
|
|
25
47
|
...rest
|
|
26
48
|
});
|
|
27
|
-
return /*#__PURE__*/React.createElement(View, Object.assign({
|
|
28
|
-
style: styles.invisible
|
|
29
|
-
}, a11y));
|
|
30
|
-
};
|
|
31
49
|
|
|
50
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
|
|
51
|
+
style: styles.invisible,
|
|
52
|
+
ref: ref,
|
|
53
|
+
...a11y
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
A11yText.displayName = 'A11yText';
|
|
32
57
|
A11yText.propTypes = {
|
|
33
|
-
text:
|
|
34
|
-
heading:
|
|
58
|
+
text: _propTypes.default.string.isRequired,
|
|
59
|
+
heading: _propTypes.default.bool
|
|
35
60
|
};
|
|
36
|
-
|
|
61
|
+
|
|
62
|
+
const styles = _StyleSheet.default.create({
|
|
37
63
|
invisible: {
|
|
38
64
|
// Without width or height it is not shown
|
|
39
65
|
minHeight: 1,
|
|
@@ -46,4 +72,6 @@ const styles = StyleSheet.create({
|
|
|
46
72
|
top: -1
|
|
47
73
|
}
|
|
48
74
|
});
|
|
49
|
-
|
|
75
|
+
|
|
76
|
+
var _default = A11yText;
|
|
77
|
+
exports.default = _default;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
|
|
10
|
+
var _shared = require("./shared");
|
|
11
|
+
|
|
12
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
13
|
+
|
|
14
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
15
|
+
|
|
16
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
17
|
+
|
|
18
|
+
const SVG_RADIUS = 20;
|
|
19
|
+
const SVG_CIRCUMFERENCE = SVG_RADIUS * 2 * Math.PI;
|
|
20
|
+
const MIN_SVG_LENGTH = _shared.MIN_STROKE_ANGLE / 360 * SVG_CIRCUMFERENCE;
|
|
21
|
+
const MAX_SVG_LENGTH = (1 - _shared.MIN_EMPTY_ANGLE / 360) * SVG_CIRCUMFERENCE;
|
|
22
|
+
const animationProps = {
|
|
23
|
+
begin: '0s',
|
|
24
|
+
dur: `${_shared.DURATION}ms`,
|
|
25
|
+
fill: 'freeze',
|
|
26
|
+
repeatCount: 'indefinite'
|
|
27
|
+
};
|
|
28
|
+
const bezierProps = {
|
|
29
|
+
calcMode: 'spline',
|
|
30
|
+
keyTimes: '0; 0.5; 1',
|
|
31
|
+
keySplines: `${_shared.BEZIER.join(', ')} ; ${_shared.BEZIER.join(', ')}`
|
|
32
|
+
}; // We're using svg rather than css here to define the animation to avoid needing to introduce css injection mechanism
|
|
33
|
+
// It's possible to replicate this functionality with RNW animations, but it snags on chrome at least, see https://github.com/telus/universal-design-system/pull/477 for details.
|
|
34
|
+
|
|
35
|
+
const Spinner = /*#__PURE__*/(0, _react.forwardRef)(({
|
|
36
|
+
size,
|
|
37
|
+
color,
|
|
38
|
+
thickness,
|
|
39
|
+
label
|
|
40
|
+
}, ref) => /*#__PURE__*/(0, _jsxRuntime.jsx)("svg", {
|
|
41
|
+
ref: ref,
|
|
42
|
+
width: `${size}px`,
|
|
43
|
+
height: `${size}px`,
|
|
44
|
+
viewBox: "0 0 48 48",
|
|
45
|
+
"aria-valuetext": label,
|
|
46
|
+
role: "progressbar",
|
|
47
|
+
"aria-busy": true,
|
|
48
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("g", {
|
|
49
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("animateTransform", {
|
|
50
|
+
attributeName: "transform",
|
|
51
|
+
type: "rotate",
|
|
52
|
+
values: `-180 24 24;${360 + _shared.MIN_STROKE_ANGLE - 180} 24 24`,
|
|
53
|
+
...animationProps
|
|
54
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)("circle", {
|
|
55
|
+
fill: "none",
|
|
56
|
+
stroke: color,
|
|
57
|
+
strokeWidth: thickness * 48 / size,
|
|
58
|
+
strokeLinecap: "round",
|
|
59
|
+
cx: "24",
|
|
60
|
+
cy: "24",
|
|
61
|
+
r: "20",
|
|
62
|
+
strokeDasharray: [MIN_SVG_LENGTH, SVG_CIRCUMFERENCE],
|
|
63
|
+
strokeDashoffset: 0,
|
|
64
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("animate", {
|
|
65
|
+
attributeName: "stroke-dashoffset",
|
|
66
|
+
values: `0;-10;${MIN_SVG_LENGTH - SVG_CIRCUMFERENCE}`,
|
|
67
|
+
...animationProps,
|
|
68
|
+
...bezierProps
|
|
69
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("animate", {
|
|
70
|
+
attributeName: "stroke-dasharray",
|
|
71
|
+
values: `${MIN_SVG_LENGTH}, 200;${MAX_SVG_LENGTH}, 200;${MIN_SVG_LENGTH}, 200`,
|
|
72
|
+
...animationProps,
|
|
73
|
+
...bezierProps
|
|
74
|
+
})]
|
|
75
|
+
})]
|
|
76
|
+
})
|
|
77
|
+
}));
|
|
78
|
+
Spinner.displayName = 'Spinner';
|
|
79
|
+
Spinner.propTypes = _shared.propTypes;
|
|
80
|
+
var _default = Spinner;
|
|
81
|
+
exports.default = _default;
|