@telus-uds/components-base 0.0.2-prerelease.9 → 1.1.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/.storybook/main.js +4 -0
- package/.storybook/preview.js +37 -0
- package/.ultra.cache.json +1 -1
- package/CHANGELOG.md +50 -0
- package/README.md +4 -2
- package/__fixtures__/test-utils.js +25 -0
- package/__fixtures__/testTheme.js +4 -2
- package/__tests__/Button/ButtonGroup.test.jsx +4 -5
- package/__tests__/Checkbox/Checkbox.test.jsx +2 -2
- package/__tests__/Checkbox/CheckboxGroup.test.jsx +4 -5
- package/__tests__/ExpandCollapse/ExpandCollapse.test.jsx +2 -2
- package/__tests__/HorizontalScroll/HorizontalScroll.test.jsx +164 -0
- package/__tests__/Link/LinkBase.test.jsx +0 -14
- package/__tests__/Radio/Radio.test.jsx +2 -2
- package/__tests__/Radio/RadioGroup.test.jsx +4 -5
- package/__tests__/RadioCard/RadioCard.test.jsx +2 -2
- package/__tests__/RadioCard/RadioCardGroup.test.jsx +4 -5
- package/__tests__/Search/Search.test.jsx +9 -8
- package/__tests__/Select/Select.test.jsx +3 -2
- package/__tests__/Tabs/Tabs.test.jsx +1 -161
- package/__tests__/Tags/Tags.test.jsx +4 -5
- package/__tests__/TextInput/TextArea.test.jsx +3 -2
- package/__tests__/TextInput/TextInputBase.test.jsx +10 -5
- 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 +1 -1
- package/__tests__/utils/semantics.test.jsx +43 -0
- package/babel.config.js +9 -16
- package/component-docs.json +10313 -0
- package/generate-component-docs.js +56 -0
- package/lib/A11yText/index.js +10 -5
- package/lib/ActivityIndicator/Spinner.js +16 -13
- package/lib/ActivityIndicator/Spinner.native.js +12 -8
- package/lib/Box/Box.js +103 -8
- package/lib/Button/Button.js +9 -8
- package/lib/Button/ButtonBase.js +14 -7
- package/lib/Button/ButtonGroup.js +25 -10
- package/lib/Button/ButtonLink.js +10 -7
- package/lib/Card/Card.js +2 -0
- package/lib/Card/CardBase.js +13 -5
- package/lib/Card/PressableCardBase.js +12 -8
- package/lib/Checkbox/Checkbox.js +25 -14
- package/lib/Checkbox/CheckboxGroup.js +22 -12
- package/lib/Divider/Divider.js +12 -7
- package/lib/ExpandCollapse/Accordion.js +10 -4
- package/lib/ExpandCollapse/Control.js +12 -6
- package/lib/ExpandCollapse/ExpandCollapse.js +10 -5
- package/lib/ExpandCollapse/Panel.js +8 -7
- package/lib/Feedback/Feedback.js +10 -5
- package/lib/Fieldset/Fieldset.js +10 -5
- package/lib/Fieldset/FieldsetContainer.js +10 -5
- package/lib/Fieldset/FieldsetContainer.native.js +10 -5
- package/lib/Fieldset/Legend.js +10 -5
- package/lib/Fieldset/Legend.native.js +10 -5
- package/lib/FlexGrid/Col/Col.js +8 -5
- package/lib/FlexGrid/FlexGrid.js +31 -6
- package/lib/FlexGrid/Row/Row.js +12 -5
- package/lib/{Tabs → HorizontalScroll}/HorizontalScroll.js +5 -4
- package/lib/{Tabs/TabsScrollButton.js → HorizontalScroll/HorizontalScrollButton.js} +14 -8
- package/lib/{Tabs → HorizontalScroll}/ScrollViewEnd.js +0 -0
- package/lib/{Tabs → HorizontalScroll}/ScrollViewEnd.native.js +0 -0
- package/lib/{Tabs → HorizontalScroll}/dictionary.js +0 -0
- package/lib/HorizontalScroll/index.js +35 -0
- package/lib/{Tabs → HorizontalScroll}/itemPositions.js +0 -0
- package/lib/Icon/Icon.js +16 -9
- package/lib/Icon/IconText.js +8 -7
- package/lib/IconButton/IconButton.js +10 -5
- package/lib/InputLabel/InputLabel.js +33 -5
- package/lib/InputLabel/LabelContent.js +22 -12
- package/lib/InputLabel/LabelContent.native.js +23 -5
- package/lib/InputSupports/InputSupports.js +10 -5
- package/lib/Link/ChevronLink.js +12 -5
- package/lib/Link/InlinePressable.js +10 -4
- package/lib/Link/InlinePressable.native.js +5 -4
- package/lib/Link/Link.js +12 -5
- package/lib/Link/LinkBase.js +12 -5
- package/lib/Link/TextButton.js +10 -5
- package/lib/List/List.js +6 -6
- package/lib/List/ListItem.js +28 -33
- package/lib/List/index.js +15 -0
- package/lib/Modal/Modal.js +10 -5
- package/lib/Notification/Notification.js +21 -5
- package/lib/Pagination/PageButton.js +16 -11
- package/lib/Pagination/Pagination.js +12 -7
- package/lib/Pagination/SideButton.js +12 -7
- package/lib/Pagination/usePagination.js +2 -2
- package/lib/Progress/Progress.js +10 -5
- package/lib/Progress/ProgressBar.js +21 -10
- package/lib/Progress/ProgressBarBackground.js +12 -8
- package/lib/Radio/Radio.js +14 -13
- package/lib/Radio/RadioButton.js +20 -9
- package/lib/Radio/RadioGroup.js +24 -13
- package/lib/RadioCard/RadioCard.js +14 -10
- package/lib/RadioCard/RadioCardGroup.js +13 -12
- package/lib/Search/Search.js +29 -18
- package/lib/Select/Picker.js +11 -6
- package/lib/Select/Picker.native.js +21 -6
- package/lib/Select/Select.js +46 -4
- package/lib/SideNav/Item.js +10 -5
- package/lib/SideNav/ItemsGroup.js +10 -5
- package/lib/SideNav/SideNav.js +11 -7
- package/lib/Skeleton/Skeleton.js +15 -15
- package/lib/Skeleton/skeletonWebAnimation.js +1 -1
- package/lib/Spacer/Spacer.js +19 -7
- package/lib/StackView/StackView.js +26 -7
- package/lib/StackView/StackWrap.js +24 -13
- package/lib/StackView/StackWrapBox.js +34 -8
- package/lib/StackView/StackWrapGap.js +16 -7
- package/lib/StackView/common.js +4 -2
- package/lib/StackView/getStackedContent.js +2 -2
- package/lib/StepTracker/StepTracker.js +10 -5
- package/lib/Tabs/Tabs.js +26 -19
- package/lib/Tabs/TabsItem.js +16 -12
- package/lib/Tags/Tags.js +27 -11
- package/lib/TextInput/TextArea.js +7 -5
- package/lib/TextInput/TextInput.js +12 -6
- package/lib/TextInput/TextInputBase.js +12 -8
- package/lib/ThemeProvider/ThemeProvider.js +14 -10
- package/lib/ThemeProvider/useSetTheme.js +6 -1
- package/lib/ThemeProvider/utils/styles.js +2 -2
- package/lib/ThemeProvider/utils/theme-tokens.js +39 -8
- package/lib/ToggleSwitch/ToggleSwitch.js +11 -6
- package/lib/Tooltip/Backdrop.js +10 -2
- package/lib/Tooltip/Tooltip.js +5 -4
- package/lib/Typography/Typography.js +40 -24
- package/lib/index.js +36 -1
- package/lib/utils/a11y/index.js +13 -0
- package/lib/utils/a11y/propTypes.js +61 -0
- package/lib/utils/a11y/propTypes.native.js +47 -0
- package/lib/utils/a11y/semantics.js +173 -0
- package/lib/utils/animation/useVerticalExpandAnimation.js +1 -1
- package/lib/utils/children.js +55 -8
- package/lib/utils/input.js +27 -17
- package/lib/utils/propTypes.js +40 -68
- package/lib/utils/useCopy.js +1 -1
- package/lib/utils/useHash.js +8 -4
- package/lib/utils/useSpacingScale.js +1 -3
- package/lib/utils/useUniqueId.js +1 -1
- package/package.json +14 -6
- package/release-context.json +4 -4
- package/src/A11yText/index.jsx +6 -4
- package/src/ActivityIndicator/Spinner.jsx +5 -3
- package/src/ActivityIndicator/Spinner.native.jsx +5 -3
- package/src/Box/Box.jsx +125 -39
- package/src/Button/Button.jsx +7 -4
- package/src/Button/ButtonBase.jsx +86 -77
- package/src/Button/ButtonGroup.jsx +81 -69
- package/src/Button/ButtonLink.jsx +18 -13
- package/src/Card/Card.jsx +2 -2
- package/src/Card/CardBase.jsx +6 -4
- package/src/Card/PressableCardBase.jsx +71 -64
- package/src/Checkbox/Checkbox.jsx +118 -108
- package/src/Checkbox/CheckboxGroup.jsx +72 -62
- 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 +36 -33
- package/src/Fieldset/Fieldset.jsx +63 -56
- package/src/Fieldset/FieldsetContainer.jsx +14 -5
- package/src/Fieldset/FieldsetContainer.native.jsx +7 -4
- package/src/Fieldset/Legend.jsx +7 -2
- package/src/Fieldset/Legend.native.jsx +7 -2
- 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/{Tabs → HorizontalScroll}/ScrollViewEnd.jsx +0 -0
- package/src/{Tabs → HorizontalScroll}/ScrollViewEnd.native.jsx +0 -0
- package/src/{Tabs → HorizontalScroll}/dictionary.js +0 -0
- package/src/HorizontalScroll/index.js +17 -0
- package/src/{Tabs → HorizontalScroll}/itemPositions.js +0 -0
- package/src/Icon/Icon.jsx +37 -35
- package/src/Icon/IconText.jsx +22 -17
- package/src/IconButton/IconButton.jsx +49 -42
- package/src/InputLabel/InputLabel.jsx +53 -38
- package/src/InputLabel/LabelContent.jsx +14 -6
- package/src/InputLabel/LabelContent.native.jsx +11 -2
- package/src/InputSupports/InputSupports.jsx +29 -34
- package/src/Link/ChevronLink.jsx +26 -16
- package/src/Link/InlinePressable.jsx +5 -3
- package/src/Link/InlinePressable.native.jsx +5 -3
- package/src/Link/Link.jsx +22 -16
- package/src/Link/LinkBase.jsx +67 -58
- package/src/Link/TextButton.jsx +30 -23
- package/src/List/List.jsx +6 -7
- package/src/List/ListItem.jsx +70 -90
- package/src/List/index.js +5 -0
- package/src/Modal/Modal.jsx +9 -4
- package/src/Notification/Notification.jsx +58 -43
- package/src/Pagination/PageButton.jsx +37 -34
- package/src/Pagination/Pagination.jsx +88 -92
- package/src/Pagination/SideButton.jsx +44 -41
- package/src/Progress/Progress.jsx +5 -4
- package/src/Progress/ProgressBar.jsx +42 -29
- package/src/Progress/ProgressBarBackground.jsx +5 -3
- package/src/Radio/Radio.jsx +85 -78
- package/src/Radio/RadioButton.jsx +54 -43
- package/src/Radio/RadioGroup.jsx +74 -63
- package/src/RadioCard/RadioCard.jsx +75 -68
- package/src/RadioCard/RadioCardGroup.jsx +82 -75
- package/src/Search/Search.jsx +127 -106
- package/src/Select/Picker.jsx +49 -42
- package/src/Select/Picker.native.jsx +56 -49
- package/src/Select/Select.jsx +115 -72
- package/src/SideNav/Item.jsx +53 -46
- package/src/SideNav/ItemsGroup.jsx +50 -43
- package/src/SideNav/SideNav.jsx +68 -60
- package/src/Skeleton/Skeleton.jsx +9 -13
- package/src/Spacer/Spacer.jsx +11 -4
- package/src/StackView/StackView.jsx +47 -23
- package/src/StackView/StackWrap.jsx +14 -12
- package/src/StackView/StackWrapBox.jsx +62 -28
- package/src/StackView/StackWrapGap.jsx +46 -24
- package/src/StackView/common.jsx +3 -2
- package/src/StepTracker/StepTracker.jsx +73 -62
- package/src/Tabs/Tabs.jsx +70 -62
- package/src/Tabs/TabsItem.jsx +111 -103
- package/src/Tags/Tags.jsx +114 -102
- package/src/TextInput/TextArea.jsx +5 -4
- package/src/TextInput/TextInput.jsx +5 -4
- package/src/TextInput/TextInputBase.jsx +84 -77
- package/src/ThemeProvider/ThemeProvider.jsx +11 -7
- package/src/ThemeProvider/useSetTheme.js +4 -0
- package/src/ThemeProvider/utils/theme-tokens.js +28 -0
- package/src/ToggleSwitch/ToggleSwitch.jsx +49 -50
- package/src/Tooltip/Tooltip.jsx +134 -130
- package/src/Typography/Typography.jsx +67 -44
- package/src/index.js +3 -1
- package/src/utils/a11y/index.js +1 -0
- package/src/utils/a11y/propTypes.js +61 -0
- package/src/utils/a11y/propTypes.native.js +39 -0
- package/src/utils/a11y/semantics.js +162 -0
- package/src/utils/children.jsx +60 -7
- package/src/utils/input.js +20 -17
- package/src/utils/propTypes.js +30 -76
- package/src/utils/useCopy.js +1 -1
- package/src/utils/useHash.js +8 -3
- package/stories/A11yText/A11yText.stories.jsx +3 -3
- package/stories/ActivityIndicator/ActivityIndicator.stories.jsx +2 -2
- package/stories/Box/Box.stories.jsx +2 -2
- package/stories/Button/Button.stories.jsx +3 -3
- package/stories/Button/ButtonGroup.stories.jsx +2 -2
- package/stories/Button/ButtonLink.stories.jsx +2 -2
- package/stories/Card/Card.stories.jsx +2 -2
- package/stories/Checkbox/Checkbox.stories.jsx +2 -2
- package/stories/Divider/Divider.stories.jsx +2 -2
- package/stories/ExpandCollapse/ExpandCollapse.stories.jsx +3 -3
- package/stories/Feedback/Feedback.stories.jsx +2 -2
- package/stories/FlexGrid/01 FlexGrid.stories.jsx +2 -2
- package/stories/FlexGrid/02 Row.stories.jsx +2 -2
- package/stories/FlexGrid/03 Col.stories.jsx +2 -2
- package/stories/Icon/Icon.stories.jsx +2 -2
- package/stories/IconButton/IconButton.stories.jsx +2 -2
- package/stories/InputLabel/InputLabel.stories.jsx +2 -2
- package/stories/Link/ChevronLink.stories.jsx +2 -2
- package/stories/Link/Link.stories.jsx +2 -2
- package/stories/Link/TextButton.stories.jsx +2 -2
- package/stories/List/List.stories.jsx +2 -2
- package/stories/Modal/Modal.stories.jsx +2 -2
- package/stories/Notification/Notification.stories.jsx +2 -2
- package/stories/Pagination/Pagination.stories.jsx +2 -2
- package/stories/Progress/Progress.stories.jsx +2 -2
- package/stories/Radio/Radio.stories.jsx +2 -2
- package/stories/RadioCard/RadioCard.stories.jsx +2 -2
- package/stories/Search/Search.stories.jsx +2 -2
- package/stories/Select/Select.stories.jsx +2 -2
- package/stories/SideNav/SideNav.stories.jsx +2 -2
- package/stories/SideNav/SideNavItem.stories.jsx +2 -2
- package/stories/SideNav/SideNavItemsGroup.stories.jsx +2 -2
- package/stories/Skeleton/Skeleton.stories.jsx +3 -3
- package/stories/Spacer/Spacer.stories.jsx +2 -2
- package/stories/StackView/StackView.stories.jsx +2 -2
- package/stories/StackView/StackWrap.stories.jsx +2 -2
- package/stories/StepTracker/StepTracker.stories.jsx +2 -2
- package/stories/Tabs/Tabs.stories.jsx +2 -2
- package/stories/Tags/Tags.stories.jsx +2 -2
- package/stories/TextInput/TextArea.stories.jsx +2 -2
- package/stories/TextInput/TextInput.stories.jsx +2 -2
- package/stories/ToggleSwitch/ToggleSwitch.stories.jsx +2 -2
- package/stories/Tooltip/Tooltip.stories.jsx +2 -2
- package/stories/TooltipButton/TooltipButton.stories.jsx +2 -2
- package/stories/Typography/Typography.stories.jsx +2 -2
- package/stories/platform-supports.jsx +1 -1
- package/stories/supports.jsx +4 -5
- package/src/Tabs/HorizontalScroll.jsx +0 -165
- package/src/Tabs/TabsScrollButton.jsx +0 -100
|
@@ -1,13 +1,21 @@
|
|
|
1
|
-
import React from 'react'
|
|
1
|
+
import React, { forwardRef } from 'react'
|
|
2
2
|
import PropTypes from 'prop-types'
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
const LabelContent = forwardRef(({ children, forId }, ref) => (
|
|
5
|
+
<label ref={ref} htmlFor={forId} style={staticStyles.inheritCursor}>
|
|
6
|
+
{children}
|
|
7
|
+
</label>
|
|
8
|
+
))
|
|
9
|
+
LabelContent.displayName = 'LabelContent'
|
|
9
10
|
|
|
10
11
|
LabelContent.propTypes = {
|
|
11
12
|
children: PropTypes.string,
|
|
12
13
|
forId: PropTypes.string
|
|
13
14
|
}
|
|
15
|
+
|
|
16
|
+
// Note that <label> is not React Native, so we can't use `StyleSheet.create` here
|
|
17
|
+
const staticStyles = {
|
|
18
|
+
inheritCursor: { cursor: 'inherit' }
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export default LabelContent
|
|
@@ -1,6 +1,15 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react'
|
|
2
|
+
import PropTypes from 'prop-types'
|
|
3
|
+
import { View } from 'react-native'
|
|
4
|
+
|
|
1
5
|
// Since there's no equivalent for web's <label> element we're simply rendering whatever is passed to this component.
|
|
2
|
-
|
|
3
|
-
|
|
6
|
+
const LabelContent = forwardRef(({ children }, ref) =>
|
|
7
|
+
ref ? <View ref={ref}>{children}</View> : children
|
|
8
|
+
)
|
|
9
|
+
LabelContent.displayName = 'LabelContent'
|
|
10
|
+
|
|
11
|
+
LabelContent.propTypes = {
|
|
12
|
+
children: PropTypes.node
|
|
4
13
|
}
|
|
5
14
|
|
|
6
15
|
export default LabelContent
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from 'react'
|
|
1
|
+
import React, { forwardRef } from 'react'
|
|
2
2
|
|
|
3
3
|
import PropTypes from 'prop-types'
|
|
4
4
|
import InputLabel from '../InputLabel'
|
|
@@ -7,41 +7,36 @@ import StackView from '../StackView'
|
|
|
7
7
|
import { useThemeTokens } from '../ThemeProvider'
|
|
8
8
|
import useInputSupports from './useInputSupports'
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
children,
|
|
12
|
-
|
|
13
|
-
hint,
|
|
14
|
-
hintPosition = 'inline',
|
|
15
|
-
feedback,
|
|
16
|
-
tooltip,
|
|
17
|
-
validation
|
|
18
|
-
}) {
|
|
19
|
-
const { space } = useThemeTokens('InputSupports')
|
|
10
|
+
const InputSupports = forwardRef(
|
|
11
|
+
({ children, label, hint, hintPosition = 'inline', feedback, tooltip, validation }, ref) => {
|
|
12
|
+
const { space } = useThemeTokens('InputSupports')
|
|
20
13
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
14
|
+
const { inputId, hintId, feedbackId, a11yProps } = useInputSupports({
|
|
15
|
+
feedback,
|
|
16
|
+
hint,
|
|
17
|
+
label,
|
|
18
|
+
validation
|
|
19
|
+
})
|
|
27
20
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
21
|
+
return (
|
|
22
|
+
<StackView space={space} ref={ref}>
|
|
23
|
+
{label && (
|
|
24
|
+
<InputLabel
|
|
25
|
+
label={label}
|
|
26
|
+
hint={hint}
|
|
27
|
+
hintPosition={hintPosition}
|
|
28
|
+
hintId={hintId}
|
|
29
|
+
tooltip={tooltip}
|
|
30
|
+
forId={inputId}
|
|
31
|
+
/>
|
|
32
|
+
)}
|
|
33
|
+
{typeof children === 'function' ? children({ a11yProps, inputId }) : children}
|
|
34
|
+
{feedback && <Feedback id={feedbackId} title={feedback} validation={validation} />}
|
|
35
|
+
</StackView>
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
)
|
|
39
|
+
InputSupports.displayName = 'InputSupports'
|
|
45
40
|
|
|
46
41
|
InputSupports.propTypes = {
|
|
47
42
|
children: PropTypes.oneOfType([PropTypes.func, PropTypes.node]),
|
package/src/Link/ChevronLink.jsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from 'react'
|
|
1
|
+
import React, { forwardRef } from 'react'
|
|
2
2
|
import PropTypes from 'prop-types'
|
|
3
3
|
|
|
4
4
|
import { useThemeTokensCallback } from '../ThemeProvider'
|
|
@@ -11,24 +11,34 @@ import LinkBase from './LinkBase'
|
|
|
11
11
|
*
|
|
12
12
|
* ChevronLink is not intended to be deeply themable; variants passed to ChevronLink are forwarded to Link.
|
|
13
13
|
*/
|
|
14
|
-
const ChevronLink = (
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
14
|
+
const ChevronLink = forwardRef(
|
|
15
|
+
({ direction = 'right', children, tokens, variant, dataSet, ...linkProps }, ref) => {
|
|
16
|
+
const getChevronTokens = useThemeTokensCallback('ChevronLink', tokens, variant)
|
|
17
|
+
const applyChevronTokens = (linkState) => {
|
|
18
|
+
const { leftIcon, rightIcon, iconDisplace, ...otherTokens } = getChevronTokens(linkState)
|
|
19
|
+
return {
|
|
20
|
+
...selectTokens('Link', otherTokens),
|
|
21
|
+
icon: direction === 'right' ? rightIcon : leftIcon,
|
|
22
|
+
iconTranslateX: iconDisplace * (direction === 'right' ? 1 : -1) || 0
|
|
23
|
+
}
|
|
22
24
|
}
|
|
25
|
+
|
|
26
|
+
const getTokens = useThemeTokensCallback('Link', applyChevronTokens, variant)
|
|
27
|
+
return (
|
|
28
|
+
<LinkBase
|
|
29
|
+
{...linkProps}
|
|
30
|
+
iconPosition={direction}
|
|
31
|
+
tokens={getTokens}
|
|
32
|
+
dataSet={dataSet}
|
|
33
|
+
ref={ref}
|
|
34
|
+
>
|
|
35
|
+
{children}
|
|
36
|
+
</LinkBase>
|
|
37
|
+
)
|
|
23
38
|
}
|
|
39
|
+
)
|
|
24
40
|
|
|
25
|
-
|
|
26
|
-
return (
|
|
27
|
-
<LinkBase {...linkProps} iconPosition={direction} tokens={getTokens}>
|
|
28
|
-
{children}
|
|
29
|
-
</LinkBase>
|
|
30
|
-
)
|
|
31
|
-
}
|
|
41
|
+
ChevronLink.displayName = 'ChevronLink'
|
|
32
42
|
ChevronLink.propTypes = {
|
|
33
43
|
...LinkBase.propTypes,
|
|
34
44
|
tokens: getTokensPropType('ChevronLink', 'Link'),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from 'react'
|
|
1
|
+
import React, { forwardRef } from 'react'
|
|
2
2
|
import { Pressable, StyleSheet } from 'react-native'
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -15,8 +15,9 @@ import { Pressable, StyleSheet } from 'react-native'
|
|
|
15
15
|
*/
|
|
16
16
|
// React Native exports prop Types but not propTypes, use JSDoc types here rather than duplicate RN
|
|
17
17
|
// eslint-disable-next-line react/prop-types
|
|
18
|
-
const InlinePressable = ({ children, style, ...props }) => (
|
|
18
|
+
const InlinePressable = forwardRef(({ children, style, ...props }, ref) => (
|
|
19
19
|
<Pressable
|
|
20
|
+
ref={ref}
|
|
20
21
|
style={(pressState) => [
|
|
21
22
|
staticStyles.inline,
|
|
22
23
|
typeof style === 'function' ? style(pressState) : style
|
|
@@ -25,7 +26,8 @@ const InlinePressable = ({ children, style, ...props }) => (
|
|
|
25
26
|
>
|
|
26
27
|
{(pressState) => (typeof children === 'function' ? children(pressState) : children)}
|
|
27
28
|
</Pressable>
|
|
28
|
-
)
|
|
29
|
+
))
|
|
30
|
+
InlinePressable.displayName = 'InlinePressable'
|
|
29
31
|
|
|
30
32
|
const staticStyles = StyleSheet.create({
|
|
31
33
|
inline: {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable camelcase */
|
|
2
|
-
import React, { useState } from 'react'
|
|
2
|
+
import React, { forwardRef, useState } from 'react'
|
|
3
3
|
import { Text, TouchableWithoutFeedback } from 'react-native'
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -38,7 +38,7 @@ const pressablePropsToTouchable = ({
|
|
|
38
38
|
*/
|
|
39
39
|
// React Native exports prop Types but not propTypes, use JSDoc types here rather than duplicate RN
|
|
40
40
|
// eslint-disable-next-line react/prop-types
|
|
41
|
-
const InlinePressable = ({ onPress, children, style, ...rest }) => {
|
|
41
|
+
const InlinePressable = forwardRef(({ onPress, children, style, ...rest }, ref) => {
|
|
42
42
|
const [isFocused, setIsFocused] = useState(false)
|
|
43
43
|
const handleFocus = () => setIsFocused(true)
|
|
44
44
|
const handleBlur = () => setIsFocused(false)
|
|
@@ -61,6 +61,7 @@ const InlinePressable = ({ onPress, children, style, ...rest }) => {
|
|
|
61
61
|
onPressOut={handlePressOut}
|
|
62
62
|
onFocus={handleFocus}
|
|
63
63
|
onBlur={handleBlur}
|
|
64
|
+
ref={ref}
|
|
64
65
|
{...pressablePropsToTouchable(rest)}
|
|
65
66
|
>
|
|
66
67
|
<Text style={currentStyle}>
|
|
@@ -68,6 +69,7 @@ const InlinePressable = ({ onPress, children, style, ...rest }) => {
|
|
|
68
69
|
</Text>
|
|
69
70
|
</TouchableWithoutFeedback>
|
|
70
71
|
)
|
|
71
|
-
}
|
|
72
|
+
})
|
|
73
|
+
InlinePressable.displayName = 'InlinePressable'
|
|
72
74
|
|
|
73
75
|
export default InlinePressable
|
package/src/Link/Link.jsx
CHANGED
|
@@ -1,23 +1,29 @@
|
|
|
1
|
-
import React from 'react'
|
|
1
|
+
import React, { forwardRef } from 'react'
|
|
2
2
|
|
|
3
3
|
import { useThemeTokensCallback } from '../ThemeProvider'
|
|
4
4
|
import LinkBase from './LinkBase'
|
|
5
5
|
|
|
6
|
-
const Link = (
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
6
|
+
const Link = forwardRef(
|
|
7
|
+
(
|
|
8
|
+
{ href, children, accessibilityRole = 'link', variant = {}, tokens, dataSet, ...linkProps },
|
|
9
|
+
ref
|
|
10
|
+
) => {
|
|
11
|
+
const getTokens = useThemeTokensCallback('Link', tokens, variant)
|
|
12
|
+
return (
|
|
13
|
+
<LinkBase
|
|
14
|
+
href={href}
|
|
15
|
+
accessibilityRole={accessibilityRole}
|
|
16
|
+
tokens={getTokens}
|
|
17
|
+
ref={ref}
|
|
18
|
+
dataSet={dataSet}
|
|
19
|
+
{...linkProps}
|
|
20
|
+
>
|
|
21
|
+
{children}
|
|
22
|
+
</LinkBase>
|
|
23
|
+
)
|
|
24
|
+
}
|
|
25
|
+
)
|
|
26
|
+
Link.displayName = 'Link'
|
|
21
27
|
|
|
22
28
|
Link.propTypes = LinkBase.propTypes
|
|
23
29
|
|
package/src/Link/LinkBase.jsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from 'react'
|
|
1
|
+
import React, { forwardRef } from 'react'
|
|
2
2
|
import PropTypes from 'prop-types'
|
|
3
3
|
import { Text, Platform, StyleSheet } from 'react-native'
|
|
4
4
|
import {
|
|
@@ -88,69 +88,78 @@ const selectIconTokens = ({ color, iconSize, iconTranslateX, iconTranslateY }) =
|
|
|
88
88
|
* dropped in favour of investigating if a full-featured CSS-in-JS package could or
|
|
89
89
|
* should be used more widely (e.g. styled components)
|
|
90
90
|
*/
|
|
91
|
-
const LinkBase = (
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
hrefAttrs,
|
|
109
|
-
|
|
110
|
-
|
|
91
|
+
const LinkBase = forwardRef(
|
|
92
|
+
(
|
|
93
|
+
{
|
|
94
|
+
href,
|
|
95
|
+
onPress,
|
|
96
|
+
icon,
|
|
97
|
+
iconPosition = icon ? 'left' : undefined,
|
|
98
|
+
iconProps,
|
|
99
|
+
variant,
|
|
100
|
+
tokens = {},
|
|
101
|
+
children,
|
|
102
|
+
accessibilityRole = 'link',
|
|
103
|
+
dataSet,
|
|
104
|
+
...props
|
|
105
|
+
},
|
|
106
|
+
ref
|
|
107
|
+
) => {
|
|
108
|
+
const { hrefAttrs, rest } = hrefAttrsProp.bundle(props)
|
|
109
|
+
const linkPropSet = linkProps.select({
|
|
110
|
+
accessibilityRole,
|
|
111
|
+
href,
|
|
112
|
+
onPress: linkProps.handleHref({ href, onPress }),
|
|
113
|
+
hrefAttrs,
|
|
114
|
+
...rest
|
|
115
|
+
})
|
|
111
116
|
|
|
112
|
-
|
|
113
|
-
|
|
117
|
+
const resolveLinkTokens = (pressState) =>
|
|
118
|
+
resolvePressableTokens(tokens, pressState, { iconPosition })
|
|
114
119
|
|
|
115
|
-
|
|
116
|
-
|
|
120
|
+
// On web, this makes focus rings wrap only the link, not the entire block
|
|
121
|
+
const blockLeftStyle = Platform.OS === 'web' && staticStyles.blockLeft
|
|
117
122
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
123
|
+
return (
|
|
124
|
+
<InlinePressable
|
|
125
|
+
{...linkPropSet}
|
|
126
|
+
ref={ref}
|
|
127
|
+
dataSet={dataSet}
|
|
128
|
+
style={(linkState) => {
|
|
129
|
+
const themeTokens = resolveLinkTokens(linkState)
|
|
130
|
+
const outerBorderStyles = selectOuterBorderStyles(themeTokens)
|
|
131
|
+
const hasIcon = Boolean(icon || themeTokens.icon)
|
|
132
|
+
return [outerBorderStyles, blockLeftStyle, hasIcon && staticStyles.rowContainer]
|
|
133
|
+
}}
|
|
134
|
+
>
|
|
135
|
+
{(linkState) => {
|
|
136
|
+
const themeTokens = resolveLinkTokens(linkState)
|
|
137
|
+
const textStyles = selectTextStyles(themeTokens)
|
|
138
|
+
const iconTokens = selectIconTokens(themeTokens)
|
|
132
139
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
140
|
+
// TODO: may need to apply some smarter text inheritance here if inline to avoid native
|
|
141
|
+
// issues like double-application of line heights breaking align-items: baseline
|
|
142
|
+
const blockTextStyles = selectBlockStyles(themeTokens)
|
|
136
143
|
|
|
137
|
-
|
|
138
|
-
|
|
144
|
+
const IconComponent = icon || themeTokens.icon
|
|
145
|
+
const { iconSpace } = themeTokens
|
|
139
146
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}
|
|
147
|
+
return (
|
|
148
|
+
<IconText
|
|
149
|
+
icon={IconComponent}
|
|
150
|
+
iconPosition={iconPosition}
|
|
151
|
+
space={iconSpace}
|
|
152
|
+
iconProps={{ ...iconProps, tokens: iconTokens }}
|
|
153
|
+
>
|
|
154
|
+
<Text style={[textStyles, blockTextStyles, staticStyles.baseline]}>{children}</Text>
|
|
155
|
+
</IconText>
|
|
156
|
+
)
|
|
157
|
+
}}
|
|
158
|
+
</InlinePressable>
|
|
159
|
+
)
|
|
160
|
+
}
|
|
161
|
+
)
|
|
162
|
+
LinkBase.displayName = 'LinkBase'
|
|
154
163
|
|
|
155
164
|
LinkBase.propTypes = {
|
|
156
165
|
...a11yProps.types,
|
package/src/Link/TextButton.jsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from 'react'
|
|
1
|
+
import React, { forwardRef } from 'react'
|
|
2
2
|
import PropTypes from 'prop-types'
|
|
3
3
|
|
|
4
4
|
import { useThemeTokensCallback } from '../ThemeProvider'
|
|
@@ -9,28 +9,35 @@ import LinkBase from './LinkBase'
|
|
|
9
9
|
* Link but has the accessibility role of a `Button`. It should be used for actions that
|
|
10
10
|
* take place on the current page, or for navigation within an app.
|
|
11
11
|
*/
|
|
12
|
-
const TextButton = (
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}
|
|
12
|
+
const TextButton = forwardRef(
|
|
13
|
+
(
|
|
14
|
+
{
|
|
15
|
+
onPress,
|
|
16
|
+
children,
|
|
17
|
+
variant,
|
|
18
|
+
tokens,
|
|
19
|
+
// TODO: this may need to use `link` role on Web in the case of being passed both `href` and
|
|
20
|
+
// `onPress` in an omniplatform app that uses React Navigation's useLinkProps for internal nav.
|
|
21
|
+
accessibilityRole = 'button',
|
|
22
|
+
...linkProps
|
|
23
|
+
},
|
|
24
|
+
ref
|
|
25
|
+
) => {
|
|
26
|
+
const getTokens = useThemeTokensCallback('Link', tokens, variant)
|
|
27
|
+
return (
|
|
28
|
+
<LinkBase
|
|
29
|
+
onPress={onPress}
|
|
30
|
+
accessibilityRole={accessibilityRole}
|
|
31
|
+
tokens={getTokens}
|
|
32
|
+
ref={ref}
|
|
33
|
+
{...linkProps}
|
|
34
|
+
>
|
|
35
|
+
{children}
|
|
36
|
+
</LinkBase>
|
|
37
|
+
)
|
|
38
|
+
}
|
|
39
|
+
)
|
|
40
|
+
TextButton.displayName = 'TextButton'
|
|
34
41
|
|
|
35
42
|
TextButton.propTypes = {
|
|
36
43
|
...LinkBase.propTypes,
|
package/src/List/List.jsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { cloneElement, Children } from 'react'
|
|
1
|
+
import React, { cloneElement, forwardRef, Children } from 'react'
|
|
2
2
|
import { View, Platform } from 'react-native'
|
|
3
3
|
import PropTypes from 'prop-types'
|
|
4
4
|
import { getTokensPropType, variantProp, componentPropType } from '../utils'
|
|
@@ -6,10 +6,10 @@ import { a11yProps } from '../utils/propTypes'
|
|
|
6
6
|
import ListItem from './ListItem'
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
9
|
+
* An unordered List component has a child a ListItem that
|
|
10
10
|
* allows icon, dividers and customized typography
|
|
11
11
|
*/
|
|
12
|
-
const List = ({ children, showDivider, tokens, variant, ...rest }) => {
|
|
12
|
+
const List = forwardRef(({ children, showDivider, tokens, variant, ...rest }, ref) => {
|
|
13
13
|
const accessibilityRole = Platform.select({ web: 'list', default: 'none' })
|
|
14
14
|
const a11y = a11yProps.select(rest)
|
|
15
15
|
const items = Children.map(children, (child, index) => {
|
|
@@ -25,13 +25,12 @@ const List = ({ children, showDivider, tokens, variant, ...rest }) => {
|
|
|
25
25
|
})
|
|
26
26
|
|
|
27
27
|
return (
|
|
28
|
-
<View accessibilityRole={accessibilityRole} {...a11y}>
|
|
28
|
+
<View ref={ref} accessibilityRole={accessibilityRole} {...a11y}>
|
|
29
29
|
{items}
|
|
30
30
|
</View>
|
|
31
31
|
)
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
List.Item = ListItem
|
|
32
|
+
})
|
|
33
|
+
List.displayName = 'List'
|
|
35
34
|
|
|
36
35
|
List.propTypes = {
|
|
37
36
|
...a11yProps.types,
|