@telus-uds/components-base 1.77.0 → 1.78.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 CHANGED
@@ -1,12 +1,38 @@
1
1
  # Change Log - @telus-uds/components-base
2
2
 
3
- This log was last generated on Wed, 14 Feb 2024 02:21:15 GMT and should not be manually modified.
3
+ This log was last generated on Fri, 23 Feb 2024 19:32:18 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
+ ## 1.78.0
8
+
9
+ Fri, 23 Feb 2024 19:32:18 GMT
10
+
11
+ ### Minor changes
12
+
13
+ - refactoring Card component to add media queries as an option to prevent layout shifts (hoss.agina@telus.com)
14
+ - Bump @telus-uds/system-theme-tokens to v2.52.0
15
+
16
+ ### Patches
17
+
18
+ - Onpress function reverted due to several bugs (35577399+JoshHC@users.noreply.github.com)
19
+ - fix Link component keyboard interaction (guillermo.peitzner@telus.com)
20
+ - prevent typography dataset property to be overruled (guillermo.peitzner@telus.com)
21
+ - New changes of notification component merged with old changes to support the users in the migraiton to the new ones (35577399+JoshHC@users.noreply.github.com)
22
+
23
+ ## 1.77.1
24
+
25
+ Tue, 20 Feb 2024 23:14:38 GMT
26
+
27
+ ### Patches
28
+
29
+ - refactor getsteplabel function so step tracker displays multiple labels (evander.owusu@telus.com)
30
+ - fix pagination button-base props warning (guillermo.peitzner@telus.com)
31
+ - fix unexpected scroll when pressing the chevron-link component using the space key (guillermo.peitzner@telus.com)
32
+
7
33
  ## 1.77.0
8
34
 
9
- Wed, 14 Feb 2024 02:21:15 GMT
35
+ Wed, 14 Feb 2024 02:29:37 GMT
10
36
 
11
37
  ### Minor changes
12
38
 
package/lib/Card/Card.js CHANGED
@@ -78,7 +78,14 @@ const Card = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
78
78
  ...rest
79
79
  } = _ref;
80
80
  const viewport = (0, _ViewportProvider.useViewport)();
81
- const themeTokens = (0, _ThemeProvider.useThemeTokens)('Card', tokens, variant, {
81
+ const {
82
+ themeOptions
83
+ } = (0, _ThemeProvider.useTheme)();
84
+ const {
85
+ enableMediaQueryStyleSheet
86
+ } = themeOptions;
87
+ const useTokens = enableMediaQueryStyleSheet ? _ThemeProvider.useResponsiveThemeTokens : _ThemeProvider.useThemeTokens;
88
+ const themeTokens = useTokens('Card', tokens, variant, !enableMediaQueryStyleSheet && {
82
89
  viewport
83
90
  });
84
91
  const getThemeTokens = (0, _ThemeProvider.useThemeTokensCallback)('Card', interactiveCard === null || interactiveCard === void 0 ? void 0 : interactiveCard.tokens, {
@@ -94,11 +101,28 @@ const Card = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
94
101
  paddingRight,
95
102
  ...restOfTokens
96
103
  } = themeTokens;
104
+ let cardStyles;
105
+ let mediaIds;
106
+ if (enableMediaQueryStyleSheet) {
107
+ const mediaQueryStyleSheet = (0, _utils.createMediaQueryStyles)(themeTokens);
108
+ const {
109
+ ids,
110
+ styles
111
+ } = _utils.StyleSheet.create({
112
+ card: mediaQueryStyleSheet
113
+ });
114
+ cardStyles = styles.card;
115
+ mediaIds = ids.card;
116
+ } else {
117
+ cardStyles = themeTokens;
118
+ }
97
119
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
98
120
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_CardBase.default, {
99
121
  ref: ref,
100
- tokens: interactiveCard !== null && interactiveCard !== void 0 && interactiveCard.body ? restOfTokens : themeTokens,
101
- dataSet: dataSet,
122
+ tokens: interactiveCard !== null && interactiveCard !== void 0 && interactiveCard.body ? restOfTokens : cardStyles,
123
+ dataSet: mediaIds && {
124
+ media: mediaIds
125
+ },
102
126
  ...selectProps(rest),
103
127
  children: interactiveCard !== null && interactiveCard !== void 0 && interactiveCard.body ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
104
128
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_PressableCardBase.default, {
@@ -25,7 +25,6 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
25
25
  tokens = {},
26
26
  variant,
27
27
  dataSet,
28
- onPress,
29
28
  ...otherlinkProps
30
29
  } = _ref;
31
30
  const getChevronTokens = (0, _ThemeProvider.useThemeTokensCallback)('ChevronLink', tokens, variant);
@@ -54,7 +53,6 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
54
53
  tokens: getTokens,
55
54
  dataSet: dataSet,
56
55
  ref: ref,
57
- onPress: onPress,
58
56
  children: children
59
57
  });
60
58
  });
@@ -7,7 +7,6 @@ exports.default = void 0;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
8
  var _Pressable = _interopRequireDefault(require("react-native-web/dist/cjs/exports/Pressable"));
9
9
  var _StyleSheet = _interopRequireDefault(require("react-native-web/dist/cjs/exports/StyleSheet"));
10
- var _Platform = _interopRequireDefault(require("react-native-web/dist/cjs/exports/Platform"));
11
10
  var _jsxRuntime = require("react/jsx-runtime");
12
11
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
12
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
@@ -25,29 +24,17 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
25
24
  * @param {PressableProps} PressableProps
