@pingux/astro 2.203.0-alpha.0 → 2.204.0-alpha.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.
@@ -15,6 +15,7 @@ _Object$defineProperty(exports, "__esModule", {
15
15
  value: true
16
16
  });
17
17
  exports["default"] = void 0;
18
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));
18
19
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
19
20
  var _objectDestructuringEmpty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectDestructuringEmpty"));
20
21
  var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
@@ -31,6 +32,7 @@ var _fieldAttributes = require("../../utils/docUtils/fieldAttributes");
31
32
  var _statusProp = require("../../utils/docUtils/statusProp");
32
33
  var _SelectFieldBase = _interopRequireDefault(require("../SelectFieldBase"));
33
34
  var _react2 = require("@emotion/react");
35
+ var _excluded = ["sx"];
34
36
  function _interopRequireWildcard(e, t) { if ("function" == typeof _WeakMap) var r = new _WeakMap(), n = new _WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = _Object$defineProperty) && _Object$getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
35
37
  function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
36
38
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context, _context2; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(t), !0)).call(_context, function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context2 = ownKeys(Object(t))).call(_context2, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
@@ -40,10 +42,11 @@ var LinkSelectField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref)
40
42
  isDisabled = props.isDisabled,
41
43
  status = props.status,
42
44
  helperText = props.helperText,
43
- iconProps = props.iconProps,
44
45
  hasInlineLoader = props.hasInlineLoader,
45
46
  popoverWidth = props.popoverWidth,
46
- triggerProps = props.triggerProps;
47
+ iconProps = props.iconProps,
48
+ triggerProps = props.triggerProps,
49
+ triggerProp = props.trigger;
47
50
  var _getAriaAttributeProp = (0, _ariaAttributes.getAriaAttributeProps)(props),
48
51
  ariaProps = _getAriaAttributeProp.ariaProps;
49
52
  var _useGetTheme = (0, _hooks.useGetTheme)(),
@@ -67,7 +70,10 @@ var LinkSelectField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref)
67
70
  state = selectFieldProps.state,
68
71
  raTriggerProps = selectFieldProps.triggerProps,
69
72
  triggerRef = selectFieldProps.triggerRef;
70
- var trigger = (0, _react2.jsx)(_.Button, (0, _extends2["default"])({
73
+ var _ref = iconProps || {},
74
+ iconPropsSx = _ref.sx,
75
+ restIconProps = (0, _objectWithoutProperties2["default"])(_ref, _excluded);
76
+ var triggerNode = (0, _react2.jsx)(_.Button, (0, _extends2["default"])({
71
77
  className: fieldControlInputProps.className,
72
78
  ref: triggerRef,
73
79
  variant: "selectLink",
@@ -87,23 +93,25 @@ var LinkSelectField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref)
87
93
  variant: "forms.select.arrow"
88
94
  }, (0, _react2.jsx)(_.Icon, (0, _extends2["default"])({
89
95
  icon: MenuDown,
96
+ title: {
97
+ name: 'Menu Down Icon'
98
+ },
99
+ sx: _objectSpread(_objectSpread({}, state.isOpen ? {
100
+ transform: 'rotate(180deg)'
101
+ } : null), iconPropsSx)
102
+ }, restIconProps, {
90
103
  title: {
91
104
  name: ''
92
105
  },
93
106
  color: isOnyx ? 'font.link' : 'active',
94
107
  size: linkSelectFieldIcon,
95
108
  "aria-hidden": "true"
96
- }, iconProps, {
97
- sx: _objectSpread({
98
- transform: state.isOpen ? 'rotate(180deg)' : 'rotate(0deg)',
99
- transition: 'transform 150ms ease'
100
- }, iconProps === null || iconProps === void 0 ? void 0 : iconProps.sx)
101
109
  })))), (0, _react2.jsx)(_reactAria.VisuallyHidden, {
102
110
  "aria-live": "polite",
103
111
  id: helperTextId
104
112
  }, helperText));
105
113
  return (0, _react2.jsx)(_SelectFieldBase["default"], (0, _extends2["default"])({}, props, selectFieldProps, {
106
- trigger: trigger
114
+ trigger: triggerProp || triggerNode
107
115
  }));
108
116
  });
