@telus-uds/components-base 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +5 -2
- package/CHANGELOG.json +38 -0
- package/CHANGELOG.md +15 -2
- package/__tests__/ActivityIndicator/ActivityIndicator.test.jsx +35 -0
- package/__tests__/ActivityIndicator/__snapshots__/ActivityIndicator.test.jsx.snap +287 -0
- package/babel.config.js +27 -5
- package/component-docs.json +88 -424
- package/lib/A11yText/index.js +5 -4
- package/lib/ActivityIndicator/Spinner.js +46 -37
- package/lib/ActivityIndicator/Spinner.native.js +26 -15
- package/lib/Box/Box.js +4 -4
- package/lib/Button/ButtonBase.js +7 -8
- package/lib/Card/Card.js +5 -4
- package/lib/Card/PressableCardBase.js +6 -11
- package/lib/Checkbox/Checkbox.js +4 -6
- package/lib/Divider/Divider.js +12 -11
- package/lib/ExpandCollapse/Control.js +7 -7
- package/lib/ExpandCollapse/ExpandCollapse.js +6 -2
- package/lib/ExpandCollapse/Panel.js +6 -7
- package/lib/Feedback/Feedback.js +6 -5
- package/lib/Fieldset/Fieldset.js +1 -3
- package/lib/HorizontalScroll/HorizontalScroll.js +5 -6
- package/lib/IconButton/IconButton.js +6 -6
- package/lib/InputLabel/InputLabel.js +7 -2
- package/lib/InputSupports/InputSupports.js +2 -2
- package/lib/Link/LinkBase.js +5 -6
- package/lib/List/List.js +4 -6
- package/lib/List/ListItem.js +6 -2
- package/lib/Modal/Modal.js +6 -2
- package/lib/Notification/Notification.js +7 -2
- package/lib/Pagination/Pagination.js +8 -3
- package/lib/Progress/Progress.js +5 -4
- package/lib/Progress/ProgressBar.js +8 -7
- package/lib/Radio/Radio.js +4 -6
- package/lib/Radio/RadioButton.js +6 -3
- package/lib/Radio/RadioGroup.js +7 -2
- package/lib/RadioCard/RadioCard.js +4 -4
- package/lib/RadioCard/RadioCardGroup.js +9 -6
- package/lib/Search/Search.js +7 -2
- package/lib/Select/Select.js +10 -9
- package/lib/SideNav/Item.js +7 -7
- package/lib/SideNav/SideNav.js +7 -3
- package/lib/Skeleton/Skeleton.js +6 -2
- package/lib/Spacer/Spacer.js +7 -18
- package/lib/StackView/StackView.js +7 -7
- package/lib/StackView/StackWrapBox.js +6 -7
- package/lib/StackView/StackWrapGap.js +6 -5
- package/lib/StepTracker/Step.js +7 -3
- package/lib/StepTracker/StepTracker.js +7 -7
- package/lib/Tabs/Tabs.js +6 -2
- package/lib/Tabs/TabsItem.js +6 -5
- package/lib/Tags/Tags.js +5 -6
- package/lib/TextInput/TextArea.js +13 -14
- package/lib/TextInput/TextInput.js +13 -14
- package/lib/TextInput/TextInputBase.js +5 -3
- package/lib/ToggleSwitch/ToggleSwitch.js +10 -9
- package/lib/ToggleSwitch/ToggleSwitchGroup.js +5 -7
- package/lib/Tooltip/Tooltip.js +7 -2
- package/lib/TooltipButton/TooltipButton.js +7 -2
- package/lib/Typography/Typography.js +8 -6
- package/lib/index.js +7 -0
- package/lib/utils/children.js +5 -1
- package/lib/utils/index.js +14 -0
- package/lib/utils/props/index.js +9 -0
- package/lib/{InputSupports/propTypes.js → utils/props/inputSupportsProps.js} +2 -3
- package/lib/utils/ssr.js +51 -0
- package/lib-module/A11yInfoProvider/index.js +62 -0
- package/lib-module/A11yText/index.js +55 -0
- package/lib-module/ActivityIndicator/Spinner.js +76 -0
- package/lib-module/ActivityIndicator/Spinner.native.js +143 -0
- package/lib-module/ActivityIndicator/index.js +40 -0
- package/lib-module/ActivityIndicator/shared.js +12 -0
- package/lib-module/BaseProvider/index.js +26 -0
- package/lib-module/Box/Box.js +243 -0
- package/lib-module/Box/index.js +2 -0
- package/lib-module/Button/Button.js +25 -0
- package/lib-module/Button/ButtonBase.js +254 -0
- package/lib-module/Button/ButtonGroup.js +164 -0
- package/lib-module/Button/ButtonLink.js +39 -0
- package/lib-module/Button/index.js +4 -0
- package/lib-module/Button/propTypes.js +36 -0
- package/lib-module/Card/Card.js +83 -0
- package/lib-module/Card/CardBase.js +62 -0
- package/lib-module/Card/PressableCardBase.js +113 -0
- package/lib-module/Card/index.js +4 -0
- package/lib-module/Checkbox/Checkbox.js +321 -0
- package/lib-module/Checkbox/CheckboxGroup.js +218 -0
- package/lib-module/Checkbox/CheckboxInput.js +58 -0
- package/lib-module/Checkbox/CheckboxInput.native.js +6 -0
- package/lib-module/Checkbox/index.js +3 -0
- package/lib-module/Divider/Divider.js +123 -0
- package/lib-module/Divider/index.js +2 -0
- package/lib-module/ExpandCollapse/Accordion.js +15 -0
- package/lib-module/ExpandCollapse/Control.js +130 -0
- package/lib-module/ExpandCollapse/ExpandCollapse.js +94 -0
- package/lib-module/ExpandCollapse/Panel.js +158 -0
- package/lib-module/ExpandCollapse/index.js +7 -0
- package/lib-module/Feedback/Feedback.js +144 -0
- package/lib-module/Feedback/index.js +2 -0
- package/lib-module/Fieldset/Fieldset.js +145 -0
- package/lib-module/Fieldset/FieldsetContainer.js +29 -0
- package/lib-module/Fieldset/FieldsetContainer.native.js +20 -0
- package/lib-module/Fieldset/Legend.js +21 -0
- package/lib-module/Fieldset/Legend.native.js +28 -0
- package/lib-module/Fieldset/cssReset.js +14 -0
- package/lib-module/Fieldset/index.js +2 -0
- package/lib-module/FlexGrid/Col/Col.js +265 -0
- package/lib-module/FlexGrid/Col/index.js +2 -0
- package/lib-module/FlexGrid/FlexGrid.js +147 -0
- package/lib-module/FlexGrid/Row/Row.js +177 -0
- package/lib-module/FlexGrid/Row/index.js +2 -0
- package/lib-module/FlexGrid/helpers/index.js +18 -0
- package/lib-module/FlexGrid/index.js +2 -0
- package/lib-module/FlexGrid/providers/GutterContext.js +3 -0
- package/lib-module/HorizontalScroll/HorizontalScroll.js +171 -0
- package/lib-module/HorizontalScroll/HorizontalScrollButton.js +102 -0
- package/lib-module/HorizontalScroll/ScrollViewEnd.js +47 -0
- package/lib-module/HorizontalScroll/ScrollViewEnd.native.js +24 -0
- package/lib-module/HorizontalScroll/dictionary.js +11 -0
- package/lib-module/HorizontalScroll/index.js +11 -0
- package/lib-module/HorizontalScroll/itemPositions.js +106 -0
- package/lib-module/Icon/Icon.js +61 -0
- package/lib-module/Icon/IconText.js +81 -0
- package/lib-module/Icon/index.js +4 -0
- package/lib-module/IconButton/IconButton.js +115 -0
- package/lib-module/IconButton/index.js +2 -0
- package/lib-module/InputLabel/InputLabel.js +131 -0
- package/lib-module/InputLabel/LabelContent.js +24 -0
- package/lib-module/InputLabel/LabelContent.native.js +16 -0
- package/lib-module/InputLabel/index.js +2 -0
- package/lib-module/InputSupports/InputSupports.js +88 -0
- package/lib-module/InputSupports/index.js +2 -0
- package/lib-module/InputSupports/useInputSupports.js +31 -0
- package/lib-module/Link/ChevronLink.js +51 -0
- package/lib-module/Link/InlinePressable.js +37 -0
- package/lib-module/Link/InlinePressable.native.js +85 -0
- package/lib-module/Link/Link.js +27 -0
- package/lib-module/Link/LinkBase.js +210 -0
- package/lib-module/Link/TextButton.js +43 -0
- package/lib-module/Link/index.js +5 -0
- package/lib-module/List/List.js +55 -0
- package/lib-module/List/ListItem.js +213 -0
- package/lib-module/List/index.js +5 -0
- package/lib-module/Modal/Modal.js +208 -0
- package/lib-module/Modal/dictionary.js +9 -0
- package/lib-module/Modal/index.js +2 -0
- package/lib-module/Notification/Notification.js +196 -0
- package/lib-module/Notification/dictionary.js +8 -0
- package/lib-module/Notification/index.js +2 -0
- package/lib-module/Pagination/PageButton.js +65 -0
- package/lib-module/Pagination/Pagination.js +140 -0
- package/lib-module/Pagination/SideButton.js +103 -0
- package/lib-module/Pagination/dictionary.js +18 -0
- package/lib-module/Pagination/index.js +2 -0
- package/lib-module/Pagination/usePagination.js +72 -0
- package/lib-module/Progress/Progress.js +85 -0
- package/lib-module/Progress/ProgressBar.js +134 -0
- package/lib-module/Progress/ProgressBarBackground.js +41 -0
- package/lib-module/Progress/index.js +4 -0
- package/lib-module/Radio/Radio.js +263 -0
- package/lib-module/Radio/RadioButton.js +128 -0
- package/lib-module/Radio/RadioGroup.js +225 -0
- package/lib-module/Radio/RadioInput.js +60 -0
- package/lib-module/Radio/RadioInput.native.js +6 -0
- package/lib-module/Radio/index.js +3 -0
- package/lib-module/RadioCard/RadioCard.js +218 -0
- package/lib-module/RadioCard/RadioCardGroup.js +232 -0
- package/lib-module/RadioCard/index.js +3 -0
- package/lib-module/Search/Search.js +233 -0
- package/lib-module/Search/dictionary.js +12 -0
- package/lib-module/Search/index.js +2 -0
- package/lib-module/Select/Group.js +20 -0
- package/lib-module/Select/Group.native.js +14 -0
- package/lib-module/Select/Item.js +17 -0
- package/lib-module/Select/Item.native.js +9 -0
- package/lib-module/Select/Picker.js +67 -0
- package/lib-module/Select/Picker.native.js +110 -0
- package/lib-module/Select/Select.js +317 -0
- package/lib-module/Select/index.js +6 -0
- package/lib-module/SideNav/Item.js +139 -0
- package/lib-module/SideNav/ItemContent.js +45 -0
- package/lib-module/SideNav/ItemsGroup.js +115 -0
- package/lib-module/SideNav/SideNav.js +133 -0
- package/lib-module/SideNav/index.js +1 -0
- package/lib-module/Skeleton/Skeleton.js +117 -0
- package/lib-module/Skeleton/index.js +2 -0
- package/lib-module/Skeleton/skeleton.constant.js +3 -0
- package/lib-module/Skeleton/skeletonWebAnimation.js +18 -0
- package/lib-module/Skeleton/useSkeletonNativeAnimation.js +24 -0
- package/lib-module/Spacer/Spacer.js +97 -0
- package/lib-module/Spacer/index.js +2 -0
- package/lib-module/StackView/StackView.js +124 -0
- package/lib-module/StackView/StackWrap.js +48 -0
- package/lib-module/StackView/StackWrap.native.js +3 -0
- package/lib-module/StackView/StackWrapBox.js +114 -0
- package/lib-module/StackView/StackWrapGap.js +58 -0
- package/lib-module/StackView/common.js +32 -0
- package/lib-module/StackView/getStackedContent.js +123 -0
- package/lib-module/StackView/index.js +5 -0
- package/lib-module/StepTracker/Step.js +229 -0
- package/lib-module/StepTracker/StepTracker.js +175 -0
- package/lib-module/StepTracker/dictionary.js +10 -0
- package/lib-module/StepTracker/index.js +2 -0
- package/lib-module/Tabs/Tabs.js +113 -0
- package/lib-module/Tabs/TabsItem.js +215 -0
- package/lib-module/Tabs/index.js +2 -0
- package/lib-module/Tags/Tags.js +238 -0
- package/lib-module/Tags/index.js +2 -0
- package/lib-module/TextInput/TextArea.js +88 -0
- package/lib-module/TextInput/TextInput.js +60 -0
- package/lib-module/TextInput/TextInputBase.js +233 -0
- package/lib-module/TextInput/index.js +3 -0
- package/lib-module/TextInput/propTypes.js +31 -0
- package/lib-module/ThemeProvider/ThemeProvider.js +35 -0
- package/lib-module/ThemeProvider/index.js +6 -0
- package/lib-module/ThemeProvider/useSetTheme.js +22 -0
- package/lib-module/ThemeProvider/useTheme.js +14 -0
- package/lib-module/ThemeProvider/useThemeTokens.js +105 -0
- package/lib-module/ThemeProvider/utils/index.js +2 -0
- package/lib-module/ThemeProvider/utils/styles.js +174 -0
- package/lib-module/ThemeProvider/utils/theme-tokens.js +151 -0
- package/lib-module/ToggleSwitch/ToggleSwitch.js +224 -0
- package/lib-module/ToggleSwitch/ToggleSwitchGroup.js +202 -0
- package/lib-module/ToggleSwitch/index.js +3 -0
- package/lib-module/Tooltip/Backdrop.js +52 -0
- package/lib-module/Tooltip/Backdrop.native.js +43 -0
- package/lib-module/Tooltip/Tooltip.js +332 -0
- package/lib-module/Tooltip/dictionary.js +8 -0
- package/lib-module/Tooltip/getTooltipPosition.js +164 -0
- package/lib-module/Tooltip/index.js +2 -0
- package/lib-module/TooltipButton/TooltipButton.js +71 -0
- package/lib-module/TooltipButton/index.js +2 -0
- package/lib-module/Typography/Typography.js +118 -0
- package/lib-module/Typography/index.js +2 -0
- package/lib-module/ViewportProvider/ViewportProvider.js +28 -0
- package/lib-module/ViewportProvider/index.js +3 -0
- package/lib-module/ViewportProvider/useViewport.js +3 -0
- package/lib-module/ViewportProvider/useViewportListener.js +43 -0
- package/lib-module/index.js +48 -0
- package/lib-module/utils/a11y/index.js +2 -0
- package/lib-module/utils/a11y/semantics.js +154 -0
- package/lib-module/utils/a11y/textSize.js +34 -0
- package/lib-module/utils/animation/index.js +2 -0
- package/lib-module/utils/animation/useVerticalExpandAnimation.js +49 -0
- package/lib-module/utils/children.js +118 -0
- package/lib-module/utils/index.js +15 -0
- package/lib-module/utils/info/index.js +7 -0
- package/lib-module/utils/info/platform/index.js +11 -0
- package/lib-module/utils/info/platform/platform.android.js +1 -0
- package/lib-module/utils/info/platform/platform.ios.js +1 -0
- package/lib-module/utils/info/platform/platform.js +1 -0
- package/lib-module/utils/info/platform/platform.native.js +4 -0
- package/lib-module/utils/info/versions.js +5 -0
- package/lib-module/utils/input.js +180 -0
- package/lib-module/utils/pressability.js +97 -0
- package/lib-module/utils/props/a11yProps.js +140 -0
- package/lib-module/utils/props/clickProps.js +25 -0
- package/lib-module/utils/props/componentPropType.js +63 -0
- package/lib-module/utils/props/copyPropTypes.js +2 -0
- package/lib-module/utils/props/getPropSelector.js +6 -0
- package/lib-module/utils/props/hrefAttrsProp.js +30 -0
- package/lib-module/utils/props/index.js +16 -0
- package/lib-module/utils/props/inputSupportsProps.js +54 -0
- package/lib-module/utils/props/linkProps.js +47 -0
- package/lib-module/utils/props/paddingProp.js +9 -0
- package/lib-module/utils/props/pressProps.js +42 -0
- package/lib-module/utils/props/rectProp.js +9 -0
- package/lib-module/utils/props/responsiveProps.js +30 -0
- package/lib-module/utils/props/selectSystemProps.js +24 -0
- package/lib-module/utils/props/spacingProps.js +56 -0
- package/lib-module/utils/props/tokens.js +120 -0
- package/lib-module/utils/props/variantProp.js +18 -0
- package/lib-module/utils/props/viewProps.js +22 -0
- package/lib-module/utils/ssr.js +35 -0
- package/lib-module/utils/useCopy.js +42 -0
- package/lib-module/utils/useHash.js +44 -0
- package/lib-module/utils/useHash.native.js +7 -0
- package/lib-module/utils/useResponsiveProp.js +47 -0
- package/lib-module/utils/useSpacingScale.js +123 -0
- package/lib-module/utils/useUniqueId.js +12 -0
- package/lib-module/utils/withLinkRouter.js +82 -0
- package/package.json +9 -5
- package/src/A11yText/index.jsx +7 -3
- package/src/ActivityIndicator/Spinner.jsx +56 -44
- package/src/ActivityIndicator/Spinner.native.jsx +20 -12
- package/src/Box/Box.jsx +10 -9
- package/src/Button/ButtonBase.jsx +9 -8
- package/src/Card/Card.jsx +7 -4
- package/src/Card/PressableCardBase.jsx +12 -12
- package/src/Checkbox/Checkbox.jsx +12 -5
- package/src/Divider/Divider.jsx +17 -10
- package/src/ExpandCollapse/Control.jsx +12 -7
- package/src/ExpandCollapse/ExpandCollapse.jsx +13 -3
- package/src/ExpandCollapse/Panel.jsx +15 -5
- package/src/Feedback/Feedback.jsx +13 -3
- package/src/Fieldset/Fieldset.jsx +1 -1
- package/src/HorizontalScroll/HorizontalScroll.jsx +12 -5
- package/src/IconButton/IconButton.jsx +12 -8
- package/src/InputLabel/InputLabel.jsx +16 -2
- package/src/InputSupports/InputSupports.jsx +1 -1
- package/src/Link/LinkBase.jsx +10 -9
- package/src/List/List.jsx +12 -5
- package/src/List/ListItem.jsx +16 -2
- package/src/Modal/Modal.jsx +63 -50
- package/src/Notification/Notification.jsx +17 -3
- package/src/Pagination/Pagination.jsx +10 -3
- package/src/Progress/Progress.jsx +5 -3
- package/src/Progress/ProgressBar.jsx +8 -6
- package/src/Radio/Radio.jsx +13 -5
- package/src/Radio/RadioButton.jsx +13 -3
- package/src/Radio/RadioGroup.jsx +14 -2
- package/src/RadioCard/RadioCard.jsx +9 -6
- package/src/RadioCard/RadioCardGroup.jsx +16 -4
- package/src/Search/Search.jsx +15 -3
- package/src/Select/Select.jsx +21 -7
- package/src/SideNav/Item.jsx +15 -7
- package/src/SideNav/SideNav.jsx +13 -2
- package/src/Skeleton/Skeleton.jsx +55 -43
- package/src/Spacer/Spacer.jsx +8 -16
- package/src/StackView/StackView.jsx +13 -12
- package/src/StackView/StackWrapBox.jsx +12 -12
- package/src/StackView/StackWrapGap.jsx +9 -7
- package/src/StepTracker/Step.jsx +7 -4
- package/src/StepTracker/StepTracker.jsx +8 -8
- package/src/Tabs/Tabs.jsx +16 -3
- package/src/Tabs/TabsItem.jsx +13 -9
- package/src/Tags/Tags.jsx +20 -5
- package/src/TextInput/TextArea.jsx +20 -8
- package/src/TextInput/TextInput.jsx +20 -8
- package/src/TextInput/TextInputBase.jsx +13 -3
- package/src/ToggleSwitch/ToggleSwitch.jsx +16 -5
- package/src/ToggleSwitch/ToggleSwitchGroup.jsx +14 -6
- package/src/Tooltip/Tooltip.jsx +13 -3
- package/src/TooltipButton/TooltipButton.jsx +6 -4
- package/src/Typography/Typography.jsx +10 -6
- package/src/index.js +1 -1
- package/src/utils/children.jsx +2 -1
- package/src/utils/index.js +1 -0
- package/src/utils/props/index.js +1 -0
- package/src/{InputSupports/propTypes.js → utils/props/inputSupportsProps.js} +2 -4
- package/src/utils/ssr.js +35 -0
- package/release-context.json +0 -7
package/lib/utils/ssr.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getSSRStyles = exports.getReactNativeWebSSRStyles = void 0;
|
|
7
|
+
|
|
8
|
+
var _AppRegistry = _interopRequireDefault(require("react-native-web/dist/cjs/exports/AppRegistry"));
|
|
9
|
+
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
+
|
|
12
|
+
/** @typedef {import('react').ComponentType} ReactComponent */
|
|
13
|
+
|
|
14
|
+
/** @typedef {import('react').ReactElement} ReactElement */
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Registers the app's root component with React Native Web and generates
|
|
18
|
+
* the main <style> tag containing React Native Web stylesheet styles.
|
|
19
|
+
*
|
|
20
|
+
* @param {ReactComponent} AppRoot
|
|
21
|
+
* @param {string} [appName]
|
|
22
|
+
* @returns {ReactElement[]}
|
|
23
|
+
*/
|
|
24
|
+
const getReactNativeWebSSRStyles = (AppRoot, appName = 'app') => {
|
|
25
|
+
_AppRegistry.default.registerComponent(appName, () => AppRoot);
|
|
26
|
+
|
|
27
|
+
const {
|
|
28
|
+
getStyleElement
|
|
29
|
+
} = _AppRegistry.default.getApplication(appName);
|
|
30
|
+
|
|
31
|
+
return [getStyleElement()];
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Gets style tags for each currently supported CSS-in-JS library and returns
|
|
35
|
+
* them alongside any existing style tags.
|
|
36
|
+
*
|
|
37
|
+
* @param {ReactComponent} AppRoot
|
|
38
|
+
* @param {string} [appName]
|
|
39
|
+
* @param {ReactElement[]} [existingStyles]
|
|
40
|
+
* @returns {ReactElement[]}
|
|
41
|
+
*/
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
exports.getReactNativeWebSSRStyles = getReactNativeWebSSRStyles;
|
|
45
|
+
|
|
46
|
+
const getSSRStyles = (AppRoot, appName = 'app', existingStyles = []) => {
|
|
47
|
+
return [...existingStyles, ...getReactNativeWebSSRStyles(AppRoot, appName) // if any other CSS-in-JS is added e.g. styled-components generate and add its styles here
|
|
48
|
+
];
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
exports.getSSRStyles = getSSRStyles;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import React, { createContext, useContext, useEffect, useState } from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import AccessibilityInfo from "react-native-web/dist/exports/AccessibilityInfo";
|
|
4
|
+
import Platform from "react-native-web/dist/exports/Platform";
|
|
5
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
6
|
+
const ScreenReaderContext = /*#__PURE__*/createContext(false);
|
|
7
|
+
const ReducedMotionContext = /*#__PURE__*/createContext(false);
|
|
8
|
+
|
|
9
|
+
const A11yInfoProvider = ({
|
|
10
|
+
children
|
|
11
|
+
}) => {
|
|
12
|
+
const [reduceMotionEnabled, setReduceMotionEnabled] = useState(false);
|
|
13
|
+
const [screenReaderEnabled, setScreenReaderEnabled] = useState(false);
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
if (process.env.NODE_ENV === 'test') {
|
|
16
|
+
// On Jest these effects do nothing but can cause `act` state change warnings
|
|
17
|
+
// and "...after the Jest environment has been torn down" errors, so skip them.
|
|
18
|
+
return () => {};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
AccessibilityInfo.addEventListener('reduceMotionChanged', setReduceMotionEnabled);
|
|
22
|
+
AccessibilityInfo.addEventListener('screenReaderChanged', setScreenReaderEnabled);
|
|
23
|
+
|
|
24
|
+
const setInitialA11yInfo = async () => {
|
|
25
|
+
const [initialReduceMotionEnabled, initialScreenReaderEnabled] = await Promise.all([AccessibilityInfo.isReduceMotionEnabled(), AccessibilityInfo.isScreenReaderEnabled()]); // Browsers can't detect screen readers; in RNW isScreenReaderEnabled() is always `true`
|
|
26
|
+
// https://github.com/necolas/react-native-web/blob/master/packages/react-native-web/src/exports/AccessibilityInfo/index.js#L14
|
|
27
|
+
|
|
28
|
+
setScreenReaderEnabled(Platform.OS !== 'web' && !!initialScreenReaderEnabled); // RNW does support isReduceMotionEnabled looking for 'prefers-reduced-motion' state
|
|
29
|
+
|
|
30
|
+
setReduceMotionEnabled(!!initialReduceMotionEnabled);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
if (AccessibilityInfo.isReduceMotionEnabled && AccessibilityInfo.isScreenReaderEnabled) {
|
|
34
|
+
setInitialA11yInfo();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return () => {
|
|
38
|
+
AccessibilityInfo.removeEventListener('reduceMotionChanged', setReduceMotionEnabled);
|
|
39
|
+
AccessibilityInfo.removeEventListener('screenReaderChanged', setScreenReaderEnabled);
|
|
40
|
+
};
|
|
41
|
+
}, []);
|
|
42
|
+
return /*#__PURE__*/_jsx(ReducedMotionContext.Provider, {
|
|
43
|
+
value: reduceMotionEnabled,
|
|
44
|
+
children: /*#__PURE__*/_jsx(ScreenReaderContext.Provider, {
|
|
45
|
+
value: screenReaderEnabled,
|
|
46
|
+
children: children
|
|
47
|
+
})
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
A11yInfoProvider.propTypes = {
|
|
52
|
+
children: PropTypes.node.isRequired
|
|
53
|
+
};
|
|
54
|
+
export default A11yInfoProvider;
|
|
55
|
+
export const useA11yInfo = () => {
|
|
56
|
+
const screenReaderEnabled = useContext(ScreenReaderContext);
|
|
57
|
+
const reduceMotionEnabled = useContext(ReducedMotionContext);
|
|
58
|
+
return {
|
|
59
|
+
reduceMotionEnabled,
|
|
60
|
+
screenReaderEnabled
|
|
61
|
+
};
|
|
62
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
|
+
import Platform from "react-native-web/dist/exports/Platform";
|
|
3
|
+
import StyleSheet from "react-native-web/dist/exports/StyleSheet";
|
|
4
|
+
import View from "react-native-web/dist/exports/View";
|
|
5
|
+
import PropTypes from 'prop-types';
|
|
6
|
+
import { a11yProps, selectSystemProps, viewProps } from '../utils/props';
|
|
7
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
8
|
+
const [selectProps, selectedSystemPropTypes] = selectSystemProps([a11yProps, viewProps]);
|
|
9
|
+
/**
|
|
10
|
+
* A11yText is a zero-size invisible element that adds text to be read by screen readers.
|
|
11
|
+
*
|
|
12
|
+
* It should be used to add selectable screen-reader-only text to the main document flow,
|
|
13
|
+
* as a sibling to blocks of text like paragraphs and interactive elements like buttons.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const A11yText = /*#__PURE__*/forwardRef(({
|
|
17
|
+
text,
|
|
18
|
+
heading,
|
|
19
|
+
...rest
|
|
20
|
+
}, ref) => {
|
|
21
|
+
const selectedProps = selectProps({
|
|
22
|
+
// On iOS, needs `accessible` to be true to be focusable without non-a11y content.
|
|
23
|
+
// On Web, `accessible` causes RNW to set attributes that may make the element be treated as a group.
|
|
24
|
+
// On Android, may cause this to be skipped when with `<Text>` siblings in an `accessible` View,
|
|
25
|
+
// see https://github.com/facebook/react-native/issues/30851#issuecomment-790165489
|
|
26
|
+
accessible: Platform.OS === 'ios',
|
|
27
|
+
accessibilityLabel: text,
|
|
28
|
+
accessibilityRole: heading ? 'header' : 'text',
|
|
29
|
+
...rest
|
|
30
|
+
});
|
|
31
|
+
return /*#__PURE__*/_jsx(View, {
|
|
32
|
+
style: styles.invisible,
|
|
33
|
+
ref: ref,
|
|
34
|
+
...selectedProps
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
A11yText.displayName = 'A11yText';
|
|
38
|
+
A11yText.propTypes = { ...selectedSystemPropTypes,
|
|
39
|
+
text: PropTypes.string.isRequired,
|
|
40
|
+
heading: PropTypes.bool
|
|
41
|
+
};
|
|
42
|
+
const styles = StyleSheet.create({
|
|
43
|
+
invisible: {
|
|
44
|
+
// Without width or height it is not shown
|
|
45
|
+
minHeight: 1,
|
|
46
|
+
minWidth: 1,
|
|
47
|
+
// Ensures it doesn't occupy space
|
|
48
|
+
// position: 'absolute' causes it to be read first in its container
|
|
49
|
+
marginEnd: -1,
|
|
50
|
+
marginBottom: -1,
|
|
51
|
+
// Ensures it is in the correct position on Native
|
|
52
|
+
top: -1
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
export default A11yText;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
|
+
import { DURATION, MIN_EMPTY_ANGLE, MIN_STROKE_ANGLE, BEZIER, propTypes } from './shared';
|
|
3
|
+
import { useA11yInfo } from '../A11yInfoProvider';
|
|
4
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
5
|
+
import { Fragment as _Fragment } from "react/jsx-runtime";
|
|
6
|
+
import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
7
|
+
const SVG_RADIUS = 20;
|
|
8
|
+
const SVG_CIRCUMFERENCE = SVG_RADIUS * 2 * Math.PI;
|
|
9
|
+
const MIN_SVG_LENGTH = MIN_STROKE_ANGLE / 360 * SVG_CIRCUMFERENCE;
|
|
10
|
+
const MAX_SVG_LENGTH = (1 - MIN_EMPTY_ANGLE / 360) * SVG_CIRCUMFERENCE;
|
|
11
|
+
const animationProps = {
|
|
12
|
+
begin: '0s',
|
|
13
|
+
dur: `${DURATION}ms`,
|
|
14
|
+
fill: 'freeze',
|
|
15
|
+
repeatCount: 'indefinite'
|
|
16
|
+
};
|
|
17
|
+
const bezierProps = {
|
|
18
|
+
calcMode: 'spline',
|
|
19
|
+
keyTimes: '0; 0.5; 1',
|
|
20
|
+
keySplines: `${BEZIER.join(', ')} ; ${BEZIER.join(', ')}`
|
|
21
|
+
}; // We're using svg rather than css here to define the animation to avoid needing to introduce css injection mechanism
|
|
22
|
+
// 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.
|
|
23
|
+
|
|
24
|
+
const Spinner = /*#__PURE__*/forwardRef(({
|
|
25
|
+
size,
|
|
26
|
+
color,
|
|
27
|
+
thickness,
|
|
28
|
+
label
|
|
29
|
+
}, ref) => {
|
|
30
|
+
const {
|
|
31
|
+
reduceMotionEnabled
|
|
32
|
+
} = useA11yInfo();
|
|
33
|
+
return /*#__PURE__*/_jsx("svg", {
|
|
34
|
+
ref: ref,
|
|
35
|
+
width: `${size}px`,
|
|
36
|
+
height: `${size}px`,
|
|
37
|
+
viewBox: "0 0 48 48",
|
|
38
|
+
"aria-valuetext": label,
|
|
39
|
+
role: "progressbar",
|
|
40
|
+
"aria-busy": true,
|
|
41
|
+
children: /*#__PURE__*/_jsxs("g", {
|
|
42
|
+
children: [reduceMotionEnabled ? null : /*#__PURE__*/_jsx("animateTransform", {
|
|
43
|
+
attributeName: "transform",
|
|
44
|
+
type: "rotate",
|
|
45
|
+
values: `-180 24 24;${360 + MIN_STROKE_ANGLE - 180} 24 24`,
|
|
46
|
+
...animationProps
|
|
47
|
+
}), /*#__PURE__*/_jsx("circle", {
|
|
48
|
+
fill: "none",
|
|
49
|
+
stroke: color,
|
|
50
|
+
strokeWidth: thickness * 48 / size,
|
|
51
|
+
strokeLinecap: "round",
|
|
52
|
+
cx: "24",
|
|
53
|
+
cy: "24",
|
|
54
|
+
r: "20",
|
|
55
|
+
strokeDasharray: reduceMotionEnabled ? MAX_SVG_LENGTH : [MIN_SVG_LENGTH, SVG_CIRCUMFERENCE],
|
|
56
|
+
strokeDashoffset: 0,
|
|
57
|
+
children: reduceMotionEnabled ? null : /*#__PURE__*/_jsxs(_Fragment, {
|
|
58
|
+
children: [/*#__PURE__*/_jsx("animate", {
|
|
59
|
+
attributeName: "stroke-dashoffset",
|
|
60
|
+
values: `0;-10;${MIN_SVG_LENGTH - SVG_CIRCUMFERENCE}`,
|
|
61
|
+
...animationProps,
|
|
62
|
+
...bezierProps
|
|
63
|
+
}), /*#__PURE__*/_jsx("animate", {
|
|
64
|
+
attributeName: "stroke-dasharray",
|
|
65
|
+
values: `${MIN_SVG_LENGTH}, 200;${MAX_SVG_LENGTH}, 200;${MIN_SVG_LENGTH}, 200`,
|
|
66
|
+
...animationProps,
|
|
67
|
+
...bezierProps
|
|
68
|
+
})]
|
|
69
|
+
})
|
|
70
|
+
})]
|
|
71
|
+
})
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
Spinner.displayName = 'Spinner';
|
|
75
|
+
Spinner.propTypes = propTypes;
|
|
76
|
+
export default Spinner;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
|
+
import Animated from "react-native-web/dist/exports/Animated";
|
|
3
|
+
import Easing from "react-native-web/dist/exports/Easing";
|
|
4
|
+
import StyleSheet from "react-native-web/dist/exports/StyleSheet";
|
|
5
|
+
import View from "react-native-web/dist/exports/View";
|
|
6
|
+
import { DURATION, MIN_EMPTY_ANGLE, MIN_STROKE_ANGLE, BEZIER, propTypes } from './shared';
|
|
7
|
+
import { useA11yInfo } from '../A11yInfoProvider';
|
|
8
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
|
+
const ea = MIN_EMPTY_ANGLE / 2;
|
|
10
|
+
const sa = MIN_STROKE_ANGLE / 2;
|
|
11
|
+
const Spinner = /*#__PURE__*/forwardRef(({
|
|
12
|
+
size,
|
|
13
|
+
color,
|
|
14
|
+
thickness,
|
|
15
|
+
label
|
|
16
|
+
}, ref) => {
|
|
17
|
+
const {
|
|
18
|
+
current: timer
|
|
19
|
+
} = React.useRef(new Animated.Value(0));
|
|
20
|
+
const {
|
|
21
|
+
reduceMotionEnabled
|
|
22
|
+
} = useA11yInfo();
|
|
23
|
+
React.useLayoutEffect(() => {
|
|
24
|
+
const loop = Animated.timing(timer, {
|
|
25
|
+
duration: DURATION,
|
|
26
|
+
easing: Easing.linear,
|
|
27
|
+
// Animated.loop does not work if useNativeDriver is true on web
|
|
28
|
+
useNativeDriver: true,
|
|
29
|
+
toValue: 1,
|
|
30
|
+
isInteraction: false
|
|
31
|
+
});
|
|
32
|
+
if (!reduceMotionEnabled) Animated.loop(loop).start();else loop.stop();
|
|
33
|
+
}, [timer, reduceMotionEnabled]);
|
|
34
|
+
const frames = 60 * DURATION / 1000;
|
|
35
|
+
const easing = Easing.bezier(...BEZIER);
|
|
36
|
+
const containerStyle = {
|
|
37
|
+
width: size,
|
|
38
|
+
height: size / (reduceMotionEnabled ? 1.5 : 2),
|
|
39
|
+
overflow: 'hidden'
|
|
40
|
+
};
|
|
41
|
+
const animationFrequency = reduceMotionEnabled ? [0] : [0, 1]; // Credit to https://github.com/n4kz/react-native-indicators and https://github.com/callstack/react-native-paper for this
|
|
42
|
+
|
|
43
|
+
return /*#__PURE__*/_jsx(View, {
|
|
44
|
+
ref: ref,
|
|
45
|
+
style: [styles.container],
|
|
46
|
+
accessible: true,
|
|
47
|
+
accessibilityLabel: label,
|
|
48
|
+
accessibilityRole: "progressbar",
|
|
49
|
+
accessibilityState: {
|
|
50
|
+
busy: true
|
|
51
|
+
},
|
|
52
|
+
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
53
|
+
style: [{
|
|
54
|
+
width: size,
|
|
55
|
+
height: size
|
|
56
|
+
}],
|
|
57
|
+
collapsable: false,
|
|
58
|
+
children: animationFrequency.map(index => {
|
|
59
|
+
const inputRange = Array.from(new Array(frames), (_, frameIndex) => frameIndex / (frames - 1));
|
|
60
|
+
const outputRange = Array.from(new Array(frames), (_, frameIndex) => {
|
|
61
|
+
let progress = 2 * frameIndex / (frames - 1);
|
|
62
|
+
const rotation = index ? +(360 - sa) : -(180 - sa);
|
|
63
|
+
|
|
64
|
+
if (progress > 1.0) {
|
|
65
|
+
progress = 2.0 - progress;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const direction = index ? -1 : +1;
|
|
69
|
+
return `${direction * (180 - (sa + ea)) * easing(progress) + rotation}deg`;
|
|
70
|
+
});
|
|
71
|
+
const layerStyle = {
|
|
72
|
+
width: size,
|
|
73
|
+
height: size
|
|
74
|
+
};
|
|
75
|
+
const viewportStyle = {
|
|
76
|
+
width: size,
|
|
77
|
+
height: size
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
if (!reduceMotionEnabled) {
|
|
81
|
+
layerStyle.transform = [{
|
|
82
|
+
rotate: timer.interpolate({
|
|
83
|
+
inputRange: [0, 1],
|
|
84
|
+
outputRange: [`${0 + ea + sa}deg`, `${2 * 360 + ea + sa}deg`]
|
|
85
|
+
})
|
|
86
|
+
}];
|
|
87
|
+
viewportStyle.transform = [{
|
|
88
|
+
translateY: index ? -size / 2 : 0
|
|
89
|
+
}, {
|
|
90
|
+
rotate: timer.interpolate({
|
|
91
|
+
inputRange,
|
|
92
|
+
outputRange
|
|
93
|
+
})
|
|
94
|
+
}];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const offsetStyle = index ? {
|
|
98
|
+
top: size / 2
|
|
99
|
+
} : null;
|
|
100
|
+
const lineStyle = {
|
|
101
|
+
width: size,
|
|
102
|
+
height: size,
|
|
103
|
+
borderColor: color,
|
|
104
|
+
borderWidth: thickness,
|
|
105
|
+
borderRadius: size / 2
|
|
106
|
+
};
|
|
107
|
+
return /*#__PURE__*/_jsx(Animated.View, {
|
|
108
|
+
style: [styles.layer],
|
|
109
|
+
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
110
|
+
style: layerStyle,
|
|
111
|
+
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
112
|
+
style: [containerStyle, offsetStyle],
|
|
113
|
+
collapsable: false,
|
|
114
|
+
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
115
|
+
style: viewportStyle,
|
|
116
|
+
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
117
|
+
style: containerStyle,
|
|
118
|
+
collapsable: false,
|
|
119
|
+
children: /*#__PURE__*/_jsx(Animated.View, {
|
|
120
|
+
style: lineStyle
|
|
121
|
+
})
|
|
122
|
+
})
|
|
123
|
+
})
|
|
124
|
+
})
|
|
125
|
+
})
|
|
126
|
+
}, index);
|
|
127
|
+
})
|
|
128
|
+
})
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
Spinner.displayName = 'Spinner';
|
|
132
|
+
Spinner.propTypes = propTypes;
|
|
133
|
+
const styles = StyleSheet.create({
|
|
134
|
+
container: {
|
|
135
|
+
flexGrow: 0,
|
|
136
|
+
flexShrink: 0
|
|
137
|
+
},
|
|
138
|
+
layer: { ...StyleSheet.absoluteFillObject,
|
|
139
|
+
justifyContent: 'center',
|
|
140
|
+
alignItems: 'center'
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
export default Spinner;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import { useThemeTokens } from '../ThemeProvider';
|
|
4
|
+
import { getTokensPropType, variantProp } from '../utils/props';
|
|
5
|
+
import Spinner from './Spinner';
|
|
6
|
+
/**
|
|
7
|
+
* `ActivityIndicator` renders a visual loading state.
|
|
8
|
+
* It does not handle positioning or layout of that visual loader.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
12
|
+
|
|
13
|
+
const ActivityIndicator = ({
|
|
14
|
+
variant,
|
|
15
|
+
tokens,
|
|
16
|
+
label
|
|
17
|
+
}) => {
|
|
18
|
+
const {
|
|
19
|
+
size,
|
|
20
|
+
color,
|
|
21
|
+
thickness
|
|
22
|
+
} = useThemeTokens('ActivityIndicator', tokens, variant);
|
|
23
|
+
return /*#__PURE__*/_jsx(Spinner, {
|
|
24
|
+
size: size,
|
|
25
|
+
color: color,
|
|
26
|
+
thickness: thickness,
|
|
27
|
+
label: label
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
ActivityIndicator.propTypes = {
|
|
32
|
+
variant: variantProp.propType,
|
|
33
|
+
tokens: getTokensPropType('ActivityIndicator'),
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* A visually hidden accessible label describing the action taking place
|
|
37
|
+
*/
|
|
38
|
+
label: PropTypes.string.isRequired
|
|
39
|
+
};
|
|
40
|
+
export default ActivityIndicator;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import PropTypes from 'prop-types'; // these could be specified by the theme
|
|
2
|
+
|
|
3
|
+
export const DURATION = 1800;
|
|
4
|
+
export const MIN_EMPTY_ANGLE = 60;
|
|
5
|
+
export const MIN_STROKE_ANGLE = 30;
|
|
6
|
+
export const BEZIER = [0.42, 0.0, 0.58, 1.0];
|
|
7
|
+
export const propTypes = {
|
|
8
|
+
color: PropTypes.string.isRequired,
|
|
9
|
+
label: PropTypes.string.isRequired,
|
|
10
|
+
size: PropTypes.number.isRequired,
|
|
11
|
+
thickness: PropTypes.number.isRequired
|
|
12
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
var _ThemeProvider$propTy;
|
|
2
|
+
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import PropTypes from 'prop-types';
|
|
5
|
+
import A11yInfoProvider from '../A11yInfoProvider';
|
|
6
|
+
import ViewportProvider from '../ViewportProvider';
|
|
7
|
+
import ThemeProvider from '../ThemeProvider';
|
|
8
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
|
+
|
|
10
|
+
const BaseProvider = ({
|
|
11
|
+
defaultTheme,
|
|
12
|
+
children
|
|
13
|
+
}) => /*#__PURE__*/_jsx(A11yInfoProvider, {
|
|
14
|
+
children: /*#__PURE__*/_jsx(ViewportProvider, {
|
|
15
|
+
children: /*#__PURE__*/_jsx(ThemeProvider, {
|
|
16
|
+
defaultTheme: defaultTheme,
|
|
17
|
+
children: children
|
|
18
|
+
})
|
|
19
|
+
})
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
BaseProvider.propTypes = {
|
|
23
|
+
defaultTheme: (_ThemeProvider$propTy = ThemeProvider.propTypes) === null || _ThemeProvider$propTy === void 0 ? void 0 : _ThemeProvider$propTy.defaultTheme,
|
|
24
|
+
children: PropTypes.node.isRequired
|
|
25
|
+
};
|
|
26
|
+
export default BaseProvider;
|