@telus-uds/components-base 3.21.0 → 3.23.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.
Files changed (64) hide show
  1. package/CHANGELOG.md +31 -1
  2. package/lib/cjs/Button/Button.js +12 -3
  3. package/lib/cjs/Button/ButtonBase.js +63 -10
  4. package/lib/cjs/Button/ButtonDropdown.js +2 -0
  5. package/lib/cjs/Button/ButtonGroup.js +45 -38
  6. package/lib/cjs/Button/propTypes.js +6 -0
  7. package/lib/cjs/Card/PressableCardBase.js +3 -1
  8. package/lib/cjs/Carousel/Carousel.js +63 -22
  9. package/lib/cjs/Carousel/CarouselItem/CarouselItem.js +23 -3
  10. package/lib/cjs/Icon/Icon.js +8 -11
  11. package/lib/cjs/Icon/IconText.js +0 -1
  12. package/lib/cjs/Listbox/GroupControl.js +33 -39
  13. package/lib/cjs/Listbox/Listbox.js +22 -13
  14. package/lib/cjs/Listbox/ListboxGroup.js +2 -1
  15. package/lib/cjs/Listbox/ListboxOverlay.js +5 -2
  16. package/lib/cjs/Listbox/PressableItem.js +8 -4
  17. package/lib/cjs/TextInput/TextInputBase.js +5 -1
  18. package/lib/cjs/ThemeProvider/index.js +9 -1
  19. package/lib/cjs/ThemeProvider/useResponsiveThemeTokensCallback.js +124 -0
  20. package/lib/cjs/Validator/Validator.js +171 -135
  21. package/lib/cjs/index.js +7 -0
  22. package/lib/esm/Button/Button.js +13 -4
  23. package/lib/esm/Button/ButtonBase.js +64 -11
  24. package/lib/esm/Button/ButtonDropdown.js +2 -0
  25. package/lib/esm/Button/ButtonGroup.js +44 -39
  26. package/lib/esm/Button/propTypes.js +6 -0
  27. package/lib/esm/Card/PressableCardBase.js +3 -1
  28. package/lib/esm/Carousel/Carousel.js +63 -22
  29. package/lib/esm/Carousel/CarouselItem/CarouselItem.js +23 -3
  30. package/lib/esm/Icon/Icon.js +8 -11
  31. package/lib/esm/Icon/IconText.js +0 -1
  32. package/lib/esm/Listbox/GroupControl.js +33 -39
  33. package/lib/esm/Listbox/Listbox.js +23 -14
  34. package/lib/esm/Listbox/ListboxGroup.js +2 -1
  35. package/lib/esm/Listbox/ListboxOverlay.js +5 -2
  36. package/lib/esm/Listbox/PressableItem.js +8 -4
  37. package/lib/esm/TextInput/TextInputBase.js +5 -1
  38. package/lib/esm/ThemeProvider/index.js +1 -0
  39. package/lib/esm/ThemeProvider/useResponsiveThemeTokensCallback.js +117 -0
  40. package/lib/esm/Validator/Validator.js +171 -135
  41. package/lib/esm/index.js +1 -1
  42. package/lib/package.json +2 -2
  43. package/package.json +2 -2
  44. package/src/Button/Button.jsx +26 -5
  45. package/src/Button/ButtonBase.jsx +79 -16
  46. package/src/Button/ButtonDropdown.jsx +2 -0
  47. package/src/Button/ButtonGroup.jsx +62 -45
  48. package/src/Button/propTypes.js +6 -0
  49. package/src/Card/PressableCardBase.jsx +3 -1
  50. package/src/Carousel/Carousel.jsx +71 -7
  51. package/src/Carousel/CarouselItem/CarouselItem.jsx +31 -3
  52. package/src/Icon/Icon.jsx +11 -14
  53. package/src/Icon/IconText.jsx +0 -1
  54. package/src/Listbox/GroupControl.jsx +41 -47
  55. package/src/Listbox/Listbox.jsx +26 -9
  56. package/src/Listbox/ListboxGroup.jsx +2 -1
  57. package/src/Listbox/ListboxOverlay.jsx +7 -2
  58. package/src/Listbox/PressableItem.jsx +8 -4
  59. package/src/PriceLockup/utils/renderPrice.jsx +15 -17
  60. package/src/TextInput/TextInputBase.jsx +5 -1
  61. package/src/ThemeProvider/index.js +1 -0
  62. package/src/ThemeProvider/useResponsiveThemeTokensCallback.js +129 -0
  63. package/src/Validator/Validator.jsx +180 -159
  64. package/src/index.js +2 -1
