@pingux/astro 1.16.1-alpha.0 → 1.17.0-alpha.2

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.
@@ -38,6 +38,8 @@ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-c
38
38
 
39
39
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
40
40
 
41
+ var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
42
+
41
43
  var _react = _interopRequireWildcard(require("react"));
42
44
 
43
45
  var _propTypes = _interopRequireDefault(require("prop-types"));
@@ -78,7 +80,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
78
80
 
79
81
  function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
80
82
 
81
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context, _context2; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context = ownKeys(Object(source), !0)).call(_context, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
83
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context2, _context3; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context2 = ownKeys(Object(source), !0)).call(_context2, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context3 = ownKeys(Object(source))).call(_context3, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
82
84
 
83
85
  /**
84
86
  * Combines an input with a listbox for a filterable dropdown list.
@@ -103,13 +105,14 @@ var ComboBoxField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
103
105
  onFocusChange = props.onFocusChange,
104
106
  onKeyDown = props.onKeyDown,
105
107
  onKeyUp = props.onKeyUp,
108
+ hasAddOption = props.hasAddOption,
106
109
  hasCustomValue = props.hasCustomValue,
107
110
  hasNoEmptySelection = props.hasNoEmptySelection,
108
111
  defaultSelectedKey = props.defaultSelectedKey,
109
112
  selectedKey = props.selectedKey,
110
113
  onSelectionChange = props.onSelectionChange,
111
- defaultItems = props.defaultItems,
112
- items = props.items,
114
+ initialDefaultItems = props.defaultItems,
115
+ initialItems = props.items,
113
116
  onOpenChange = props.onOpenChange,
114
117
  loadingState = props.loadingState,
115
118
  onLoadMore = props.onLoadMore,
@@ -137,13 +140,11 @@ var ComboBoxField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
137
140
  onFocusChange: onFocusChange,
138
141
  onKeyDown: onKeyDown,
139
142
  onKeyUp: onKeyUp,
140
- allowsCustomValue: hasCustomValue,
143
+ allowsCustomValue: hasAddOption || hasCustomValue,
141
144
  disallowEmptySelection: hasNoEmptySelection,
142
145
  defaultSelectedKey: defaultSelectedKey,
143
146
  selectedKey: selectedKey,
144
147
  onSelectionChange: onSelectionChange,
145
- defaultItems: defaultItems,
146
- items: items,
147
148
  onOpenChange: onOpenChange,
148
149
  loadingState: loadingState,
149
150
  onLoadMore: onLoadMore,
@@ -169,18 +170,47 @@ var ComboBoxField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
169
170
 
170
171
  var onSelectionChangeHandler = function onSelectionChangeHandler(key) {
171
172
  var newVal = key || selectedKey || '';
173
+
174
+ if (hasAddOption && selectedKey !== inputValue) {
175
+ newVal = inputValue;
176
+ }
177
+
172
178
  if (onSelectionChange) onSelectionChange(newVal);
173
179
  };
174
180
 
181
+ var shouldShowAddOption = hasAddOption && inputValue && selectedKey !== inputValue;
182
+ var addOption = "ADD: ".concat(inputValue);
183
+
184
+ var getItemsArr = function getItemsArr(initialArr) {
185
+ if (initialArr && shouldShowAddOption) {
186
+ var _context;
187
+
188
+ return (0, _concat["default"])(_context = []).call(_context, initialArr, [{
189
+ name: addOption,
190
+ key: addOption
191
+ }]);
192
+ }
193
+
194
+ return initialArr;
195
+ };
196
+
197
+ var defaultItems = getItemsArr(initialDefaultItems);
198
+ var items = getItemsArr(initialItems);
199
+
175
200
  var _useFilter = (0, _i18n.useFilter)({
176
201
  sensitivity: 'base'
177
202
  }),
178
203
  contains = _useFilter.contains;
179
204
 
180
205
  var state = (0, _combobox2.useComboBoxState)(_objectSpread(_objectSpread({}, comboBoxOptions), {}, {
181
- onSelectionChange: hasCustomValue ? onSelectionChangeHandler : onSelectionChange,
206
+ defaultItems: defaultItems,
207
+ items: items,
208
+ onSelectionChange: hasAddOption || hasCustomValue ? onSelectionChangeHandler : onSelectionChange,
182
209
  defaultFilter: typeof defaultFilter !== 'undefined' ? defaultFilter : contains
183
210
  }));
211
+ (0, _react.useEffect)(function () {
212
+ if (shouldShowAddOption) state.selectionManager.setFocusedKey(addOption);
213
+ }, [shouldShowAddOption, state, addOption]);
184
214
 
185
215
  var _useComboBox = (0, _combobox.useComboBox)(_objectSpread(_objectSpread({}, comboBoxOptions), {}, {
186
216
  buttonRef: buttonRef,
@@ -286,6 +316,9 @@ var ComboBoxField = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
286
316
  }, listbox));
287
317
  });
288
318
  ComboBoxField.propTypes = {
319
+ /* Whether or not adding new options to the list is enabled. */
320
+ hasAddOption: _propTypes["default"].bool,
321
+
289
322
  /** Whether the ComboBox allows a non-item matching input value to be set. */
290
323
  hasCustomValue: _propTypes["default"].bool,
291
324
 
@@ -14,7 +14,11 @@ _Object$defineProperty(exports, "__esModule", {
14
14
  value: true
15
15
  });
16
16
 
17
- exports["default"] = exports.WithoutStatusIndicator = exports.WithSections = exports.WithCustomInputValue = exports.WithCustomHeight = exports.Required = exports.HelperText = exports.FocusMenuTrigger = exports.DisabledKeys = exports.Disabled = exports.Default = exports.CustomDefaultFilter = exports.ControlledWithCustomValue = exports.ControlledSelection = exports.ControlledMenu = exports.ControlledInput = exports.ControlledFiltering = exports.AsyncLoading = exports.AllowCustomValue = void 0;
17
+ exports["default"] = exports.WithoutStatusIndicator = exports.WithSections = exports.WithCustomInputValue = exports.WithCustomHeight = exports.Required = exports.HelperText = exports.FocusMenuTrigger = exports.DisabledKeys = exports.Disabled = exports.Default = exports.CustomDefaultFilter = exports.ControlledWithCustomValue = exports.ControlledWithAddOption = exports.ControlledSelection = exports.ControlledMenu = exports.ControlledInput = exports.ControlledFiltering = exports.AsyncLoading = exports.AllowCustomValue = void 0;
18
+
19
+ var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
20
+
21
+ var _find = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find"));
18
22
 
19
23
  var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
20
24
 
@@ -562,4 +566,56 @@ var CustomDefaultFilter = function CustomDefaultFilter() {
562
566
  }));