26
25
  */
27
26
  // React Native exports prop Types but not propTypes, use JSDoc types here rather than duplicate RN
28
- /* eslint-disable react/prop-types */const InlinePressable = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
27
+ // eslint-disable-next-line react/prop-types
28
+ const InlinePressable = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
29
29
  let {
30
30
  children,
31
31
  inlineFlex = true,
32
32
  style,
33
- onPress,
34
33
  ...props
35
34
  } = _ref;
36
- const handlePress = (0, _react.useCallback)(() => {
37
- if (onPress) {
38
- onPress();
39
- }
40
- }, [onPress]);
41
- const handleKeyPress = (0, _react.useCallback)(e => {
42
- if (e.key === 'Enter' || e.key === ' ') {
43
- handlePress();
44
- }
45
- }, [handlePress]);
46
35
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Pressable.default, {
47
36
  ref: ref,
48
37
  style: pressState => [typeof style === 'function' ? style(pressState) : style, staticStyles[inlineFlex ? 'inlineFlex' : 'inline']],
49
- onPress: handlePress,
50
- onKeyDown: _Platform.default.OS === 'web' ? handleKeyPress : undefined,
51
38
  ...props,
52
39
  children: pressState => typeof children === 'function' ? children(pressState) : children
53
40
  });
@@ -187,7 +187,6 @@ const LinkBase = /*#__PURE__*/(0, _react.forwardRef)((_ref6, ref) => {
187
187
  // assuming links without icons should be inline (even if they are long)
188
188
  ,
189
189
  ref: ref,
190
- keyboardShouldPersistTaps: "handled",
191
190
  style: linkState => {
192
191
  const themeTokens = resolveLinkTokens(linkState);
193
192
  const outerBorderStyles = selectOuterBorderStyles(themeTokens);
@@ -11,7 +11,6 @@ var _ThemeProvider = require("../ThemeProvider");
11
11
  var _utils = require("../utils");
12
12
  var _useCopy = _interopRequireDefault(require("../utils/useCopy"));
13
13
  var _dictionary = _interopRequireDefault(require("./dictionary"));
14
- var _jsxRuntime = require("react/jsx-runtime");
15
14
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
15
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
16
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -34,11 +33,11 @@ const PageButton = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
34
33
  const getButtonTokens = buttonState => (0, _utils.selectTokens)('Button', getTokens(buttonState));
35
34
  const activeProps = isActive ? {
36
35
  selected: true,
37
- ..._utils.a11yProps.nonFocusableProps,
36
+ ..._utils.a11yProps.nonFocusableProps
38
37
  // a brute fix for the focus state being stuck on an active item since it becomes non-focusable
39
38
  // (see https://github.com/telus/universal-design-system/pull/577#issuecomment-931344107)
40
- key: 'active-item'
41
39
  } : {};
40
+ const key = isActive ? 'active-item' : undefined;
42
41
  const accessibilityRole = href !== undefined ? 'link' : 'button';
43
42
  const activeLabel = isActive ? ` ${getCopy('currentLabel')}` : '';
44
43
  const accessibilityLabel = `${getCopy('goToLabel')} ${label}${activeLabel}`;
@@ -54,13 +53,13 @@ const PageButton = /*#__PURE__*/(0, _react.forwardRef)((_ref, ref) => {
54
53
  hrefAttrs,
55
54
  ...rest
56
55
  };
57
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ButtonBase.default, {
56
+ return /*#__PURE__*/(0, _react.createElement)(_ButtonBase.default, {
58
57
  ref: ref,
59
58
  ...buttonProps,
60
59
  tokens: getButtonTokens,
61
- ...activeProps,
62
- children: label
63
- });
60
+ key: key,
61
+ ...activeProps
62
+ }, label);
64
63
  });
65
64
  PageButton.displayName = 'PageButton';
66
65
  PageButton.propTypes = {
@@ -68,17 +68,16 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
68
68
  const testID = `Stack-${divider ? 'Divider' : 'Spacer'}-${index}`;
69
69
  const commonProps = {
70
70
  testID,
71
- key: testID,
72
71
  space
73
72
  };
74
73
  const separator = divider ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Divider.default, {
75
74
  vertical: direction.startsWith('row'),
76
75
  ...dividerProps,
77
76
  ...commonProps
78
- }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_Spacer.default, {
77
+ }, testID) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_Spacer.default, {
79
78
  direction: direction.startsWith('row') ? 'row' : 'column',
80
79
  ...commonProps
81
- });
80
+ }, testID);
82
81
  return [...newChildren, separator, item];
83
82
  }, []);
84
83
  return content;
