@telus-uds/components-base 3.18.0 → 3.20.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 (52) hide show
  1. package/CHANGELOG.md +32 -1
  2. package/jest.config.cjs +10 -2
  3. package/lib/cjs/Box/Box.js +114 -62
  4. package/lib/cjs/Box/backgroundImageStylesMap.js +136 -28
  5. package/lib/cjs/Button/ButtonDropdown.js +1 -0
  6. package/lib/cjs/Carousel/Carousel.js +1 -1
  7. package/lib/cjs/ExpandCollapseMini/ExpandCollapseMiniControl.js +8 -21
  8. package/lib/cjs/Link/LinkBase.js +8 -9
  9. package/lib/cjs/MultiSelectFilter/MultiSelectFilter.js +10 -10
  10. package/lib/cjs/Spacer/Spacer.js +65 -5
  11. package/lib/cjs/StepTracker/Step.js +12 -1
  12. package/lib/cjs/StepTracker/StepTracker.js +15 -4
  13. package/lib/cjs/TabBar/TabBar.js +4 -2
  14. package/lib/cjs/TabBar/index.js +2 -0
  15. package/lib/cjs/Tooltip/Backdrop.js +1 -1
  16. package/lib/cjs/utils/index.js +17 -1
  17. package/lib/cjs/utils/isTouchDevice.js +34 -0
  18. package/lib/cjs/utils/useMediaQuerySpacing.js +121 -0
  19. package/lib/esm/Box/Box.js +113 -63
  20. package/lib/esm/Box/backgroundImageStylesMap.js +134 -27
  21. package/lib/esm/Button/ButtonDropdown.js +1 -0
  22. package/lib/esm/Carousel/Carousel.js +2 -2
  23. package/lib/esm/ExpandCollapseMini/ExpandCollapseMiniControl.js +8 -21
  24. package/lib/esm/Link/LinkBase.js +8 -9
  25. package/lib/esm/MultiSelectFilter/MultiSelectFilter.js +10 -10
  26. package/lib/esm/Spacer/Spacer.js +66 -6
  27. package/lib/esm/StepTracker/Step.js +12 -1
  28. package/lib/esm/StepTracker/StepTracker.js +15 -4
  29. package/lib/esm/TabBar/TabBar.js +4 -2
  30. package/lib/esm/TabBar/index.js +2 -0
  31. package/lib/esm/Tooltip/Backdrop.js +1 -1
  32. package/lib/esm/utils/index.js +3 -1
  33. package/lib/esm/utils/isTouchDevice.js +27 -0
  34. package/lib/esm/utils/useMediaQuerySpacing.js +116 -0
  35. package/lib/package.json +2 -2
  36. package/package.json +2 -2
  37. package/src/Box/Box.jsx +97 -55
  38. package/src/Box/backgroundImageStylesMap.js +48 -15
  39. package/src/Button/ButtonDropdown.jsx +1 -0
  40. package/src/Carousel/Carousel.jsx +3 -2
  41. package/src/ExpandCollapseMini/ExpandCollapseMiniControl.jsx +9 -16
  42. package/src/Link/LinkBase.jsx +11 -9
  43. package/src/MultiSelectFilter/MultiSelectFilter.jsx +11 -10
  44. package/src/Spacer/Spacer.jsx +54 -7
  45. package/src/StepTracker/Step.jsx +47 -27
  46. package/src/StepTracker/StepTracker.jsx +9 -1
  47. package/src/TabBar/TabBar.jsx +3 -1
  48. package/src/TabBar/index.js +3 -0
  49. package/src/Tooltip/Backdrop.jsx +1 -1
  50. package/src/utils/index.js +2 -0
  51. package/src/utils/isTouchDevice.js +34 -0
  52. package/src/utils/useMediaQuerySpacing.js +124 -0
@@ -71,7 +71,6 @@ const selectContainerStyle = (windowHeight, windowWidth) => ({
71
71
  width: windowWidth
72
72
  });