563
567
  };
564
568
 
565
- exports.CustomDefaultFilter = CustomDefaultFilter;
569
+ exports.CustomDefaultFilter = CustomDefaultFilter;
570
+
571
+ var ControlledWithAddOption = function ControlledWithAddOption() {
572
+ var _useState11 = (0, _react.useState)(items),
573
+ _useState12 = (0, _slicedToArray2["default"])(_useState11, 2),
574
+ options = _useState12[0],
575
+ setOptions = _useState12[1];
576
+
577
+ var _useState13 = (0, _react.useState)(''),
578
+ _useState14 = (0, _slicedToArray2["default"])(_useState13, 2),
579
+ inputValue = _useState14[0],
580
+ setInputValue = _useState14[1];
581
+
582
+ var _useState15 = (0, _react.useState)(''),
583
+ _useState16 = (0, _slicedToArray2["default"])(_useState15, 2),
584
+ selectedKey = _useState16[0],
585
+ setSelectedKey = _useState16[1];
586
+
587
+ var onSelectionChange = function onSelectionChange(key) {
588
+ // Add new option to options array
589
+ if (key && !(0, _find["default"])(options).call(options, function (_ref2) {
590
+ var name = _ref2.name;
591
+ return name === key;
592
+ })) {
593
+ var _context2;
594
+
595
+ setOptions((0, _concat["default"])(_context2 = []).call(_context2, options, [{
596
+ key: key,
597
+ name: key
598
+ }]));
599
+ }
600
+
601
+ setInputValue(key);
602
+ setSelectedKey(key);
603
+ };
604
+
605
+ return (0, _react2.jsx)(_index.OverlayProvider, null, (0, _react2.jsx)(_ComboBoxField["default"], (0, _extends2["default"])({
606
+ label: "Example label",
607
+ defaultItems: options
608
+ }, actions, {
609
+ inputValue: inputValue,
610
+ selectedKey: selectedKey,
611
+ onInputChange: setInputValue,
612
+ onSelectionChange: onSelectionChange,
613
+ hasAddOption: true
614
+ }), function (item) {
615
+ return (0, _react2.jsx)(_index.Item, {
616
+ key: item.name
617
+ }, item.name);
618
+ }));
619
+ };
620
+
621
+ exports.ControlledWithAddOption = ControlledWithAddOption;
@@ -32,6 +32,10 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs3/
32
32
 