@@ -107,7 +107,6 @@ IconText.propTypes = {
107
107
  * `<Typography>` component, or a component that renders `<Text>`.
108
108
  */
109
109
  children: _propTypes.default.node
110
- /* eslint-enable react/no-unused-prop-types */
111
110
  };
112
111
  const staticStyles = _StyleSheet.default.create({
113
112
  adjustedContainer: {
@@ -7,8 +7,8 @@ exports.default = void 0;
7
7
  var _react = _interopRequireDefault(require("react"));
8
8
  var _propTypes = _interopRequireDefault(require("prop-types"));
9
9
  var _View = _interopRequireDefault(require("react-native-web/dist/cjs/exports/View"));
10
- var _StyleSheet = _interopRequireDefault(require("react-native-web/dist/cjs/exports/StyleSheet"));
11
10
  var _Text = _interopRequireDefault(require("react-native-web/dist/cjs/exports/Text"));
11
+ var _StyleSheet = _interopRequireDefault(require("react-native-web/dist/cjs/exports/StyleSheet"));
12
12
  var _ThemeProvider = require("../ThemeProvider");
13
13
  var _Icon = _interopRequireDefault(require("../Icon"));
14
14
  var _Spacer = _interopRequireDefault(require("../Spacer"));
@@ -16,7 +16,7 @@ var _ListboxContext = require("./ListboxContext");
16
16
  var _jsxRuntime = require("react/jsx-runtime");
17
17
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
18
18
  const styles = _StyleSheet.default.create({
19
- controlWrapper: {
19
+ container: {
20
20
  width: '100%',
21
21
  flex: 1,
22
22
  alignItems: 'center',
@@ -25,6 +25,34 @@ const styles = _StyleSheet.default.create({
25
25
  boxSizing: 'border-box'
26
26
  }
27
27
  });
28
+ const selectTextStyles = tokens => ({
29
+ color: tokens.groupColor,
30
+ fontFamily: `${tokens.groupFontName}${tokens.groupFontWeight}normal`,
31
+ fontSize: tokens.groupFontSize,
32
+ fontWeight: tokens.groupFontWeight
33
+ });
34
+ const selectContainerStyles = tokens => ({
35
+ fontFamily: `${tokens.groupFontName}${tokens.groupFontWeight}normal`,
36
+ fontSize: tokens.groupFontSize,
37
+ color: tokens.groupColor,
38
+ textDecoration: tokens.itemTextDecoration,
39
+ backgroundColor: tokens.groupBackgroundColor,
40
+ outline: tokens.itemOutline,
41
+ minHeight: tokens.groupHeight,
42
+ borderRadius: tokens.groupBorderRadius,
43
+ paddingLeft: tokens.groupPaddingLeft - tokens.groupBorderLeftWidth,
44
+ paddingRight: tokens.groupPaddingRight - tokens.groupBorderRightWidth,
45
+ paddingTop: tokens.groupPaddingTop - tokens.groupBorderTopWidth,
46
+ paddingBottom: tokens.groupPaddingBottom - tokens.groupBorderBottomWidth,
47
+ borderLeftWidth: tokens.groupBorderLeftWidth,
48
+ borderLeftColor: tokens.groupBorderLeftColor,
49
+ borderRightWidth: tokens.groupBorderRightWidth,
50
+ borderRightColor: tokens.groupBorderRightColor,
51
+ borderTopWidth: tokens.groupBorderTopWidth,
52
+ borderTopColor: tokens.groupBorderTopColor,
53
+ borderBottomWidth: tokens.groupBorderBottomWidth,
54
+ borderBottomColor: tokens.groupBorderBottomColor
55
+ });
28
56
  const GroupControl = /*#__PURE__*/_react.default.forwardRef((_ref, ref) => {
29
57
  let {
30
58
  expanded,
@@ -45,51 +73,17 @@ const GroupControl = /*#__PURE__*/_react.default.forwardRef((_ref, ref) => {
45
73
  current: selectedId === id && id !== undefined,
46
74
  focus
47
75
  });
48
- const {
49
- groupFontName,
50
- groupFontWeight,
51
- groupFontSize,
52
- groupColor,
53
- groupBackgroundColor,
54
- groupBorderColor,
55
- groupBorderWidth,
56
- groupBorderRadius,
57
- groupPaddingLeft,
58
- groupPaddingRight,
59
- groupPaddingTop,
60
- groupPaddingBottom,
61
- itemTextDecoration,
62
- itemOutline,
63
- groupHeight
64
- } = tokens;
65
- const getTextStyles = () => ({
66
- color: groupColor
67
- });
68
76
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_View.default, {
69
77
  onPress: () => setSelectedId(id),
70
- style: [styles.controlWrapper, {
71
- fontFamily: `${groupFontName}${groupFontWeight}normal`,
72
- fontSize: groupFontSize,
73
- color: groupColor,
74
- textDecoration: itemTextDecoration,
75
- backgroundColor: groupBackgroundColor,
76
- outline: itemOutline,
77
- height: groupHeight,
78
- border: `${groupBorderWidth}px solid ${groupBorderColor}`,
79
- borderRadius: groupBorderRadius,
80
- paddingLeft: groupPaddingLeft - groupBorderWidth,
81
- paddingRight: groupPaddingRight - groupBorderWidth,
82
- paddingTop: groupPaddingTop - groupBorderWidth,
83
- paddingBottom: groupPaddingBottom - groupBorderWidth
84
- }],
78
+ style: [styles.container, selectContainerStyles(tokens)],
85
79
  ref: ref,
86
80
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Text.default, {
87
- style: getTextStyles(),
81
+ style: selectTextStyles(tokens),
88
82
  children: label
89
83
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Spacer.default, {
90
84
  space: 1,
91
85
  direction: "row"
92
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.default, {
86
+ }), tokens.groupIcon && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.default, {
93
87
  icon: tokens.groupIcon,
94
88
  tokens: {
95
89
  color: tokens.groupColor
@@ -7,8 +7,8 @@ exports.default = void 0;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
8
  var _propTypes = _interopRequireDefault(require("prop-types"));
9
9
  var _View = _interopRequireDefault(require("react-native-web/dist/cjs/exports/View"));
10
- var _StyleSheet = _interopRequireDefault(require("react-native-web/dist/cjs/exports/StyleSheet"));
11
10
  var _Platform = _interopRequireDefault(require("react-native-web/dist/cjs/exports/Platform"));
11
+ var _StyleSheet = _interopRequireDefault(require("react-native-web/dist/cjs/exports/StyleSheet"));
12
12
  var _ThemeProvider = require("../ThemeProvider");
13
13
  var _utils = require("../utils");
14
14
  var _ExpandCollapse = _interopRequireDefault(require("../ExpandCollapse"));
@@ -21,11 +21,16 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
21
21
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
22
22
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
23
23
  const styles = _StyleSheet.default.create({
24
- list: {
24
+ container: {
25
25
  padding: 0,
26
26
  margin: 0
27
27
  }
28
28
  });
29
+ const selectContainerStyles = tokens => ({
30
+ minHeight: tokens.minHeight,
31
+ minWidth: tokens.minWidth,
32
+ backgroundColor: tokens.containerBackgroundColor
33
+ });
29
34
  const getInitialOpen = (items, selectedId) => items.filter(item => item.items && item.items.some(nestedItem => (nestedItem.id ?? nestedItem.label) === selectedId)).map(item => item.id ?? item.label);
30
35
  const Listbox = /*#__PURE__*/_react.default.forwardRef((_ref, ref) => {
31
36
  let {
@@ -39,14 +44,12 @@ const Listbox = /*#__PURE__*/_react.default.forwardRef((_ref, ref) => {
39
44
  itemRouterProps,
40
45
  onClose,
41
46
  variant,
42
- tokens
47
+ tokens,
48
+ testID
43
49
  } = _ref;
44
50
  const initialOpen = getInitialOpen(items, defaultSelectedId);
45
51
  const [selectedId, setSelectedId] = _react.default.useState(defaultSelectedId);
46
- const {
47
- minHeight,
48
- minWidth
49
- } = (0, _ThemeProvider.useThemeTokens)('Listbox', variant, tokens);
52
+ const listboxTokens = (0, _ThemeProvider.useThemeTokens)('Listbox', tokens, variant);
50
53
 
51
54
  // We need to keep track of each item's ref in order to be able to
52
55
  // focus on a specific item via keyboard navigation
@@ -105,11 +108,9 @@ const Listbox = /*#__PURE__*/_react.default.forwardRef((_ref, ref) => {
105
108
  maxOpen: 1,
106
109
  ref: ref,
107
110
  children: expandProps => /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
108
- style: [styles.list, {
109
- minHeight,
110
- minWidth
111
- }],
112
- role: "listbox",
111
+ style: [styles.container, selectContainerStyles(listboxTokens)],
112
+ accessibilityRole: "combobox",
113
+ testID: testID,
113
114
  children: items.map((item, index) => {
114
115
  const {
115
116
  id,
@@ -171,7 +172,15 @@ Listbox.propTypes = {
171
172
  /**
172
173
  * onClose event
173
174
  */
174
- onClose: _propTypes.default.func
175
+ onClose: _propTypes.default.func,
176
+ /**
177
+ * Test ID for testing
178
+ */
179
+ testID: _propTypes.default.string,
180
+ /**
181
+ * Listbox variant
182
+ */
183
+ variant: _utils.variantProp.propType
175
184
  };
176
185
  Listbox.Overlay = _ListboxOverlay.default;
177
186
  var _default = exports.default = Listbox;
@@ -85,7 +85,8 @@ const ListboxGroup = /*#__PURE__*/_react.default.forwardRef((_ref, ref) => {
85
85
  borderColor: 'transparent',
86
86
  borderRadius: 0,
87
87
  borderWidth: 0,
88
- marginBottom: 0
88
+ marginBottom: 0,
89
+ contentPanelBackgroundColor: 'transparent'
89
90
  },
90
91
  controlRef: ref,
91
92
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
@@ -37,12 +37,14 @@ const DropdownOverlay = /*#__PURE__*/_react.default.forwardRef((_ref, ref) => {
37
37
  maxWidth,
38
38
  minWidth,
39
39
  onLayout,
40
- tokens
40
+ tokens,
41
+ testID
41
42
  } = _ref;
42
43
  const systemTokens = (0, _ThemeProvider.useThemeTokens)('Listbox', {}, {});
43
44
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
44
45
  ref: ref,
45
46
  onLayout: onLayout,
47
+ testID: testID,
46
48
  style: [overlaidPosition, {
47
49
  maxWidth,
48
50
  minWidth
@@ -81,6 +83,7 @@ DropdownOverlay.propTypes = {
81
83
  maxWidth: _propTypes.default.number,
82
84
  minWidth: _propTypes.default.number,
83
85
  onLayout: _propTypes.default.func,
84
- tokens: _propTypes.default.object
86
+ tokens: _propTypes.default.object,
87
+ testID: _propTypes.default.string
85
88
  };
86
89
  var _default = exports.default = _Platform.default.OS === 'web' ? withPortal(DropdownOverlay) : DropdownOverlay;
@@ -48,10 +48,14 @@ const getItemStyles = _ref => {
48
48
  color: itemColor,
49
49
  outline: itemOutline,
50
50
  textDecoration: itemTextDecoration,
51
- borderLeft: `${itemBorderLeftWidth}px solid ${itemBorderLeftColor}`,
52
- borderRight: `${itemBorderRightWidth}px solid ${itemBorderRightColor}`,
53
- borderTop: `${itemBorderTopWidth}px solid ${itemBorderTopColor}`,
54
- borderBottom: `${itemBorderBottomWidth}px solid ${itemBorderBottomColor}`,
51
+ borderLeftWidth: itemBorderLeftWidth,
52
+ borderLeftColor: itemBorderLeftColor,
53
+ borderRightWidth: itemBorderRightWidth,
54
+ borderRightColor: itemBorderRightColor,
55
+ borderTopWidth: itemBorderTopWidth,
56
+ borderTopColor: itemBorderTopColor,
57
+ borderBottomWidth: itemBorderBottomWidth,
58
+ borderBottomColor: itemBorderBottomColor,
55
59
  borderRadius: itemBorderRadius,
56
60
  justifyContent: 'center'
57
61
  };
@@ -286,6 +286,10 @@ const TextInputBase = /*#__PURE__*/_react.default.forwardRef((_ref8, ref) => {
286
286
  // Add a space every 4 digits starting from the 5th position
287
287
  filteredText = formattedValue.replace(regex, '$1 ').trim();
288
288
  }
289
+ // Apply maxLength if provided
290
+ if (rest.maxLength && filteredText && filteredText.length > rest.maxLength) {
291
+ filteredText = filteredText.substring(0, rest.maxLength);
292
+ }
289
293
  setValue(filteredText, event);
290
294
  if (typeof onChangeText === 'function') onChangeText(filteredText, event);
291
295
  };
@@ -358,7 +362,7 @@ const TextInputBase = /*#__PURE__*/_react.default.forwardRef((_ref8, ref) => {
358
362
  onMouseOut: handleMouseOut,
359
363
  onChange: handleChangeText,
360
364
  defaultValue: initialValue,
361
- maxLength: type === 'card' ? 19 : undefined,
365
+ maxLength: type === 'card' ? 19 : rest.maxLength,
362
366
  value: isControlled ? currentValue : undefined,
363
367
  onKeyPress
364
368
  };
@@ -6,7 +6,8 @@ Object.defineProperty(exports, "__esModule", {
6
6
  var _exportNames = {
7
7
  useTheme: true,
8
8
  useSetTheme: true,
9
- useResponsiveThemeTokens: true
9
+ useResponsiveThemeTokens: true,
10
+ useResponsiveThemeTokensCallback: true
10
11
  };
11
12
  exports.default = void 0;
12
13
  Object.defineProperty(exports, "useResponsiveThemeTokens", {
@@ -15,6 +16,12 @@ Object.defineProperty(exports, "useResponsiveThemeTokens", {
15
16
  return _useResponsiveThemeTokens.default;
16
17
  }
17
18
  });
19
+ Object.defineProperty(exports, "useResponsiveThemeTokensCallback", {
20
+ enumerable: true,
21
+ get: function () {
22
+ return _useResponsiveThemeTokensCallback.default;
23
+ }
24
+ });
18
25
  Object.defineProperty(exports, "useSetTheme", {
19
26
  enumerable: true,
20
27
  get: function () {
@@ -31,6 +38,7 @@ var _ThemeProvider = _interopRequireDefault(require("./ThemeProvider"));
31
38
  var _useTheme = _interopRequireDefault(require("./useTheme"));
32
39
  var _useSetTheme = _interopRequireDefault(require("./useSetTheme"));
33
40
  var _useResponsiveThemeTokens = _interopRequireDefault(require("./useResponsiveThemeTokens"));
41
+ var _useResponsiveThemeTokensCallback = _interopRequireDefault(require("./useResponsiveThemeTokensCallback"));
34
42
  var _useThemeTokens = require("./useThemeTokens");
35
43
  Object.keys(_useThemeTokens).forEach(function (key) {
36
44
  if (key === "default" || key === "__esModule") return;
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _react = require("react");
8
+ var _systemConstants = require("@telus-uds/system-constants");
9
+ var _useTheme = _interopRequireDefault(require("./useTheme"));
10
+ var _utils = require("./utils");
11
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
+ const getResponsiveThemeTokens = function (_ref, tokensProp) {
13
+ let {
14
+ rules = [],
15
+ tokens: defaultThemeTokens = {}
16
+ } = _ref;
17
+ let variants = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
18
+ let states = arguments.length > 3 ? arguments[3] : undefined;
19
+ const appearances = (0, _utils.mergeAppearances)(variants, states);
20
+ const tokensByViewport = Object.fromEntries(_systemConstants.viewports.keys.map(viewport => [viewport, {
21
+ ...defaultThemeTokens
22
+ }]));
23
+
24
+ // Go through each rule and collect them for the corresponding viewport if they apply
25
+ rules.forEach(rule => {
26
+ if (doesRuleApply(rule, appearances)) {
27
+ // If the rule does not have a viewport specified, we collect it in all viewports
28
+ let targetViewports = rule.if.viewport || _systemConstants.viewports.keys;
29
+ if (!Array.isArray(targetViewports)) {
30
+ targetViewports = [targetViewports];
31
+ }
32
+ targetViewports.forEach(viewport => {
33
+ tokensByViewport[viewport] = {
34
+ ...tokensByViewport[viewport],
35
+ ...rule.tokens
36
+ };
37
+ });
38
+ }
39
+ });
40
+ Object.keys(tokensByViewport).forEach(viewport => {
41
+ tokensByViewport[viewport] = (0, _utils.resolveThemeTokens)(tokensByViewport[viewport], appearances, tokensProp);
42
+ });
43
+ return tokensByViewport;
44
+ };
45
+ const doesRuleApply = (rule, appearances) => Object.entries(rule.if).every(condition => doesConditionApply(condition, appearances));
46
+ const doesConditionApply = (_ref2, appearances) => {
47
+ let [key, value] = _ref2;
48
+ if (key === 'viewport') {
49
+ return true;
50
+ }
51
+ // use null rather than undefined so we can serialise the value in themes
52
+ const appearanceValue = appearances[key] ?? null;
53
+ return Array.isArray(value) ? value.includes(appearanceValue) : value === appearanceValue;
54
+ };
55
+
56
+ /**
57
+ * @typedef {import('../utils/props/tokens.js').TokensSet} TokensSet
58
+ * @typedef {import('../utils/props/tokens.js').TokensProp} TokensProp
59
+ * @typedef {import('../utils/props/variantProp').AppearanceSet} AppearanceSet
60
+ */
61
+
62
+ /**
63
+ * Returns a memoised tokens getter function that gets responsive tokens for all viewports,
64
+ * similar to calling useResponsiveThemeTokens but with the callback pattern of useThemeTokensCallback.
65
+ *
66
+ * Scenarios where `useResponsiveThemeTokensCallback` should be used:
67
+ *
68
+ * - Where responsive tokens are to be obtained from state that is accessible only in scopes like callbacks
69
+ * and render functions, where calling useResponsiveThemeTokens directly would be disallowed by React's hook rules.
70
+ * - When using media query stylesheets and need to resolve tokens based on dynamic state (e.g., pressed, hovered)
71
+ * that changes at runtime.
72
+ * - Passing a responsive tokens getter down via a child component's `tokens` prop, applying rules using the
73
+ * child component's current state.
74
+ *
75
+ * The function returned may be called with an object of state appearances to get an object
76
+ * of tokens for each viewport, which can then be passed to createMediaQueryStyles.
77
+ *
78
+ * @example
79
+ * // Resolving responsive tokens inside Pressable's style function, based on Pressable state
80
+ * const PressMe = ({ tokens, variant, children }) => {
81
+ * const getResponsiveTokens = useResponsiveThemeTokensCallback('PressMe', tokens, variant)
82
+ * const getPressableStyle = ({ pressed }) => {
83
+ * const responsiveTokens = getResponsiveTokens({ pressed })
84
+ * const mediaQueryStyles = createMediaQueryStyles(responsiveTokens)
85
+ * return mediaQueryStyles
86
+ * }
87
+ * return <Pressable style={getPressableStyle}>{children}</Pressable>
88
+ * }
89
+ *
90
+ * @example
91
+ * // Setting the theme in a parent and resolving it in a child based on child's state
92
+ * const MenuButton = ({ tokens, variant, ...buttonProps }) => {
93
+ * // Define what theme, variant etc we want in this component...
94
+ * const getResponsiveTokens = useResponsiveThemeTokensCallback('Button', tokens, variant)
95
+ * // ...resolve them in another component based on its state (e.g. press, hover...)
96
+ * return <ButtonBase tokens={getResponsiveTokens} accessibilityRole="menuitem" {...buttonProps} />
97
+ * }
98
+ *
99
+ * @typedef {Object} ResponsiveObject
100
+ * @property {TokensSet} xs
101
+ * @property {TokensSet} sm
102
+ * @property {TokensSet} md
103
+ * @property {TokensSet} lg
104
+ * @property {TokensSet} xl
105
+ *
106
+ * @param {string} componentName - the name as defined in the theme schema of the component whose theme is to be used
107
+ * @param {TokensProp} [tokens] - every themed component should accept a `tokens` prop allowing theme tokens to be overridden
108
+ * @param {AppearanceSet} [variants] - variants passed in as props that don't change dynamically
109
+ * @returns {(states: AppearanceSet, tokenOverrides?: TokensProp) => ResponsiveObject}
110
+ * - callback function that returns an overridable responsive tokens object for current state. Only pass
111
+ * tokenOverrides in rare cases where tokens overrides are also generated outside hook scope.
112
+ */
113
+ const useResponsiveThemeTokensCallback = function (componentName) {
114
+ let tokens = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
115
+ let variants = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
116
+ const theme = (0, _useTheme.default)();
117
+ const componentTheme = (0, _utils.getComponentTheme)(theme, componentName);
118
+ const getResponsiveThemeTokensCallback = (0, _react.useCallback)((states, tokenOverrides) => {
119
+ const resolvedTokens = (0, _utils.resolveThemeTokens)(tokens, (0, _utils.mergeAppearances)(variants, states), tokenOverrides);
120
+ return getResponsiveThemeTokens(componentTheme, resolvedTokens, variants, states);
121
+ }, [componentTheme, tokens, variants]);
122
+ return getResponsiveThemeTokensCallback;
123
+ };
124
+ var _default = exports.default = useResponsiveThemeTokensCallback;