73
73
  const TOTAL_COLUMNS = 12;
74
- const MAX_ITEMS_THRESHOLD = 12;
75
74
  const MultiSelectFilter = /*#__PURE__*/_react.default.forwardRef((_ref3, ref) => {
76
75
  let {
77
76
  label,
@@ -178,12 +177,13 @@ const MultiSelectFilter = /*#__PURE__*/_react.default.forwardRef((_ref3, ref) =>
178
177
  });
179
178
  const colSizeNotMobile = items.length > rowLimit ? 2 : 1;
180
179
  const colSize = viewport !== 'xs' ? colSizeNotMobile : 1;
181
- const itemsLengthNotMobile = items.length > 24 ? items.length / 2 : rowLimit;
182
- const rowLength = viewport !== 'xs' ? itemsLengthNotMobile : items.length;
180
+ let rowLength = items.length;
181
+ if (viewport !== 'xs' && colSize === 2) {
182
+ rowLength = Math.ceil(items.length / 2);
183
+ }
183
184
  _react.default.useEffect(() => {
184
- if (colSize === 1) return setMaxWidth(false);
185
- return colSize === 2 && setMaxWidth(true);
186
- }, [colSize]);
185
+ setMaxWidth(items.length >= rowLimit);
186
+ }, [items.length, rowLimit]);
187
187
  _react.default.useEffect(() => setCheckedIds(currentValues ?? []), [currentValues]);
188
188
  const uniqueFields = ['id', 'label'];
