@telus-uds/components-base 1.30.1 → 1.32.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/CHANGELOG.md +31 -2
- package/component-docs.json +25 -0
- package/lib/ActivityIndicator/Spinner.js +7 -7
- package/lib/ActivityIndicator/Spinner.native.js +2 -2
- package/lib/BaseProvider/HydrationContext.js +1 -1
- package/lib/Box/Box.js +1 -1
- package/lib/Button/ButtonBase.js +2 -2
- package/lib/Button/ButtonGroup.js +1 -1
- package/lib/Carousel/Carousel.js +2 -4
- package/lib/Carousel/CarouselContext.js +1 -1
- package/lib/Carousel/CarouselFirstFocus/CarouselFirstFocus.js +1 -1
- package/lib/Carousel/CarouselThumbnail.js +2 -2
- package/lib/Checkbox/Checkbox.js +1 -1
- package/lib/Checkbox/CheckboxGroup.js +2 -2
- package/lib/Divider/Divider.js +2 -2
- package/lib/Fieldset/Fieldset.js +1 -5
- package/lib/Fieldset/FieldsetContainer.js +1 -1
- package/lib/FlexGrid/Col/Col.js +1 -1
- package/lib/Icon/Icon.js +1 -1
- package/lib/List/ListItemContent.js +5 -2
- package/lib/List/PressableListItemBase.js +2 -0
- package/lib/MultiSelectFilter/MultiSelectFilter.js +2 -2
- package/lib/Pagination/PageButton.js +2 -2
- package/lib/Pagination/Pagination.js +3 -5
- package/lib/Pagination/usePagination.js +2 -2
- package/lib/Progress/ProgressBar.js +3 -3
- package/lib/Progress/ProgressBarBackground.js +3 -3
- package/lib/Radio/Radio.js +2 -2
- package/lib/Radio/RadioGroup.js +2 -2
- package/lib/RadioCard/RadioCard.js +1 -1
- package/lib/RadioCard/RadioCardGroup.js +2 -2
- package/lib/Search/Search.js +1 -1
- package/lib/SideNav/SideNav.js +2 -2
- package/lib/Skeleton/Skeleton.js +1 -1
- package/lib/Skeleton/skeletonWebAnimation.js +1 -1
- package/lib/StackView/StackWrap.js +1 -3
- package/lib/StackView/getStackedContent.js +2 -2
- package/lib/Tabs/Tabs.js +2 -4
- package/lib/Tags/Tags.js +1 -1
- package/lib/TextInput/TextInputBase.js +1 -1
- package/lib/ThemeProvider/utils/styles.js +8 -3
- package/lib/ThemeProvider/utils/theme-tokens.js +9 -7
- package/lib/Timeline/Timeline.js +1 -1
- package/lib/ToggleSwitch/ToggleSwitch.js +1 -1
- package/lib/ToggleSwitch/ToggleSwitchGroup.js +1 -1
- package/lib/Tooltip/Backdrop.js +10 -2
- package/lib/Tooltip/Tooltip.js +2 -2
- package/lib/Validator/Validator.js +14 -15
- package/lib/utils/animation/useVerticalExpandAnimation.js +1 -1
- package/lib/utils/children.js +2 -2
- package/lib/utils/input.js +13 -7
- package/lib/utils/props/componentPropType.js +3 -3
- package/lib/utils/props/selectSystemProps.js +2 -2
- package/lib/utils/props/tokens.js +2 -2
- package/lib/utils/useSpacingScale.js +1 -3
- package/lib/utils/useUniqueId.js +1 -1
- package/lib-module/ActivityIndicator/Spinner.js +7 -7
- package/lib-module/ActivityIndicator/Spinner.native.js +2 -2
- package/lib-module/BaseProvider/HydrationContext.js +1 -1
- package/lib-module/Box/Box.js +1 -1
- package/lib-module/Button/ButtonBase.js +2 -2
- package/lib-module/Button/ButtonGroup.js +1 -1
- package/lib-module/Carousel/Carousel.js +2 -4
- package/lib-module/Carousel/CarouselContext.js +1 -1
- package/lib-module/Carousel/CarouselFirstFocus/CarouselFirstFocus.js +1 -1
- package/lib-module/Carousel/CarouselThumbnail.js +2 -2
- package/lib-module/Checkbox/Checkbox.js +1 -1
- package/lib-module/Checkbox/CheckboxGroup.js +2 -2
- package/lib-module/Divider/Divider.js +2 -2
- package/lib-module/Fieldset/Fieldset.js +1 -5
- package/lib-module/Fieldset/FieldsetContainer.js +1 -1
- package/lib-module/FlexGrid/Col/Col.js +1 -1
- package/lib-module/Icon/Icon.js +1 -1
- package/lib-module/List/ListItemContent.js +5 -2
- package/lib-module/List/PressableListItemBase.js +2 -0
- package/lib-module/MultiSelectFilter/MultiSelectFilter.js +2 -2
- package/lib-module/Pagination/PageButton.js +2 -2
- package/lib-module/Pagination/Pagination.js +3 -5
- package/lib-module/Pagination/usePagination.js +2 -2
- package/lib-module/Progress/ProgressBar.js +3 -3
- package/lib-module/Progress/ProgressBarBackground.js +3 -3
- package/lib-module/Radio/Radio.js +2 -2
- package/lib-module/Radio/RadioGroup.js +2 -2
- package/lib-module/RadioCard/RadioCard.js +1 -1
- package/lib-module/RadioCard/RadioCardGroup.js +2 -2
- package/lib-module/Search/Search.js +1 -1
- package/lib-module/SideNav/SideNav.js +2 -2
- package/lib-module/Skeleton/Skeleton.js +1 -1
- package/lib-module/Skeleton/skeletonWebAnimation.js +1 -1
- package/lib-module/StackView/StackWrap.js +1 -3
- package/lib-module/StackView/getStackedContent.js +2 -2
- package/lib-module/Tabs/Tabs.js +2 -4
- package/lib-module/Tags/Tags.js +1 -1
- package/lib-module/TextInput/TextInputBase.js +1 -1
- package/lib-module/ThemeProvider/utils/styles.js +8 -3
- package/lib-module/ThemeProvider/utils/theme-tokens.js +9 -7
- package/lib-module/Timeline/Timeline.js +1 -1
- package/lib-module/ToggleSwitch/ToggleSwitch.js +1 -1
- package/lib-module/ToggleSwitch/ToggleSwitchGroup.js +1 -1
- package/lib-module/Tooltip/Backdrop.js +10 -2
- package/lib-module/Tooltip/Tooltip.js +2 -2
- package/lib-module/Validator/Validator.js +14 -15
- package/lib-module/utils/animation/useVerticalExpandAnimation.js +1 -1
- package/lib-module/utils/children.js +2 -2
- package/lib-module/utils/input.js +13 -7
- package/lib-module/utils/props/componentPropType.js +3 -3
- package/lib-module/utils/props/selectSystemProps.js +2 -2
- package/lib-module/utils/props/tokens.js +2 -2
- package/lib-module/utils/useSpacingScale.js +1 -3
- package/lib-module/utils/useUniqueId.js +1 -1
- package/package.json +2 -2
- package/src/Fieldset/Fieldset.jsx +1 -7
- package/src/Fieldset/FieldsetContainer.jsx +1 -1
- package/src/List/ListItemContent.jsx +4 -2
- package/src/List/PressableListItemBase.jsx +2 -0
- package/src/ThemeProvider/utils/styles.js +5 -0
- package/src/Validator/Validator.jsx +2 -1
package/lib-module/Box/Box.js
CHANGED
|
@@ -26,7 +26,7 @@ const selectBoxStyles = tokens => {
|
|
|
26
26
|
}
|
|
27
27
|
} = tokens;
|
|
28
28
|
styles = { ...styles,
|
|
29
|
-
backgroundImage:
|
|
29
|
+
backgroundImage: `linear-gradient(${angle}deg, ${stopOne.color}, 75% , ${stopTwo.color})`
|
|
30
30
|
};
|
|
31
31
|
}
|
|
32
32
|
|
|
@@ -76,7 +76,7 @@ const selectOuterWidthStyles = _ref3 => {
|
|
|
76
76
|
|
|
77
77
|
|
|
78
78
|
if (Platform.OS === 'web') {
|
|
79
|
-
widthStyles.width =
|
|
79
|
+
widthStyles.width = `calc(${width} + ${outerBorderOffset * 2}px)`;
|
|
80
80
|
return widthStyles;
|
|
81
81
|
} // Can't use calc() on native but (unlike on web) flexGrow fills the container width here
|
|
82
82
|
|
|
@@ -163,7 +163,7 @@ const selectWebOnlyStyles = (inactive, themeTokens, _ref7) => {
|
|
|
163
163
|
return Platform.select({
|
|
164
164
|
web: {
|
|
165
165
|
// if it would overflow the container, wraps instead
|
|
166
|
-
maxWidth:
|
|
166
|
+
maxWidth: `calc(100% + ${getOuterBorderOffset(themeTokens) * 2}px)`,
|
|
167
167
|
outline: 'none',
|
|
168
168
|
// removes the default browser :focus outline
|
|
169
169
|
...getCursorStyle(inactive, accessibilityRole)
|
|
@@ -68,7 +68,7 @@ const ButtonGroup = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
68
68
|
const uniqueFields = ['id', 'label'];
|
|
69
69
|
|
|
70
70
|
if (!containUniqueFields(items, uniqueFields)) {
|
|
71
|
-
throw new Error(
|
|
71
|
+
throw new Error(`ButtonGroup items must have unique ${uniqueFields.join(', ')}`);
|
|
72
72
|
} // Some web screenreaders e.g. MacOS Voiceover don't handle radiogroups properly unless radio is direct child of radiogroup
|
|
73
73
|
|
|
74
74
|
|
|
@@ -128,8 +128,6 @@ const [selectProps, selectedSystemPropTypes] = selectSystemProps([a11yProps, vie
|
|
|
128
128
|
*/
|
|
129
129
|
|
|
130
130
|
const Carousel = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
131
|
-
var _systemProps$accessib;
|
|
132
|
-
|
|
133
131
|
let {
|
|
134
132
|
tokens,
|
|
135
133
|
variant,
|
|
@@ -403,7 +401,7 @@ const Carousel = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
|
403
401
|
const getCopyWithPlaceholders = React.useCallback(copyKey => {
|
|
404
402
|
const copyText = getCopy(copyKey).replace(/%\{title\}/g, title).replace(/%\{itemLabel\}/g, itemLabel).replace(/%\{stepNumber\}/g, activeIndex + 1).replace(/%\{stepCount\}/g, childrenArray.length); // First word might be a lowercase placeholder: capitalize the first letter
|
|
405
403
|
|
|
406
|
-
return
|
|
404
|
+
return `${copyText[0].toUpperCase()}${copyText.slice(1)}`;
|
|
407
405
|
}, [activeIndex, childrenArray.length, itemLabel, getCopy, title]);
|
|
408
406
|
const activePanelNavigation = tabs && showPanelTabs ? /*#__PURE__*/_jsx(CarouselTabsPanel, {
|
|
409
407
|
items: tabs
|
|
@@ -426,7 +424,7 @@ const Carousel = /*#__PURE__*/React.forwardRef((_ref, ref) => {
|
|
|
426
424
|
// otherwise read the current position on focus
|
|
427
425
|
|
|
428
426
|
|
|
429
|
-
const containerAccessibilityLabel =
|
|
427
|
+
const containerAccessibilityLabel = systemProps.accessibilityLabel ?? isFirstFocusContainer ? `${title ? `${title} ` : ''}${getCopyWithPlaceholders('stepTrackerLabel')}` : title;
|
|
430
428
|
const containerProps = {
|
|
431
429
|
accessibilityLabel: containerAccessibilityLabel,
|
|
432
430
|
// If used for focus, attach the ref and draw a focus box around the whole carousel
|
|
@@ -36,7 +36,7 @@ function useCarousel() {
|
|
|
36
36
|
const context = React.useContext(CarouselContext);
|
|
37
37
|
|
|
38
38
|
if (context === undefined) {
|
|
39
|
-
throw new Error(
|
|
39
|
+
throw new Error(`'useCarousel' must be used within a 'CarouselProvider'`);
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
return context;
|
|
@@ -21,7 +21,7 @@ const CarouselFirstFocus = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
21
21
|
} = useCarousel(); // TODO: integrate skip link description if behaving as skip link.
|
|
22
22
|
// Consider moving this content to aria-live area while only the skip link is focused.
|
|
23
23
|
|
|
24
|
-
const accessibilityLabel =
|
|
24
|
+
const accessibilityLabel = `${title}, ${getCopyWithPlaceholders('stepTrackerLabel')}`;
|
|
25
25
|
const accessibilityRole = Platform.select({
|
|
26
26
|
web: 'link',
|
|
27
27
|
// The focused item will ultimately be a skip link.
|
|
@@ -25,7 +25,7 @@ const CarouselThumbnail = _ref => {
|
|
|
25
25
|
goTo,
|
|
26
26
|
themeTokens
|
|
27
27
|
} = useCarousel();
|
|
28
|
-
const thumbnailTitle = alt
|
|
28
|
+
const thumbnailTitle = alt ?? getCopyWithPlaceholders('stepTrackerLabel').replace(/%\{itemLabel\}/g, itemLabel).replace(/%\{stepNumber\}/g, index).replace(/%\{stepCount\}/g, totalItems);
|
|
29
29
|
|
|
30
30
|
const handlePress = () => goTo(index);
|
|
31
31
|
|
|
@@ -68,7 +68,7 @@ const CarouselThumbnail = _ref => {
|
|
|
68
68
|
style: [styles.pressable, index === activeIndex && styles.selected],
|
|
69
69
|
children: /*#__PURE__*/_jsx(Image, {
|
|
70
70
|
accessibilityIgnoresInvertColors: true,
|
|
71
|
-
accessibilityLabel: accessibilityLabel
|
|
71
|
+
accessibilityLabel: accessibilityLabel ?? alt,
|
|
72
72
|
source: src,
|
|
73
73
|
style: styles.image,
|
|
74
74
|
title: thumbnailTitle
|
|
@@ -187,7 +187,7 @@ const Checkbox = /*#__PURE__*/forwardRef((_ref5, ref) => {
|
|
|
187
187
|
};
|
|
188
188
|
|
|
189
189
|
const uniqueId = useUniqueId('checkbox');
|
|
190
|
-
const inputId = id
|
|
190
|
+
const inputId = id ?? uniqueId;
|
|
191
191
|
const {
|
|
192
192
|
themeOptions
|
|
193
193
|
} = useTheme();
|
|
@@ -97,7 +97,7 @@ const CheckboxGroup = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
97
97
|
const uniqueFields = ['id', 'label'];
|
|
98
98
|
|
|
99
99
|
if (!containUniqueFields(items, uniqueFields)) {
|
|
100
|
-
throw new Error(
|
|
100
|
+
throw new Error(`CheckboxGroup items must have unique ${uniqueFields.join(', ')}`);
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
const checkboxes = items.map((_ref2, index) => {
|
|
@@ -108,7 +108,7 @@ const CheckboxGroup = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
108
108
|
ref: itemRef,
|
|
109
109
|
...itemRest
|
|
110
110
|
} = _ref2;
|
|
111
|
-
const checkboxId = id ||
|
|
111
|
+
const checkboxId = id || `Checkbox[${index}]`;
|
|
112
112
|
|
|
113
113
|
const handleChange = (newCheckedState, event) => {
|
|
114
114
|
if (typeof itemOnChange === 'function') itemOnChange(newCheckedState, event);
|
|
@@ -101,9 +101,9 @@ const Divider = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
101
101
|
};
|
|
102
102
|
return /*#__PURE__*/_jsxs(_Fragment, {
|
|
103
103
|
children: [/*#__PURE__*/_jsx(Spacer, { ...spacerProps,
|
|
104
|
-
testID: testID ?
|
|
104
|
+
testID: testID ? `${testID}-Spacer-before` : undefined
|
|
105
105
|
}), divider, /*#__PURE__*/_jsx(Spacer, { ...spacerProps,
|
|
106
|
-
testID: testID ?
|
|
106
|
+
testID: testID ? `${testID}-Spacer-after` : undefined
|
|
107
107
|
})]
|
|
108
108
|
});
|
|
109
109
|
});
|
|
@@ -77,7 +77,7 @@ const Fieldset = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
77
77
|
space,
|
|
78
78
|
preserveFragments: true
|
|
79
79
|
});
|
|
80
|
-
const borderStyle = validation === 'error' && showErrorBorder
|
|
80
|
+
const borderStyle = validation === 'error' && showErrorBorder ? staticStyles.errorBorder : null;
|
|
81
81
|
return /*#__PURE__*/_jsx(FieldsetContainer, {
|
|
82
82
|
ref: ref,
|
|
83
83
|
inactive: inactive,
|
|
@@ -95,10 +95,6 @@ const staticStyles = StyleSheet.create({
|
|
|
95
95
|
borderColor: 'red',
|
|
96
96
|
borderRadius: 10,
|
|
97
97
|
padding: 8
|
|
98
|
-
},
|
|
99
|
-
noBorder: {
|
|
100
|
-
padding: 9,
|
|
101
|
-
border: 'unset'
|
|
102
98
|
}
|
|
103
99
|
});
|
|
104
100
|
Fieldset.displayName = 'Fieldset';
|
|
@@ -16,7 +16,7 @@ const FieldsetContainer = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
16
16
|
borderStyle
|
|
17
17
|
} = _ref;
|
|
18
18
|
// If needs border for error design or reset the component style
|
|
19
|
-
const styleContainer = showBorderStyle ? borderStyle : cssReset;
|
|
19
|
+
const styleContainer = showBorderStyle && borderStyle ? borderStyle : cssReset;
|
|
20
20
|
return /*#__PURE__*/_jsx("fieldset", {
|
|
21
21
|
ref: ref,
|
|
22
22
|
disabled: inactive,
|
|
@@ -44,7 +44,7 @@ const Col = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
44
44
|
const horizontalAlignLevel = getHorizontalAlignLevel();
|
|
45
45
|
|
|
46
46
|
const toPercent = num => {
|
|
47
|
-
return
|
|
47
|
+
return `${num / 12 * 100}%`;
|
|
48
48
|
};
|
|
49
49
|
|
|
50
50
|
const calculateWidth = value => {
|
package/lib-module/Icon/Icon.js
CHANGED
|
@@ -30,7 +30,7 @@ const Icon = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
30
30
|
// TODO: systematise animations.
|
|
31
31
|
// https://github.com/telus/universal-design-system/issues/487
|
|
32
32
|
transition: 'transform 200ms, color 200ms',
|
|
33
|
-
transform: [themeTokens.scale ?
|
|
33
|
+
transform: [themeTokens.scale ? `scale(${themeTokens.scale})` : '', themeTokens.translateX ? `translateX(${themeTokens.translateX}px)` : '', themeTokens.translateY ? `translateY(${themeTokens.translateY}px)` : ''].filter(exists => exists).join(' ')
|
|
34
34
|
},
|
|
35
35
|
dataSet: dataSet,
|
|
36
36
|
children: iconContent
|
|
@@ -9,7 +9,8 @@ export const tokenTypes = {
|
|
|
9
9
|
itemFontWeight: PropTypes.string.isRequired,
|
|
10
10
|
itemFontSize: PropTypes.number.isRequired,
|
|
11
11
|
itemLineHeight: PropTypes.number.isRequired,
|
|
12
|
-
itemFontName: PropTypes.string.isRequired
|
|
12
|
+
itemFontName: PropTypes.string.isRequired,
|
|
13
|
+
itemFontColor: PropTypes.string
|
|
13
14
|
};
|
|
14
15
|
|
|
15
16
|
const selectItemTextStyles = (_ref, themeOptions) => {
|
|
@@ -17,9 +18,11 @@ const selectItemTextStyles = (_ref, themeOptions) => {
|
|
|
17
18
|
itemFontWeight,
|
|
18
19
|
itemFontSize,
|
|
19
20
|
itemLineHeight,
|
|
20
|
-
itemFontName
|
|
21
|
+
itemFontName,
|
|
22
|
+
itemFontColor
|
|
21
23
|
} = _ref;
|
|
22
24
|
return applyTextStyles({
|
|
25
|
+
fontColor: itemFontColor,
|
|
23
26
|
fontWeight: itemFontWeight,
|
|
24
27
|
fontSize: itemFontSize,
|
|
25
28
|
lineHeight: itemLineHeight,
|
|
@@ -15,6 +15,7 @@ import { jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
15
15
|
const selectPressableStyles = _ref => {
|
|
16
16
|
let {
|
|
17
17
|
backgroundColor,
|
|
18
|
+
itemFontColor,
|
|
18
19
|
paddingLeft,
|
|
19
20
|
paddingRight,
|
|
20
21
|
paddingTop,
|
|
@@ -23,6 +24,7 @@ const selectPressableStyles = _ref => {
|
|
|
23
24
|
} = _ref;
|
|
24
25
|
return {
|
|
25
26
|
backgroundColor,
|
|
27
|
+
itemFontColor,
|
|
26
28
|
paddingLeft,
|
|
27
29
|
paddingRight,
|
|
28
30
|
paddingTop,
|
|
@@ -83,13 +83,13 @@ const MultiSelectFilter = /*#__PURE__*/forwardRef((_ref3, ref) => {
|
|
|
83
83
|
copy
|
|
84
84
|
});
|
|
85
85
|
const [isOpen, setIsOpen] = useState(false);
|
|
86
|
-
const [checkedIds, setCheckedIds] = useState(currentValues
|
|
86
|
+
const [checkedIds, setCheckedIds] = useState(currentValues ?? []);
|
|
87
87
|
const colSize = items.length > rowLimit ? 2 : 1;
|
|
88
88
|
const isSelected = currentValues.length > 0;
|
|
89
89
|
const uniqueFields = ['id', 'label'];
|
|
90
90
|
|
|
91
91
|
if (!containUniqueFields(items, uniqueFields)) {
|
|
92
|
-
throw new Error(
|
|
92
|
+
throw new Error(`MultiSelectFilter items must have unique ${uniqueFields.join(', ')}`);
|
|
93
93
|
} // Pass an object of relevant component state as first argument for any passed-in press handlers
|
|
94
94
|
|
|
95
95
|
|
|
@@ -33,8 +33,8 @@ const PageButton = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
33
33
|
key: 'active-item'
|
|
34
34
|
} : {};
|
|
35
35
|
const accessibilityRole = href !== undefined ? 'link' : 'button';
|
|
36
|
-
const activeLabel = isActive ?
|
|
37
|
-
const accessibilityLabel =
|
|
36
|
+
const activeLabel = isActive ? ` ${getCopy('currentLabel')}` : '';
|
|
37
|
+
const accessibilityLabel = `${getCopy('goToLabel')} ${label}${activeLabel}`;
|
|
38
38
|
const {
|
|
39
39
|
hrefAttrs,
|
|
40
40
|
rest
|
|
@@ -84,11 +84,9 @@ const Pagination = /*#__PURE__*/forwardRef((_ref2, ref) => {
|
|
|
84
84
|
LinkRouter: LinkRouter,
|
|
85
85
|
linkRouterProps: linkRouterProps
|
|
86
86
|
}), ...items.map((_child, itemIndex) => {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
const buttonLabel = "".concat(itemIndex + 1);
|
|
87
|
+
const buttonLabel = `${itemIndex + 1}`;
|
|
90
88
|
const itemProps = getItemProps(itemIndex);
|
|
91
|
-
const ItemLinkRouter =
|
|
89
|
+
const ItemLinkRouter = itemProps.LinkRouter ?? LinkRouter;
|
|
92
90
|
const itemLinkRouterProps = { ...linkRouterProps,
|
|
93
91
|
...itemProps.linkRouterProps
|
|
94
92
|
};
|
|
@@ -125,7 +123,7 @@ const Pagination = /*#__PURE__*/forwardRef((_ref2, ref) => {
|
|
|
125
123
|
ref: ref,
|
|
126
124
|
...selectProps(rest),
|
|
127
125
|
children: buttons // keep the keys in-line with the page numbers regardless of which buttons are actually rendered
|
|
128
|
-
.map((element, index) => [element,
|
|
126
|
+
.map((element, index) => [element, `page-${index + 1}`]).filter(_ref3 => {
|
|
129
127
|
let [element] = _ref3;
|
|
130
128
|
return element !== null;
|
|
131
129
|
}).map(_ref4 => {
|
|
@@ -14,7 +14,7 @@ function usePagination(_ref) {
|
|
|
14
14
|
);
|
|
15
15
|
|
|
16
16
|
const getItemProps = index => {
|
|
17
|
-
var _items$index
|
|
17
|
+
var _items$index;
|
|
18
18
|
|
|
19
19
|
const {
|
|
20
20
|
onPress,
|
|
@@ -22,7 +22,7 @@ function usePagination(_ref) {
|
|
|
22
22
|
hrefAttrs,
|
|
23
23
|
variant,
|
|
24
24
|
tokens
|
|
25
|
-
} = (
|
|
25
|
+
} = ((_items$index = items[index]) === null || _items$index === void 0 ? void 0 : _items$index.props) ?? {};
|
|
26
26
|
return {
|
|
27
27
|
onPress,
|
|
28
28
|
href,
|
|
@@ -21,7 +21,7 @@ const selectBarStyles = (_ref, percentage) => {
|
|
|
21
21
|
borderRadius,
|
|
22
22
|
outlineWidth,
|
|
23
23
|
outlineColor,
|
|
24
|
-
width:
|
|
24
|
+
width: `${percentage}%`
|
|
25
25
|
};
|
|
26
26
|
};
|
|
27
27
|
/**
|
|
@@ -82,7 +82,7 @@ const ProgressBar = /*#__PURE__*/forwardRef((_ref2, ref) => {
|
|
|
82
82
|
min: 0,
|
|
83
83
|
max: 100,
|
|
84
84
|
now: percentage,
|
|
85
|
-
text:
|
|
85
|
+
text: `${percentage}%`
|
|
86
86
|
},
|
|
87
87
|
...rest
|
|
88
88
|
});
|
|
@@ -90,7 +90,7 @@ const ProgressBar = /*#__PURE__*/forwardRef((_ref2, ref) => {
|
|
|
90
90
|
ref: ref,
|
|
91
91
|
style: [staticStyles.bar, selectBarStyles(themeTokens, percentage)],
|
|
92
92
|
...selectedProps,
|
|
93
|
-
children: children
|
|
93
|
+
children: children ?? /*#__PURE__*/_jsx(ProgressBarBackground, {
|
|
94
94
|
variant: variant
|
|
95
95
|
})
|
|
96
96
|
}) : null;
|
|
@@ -3,8 +3,8 @@ import ImageBackground from "react-native-web/dist/exports/ImageBackground";
|
|
|
3
3
|
import StyleSheet from "react-native-web/dist/exports/StyleSheet";
|
|
4
4
|
import { variantProp } from '../utils';
|
|
5
5
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
6
|
-
const inactiveBackground =
|
|
7
|
-
const negativeBackground =
|
|
6
|
+
const inactiveBackground = `%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='24'%3E%3Cdefs%3E%3Cpattern id='DisabledProgress7' patternUnits='userSpaceOnUse' width='8' height='8'%3E%3Crect width='8' height='8' fill='%23B2B9BF'%3E%3C/rect%3E%3Ccircle cx='4' cy='4' r='2' fill='%23676E73' stroke='%23676E73' stroke-width='0'%3E%3C/circle%3E%3Ccircle cx='0' cy='0' r='2' fill='%23676E73' stroke='%23676E73' stroke-width='0'%3E%3C/circle%3E%3Ccircle cx='0' cy='8' r='2' fill='%23676E73' stroke='%23676E73' stroke-width='0'%3E%3C/circle%3E%3Ccircle cx='8' cy='0' r='2' fill='%23676E73' stroke='%23676E73' stroke-width='0'%3E%3C/circle%3E%3Ccircle cx='8' cy='8' r='2' fill='%23676E73' stroke='%23676E73' stroke-width='0'%3E%3C/circle%3E%3C/pattern%3E%3C/defs%3E%3Cpath d='M 0 0 L 0 140 L 2000 2000 L 2000 0 Z' style='fill: url("%23DisabledProgress7");'%3E%3C/path%3E%3C/svg%3E`;
|
|
7
|
+
const negativeBackground = `%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='24'%3E%3Cdefs%3E%3Cpattern id='NegativeProgress6' patternUnits='userSpaceOnUse' width='8' height='8'%3E%3Crect width='8' height='8' fill='%23C12335'%3E%3C/rect%3E%3Cpath d='M 0,8 l 8,-8 M -2,2 l 4,-4 M 6,10 l 4,-4' stroke-width='2' shape-rendering='auto' stroke='%23e7adb4' stroke-linecap='square'%3E%3C/path%3E%3C/pattern%3E%3C/defs%3E%3Cpath d='M 0 0 L 0 140 L 2000 2000 L 2000 0 Z' style='fill: url("%23NegativeProgress6");'%3E%3C/path%3E%3C/svg%3E`;
|
|
8
8
|
const ProgressBarBackground = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
9
9
|
let {
|
|
10
10
|
variant
|
|
@@ -22,7 +22,7 @@ const ProgressBarBackground = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
22
22
|
return /*#__PURE__*/_jsx(ImageBackground, {
|
|
23
23
|
ref: ref,
|
|
24
24
|
source: {
|
|
25
|
-
uri:
|
|
25
|
+
uri: `data:image/svg+xml,${source}`
|
|
26
26
|
},
|
|
27
27
|
style: staticStyles.imageBackground
|
|
28
28
|
});
|
|
@@ -46,7 +46,7 @@ const selectDescriptionStyles = _ref2 => {
|
|
|
46
46
|
labelMarginLeft = 0
|
|
47
47
|
} = _ref2;
|
|
48
48
|
return {
|
|
49
|
-
marginLeft: descriptionMarginLeft
|
|
49
|
+
marginLeft: descriptionMarginLeft ?? containerPaddingLeft + inputSize + labelMarginLeft,
|
|
50
50
|
...applyTextStyles({
|
|
51
51
|
fontSize: descriptionFontSize,
|
|
52
52
|
lineHeight: descriptionLineHeight
|
|
@@ -150,7 +150,7 @@ const Radio = /*#__PURE__*/forwardRef((_ref4, ref) => {
|
|
|
150
150
|
};
|
|
151
151
|
|
|
152
152
|
const uniqueId = useUniqueId('radio');
|
|
153
|
-
const inputId = id
|
|
153
|
+
const inputId = id ?? uniqueId;
|
|
154
154
|
const selectedProps = selectProps({
|
|
155
155
|
accessibilityRole: 'radio',
|
|
156
156
|
accessibilityState: {
|
|
@@ -99,7 +99,7 @@ const RadioGroup = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
99
99
|
const uniqueFields = ['id', 'label'];
|
|
100
100
|
|
|
101
101
|
if (!containUniqueFields(items, uniqueFields)) {
|
|
102
|
-
throw new Error(
|
|
102
|
+
throw new Error(`RadioGroup items must have unique ${uniqueFields.join(', ')}`);
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
const radios = items.map((_ref2, index) => {
|
|
@@ -111,7 +111,7 @@ const RadioGroup = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
111
111
|
description,
|
|
112
112
|
...itemRest
|
|
113
113
|
} = _ref2;
|
|
114
|
-
const radioId = id ||
|
|
114
|
+
const radioId = id || `Radio[${index}]`;
|
|
115
115
|
const isChecked = currentValue === radioId;
|
|
116
116
|
|
|
117
117
|
const handleChange = (newCheckedState, event) => {
|
|
@@ -79,7 +79,7 @@ const RadioCard = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
79
79
|
};
|
|
80
80
|
|
|
81
81
|
const uniqueId = useUniqueId('RadioCard');
|
|
82
|
-
const inputId = id
|
|
82
|
+
const inputId = id ?? uniqueId;
|
|
83
83
|
const getTokens = useThemeTokensCallback('RadioCard', tokens, variant);
|
|
84
84
|
|
|
85
85
|
const getCardTokens = cardState => selectPressableCardTokens(getTokens(cardState));
|
|
@@ -105,7 +105,7 @@ const RadioCardGroup = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
105
105
|
const uniqueFields = ['id'];
|
|
106
106
|
|
|
107
107
|
if (!containUniqueFields(items, uniqueFields)) {
|
|
108
|
-
throw new Error(
|
|
108
|
+
throw new Error(`RadioCardGroup items must have unique ${uniqueFields.join(', ')}`);
|
|
109
109
|
}
|
|
110
110
|
|
|
111
111
|
return /*#__PURE__*/_jsx(Fieldset, {
|
|
@@ -135,7 +135,7 @@ const RadioCardGroup = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
135
135
|
onChange: itemOnChange,
|
|
136
136
|
...itemRest
|
|
137
137
|
} = _ref2;
|
|
138
|
-
const cardId = id ||
|
|
138
|
+
const cardId = id || `RadioCard[${index}]`;
|
|
139
139
|
|
|
140
140
|
const handleChange = (newCheckedState, event) => {
|
|
141
141
|
if (typeof itemOnChange === 'function') itemOnChange(newCheckedState, event);
|
|
@@ -125,7 +125,7 @@ const Search = /*#__PURE__*/forwardRef((_ref3, ref) => {
|
|
|
125
125
|
|
|
126
126
|
const a11yLabelText = accessibilityLabel || getCopy('accessibilityLabel'); // Placeholder is optional and may be unset by passing an empty string
|
|
127
127
|
|
|
128
|
-
const placeholderText = placeholder
|
|
128
|
+
const placeholderText = placeholder ?? a11yLabelText;
|
|
129
129
|
const {
|
|
130
130
|
nativeID,
|
|
131
131
|
testID,
|
|
@@ -63,7 +63,7 @@ const SideNav = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
63
63
|
|
|
64
64
|
const renderItem = (item, index, groupId) => {
|
|
65
65
|
const {
|
|
66
|
-
itemId =
|
|
66
|
+
itemId = `item-${index}`,
|
|
67
67
|
onPress
|
|
68
68
|
} = item.props;
|
|
69
69
|
|
|
@@ -91,7 +91,7 @@ const SideNav = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
91
91
|
|
|
92
92
|
if (child.type === ItemsGroup) {
|
|
93
93
|
const {
|
|
94
|
-
groupId =
|
|
94
|
+
groupId = `group-${index}`
|
|
95
95
|
} = child.props;
|
|
96
96
|
const isGroupActive = active.itemId !== undefined && active.groupId === groupId;
|
|
97
97
|
|
|
@@ -124,7 +124,7 @@ const Skeleton = /*#__PURE__*/forwardRef((_ref5, ref) => {
|
|
|
124
124
|
return /*#__PURE__*/_jsx(Component, {
|
|
125
125
|
testID: "skeleton",
|
|
126
126
|
style: [selectSkeletonStyles(themeTokens), getAnimationBasedOnPlatform(), getStyledBasedOnShape()]
|
|
127
|
-
},
|
|
127
|
+
}, `skeleton-${index + 1}`);
|
|
128
128
|
};
|
|
129
129
|
|
|
130
130
|
return /*#__PURE__*/_jsx(StackView, {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ANIMATION_DURATION, DEFAULT_OPACITY, OPACITY_STOP } from './skeleton.constant';
|
|
2
2
|
export default {
|
|
3
|
-
animationDuration:
|
|
3
|
+
animationDuration: `${ANIMATION_DURATION}ms`,
|
|
4
4
|
animationTimingFunction: 'ease-in-out',
|
|
5
5
|
animationDelay: '0.5s',
|
|
6
6
|
animationIterationCount: 'infinite',
|
|
@@ -24,14 +24,12 @@ const exampleGapValue = '1px';
|
|
|
24
24
|
*/
|
|
25
25
|
|
|
26
26
|
const StackWrap = /*#__PURE__*/forwardRef((props, ref) => {
|
|
27
|
-
var _props$gap;
|
|
28
|
-
|
|
29
27
|
const [canUseCSSGap, setCanUseCSSGap] = useState(false);
|
|
30
28
|
const {
|
|
31
29
|
space
|
|
32
30
|
} = props; // Don't apply separate gap if `null` or `undefined`, so can be unset in Storybook etc
|
|
33
31
|
|
|
34
|
-
const gap =
|
|
32
|
+
const gap = props.gap ?? space;
|
|
35
33
|
const gapEqualsSpace = gap === space; // If possible, use the cleaner implementation that applies CSS `gap` styles to the container,
|
|
36
34
|
// preserving direct parent-child relationships between the container and each item, which
|
|
37
35
|
// can result in clearer descriptions on some screen readers (e.g. radio "X of Y" on MacOS).
|
|
@@ -48,7 +48,7 @@ const getStackedContent = (children, _ref) => {
|
|
|
48
48
|
const topLevelChildren = preserveFragments ? children : unpackFragment(children);
|
|
49
49
|
const validChildren = Children.toArray(topLevelChildren).filter(Boolean);
|
|
50
50
|
const content = validChildren.reduce((newChildren, child, index) => {
|
|
51
|
-
const boxID =
|
|
51
|
+
const boxID = `Stack-Box-${index}`;
|
|
52
52
|
const item = box ?
|
|
53
53
|
/*#__PURE__*/
|
|
54
54
|
// If wrapped in Box, that Box needs a key.
|
|
@@ -58,7 +58,7 @@ const getStackedContent = (children, _ref) => {
|
|
|
58
58
|
testID: boxID
|
|
59
59
|
}, child) : child;
|
|
60
60
|
if (!index || !space && !divider) return [...newChildren, item];
|
|
61
|
-
const testID =
|
|
61
|
+
const testID = `Stack-${divider ? 'Divider' : 'Spacer'}-${index}`;
|
|
62
62
|
const commonProps = {
|
|
63
63
|
testID,
|
|
64
64
|
key: testID,
|
package/lib-module/Tabs/Tabs.js
CHANGED
|
@@ -37,8 +37,6 @@ const getDefaultTabItemAccessibilityRole = parentRole => {
|
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
const Tabs = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
40
|
-
var _restProps$accessibil;
|
|
41
|
-
|
|
42
40
|
let {
|
|
43
41
|
tokens,
|
|
44
42
|
itemTokens,
|
|
@@ -76,7 +74,7 @@ const Tabs = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
76
74
|
if (hashId) setTimeout(setValue(hashId, event), 500);
|
|
77
75
|
}, [items, setValue]), isPositioningReady);
|
|
78
76
|
const restProps = selectProps(rest);
|
|
79
|
-
const parentAccessibilityRole =
|
|
77
|
+
const parentAccessibilityRole = restProps.accessibilityRole ?? 'tablist';
|
|
80
78
|
const defaultTabItemAccessibiltyRole = getDefaultTabItemAccessibilityRole(parentAccessibilityRole);
|
|
81
79
|
return /*#__PURE__*/_jsx(HorizontalScroll, {
|
|
82
80
|
ref: ref,
|
|
@@ -101,7 +99,7 @@ const Tabs = /*#__PURE__*/forwardRef((_ref, ref) => {
|
|
|
101
99
|
linkRouterProps: itemLinkRouterProps,
|
|
102
100
|
...itemRest
|
|
103
101
|
} = _ref3;
|
|
104
|
-
const itemId = id
|
|
102
|
+
const itemId = id ?? label;
|
|
105
103
|
const isSelected = Boolean(currentValue && currentValue === itemId);
|
|
106
104
|
|
|
107
105
|
const handlePress = event => {
|
package/lib-module/Tags/Tags.js
CHANGED
|
@@ -108,7 +108,7 @@ const Tags = /*#__PURE__*/forwardRef((_ref2, ref) => {
|
|
|
108
108
|
const uniqueFields = ['id', 'label'];
|
|
109
109
|
|
|
110
110
|
if (!containUniqueFields(items, uniqueFields)) {
|
|
111
|
-
throw new Error(
|
|
111
|
+
throw new Error(`Tags items must have unique ${uniqueFields.join(', ')}`);
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
return /*#__PURE__*/_jsx(StackWrap, {
|
|
@@ -182,7 +182,7 @@ const TextInputBase = /*#__PURE__*/forwardRef((_ref6, ref) => {
|
|
|
182
182
|
};
|
|
183
183
|
|
|
184
184
|
const defaultRef = useRef();
|
|
185
|
-
const inputRef = ref
|
|
185
|
+
const inputRef = ref ?? defaultRef;
|
|
186
186
|
const {
|
|
187
187
|
currentValue,
|
|
188
188
|
resetValue,
|
|
@@ -7,6 +7,7 @@ import { fontBasePixels } from '@telus-uds/system-constants'; // Make design tok
|
|
|
7
7
|
|
|
8
8
|
export function applyTextStyles(_ref) {
|
|
9
9
|
let {
|
|
10
|
+
fontColor,
|
|
10
11
|
fontSize,
|
|
11
12
|
fontScaleCap,
|
|
12
13
|
lineHeight,
|
|
@@ -28,7 +29,7 @@ export function applyTextStyles(_ref) {
|
|
|
28
29
|
|
|
29
30
|
if (fontSize) {
|
|
30
31
|
// If relative font sizes are needed, catch and calculate them here
|
|
31
|
-
styles.fontSize = Platform.OS === 'web' && !forceAbsoluteFontSizing ?
|
|
32
|
+
styles.fontSize = Platform.OS === 'web' && !forceAbsoluteFontSizing ? `${fontSize / fontBasePixels}rem` : fontSize;
|
|
32
33
|
}
|
|
33
34
|
|
|
34
35
|
if (typeof lineHeight === 'number') {
|
|
@@ -44,11 +45,15 @@ export function applyTextStyles(_ref) {
|
|
|
44
45
|
if (fontName) {
|
|
45
46
|
// Don't set undefined font families. May need some validation here that the font is available.
|
|
46
47
|
// Android doesn't recognise font weights natively so apply custom font weights via `fontFamily`.
|
|
47
|
-
styles.fontFamily =
|
|
48
|
+
styles.fontFamily = `${fontName}${fontWeight}${fontStyle}`;
|
|
48
49
|
} else if (fontWeight) {
|
|
49
50
|
// If using system default font, apply the font weight directly.
|
|
50
51
|
// Font weight support in Android is limited to 'bold' or anything else === 'normal'.
|
|
51
52
|
styles.fontWeight = Platform.OS === 'android' && Number(fontWeight) > 400 ? 'bold' : fontWeight;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (fontColor) {
|
|
56
|
+
styles.color = fontColor;
|
|
52
57
|
} // TODO: look into calculating typographic spacing with PixelRatio.getFontScale()
|
|
53
58
|
// Do while implementing advanced typography e.g. paragraph etc
|
|
54
59
|
// https://github.com/telus/universal-design-system/issues/89
|
|
@@ -91,7 +96,7 @@ function applyWebShadow(_ref2) {
|
|
|
91
96
|
} = _ref2;
|
|
92
97
|
const insetString = inset ? 'inset ' : '';
|
|
93
98
|
const boxShadow = {
|
|
94
|
-
boxShadow:
|
|
99
|
+
boxShadow: `${insetString}${offsetX}px ${offsetY}px ${blur}px ${spread}px ${color}`
|
|
95
100
|
};
|
|
96
101
|
return boxShadow;
|
|
97
102
|
}
|