@@ -74,7 +74,7 @@ const selectStepTrackerLabelStyles = (_ref3, themeOptions) => {
74
74
  * ## Usability and A11y guidelines
75
75
  *
76
76
  * Keep in mind that in its current implementation this is not an interactive
77
- * component and cant be used to navigate between steps. The application
77
+ * component and can't be used to navigate between steps. The application
78
78
  * must provide its own navigation mechanism and state control. That is the
79
79
  * main reason the component assumes the `progressbar` role in terms of
80
80
  * accessibility. This also makes it extremely important to make sure you
@@ -118,7 +118,13 @@ const StepTracker = /*#__PURE__*/(0, _react.forwardRef)((_ref4, ref) => {
118
118
  copy
119
119
  });
120
120
  const stepTrackerLabel = showStepTrackerLabel ? (typeof copy === 'string' ? getCopy(textStepTrackerLabel ?? 1).stepTrackerLabel : getCopy('stepTrackerLabel')).replace('%{stepNumber}', current < steps.length ? current + 1 : steps.length).replace('%{stepCount}', steps.length).replace('%{stepLabel}', current < steps.length ? steps[current] : steps[steps.length - 1]) : '';
121
- const getStepLabel = index => themeTokens.showStepLabel ? (typeof copy === 'string' ? getCopy(textStepTrackerLabel ?? 1).stepLabel : getCopy('stepLabel')).replace('%{stepNumber}', index + 1) : '';
121
+ const getStepLabel = index => {
122
+ if (themeTokens.showStepLabel) {
123
+ var _getCopy;
124
+ return (_getCopy = getCopy(index + 1)) === null || _getCopy === void 0 ? void 0 : _getCopy.stepLabel.replace('%{stepNumber}', index + 1);
125
+ }
126
+ return '';
127
+ };
122
128
  const {
123
129
  themeOptions
124
130
  } = (0, _ThemeProvider.useTheme)();
@@ -11,7 +11,7 @@ var _default = {
11
11
  stepTrackerLabel: 'Step %{stepNumber} of %{stepCount}: %{stepLabel}'
12
12
  },
13
13
  2: {
14
- stepLabel: '%{stepNumber}.',
14
+ stepLabel: 'Step %{stepNumber}',
15
15
  stepTrackerLabel: 'Step %{stepNumber} of %{stepCount}: %{stepLabel}'
16
16
  },
17
17
  3: {
@@ -25,7 +25,7 @@ var _default = {
25
25
  stepTrackerLabel: 'Étape %{stepNumber} sur %{stepCount}: %{stepLabel}'
26
26
  },
27
27
  2: {
28
- stepLabel: '%{stepNumber}.',
28
+ stepLabel: 'Étape %{stepNumber}',
29
29
  stepTrackerLabel: 'Étape %{stepNumber} sur %{stepCount}: %{stepLabel}'
30
30
  },
31
31
  3: {
@@ -104,7 +104,6 @@ const Typography = /*#__PURE__*/(0, _react.forwardRef)((_ref2, ref) => {
104
104
  }
105
105
  const resolvedTextProps = {
106
106
  ...selectTextProps(rest),
107
- dataSet,
108
107
  maxFontSizeMultiplier
109
108
  };
110
109
  const containerProps = {
@@ -136,15 +135,17 @@ const Typography = /*#__PURE__*/(0, _react.forwardRef)((_ref2, ref) => {
136
135
  }
137
136
  return resetTagStyling(children);
138
137
  };
138
+ const dataSetValue = mediaIds ? {
139
+ media: mediaIds,
140
+ ...dataSet
141
+ } : dataSet;
139
142
  return block ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
140
143
  ref: ref,
141
144
  ...containerProps,
142
145
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Text.default, {
143
146
  ...resolvedTextProps,
144
147
  style: textStyles,
145
- dataSet: mediaIds && {
146
- media: mediaIds
147
- },
148
+ dataSet: dataSetValue,
148
149
  children: sanitizeChildren(children)
149
150
  })
150
151
  }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_Text.default, {
@@ -152,9 +153,7 @@ const Typography = /*#__PURE__*/(0, _react.forwardRef)((_ref2, ref) => {
152
153
  ...containerProps,
153
154
  ...resolvedTextProps,
154
155
  style: textStyles,
155
- dataSet: mediaIds && {
156
- media: mediaIds
157
- },
156
+ dataSet: dataSetValue,
158
157
  children: sanitizeChildren(children)
159
158
  });
160
159
  });
@@ -199,7 +198,11 @@ Typography.propTypes = {
199
198
  /**
200
199
  * Same children allowed as a React Native <Text> node
201
200
  */
202
- children: _propTypes.default.node
201
+ children: _propTypes.default.node,
202
+ /**
203
+ * Data attributes to be added to the element
204
+ */
205
+ dataSet: _propTypes.default.object
203
206
  };
204
207
  var _default = Typography;
205
208
  exports.default = _default;
@@ -1,8 +1,8 @@
1
1
  import React, { forwardRef } from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import View from "react-native-web/dist/exports/View";
4
- import { useThemeTokens, useThemeTokensCallback } from '../ThemeProvider';
5
- import { getTokensPropType, variantProp } from '../utils';
4
+ import { useThemeTokens, useThemeTokensCallback, useResponsiveThemeTokens, useTheme } from '../ThemeProvider';
5
+ import { getTokensPropType, variantProp, StyleSheet, createMediaQueryStyles } from '../utils';
6
6
  import { useViewport } from '../ViewportProvider';
7
7
  import { a11yProps, selectSystemProps, viewProps } from '../utils/props';
8
8
  import CardBase from './CardBase';
@@ -71,7 +71,14 @@ const Card = /*#__PURE__*/forwardRef((_ref, ref) => {
71
71
  ...rest
72
72
  } = _ref;
73
73
  const viewport = useViewport();
74
- const themeTokens = useThemeTokens('Card', tokens, variant, {
74
+ const {
75
+ themeOptions
76
+ } = useTheme();
77
+ const {
78
+ enableMediaQueryStyleSheet
79
+ } = themeOptions;
80
+ const useTokens = enableMediaQueryStyleSheet ? useResponsiveThemeTokens : useThemeTokens;
81
+ const themeTokens = useTokens('Card', tokens, variant, !enableMediaQueryStyleSheet && {
75
82
  viewport
76
83
  });
77
84
  const getThemeTokens = useThemeTokensCallback('Card', interactiveCard === null || interactiveCard === void 0 ? void 0 : interactiveCard.tokens, {
@@ -87,11 +94,28 @@ const Card = /*#__PURE__*/forwardRef((_ref, ref) => {
87
94
  paddingRight,
88
95
  ...restOfTokens
89
96
  } = themeTokens;
97
+ let cardStyles;
98
+ let mediaIds;
99
+ if (enableMediaQueryStyleSheet) {
100
+ const mediaQueryStyleSheet = createMediaQueryStyles(themeTokens);
101
+ const {
102
+ ids,
103
+ styles
104
+ } = StyleSheet.create({
105
+ card: mediaQueryStyleSheet
106
+ });
107
+ cardStyles = styles.card;
108
+ mediaIds = ids.card;
109
+ } else {
110
+ cardStyles = themeTokens;
111
+ }
90
112
  return /*#__PURE__*/_jsx(_Fragment, {
91
113
  children: /*#__PURE__*/_jsx(CardBase, {
92
114
  ref: ref,
93
- tokens: interactiveCard !== null && interactiveCard !== void 0 && interactiveCard.body ? restOfTokens : themeTokens,
94
- dataSet: dataSet,
115
+ tokens: interactiveCard !== null && interactiveCard !== void 0 && interactiveCard.body ? restOfTokens : cardStyles,
116
+ dataSet: mediaIds && {
117
+ media: mediaIds
118
+ },
95
119
  ...selectProps(rest),
96
120
  children: interactiveCard !== null && interactiveCard !== void 0 && interactiveCard.body ? /*#__PURE__*/_jsxs(_Fragment, {
97
121
  children: [/*#__PURE__*/_jsx(PressableCardBase, {
@@ -18,7 +18,6 @@ const ChevronLink = /*#__PURE__*/forwardRef((_ref, ref) => {
18
18
  tokens = {},
19
19
  variant,
20
20
  dataSet,
21
- onPress,
22
21
  ...otherlinkProps
23
22
  } = _ref;
24
23
  const getChevronTokens = useThemeTokensCallback('ChevronLink', tokens, variant);
@@ -47,7 +46,6 @@ const ChevronLink = /*#__PURE__*/forwardRef((_ref, ref) => {
47
46
  tokens: getTokens,
48
47
  dataSet: dataSet,
49
48
  ref: ref,
50
- onPress: onPress,
51
49
  children: children
52
50
  });
53
51
  });
@@ -1,7 +1,6 @@
1
- import React, { forwardRef, useCallback } from 'react';
1
+ import React, { forwardRef } from 'react';
2
2
  import Pressable from "react-native-web/dist/exports/Pressable";
3
3
  import StyleSheet from "react-native-web/dist/exports/StyleSheet";
4
- import Platform from "react-native-web/dist/exports/Platform";
5
4
  /**
6
5
  * @typedef {import('react-native').PressableProps} PressableProps
7
6
  */
@@ -14,31 +13,18 @@ import Platform from "react-native-web/dist/exports/Platform";
14
13
  * @param {PressableProps} PressableProps
15
14
  */
16
15
  // React Native exports prop Types but not propTypes, use JSDoc types here rather than duplicate RN
17
- /* eslint-disable react/prop-types */
16
+ // eslint-disable-next-line react/prop-types
18
17
  import { jsx as _jsx } from "react/jsx-runtime";
19
18
  const InlinePressable = /*#__PURE__*/forwardRef((_ref, ref) => {
20
19
  let {
21
20
  children,
22
21
  inlineFlex = true,
23
22
  style,
24
- onPress,
25
23
  ...props
26
24
  } = _ref;
27
- const handlePress = useCallback(() => {
28
- if (onPress) {
29
- onPress();
30
- }
31
- }, [onPress]);
32
- const handleKeyPress = useCallback(e => {
33
- if (e.key === 'Enter' || e.key === ' ') {
34
- handlePress();
35
- }
36
- }, [handlePress]);
37
25
  return /*#__PURE__*/_jsx(Pressable, {
38
26
  ref: ref,
39
27
  style: pressState => [typeof style === 'function' ? style(pressState) : style, staticStyles[inlineFlex ? 'inlineFlex' : 'inline']],
40
- onPress: handlePress,
41
- onKeyDown: Platform.OS === 'web' ? handleKeyPress : undefined,
42
28
  ...props,
43
29
  children: pressState => typeof children === 'function' ? children(pressState) : children
44
30
  });
@@ -178,7 +178,6 @@ const LinkBase = /*#__PURE__*/forwardRef((_ref6, ref) => {
178
178
  // assuming links without icons should be inline (even if they are long)
179
179
  ,
180
180
  ref: ref,
181
- keyboardShouldPersistTaps: "handled",
182
181
  style: linkState => {
183
182
  const themeTokens = resolveLinkTokens(linkState);
184
183
  const outerBorderStyles = selectOuterBorderStyles(themeTokens);
@@ -5,7 +5,7 @@ import { useThemeTokensCallback } from '../ThemeProvider';
5
5
  import { a11yProps, copyPropTypes, getTokensPropType, hrefAttrsProp, linkProps, selectTokens, variantProp, withLinkRouter } from '../utils';
6
6
  import useCopy from '../utils/useCopy';
7
7
  import dictionary from './dictionary';
8
- import { jsx as _jsx } from "react/jsx-runtime";
8
+ import { createElement as _createElement } from "react";
9
9
  const PageButton = /*#__PURE__*/forwardRef((_ref, ref) => {
10
10
  let {
11
11
  label,
@@ -25,11 +25,11 @@ const PageButton = /*#__PURE__*/forwardRef((_ref, ref) => {
25
25
  const getButtonTokens = buttonState => selectTokens('Button', getTokens(buttonState));
26
26
  const activeProps = isActive ? {
27
27
  selected: true,
28
- ...a11yProps.nonFocusableProps,
28
+ ...a11yProps.nonFocusableProps
29
29
  // a brute fix for the focus state being stuck on an active item since it becomes non-focusable
30
30
  // (see https://github.com/telus/universal-design-system/pull/577#issuecomment-931344107)
31
- key: 'active-item'
32
31
  } : {};
32
+ const key = isActive ? 'active-item' : undefined;
33
33
  const accessibilityRole = href !== undefined ? 'link' : 'button';
34
34
  const activeLabel = isActive ? ` ${getCopy('currentLabel')}` : '';
35
35
  const accessibilityLabel = `${getCopy('goToLabel')} ${label}${activeLabel}`;
@@ -45,13 +45,13 @@ const PageButton = /*#__PURE__*/forwardRef((_ref, ref) => {
45
45
  hrefAttrs,
46
46
  ...rest
47
47
  };
48
- return /*#__PURE__*/_jsx(ButtonBase, {
48
+ return /*#__PURE__*/_createElement(ButtonBase, {
49
49
  ref: ref,
50
50
  ...buttonProps,
51
51
  tokens: getButtonTokens,
52
- ...activeProps,
53
- children: label
54
- });
52
+ key: key,
53
+ ...activeProps
54
+ }, label);
55
55
  });
56
56
  PageButton.displayName = 'PageButton';
57
57
  PageButton.propTypes = {
@@ -62,17 +62,16 @@ const getStackedContent = (children, _ref) => {
62
62
  const testID = `Stack-${divider ? 'Divider' : 'Spacer'}-${index}`;
63
63
  const commonProps = {
64
64
  testID,
65
- key: testID,
66
65
  space
67
66
  };
68
67
  const separator = divider ? /*#__PURE__*/_jsx(Divider, {
69
68
  vertical: direction.startsWith('row'),
70
69
  ...dividerProps,
71
70
  ...commonProps
72
- }) : /*#__PURE__*/_jsx(Spacer, {
71
+ }, testID) : /*#__PURE__*/_jsx(Spacer, {
73
72
  direction: direction.startsWith('row') ? 'row' : 'column',
74
73
  ...commonProps
75
- });
74
+ }, testID);
76
75
  return [...newChildren, separator, item];
77
76
  }, []);
78
77
  return content;
@@ -66,7 +66,7 @@ const selectStepTrackerLabelStyles = (_ref3, themeOptions) => {
66
66
  * ## Usability and A11y guidelines
67
67
  *
68
68
  * Keep in mind that in its current implementation this is not an interactive
69
- * component and cant be used to navigate between steps. The application
69
+ * component and can't be used to navigate between steps. The application
70
70
  * must provide its own navigation mechanism and state control. That is the
71
71
  * main reason the component assumes the `progressbar` role in terms of
72
72
  * accessibility. This also makes it extremely important to make sure you
@@ -110,7 +110,13 @@ const StepTracker = /*#__PURE__*/forwardRef((_ref4, ref) => {
110
110
  copy
111
111
  });
112
112
  const stepTrackerLabel = showStepTrackerLabel ? (typeof copy === 'string' ? getCopy(textStepTrackerLabel ?? 1).stepTrackerLabel : getCopy('stepTrackerLabel')).replace('%{stepNumber}', current < steps.length ? current + 1 : steps.length).replace('%{stepCount}', steps.length).replace('%{stepLabel}', current < steps.length ? steps[current] : steps[steps.length - 1]) : '';
113
- const getStepLabel = index => themeTokens.showStepLabel ? (typeof copy === 'string' ? getCopy(textStepTrackerLabel ?? 1).stepLabel : getCopy('stepLabel')).replace('%{stepNumber}', index + 1) : '';
113
+ const getStepLabel = index => {
114
+ if (themeTokens.showStepLabel) {
115
+ var _getCopy;
116
+ return (_getCopy = getCopy(index + 1)) === null || _getCopy === void 0 ? void 0 : _getCopy.stepLabel.replace('%{stepNumber}', index + 1);
117
+ }
118
+ return '';
119
+ };
114
120
  const {
115
121
  themeOptions
116
122
  } = useTheme();
@@ -5,7 +5,7 @@ export default {
5
5
  stepTrackerLabel: 'Step %{stepNumber} of %{stepCount}: %{stepLabel}'
6
6
  },
7
7
  2: {
8
- stepLabel: '%{stepNumber}.',
8
+ stepLabel: 'Step %{stepNumber}',
9
9
  stepTrackerLabel: 'Step %{stepNumber} of %{stepCount}: %{stepLabel}'
10
10
  },
11
11
  3: {
@@ -19,7 +19,7 @@ export default {
19
19
  stepTrackerLabel: 'Étape %{stepNumber} sur %{stepCount}: %{stepLabel}'
20
20
  },
21
21
  2: {
22
- stepLabel: '%{stepNumber}.',
22
+ stepLabel: 'Étape %{stepNumber}',
23
23
  stepTrackerLabel: 'Étape %{stepNumber} sur %{stepCount}: %{stepLabel}'
24
24
  },
25
25
  3: {
@@ -96,7 +96,6 @@ const Typography = /*#__PURE__*/forwardRef((_ref2, ref) => {
96
96
  }
97
97
  const resolvedTextProps = {
98
98
  ...selectTextProps(rest),
99
- dataSet,
100
99
  maxFontSizeMultiplier
101
100
  };
102
101
  const containerProps = {
@@ -128,15 +127,17 @@ const Typography = /*#__PURE__*/forwardRef((_ref2, ref) => {
128
127
  }
129
128
  return resetTagStyling(children);
130
129
  };
130
+ const dataSetValue = mediaIds ? {
131
+ media: mediaIds,
132
+ ...dataSet
133
+ } : dataSet;
131
134
  return block ? /*#__PURE__*/_jsx(View, {
132
135
  ref: ref,
133
136
  ...containerProps,
134
137
  children: /*#__PURE__*/_jsx(Text, {
135
138
  ...resolvedTextProps,
136
139
  style: textStyles,
137
- dataSet: mediaIds && {
138
- media: mediaIds
139
- },
140
+ dataSet: dataSetValue,
140
141
  children: sanitizeChildren(children)
141
142
  })
142
143
  }) : /*#__PURE__*/_jsx(Text, {
@@ -144,9 +145,7 @@ const Typography = /*#__PURE__*/forwardRef((_ref2, ref) => {
144
145
  ...containerProps,
145
146
  ...resolvedTextProps,
146
147
  style: textStyles,
147
- dataSet: mediaIds && {
148
- media: mediaIds
149
- },
148
+ dataSet: dataSetValue,
150
149
  children: sanitizeChildren(children)
151
150
  });
152
151
  });
@@ -191,6 +190,10 @@ Typography.propTypes = {
191
190
  /**
192
191
  * Same children allowed as a React Native <Text> node
193
192
  */
194
- children: PropTypes.node
193
+ children: PropTypes.node,
194
+ /**
195
+ * Data attributes to be added to the element
196
+ */
197
+ dataSet: PropTypes.object
195
198
  };
196
199
  export default Typography;
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "@floating-ui/react-native": "^0.8.1",
12
12
  "@gorhom/portal": "^1.0.14",
13
13
  "@telus-uds/system-constants": "^1.3.0",
14
- "@telus-uds/system-theme-tokens": "^2.51.0",
14
+ "@telus-uds/system-theme-tokens": "^2.52.0",
15
15
  "airbnb-prop-types": "^2.16.0",
16
16
  "css-mediaquery": "^0.1.2",
17
17
  "expo-linear-gradient": "^12.5.0",
@@ -85,5 +85,6 @@
85
85
  "standard-engine": {
86
86
  "skip": true
87
87
  },
88
- "version": "1.77.0"
88
+ "version": "1.78.0",
89
+ "types": "types/index.d.ts"
89
90
  }
package/src/Card/Card.jsx CHANGED
@@ -2,8 +2,13 @@ import React, { forwardRef } from 'react'
2
2
  import PropTypes from 'prop-types'
3
3
  import { View } from 'react-native'
4
4
 
5
- import { useThemeTokens, useThemeTokensCallback } from '../ThemeProvider'
6
- import { getTokensPropType, variantProp } from '../utils'
5
+ import {
6
+ useThemeTokens,
7
+ useThemeTokensCallback,
8
+ useResponsiveThemeTokens,
9
+ useTheme
10
+ } from '../ThemeProvider'
11
+ import { getTokensPropType, variantProp, StyleSheet, createMediaQueryStyles } from '../utils'
7
12
  import { useViewport } from '../ViewportProvider'
8
13
  import { a11yProps, selectSystemProps, viewProps } from '../utils/props'
9
14
  import CardBase from './CardBase'
@@ -62,7 +67,19 @@ const [selectProps, selectedSystemPropTypes] = selectSystemProps([a11yProps, vie
62
67
  const Card = forwardRef(
63
68
  ({ children, tokens, variant, dataSet, onPress, interactiveCard, ...rest }, ref) => {
64
69
  const viewport = useViewport()
65
- const themeTokens = useThemeTokens('Card', tokens, variant, { viewport })
70
+ const { themeOptions } = useTheme()
71
+
72
+ const { enableMediaQueryStyleSheet } = themeOptions
73
+
74
+ const useTokens = enableMediaQueryStyleSheet ? useResponsiveThemeTokens : useThemeTokens
75
+
76
+ const themeTokens = useTokens(
77
+ 'Card',
78
+ tokens,
79
+ variant,
80
+ !enableMediaQueryStyleSheet && { viewport }
81
+ )
82
+
66
83
  const getThemeTokens = useThemeTokensCallback('Card', interactiveCard?.tokens, {
67
84
  interactive: true,
68
85
  ...(interactiveCard?.variant || {})
@@ -71,12 +88,27 @@ const Card = forwardRef(
71
88
  // to individual Card sections, not Card as a whole
72
89
  const { paddingTop, paddingBottom, paddingLeft, paddingRight, ...restOfTokens } = themeTokens
73
90
 
91
+ let cardStyles
92
+ let mediaIds
93
+
94
+ if (enableMediaQueryStyleSheet) {
95
+ const mediaQueryStyleSheet = createMediaQueryStyles(themeTokens)
96
+
97
+ const { ids, styles } = StyleSheet.create({
98
+ card: mediaQueryStyleSheet
99
+ })
100
+ cardStyles = styles.card
101
+ mediaIds = ids.card
102
+ } else {
103
+ cardStyles = themeTokens
104
+ }
105
+
74
106
  return (
75
107
  <>
76
108
  <CardBase
77
109
  ref={ref}
78
- tokens={interactiveCard?.body ? restOfTokens : themeTokens}
79
- dataSet={dataSet}
110
+ tokens={interactiveCard?.body ? restOfTokens : cardStyles}
111
+ dataSet={mediaIds && { media: mediaIds }}
80
112
  {...selectProps(rest)}
81
113
  >
82
114
  {interactiveCard?.body ? (
@@ -12,10 +12,7 @@ import LinkBase from './LinkBase'
12
12
  * ChevronLink is not intended to be deeply themable; variants passed to ChevronLink are forwarded to Link.
13
13
  */
14
14
  const ChevronLink = forwardRef(
15
- (
16
- { direction = 'right', children, tokens = {}, variant, dataSet, onPress, ...otherlinkProps },
17
- ref
18
- ) => {
15
+ ({ direction = 'right', children, tokens = {}, variant, dataSet, ...otherlinkProps }, ref) => {
19
16
  const getChevronTokens = useThemeTokensCallback('ChevronLink', tokens, variant)
20
17
  const applyChevronTokens = (linkState) => {
21
18
  const { leftIcon, rightIcon, iconDisplace, height, fontSize, ...otherTokens } =
@@ -41,7 +38,6 @@ const ChevronLink = forwardRef(
41
38
  tokens={getTokens}
42
39
  dataSet={dataSet}
43
40
  ref={ref}
44
- onPress={onPress}
45
41
  >
46
42
  {children}
47
43
  </LinkBase>
@@ -1,5 +1,5 @@
1
- import React, { forwardRef, useCallback } from 'react'
2
- import { Pressable, StyleSheet, Platform } from 'react-native'
1
+ import React, { forwardRef } from 'react'
2
+ import { Pressable, StyleSheet } from 'react-native'
3
3
 
4
4
  /**
5
5
  * @typedef {import('react-native').PressableProps} PressableProps
@@ -14,40 +14,20 @@ import { Pressable, StyleSheet, Platform } from 'react-native'
14
14
  * @param {PressableProps} PressableProps
15
15
  */
16
16
  // React Native exports prop Types but not propTypes, use JSDoc types here rather than duplicate RN
17
- /* eslint-disable react/prop-types */
18
- const InlinePressable = forwardRef(
19
- ({ children, inlineFlex = true, style, onPress, ...props }, ref) => {
20
- const handlePress = useCallback(() => {
21
- if (onPress) {
22
- onPress()
23
- }
24
- }, [onPress])
17
+ // eslint-disable-next-line react/prop-types
18
+ const InlinePressable = forwardRef(({ children, inlineFlex = true, style, ...props }, ref) => (
19
+ <Pressable
20
+ ref={ref}
21
+ style={(pressState) => [
22
+ typeof style === 'function' ? style(pressState) : style,
23
+ staticStyles[inlineFlex ? 'inlineFlex' : 'inline']
24
+ ]}
25
+ {...props}
26
+ >
27
+ {(pressState) => (typeof children === 'function' ? children(pressState) : children)}
28
+ </Pressable>
29
+ ))
25
30
 
26
- const handleKeyPress = useCallback(
27
- (e) => {
28
- if (e.key === 'Enter' || e.key === ' ') {
29
- handlePress()
30
- }
31
- },
32
- [handlePress]
33
- )
34
-
35
- return (
36
- <Pressable
37
- ref={ref}
38
- style={(pressState) => [
39
- typeof style === 'function' ? style(pressState) : style,
40
- staticStyles[inlineFlex ? 'inlineFlex' : 'inline']
41
- ]}
42
- onPress={handlePress}
43
- onKeyDown={Platform.OS === 'web' ? handleKeyPress : undefined}
44
- {...props}
45
- >
46
- {(pressState) => (typeof children === 'function' ? children(pressState) : children)}
47
- </Pressable>
48
- )
49
- }
50
- )
51
31
  InlinePressable.displayName = 'InlinePressable'
52
32
 
53
33
  const staticStyles = StyleSheet.create({
@@ -162,7 +162,6 @@ const LinkBase = forwardRef(
162
162
  inlineFlex={hasIcon}
163
163
  // assuming links without icons should be inline (even if they are long)
164
164
  ref={ref}
165
- keyboardShouldPersistTaps="handled"
166
165
  style={(linkState) => {
167
166
  const themeTokens = resolveLinkTokens(linkState)
168
167
  const outerBorderStyles = selectOuterBorderStyles(themeTokens)
@@ -28,12 +28,12 @@ const PageButton = forwardRef(
28
28
  const activeProps = isActive
29
29
  ? {
30
30
  selected: true,
31
- ...a11yProps.nonFocusableProps,
31
+ ...a11yProps.nonFocusableProps
32
32
  // a brute fix for the focus state being stuck on an active item since it becomes non-focusable
33
33
  // (see https://github.com/telus/universal-design-system/pull/577#issuecomment-931344107)
34
- key: 'active-item'
35
34
  }
36
35
  : {}
36
+ const key = isActive ? 'active-item' : undefined
37
37
 
38
38
  const accessibilityRole = href !== undefined ? 'link' : 'button'
39
39
  const activeLabel = isActive ? ` ${getCopy('currentLabel')}` : ''
@@ -50,7 +50,7 @@ const PageButton = forwardRef(
50
50
  }
51
51
 
52
52
  return (
53
- <ButtonBase ref={ref} {...buttonProps} tokens={getButtonTokens} {...activeProps}>
53
+ <ButtonBase ref={ref} {...buttonProps} tokens={getButtonTokens} key={key} {...activeProps}>
54
54
  {label}
55
55
  </ButtonBase>
56
56
  )
@@ -54,11 +54,20 @@ const getStackedContent = (
54
54
  if (!index || (!space && !divider)) return [...newChildren, item]
55
55
 
56
56
  const testID = `Stack-${divider ? 'Divider' : 'Spacer'}-${index}`
57
- const commonProps = { testID, key: testID, space }
57
+ const commonProps = { testID, space }
58
58
  const separator = divider ? (
59
- <Divider vertical={direction.startsWith('row')} {...dividerProps} {...commonProps} />
59
+ <Divider
60
+ vertical={direction.startsWith('row')}
61
+ key={testID}
62
+ {...dividerProps}
63
+ {...commonProps}
64
+ />
60
65
  ) : (
61
- <Spacer direction={direction.startsWith('row') ? 'row' : 'column'} {...commonProps} />
66
+ <Spacer
67
+ direction={direction.startsWith('row') ? 'row' : 'column'}
68
+ key={testID}
69
+ {...commonProps}
70
+ />
62
71
  )
63
72
  return [...newChildren, separator, item]
64
73
  }, [])
@@ -51,7 +51,7 @@ const selectStepTrackerLabelStyles = (
51
51
  * ## Usability and A11y guidelines
52
52
  *
53
53
  * Keep in mind that in its current implementation this is not an interactive
54
- * component and cant be used to navigate between steps. The application
54
+ * component and can't be used to navigate between steps. The application
55
55
  * must provide its own navigation mechanism and state control. That is the
56
56
  * main reason the component assumes the `progressbar` role in terms of
57
57
  * accessibility. This also makes it extremely important to make sure you
@@ -106,13 +106,14 @@ const StepTracker = forwardRef(
106
106
  current < steps.length ? steps[current] : steps[steps.length - 1]
107
107
  )
108
108
  : ''
109
- const getStepLabel = (index) =>
110
- themeTokens.showStepLabel
111
- ? (typeof copy === 'string'
112
- ? getCopy(textStepTrackerLabel ?? 1).stepLabel
113
- : getCopy('stepLabel')
114
- ).replace('%{stepNumber}', index + 1)
115
- : ''
109
+
110
+ const getStepLabel = (index) => {
111
+ if (themeTokens.showStepLabel) {
112
+ return getCopy(index + 1)?.stepLabel.replace('%{stepNumber}', index + 1)
113
+ }
114
+ return ''
115
+ }
116
+
116
117
  const { themeOptions } = useTheme()
117
118
  if (!steps.length) return null
118
119
  const selectedProps = selectProps({
@@ -5,7 +5,7 @@ export default {
5
5
  stepTrackerLabel: 'Step %{stepNumber} of %{stepCount}: %{stepLabel}'
6
6
  },
7
7
  2: {
8
- stepLabel: '%{stepNumber}.',
8
+ stepLabel: 'Step %{stepNumber}',
9
9
  stepTrackerLabel: 'Step %{stepNumber} of %{stepCount}: %{stepLabel}'
10
10
  },
11
11
  3: {
@@ -19,7 +19,7 @@ export default {
19
19
  stepTrackerLabel: 'Étape %{stepNumber} sur %{stepCount}: %{stepLabel}'
20
20
  },
21
21
  2: {
22
- stepLabel: '%{stepNumber}.',
22
+ stepLabel: 'Étape %{stepNumber}',
23
23
  stepTrackerLabel: 'Étape %{stepNumber} sur %{stepCount}: %{stepLabel}'
24
24
  },
25
25
  3: {
@@ -124,7 +124,6 @@ const Typography = forwardRef(
124
124
 
125
125
  const resolvedTextProps = {
126
126
  ...selectTextProps(rest),
127
- dataSet,
128
127
  maxFontSizeMultiplier
129
128
  }
130
129
 
@@ -158,9 +157,11 @@ const Typography = forwardRef(
158
157
  return resetTagStyling(children)
159
158
  }
160
159
 
160
+ const dataSetValue = mediaIds ? { media: mediaIds, ...dataSet } : dataSet
161
+
161
162
  return block ? (
162
163
  <View ref={ref} {...containerProps}>
163
- <Text {...resolvedTextProps} style={textStyles} dataSet={mediaIds && { media: mediaIds }}>
164
+ <Text {...resolvedTextProps} style={textStyles} dataSet={dataSetValue}>
164
165
  {sanitizeChildren(children)}
165
166
  </Text>
166
167
  </View>
@@ -170,7 +171,7 @@ const Typography = forwardRef(
170
171
  {...containerProps}
171
172
  {...resolvedTextProps}
172
173
  style={textStyles}
173
- dataSet={mediaIds && { media: mediaIds }}
174
+ dataSet={dataSetValue}
174
175
  >
175
176
  {sanitizeChildren(children)}
176
177
  </Text>
@@ -219,7 +220,11 @@ Typography.propTypes = {
219
220
  /**
220
221
  * Same children allowed as a React Native <Text> node
221
222
  */
222
- children: PropTypes.node
223
+ children: PropTypes.node,
224
+ /**
225
+ * Data attributes to be added to the element
226
+ */
227
+ dataSet: PropTypes.object
223
228
  }
224
229
 
225
230
  export default Typography