189
189
  if (!(0, _utils.containUniqueFields)(items, uniqueFields)) {
@@ -430,14 +430,14 @@ const MultiSelectFilter = /*#__PURE__*/_react.default.forwardRef((_ref3, ref) =>
430
430
  dismissWhenPressedOutside: dismissWhenPressedOutside,
431
431
  onClose: onClose,
432
432
  overlaidPosition: overlaidPosition,
433
- maxHeight: items.length > MAX_ITEMS_THRESHOLD ? true : maxHeight,
433
+ maxHeight: items.length >= rowLimit ? true : maxHeight,
434
434
  maxHeightSize: maxHeightSize,
435
435
  maxWidthSize: maxWidthSize,
436
436
  minHeight: minHeight,
437
437
  minWidth: minWidth,
438
438
  tokens: {
439
439
  ...tokens,
440
- maxWidth: items.length > MAX_ITEMS_THRESHOLD ? true : maxWidth,
440
+ maxWidth: items.length >= rowLimit ? true : maxWidth,
441
441
  borderColor: containerBorderColor
442
442
  },
443
443
  copy: copy,
@@ -489,9 +489,9 @@ MultiSelectFilter.propTypes = {
489
489
  */
490
490
  label: _propTypes.default.string.isRequired,
491
491
  /**
492
- * The text for the subtitle
492
+ * The text for the subtitle. Can also be JSX.
493
493
  */
494
- subtitle: _propTypes.default.string,
494
+ subtitle: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.node]),
495
495
  /**
496
496
  * An optional unique string may be provided to identify the ButtonDropdown.
497
497
  * If not provided, the label is used.
@@ -6,9 +6,11 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var _react = _interopRequireDefault(require("react"));
8
8
  var _propTypes = _interopRequireDefault(require("prop-types"));
9
- var _StyleSheet = _interopRequireDefault(require("react-native-web/dist/cjs/exports/StyleSheet"));
10
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
11
  var _utils = require("../utils");
12
+ var _useMediaQuerySpacing = _interopRequireDefault(require("../utils/useMediaQuerySpacing"));
13
+ var _useTheme = _interopRequireDefault(require("../ThemeProvider/useTheme"));
12
14
  var _jsxRuntime = require("react/jsx-runtime");
13
15
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
16
  /**
@@ -65,13 +67,66 @@ const Spacer = /*#__PURE__*/_react.default.forwardRef((_ref, ref) => {
65
67
  let {
66
68
  space = 1,
67
69
  direction = 'column',
70
+ dataSet,
68
71
  ...rest
69
72
  } = _ref;
70
- const size = (0, _utils.useSpacingScale)(space);
71
- const sizeStyle = selectSizeStyle(size, direction);
73
+ const {
74
+ themeOptions: {
75
+ enableMediaQueryStyleSheet
76
+ }
77
+ } = (0, _useTheme.default)();
78
+ const {
79
+ sizeByViewport
80
+ } = (0, _useMediaQuerySpacing.default)(space);
81
+ const fallbackSize = (0, _utils.useSpacingScale)(space);
82
+ const sizeStyle = selectSizeStyle(fallbackSize, direction);
83
+ let spacerStyles;
84
+ let dataSetValue = dataSet;
85
+ if (enableMediaQueryStyleSheet) {
86
+ const sizeKey = direction === 'row' ? 'width' : 'height';
87
+ const stylesByViewport = {
88
+ xs: {
89
+ [sizeKey]: sizeByViewport.xs,
90
+ ...staticStyles.stretch
91
+ },
92
+ sm: {
93
+ [sizeKey]: sizeByViewport.sm,
94
+ ...staticStyles.stretch
95
+ },
96
+ md: {
97
+ [sizeKey]: sizeByViewport.md,
98
+ ...staticStyles.stretch
99
+ },
100
+ lg: {
101
+ [sizeKey]: sizeByViewport.lg,
102
+ ...staticStyles.stretch
103
+ },
104
+ xl: {
105
+ [sizeKey]: sizeByViewport.xl,
106
+ ...staticStyles.stretch
107
+ }
108
+ };
109
+ const mediaQueryStyles = (0, _utils.createMediaQueryStyles)(stylesByViewport);
110
+ const {
111
+ ids,
112
+ styles
113
+ } = _utils.StyleSheet.create({
114
+ spacer: {
115
+ ...mediaQueryStyles
116
+ }
117
+ });
118
+ spacerStyles = styles.spacer;
119
+ dataSetValue = {
120
+ media: ids.spacer,
121
+ ...dataSet
122
+ };
123
+ } else {
124
+ spacerStyles = [staticStyles.stretch, sizeStyle];
125
+ }
72
126
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
73
127
  ref: ref,
74
- style: [staticStyles.stretch, sizeStyle],
128
+ style: spacerStyles,
129
+ dataSet: dataSetValue,
75
130
  ...selectProps(rest)
76
131
  });
77
132
  });
@@ -90,7 +145,12 @@ Spacer.propTypes = {
90
145
  * - `'column'` (default) applies space vertically; has a fixed height and not width.
91
146
  * - `'row'` applies space horizontally; has a fixed width and not height.
92
147
  */
93
- direction: _propTypes.default.oneOf(['column', 'row'])
148
+ direction: _propTypes.default.oneOf(['column', 'row']),
149
+ /**
150
+ * Data attributes to be applied to the element. When media query stylesheet is enabled,
151
+ * this will include media query IDs for responsive styling.
152
+ */
153
+ dataSet: _propTypes.default.object
94
154
  };
