downshift 7.6.0 → 8.0.0-beta.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.
@@ -6,11 +6,11 @@ var _objectWithoutPropertiesLoose = require('@babel/runtime/helpers/objectWithou
6
6
  var _extends = require('@babel/runtime/helpers/extends');
7
7
  var _assertThisInitialized = require('@babel/runtime/helpers/assertThisInitialized');
8
8
  var _inheritsLoose = require('@babel/runtime/helpers/inheritsLoose');
9
- var preact = require('preact');
9
+ var React = require('preact');
10
10
  var reactIs = require('react-is');
11
11
  var compute = require('compute-scroll-into-view');
12
- var tslib = require('tslib');
13
12
  var PropTypes = require('prop-types');
13
+ var tslib = require('tslib');
14
14
 
15
15
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
16
16
 
@@ -18,6 +18,7 @@ var _objectWithoutPropertiesLoose__default = /*#__PURE__*/_interopDefaultLegacy(
18
18
  var _extends__default = /*#__PURE__*/_interopDefaultLegacy(_extends);
19
19
  var _assertThisInitialized__default = /*#__PURE__*/_interopDefaultLegacy(_assertThisInitialized);
20
20
  var _inheritsLoose__default = /*#__PURE__*/_interopDefaultLegacy(_inheritsLoose);
21
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
21
22
  var compute__default = /*#__PURE__*/_interopDefaultLegacy(compute);
22
23
  var PropTypes__default = /*#__PURE__*/_interopDefaultLegacy(PropTypes);
23
24
 
@@ -149,6 +150,11 @@ function generateId() {
149
150
  * Resets idCounter to 0. Used for SSR.
150
151
  */
151
152
  function resetIdCounter() {
153
+ // istanbul ignore next
154
+ if ('useId' in React__default["default"]) {
155
+ console.warn("It is not necessary to call resetIdCounter when using React 18+");
156
+ return;
157
+ }
152
158
  idCounter = 0;
153
159
  }
154
160
 
@@ -301,70 +307,70 @@ function isPlainObject(obj) {
301
307
  }
302
308
 
303
309
  /**
304
- * Returns the new index in the list, in a circular way. If next value is out of bonds from the total,
305
- * it will wrap to either 0 or itemCount - 1.
310
+ * Returns the next non-disabled highlightedIndex value.
306
311
  *
307
- * @param {number} moveAmount Number of positions to move. Negative to move backwards, positive forwards.
308
- * @param {number} baseIndex The initial position to move from.
309
- * @param {number} itemCount The total number of items.
310
- * @param {Function} getItemNodeFromIndex Used to check if item is disabled.
311
- * @param {boolean} circular Specify if navigation is circular. Default is true.
312
- * @returns {number} The new index after the move.
312
+ * @param {number} start The current highlightedIndex.
313
+ * @param {number} offset The offset from the current highlightedIndex to start searching.
314
+ * @param {unknown[]} items The items array.
315
+ * @param {(item: unknown, index: number) => boolean} isItemDisabled Function that tells if an item is disabled or not.
316
+ * @param {boolean?} circular If the search reaches the end, if it can search again starting from the other end.
317
+ * @returns {number} The next highlightedIndex.
313
318
  */
314
- function getNextWrappingIndex(moveAmount, baseIndex, itemCount, getItemNodeFromIndex, circular) {
319
+ function getHighlightedIndex(start, offset, items, isItemDisabled, circular) {
315
320
  if (circular === void 0) {
316
- circular = true;
321
+ circular = false;
317
322
  }
318
- if (itemCount === 0) {
323
+ var count = items.length;
324
+ if (count === 0) {
319
325
  return -1;
320
326
  }
321
- var itemsLastIndex = itemCount - 1;
322
- if (typeof baseIndex !== 'number' || baseIndex < 0 || baseIndex >= itemCount) {
323
- baseIndex = moveAmount > 0 ? -1 : itemsLastIndex + 1;
327
+ var itemsLastIndex = count - 1;
328
+ if (typeof start !== 'number' || start < 0 || start > itemsLastIndex) {
329
+ start = offset > 0 ? -1 : itemsLastIndex + 1;
324
330
  }
325
- var newIndex = baseIndex + moveAmount;
326
- if (newIndex < 0) {
327
- newIndex = circular ? itemsLastIndex : 0;
328
- } else if (newIndex > itemsLastIndex) {
329
- newIndex = circular ? 0 : itemsLastIndex;
331
+ var current = start + offset;
332
+ if (current < 0) {
333
+ current = circular ? itemsLastIndex : 0;
334
+ } else if (current > itemsLastIndex) {
335
+ current = circular ? 0 : itemsLastIndex;
330
336
  }
331
- var nonDisabledNewIndex = getNextNonDisabledIndex(moveAmount, newIndex, itemCount, getItemNodeFromIndex, circular);
332
- if (nonDisabledNewIndex === -1) {
333
- return baseIndex >= itemCount ? -1 : baseIndex;
337
+ var highlightedIndex = getNonDisabledIndex(current, offset < 0, items, isItemDisabled, circular);
338
+ if (highlightedIndex === -1) {
339
+ return start >= count ? -1 : start;
334
340
  }
335
- return nonDisabledNewIndex;
341
+ return highlightedIndex;
336
342
  }
337
343
 
338
344
  /**
339
- * Returns the next index in the list of an item that is not disabled.
345
+ * Returns the next non-disabled highlightedIndex value.
340
346
  *
341
- * @param {number} moveAmount Number of positions to move. Negative to move backwards, positive forwards.
342
- * @param {number} baseIndex The initial position to move from.
343
- * @param {number} itemCount The total number of items.
344
- * @param {Function} getItemNodeFromIndex Used to check if item is disabled.
345
- * @param {boolean} circular Specify if navigation is circular. Default is true.
346
- * @returns {number} The new index. Returns baseIndex if item is not disabled. Returns next non-disabled item otherwise. If no non-disabled found it will return -1.
347
+ * @param {number} start The current highlightedIndex.
348
+ * @param {boolean} backwards If true, it will search backwards from the start.
349
+ * @param {unknown[]} items The items array.
350
+ * @param {(item: unknown, index: number) => boolean} isItemDisabled Function that tells if an item is disabled or not.
351
+ * @param {boolean} circular If the search reaches the end, if it can search again starting from the other end.
352
+ * @returns {number} The next non-disabled index.
347
353
  */
348
- function getNextNonDisabledIndex(moveAmount, baseIndex, itemCount, getItemNodeFromIndex, circular) {
349
- var currentElementNode = getItemNodeFromIndex(baseIndex);
350
- if (!currentElementNode || !currentElementNode.hasAttribute('disabled')) {
351
- return baseIndex;
354
+ function getNonDisabledIndex(start, backwards, items, isItemDisabled, circular) {
355
+ if (circular === void 0) {
356
+ circular = false;
352
357
  }
353
- if (moveAmount > 0) {
354
- for (var index = baseIndex + 1; index < itemCount; index++) {
355
- if (!getItemNodeFromIndex(index).hasAttribute('disabled')) {
358
+ var count = items.length;
359
+ if (backwards) {
360
+ for (var index = start; index >= 0; index--) {
361
+ if (!isItemDisabled(items[index], index)) {
356
362
  return index;
357
363
  }
358
364
  }
359
365
  } else {
360
- for (var _index = baseIndex - 1; _index >= 0; _index--) {
361
- if (!getItemNodeFromIndex(_index).hasAttribute('disabled')) {
366
+ for (var _index = start; _index < count; _index++) {
367
+ if (!isItemDisabled(items[_index], _index)) {
362
368
  return _index;
363
369
  }
364
370
  }
365
371
  }
366
372
  if (circular) {
367
- return moveAmount > 0 ? getNextNonDisabledIndex(1, 0, itemCount, getItemNodeFromIndex, false) : getNextNonDisabledIndex(-1, itemCount - 1, itemCount, getItemNodeFromIndex, false);
373
+ return getNonDisabledIndex(backwards ? count - 1 : 0, backwards, items, isItemDisabled);
368
374
  }
369
375
  return -1;
370
376
  }
@@ -544,6 +550,10 @@ var Downshift = /*#__PURE__*/function () {
544
550
  _this.unsetItemCount = function () {
545
551
  _this.itemCount = null;
546
552
  };
553
+ _this.isItemDisabled = function (_item, index) {
554
+ var currentElementNode = _this.getItemNodeFromIndex(index);
555
+ return currentElementNode && currentElementNode.hasAttribute('disabled');
556
+ };
547
557
  _this.setHighlightedIndex = function (highlightedIndex, otherStateToSet) {
548
558
  if (highlightedIndex === void 0) {
549
559
  highlightedIndex = _this.props.defaultHighlightedIndex;
@@ -694,7 +704,7 @@ var Downshift = /*#__PURE__*/function () {
694
704
  _this.getRootProps.suppressRefError = suppressRefError;
695
705
  var _this$getState = _this.getState(),
696
706
  isOpen = _this$getState.isOpen;
697
- return _extends__default["default"]((_extends2 = {}, _extends2[refKey] = handleRefs(ref, _this.rootRef), _extends2.role = 'combobox', _extends2['aria-expanded'] = isOpen, _extends2['aria-haspopup'] = 'listbox', _extends2['aria-owns'] = isOpen ? _this.menuId : null, _extends2['aria-labelledby'] = _this.labelId, _extends2), rest);
707
+ return _extends__default["default"]((_extends2 = {}, _extends2[refKey] = handleRefs(ref, _this.rootRef), _extends2.role = 'combobox', _extends2['aria-expanded'] = isOpen, _extends2['aria-haspopup'] = 'listbox', _extends2['aria-owns'] = isOpen ? _this.menuId : undefined, _extends2['aria-labelledby'] = _this.labelId, _extends2), rest);
698
708
  };
699
709
  //\\\\\\\\\\\\\\\\\\\\\\\\\\ ROOT
700
710
  _this.keyDownHandlers = {
@@ -715,9 +725,9 @@ var Downshift = /*#__PURE__*/function () {
715
725
  if (itemCount > 0) {
716
726
  var _this2$getState = _this2.getState(),
717
727
  highlightedIndex = _this2$getState.highlightedIndex;
718
- var nextHighlightedIndex = getNextWrappingIndex(1, highlightedIndex, itemCount, function (index) {
719
- return _this2.getItemNodeFromIndex(index);
720
- });
728
+ var nextHighlightedIndex = getHighlightedIndex(highlightedIndex, 1, {
729
+ length: itemCount
730
+ }, _this2.isItemDisabled, true);
721
731
  _this2.setHighlightedIndex(nextHighlightedIndex, {
722
732
  type: keyDownArrowDown
723
733
  });
@@ -742,9 +752,9 @@ var Downshift = /*#__PURE__*/function () {
742
752
  if (itemCount > 0) {
743
753
  var _this3$getState = _this3.getState(),
744
754
  highlightedIndex = _this3$getState.highlightedIndex;
745
- var nextHighlightedIndex = getNextWrappingIndex(-1, highlightedIndex, itemCount, function (index) {
746
- return _this3.getItemNodeFromIndex(index);
747
- });
755
+ var nextHighlightedIndex = getHighlightedIndex(highlightedIndex, -1, {
756
+ length: itemCount
757
+ }, _this3.isItemDisabled, true);
748
758
  _this3.setHighlightedIndex(nextHighlightedIndex, {
749
759
  type: keyDownArrowUp
750
760
  });
@@ -792,7 +802,6 @@ var Downshift = /*#__PURE__*/function () {
792
802
  });
793
803
  _this.inputKeyDownHandlers = _extends__default["default"]({}, _this.keyDownHandlers, {
794
804
  Home: function Home(event) {
795
- var _this4 = this;
796
805
  var _this$getState3 = this.getState(),
797
806
  isOpen = _this$getState3.isOpen;
798
807
  if (!isOpen) {
@@ -805,15 +814,14 @@ var Downshift = /*#__PURE__*/function () {
805
814
  }
806
815
 
807
816
  // get next non-disabled starting downwards from 0 if that's disabled.
808
- var newHighlightedIndex = getNextNonDisabledIndex(1, 0, itemCount, function (index) {
809
- return _this4.getItemNodeFromIndex(index);
810
- }, false);
817
+ var newHighlightedIndex = getNonDisabledIndex(0, false, {
818
+ length: itemCount
819
+ }, this.isItemDisabled);
811
820
  this.setHighlightedIndex(newHighlightedIndex, {
812
821
  type: keyDownHome
813
822
  });
814
823
  },
815
824
  End: function End(event) {
816
- var _this5 = this;
817
825
  var _this$getState4 = this.getState(),
818
826
  isOpen = _this$getState4.isOpen;
819
827
  if (!isOpen) {
@@ -826,9 +834,9 @@ var Downshift = /*#__PURE__*/function () {
826
834
  }
827
835
 
828
836
  // get next non-disabled starting upwards from last index if that's disabled.
829
- var newHighlightedIndex = getNextNonDisabledIndex(-1, itemCount - 1, itemCount, function (index) {
830
- return _this5.getItemNodeFromIndex(index);
831
- }, false);
837
+ var newHighlightedIndex = getNonDisabledIndex(itemCount - 1, true, {
838
+ length: itemCount
839
+ }, this.isItemDisabled);
832
840
  this.setHighlightedIndex(newHighlightedIndex, {
833
841
  type: keyDownEnd
834
842
  });
@@ -940,8 +948,8 @@ var Downshift = /*#__PURE__*/function () {
940
948
  }
941
949
  return _extends__default["default"]({
942
950
  'aria-autocomplete': 'list',
943
- 'aria-activedescendant': isOpen && typeof highlightedIndex === 'number' && highlightedIndex >= 0 ? _this.getItemId(highlightedIndex) : null,
944
- 'aria-controls': isOpen ? _this.menuId : null,
951
+ 'aria-activedescendant': isOpen && typeof highlightedIndex === 'number' && highlightedIndex >= 0 ? _this.getItemId(highlightedIndex) : undefined,
952
+ 'aria-controls': isOpen ? _this.menuId : undefined,
945
953
  'aria-labelledby': rest && rest['aria-label'] ? undefined : _this.labelId,
946
954
  // https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion
947
955
  // revert back since autocomplete="nope" is ignored on latest Chrome and Opera
@@ -993,7 +1001,7 @@ var Downshift = /*#__PURE__*/function () {
993
1001
  _this.getMenuProps.called = true;
994
1002
  _this.getMenuProps.refKey = refKey;
995
1003
  _this.getMenuProps.suppressRefError = suppressRefError;
996
- return _extends__default["default"]((_extends3 = {}, _extends3[refKey] = handleRefs(ref, _this.menuRef), _extends3.role = 'listbox', _extends3['aria-labelledby'] = props && props['aria-label'] ? null : _this.labelId, _extends3.id = _this.menuId, _extends3), props);
1004
+ return _extends__default["default"]((_extends3 = {}, _extends3[refKey] = handleRefs(ref, _this.menuRef), _extends3.role = 'listbox', _extends3['aria-labelledby'] = props && props['aria-label'] ? undefined : _this.labelId, _extends3.id = _this.menuId, _extends3), props);
997
1005
  };
998
1006
  //\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ MENU
999
1007
  /////////////////////////////// ITEM
@@ -1198,14 +1206,13 @@ var Downshift = /*#__PURE__*/function () {
1198
1206
  }
1199
1207
  };
1200
1208
  _proto.moveHighlightedIndex = function moveHighlightedIndex(amount, otherStateToSet) {
1201
- var _this6 = this;
1202
1209
  var itemCount = this.getItemCount();
1203
1210
  var _this$getState8 = this.getState(),
1204
1211
  highlightedIndex = _this$getState8.highlightedIndex;
1205
1212
  if (itemCount > 0) {
1206
- var nextHighlightedIndex = getNextWrappingIndex(amount, highlightedIndex, itemCount, function (index) {
1207
- return _this6.getItemNodeFromIndex(index);
1208
- });
1213
+ var nextHighlightedIndex = getHighlightedIndex(highlightedIndex, amount, {
1214
+ length: itemCount
1215
+ }, this.isItemDisabled, true);
1209
1216
  this.setHighlightedIndex(nextHighlightedIndex, otherStateToSet);
1210
1217
  }
1211
1218
  };
@@ -1270,7 +1277,7 @@ var Downshift = /*#__PURE__*/function () {
1270
1277
  };
1271
1278
  };
1272
1279
  _proto.componentDidMount = function componentDidMount() {
1273
- var _this7 = this;
1280
+ var _this4 = this;
1274
1281
  /* istanbul ignore if (react-native) */
1275
1282
  if (process.env.NODE_ENV !== 'production' && !false && this.getMenuProps.called && !this.getMenuProps.suppressRefError) {
1276
1283
  validateGetMenuPropsCalledCorrectly(this._menuNode, this.getMenuProps);
@@ -1284,18 +1291,18 @@ var Downshift = /*#__PURE__*/function () {
1284
1291
  // this.isMouseDown is used in the blur handler on the input to determine whether the blur event should
1285
1292
  // trigger hiding the menu.
1286
1293
  var onMouseDown = function onMouseDown() {
1287
- _this7.isMouseDown = true;
1294
+ _this4.isMouseDown = true;
1288
1295
  };
1289
1296
  var onMouseUp = function onMouseUp(event) {
1290
- _this7.isMouseDown = false;
1297
+ _this4.isMouseDown = false;
1291
1298
  // if the target element or the activeElement is within a downshift node
1292
1299
  // then we don't want to reset downshift
1293
- var contextWithinDownshift = targetWithinDownshift(event.target, [_this7._rootNode, _this7._menuNode], _this7.props.environment);
1294
- if (!contextWithinDownshift && _this7.getState().isOpen) {
1295
- _this7.reset({
1300
+ var contextWithinDownshift = targetWithinDownshift(event.target, [_this4._rootNode, _this4._menuNode], _this4.props.environment);
1301
+ if (!contextWithinDownshift && _this4.getState().isOpen) {
1302
+ _this4.reset({
1296
1303
  type: mouseUp
1297
1304
  }, function () {
1298
- return _this7.props.onOuterClick(_this7.getStateAndHelpers());
1305
+ return _this4.props.onOuterClick(_this4.getStateAndHelpers());
1299
1306
  });
1300
1307
  }
1301
1308
  };
@@ -1306,18 +1313,18 @@ var Downshift = /*#__PURE__*/function () {
1306
1313
  // If the user taps outside of Downshift, the component should be reset,
1307
1314
  // but not if the user is swiping
1308
1315
  var onTouchStart = function onTouchStart() {
1309
- _this7.isTouchMove = false;
1316
+ _this4.isTouchMove = false;
1310
1317
  };
1311
1318
  var onTouchMove = function onTouchMove() {
1312
- _this7.isTouchMove = true;
1319
+ _this4.isTouchMove = true;
1313
1320
  };
1314
1321
  var onTouchEnd = function onTouchEnd(event) {
1315
- var contextWithinDownshift = targetWithinDownshift(event.target, [_this7._rootNode, _this7._menuNode], _this7.props.environment, false);
1316
- if (!_this7.isTouchMove && !contextWithinDownshift && _this7.getState().isOpen) {
1317
- _this7.reset({
1322
+ var contextWithinDownshift = targetWithinDownshift(event.target, [_this4._rootNode, _this4._menuNode], _this4.props.environment, false);
1323
+ if (!_this4.isTouchMove && !contextWithinDownshift && _this4.getState().isOpen) {
1324
+ _this4.reset({
1318
1325
  type: touchEnd
1319
1326
  }, function () {
1320
- return _this7.props.onOuterClick(_this7.getStateAndHelpers());
1327
+ return _this4.props.onOuterClick(_this4.getStateAndHelpers());
1321
1328
  });
1322
1329
  }
1323
1330
  };
@@ -1328,8 +1335,8 @@ var Downshift = /*#__PURE__*/function () {
1328
1335
  environment.addEventListener('touchmove', onTouchMove);
1329
1336
  environment.addEventListener('touchend', onTouchEnd);
1330
1337
  this.cleanup = function () {
1331
- _this7.internalClearTimeouts();
1332
- _this7.updateStatus.cancel();
1338
+ _this4.internalClearTimeouts();
1339
+ _this4.updateStatus.cancel();
1333
1340
  environment.removeEventListener('mousedown', onMouseDown);
1334
1341
  environment.removeEventListener('mouseup', onMouseUp);
1335
1342
  environment.removeEventListener('touchstart', onTouchStart);
@@ -1406,7 +1413,7 @@ var Downshift = /*#__PURE__*/function () {
1406
1413
  } else if (isDOMElement(element)) {
1407
1414
  // they didn't apply the root props, but we can clone
1408
1415
  // this and apply the props ourselves
1409
- return preact.cloneElement(element, this.getRootProps(getElementProps(element)));
1416
+ return React.cloneElement(element, this.getRootProps(getElementProps(element)));
1410
1417
  }
1411
1418
 
1412
1419
  /* istanbul ignore else */
@@ -1421,7 +1428,7 @@ var Downshift = /*#__PURE__*/function () {
1421
1428
  return undefined;
1422
1429
  };
1423
1430
  return Downshift;
1424
- }(preact.Component);
1431
+ }(React.Component);
1425
1432
  Downshift.defaultProps = {
1426
1433
  defaultHighlightedIndex: null,
1427
1434
  defaultIsOpen: false,
@@ -1546,16 +1553,23 @@ var updateA11yStatus = debounce(function (getA11yMessage, document) {
1546
1553
  }, 200);
1547
1554
 
1548
1555
  // istanbul ignore next
1549
- var useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? preact.useLayoutEffect : preact.useEffect;
1550
- function useElementIds(_ref) {
1551
- var _ref$id = _ref.id,
1552
- id = _ref$id === void 0 ? "downshift-" + generateId() : _ref$id,
1556
+ var useIsomorphicLayoutEffect = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? React.useLayoutEffect : React.useEffect;
1557
+
1558
+ // istanbul ignore next
1559
+ var useElementIds = 'useId' in React__default["default"] // Avoid conditional useId call
1560
+ ? function useElementIds(_ref) {
1561
+ var id = _ref.id,
1553
1562
  labelId = _ref.labelId,
1554
1563
  menuId = _ref.menuId,
1555
1564
  getItemId = _ref.getItemId,
1556
1565
  toggleButtonId = _ref.toggleButtonId,
1557
1566
  inputId = _ref.inputId;
1558
- var elementIdsRef = preact.useRef({
1567
+ // Avoid conditional useId call
1568
+ var reactId = "downshift-" + React__default["default"].useId();
1569
+ if (!id) {
1570
+ id = reactId;
1571
+ }
1572
+ var elementIdsRef = React.useRef({
1559
1573
  labelId: labelId || id + "-label",
1560
1574
  menuId: menuId || id + "-menu",
1561
1575
  getItemId: getItemId || function (index) {
@@ -1565,7 +1579,25 @@ function useElementIds(_ref) {
1565
1579
  inputId: inputId || id + "-input"
1566
1580
  });
1567
1581
  return elementIdsRef.current;
1568
- }
1582
+ } : function useElementIds(_ref2) {
1583
+ var _ref2$id = _ref2.id,
1584
+ id = _ref2$id === void 0 ? "downshift-" + generateId() : _ref2$id,
1585
+ labelId = _ref2.labelId,
1586
+ menuId = _ref2.menuId,
1587
+ getItemId = _ref2.getItemId,
1588
+ toggleButtonId = _ref2.toggleButtonId,
1589
+ inputId = _ref2.inputId;
1590
+ var elementIdsRef = React.useRef({
1591
+ labelId: labelId || id + "-label",
1592
+ menuId: menuId || id + "-menu",
1593
+ getItemId: getItemId || function (index) {
1594
+ return id + "-item-" + index;
1595
+ },
1596
+ toggleButtonId: toggleButtonId || id + "-toggle-button",
1597
+ inputId: inputId || id + "-input"
1598
+ });
1599
+ return elementIdsRef.current;
1600
+ };
1569
1601
  function getItemAndIndex(itemProp, indexProp, items, errorMessage) {
1570
1602
  var item, index;
1571
1603
  if (itemProp === undefined) {
@@ -1590,7 +1622,7 @@ function capitalizeString(string) {
1590
1622
  return "" + string.slice(0, 1).toUpperCase() + string.slice(1);
1591
1623
  }
1592
1624
  function useLatestRef(val) {
1593
- var ref = preact.useRef(val);
1625
+ var ref = React.useRef(val);
1594
1626
  // technically this is not "concurrent mode safe" because we're manipulating
1595
1627
  // the value during render (so it's not idempotent). However, the places this
1596
1628
  // hook is used is to support memoizing callbacks which will be called
@@ -1611,9 +1643,9 @@ function useLatestRef(val) {
1611
1643
  * @returns {Array} An array with the state and an action dispatcher.
1612
1644
  */
1613
1645
  function useEnhancedReducer(reducer, initialState, props) {
1614
- var prevStateRef = preact.useRef();
1615
- var actionRef = preact.useRef();
1616
- var enhancedReducer = preact.useCallback(function (state, action) {
1646
+ var prevStateRef = React.useRef();
1647
+ var actionRef = React.useRef();
1648
+ var enhancedReducer = React.useCallback(function (state, action) {
1617
1649
  actionRef.current = action;
1618
1650
  state = getState(state, action.props);
1619
1651
  var changes = reducer(state, action);
@@ -1622,17 +1654,17 @@ function useEnhancedReducer(reducer, initialState, props) {
1622
1654
  }));
1623
1655
  return newState;
1624
1656
  }, [reducer]);
1625
- var _useReducer = preact.useReducer(enhancedReducer, initialState),
1657
+ var _useReducer = React.useReducer(enhancedReducer, initialState),
1626
1658
  state = _useReducer[0],
1627
1659
  dispatch = _useReducer[1];
1628
1660
  var propsRef = useLatestRef(props);
1629
- var dispatchWithProps = preact.useCallback(function (action) {
1661
+ var dispatchWithProps = React.useCallback(function (action) {
1630
1662
  return dispatch(_extends__default["default"]({
1631
1663
  props: propsRef.current
1632
1664
  }, action));
1633
1665
  }, [propsRef]);
1634
1666
  var action = actionRef.current;
1635
- preact.useEffect(function () {
1667
+ React.useEffect(function () {
1636
1668
  if (action && prevStateRef.current && prevStateRef.current !== state) {
1637
1669
  callOnChangeProps(action, getState(prevStateRef.current, action.props), state);
1638
1670
  }
@@ -1736,11 +1768,11 @@ function getHighlightedIndexOnOpen(props, state, offset) {
1736
1768
  * @returns {Object} Ref containing whether mouseDown or touchMove event is happening
1737
1769
  */
1738
1770
  function useMouseAndTouchTracker(isOpen, downshiftElementRefs, environment, handleBlur) {
1739
- var mouseAndTouchTrackersRef = preact.useRef({
1771
+ var mouseAndTouchTrackersRef = React.useRef({
1740
1772
  isMouseDown: false,
1741
1773
  isTouchMove: false
1742
1774
  });
1743
- preact.useEffect(function () {
1775
+ React.useEffect(function () {
1744
1776
  if ((environment == null ? void 0 : environment.addEventListener) == null) {
1745
1777
  return;
1746
1778
  }
@@ -1804,15 +1836,15 @@ var useGetterPropsCalledChecker = function useGetterPropsCalledChecker() {
1804
1836
  /* istanbul ignore next */
1805
1837
  if (process.env.NODE_ENV !== 'production') {
1806
1838
  useGetterPropsCalledChecker = function useGetterPropsCalledChecker() {
1807
- var isInitialMountRef = preact.useRef(true);
1839
+ var isInitialMountRef = React.useRef(true);
1808
1840
  for (var _len = arguments.length, propKeys = new Array(_len), _key = 0; _key < _len; _key++) {
1809
1841
  propKeys[_key] = arguments[_key];
1810
1842
  }
1811
- var getterPropsCalledRef = preact.useRef(propKeys.reduce(function (acc, propKey) {
1843
+ var getterPropsCalledRef = React.useRef(propKeys.reduce(function (acc, propKey) {
1812
1844
  acc[propKey] = {};
1813
1845
  return acc;
1814
1846
  }, {}));
1815
- preact.useEffect(function () {
1847
+ React.useEffect(function () {
1816
1848
  Object.keys(getterPropsCalledRef.current).forEach(function (propKey) {
1817
1849
  var propCallInfo = getterPropsCalledRef.current[propKey];
1818
1850
  if (isInitialMountRef.current) {
@@ -1832,7 +1864,7 @@ if (process.env.NODE_ENV !== 'production') {
1832
1864
  });
1833
1865
  isInitialMountRef.current = false;
1834
1866
  });
1835
- var setGetterPropCallInfo = preact.useCallback(function (propKey, suppressRefError, refKey, elementRef) {
1867
+ var setGetterPropCallInfo = React.useCallback(function (propKey, suppressRefError, refKey, elementRef) {
1836
1868
  getterPropsCalledRef.current[propKey] = {
1837
1869
  suppressRefError: suppressRefError,
1838
1870
  refKey: refKey,
@@ -1842,14 +1874,14 @@ if (process.env.NODE_ENV !== 'production') {
1842
1874
  return setGetterPropCallInfo;
1843
1875
  };
1844
1876
  }
1845
- function useA11yMessageSetter(getA11yMessage, dependencyArray, _ref2) {
1846
- var isInitialMount = _ref2.isInitialMount,
1847
- highlightedIndex = _ref2.highlightedIndex,
1848
- items = _ref2.items,
1849
- environment = _ref2.environment,
1850
- rest = _objectWithoutPropertiesLoose__default["default"](_ref2, _excluded$3);
1877
+ function useA11yMessageSetter(getA11yMessage, dependencyArray, _ref3) {
1878
+ var isInitialMount = _ref3.isInitialMount,
1879
+ highlightedIndex = _ref3.highlightedIndex,
1880
+ items = _ref3.items,
1881
+ environment = _ref3.environment,
1882
+ rest = _objectWithoutPropertiesLoose__default["default"](_ref3, _excluded$3);
1851
1883
  // Sets a11y status message on changes in state.
1852
- preact.useEffect(function () {
1884
+ React.useEffect(function () {
1853
1885
  if (isInitialMount || false) {
1854
1886
  return;
1855
1887
  }
@@ -1863,15 +1895,15 @@ function useA11yMessageSetter(getA11yMessage, dependencyArray, _ref2) {
1863
1895
  // eslint-disable-next-line react-hooks/exhaustive-deps
1864
1896
  }, dependencyArray);
1865
1897
  }
1866
- function useScrollIntoView(_ref3) {
1867
- var highlightedIndex = _ref3.highlightedIndex,
1868
- isOpen = _ref3.isOpen,
1869
- itemRefs = _ref3.itemRefs,
1870
- getItemNodeFromIndex = _ref3.getItemNodeFromIndex,
1871
- menuElement = _ref3.menuElement,
1872
- scrollIntoViewProp = _ref3.scrollIntoView;
1898
+ function useScrollIntoView(_ref4) {
1899
+ var highlightedIndex = _ref4.highlightedIndex,
1900
+ isOpen = _ref4.isOpen,
1901
+ itemRefs = _ref4.itemRefs,
1902
+ getItemNodeFromIndex = _ref4.getItemNodeFromIndex,
1903
+ menuElement = _ref4.menuElement,
1904
+ scrollIntoViewProp = _ref4.scrollIntoView;
1873
1905
  // used not to scroll on highlight by mouse.
1874
- var shouldScrollRef = preact.useRef(true);
1906
+ var shouldScrollRef = React.useRef(true);
1875
1907
  // Scroll on highlighted item if change comes from keyboard.
1876
1908
  useIsomorphicLayoutEffect(function () {
1877
1909
  if (highlightedIndex < 0 || !isOpen || !Object.keys(itemRefs.current).length) {
@@ -1891,13 +1923,13 @@ function useScrollIntoView(_ref3) {
1891
1923
  var useControlPropsValidator = noop;
1892
1924
  /* istanbul ignore next */
1893
1925
  if (process.env.NODE_ENV !== 'production') {
1894
- useControlPropsValidator = function useControlPropsValidator(_ref4) {
1895
- var isInitialMount = _ref4.isInitialMount,
1896
- props = _ref4.props,
1897
- state = _ref4.state;
1926
+ useControlPropsValidator = function useControlPropsValidator(_ref5) {
1927
+ var isInitialMount = _ref5.isInitialMount,
1928
+ props = _ref5.props,
1929
+ state = _ref5.state;
1898
1930
  // used for checking when props are moving from controlled to uncontrolled.
1899
- var prevPropsRef = preact.useRef(props);
1900
- preact.useEffect(function () {
1931
+ var prevPropsRef = React.useRef(props);
1932
+ React.useEffect(function () {
1901
1933
  if (isInitialMount) {
1902
1934
  return;
1903
1935
  }
@@ -1933,6 +1965,47 @@ function getChangesOnSelection(props, highlightedIndex, inputValue) {
1933
1965
  }));
1934
1966
  }
1935
1967
 
1968
+ // Shared between all exports.
1969
+ var commonPropTypes = {
1970
+ environment: PropTypes__default["default"].shape({
1971
+ addEventListener: PropTypes__default["default"].func.isRequired,
1972
+ removeEventListener: PropTypes__default["default"].func.isRequired,
1973
+ document: PropTypes__default["default"].shape({
1974
+ createElement: PropTypes__default["default"].func.isRequired,
1975
+ getElementById: PropTypes__default["default"].func.isRequired,
1976
+ activeElement: PropTypes__default["default"].any.isRequired,
1977
+ body: PropTypes__default["default"].any.isRequired
1978
+ }).isRequired,
1979
+ Node: PropTypes__default["default"].func.isRequired
1980
+ }),
1981
+ itemToString: PropTypes__default["default"].func,
1982
+ stateReducer: PropTypes__default["default"].func
1983
+ };
1984
+
1985
+ // Shared between useSelect, useCombobox, Downshift.
1986
+ var commonDropdownPropTypes = _extends__default["default"]({}, commonPropTypes, {
1987
+ getA11yStatusMessage: PropTypes__default["default"].func,
1988
+ highlightedIndex: PropTypes__default["default"].number,
1989
+ defaultHighlightedIndex: PropTypes__default["default"].number,
1990
+ initialHighlightedIndex: PropTypes__default["default"].number,
1991
+ isOpen: PropTypes__default["default"].bool,
1992
+ defaultIsOpen: PropTypes__default["default"].bool,
1993
+ initialIsOpen: PropTypes__default["default"].bool,
1994
+ selectedItem: PropTypes__default["default"].any,
1995
+ initialSelectedItem: PropTypes__default["default"].any,
1996
+ defaultSelectedItem: PropTypes__default["default"].any,
1997
+ id: PropTypes__default["default"].string,
1998
+ labelId: PropTypes__default["default"].string,
1999
+ menuId: PropTypes__default["default"].string,
2000
+ getItemId: PropTypes__default["default"].func,
2001
+ toggleButtonId: PropTypes__default["default"].string,
2002
+ onSelectedItemChange: PropTypes__default["default"].func,
2003
+ onHighlightedIndexChange: PropTypes__default["default"].func,
2004
+ onStateChange: PropTypes__default["default"].func,
2005
+ onIsOpenChange: PropTypes__default["default"].func,
2006
+ scrollIntoView: PropTypes__default["default"].func
2007
+ });
2008
+
1936
2009
  function downshiftCommonReducer(state, action, stateChangeTypes) {
1937
2010
  var type = action.type,
1938
2011
  props = action.props;
@@ -1992,56 +2065,22 @@ function downshiftCommonReducer(state, action, stateChangeTypes) {
1992
2065
  /* eslint-enable complexity */
1993
2066
 
1994
2067
  function getItemIndexByCharacterKey(_a) {
1995
- var keysSoFar = _a.keysSoFar, highlightedIndex = _a.highlightedIndex, items = _a.items, itemToString = _a.itemToString, getItemNodeFromIndex = _a.getItemNodeFromIndex;
2068
+ var keysSoFar = _a.keysSoFar, highlightedIndex = _a.highlightedIndex, items = _a.items, itemToString = _a.itemToString, isItemDisabled = _a.isItemDisabled;
1996
2069
  var lowerCasedKeysSoFar = keysSoFar.toLowerCase();
1997
2070
  for (var index = 0; index < items.length; index++) {
1998
2071
  // if we already have a search query in progress, we also consider the current highlighted item.
1999
2072
  var offsetIndex = (index + highlightedIndex + (keysSoFar.length < 2 ? 1 : 0)) % items.length;
2000
2073
  var item = items[offsetIndex];
2001
2074
  if (item !== undefined &&
2002
- itemToString(item).toLowerCase().startsWith(lowerCasedKeysSoFar)) {
2003
- var element = getItemNodeFromIndex(offsetIndex);
2004
- if (!(element === null || element === void 0 ? void 0 : element.hasAttribute('disabled'))) {
2005
- return offsetIndex;
2006
- }
2075
+ itemToString(item).toLowerCase().startsWith(lowerCasedKeysSoFar) &&
2076
+ !isItemDisabled(item, offsetIndex)) {
2077
+ return offsetIndex;
2007
2078
  }
2008
2079
  }
2009
2080
  return highlightedIndex;
2010
2081
  }
2011
- var propTypes$2 = {
2012
- items: PropTypes__default["default"].array.isRequired,
2013
- itemToString: PropTypes__default["default"].func,
2014
- getA11yStatusMessage: PropTypes__default["default"].func,
2015
- getA11ySelectionMessage: PropTypes__default["default"].func,
2016
- highlightedIndex: PropTypes__default["default"].number,
2017
- defaultHighlightedIndex: PropTypes__default["default"].number,
2018
- initialHighlightedIndex: PropTypes__default["default"].number,
2019
- isOpen: PropTypes__default["default"].bool,
2020
- defaultIsOpen: PropTypes__default["default"].bool,
2021
- initialIsOpen: PropTypes__default["default"].bool,
2022
- selectedItem: PropTypes__default["default"].any,
2023
- initialSelectedItem: PropTypes__default["default"].any,
2024
- defaultSelectedItem: PropTypes__default["default"].any,
2025
- id: PropTypes__default["default"].string,
2026
- labelId: PropTypes__default["default"].string,
2027
- menuId: PropTypes__default["default"].string,
2028
- getItemId: PropTypes__default["default"].func,
2029
- toggleButtonId: PropTypes__default["default"].string,
2030
- stateReducer: PropTypes__default["default"].func,
2031
- onSelectedItemChange: PropTypes__default["default"].func,
2032
- onHighlightedIndexChange: PropTypes__default["default"].func,
2033
- onStateChange: PropTypes__default["default"].func,
2034
- onIsOpenChange: PropTypes__default["default"].func,
2035
- environment: PropTypes__default["default"].shape({
2036
- addEventListener: PropTypes__default["default"].func,
2037
- removeEventListener: PropTypes__default["default"].func,
2038
- document: PropTypes__default["default"].shape({
2039
- getElementById: PropTypes__default["default"].func,
2040
- activeElement: PropTypes__default["default"].any,
2041
- body: PropTypes__default["default"].any
2042
- })
2043
- })
2044
- };
2082
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
2083
+ var propTypes$2 = tslib.__assign(tslib.__assign({}, commonDropdownPropTypes), { items: PropTypes__default["default"].array.isRequired, isItemDisabled: PropTypes__default["default"].func, getA11ySelectionMessage: PropTypes__default["default"].func });
2045
2084
  /**
2046
2085
  * Default implementation for status message. Only added when menu is open.
2047
2086
  * Will specift if there are results in the list, and if so, how many,
@@ -2063,7 +2102,9 @@ function getA11yStatusMessage(_a) {
2063
2102
  }
2064
2103
  return '';
2065
2104
  }
2066
- var defaultProps$2 = tslib.__assign(tslib.__assign({}, defaultProps$3), { getA11yStatusMessage: getA11yStatusMessage });
2105
+ var defaultProps$2 = tslib.__assign(tslib.__assign({}, defaultProps$3), { getA11yStatusMessage: getA11yStatusMessage, isItemDisabled: function () {
2106
+ return false;
2107
+ } });
2067
2108
  // eslint-disable-next-line import/no-mutable-exports
2068
2109
  var validatePropTypes$2 = noop;
2069
2110
  /* istanbul ignore next */
@@ -2147,7 +2188,7 @@ function downshiftSelectReducer(state, action) {
2147
2188
  highlightedIndex: prevHighlightedIndex,
2148
2189
  items: props.items,
2149
2190
  itemToString: props.itemToString,
2150
- getItemNodeFromIndex: action.getItemNodeFromIndex
2191
+ isItemDisabled: props.isItemDisabled
2151
2192
  });
2152
2193
  changes = {
2153
2194
  inputValue: inputValue,
@@ -2158,7 +2199,7 @@ function downshiftSelectReducer(state, action) {
2158
2199
  break;
2159
2200
  case ToggleButtonKeyDownArrowDown:
2160
2201
  {
2161
- var _highlightedIndex = state.isOpen ? getNextWrappingIndex(1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false) : altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props, state, 1);
2202
+ var _highlightedIndex = state.isOpen ? getHighlightedIndex(state.highlightedIndex, 1, props.items, props.isItemDisabled) : altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props, state, 1);
2162
2203
  changes = {
2163
2204
  highlightedIndex: _highlightedIndex,
2164
2205
  isOpen: true
@@ -2169,7 +2210,7 @@ function downshiftSelectReducer(state, action) {
2169
2210
  if (state.isOpen && altKey) {
2170
2211
  changes = getChangesOnSelection(props, state.highlightedIndex, false);
2171
2212
  } else {
2172
- var _highlightedIndex2 = state.isOpen ? getNextWrappingIndex(-1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false) : getHighlightedIndexOnOpen(props, state, -1);
2213
+ var _highlightedIndex2 = state.isOpen ? getHighlightedIndex(state.highlightedIndex, -1, props.items, props.isItemDisabled) : getHighlightedIndexOnOpen(props, state, -1);
2173
2214
  changes = {
2174
2215
  highlightedIndex: _highlightedIndex2,
2175
2216
  isOpen: true
@@ -2183,24 +2224,24 @@ function downshiftSelectReducer(state, action) {
2183
2224
  break;
2184
2225
  case ToggleButtonKeyDownHome:
2185
2226
  changes = {
2186
- highlightedIndex: getNextNonDisabledIndex(1, 0, props.items.length, action.getItemNodeFromIndex, false),
2227
+ highlightedIndex: getNonDisabledIndex(0, false, props.items, props.isItemDisabled),
2187
2228
  isOpen: true
2188
2229
  };
2189
2230
  break;
2190
2231
  case ToggleButtonKeyDownEnd:
2191
2232
  changes = {
2192
- highlightedIndex: getNextNonDisabledIndex(-1, props.items.length - 1, props.items.length, action.getItemNodeFromIndex, false),
2233
+ highlightedIndex: getNonDisabledIndex(props.items.length - 1, true, props.items, props.isItemDisabled),
2193
2234
  isOpen: true
2194
2235
  };
2195
2236
  break;
2196
2237
  case ToggleButtonKeyDownPageUp:
2197
2238
  changes = {
2198
- highlightedIndex: getNextWrappingIndex(-10, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false)
2239
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, -10, props.items, props.isItemDisabled)
2199
2240
  };
2200
2241
  break;
2201
2242
  case ToggleButtonKeyDownPageDown:
2202
2243
  changes = {
2203
- highlightedIndex: getNextWrappingIndex(10, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false)
2244
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, 10, props.items, props.isItemDisabled)
2204
2245
  };
2205
2246
  break;
2206
2247
  case ToggleButtonKeyDownEscape:
@@ -2231,7 +2272,7 @@ function downshiftSelectReducer(state, action) {
2231
2272
 
2232
2273
  var _excluded$2 = ["onMouseLeave", "refKey", "onKeyDown", "onBlur", "ref"],
2233
2274
  _excluded2$2 = ["onBlur", "onClick", "onPress", "onKeyDown", "refKey", "ref"],
2234
- _excluded3$1 = ["item", "index", "onMouseMove", "onClick", "onPress", "refKey", "ref", "disabled"];
2275
+ _excluded3$1 = ["item", "index", "onMouseMove", "onClick", "onPress", "refKey", "disabled", "ref"];
2235
2276
  useSelect.stateChangeTypes = stateChangeTypes$2;
2236
2277
  function useSelect(userProps) {
2237
2278
  if (userProps === void 0) {
@@ -2257,16 +2298,16 @@ function useSelect(userProps) {
2257
2298
  inputValue = state.inputValue;
2258
2299
 
2259
2300
  // Element efs.
2260
- var toggleButtonRef = preact.useRef(null);
2261
- var menuRef = preact.useRef(null);
2262
- var itemRefs = preact.useRef({});
2301
+ var toggleButtonRef = React.useRef(null);
2302
+ var menuRef = React.useRef(null);
2303
+ var itemRefs = React.useRef({});
2263
2304
  // used to keep the inputValue clearTimeout object between renders.
2264
- var clearTimeoutRef = preact.useRef(null);
2305
+ var clearTimeoutRef = React.useRef(null);
2265
2306
  // prevent id re-generation between renders.
2266
2307
  var elementIds = useElementIds(props);
2267
2308
  // used to keep track of how many items we had on previous cycle.
2268
- var previousResultCountRef = preact.useRef();
2269
- var isInitialMountRef = preact.useRef(true);
2309
+ var previousResultCountRef = React.useRef();
2310
+ var isInitialMountRef = React.useRef(true);
2270
2311
  // utility callback to get item element.
2271
2312
  var latest = useLatestRef({
2272
2313
  state: state,
@@ -2274,7 +2315,7 @@ function useSelect(userProps) {
2274
2315
  });
2275
2316
 
2276
2317
  // Some utils.
2277
- var getItemNodeFromIndex = preact.useCallback(function (index) {
2318
+ var getItemNodeFromIndex = React.useCallback(function (index) {
2278
2319
  return itemRefs.current[elementIds.getItemId(index)];
2279
2320
  }, [elementIds]);
2280
2321
 
@@ -2306,7 +2347,7 @@ function useSelect(userProps) {
2306
2347
  });
2307
2348
 
2308
2349
  // Sets cleanup for the keysSoFar callback, debounded after 500ms.
2309
- preact.useEffect(function () {
2350
+ React.useEffect(function () {
2310
2351
  // init the clean function here as we need access to dispatch.
2311
2352
  clearTimeoutRef.current = debounce(function (outerDispatch) {
2312
2353
  outerDispatch({
@@ -2322,7 +2363,7 @@ function useSelect(userProps) {
2322
2363
  }, []);
2323
2364
 
2324
2365
  // Invokes the keysSoFar callback set up above.
2325
- preact.useEffect(function () {
2366
+ React.useEffect(function () {
2326
2367
  if (!inputValue) {
2327
2368
  return;
2328
2369
  }
@@ -2333,7 +2374,7 @@ function useSelect(userProps) {
2333
2374
  props: props,
2334
2375
  state: state
2335
2376
  });
2336
- preact.useEffect(function () {
2377
+ React.useEffect(function () {
2337
2378
  if (isInitialMountRef.current) {
2338
2379
  return;
2339
2380
  }
@@ -2347,27 +2388,26 @@ function useSelect(userProps) {
2347
2388
  });
2348
2389
  var setGetterPropCallInfo = useGetterPropsCalledChecker('getMenuProps', 'getToggleButtonProps');
2349
2390
  // Make initial ref false.
2350
- preact.useEffect(function () {
2391
+ React.useEffect(function () {
2351
2392
  isInitialMountRef.current = false;
2352
2393
  return function () {
2353
2394
  isInitialMountRef.current = true;
2354
2395
  };
2355
2396
  }, []);
2356
2397
  // Reset itemRefs on close.
2357
- preact.useEffect(function () {
2398
+ React.useEffect(function () {
2358
2399
  if (!isOpen) {
2359
2400
  itemRefs.current = {};
2360
2401
  }
2361
2402
  }, [isOpen]);
2362
2403
 
2363
2404
  // Event handler functions.
2364
- var toggleButtonKeyDownHandlers = preact.useMemo(function () {
2405
+ var toggleButtonKeyDownHandlers = React.useMemo(function () {
2365
2406
  return {
2366
2407
  ArrowDown: function ArrowDown(event) {
2367
2408
  event.preventDefault();
2368
2409
  dispatch({
2369
2410
  type: ToggleButtonKeyDownArrowDown,
2370
- getItemNodeFromIndex: getItemNodeFromIndex,
2371
2411
  altKey: event.altKey
2372
2412
  });
2373
2413
  },
@@ -2375,22 +2415,19 @@ function useSelect(userProps) {
2375
2415
  event.preventDefault();
2376
2416
  dispatch({
2377
2417
  type: ToggleButtonKeyDownArrowUp,
2378
- getItemNodeFromIndex: getItemNodeFromIndex,
2379
2418
  altKey: event.altKey
2380
2419
  });
2381
2420
  },
2382
2421
  Home: function Home(event) {
2383
2422
  event.preventDefault();
2384
2423
  dispatch({
2385
- type: ToggleButtonKeyDownHome,
2386
- getItemNodeFromIndex: getItemNodeFromIndex
2424
+ type: ToggleButtonKeyDownHome
2387
2425
  });
2388
2426
  },
2389
2427
  End: function End(event) {
2390
2428
  event.preventDefault();
2391
2429
  dispatch({
2392
- type: ToggleButtonKeyDownEnd,
2393
- getItemNodeFromIndex: getItemNodeFromIndex
2430
+ type: ToggleButtonKeyDownEnd
2394
2431
  });
2395
2432
  },
2396
2433
  Escape: function Escape() {
@@ -2410,8 +2447,7 @@ function useSelect(userProps) {
2410
2447
  if (latest.current.state.isOpen) {
2411
2448
  event.preventDefault();
2412
2449
  dispatch({
2413
- type: ToggleButtonKeyDownPageUp,
2414
- getItemNodeFromIndex: getItemNodeFromIndex
2450
+ type: ToggleButtonKeyDownPageUp
2415
2451
  });
2416
2452
  }
2417
2453
  },
@@ -2419,8 +2455,7 @@ function useSelect(userProps) {
2419
2455
  if (latest.current.state.isOpen) {
2420
2456
  event.preventDefault();
2421
2457
  dispatch({
2422
- type: ToggleButtonKeyDownPageDown,
2423
- getItemNodeFromIndex: getItemNodeFromIndex
2458
+ type: ToggleButtonKeyDownPageDown
2424
2459
  });
2425
2460
  }
2426
2461
  },
@@ -2436,8 +2471,7 @@ function useSelect(userProps) {
2436
2471
  if (currentState.inputValue) {
2437
2472
  dispatch({
2438
2473
  type: ToggleButtonKeyDownCharacter,
2439
- key: ' ',
2440
- getItemNodeFromIndex: getItemNodeFromIndex
2474
+ key: ' '
2441
2475
  });
2442
2476
  } else {
2443
2477
  dispatch({
@@ -2446,55 +2480,55 @@ function useSelect(userProps) {
2446
2480
  }
2447
2481
  }
2448
2482
  };
2449
- }, [dispatch, getItemNodeFromIndex, latest]);
2483
+ }, [dispatch, latest]);
2450
2484
 
2451
2485
  // Action functions.
2452
- var toggleMenu = preact.useCallback(function () {
2486
+ var toggleMenu = React.useCallback(function () {
2453
2487
  dispatch({
2454
2488
  type: FunctionToggleMenu$1
2455
2489
  });
2456
2490
  }, [dispatch]);
2457
- var closeMenu = preact.useCallback(function () {
2491
+ var closeMenu = React.useCallback(function () {
2458
2492
  dispatch({
2459
2493
  type: FunctionCloseMenu$1
2460
2494
  });
2461
2495
  }, [dispatch]);
2462
- var openMenu = preact.useCallback(function () {
2496
+ var openMenu = React.useCallback(function () {
2463
2497
  dispatch({
2464
2498
  type: FunctionOpenMenu$1
2465
2499
  });
2466
2500
  }, [dispatch]);
2467
- var setHighlightedIndex = preact.useCallback(function (newHighlightedIndex) {
2501
+ var setHighlightedIndex = React.useCallback(function (newHighlightedIndex) {
2468
2502
  dispatch({
2469
2503
  type: FunctionSetHighlightedIndex$1,
2470
2504
  highlightedIndex: newHighlightedIndex
2471
2505
  });
2472
2506
  }, [dispatch]);
2473
- var selectItem = preact.useCallback(function (newSelectedItem) {
2507
+ var selectItem = React.useCallback(function (newSelectedItem) {
2474
2508
  dispatch({
2475
2509
  type: FunctionSelectItem$1,
2476
2510
  selectedItem: newSelectedItem
2477
2511
  });
2478
2512
  }, [dispatch]);
2479
- var reset = preact.useCallback(function () {
2513
+ var reset = React.useCallback(function () {
2480
2514
  dispatch({
2481
2515
  type: FunctionReset$2
2482
2516
  });
2483
2517
  }, [dispatch]);
2484
- var setInputValue = preact.useCallback(function (newInputValue) {
2518
+ var setInputValue = React.useCallback(function (newInputValue) {
2485
2519
  dispatch({
2486
2520
  type: FunctionSetInputValue$1,
2487
2521
  inputValue: newInputValue
2488
2522
  });
2489
2523
  }, [dispatch]);
2490
2524
  // Getter functions.
2491
- var getLabelProps = preact.useCallback(function (labelProps) {
2525
+ var getLabelProps = React.useCallback(function (labelProps) {
2492
2526
  return _extends__default["default"]({
2493
2527
  id: elementIds.labelId,
2494
2528
  htmlFor: elementIds.toggleButtonId
2495
2529
  }, labelProps);
2496
2530
  }, [elementIds]);
2497
- var getMenuProps = preact.useCallback(function (_temp, _temp2) {
2531
+ var getMenuProps = React.useCallback(function (_temp, _temp2) {
2498
2532
  var _extends2;
2499
2533
  var _ref = _temp === void 0 ? {} : _temp,
2500
2534
  onMouseLeave = _ref.onMouseLeave,
@@ -2517,7 +2551,7 @@ function useSelect(userProps) {
2517
2551
  menuRef.current = menuNode;
2518
2552
  }), _extends2.id = elementIds.menuId, _extends2.role = 'listbox', _extends2['aria-labelledby'] = rest && rest['aria-label'] ? undefined : "" + elementIds.labelId, _extends2.onMouseLeave = callAllEventHandlers(onMouseLeave, menuHandleMouseLeave), _extends2), rest);
2519
2553
  }, [dispatch, setGetterPropCallInfo, elementIds]);
2520
- var getToggleButtonProps = preact.useCallback(function (_temp3, _temp4) {
2554
+ var getToggleButtonProps = React.useCallback(function (_temp3, _temp4) {
2521
2555
  var _extends3;
2522
2556
  var _ref3 = _temp3 === void 0 ? {} : _temp3,
2523
2557
  onBlur = _ref3.onBlur,
@@ -2551,8 +2585,7 @@ function useSelect(userProps) {
2551
2585
  } else if (isAcceptedCharacterKey(key)) {
2552
2586
  dispatch({
2553
2587
  type: ToggleButtonKeyDownCharacter,
2554
- key: key,
2555
- getItemNodeFromIndex: getItemNodeFromIndex
2588
+ key: key
2556
2589
  });
2557
2590
  }
2558
2591
  };
@@ -2568,8 +2601,8 @@ function useSelect(userProps) {
2568
2601
  }
2569
2602
  setGetterPropCallInfo('getToggleButtonProps', suppressRefError, refKey, toggleButtonRef);
2570
2603
  return toggleProps;
2571
- }, [latest, elementIds, setGetterPropCallInfo, dispatch, mouseAndTouchTrackersRef, toggleButtonKeyDownHandlers, getItemNodeFromIndex]);
2572
- var getItemProps = preact.useCallback(function (_temp5) {
2604
+ }, [latest, elementIds, setGetterPropCallInfo, dispatch, mouseAndTouchTrackersRef, toggleButtonKeyDownHandlers]);
2605
+ var getItemProps = React.useCallback(function (_temp5) {
2573
2606
  var _extends4;
2574
2607
  var _ref5 = _temp5 === void 0 ? {} : _temp5,
2575
2608
  itemProp = _ref5.item,
@@ -2579,15 +2612,19 @@ function useSelect(userProps) {
2579
2612
  _ref5.onPress;
2580
2613
  var _ref5$refKey = _ref5.refKey,
2581
2614
  refKey = _ref5$refKey === void 0 ? 'ref' : _ref5$refKey,
2615
+ disabledProp = _ref5.disabled,
2582
2616
  ref = _ref5.ref,
2583
- disabled = _ref5.disabled,
2584
2617
  rest = _objectWithoutPropertiesLoose__default["default"](_ref5, _excluded3$1);
2618
+ if (disabledProp !== undefined) {
2619
+ console.warn('Passing "disabled" as an argument to getItemProps is not supported anymore. Please use the isItemDisabled prop from useSelect.');
2620
+ }
2585
2621
  var _latest$current = latest.current,
2586
2622
  latestState = _latest$current.state,
2587
2623
  latestProps = _latest$current.props;
2588
2624
  var _getItemAndIndex = getItemAndIndex(itemProp, indexProp, latestProps.items, 'Pass either item or index to getItemProps!'),
2589
2625
  item = _getItemAndIndex[0],
2590
2626
  index = _getItemAndIndex[1];
2627
+ var disabled = latestProps.isItemDisabled(item, index);
2591
2628
  var itemHandleMouseMove = function itemHandleMouseMove() {
2592
2629
  if (index === latestState.highlightedIndex) {
2593
2630
  return;
@@ -2605,16 +2642,11 @@ function useSelect(userProps) {
2605
2642
  index: index
2606
2643
  });
2607
2644
  };
2608
- var itemProps = _extends__default["default"]((_extends4 = {
2609
- disabled: disabled,
2610
- role: 'option',
2611
- 'aria-selected': "" + (item === selectedItem),
2612
- id: elementIds.getItemId(index)
2613
- }, _extends4[refKey] = handleRefs(ref, function (itemNode) {
2645
+ var itemProps = _extends__default["default"]((_extends4 = {}, _extends4[refKey] = handleRefs(ref, function (itemNode) {
2614
2646
  if (itemNode) {
2615
2647
  itemRefs.current[elementIds.getItemId(index)] = itemNode;
2616
2648
  }
2617
- }), _extends4), rest);
2649
+ }), _extends4['aria-disabled'] = disabled, _extends4['aria-selected'] = "" + (item === latestState.selectedItem), _extends4.id = elementIds.getItemId(index), _extends4.role = 'option', _extends4), rest);
2618
2650
  if (!disabled) {
2619
2651
  /* istanbul ignore next (react-native) */
2620
2652
  {
@@ -2623,7 +2655,7 @@ function useSelect(userProps) {
2623
2655
  }
2624
2656
  itemProps.onMouseMove = callAllEventHandlers(onMouseMove, itemHandleMouseMove);
2625
2657
  return itemProps;
2626
- }, [latest, selectedItem, elementIds, shouldScrollRef, dispatch]);
2658
+ }, [latest, elementIds, shouldScrollRef, dispatch]);
2627
2659
  return {
2628
2660
  // prop getters.
2629
2661
  getToggleButtonProps: getToggleButtonProps,
@@ -2656,7 +2688,7 @@ var InputKeyDownPageDown = process.env.NODE_ENV !== "production" ? '__input_keyd
2656
2688
  var InputKeyDownEnter = process.env.NODE_ENV !== "production" ? '__input_keydown_enter__' : 7;
2657
2689
  var InputChange = process.env.NODE_ENV !== "production" ? '__input_change__' : 8;
2658
2690
  var InputBlur = process.env.NODE_ENV !== "production" ? '__input_blur__' : 9;
2659
- var InputFocus = process.env.NODE_ENV !== "production" ? '__input_focus__' : 10;
2691
+ var InputClick = process.env.NODE_ENV !== "production" ? '__input_click__' : 10;
2660
2692
  var MenuMouseLeave = process.env.NODE_ENV !== "production" ? '__menu_mouse_leave__' : 11;
2661
2693
  var ItemMouseMove = process.env.NODE_ENV !== "production" ? '__item_mouse_move__' : 12;
2662
2694
  var ItemClick = process.env.NODE_ENV !== "production" ? '__item_click__' : 13;
@@ -2682,7 +2714,7 @@ var stateChangeTypes$1 = /*#__PURE__*/Object.freeze({
2682
2714
  InputKeyDownEnter: InputKeyDownEnter,
2683
2715
  InputChange: InputChange,
2684
2716
  InputBlur: InputBlur,
2685
- InputFocus: InputFocus,
2717
+ InputClick: InputClick,
2686
2718
  MenuMouseLeave: MenuMouseLeave,
2687
2719
  ItemMouseMove: ItemMouseMove,
2688
2720
  ItemClick: ItemClick,
@@ -2708,46 +2740,17 @@ function getInitialState$1(props) {
2708
2740
  inputValue: inputValue
2709
2741
  });
2710
2742
  }
2711
- var propTypes$1 = {
2743
+ var propTypes$1 = _extends__default["default"]({}, commonDropdownPropTypes, {
2712
2744
  items: PropTypes__default["default"].array.isRequired,
2713
- itemToString: PropTypes__default["default"].func,
2745
+ isItemDisabled: PropTypes__default["default"].func,
2714
2746
  selectedItemChanged: PropTypes__default["default"].func,
2715
- getA11yStatusMessage: PropTypes__default["default"].func,
2716
2747
  getA11ySelectionMessage: PropTypes__default["default"].func,
2717
- highlightedIndex: PropTypes__default["default"].number,
2718
- defaultHighlightedIndex: PropTypes__default["default"].number,
2719
- initialHighlightedIndex: PropTypes__default["default"].number,
2720
- isOpen: PropTypes__default["default"].bool,
2721
- defaultIsOpen: PropTypes__default["default"].bool,
2722
- initialIsOpen: PropTypes__default["default"].bool,
2723
- selectedItem: PropTypes__default["default"].any,
2724
- initialSelectedItem: PropTypes__default["default"].any,
2725
- defaultSelectedItem: PropTypes__default["default"].any,
2726
2748
  inputValue: PropTypes__default["default"].string,
2727
2749
  defaultInputValue: PropTypes__default["default"].string,
2728
2750
  initialInputValue: PropTypes__default["default"].string,
2729
- id: PropTypes__default["default"].string,
2730
- labelId: PropTypes__default["default"].string,
2731
- menuId: PropTypes__default["default"].string,
2732
- getItemId: PropTypes__default["default"].func,
2733
2751
  inputId: PropTypes__default["default"].string,
2734
- toggleButtonId: PropTypes__default["default"].string,
2735
- stateReducer: PropTypes__default["default"].func,
2736
- onSelectedItemChange: PropTypes__default["default"].func,
2737
- onHighlightedIndexChange: PropTypes__default["default"].func,
2738
- onStateChange: PropTypes__default["default"].func,
2739
- onIsOpenChange: PropTypes__default["default"].func,
2740
- onInputValueChange: PropTypes__default["default"].func,
2741
- environment: PropTypes__default["default"].shape({
2742
- addEventListener: PropTypes__default["default"].func,
2743
- removeEventListener: PropTypes__default["default"].func,
2744
- document: PropTypes__default["default"].shape({
2745
- getElementById: PropTypes__default["default"].func,
2746
- activeElement: PropTypes__default["default"].any,
2747
- body: PropTypes__default["default"].any
2748
- })
2749
- })
2750
- };
2752
+ onInputValueChange: PropTypes__default["default"].func
2753
+ });
2751
2754
 
2752
2755
  /**
2753
2756
  * The useCombobox version of useControlledReducer, which also
@@ -2762,13 +2765,13 @@ var propTypes$1 = {
2762
2765
  * @returns {Array} An array with the state and an action dispatcher.
2763
2766
  */
2764
2767
  function useControlledReducer(reducer, initialState, props) {
2765
- var previousSelectedItemRef = preact.useRef();
2768
+ var previousSelectedItemRef = React.useRef();
2766
2769
  var _useEnhancedReducer = useEnhancedReducer(reducer, initialState, props),
2767
2770
  state = _useEnhancedReducer[0],
2768
2771
  dispatch = _useEnhancedReducer[1];
2769
2772
 
2770
2773
  // ToDo: if needed, make same approach as selectedItemChanged from Downshift.
2771
- preact.useEffect(function () {
2774
+ React.useEffect(function () {
2772
2775
  if (!isControlledProp(props, 'selectedItem')) {
2773
2776
  return;
2774
2777
  }
@@ -2796,7 +2799,10 @@ var defaultProps$1 = _extends__default["default"]({}, defaultProps$3, {
2796
2799
  selectedItemChanged: function selectedItemChanged(prevItem, item) {
2797
2800
  return prevItem !== item;
2798
2801
  },
2799
- getA11yStatusMessage: getA11yStatusMessage$1
2802
+ getA11yStatusMessage: getA11yStatusMessage$1,
2803
+ isItemDisabled: function isItemDisabled() {
2804
+ return false;
2805
+ }
2800
2806
  });
2801
2807
 
2802
2808
  /* eslint-disable complexity */
@@ -2818,11 +2824,11 @@ function downshiftUseComboboxReducer(state, action) {
2818
2824
  case InputKeyDownArrowDown:
2819
2825
  if (state.isOpen) {
2820
2826
  changes = {
2821
- highlightedIndex: getNextWrappingIndex(1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, true)
2827
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, 1, props.items, props.isItemDisabled, true)
2822
2828
  };
2823
2829
  } else {
2824
2830
  changes = {
2825
- highlightedIndex: altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props, state, 1, action.getItemNodeFromIndex),
2831
+ highlightedIndex: altKey && state.selectedItem == null ? -1 : getHighlightedIndexOnOpen(props, state, 1),
2826
2832
  isOpen: props.items.length >= 0
2827
2833
  };
2828
2834
  }
@@ -2833,12 +2839,12 @@ function downshiftUseComboboxReducer(state, action) {
2833
2839
  changes = getChangesOnSelection(props, state.highlightedIndex);
2834
2840
  } else {
2835
2841
  changes = {
2836
- highlightedIndex: getNextWrappingIndex(-1, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, true)
2842
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, -1, props.items, props.isItemDisabled, true)
2837
2843
  };
2838
2844
  }
2839
2845
  } else {
2840
2846
  changes = {
2841
- highlightedIndex: getHighlightedIndexOnOpen(props, state, -1, action.getItemNodeFromIndex),
2847
+ highlightedIndex: getHighlightedIndexOnOpen(props, state, -1),
2842
2848
  isOpen: props.items.length >= 0
2843
2849
  };
2844
2850
  }
@@ -2857,22 +2863,22 @@ function downshiftUseComboboxReducer(state, action) {
2857
2863
  break;
2858
2864
  case InputKeyDownPageUp:
2859
2865
  changes = {
2860
- highlightedIndex: getNextWrappingIndex(-10, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false)
2866
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, -10, props.items, props.isItemDisabled, true)
2861
2867
  };
2862
2868
  break;
2863
2869
  case InputKeyDownPageDown:
2864
2870
  changes = {
2865
- highlightedIndex: getNextWrappingIndex(10, state.highlightedIndex, props.items.length, action.getItemNodeFromIndex, false)
2871
+ highlightedIndex: getHighlightedIndex(state.highlightedIndex, 10, props.items, props.isItemDisabled, true)
2866
2872
  };
2867
2873
  break;
2868
2874
  case InputKeyDownHome:
2869
2875
  changes = {
2870
- highlightedIndex: getNextNonDisabledIndex(1, 0, props.items.length, action.getItemNodeFromIndex, false)
2876
+ highlightedIndex: getNonDisabledIndex(0, false, props.items, props.isItemDisabled)
2871
2877
  };
2872
2878
  break;
2873
2879
  case InputKeyDownEnd:
2874
2880
  changes = {
2875
- highlightedIndex: getNextNonDisabledIndex(-1, props.items.length - 1, props.items.length, action.getItemNodeFromIndex, false)
2881
+ highlightedIndex: getNonDisabledIndex(props.items.length - 1, true, props.items, props.isItemDisabled)
2876
2882
  };
2877
2883
  break;
2878
2884
  case InputBlur:
@@ -2891,10 +2897,10 @@ function downshiftUseComboboxReducer(state, action) {
2891
2897
  inputValue: action.inputValue
2892
2898
  };
2893
2899
  break;
2894
- case InputFocus:
2900
+ case InputClick:
2895
2901
  changes = {
2896
- isOpen: true,
2897
- highlightedIndex: getHighlightedIndexOnOpen(props, state, 0)
2902
+ isOpen: !state.isOpen,
2903
+ highlightedIndex: state.isOpen ? -1 : getHighlightedIndexOnOpen(props, state, 0)
2898
2904
  };
2899
2905
  break;
2900
2906
  case FunctionSelectItem:
@@ -2918,7 +2924,7 @@ function downshiftUseComboboxReducer(state, action) {
2918
2924
  var _excluded$1 = ["onMouseLeave", "refKey", "ref"],
2919
2925
  _excluded2$1 = ["item", "index", "refKey", "ref", "onMouseMove", "onMouseDown", "onClick", "onPress", "disabled"],
2920
2926
  _excluded3 = ["onClick", "onPress", "refKey", "ref"],
2921
- _excluded4 = ["onKeyDown", "onChange", "onInput", "onFocus", "onBlur", "onChangeText", "refKey", "ref"];
2927
+ _excluded4 = ["onKeyDown", "onChange", "onInput", "onBlur", "onChangeText", "onClick", "refKey", "ref"];
2922
2928
  useCombobox.stateChangeTypes = stateChangeTypes$1;
2923
2929
  function useCombobox(userProps) {
2924
2930
  if (userProps === void 0) {
@@ -2946,21 +2952,21 @@ function useCombobox(userProps) {
2946
2952
  inputValue = state.inputValue;
2947
2953
 
2948
2954
  // Element refs.
2949
- var menuRef = preact.useRef(null);
2950
- var itemRefs = preact.useRef({});
2951
- var inputRef = preact.useRef(null);
2952
- var toggleButtonRef = preact.useRef(null);
2953
- var isInitialMountRef = preact.useRef(true);
2955
+ var menuRef = React.useRef(null);
2956
+ var itemRefs = React.useRef({});
2957
+ var inputRef = React.useRef(null);
2958
+ var toggleButtonRef = React.useRef(null);
2959
+ var isInitialMountRef = React.useRef(true);
2954
2960
  // prevent id re-generation between renders.
2955
2961
  var elementIds = useElementIds(props);
2956
2962
  // used to keep track of how many items we had on previous cycle.
2957
- var previousResultCountRef = preact.useRef();
2963
+ var previousResultCountRef = React.useRef();
2958
2964
  // utility callback to get item element.
2959
2965
  var latest = useLatestRef({
2960
2966
  state: state,
2961
2967
  props: props
2962
2968
  });
2963
- var getItemNodeFromIndex = preact.useCallback(function (index) {
2969
+ var getItemNodeFromIndex = React.useCallback(function (index) {
2964
2970
  return itemRefs.current[elementIds.getItemId(index)];
2965
2971
  }, [elementIds]);
2966
2972
 
@@ -2996,14 +3002,14 @@ function useCombobox(userProps) {
2996
3002
  state: state
2997
3003
  });
2998
3004
  // Focus the input on first render if required.
2999
- preact.useEffect(function () {
3005
+ React.useEffect(function () {
3000
3006
  var focusOnOpen = initialIsOpen || defaultIsOpen || isOpen;
3001
3007
  if (focusOnOpen && inputRef.current) {
3002
3008
  inputRef.current.focus();
3003
3009
  }
3004
3010
  // eslint-disable-next-line react-hooks/exhaustive-deps
3005
3011
  }, []);
3006
- preact.useEffect(function () {
3012
+ React.useEffect(function () {
3007
3013
  if (isInitialMountRef.current) {
3008
3014
  return;
3009
3015
  }
@@ -3018,14 +3024,14 @@ function useCombobox(userProps) {
3018
3024
  });
3019
3025
  var setGetterPropCallInfo = useGetterPropsCalledChecker('getInputProps', 'getMenuProps');
3020
3026
  // Make initial ref false.
3021
- preact.useEffect(function () {
3027
+ React.useEffect(function () {
3022
3028
  isInitialMountRef.current = false;
3023
3029
  return function () {
3024
3030
  isInitialMountRef.current = true;
3025
3031
  };
3026
3032
  }, []);
3027
3033
  // Reset itemRefs on close.
3028
- preact.useEffect(function () {
3034
+ React.useEffect(function () {
3029
3035
  var _environment$document;
3030
3036
  if (!isOpen) {
3031
3037
  itemRefs.current = {};
@@ -3036,22 +3042,20 @@ function useCombobox(userProps) {
3036
3042
  }, [isOpen, environment]);
3037
3043
 
3038
3044
  /* Event handler functions */
3039
- var inputKeyDownHandlers = preact.useMemo(function () {
3045
+ var inputKeyDownHandlers = React.useMemo(function () {
3040
3046
  return {
3041
3047
  ArrowDown: function ArrowDown(event) {
3042
3048
  event.preventDefault();
3043
3049
  dispatch({
3044
3050
  type: InputKeyDownArrowDown,
3045
- altKey: event.altKey,
3046
- getItemNodeFromIndex: getItemNodeFromIndex
3051
+ altKey: event.altKey
3047
3052
  });
3048
3053
  },
3049
3054
  ArrowUp: function ArrowUp(event) {
3050
3055
  event.preventDefault();
3051
3056
  dispatch({
3052
3057
  type: InputKeyDownArrowUp,
3053
- altKey: event.altKey,
3054
- getItemNodeFromIndex: getItemNodeFromIndex
3058
+ altKey: event.altKey
3055
3059
  });
3056
3060
  },
3057
3061
  Home: function Home(event) {
@@ -3060,8 +3064,7 @@ function useCombobox(userProps) {
3060
3064
  }
3061
3065
  event.preventDefault();
3062
3066
  dispatch({
3063
- type: InputKeyDownHome,
3064
- getItemNodeFromIndex: getItemNodeFromIndex
3067
+ type: InputKeyDownHome
3065
3068
  });
3066
3069
  },
3067
3070
  End: function End(event) {
@@ -3070,8 +3073,7 @@ function useCombobox(userProps) {
3070
3073
  }
3071
3074
  event.preventDefault();
3072
3075
  dispatch({
3073
- type: InputKeyDownEnd,
3074
- getItemNodeFromIndex: getItemNodeFromIndex
3076
+ type: InputKeyDownEnd
3075
3077
  });
3076
3078
  },
3077
3079
  Escape: function Escape(event) {
@@ -3092,16 +3094,14 @@ function useCombobox(userProps) {
3092
3094
  }
3093
3095
  event.preventDefault();
3094
3096
  dispatch({
3095
- type: InputKeyDownEnter,
3096
- getItemNodeFromIndex: getItemNodeFromIndex
3097
+ type: InputKeyDownEnter
3097
3098
  });
3098
3099
  },
3099
3100
  PageUp: function PageUp(event) {
3100
3101
  if (latest.current.state.isOpen) {
3101
3102
  event.preventDefault();
3102
3103
  dispatch({
3103
- type: InputKeyDownPageUp,
3104
- getItemNodeFromIndex: getItemNodeFromIndex
3104
+ type: InputKeyDownPageUp
3105
3105
  });
3106
3106
  }
3107
3107
  },
@@ -3109,22 +3109,21 @@ function useCombobox(userProps) {
3109
3109
  if (latest.current.state.isOpen) {
3110
3110
  event.preventDefault();
3111
3111
  dispatch({
3112
- type: InputKeyDownPageDown,
3113
- getItemNodeFromIndex: getItemNodeFromIndex
3112
+ type: InputKeyDownPageDown
3114
3113
  });
3115
3114
  }
3116
3115
  }
3117
3116
  };
3118
- }, [dispatch, latest, getItemNodeFromIndex]);
3117
+ }, [dispatch, latest]);
3119
3118
 
3120
3119
  // Getter props.
3121
- var getLabelProps = preact.useCallback(function (labelProps) {
3120
+ var getLabelProps = React.useCallback(function (labelProps) {
3122
3121
  return _extends__default["default"]({
3123
3122
  id: elementIds.labelId,
3124
3123
  htmlFor: elementIds.inputId
3125
3124
  }, labelProps);
3126
3125
  }, [elementIds]);
3127
- var getMenuProps = preact.useCallback(function (_temp, _temp2) {
3126
+ var getMenuProps = React.useCallback(function (_temp, _temp2) {
3128
3127
  var _extends2;
3129
3128
  var _ref = _temp === void 0 ? {} : _temp,
3130
3129
  onMouseLeave = _ref.onMouseLeave,
@@ -3144,7 +3143,7 @@ function useCombobox(userProps) {
3144
3143
  });
3145
3144
  }), _extends2), rest);
3146
3145
  }, [dispatch, setGetterPropCallInfo, elementIds]);
3147
- var getItemProps = preact.useCallback(function (_temp3) {
3146
+ var getItemProps = React.useCallback(function (_temp3) {
3148
3147
  var _extends3, _ref4;
3149
3148
  var _ref3 = _temp3 === void 0 ? {} : _temp3,
3150
3149
  itemProp = _ref3.item,
@@ -3156,13 +3155,18 @@ function useCombobox(userProps) {
3156
3155
  onMouseDown = _ref3.onMouseDown,
3157
3156
  onClick = _ref3.onClick;
3158
3157
  _ref3.onPress;
3159
- var disabled = _ref3.disabled,
3158
+ var disabledProp = _ref3.disabled,
3160
3159
  rest = _objectWithoutPropertiesLoose__default["default"](_ref3, _excluded2$1);
3160
+ if (disabledProp !== undefined) {
3161
+ console.warn('Passing "disabled" as an argument to getItemProps is not supported anymore. Please use the isItemDisabled prop from useCombobox.');
3162
+ }
3161
3163
  var _latest$current = latest.current,
3162
3164
  latestProps = _latest$current.props,
3163
3165
  latestState = _latest$current.state;
3164
3166
  var _getItemAndIndex = getItemAndIndex(itemProp, indexProp, latestProps.items, 'Pass either item or index to getItemProps!'),
3167
+ item = _getItemAndIndex[0],
3165
3168
  index = _getItemAndIndex[1];
3169
+ var disabled = latestProps.isItemDisabled(item, index);
3166
3170
  var onSelectKey = 'onClick';
3167
3171
  var customClickHandler = onClick;
3168
3172
  var itemHandleMouseMove = function itemHandleMouseMove() {
@@ -3189,12 +3193,12 @@ function useCombobox(userProps) {
3189
3193
  if (itemNode) {
3190
3194
  itemRefs.current[elementIds.getItemId(index)] = itemNode;
3191
3195
  }
3192
- }), _extends3.disabled = disabled, _extends3.role = 'option', _extends3['aria-selected'] = "" + (index === latestState.highlightedIndex), _extends3.id = elementIds.getItemId(index), _extends3), !disabled && (_ref4 = {}, _ref4[onSelectKey] = callAllEventHandlers(customClickHandler, itemHandleClick), _ref4), {
3196
+ }), _extends3['aria-disabled'] = disabled, _extends3['aria-selected'] = "" + (index === latestState.highlightedIndex), _extends3.id = elementIds.getItemId(index), _extends3.role = 'option', _extends3), !disabled && (_ref4 = {}, _ref4[onSelectKey] = callAllEventHandlers(customClickHandler, itemHandleClick), _ref4), {
3193
3197
  onMouseMove: callAllEventHandlers(onMouseMove, itemHandleMouseMove),
3194
3198
  onMouseDown: callAllEventHandlers(onMouseDown, itemHandleMouseDown)
3195
3199
  }, rest);
3196
3200
  }, [dispatch, latest, shouldScrollRef, elementIds]);
3197
- var getToggleButtonProps = preact.useCallback(function (_temp4) {
3201
+ var getToggleButtonProps = React.useCallback(function (_temp4) {
3198
3202
  var _extends4;
3199
3203
  var _ref5 = _temp4 === void 0 ? {} : _temp4,
3200
3204
  onClick = _ref5.onClick;
@@ -3215,16 +3219,16 @@ function useCombobox(userProps) {
3215
3219
  onClick: callAllEventHandlers(onClick, toggleButtonHandleClick)
3216
3220
  }), rest);
3217
3221
  }, [dispatch, latest, elementIds]);
3218
- var getInputProps = preact.useCallback(function (_temp5, _temp6) {
3222
+ var getInputProps = React.useCallback(function (_temp5, _temp6) {
3219
3223
  var _extends5;
3220
3224
  var _ref6 = _temp5 === void 0 ? {} : _temp5,
3221
3225
  onKeyDown = _ref6.onKeyDown,
3222
3226
  onChange = _ref6.onChange,
3223
3227
  onInput = _ref6.onInput,
3224
- onFocus = _ref6.onFocus,
3225
3228
  onBlur = _ref6.onBlur;
3226
3229
  _ref6.onChangeText;
3227
- var _ref6$refKey = _ref6.refKey,
3230
+ var onClick = _ref6.onClick,
3231
+ _ref6$refKey = _ref6.refKey,
3228
3232
  refKey = _ref6$refKey === void 0 ? 'ref' : _ref6$refKey,
3229
3233
  ref = _ref6.ref,
3230
3234
  rest = _objectWithoutPropertiesLoose__default["default"](_ref6, _excluded4);
@@ -3254,12 +3258,10 @@ function useCombobox(userProps) {
3254
3258
  });
3255
3259
  }
3256
3260
  };
3257
- var inputHandleFocus = function inputHandleFocus() {
3258
- if (!latestState.isOpen) {
3259
- dispatch({
3260
- type: InputFocus
3261
- });
3262
- }
3261
+ var inputHandleClick = function inputHandleClick() {
3262
+ dispatch({
3263
+ type: InputClick
3264
+ });
3263
3265
  };
3264
3266
 
3265
3267
  /* istanbul ignore next (preact) */
@@ -3267,48 +3269,48 @@ function useCombobox(userProps) {
3267
3269
  var eventHandlers = {};
3268
3270
  if (!rest.disabled) {
3269
3271
  var _eventHandlers;
3270
- eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, inputHandleBlur), _eventHandlers.onFocus = callAllEventHandlers(onFocus, inputHandleFocus), _eventHandlers);
3272
+ eventHandlers = (_eventHandlers = {}, _eventHandlers[onChangeKey] = callAllEventHandlers(onChange, onInput, inputHandleChange), _eventHandlers.onKeyDown = callAllEventHandlers(onKeyDown, inputHandleKeyDown), _eventHandlers.onBlur = callAllEventHandlers(onBlur, inputHandleBlur), _eventHandlers.onClick = callAllEventHandlers(onClick, inputHandleClick), _eventHandlers);
3271
3273
  }
3272
3274
  return _extends__default["default"]((_extends5 = {}, _extends5[refKey] = handleRefs(ref, function (inputNode) {
3273
3275
  inputRef.current = inputNode;
3274
- }), _extends5['aria-activedescendant'] = latestState.isOpen && latestState.highlightedIndex > -1 ? elementIds.getItemId(latestState.highlightedIndex) : '', _extends5['aria-autocomplete'] = 'list', _extends5['aria-controls'] = elementIds.menuId, _extends5['aria-expanded'] = latestState.isOpen, _extends5['aria-labelledby'] = rest && rest['aria-label'] ? undefined : "" + elementIds.labelId, _extends5.autoComplete = 'off', _extends5.id = elementIds.inputId, _extends5.role = 'combobox', _extends5.value = latestState.inputValue, _extends5), eventHandlers, rest);
3276
+ }), _extends5['aria-activedescendant'] = latestState.isOpen && latestState.highlightedIndex > -1 ? elementIds.getItemId(latestState.highlightedIndex) : '', _extends5['aria-autocomplete'] = 'list', _extends5['aria-controls'] = elementIds.menuId, _extends5['aria-expanded'] = latestState.isOpen, _extends5['aria-labelledby'] = rest && rest['aria-label'] ? undefined : elementIds.labelId, _extends5.autoComplete = 'off', _extends5.id = elementIds.inputId, _extends5.role = 'combobox', _extends5.value = latestState.inputValue, _extends5), eventHandlers, rest);
3275
3277
  }, [dispatch, inputKeyDownHandlers, latest, mouseAndTouchTrackersRef, setGetterPropCallInfo, elementIds]);
3276
3278
 
3277
3279
  // returns
3278
- var toggleMenu = preact.useCallback(function () {
3280
+ var toggleMenu = React.useCallback(function () {
3279
3281
  dispatch({
3280
3282
  type: FunctionToggleMenu
3281
3283
  });
3282
3284
  }, [dispatch]);
3283
- var closeMenu = preact.useCallback(function () {
3285
+ var closeMenu = React.useCallback(function () {
3284
3286
  dispatch({
3285
3287
  type: FunctionCloseMenu
3286
3288
  });
3287
3289
  }, [dispatch]);
3288
- var openMenu = preact.useCallback(function () {
3290
+ var openMenu = React.useCallback(function () {
3289
3291
  dispatch({
3290
3292
  type: FunctionOpenMenu
3291
3293
  });
3292
3294
  }, [dispatch]);
3293
- var setHighlightedIndex = preact.useCallback(function (newHighlightedIndex) {
3295
+ var setHighlightedIndex = React.useCallback(function (newHighlightedIndex) {
3294
3296
  dispatch({
3295
3297
  type: FunctionSetHighlightedIndex,
3296
3298
  highlightedIndex: newHighlightedIndex
3297
3299
  });
3298
3300
  }, [dispatch]);
3299
- var selectItem = preact.useCallback(function (newSelectedItem) {
3301
+ var selectItem = React.useCallback(function (newSelectedItem) {
3300
3302
  dispatch({
3301
3303
  type: FunctionSelectItem,
3302
3304
  selectedItem: newSelectedItem
3303
3305
  });
3304
3306
  }, [dispatch]);
3305
- var setInputValue = preact.useCallback(function (newInputValue) {
3307
+ var setInputValue = React.useCallback(function (newInputValue) {
3306
3308
  dispatch({
3307
3309
  type: FunctionSetInputValue,
3308
3310
  inputValue: newInputValue
3309
3311
  });
3310
3312
  }, [dispatch]);
3311
- var reset = preact.useCallback(function () {
3313
+ var reset = React.useCallback(function () {
3312
3314
  dispatch({
3313
3315
  type: FunctionReset$1
3314
3316
  });
@@ -3418,30 +3420,19 @@ function getA11yRemovalMessage(selectionParameters) {
3418
3420
  itemToStringLocal = selectionParameters.itemToString;
3419
3421
  return itemToStringLocal(removedSelectedItem) + " has been removed.";
3420
3422
  }
3421
- var propTypes = {
3423
+ var propTypes = _extends__default["default"]({}, commonPropTypes, {
3422
3424
  selectedItems: PropTypes__default["default"].array,
3423
3425
  initialSelectedItems: PropTypes__default["default"].array,
3424
3426
  defaultSelectedItems: PropTypes__default["default"].array,
3425
- itemToString: PropTypes__default["default"].func,
3426
3427
  getA11yRemovalMessage: PropTypes__default["default"].func,
3427
- stateReducer: PropTypes__default["default"].func,
3428
3428
  activeIndex: PropTypes__default["default"].number,
3429
3429
  initialActiveIndex: PropTypes__default["default"].number,
3430
3430
  defaultActiveIndex: PropTypes__default["default"].number,
3431
3431
  onActiveIndexChange: PropTypes__default["default"].func,
3432
3432
  onSelectedItemsChange: PropTypes__default["default"].func,
3433
3433
  keyNavigationNext: PropTypes__default["default"].string,
3434
- keyNavigationPrevious: PropTypes__default["default"].string,
3435
- environment: PropTypes__default["default"].shape({
3436
- addEventListener: PropTypes__default["default"].func,
3437
- removeEventListener: PropTypes__default["default"].func,
3438
- document: PropTypes__default["default"].shape({
3439
- getElementById: PropTypes__default["default"].func,
3440
- activeElement: PropTypes__default["default"].any,
3441
- body: PropTypes__default["default"].any
3442
- })
3443
- })
3444
- };
3434
+ keyNavigationPrevious: PropTypes__default["default"].string
3435
+ });
3445
3436
  var defaultProps = {
3446
3437
  itemToString: defaultProps$3.itemToString,
3447
3438
  stateReducer: defaultProps$3.stateReducer,
@@ -3625,10 +3616,10 @@ function useMultipleSelection(userProps) {
3625
3616
  selectedItems = state.selectedItems;
3626
3617
 
3627
3618
  // Refs.
3628
- var isInitialMountRef = preact.useRef(true);
3629
- var dropdownRef = preact.useRef(null);
3630
- var previousSelectedItemsRef = preact.useRef(selectedItems);
3631
- var selectedItemRefs = preact.useRef();
3619
+ var isInitialMountRef = React.useRef(true);
3620
+ var dropdownRef = React.useRef(null);
3621
+ var previousSelectedItemsRef = React.useRef(selectedItems);
3622
+ var selectedItemRefs = React.useRef();
3632
3623
  selectedItemRefs.current = [];
3633
3624
  var latest = useLatestRef({
3634
3625
  state: state,
@@ -3637,7 +3628,7 @@ function useMultipleSelection(userProps) {
3637
3628
 
3638
3629
  // Effects.
3639
3630
  /* Sets a11y status message on changes in selectedItem. */
3640
- preact.useEffect(function () {
3631
+ React.useEffect(function () {
3641
3632
  if (isInitialMountRef.current || false) {
3642
3633
  return;
3643
3634
  }
@@ -3658,7 +3649,7 @@ function useMultipleSelection(userProps) {
3658
3649
  // eslint-disable-next-line react-hooks/exhaustive-deps
3659
3650
  }, [selectedItems.length]);
3660
3651
  // Sets focus on active item.
3661
- preact.useEffect(function () {
3652
+ React.useEffect(function () {
3662
3653
  if (isInitialMountRef.current) {
3663
3654
  return;
3664
3655
  }
@@ -3675,7 +3666,7 @@ function useMultipleSelection(userProps) {
3675
3666
  });
3676
3667
  var setGetterPropCallInfo = useGetterPropsCalledChecker('getDropdownProps');
3677
3668
  // Make initial ref false.
3678
- preact.useEffect(function () {
3669
+ React.useEffect(function () {
3679
3670
  isInitialMountRef.current = false;
3680
3671
  return function () {
3681
3672
  isInitialMountRef.current = true;
@@ -3683,7 +3674,7 @@ function useMultipleSelection(userProps) {
3683
3674
  }, []);
3684
3675
 
3685
3676
  // Event handler functions.
3686
- var selectedItemKeyDownHandlers = preact.useMemo(function () {
3677
+ var selectedItemKeyDownHandlers = React.useMemo(function () {
3687
3678
  var _ref;
3688
3679
  return _ref = {}, _ref[keyNavigationPrevious] = function () {
3689
3680
  dispatch({
@@ -3703,7 +3694,7 @@ function useMultipleSelection(userProps) {
3703
3694
  });
3704
3695
  }, _ref;
3705
3696
  }, [dispatch, keyNavigationNext, keyNavigationPrevious]);
3706
- var dropdownKeyDownHandlers = preact.useMemo(function () {
3697
+ var dropdownKeyDownHandlers = React.useMemo(function () {
3707
3698
  var _ref2;
3708
3699
  return _ref2 = {}, _ref2[keyNavigationPrevious] = function (event) {
3709
3700
  if (isKeyDownOperationPermitted(event)) {
@@ -3721,7 +3712,7 @@ function useMultipleSelection(userProps) {
3721
3712
  }, [dispatch, keyNavigationPrevious]);
3722
3713
 
3723
3714
  // Getter props.
3724
- var getSelectedItemProps = preact.useCallback(function (_temp) {
3715
+ var getSelectedItemProps = React.useCallback(function (_temp) {
3725
3716
  var _extends2;
3726
3717
  var _ref3 = _temp === void 0 ? {} : _temp,
3727
3718
  _ref3$refKey = _ref3.refKey,
@@ -3754,7 +3745,7 @@ function useMultipleSelection(userProps) {
3754
3745
  }
3755
3746
  }), _extends2.tabIndex = isFocusable ? 0 : -1, _extends2.onClick = callAllEventHandlers(onClick, selectedItemHandleClick), _extends2.onKeyDown = callAllEventHandlers(onKeyDown, selectedItemHandleKeyDown), _extends2), rest);
3756
3747
  }, [dispatch, latest, selectedItemKeyDownHandlers]);
3757
- var getDropdownProps = preact.useCallback(function (_temp2, _temp3) {
3748
+ var getDropdownProps = React.useCallback(function (_temp2, _temp3) {
3758
3749
  var _extends3;
3759
3750
  var _ref4 = _temp2 === void 0 ? {} : _temp2,
3760
3751
  _ref4$refKey = _ref4.refKey,
@@ -3791,31 +3782,31 @@ function useMultipleSelection(userProps) {
3791
3782
  }, [dispatch, dropdownKeyDownHandlers, setGetterPropCallInfo]);
3792
3783
 
3793
3784
  // returns
3794
- var addSelectedItem = preact.useCallback(function (selectedItem) {
3785
+ var addSelectedItem = React.useCallback(function (selectedItem) {
3795
3786
  dispatch({
3796
3787
  type: FunctionAddSelectedItem,
3797
3788
  selectedItem: selectedItem
3798
3789
  });
3799
3790
  }, [dispatch]);
3800
- var removeSelectedItem = preact.useCallback(function (selectedItem) {
3791
+ var removeSelectedItem = React.useCallback(function (selectedItem) {
3801
3792
  dispatch({
3802
3793
  type: FunctionRemoveSelectedItem,
3803
3794
  selectedItem: selectedItem
3804
3795
  });
3805
3796
  }, [dispatch]);
3806
- var setSelectedItems = preact.useCallback(function (newSelectedItems) {
3797
+ var setSelectedItems = React.useCallback(function (newSelectedItems) {
3807
3798
  dispatch({
3808
3799
  type: FunctionSetSelectedItems,
3809
3800
  selectedItems: newSelectedItems
3810
3801
  });
3811
3802
  }, [dispatch]);
3812
- var setActiveIndex = preact.useCallback(function (newActiveIndex) {
3803
+ var setActiveIndex = React.useCallback(function (newActiveIndex) {
3813
3804
  dispatch({
3814
3805
  type: FunctionSetActiveIndex,
3815
3806
  activeIndex: newActiveIndex
3816
3807
  });
3817
3808
  }, [dispatch]);
3818
- var reset = preact.useCallback(function () {
3809
+ var reset = React.useCallback(function () {
3819
3810
  dispatch({
3820
3811
  type: FunctionReset
3821
3812
  });