109
117
  LinkSelectField.propTypes = _objectSpread(_objectSpread(_objectSpread({
@@ -172,8 +180,19 @@ LinkSelectField.propTypes = _objectSpread(_objectSpread(_objectSpread({
172
180
  onSelectionChange: _propTypes["default"].func,
173
181
  /** Display an inline loader inside the select trigger while loading. */
174
182
  hasInlineLoader: _propTypes["default"].bool,
183
+ /**
184
+ * Props object that is spread directly into the Icon inside the default trigger button.
185
+ * Supports all IconProps (icon, title, size, color, sx, etc.).
186
+ * The sx prop is merged with the rotation style.
187
+ */
188
+ iconProps: _propTypes["default"].shape({}),
175
189
  /** Width of the popover menu. Accepts any valid CSS unit. */
176
- popoverWidth: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number])
190
+ popoverWidth: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].number]),
191
+ /**
192
+ * A ReactNode that replaces the default Button trigger entirely.
193
+ * When provided, the local Button element is not rendered.
194
+ */
195
+ trigger: _propTypes["default"].node
177
196
  }, _statusProp.statusPropTypes), _fieldAttributes.inputFieldAttributesBasePropTypes), _ariaAttributes.ariaAttributesBasePropTypes);
178
197
  LinkSelectField.defaultProps = _objectSpread({
179
198
  placeholder: 'Select',
@@ -23,7 +23,7 @@ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequ
23
23
  _Object$defineProperty(exports, "__esModule", {
24
24
  value: true
25
25
  });
26
- exports["default"] = exports.WithPopoverWidth = exports.WithNoneOption = exports.NoOptionsAvailable = exports.LeftLabel = exports.HelperText = exports.DynamicItems = exports.DisabledOptions = exports.DisabledField = exports.Default = exports.Controlled = exports.AsyncLoading = void 0;
26
+ exports["default"] = exports.WithPopoverWidth = exports.WithNoneOption = exports.WithIconProps = exports.WithCustomTrigger = exports.NoOptionsAvailable = exports.LeftLabel = exports.HelperText = exports.DynamicItems = exports.DisabledOptions = exports.DisabledField = exports.Default = exports.Controlled = exports.AsyncLoading = void 0;
27
27
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));
28
28
  var _map = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/map"));
29
29
  var _fill = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/fill"));
@@ -32,6 +32,7 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/e
32
32
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
33
33
  var _react = _interopRequireWildcard(require("react"));
34
34
  var _reactAria = require("react-aria");
35
+ var _EarthIcon = _interopRequireDefault(require("@pingux/mdi-react/EarthIcon"));
35
36
  var _storybookDocsLayout = _interopRequireDefault(require("../../../.storybook/storybookDocsLayout"));
36
37
  var _users = require("../../api/users");
37
38
  var _index = require("../../index");
@@ -94,6 +95,14 @@ var _default = exports["default"] = {
94
95
  isRequired: {},
95
96
  selectedKey: {
96
97
  control: false
98
+ },
99
+ iconProps: {
100
+ control: false,
101
+ description: 'Props object spread into the Icon inside the default trigger button. Supports icon, title, size, color, sx, and other IconProps. The sx prop is merged with the rotation style.'
102
+ },
103
+ trigger: {
104
+ control: false,
105
+ description: 'A ReactNode that replaces the default Button trigger entirely. When provided, the local Button element is not rendered.'
97
106
  }
98
107
  }, _statusProp.statusArgTypes), _ariaAttributes.ariaAttributeBaseArgTypes), _fieldAttributes.inputFieldAttributeBaseArgTypes),