95
155
  const staticStyles = _StyleSheet.default.create({
96
156
  stretch: {
@@ -157,6 +157,13 @@ const getStepTestID = (isCompleted, isCurrent) => {
157
157
  }
158
158
  return testID;
159
159
  };
160
+ const selectBarContainerStyles = (themeTokens, isCompleted, isCurrent) => ({
161
+ backgroundColor: isCompleted ? themeTokens.barCompletedBackgroundColor : themeTokens.barBackgroundColor,
162
+ height: themeTokens.barHeight,
163
+ ...(isCurrent && {
164
+ backgroundColor: themeTokens.barCurrentBackgroundColor
165
+ })
166
+ });
160
167
 
161
168
  /**
162
169
  * A single step of a StepTracker.
@@ -169,6 +176,7 @@ const Step = /*#__PURE__*/_react.default.forwardRef((_ref8, ref) => {
169
176
  stepCount = 0,
170
177
  stepIndex = 0,
171
178
  tokens,
179
+ isBarVariant,
172
180
  ...rest
173
181
  } = _ref8;
174
182
  const {
@@ -197,7 +205,10 @@ const Step = /*#__PURE__*/_react.default.forwardRef((_ref8, ref) => {
197
205
  accessibilityCurrent: status === stepIndex,
198
206
  ref: ref,
199
207
  ...selectProps(rest),
200
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_StackView.default, {
208
+ children: [isBarVariant && /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
209
+ style: selectBarContainerStyles(themeTokens, isCompleted, isCurrent),
210
+ testID: getStepTestID(isCompleted, isCurrent)
211
+ }), !isBarVariant && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_StackView.default, {
201
212
  direction: "row",
202
213
  space: 0,
203
214
  tokens: {
@@ -19,6 +19,7 @@ var _Step = _interopRequireDefault(require("./Step"));
19
19
  var _dictionary = _interopRequireDefault(require("./dictionary"));
20
20
  var _jsxRuntime = require("react/jsx-runtime");
21
21
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
22
+ const STYLE_BAR_VARIANT = 'bar';
22
23
  const [selectProps, selectedSystemPropTypes] = (0, _utils.selectSystemProps)([_utils.a11yProps, _utils.viewProps]);
23
24
  const selectContainerStyles = _ref => {
24
25
  let {
@@ -59,6 +60,14 @@ const selectStepTrackerLabelStyles = (_ref3, themeOptions) => {
59
60
  themeOptions
60
61
  });
61
62
  };
63
+ const selectStepsContainerStyles = _ref4 => {
64
+ let {
65
+ barGap
66
+ } = _ref4;
67
+ return {
68
+ gap: barGap
69
+ };
70
+ };
62
71
 
63
72
  /**
64
73
  * StepTracker component shows the current position in a sequence of steps.
@@ -92,7 +101,7 @@ const selectStepTrackerLabelStyles = (_ref3, themeOptions) => {
92
101
  * - `accessibilityValue.text` (`aria-valuetext`): `<Current Step Label>`,
93
102
  *
94
103
  */
95
- const StepTracker = /*#__PURE__*/_react.default.forwardRef((_ref4, ref) => {
104
+ const StepTracker = /*#__PURE__*/_react.default.forwardRef((_ref5, ref) => {
96
105
  let {
97
106
  current = 0,
98
107
  copy = 'en',
@@ -101,7 +110,8 @@ const StepTracker = /*#__PURE__*/_react.default.forwardRef((_ref4, ref) => {
101
110
  tokens,
102
111
  variant,
103
112
  ...rest
104
- } = _ref4;
113
+ } = _ref5;
114
+ const isBarVariant = variant?.style === STYLE_BAR_VARIANT;
105
115
  const viewport = (0, _ViewportProvider.useViewport)();
106
116
  const {
107
117
  showStepTrackerLabel,
@@ -147,7 +157,7 @@ const StepTracker = /*#__PURE__*/_react.default.forwardRef((_ref4, ref) => {
147
157
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_StackView.default, {
148
158
  space: 0,
149
159
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
150
- style: staticStyles.stepsContainer,
160
+ style: [staticStyles.stepsContainer, selectStepsContainerStyles(themeTokens)],
151
161
  accessibilityRole: stepsContainerAccessibilityRole,
152
162
  children: steps.map((label, index) => {
153
163
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Step.default, {
@@ -158,7 +168,8 @@ const StepTracker = /*#__PURE__*/_react.default.forwardRef((_ref4, ref) => {
158
168
  stepCount: steps.length,
159
169
  tokens: themeTokens,
160
170
  accessibilityRole: stepAccessibilityRole,
161
- accessibilityCurrent: current === index && _Platform.default.OS === 'web' && 'step'
171
+ accessibilityCurrent: current === index && _Platform.default.OS === 'web' && 'step',
172
+ isBarVariant: isBarVariant
162
173
  }, label);
163
174
  })
164
175
  }), showStepTrackerLabel && /*#__PURE__*/(0, _jsxRuntime.jsx)(_View.default, {
@@ -91,7 +91,8 @@ const TabBar = /*#__PURE__*/_react.default.forwardRef((_ref3, ref) => {
91
91
  iconActive: item.iconActive,
92
92
  onPress: () => handlePress(item.id),
93
93
  id: `tab-item-${index}`,
94
- accessibilityRole: "tablist"
94
+ accessibilityRole: "tablist",
95
+ tokens: item.tokens
95
96
  }, item.id))
96
97
  })
97
98
  });
@@ -105,7 +106,8 @@ TabBar.propTypes = {
105
106
  icon: _propTypes.default.node,
106
107
  iconActive: _propTypes.default.node,
107
108
  label: _propTypes.default.string.isRequired,
108
- href: _propTypes.default.string
109
+ href: _propTypes.default.string,
110
+ tokens: (0, _utils.getTokensPropType)('TabBarItem')
109
111
  })).isRequired,
110
112
  /** Id of the initially selected item. */
111
113
  initiallySelectedItem: _propTypes.default.number,
@@ -5,5 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _TabBar = _interopRequireDefault(require("./TabBar"));
8
+ var _TabBarItem = _interopRequireDefault(require("./TabBarItem"));
8
9
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ _TabBar.default.Item = _TabBarItem.default;
9
11
  var _default = exports.default = _TabBar.default;
@@ -21,7 +21,7 @@ function createPortalNode(nodeId) {
21
21
  left: ${window.scrollX}px;
22
22
  right: 0;
23
23
  bottom: 0;
24
- z-index: 9999;
24
+ z-index: 100000;
25
25
  pointer-events: none;
26
26
  `;
27
27
  document.body.appendChild(node);
@@ -8,6 +8,7 @@ var _exportNames = {
8
8
  useCopy: true,
9
9
  useHash: true,
10
10
  useSpacingScale: true,
11
+ useMediaQuerySpacing: true,
11
12
  useResponsiveProp: true,
12
13
  useOverlaidPosition: true,
13
14
  useSafeLayoutEffect: true,
@@ -21,7 +22,8 @@ var _exportNames = {
21
22
  convertFromMegaByteToByte: true,
22
23
  formatImageSource: true,
23
24
  getSpacingScale: true,
24
- useVariants: true
25
+ useVariants: true,
26
+ isTouchDevice: true
25
27
  };
26
28
  Object.defineProperty(exports, "BaseView", {
27
29
  enumerable: true,
@@ -65,6 +67,12 @@ Object.defineProperty(exports, "info", {
65
67
  return _info.default;
66
68
  }
67
69
  });
70
+ Object.defineProperty(exports, "isTouchDevice", {
71
+ enumerable: true,
72
+ get: function () {
73
+ return _isTouchDevice.default;
74
+ }
75
+ });
68
76
  Object.defineProperty(exports, "transformGradient", {
69
77
  enumerable: true,
70
78
  get: function () {
@@ -83,6 +91,12 @@ Object.defineProperty(exports, "useHash", {
83
91
  return _useHash.default;
84
92
  }
85
93
  });
94
+ Object.defineProperty(exports, "useMediaQuerySpacing", {
95
+ enumerable: true,
96
+ get: function () {
97
+ return _useMediaQuerySpacing.default;
98
+ }
99
+ });
86
100
  Object.defineProperty(exports, "useOverlaidPosition", {
87
101
  enumerable: true,
88
102
  get: function () {
@@ -219,6 +233,7 @@ var _info = _interopRequireDefault(require("./info"));
219
233
  var _useCopy = _interopRequireDefault(require("./useCopy"));
220
234
  var _useHash = _interopRequireDefault(require("./useHash"));
221
235
  var _useSpacingScale = _interopRequireDefault(require("./useSpacingScale"));
236
+ var _useMediaQuerySpacing = _interopRequireDefault(require("./useMediaQuerySpacing"));
222
237
  var _useResponsiveProp = _interopRequireWildcard(require("./useResponsiveProp"));
223
238
  Object.keys(_useResponsiveProp).forEach(function (key) {
224
239
  if (key === "default" || key === "__esModule") return;
@@ -256,6 +271,7 @@ var _convertFromMegaByteToByte = _interopRequireDefault(require("./convertFromMe
256
271
  var _formatImageSource = _interopRequireDefault(require("./formatImageSource"));
257
272
  var _getSpacingScale = _interopRequireDefault(require("./getSpacingScale"));
258
273
  var _useVariants = _interopRequireDefault(require("./useVariants"));
274
+ var _isTouchDevice = _interopRequireDefault(require("./isTouchDevice"));
259
275
  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); }
260
276
  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; }
261
277
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _Platform = _interopRequireDefault(require("react-native-web/dist/cjs/exports/Platform"));
8
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
+ /**
10
+ * Determines if the current device supports touch interactions
11
+ *
12
+ * @returns {boolean} True if the device supports touch, false otherwise
13
+ */
14
+ const isTouchDevice = () => {
15
+ if (_Platform.default.OS !== 'web') {
16
+ return true;
17
+ }
18
+ if (typeof window !== 'undefined') {
19
+ if ('ontouchstart' in window) {
20
+ return true;
21
+ }
22
+ if (window.navigator && window.navigator.maxTouchPoints > 0) {
23
+ return true;
24
+ }
25
+ if (window.navigator && window.navigator.msMaxTouchPoints > 0) {
26
+ return true;
27
+ }
28
+ if (window.matchMedia && window.matchMedia('(pointer: coarse)').matches) {
29
+ return true;
30
+ }
31
+ }
32
+ return false;
33
+ };
34
+ var _default = exports.default = isTouchDevice;
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _ThemeProvider = require("../ThemeProvider");
8
+ var _useResponsiveProp = require("./useResponsiveProp");
9
+ /**
10
+ * @typedef {import('@telus-uds/system-constants/viewports').Viewport} Viewport
11
+ * @typedef {import('./props/spacingProps.js').SpacingValue} SpacingValue
12
+ * @typedef {import('./props/spacingProps.js').SpacingIndex} SpacingIndex
13
+ * @typedef {import('./props/spacingProps.js').SpacingObject} SpacingObject
14
+ */
15
+
16
+ /**
17
+ * A utility hook that simplifies implementing media query-based responsive spacing.
18
+ *
19
+ * This hook handles the complexity of:
20
+ * - Detecting if a space value is responsive (has viewport keys)
21
+ * - Fetching theme tokens for each viewport
22
+ * - Resolving the correct space index for each viewport
23
+ * - Extracting actual pixel values from theme tokens
24
+ *
25
+ * ## Usage
26
+ *
27
+ * ```jsx
28
+ * const { sizeByViewport } = useMediaQuerySpacing(space, 'spacingScale')
29
+ *
30
+ * // Use sizeByViewport to create media query styles
31
+ * const stylesByViewport = {
32
+ * xs: { padding: sizeByViewport.xs },
33
+ * sm: { padding: sizeByViewport.sm },
34
+ * md: { padding: sizeByViewport.md },
35
+ * lg: { padding: sizeByViewport.lg },
36
+ * xl: { padding: sizeByViewport.xl }
37
+ * }
38
+ * const mediaQueryStyles = createMediaQueryStyles(stylesByViewport)
39
+ * ```
40
+ *
41
+ * ## Parameters
42
+ *
43
+ * @param {SpacingValue} spaceValue - A spacing value (number or responsive object with viewport keys)
44
+ * @param {string} tokenKey - The theme token key to use (e.g., 'spacingScale', 'Typography')
45
+ * @param {object} [tokens={}] - Additional tokens to pass to useThemeTokens
46
+ * @param {object} [variant={}] - Variant to pass to useThemeTokens
47
+ *
48
+ * ## Returns
49
+ *
50
+ * @returns {{
51
+ * spaceIndexByViewport: { xs: number, sm: number, md: number, lg: number, xl: number },
52
+ * sizeByViewport: { xs: number, sm: number, md: number, lg: number, xl: number },
53
+ * tokensByViewport: { xs: object, sm: object, md: object, lg: object, xl: object }
54
+ * }}
55
+ *
56
+ * - `spaceIndexByViewport`: The resolved space index for each viewport
57
+ * - `sizeByViewport`: The actual pixel/number values for each viewport
58
+ * - `tokensByViewport`: The full theme tokens for each viewport (for advanced use cases)
59
+ */
60
+ const useMediaQuerySpacing = function (spaceValue) {
61
+ let tokenKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'spacingScale';
62
+ let tokens = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
63
+ let variant = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
64
+ const isResponsive = typeof spaceValue === 'object' && spaceValue !== null && !spaceValue.space && !spaceValue.options;
65
+ const getSpaceIndex = viewport => {
66
+ if (isResponsive) {
67
+ return (0, _useResponsiveProp.resolveResponsiveProp)(spaceValue, viewport);
68
+ }
69
+ if (typeof spaceValue === 'number') {
70
+ return spaceValue;
71
+ }
72
+ return spaceValue?.space ?? 1;
73
+ };
74
+ const spaceIndexByViewport = {
75
+ xs: getSpaceIndex('xs'),
76
+ sm: getSpaceIndex('sm'),
77
+ md: getSpaceIndex('md'),
78
+ lg: getSpaceIndex('lg'),
79
+ xl: getSpaceIndex('xl')
80
+ };
81
+ const tokensXs = (0, _ThemeProvider.useThemeTokens)(tokenKey, tokens, variant, {
82
+ space: spaceIndexByViewport.xs,
83
+ viewport: 'xs'
84
+ });
85
+ const tokensSm = (0, _ThemeProvider.useThemeTokens)(tokenKey, tokens, variant, {
86
+ space: spaceIndexByViewport.sm,
87
+ viewport: 'sm'
88
+ });
89
+ const tokensMd = (0, _ThemeProvider.useThemeTokens)(tokenKey, tokens, variant, {
90
+ space: spaceIndexByViewport.md,
91
+ viewport: 'md'
92
+ });
93
+ const tokensLg = (0, _ThemeProvider.useThemeTokens)(tokenKey, tokens, variant, {
94
+ space: spaceIndexByViewport.lg,
95
+ viewport: 'lg'
96
+ });
97
+ const tokensXl = (0, _ThemeProvider.useThemeTokens)(tokenKey, tokens, variant, {
98
+ space: spaceIndexByViewport.xl,
99
+ viewport: 'xl'
100
+ });
101
+ const sizeByViewport = {
102
+ xs: tokensXs.size ?? 0,
103
+ sm: tokensSm.size ?? 0,
104
+ md: tokensMd.size ?? 0,
105
+ lg: tokensLg.size ?? 0,
106
+ xl: tokensXl.size ?? 0
107
+ };
108
+ const tokensByViewport = {
109
+ xs: tokensXs,
110
+ sm: tokensSm,
111
+ md: tokensMd,
112
+ lg: tokensLg,
113
+ xl: tokensXl
114
+ };
115
+ return {
116
+ spaceIndexByViewport,
117
+ sizeByViewport,
118
+ tokensByViewport
119
+ };
120
+ };
121
+ var _default = exports.default = useMediaQuerySpacing;