33
33
  var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
34
34
 
35
+ var _concat = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/concat"));
36
+
37
+ var _find = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/find"));
38
+
35
39
  var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
36
40
 
37
41
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/slicedToArray"));
@@ -62,7 +66,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
62
66
 
63
67
  function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty2(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
64
68
 
65
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context5, _context6; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty2(_context5 = ownKeys(Object(source), !0)).call(_context5, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty2(_context6 = ownKeys(Object(source))).call(_context6, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
69
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var _context6, _context7; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty2(_context6 = ownKeys(Object(source), !0)).call(_context6, function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty2(_context7 = ownKeys(Object(source))).call(_context7, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
66
70
 
67
71
  var items = [{
68
72
  name: 'Aardvark',
@@ -121,6 +125,54 @@ var ComboBoxWithCustomFilter = function ComboBoxWithCustomFilter() {
121
125
  });
122
126
  };
123
127
 
128
+ var ComboBoxWithAddOption = function ComboBoxWithAddOption() {
129
+ var _useState3 = (0, _react.useState)(items),
130
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
131
+ options = _useState4[0],
132
+ setOptions = _useState4[1];
133
+
134
+ var _useState5 = (0, _react.useState)(''),
135
+ _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
136
+ inputValue = _useState6[0],
137
+ setInputValue = _useState6[1];
138
+
139
+ var _useState7 = (0, _react.useState)(''),
140
+ _useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
141
+ selectedKey = _useState8[0],
142
+ setSelectedKey = _useState8[1];
143
+
144
+ var onSelectionChange = function onSelectionChange(key) {
145
+ if (key && !(0, _find["default"])(options).call(options, function (_ref2) {
146
+ var name = _ref2.name;
147
+ return name === key;
148
+ })) {
149
+ var _context;
150
+
151
+ setOptions((0, _concat["default"])(_context = []).call(_context, options, [{
152
+ key: key,
153
+ name: key
154
+ }]));
155
+ }
156
+
157
+ setInputValue(key);
158
+ setSelectedKey(key);
159
+ };
160
+
161
+ return (0, _react2.jsx)(_index.ComboBoxField, {
162
+ label: "Example label",
163
+ defaultItems: options,
164
+ inputValue: inputValue,
165
+ selectedKey: selectedKey,
166
+ onInputChange: setInputValue,
167
+ onSelectionChange: onSelectionChange,
168
+ hasAddOption: true
169
+ }, function (item) {
170
+ return (0, _react2.jsx)(_index.Item, {
171
+ key: item.name
172
+ }, item.name);
173
+ });
174
+ };
175
+
124
176
  beforeAll(function () {
125
177
  jest.spyOn(window.HTMLElement.prototype, 'clientWidth', 'get').mockImplementation(function () {
126
178
  return 1000;
@@ -474,43 +526,43 @@ test('should use default contains filtering', function () {
474
526
  });
475
527
  test('should be able to use controlled filtering', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
476
528
  var options, input;
477
- return _regenerator["default"].wrap(function _callee$(_context) {
529
+ return _regenerator["default"].wrap(function _callee$(_context2) {
478
530
  while (1) {
479
- switch (_context.prev = _context.next) {
531
+ switch (_context2.prev = _context2.next) {
480
532
  case 0:
481
533
  (0, _testWrapper.render)((0, _react2.jsx)(ComboBoxWithCustomFilter, null));
482
534
  input = _testWrapper.screen.queryByRole('combobox'); // Should list all without filterable input
483
535
 
484
536
  _userEvent["default"].type(input, '{arrowdown}');
485
537
 
486
- _context.next = 5;
538
+ _context2.next = 5;
487
539
  return _testWrapper.screen.findAllByRole('option');
488
540
 
489
541
  case 5:
490
- options = _context.sent;
542
+ options = _context2.sent;
491
543
  expect(options).toHaveLength(items.length); // Should only list the second option
492
544
 
493
545
  _userEvent["default"].type(input, 'k');
494
546
 
495
- _context.next = 10;
547
+ _context2.next = 10;
496
548
  return _testWrapper.screen.findAllByRole('option');
497
549
 
498
550
  case 10:
499
- options = _context.sent;
551
+ options = _context2.sent;
500
552
  expect(options[0]).toHaveTextContent(items[1].name);
501
553
 
502
554
  case 12:
503
555
  case "end":
504
- return _context.stop();
556
+ return _context2.stop();
505
557
  }
506
558
  }
507
559
  }, _callee);
508
560
  })));
509
561
  test('should be able to use custom default filtering', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
510
562
  var options, defaultFilter, input;
511
- return _regenerator["default"].wrap(function _callee2$(_context2) {
563
+ return _regenerator["default"].wrap(function _callee2$(_context3) {
512
564
  while (1) {
513
- switch (_context2.prev = _context2.next) {
565
+ switch (_context3.prev = _context3.next) {
514
566
  case 0:
515
567
  defaultFilter = function defaultFilter(option, inputValue) {
516
568
  return (0, _startsWith["default"])(option).call(option, inputValue);
@@ -523,34 +575,34 @@ test('should be able to use custom default filtering', /*#__PURE__*/(0, _asyncTo
523
575
 
524
576
  _userEvent["default"].type(input, '{arrowdown}');
525
577
 
526
- _context2.next = 6;
578
+ _context3.next = 6;
527
579
  return _testWrapper.screen.findAllByRole('option');
528
580
 
529
581
  case 6:
530
- options = _context2.sent;
582
+ options = _context3.sent;
531
583
  expect(options).toHaveLength(items.length); // Should only list the second option
532
584
 
533
585
  _userEvent["default"].type(input, 'K');
534
586
 
535
- _context2.next = 11;
587
+ _context3.next = 11;
536
588
  return _testWrapper.screen.findAllByRole('option');
537
589
 
538
590
  case 11:
539
- options = _context2.sent;
591
+ options = _context3.sent;
540
592
  expect(options[0]).toHaveTextContent(items[1].name);
541
593
 
542
594
  case 13:
543
595
  case "end":
544
- return _context2.stop();
596
+ return _context3.stop();
545
597
  }
546
598
  }
547
599
  }, _callee2);
548
600
  })));
549
601
  test('should show in input "textValue" if provided', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
550
602
  var newItems, input, options;
551
- return _regenerator["default"].wrap(function _callee3$(_context3) {
603
+ return _regenerator["default"].wrap(function _callee3$(_context4) {
552
604
  while (1) {
553
- switch (_context3.prev = _context3.next) {
605
+ switch (_context4.prev = _context4.next) {
554
606
  case 0:
555
607
  newItems = (0, _map["default"])(items).call(items, function (item) {
556
608
  return _objectSpread(_objectSpread({}, item), {}, {
@@ -564,11 +616,11 @@ test('should show in input "textValue" if provided', /*#__PURE__*/(0, _asyncToGe
564
616
 
565
617
  _userEvent["default"].click(input);
566
618
 
567
- _context3.next = 6;
619
+ _context4.next = 6;
568
620
  return _testWrapper.screen.findAllByRole('option');
569
621
 
570
622
  case 6:
571
- options = _context3.sent;
623
+ options = _context4.sent;
572
624
 
573
625
  _userEvent["default"].click(options[0]);
574
626
 
@@ -580,7 +632,7 @@ test('should show in input "textValue" if provided', /*#__PURE__*/(0, _asyncToGe
580
632
 
581
633
  case 11:
582
634
  case "end":
583
- return _context3.stop();
635
+ return _context4.stop();
584
636
  }
585
637
  }
586
638
  }, _callee3);
@@ -951,25 +1003,71 @@ test('onSelectionChange works properly with custom value', function () {
951
1003
 
952
1004
  expect(onSelectionChange).toHaveBeenCalledWith('');
953
1005
  });
1006
+ test('add option shows when "hasAddOption" is provided', function () {
1007
+ (0, _testWrapper.render)((0, _react2.jsx)(ComboBoxWithAddOption, null));
1008
+
1009
+ var input = _testWrapper.screen.queryByRole('combobox');
1010
+
1011
+ expect(input).toHaveValue('');
1012
+ expect(_testWrapper.screen.queryByRole('listbox')).not.toBeInTheDocument();
1013
+ expect(_testWrapper.screen.queryByRole('option')).not.toBeInTheDocument();
1014
+ var inputValue = 'New value';
1015
+
1016
+ _userEvent["default"].type(input, inputValue);
1017
+
1018
+ expect(input).toHaveValue(inputValue);
1019
+ expect(_testWrapper.screen.queryByRole('listbox')).toBeInTheDocument();
1020
+
1021
+ var option = _testWrapper.screen.queryByRole('option');
1022
+
1023
+ expect(option).toBeInTheDocument();
1024
+ expect(option).toHaveClass('is-focused');
1025
+ expect(option).toHaveTextContent("ADD: ".concat(inputValue));
1026
+ });
1027
+ test('if "hasAddOption" is provided, then custom value is added to listbox on blur', function () {
1028
+ (0, _testWrapper.render)((0, _react2.jsx)(ComboBoxWithAddOption, null));
1029
+
1030
+ var input = _testWrapper.screen.queryByRole('combobox');
1031
+
1032
+ var inputValue = 'New value';
1033
+
1034
+ _userEvent["default"].type(input, inputValue);
1035
+
1036
+ expect(input).toHaveValue(inputValue); // blur input
1037
+
1038
+ _userEvent["default"].tab();
1039
+
1040
+ expect(_testWrapper.screen.queryByRole('listbox')).not.toBeInTheDocument();
1041
+ expect(_testWrapper.screen.queryByRole('option')).not.toBeInTheDocument();
1042
+
1043
+ _userEvent["default"].click(input);
1044
+
1045
+ expect(input).toHaveValue(inputValue);
1046
+ expect(_testWrapper.screen.queryByRole('listbox')).toBeInTheDocument();
1047
+
1048
+ var options = _testWrapper.screen.queryAllByRole('option');
1049
+
1050
+ expect(options[options.length - 1]).toHaveTextContent(inputValue);
1051
+ });
954
1052
  test('should have no accessibility violations', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
955
1053
  var _getComponent6, container, results;
956
1054
 
957
- return _regenerator["default"].wrap(function _callee4$(_context4) {
1055
+ return _regenerator["default"].wrap(function _callee4$(_context5) {
958
1056
  while (1) {
959
- switch (_context4.prev = _context4.next) {
1057
+ switch (_context5.prev = _context5.next) {
960
1058
  case 0:
961
1059
  jest.useRealTimers();
962
1060
  _getComponent6 = getComponent(), container = _getComponent6.container;
963
- _context4.next = 4;
1061
+ _context5.next = 4;
964
1062
  return (0, _jestAxe.axe)(container);
965
1063
 
966
1064
  case 4:
967
- results = _context4.sent;
1065
+ results = _context5.sent;
968
1066
  expect(results).toHaveNoViolations();
969
1067
 
970
1068
  case 6:
971
1069
  case "end":
972
- return _context4.stop();
1070
+ return _context5.stop();
973
1071
  }
974
1072
  }
975
1073
  }, _callee4);
@@ -56,7 +56,7 @@ var _colors = require("../../styles/colors");
56
56
 
57
57
  var _templateObject;
58
58
 
59
- var _excluded = ["className", "fallbackImage", "fallbackTimeout", "isDisabled", "src", "sx"];
59
+ var _excluded = ["className", "fallbackImage", "fallbackTimeout", "isDisabled", "src", "alt", "sx"];
60
60
 
61
61
  function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "function") return null; var cacheBabelInterop = new _WeakMap(); var cacheNodeInterop = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
62
62
 
@@ -77,6 +77,7 @@ var Image = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
77
77
  fallbackTimeout = props.fallbackTimeout,
78
78
  isDisabled = props.isDisabled,
79
79
  src = props.src,
80
+ alt = props.alt,
80
81
  sx = props.sx,
81
82
  others = (0, _objectWithoutProperties2["default"])(props, _excluded);
82
83
 
@@ -122,6 +123,8 @@ var Image = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
122
123
  return imgRef.current;
123
124
  });
124
125
  (0, _hooks.usePropWarning)(props, 'disabled', 'isDisabled');
126
+ var ariaLabel = props['aria-label'] || alt;
127
+ (0, _hooks.useAriaLabelWarning)('Image', ariaLabel);
125
128
 
126
129
  var _useHover = (0, _interactions.useHover)(props),
127
130
  hoverProps = _useHover.hoverProps,
@@ -178,7 +181,7 @@ var Image = /*#__PURE__*/(0, _react.forwardRef)(function (props, ref) {
178
181
  var themeUiImage = (0, _react2.jsx)(_themeUi.Image, (0, _extends2["default"])({
179
182
  className: classNames,
180
183
  ref: imgRef,
181
- alt: "Image",
184
+ alt: alt,
182
185
  role: "img",
183
186
  src: imgSrc,
184
187
  sx: sx
@@ -212,7 +215,15 @@ Image.propTypes = {
212
215
  fallbackImage: _propTypes["default"].oneOfType([_propTypes["default"].string, _propTypes["default"].object]),
213
216
 
214
217
  /** Time in milliseconds that component should wait for a response from src address. */
215
- fallbackTimeout: _propTypes["default"].number
218
+ fallbackTimeout: _propTypes["default"].number,
219
+
220
+ /** Descriptive text for an image. This is *highly* recommended in most cases.
221
+ * See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img#attr-alt).
222
+ * */
223
+ alt: _propTypes["default"].string,
224
+
225
+ /** Defines a string value that labels the current element. */
226
+ 'aria-label': _propTypes["default"].string
216
227
  };
217
228
  Image.defaultProps = {
218
229
  isDisabled: false,
@@ -67,7 +67,9 @@ exports["default"] = _default;
67
67
 
68
68
  var Default = function Default(_ref) {
69
69
  var args = (0, _extends2["default"])({}, _ref);
70
- return (0, _react2.jsx)(_["default"], args);
70
+ return (0, _react2.jsx)(_["default"], (0, _extends2["default"])({}, args, {
71
+ alt: "Ping identity square logo"
72
+ }));
71
73
  };
72
74
 
73
75
  exports.Default = Default;
@@ -75,7 +77,8 @@ exports.Default = Default;
75
77
  var Avatar = function Avatar() {
76
78
  return (0, _react2.jsx)(_["default"], {
77
79
  src: _imageConstants.pingImg,
78
- variant: "images.avatar"
80
+ variant: "images.avatar",
81
+ alt: "Ping identity round avatar"
79
82
  });
80
83
  };
81
84
 
@@ -89,7 +92,8 @@ var CustomSizeAndRadius = function CustomSizeAndRadius() {
89
92
  height: '70px',
90
93
  borderRadius: 8,
91
94
  bg: 'neutral.90'
92
- }
95
+ },
96
+ alt: "Terry Crews in a red suite"
93
97
  });
94
98
  };
95
99
 
@@ -98,7 +102,8 @@ exports.CustomSizeAndRadius = CustomSizeAndRadius;
98
102
  var Disabled = function Disabled() {
99
103
  return (0, _react2.jsx)(_["default"], {
100
104
  src: _imageConstants.pingImg,
101
- isDisabled: true
105
+ isDisabled: true,
106
+ alt: "Ping identity square logo"
102
107
  });
103
108
  };
104
109
 
@@ -111,7 +116,8 @@ var FallbackImage = function FallbackImage() {
111
116
  sx: {
112
117
  width: '150px',
113
118
  height: '150px'
114
- }
119
+ },
120
+ alt: "Random image"
115
121
  });
116
122
  };
117
123
 
@@ -125,7 +131,8 @@ var WithSkeletonLoadSuccess = function WithSkeletonLoadSuccess(_ref2) {
125
131
  sx: {
126
132
  width: '150px',
127
133
  height: '150px'
128
- }
134
+ },
135
+ alt: "Random image"
129
136
  });
130
137
  };
131
138
 
@@ -140,7 +147,8 @@ var WithSkeletonLoadTimeout = function WithSkeletonLoadTimeout() {
140
147
  sx: {
141
148
  width: '150px',
142
149
  height: '150px'
143
- }
150
+ },
151
+ alt: "Random image"
144
152
  });
145
153
  };
146
154
 
@@ -169,7 +177,8 @@ var UpdatingImageSrc = function UpdatingImageSrc() {
169
177
  width: '200px',
170
178
  height: '200px',
171
179
  mt: '25px'
172
- }
180
+ },
181
+ alt: image === _imageConstants.pingImg ? 'Ping identity square logo' : 'Terry Crews in a red suite'
173
182
  }));
174
183
  };
175
184
 
@@ -101,6 +101,15 @@ test('image shows disabled status', function () {
101
101
 
102
102
  expect(img).toHaveClass('is-disabled');
103
103
  });
104
+ test('image with alt text', function () {
105
+ getComponent({
106
+ alt: 'Test'
107
+ });
108
+ (0, _react2.act)(function () {
109
+ fallbackImageObj.onImageLoad();
110
+ });
111
+ expect(_testWrapper.screen.getByAltText('Test')).toBeInTheDocument();
112
+ });
104
113
  test('image source is able to be changed', function () {
105
114
  var src2 = 'second-src';
106
115