99
108
  args: {
@@ -352,4 +361,49 @@ WithPopoverWidth.parameters = {
352
361
  story: 'The `popoverWidth` prop can be used to set a custom width for the dropdown/popover.'
353
362
  }
354
363
  }
364
+ };
365
+ var WithIconProps = exports.WithIconProps = function WithIconProps() {
366
+ return (0, _react2.jsx)(_reactAria.OverlayProvider, null, (0, _react2.jsx)(_index.LinkSelectField, {
367
+ label: "What's your favorite color?",
368
+ iconProps: {
369
+ icon: _EarthIcon["default"],
370
+ sx: {
371
+ color: 'accent.40'
372
+ }
373
+ }
374
+ }, (0, _react2.jsx)(_index.Item, {
375
+ key: "red"
376
+ }, "Red"), (0, _react2.jsx)(_index.Item, {
377
+ key: "blue"
378
+ }, "Blue"), (0, _react2.jsx)(_index.Item, {
379
+ key: "yellow"
380
+ }, "Yellow")));
381
+ };
382
+ WithIconProps.parameters = {
383
+ docs: {
384
+ description: {
385
+ story: 'Use the `iconProps` prop to customize the icon inside the default trigger button. Here a different icon and custom `sx` color are passed via `iconProps`.'
386
+ }
387
+ }
388
+ };
389
+ var WithCustomTrigger = exports.WithCustomTrigger = function WithCustomTrigger() {
390
+ return (0, _react2.jsx)(_reactAria.OverlayProvider, null, (0, _react2.jsx)(_index.LinkSelectField, {
391
+ label: "What's your favorite color?",
392
+ trigger: (0, _react2.jsx)(_index.Button, {
393
+ variant: "primary"
394
+ }, "Open menu")
395
+ }, (0, _react2.jsx)(_index.Item, {
396
+ key: "red"
397
+ }, "Red"), (0, _react2.jsx)(_index.Item, {
398
+ key: "blue"
399
+ }, "Blue"), (0, _react2.jsx)(_index.Item, {
400
+ key: "yellow"
401
+ }, "Yellow")));
402
+ };
403
+ WithCustomTrigger.parameters = {
404
+ docs: {
405
+ description: {
406
+ story: 'Use the `trigger` prop to supply a fully custom ReactNode trigger, replacing the default `Button` element entirely.'
407
+ }
408
+ }
355
409
  };
@@ -15,6 +15,7 @@ var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequ
15
15
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/asyncToGenerator"));
16
16
  var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
17
17
  var _react = _interopRequireDefault(require("react"));
18
+ var _EarthIcon = _interopRequireDefault(require("@pingux/mdi-react/EarthIcon"));
18
19
  var _userEvent = _interopRequireDefault(require("@testing-library/user-event"));
19
20
  var _index = require("../../index");
20
21
  var _statuses = _interopRequireDefault(require("../../utils/devUtils/constants/statuses"));
@@ -231,23 +232,47 @@ test('passing helper text should display it and correct aria attributes on input
231
232
  var helperTextID = helper.getAttribute('id');
232
233
  expect(_testWrapper.screen.getByRole('button')).toHaveAttribute('aria-describedby', helperTextID);
233
234
  });
234
- test('iconProps are spread to the icon element', function () {
235
- var iconTestId = 'custom-icon';
235
+ test('iconProps data-testid is applied to the inner Icon element', function () {
236
236
  getComponent({
237
237
  iconProps: {
238
- 'data-testid': iconTestId
238
+ 'data-testid': 'custom-icon',
239
+ sx: {
240
+ color: 'red'
241
+ }
239
242
  }
240
243
  });
241
- expect(_testWrapper.screen.getByTestId(iconTestId)).toBeInTheDocument();
244
+ var icon = _testWrapper.screen.getByTestId('custom-icon');
245
+ expect(icon).toBeInTheDocument();
246
+ expect(icon).toBeInstanceOf(SVGSVGElement);
242
247
  });
243
- test('triggerProps are spread to the trigger button', function () {
248
+ test('iconProps with a custom icon renders the substitute icon without throwing', function () {
244
249
  getComponent({
245
- triggerProps: {
246
- 'data-custom': 'custom-trigger'
250
+ iconProps: {
251
+ icon: _EarthIcon["default"]
247
252
  }
248
253
  });
254
+ // The default trigger button is still present when only iconProps is provided
255
+ var button = _testWrapper.screen.getByRole('button');
256
+ expect(button).toBeInTheDocument();
257
+ });
258
+ test('trigger prop replaces the default Button trigger', function () {
259
+ getComponent({
260
+ trigger: (0, _react2.jsx)("button", {
261
+ type: "button",
262
+ "data-testid": "custom-trigger"
263
+ }, "Custom")
264
+ });
265
+ expect(_testWrapper.screen.getByTestId('custom-trigger')).toBeInTheDocument();
266
+ // The default Button trigger (identified by its pendo data attribute) should not be rendered
267
+ expect(document.querySelector('[data-pendo-id="LinkSelectField"]')).not.toBeInTheDocument();
268
+ });
269
+ test('default render is unchanged when neither iconProps nor trigger is provided', function () {
270
+ getComponent();
271
+ // The default trigger button is present via getByRole
249
272
  var button = _testWrapper.screen.getByRole('button');
250
- expect(button).toHaveAttribute('data-custom', 'custom-trigger');
273
+ expect(button).toBeInTheDocument();
274
+ // The default button has the pendo ID set by the component
275
+ expect(document.querySelector('[data-pendo-id="LinkSelectField"]')).toBeInTheDocument();
251
276
  });
252
277
 
253
278
  // Needs to be added to each components test file
@@ -118,7 +118,9 @@ var forms = {
118
118
  '& input[type=search]': _objectSpread(_objectSpread({}, _nextGenDarkMode["default"].text.inputValue), {}, {
119
119
  borderColor: _onyxTokens.astroTokensDark.color.gray[500],
120
120
  fontSize: '15px',
121
- bg: 'white',
121
+ bg: _onyxTokens.astroTokensDark.color.gray[900],
122
+ height: '50px',
123
+ borderRadius: '4px',
122
124
  '::placeholder': _objectSpread(_objectSpread({}, _nextGenDarkMode["default"].text.placeholder), {}, {
123
125
  fontStyle: 'unset',
124
126
  fontSize: '15px'
@@ -6,9 +6,11 @@ import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/inst
6
6
  import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors";
7
7
  import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties";
8
8
  import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property";
9
+ import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/esm/objectWithoutProperties";
9
10
  import _defineProperty from "@babel/runtime-corejs3/helpers/esm/defineProperty";
10
11
  import _objectDestructuringEmpty from "@babel/runtime-corejs3/helpers/esm/objectDestructuringEmpty";
11
12
  import _extends from "@babel/runtime-corejs3/helpers/esm/extends";
13
+ var _excluded = ["sx"];
12
14
  function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = _filterInstanceProperty(o).call(o, function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
13
15
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context, _context2; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(t), !0)).call(_context, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context2 = ownKeys(Object(t))).call(_context2, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
14
16
  import React, { forwardRef } from 'react';
@@ -30,10 +32,11 @@ var LinkSelectField = /*#__PURE__*/forwardRef(function (props, ref) {
30
32
  isDisabled = props.isDisabled,
31
33
  status = props.status,
32
34
  helperText = props.helperText,
33
- iconProps = props.iconProps,
34
35
  hasInlineLoader = props.hasInlineLoader,
35
36
  popoverWidth = props.popoverWidth,
36
- triggerProps = props.triggerProps;
37
+ iconProps = props.iconProps,
38
+ triggerProps = props.triggerProps,
39
+ triggerProp = props.trigger;
37
40
  var _getAriaAttributeProp = getAriaAttributeProps(props),
38
41
  ariaProps = _getAriaAttributeProp.ariaProps;
39
42
  var _useGetTheme = useGetTheme(),
@@ -57,7 +60,10 @@ var LinkSelectField = /*#__PURE__*/forwardRef(function (props, ref) {
57
60
  state = selectFieldProps.state,
58
61
  raTriggerProps = selectFieldProps.triggerProps,
59
62
  triggerRef = selectFieldProps.triggerRef;
60
- var trigger = ___EmotionJSX(Button, _extends({
63
+ var _ref = iconProps || {},
64
+ iconPropsSx = _ref.sx,
65
+ restIconProps = _objectWithoutProperties(_ref, _excluded);
66
+ var triggerNode = ___EmotionJSX(Button, _extends({
61
67
  className: fieldControlInputProps.className,
62
68
  ref: triggerRef,
63
69
  variant: "selectLink",
@@ -77,23 +83,25 @@ var LinkSelectField = /*#__PURE__*/forwardRef(function (props, ref) {
77
83
  variant: "forms.select.arrow"
78
84
  }, ___EmotionJSX(Icon, _extends({
79
85
  icon: MenuDown,
86
+ title: {
87
+ name: 'Menu Down Icon'
88
+ },
89
+ sx: _objectSpread(_objectSpread({}, state.isOpen ? {
90
+ transform: 'rotate(180deg)'
91
+ } : null), iconPropsSx)
92
+ }, restIconProps, {
80
93
  title: {
81
94
  name: ''
82
95
  },
83
96
  color: isOnyx ? 'font.link' : 'active',
84
97
  size: linkSelectFieldIcon,
85
98
  "aria-hidden": "true"
86
- }, iconProps, {
87
- sx: _objectSpread({
88
- transform: state.isOpen ? 'rotate(180deg)' : 'rotate(0deg)',
89
- transition: 'transform 150ms ease'
90
- }, iconProps === null || iconProps === void 0 ? void 0 : iconProps.sx)
91
99
  })))), ___EmotionJSX(VisuallyHidden, {
92
100
  "aria-live": "polite",
93
101
  id: helperTextId
94
102
  }, helperText));
95
103
  return ___EmotionJSX(SelectFieldBase, _extends({}, props, selectFieldProps, {
96
- trigger: trigger
104
+ trigger: triggerProp || triggerNode
97
105
  }));
98
106
  });
99
107
  LinkSelectField.propTypes = _objectSpread(_objectSpread(_objectSpread({
@@ -162,8 +170,19 @@ LinkSelectField.propTypes = _objectSpread(_objectSpread(_objectSpread({
162
170
  onSelectionChange: PropTypes.func,
163
171
  /** Display an inline loader inside the select trigger while loading. */
164
172
  hasInlineLoader: PropTypes.bool,
173
+ /**
174
+ * Props object that is spread directly into the Icon inside the default trigger button.
175
+ * Supports all IconProps (icon, title, size, color, sx, etc.).
176
+ * The sx prop is merged with the rotation style.
177
+ */
178
+ iconProps: PropTypes.shape({}),
165
179
  /** Width of the popover menu. Accepts any valid CSS unit. */
166
- popoverWidth: PropTypes.oneOfType([PropTypes.string, PropTypes.number])
180
+ popoverWidth: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
181
+ /**
182
+ * A ReactNode that replaces the default Button trigger entirely.
183
+ * When provided, the local Button element is not rendered.
184
+ */
185
+ trigger: PropTypes.node
167
186
  }, statusPropTypes), inputFieldAttributesBasePropTypes), ariaAttributesBasePropTypes);
168
187
  LinkSelectField.defaultProps = _objectSpread({
169
188
  placeholder: 'Select',
@@ -36,9 +36,10 @@ function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymb
36
36
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var _context4, _context5; var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? _forEachInstanceProperty(_context4 = ownKeys(Object(t), !0)).call(_context4, function (r) { _defineProperty(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : _forEachInstanceProperty(_context5 = ownKeys(Object(t))).call(_context5, function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
37
37
  import React, { useCallback, useEffect, useState } from 'react';
38
38
  import { OverlayProvider } from 'react-aria';
39
+ import EarthIcon from '@pingux/mdi-react/EarthIcon';
39
40
  import DocsLayout from '../../../.storybook/storybookDocsLayout';
40
41
  import { getAllUsers } from '../../api/users';
41
- import { Box, Item, LinkSelectField, Section } from '../../index';
42
+ import { Box, Button, Item, LinkSelectField, Section } from '../../index';
42
43
  import { LIMIT } from '../../mocks/constants';
43
44
  import { ariaAttributeBaseArgTypes } from '../../utils/docUtils/ariaAttributes';
44
45
  import { inputFieldAttributeBaseArgTypes } from '../../utils/docUtils/fieldAttributes';
@@ -85,6 +86,14 @@ export default {
85
86
  isRequired: {},
86
87
  selectedKey: {
87
88
  control: false
89
+ },
90
+ iconProps: {
91
+ control: false,
92
+ description: 'Props object spread into the Icon inside the default trigger button. Supports icon, title, size, color, sx, and other IconProps. The sx prop is merged with the rotation style.'
93
+ },
94
+ trigger: {
95
+ control: false,
96
+ description: 'A ReactNode that replaces the default Button trigger entirely. When provided, the local Button element is not rendered.'
88
97
  }
89
98
  }, statusArgTypes), ariaAttributeBaseArgTypes), inputFieldAttributeBaseArgTypes),
90
99
  args: {
@@ -343,4 +352,49 @@ WithPopoverWidth.parameters = {
343
352
  story: 'The `popoverWidth` prop can be used to set a custom width for the dropdown/popover.'
344
353
  }
345
354
  }
355
+ };
356
+ export var WithIconProps = function WithIconProps() {
357
+ return ___EmotionJSX(OverlayProvider, null, ___EmotionJSX(LinkSelectField, {
358
+ label: "What's your favorite color?",
359
+ iconProps: {
360
+ icon: EarthIcon,
361
+ sx: {
362
+ color: 'accent.40'
363
+ }
364
+ }
365
+ }, ___EmotionJSX(Item, {
366
+ key: "red"
367
+ }, "Red"), ___EmotionJSX(Item, {
368
+ key: "blue"
369
+ }, "Blue"), ___EmotionJSX(Item, {
370
+ key: "yellow"
371
+ }, "Yellow")));
372
+ };
373
+ WithIconProps.parameters = {
374
+ docs: {
375
+ description: {
376
+ story: 'Use the `iconProps` prop to customize the icon inside the default trigger button. Here a different icon and custom `sx` color are passed via `iconProps`.'
377
+ }
378
+ }
379
+ };
380
+ export var WithCustomTrigger = function WithCustomTrigger() {
381
+ return ___EmotionJSX(OverlayProvider, null, ___EmotionJSX(LinkSelectField, {
382
+ label: "What's your favorite color?",
383
+ trigger: ___EmotionJSX(Button, {
384
+ variant: "primary"
385
+ }, "Open menu")
386
+ }, ___EmotionJSX(Item, {
387
+ key: "red"
388
+ }, "Red"), ___EmotionJSX(Item, {
389
+ key: "blue"
390
+ }, "Blue"), ___EmotionJSX(Item, {
391
+ key: "yellow"
392
+ }, "Yellow")));
393
+ };
394
+ WithCustomTrigger.parameters = {
395
+ docs: {
396
+ description: {
397
+ story: 'Use the `trigger` prop to supply a fully custom ReactNode trigger, replacing the default `Button` element entirely.'
398
+ }
399
+ }
346
400
  };
@@ -21,6 +21,7 @@ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present,
21
21
  function _regeneratorDefine2(e, r, n, t) { var i = _Object$defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
22
22
  function _OverloadYield(e, d) { this.v = e, this.k = d; }
23
23
  import React from 'react';
24
+ import EarthIcon from '@pingux/mdi-react/EarthIcon';
24
25
  import userEvent from '@testing-library/user-event';
25
26
  import { Item, LinkSelectField } from '../../index';
26
27
  import statuses from '../../utils/devUtils/constants/statuses';
@@ -228,23 +229,47 @@ test('passing helper text should display it and correct aria attributes on input
228
229
  var helperTextID = helper.getAttribute('id');
229
230
  expect(screen.getByRole('button')).toHaveAttribute('aria-describedby', helperTextID);
230
231
  });
231
- test('iconProps are spread to the icon element', function () {
232
- var iconTestId = 'custom-icon';
232
+ test('iconProps data-testid is applied to the inner Icon element', function () {
233
233
  getComponent({
234
234
  iconProps: {
235
- 'data-testid': iconTestId
235
+ 'data-testid': 'custom-icon',
236
+ sx: {
237
+ color: 'red'
238
+ }
236
239
  }
237
240
  });
238
- expect(screen.getByTestId(iconTestId)).toBeInTheDocument();
241
+ var icon = screen.getByTestId('custom-icon');
242
+ expect(icon).toBeInTheDocument();
243
+ expect(icon).toBeInstanceOf(SVGSVGElement);
239
244
  });
240
- test('triggerProps are spread to the trigger button', function () {
245
+ test('iconProps with a custom icon renders the substitute icon without throwing', function () {
241
246
  getComponent({
242
- triggerProps: {
243
- 'data-custom': 'custom-trigger'
247
+ iconProps: {
248
+ icon: EarthIcon
244
249
  }
245
250
  });
251
+ // The default trigger button is still present when only iconProps is provided
252
+ var button = screen.getByRole('button');
253
+ expect(button).toBeInTheDocument();
254
+ });
255
+ test('trigger prop replaces the default Button trigger', function () {
256
+ getComponent({
257
+ trigger: ___EmotionJSX("button", {
258
+ type: "button",
259
+ "data-testid": "custom-trigger"
260
+ }, "Custom")
261
+ });
262
+ expect(screen.getByTestId('custom-trigger')).toBeInTheDocument();
263
+ // The default Button trigger (identified by its pendo data attribute) should not be rendered
264
+ expect(document.querySelector('[data-pendo-id="LinkSelectField"]')).not.toBeInTheDocument();
265
+ });
266
+ test('default render is unchanged when neither iconProps nor trigger is provided', function () {
267
+ getComponent();
268
+ // The default trigger button is present via getByRole
246
269
  var button = screen.getByRole('button');
247
- expect(button).toHaveAttribute('data-custom', 'custom-trigger');
270
+ expect(button).toBeInTheDocument();
271
+ // The default button has the pendo ID set by the component
272
+ expect(document.querySelector('[data-pendo-id="LinkSelectField"]')).toBeInTheDocument();
248
273
  });
249
274
 
250
275
  // Needs to be added to each components test file
@@ -111,7 +111,9 @@ var forms = {
111
111
  '& input[type=search]': _objectSpread(_objectSpread({}, theme.text.inputValue), {}, {
112
112
  borderColor: astroTokensDark.color.gray[500],
113
113
  fontSize: '15px',
114
- bg: 'white',
114
+ bg: astroTokensDark.color.gray[900],
115
+ height: '50px',
116
+ borderRadius: '4px',
115
117
  '::placeholder': _objectSpread(_objectSpread({}, theme.text.placeholder), {}, {
116
118
  fontStyle: 'unset',
117
119
  fontSize: '15px'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pingux/astro",
3
- "version": "2.203.0-alpha.0",
3
+ "version": "2.204.0-alpha.0",
4
4
  "description": "React component library for Ping Identity's design system",
5
5
  "repository": {
6
6
  "type": "git",