@khanacademy/wonder-blocks-dropdown 2.6.7 → 2.6.8

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.
package/dist/index.js CHANGED
@@ -82,7 +82,7 @@ module.exports =
82
82
  /******/
83
83
  /******/
84
84
  /******/ // Load entry module and return exports
85
- /******/ return __webpack_require__(__webpack_require__.s = 33);
85
+ /******/ return __webpack_require__(__webpack_require__.s = 34);
86
86
  /******/ })
87
87
  /************************************************************************/
88
88
  /******/ ([
@@ -177,12 +177,6 @@ module.exports = require("@khanacademy/wonder-blocks-icon");
177
177
 
178
178
  /***/ }),
179
179
  /* 7 */
180
- /***/ (function(module, exports) {
181
-
182
- module.exports = require("@khanacademy/wonder-blocks-typography");
183
-
184
- /***/ }),
185
- /* 8 */
186
180
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
187
181
 
188
182
  "use strict";
@@ -237,19 +231,19 @@ const styles = aphrodite__WEBPACK_IMPORTED_MODULE_1__["StyleSheet"].create({
237
231
  });
238
232
 
239
233
  /***/ }),
240
- /* 9 */
234
+ /* 8 */
241
235
  /***/ (function(module, exports) {
242
236
 
243
237
  module.exports = require("react-dom");
244
238
 
245
239
  /***/ }),
246
- /* 10 */
240
+ /* 9 */
247
241
  /***/ (function(module, exports) {
248
242
 
249
- module.exports = require("@khanacademy/wonder-blocks-clickable");
243
+ module.exports = require("@khanacademy/wonder-blocks-typography");
250
244
 
251
245
  /***/ }),
252
- /* 11 */
246
+ /* 10 */
253
247
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
254
248
 
255
249
  "use strict";
@@ -258,11 +252,11 @@ module.exports = require("@khanacademy/wonder-blocks-clickable");
258
252
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
259
253
  /* harmony import */ var aphrodite__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4);
260
254
  /* harmony import */ var aphrodite__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(aphrodite__WEBPACK_IMPORTED_MODULE_1__);
261
- /* harmony import */ var _khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7);
255
+ /* harmony import */ var _khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9);
262
256
  /* harmony import */ var _khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_2__);
263
257
  /* harmony import */ var _khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(5);
264
258
  /* harmony import */ var _khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_3__);
265
- /* harmony import */ var _khanacademy_wonder_blocks_icon_button__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(30);
259
+ /* harmony import */ var _khanacademy_wonder_blocks_icon_button__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(28);
266
260
  /* harmony import */ var _khanacademy_wonder_blocks_icon_button__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_icon_button__WEBPACK_IMPORTED_MODULE_4__);
267
261
  /* harmony import */ var _khanacademy_wonder_blocks_icon__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(6);
268
262
  /* harmony import */ var _khanacademy_wonder_blocks_icon__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_icon__WEBPACK_IMPORTED_MODULE_5__);
@@ -441,6 +435,12 @@ const styles = aphrodite__WEBPACK_IMPORTED_MODULE_1__["StyleSheet"].create({
441
435
  }
442
436
  });
443
437
 
438
+ /***/ }),
439
+ /* 11 */
440
+ /***/ (function(module, exports) {
441
+
442
+ module.exports = require("@khanacademy/wonder-blocks-clickable");
443
+
444
444
  /***/ }),
445
445
  /* 12 */
446
446
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
@@ -459,9 +459,9 @@ const styles = aphrodite__WEBPACK_IMPORTED_MODULE_1__["StyleSheet"].create({
459
459
  /* harmony import */ var _khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_4__);
460
460
  /* harmony import */ var _khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(3);
461
461
  /* harmony import */ var _khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_5__);
462
- /* harmony import */ var _khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(7);
462
+ /* harmony import */ var _khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(9);
463
463
  /* harmony import */ var _khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_6__);
464
- /* harmony import */ var _khanacademy_wonder_blocks_clickable__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(10);
464
+ /* harmony import */ var _khanacademy_wonder_blocks_clickable__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(11);
465
465
  /* harmony import */ var _khanacademy_wonder_blocks_clickable__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_clickable__WEBPACK_IMPORTED_MODULE_7__);
466
466
  /* harmony import */ var _khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(5);
467
467
  /* harmony import */ var _khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_8__);
@@ -623,11 +623,11 @@ const styles = aphrodite__WEBPACK_IMPORTED_MODULE_1__["StyleSheet"].create({
623
623
  /* harmony import */ var _khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_2__);
624
624
  /* harmony import */ var _khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(3);
625
625
  /* harmony import */ var _khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_3__);
626
- /* harmony import */ var _khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(7);
626
+ /* harmony import */ var _khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(9);
627
627
  /* harmony import */ var _khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_4__);
628
628
  /* harmony import */ var _khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(5);
629
629
  /* harmony import */ var _khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_5__);
630
- /* harmony import */ var _khanacademy_wonder_blocks_clickable__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(10);
630
+ /* harmony import */ var _khanacademy_wonder_blocks_clickable__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(11);
631
631
  /* harmony import */ var _khanacademy_wonder_blocks_clickable__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_clickable__WEBPACK_IMPORTED_MODULE_6__);
632
632
  /* harmony import */ var _util_constants_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(2);
633
633
  /* harmony import */ var _check_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(24);
@@ -791,7 +791,7 @@ const styles = aphrodite__WEBPACK_IMPORTED_MODULE_1__["StyleSheet"].create({
791
791
  "use strict";
792
792
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
793
793
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
794
- /* harmony import */ var _khanacademy_wonder_blocks_clickable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(10);
794
+ /* harmony import */ var _khanacademy_wonder_blocks_clickable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11);
795
795
  /* harmony import */ var _khanacademy_wonder_blocks_clickable__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_clickable__WEBPACK_IMPORTED_MODULE_1__);
796
796
 
797
797
 
@@ -852,30 +852,27 @@ DropdownOpener.defaultProps = {
852
852
  "use strict";
853
853
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
854
854
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
855
- /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9);
855
+ /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8);
856
856
  /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);
857
- /* harmony import */ var react_popper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(26);
858
- /* harmony import */ var react_popper__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_popper__WEBPACK_IMPORTED_MODULE_2__);
859
- /* harmony import */ var aphrodite__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4);
860
- /* harmony import */ var aphrodite__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(aphrodite__WEBPACK_IMPORTED_MODULE_3__);
861
- /* harmony import */ var react_window__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(19);
862
- /* harmony import */ var react_window__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(react_window__WEBPACK_IMPORTED_MODULE_4__);
863
- /* harmony import */ var _khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(1);
864
- /* harmony import */ var _khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_5__);
865
- /* harmony import */ var _khanacademy_wonder_blocks_modal__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(27);
866
- /* harmony import */ var _khanacademy_wonder_blocks_modal__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_modal__WEBPACK_IMPORTED_MODULE_6__);
867
- /* harmony import */ var _khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(3);
868
- /* harmony import */ var _khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_7__);
869
- /* harmony import */ var _khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(5);
870
- /* harmony import */ var _khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_8__);
871
- /* harmony import */ var _khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(7);
872
- /* harmony import */ var _khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_9__);
873
- /* harmony import */ var _khanacademy_wonder_blocks_timing__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(17);
874
- /* harmony import */ var _khanacademy_wonder_blocks_timing__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_timing__WEBPACK_IMPORTED_MODULE_10__);
875
- /* harmony import */ var _dropdown_core_virtualized_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(28);
876
- /* harmony import */ var _separator_item_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(8);
877
- /* harmony import */ var _search_text_input_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(11);
878
- /* harmony import */ var _util_constants_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(2);
857
+ /* harmony import */ var aphrodite__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4);
858
+ /* harmony import */ var aphrodite__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(aphrodite__WEBPACK_IMPORTED_MODULE_2__);
859
+ /* harmony import */ var react_window__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(19);
860
+ /* harmony import */ var react_window__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_window__WEBPACK_IMPORTED_MODULE_3__);
861
+ /* harmony import */ var _khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(1);
862
+ /* harmony import */ var _khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_4__);
863
+ /* harmony import */ var _khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(3);
864
+ /* harmony import */ var _khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_5__);
865
+ /* harmony import */ var _khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(5);
866
+ /* harmony import */ var _khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_6__);
867
+ /* harmony import */ var _khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(9);
868
+ /* harmony import */ var _khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_7__);
869
+ /* harmony import */ var _khanacademy_wonder_blocks_timing__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(17);
870
+ /* harmony import */ var _khanacademy_wonder_blocks_timing__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_timing__WEBPACK_IMPORTED_MODULE_8__);
871
+ /* harmony import */ var _dropdown_core_virtualized_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(26);
872
+ /* harmony import */ var _separator_item_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(7);
873
+ /* harmony import */ var _search_text_input_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(10);
874
+ /* harmony import */ var _util_constants_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(2);
875
+ /* harmony import */ var _dropdown_popper_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(29);
879
876
  // A menu that consists of action items
880
877
 
881
878
 
@@ -891,7 +888,18 @@ DropdownOpener.defaultProps = {
891
888
 
892
889
 
893
890
 
891
+ /**
892
+ * The number of options to apply the virtualized list to.
893
+ *
894
+ * NOTE: The threshold is defined taking into account performance
895
+ * implications (e.g. process input events for users should not be longer
896
+ * than 100ms).
897
+ * @see https://web.dev/rail/?utm_source=devtools#goals-and-guidelines
898
+ *
899
+ * TODO(juan, WB-1263): Improve performance by refactoring this component.
900
+ */
894
901
 
902
+ const VIRTUALIZE_THRESHOLD = 125;
895
903
 
896
904
  /**
897
905
  * A core dropdown component that takes an opener and children to display as
@@ -977,7 +985,7 @@ class DropdownCore extends react__WEBPACK_IMPORTED_MODULE_0__["Component"] {
977
985
  const keyCode = event.which || event.keyCode; // If menu isn't open and user presses down, open the menu
978
986
 
979
987
  if (!open) {
980
- if (keyCode === _util_constants_js__WEBPACK_IMPORTED_MODULE_14__[/* keyCodes */ "f"].down) {
988
+ if (keyCode === _util_constants_js__WEBPACK_IMPORTED_MODULE_12__[/* keyCodes */ "f"].down) {
981
989
  event.preventDefault();
982
990
  onOpenChanged(true);
983
991
  return;
@@ -988,7 +996,7 @@ class DropdownCore extends react__WEBPACK_IMPORTED_MODULE_0__["Component"] {
988
996
 
989
997
 
990
998
  switch (keyCode) {
991
- case _util_constants_js__WEBPACK_IMPORTED_MODULE_14__[/* keyCodes */ "f"].tab:
999
+ case _util_constants_js__WEBPACK_IMPORTED_MODULE_12__[/* keyCodes */ "f"].tab:
992
1000
  // When we show SearchTextInput and that is focused and the
993
1001
  // searchText is entered at least one character, dismiss button
994
1002
  // is displayed. When user presses tab, we should move focus
@@ -1001,7 +1009,7 @@ class DropdownCore extends react__WEBPACK_IMPORTED_MODULE_0__["Component"] {
1001
1009
  onOpenChanged(false);
1002
1010
  return;
1003
1011
 
1004
- case _util_constants_js__WEBPACK_IMPORTED_MODULE_14__[/* keyCodes */ "f"].space:
1012
+ case _util_constants_js__WEBPACK_IMPORTED_MODULE_12__[/* keyCodes */ "f"].space:
1005
1013
  // When we display SearchTextInput and the focus is on it,
1006
1014
  // we should let the user type space.
1007
1015
  if (this.hasSearchBox() && this.focusedIndex === 0) {
@@ -1012,12 +1020,12 @@ class DropdownCore extends react__WEBPACK_IMPORTED_MODULE_0__["Component"] {
1012
1020
  event.preventDefault();
1013
1021
  return;
1014
1022
 
1015
- case _util_constants_js__WEBPACK_IMPORTED_MODULE_14__[/* keyCodes */ "f"].up:
1023
+ case _util_constants_js__WEBPACK_IMPORTED_MODULE_12__[/* keyCodes */ "f"].up:
1016
1024
  event.preventDefault();
1017
1025
  this.focusPreviousItem();
1018
1026
  return;
1019
1027
 
1020
- case _util_constants_js__WEBPACK_IMPORTED_MODULE_14__[/* keyCodes */ "f"].down:
1028
+ case _util_constants_js__WEBPACK_IMPORTED_MODULE_12__[/* keyCodes */ "f"].down:
1021
1029
  event.preventDefault();
1022
1030
  this.focusNextItem();
1023
1031
  return;
@@ -1032,7 +1040,7 @@ class DropdownCore extends react__WEBPACK_IMPORTED_MODULE_0__["Component"] {
1032
1040
  const keyCode = event.which || event.keyCode;
1033
1041
 
1034
1042
  switch (keyCode) {
1035
- case _util_constants_js__WEBPACK_IMPORTED_MODULE_14__[/* keyCodes */ "f"].space:
1043
+ case _util_constants_js__WEBPACK_IMPORTED_MODULE_12__[/* keyCodes */ "f"].space:
1036
1044
  // When we display SearchTextInput and the focus is on it,
1037
1045
  // we should let the user type space.
1038
1046
  if (this.hasSearchBox() && this.focusedIndex === 0) {
@@ -1043,7 +1051,7 @@ class DropdownCore extends react__WEBPACK_IMPORTED_MODULE_0__["Component"] {
1043
1051
  event.preventDefault();
1044
1052
  return;
1045
1053
 
1046
- case _util_constants_js__WEBPACK_IMPORTED_MODULE_14__[/* keyCodes */ "f"].escape:
1054
+ case _util_constants_js__WEBPACK_IMPORTED_MODULE_12__[/* keyCodes */ "f"].escape:
1047
1055
  // Close only the dropdown, not other elements that are
1048
1056
  // listening for an escape press
1049
1057
  if (open) {
@@ -1074,17 +1082,29 @@ class DropdownCore extends react__WEBPACK_IMPORTED_MODULE_0__["Component"] {
1074
1082
  }
1075
1083
  };
1076
1084
 
1085
+ this.handleItemClick = (focusIndex, item) => {
1086
+ this.handleClickFocus(focusIndex);
1087
+
1088
+ if (item.component.props.onClick) {
1089
+ item.component.props.onClick();
1090
+ }
1091
+
1092
+ if (item.populatedProps.onClick) {
1093
+ item.populatedProps.onClick();
1094
+ }
1095
+ };
1096
+
1077
1097
  this.resetFocusedIndex();
1078
1098
  this.state = {
1079
1099
  prevItems: this.props.items,
1080
1100
  itemRefs: [],
1081
1101
  sameItemsFocusable: false,
1082
1102
  labels: {
1083
- noResults: _util_constants_js__WEBPACK_IMPORTED_MODULE_14__[/* defaultLabels */ "d"].noResults,
1103
+ noResults: _util_constants_js__WEBPACK_IMPORTED_MODULE_12__[/* defaultLabels */ "d"].noResults,
1084
1104
  ...props.labels
1085
1105
  }
1086
1106
  };
1087
- this.listRef = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__["createRef"]();
1107
+ this.virtualizedListRef = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__["createRef"]();
1088
1108
  }
1089
1109
 
1090
1110
  componentDidMount() {
@@ -1210,8 +1230,13 @@ class DropdownCore extends react__WEBPACK_IMPORTED_MODULE_0__["Component"] {
1210
1230
  }
1211
1231
 
1212
1232
  scheduleToFocusCurrentItem() {
1213
- // wait for windowed items to be recalculated
1214
- this.props.schedule.animationFrame(() => this.focusCurrentItem());
1233
+ if (this.shouldVirtualizeList()) {
1234
+ // wait for windowed items to be recalculated
1235
+ this.props.schedule.animationFrame(() => this.focusCurrentItem());
1236
+ } else {
1237
+ // immediately focus the current item if we're not virtualizing
1238
+ this.focusCurrentItem();
1239
+ }
1215
1240
  }
1216
1241
 
1217
1242
  focusCurrentItem() {
@@ -1219,12 +1244,12 @@ class DropdownCore extends react__WEBPACK_IMPORTED_MODULE_0__["Component"] {
1219
1244
 
1220
1245
  if (fousedItemRef) {
1221
1246
  // force react-window to scroll to ensure the focused item is visible
1222
- if (this.listRef.current) {
1247
+ if (this.virtualizedListRef.current) {
1223
1248
  // Our focused index does not include disabled items, but the
1224
1249
  // react-window index system does include the disabled items
1225
1250
  // in the count. So we need to use "originalIndex", which
1226
1251
  // does account for disabled items.
1227
- this.listRef.current.scrollToItem(fousedItemRef.originalIndex);
1252
+ this.virtualizedListRef.current.scrollToItem(fousedItemRef.originalIndex);
1228
1253
  }
1229
1254
 
1230
1255
  const node = react_dom__WEBPACK_IMPORTED_MODULE_1___default.a.findDOMNode(fousedItemRef.ref.current);
@@ -1300,7 +1325,7 @@ class DropdownCore extends react__WEBPACK_IMPORTED_MODULE_0__["Component"] {
1300
1325
  const numResults = items.length - includeSearchCount;
1301
1326
 
1302
1327
  if (numResults === 0) {
1303
- return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__["createElement"](_khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_9__["LabelMedium"], {
1328
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__["createElement"](_khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_7__["LabelMedium"], {
1304
1329
  style: styles.noResult,
1305
1330
  testId: "dropdown-core-no-results"
1306
1331
  }, noResults);
@@ -1308,23 +1333,96 @@ class DropdownCore extends react__WEBPACK_IMPORTED_MODULE_0__["Component"] {
1308
1333
 
1309
1334
  return null;
1310
1335
  }
1336
+ /**
1337
+ * Handles click events for each item in the dropdown.
1338
+ */
1339
+
1340
+
1341
+ /**
1342
+ * Determines which rendering strategy we are going to apply to the options
1343
+ * list.
1344
+ */
1345
+ shouldVirtualizeList() {
1346
+ // Verify if the list is long enough to be virtualized (passes the
1347
+ // threshold).
1348
+ return this.props.items.length > VIRTUALIZE_THRESHOLD;
1349
+ }
1350
+ /**
1351
+ * Renders the non-virtualized list of items.
1352
+ */
1353
+
1354
+
1355
+ renderList() {
1356
+ let focusCounter = 0;
1357
+ const itemRole = this.getItemRole(); // if we don't need to virtualize, we can render the list directly
1358
+
1359
+ return this.props.items.map((item, index) => {
1360
+ if (_separator_item_js__WEBPACK_IMPORTED_MODULE_10__[/* default */ "a"].isClassOf(item.component)) {
1361
+ return item.component;
1362
+ }
1363
+
1364
+ const {
1365
+ component,
1366
+ focusable,
1367
+ populatedProps
1368
+ } = item;
1369
+
1370
+ if (focusable) {
1371
+ focusCounter += 1;
1372
+ }
1373
+
1374
+ const focusIndex = focusCounter - 1; // The reference to the item is used to restore focus.
1375
+
1376
+ const currentRef = this.state.itemRefs[focusIndex] ? this.state.itemRefs[focusIndex].ref : null; // Render the SearchField component.
1377
+
1378
+ if (_search_text_input_js__WEBPACK_IMPORTED_MODULE_11__[/* default */ "a"].isClassOf(component)) {
1379
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__["cloneElement"](component, { ...populatedProps,
1380
+ key: "search-text-input",
1381
+ // pass the current ref down to the input element
1382
+ itemRef: currentRef,
1383
+ // override to avoid losing focus when pressing a key
1384
+ onClick: () => {
1385
+ this.handleClickFocus(0);
1386
+ this.focusCurrentItem();
1387
+ },
1388
+ // apply custom styles
1389
+ style: _util_constants_js__WEBPACK_IMPORTED_MODULE_12__[/* searchInputStyle */ "g"]
1390
+ });
1391
+ } // Render OptionItem and/or ActionItem elements.
1392
+
1393
+
1394
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__["cloneElement"](component, { ...populatedProps,
1395
+ key: index,
1396
+ onClick: () => {
1397
+ this.handleItemClick(focusIndex, item);
1398
+ },
1399
+ // Only pass the ref if the item is focusable.
1400
+ ref: focusable ? currentRef : null,
1401
+ role: itemRole
1402
+ });
1403
+ });
1404
+ }
1311
1405
  /**
1312
1406
  * Process the items and wrap them into an array that react-window can
1313
- * interpret
1407
+ * interpret.
1408
+ *
1409
+ * NOTE: The main difference with the collection in renderList() is that we
1410
+ * massage the items to be able to clone them later in
1411
+ * DropdownVirtualizedItem, where as renderList() clones the items directly.
1314
1412
  */
1315
1413
 
1316
1414
 
1317
- parseItemsList() {
1415
+ parseVirtualizedItems() {
1318
1416
  let focusCounter = 0;
1319
1417
  const itemRole = this.getItemRole();
1320
1418
  return this.props.items.map((item, index) => {
1321
- if (!_separator_item_js__WEBPACK_IMPORTED_MODULE_12__[/* default */ "a"].isClassOf(item.component) && item.focusable) {
1419
+ if (!_separator_item_js__WEBPACK_IMPORTED_MODULE_10__[/* default */ "a"].isClassOf(item.component) && item.focusable) {
1322
1420
  focusCounter += 1;
1323
1421
  }
1324
1422
 
1325
1423
  const focusIndex = focusCounter - 1;
1326
1424
 
1327
- if (_search_text_input_js__WEBPACK_IMPORTED_MODULE_13__[/* default */ "a"].isClassOf(item.component)) {
1425
+ if (_search_text_input_js__WEBPACK_IMPORTED_MODULE_11__[/* default */ "a"].isClassOf(item.component)) {
1328
1426
  return { ...item,
1329
1427
  // override to avoid losing focus when pressing a key
1330
1428
  onClick: () => {
@@ -1332,7 +1430,7 @@ class DropdownCore extends react__WEBPACK_IMPORTED_MODULE_0__["Component"] {
1332
1430
  this.focusCurrentItem();
1333
1431
  },
1334
1432
  populatedProps: {
1335
- style: _util_constants_js__WEBPACK_IMPORTED_MODULE_14__[/* searchInputStyle */ "g"],
1433
+ style: _util_constants_js__WEBPACK_IMPORTED_MODULE_12__[/* searchInputStyle */ "g"],
1336
1434
  // pass the current ref down to the input element
1337
1435
  itemRef: this.state.itemRefs[focusIndex] ? this.state.itemRefs[focusIndex].ref : null
1338
1436
  }
@@ -1343,21 +1441,26 @@ class DropdownCore extends react__WEBPACK_IMPORTED_MODULE_0__["Component"] {
1343
1441
  role: itemRole,
1344
1442
  ref: item.focusable ? this.state.itemRefs[focusIndex] ? this.state.itemRefs[focusIndex].ref : null : null,
1345
1443
  onClick: () => {
1346
- this.handleClickFocus(focusIndex);
1347
-
1348
- if (item.component.props.onClick) {
1349
- item.component.props.onClick();
1350
- }
1351
-
1352
- if (item.populatedProps.onClick) {
1353
- item.populatedProps.onClick();
1354
- }
1444
+ this.handleItemClick(focusIndex, item);
1355
1445
  }
1356
1446
  };
1357
1447
  });
1358
1448
  }
1449
+ /**
1450
+ * Render the items using a virtualized list
1451
+ */
1452
+
1453
+
1454
+ renderVirtualizedList() {
1455
+ // preprocess items data to pass it to the renderer
1456
+ const virtualizedItems = this.parseVirtualizedItems();
1457
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__["createElement"](_dropdown_core_virtualized_js__WEBPACK_IMPORTED_MODULE_9__[/* default */ "a"], {
1458
+ data: virtualizedItems,
1459
+ listRef: this.virtualizedListRef
1460
+ });
1461
+ }
1359
1462
 
1360
- renderItems(isReferenceHidden) {
1463
+ renderDropdownMenu(listRenderer, isReferenceHidden) {
1361
1464
  const {
1362
1465
  dropdownStyle,
1363
1466
  light,
@@ -1366,10 +1469,8 @@ class DropdownCore extends react__WEBPACK_IMPORTED_MODULE_0__["Component"] {
1366
1469
  // It's only used if the element exists in the DOM
1367
1470
 
1368
1471
  const openerStyle = openerElement && window.getComputedStyle(openerElement);
1369
- const minDropdownWidth = openerStyle ? openerStyle.getPropertyValue("width") : 0; // preprocess items data to pass it to the renderer
1370
-
1371
- const itemsList = this.parseItemsList();
1372
- return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__["createElement"](_khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_8__["View"] // Stop propagation to prevent the mouseup listener on the
1472
+ const minDropdownWidth = openerStyle ? openerStyle.getPropertyValue("width") : 0;
1473
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__["createElement"](_khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_6__["View"] // Stop propagation to prevent the mouseup listener on the
1373
1474
  // document from closing the menu.
1374
1475
  , {
1375
1476
  onMouseUp: this.handleDropdownMouseUp,
@@ -1377,68 +1478,27 @@ class DropdownCore extends react__WEBPACK_IMPORTED_MODULE_0__["Component"] {
1377
1478
  style: [styles.dropdown, light && styles.light, isReferenceHidden && styles.hidden, {
1378
1479
  minWidth: minDropdownWidth
1379
1480
  }, dropdownStyle]
1380
- }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__["createElement"](_dropdown_core_virtualized_js__WEBPACK_IMPORTED_MODULE_11__[/* default */ "a"], {
1381
- data: itemsList,
1382
- listRef: this.listRef
1383
- }), this.maybeRenderNoResults());
1481
+ }, listRenderer, this.maybeRenderNoResults());
1384
1482
  }
1385
1483
 
1386
1484
  renderDropdown() {
1387
1485
  const {
1388
1486
  alignment,
1389
1487
  openerElement
1390
- } = this.props; // If we are in a modal, we find where we should be portalling the menu
1391
- // by using the helper function from the modal package on the opener
1392
- // element.
1393
- // If we are not in a modal, we use body as the location to portal to.
1394
-
1395
- const modalHost = Object(_khanacademy_wonder_blocks_modal__WEBPACK_IMPORTED_MODULE_6__["maybeGetPortalMountedModalHostElement"])(openerElement) || document.querySelector("body");
1396
-
1397
- if (modalHost) {
1398
- return /*#__PURE__*/react_dom__WEBPACK_IMPORTED_MODULE_1___default.a.createPortal( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__["createElement"](react_popper__WEBPACK_IMPORTED_MODULE_2__["Popper"], {
1399
- innerRef: node => {
1400
- if (node) {
1401
- this.popperElement = node;
1402
- }
1403
- },
1404
- referenceElement: this.props.openerElement,
1405
- strategy: "fixed",
1406
- placement: alignment === "left" ? "bottom-start" : "bottom-end",
1407
- modifiers: [{
1408
- name: "preventOverflow",
1409
- options: {
1410
- rootBoundary: "viewport",
1411
- // Allows to overlap the popper in case there's
1412
- // no more vertical room in the viewport.
1413
- altAxis: true,
1414
- // Also needed to make sure the Popper will be
1415
- // displayed correctly in different contexts
1416
- // (e.g inside a Modal)
1417
- tether: false
1418
- }
1419
- }]
1420
- }, ({
1421
- placement,
1422
- ref,
1423
- style,
1424
- hasPopperEscaped,
1425
- isReferenceHidden
1426
- }) => {
1427
- // For some reason react-popper includes `pointerEvents: "none"`
1428
- // in the `style` it passes to us, but only when running the tests.
1429
- const {
1430
- pointerEvents: _,
1431
- ...restStyle
1432
- } = style;
1433
- return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__["createElement"]("div", {
1434
- ref: ref,
1435
- style: restStyle,
1436
- "data-placement": placement
1437
- }, this.renderItems(hasPopperEscaped || isReferenceHidden));
1438
- }), modalHost);
1439
- }
1440
-
1441
- return null;
1488
+ } = this.props; // Preprocess the items that are used inside the Popper instance. By
1489
+ // doing this, we optimize the list to be processed only one time
1490
+ // instead of every time popper changes.
1491
+ // NOTE: This improves the performance impact of the dropdown by
1492
+ // reducing the execution time up to 2.5X.
1493
+
1494
+ const listRenderer = this.shouldVirtualizeList() ? this.renderVirtualizedList() : this.renderList();
1495
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__["createElement"](_dropdown_popper_js__WEBPACK_IMPORTED_MODULE_13__[/* default */ "a"], {
1496
+ alignment: alignment,
1497
+ onPopperElement: popperElement => {
1498
+ this.popperElement = popperElement;
1499
+ },
1500
+ referenceElement: openerElement
1501
+ }, isReferenceHidden => this.renderDropdownMenu(listRenderer, isReferenceHidden));
1442
1502
  }
1443
1503
 
1444
1504
  render() {
@@ -1448,7 +1508,7 @@ class DropdownCore extends react__WEBPACK_IMPORTED_MODULE_0__["Component"] {
1448
1508
  style,
1449
1509
  className
1450
1510
  } = this.props;
1451
- return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__["createElement"](_khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_8__["View"], {
1511
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__["createElement"](_khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_6__["View"], {
1452
1512
  onKeyDown: this.handleKeyDown,
1453
1513
  onKeyUp: this.handleKeyUp,
1454
1514
  style: [styles.menuWrapper, style],
@@ -1461,21 +1521,21 @@ class DropdownCore extends react__WEBPACK_IMPORTED_MODULE_0__["Component"] {
1461
1521
  DropdownCore.defaultProps = {
1462
1522
  alignment: "left",
1463
1523
  labels: {
1464
- noResults: _util_constants_js__WEBPACK_IMPORTED_MODULE_14__[/* defaultLabels */ "d"].noResults
1524
+ noResults: _util_constants_js__WEBPACK_IMPORTED_MODULE_12__[/* defaultLabels */ "d"].noResults
1465
1525
  },
1466
1526
  light: false
1467
1527
  };
1468
- const styles = aphrodite__WEBPACK_IMPORTED_MODULE_3__["StyleSheet"].create({
1528
+ const styles = aphrodite__WEBPACK_IMPORTED_MODULE_2__["StyleSheet"].create({
1469
1529
  menuWrapper: {
1470
1530
  width: "fit-content"
1471
1531
  },
1472
1532
  dropdown: {
1473
- backgroundColor: _khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_5___default.a.white,
1533
+ backgroundColor: _khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_4___default.a.white,
1474
1534
  borderRadius: 4,
1475
- paddingTop: _khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_7___default.a.xxxSmall_4,
1476
- paddingBottom: _khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_7___default.a.xxxSmall_4,
1477
- border: `solid 1px ${_khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_5___default.a.offBlack16}`,
1478
- boxShadow: `0px 8px 8px 0px ${Object(_khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_5__["fade"])(_khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_5___default.a.offBlack, 0.1)}`,
1535
+ paddingTop: _khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_5___default.a.xxxSmall_4,
1536
+ paddingBottom: _khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_5___default.a.xxxSmall_4,
1537
+ border: `solid 1px ${_khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_4___default.a.offBlack16}`,
1538
+ boxShadow: `0px 8px 8px 0px ${Object(_khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_4__["fade"])(_khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_4___default.a.offBlack, 0.1)}`,
1479
1539
  overflowY: "auto"
1480
1540
  },
1481
1541
  light: {
@@ -1487,12 +1547,12 @@ const styles = aphrodite__WEBPACK_IMPORTED_MODULE_3__["StyleSheet"].create({
1487
1547
  visibility: "hidden"
1488
1548
  },
1489
1549
  noResult: {
1490
- color: _khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_5___default.a.offBlack64,
1550
+ color: _khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_4___default.a.offBlack64,
1491
1551
  alignSelf: "center",
1492
- marginTop: _khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_7___default.a.xxSmall_6
1552
+ marginTop: _khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_5___default.a.xxSmall_6
1493
1553
  }
1494
1554
  });
1495
- /* harmony default export */ __webpack_exports__["a"] = (Object(_khanacademy_wonder_blocks_timing__WEBPACK_IMPORTED_MODULE_10__["withActionScheduler"])(DropdownCore));
1555
+ /* harmony default export */ __webpack_exports__["a"] = (Object(_khanacademy_wonder_blocks_timing__WEBPACK_IMPORTED_MODULE_8__["withActionScheduler"])(DropdownCore));
1496
1556
 
1497
1557
  /***/ }),
1498
1558
  /* 16 */
@@ -1522,13 +1582,13 @@ module.exports = require("@khanacademy/wonder-blocks-timing");
1522
1582
  /* harmony import */ var _khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_3__);
1523
1583
  /* harmony import */ var _khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(5);
1524
1584
  /* harmony import */ var _khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_core__WEBPACK_IMPORTED_MODULE_4__);
1525
- /* harmony import */ var _khanacademy_wonder_blocks_clickable__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(10);
1585
+ /* harmony import */ var _khanacademy_wonder_blocks_clickable__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(11);
1526
1586
  /* harmony import */ var _khanacademy_wonder_blocks_clickable__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_clickable__WEBPACK_IMPORTED_MODULE_5__);
1527
1587
  /* harmony import */ var _khanacademy_wonder_blocks_icon__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(6);
1528
1588
  /* harmony import */ var _khanacademy_wonder_blocks_icon__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_icon__WEBPACK_IMPORTED_MODULE_6__);
1529
1589
  /* harmony import */ var _khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(3);
1530
1590
  /* harmony import */ var _khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_7__);
1531
- /* harmony import */ var _khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(7);
1591
+ /* harmony import */ var _khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(9);
1532
1592
  /* harmony import */ var _khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_8__);
1533
1593
  /* harmony import */ var _util_constants_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(2);
1534
1594
  function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
@@ -1758,7 +1818,7 @@ module.exports = require("react-window");
1758
1818
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return ActionMenu; });
1759
1819
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
1760
1820
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
1761
- /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9);
1821
+ /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8);
1762
1822
  /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);
1763
1823
  /* harmony import */ var aphrodite__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4);
1764
1824
  /* harmony import */ var aphrodite__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(aphrodite__WEBPACK_IMPORTED_MODULE_2__);
@@ -1766,7 +1826,7 @@ module.exports = require("react-window");
1766
1826
  /* harmony import */ var _action_item_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(12);
1767
1827
  /* harmony import */ var _option_item_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(13);
1768
1828
  /* harmony import */ var _dropdown_core_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(15);
1769
- /* harmony import */ var _action_menu_opener_core_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(31);
1829
+ /* harmony import */ var _action_menu_opener_core_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(32);
1770
1830
  function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
1771
1831
 
1772
1832
 
@@ -1972,13 +2032,13 @@ const styles = aphrodite__WEBPACK_IMPORTED_MODULE_2__["StyleSheet"].create({
1972
2032
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return SingleSelect; });
1973
2033
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
1974
2034
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
1975
- /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9);
2035
+ /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8);
1976
2036
  /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);
1977
2037
  /* harmony import */ var _dropdown_core_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(15);
1978
2038
  /* harmony import */ var _dropdown_opener_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(14);
1979
2039
  /* harmony import */ var _select_opener_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(18);
1980
2040
  /* harmony import */ var _util_constants_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(2);
1981
- /* harmony import */ var _search_text_input_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(11);
2041
+ /* harmony import */ var _search_text_input_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(10);
1982
2042
  function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
1983
2043
 
1984
2044
 
@@ -2248,14 +2308,14 @@ SingleSelect.defaultProps = {
2248
2308
  /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return MultiSelect; });
2249
2309
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
2250
2310
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
2251
- /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9);
2311
+ /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8);
2252
2312
  /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);
2253
2313
  /* harmony import */ var _action_item_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(12);
2254
2314
  /* harmony import */ var _dropdown_core_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(15);
2255
2315
  /* harmony import */ var _dropdown_opener_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(14);
2256
- /* harmony import */ var _search_text_input_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(11);
2316
+ /* harmony import */ var _search_text_input_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(10);
2257
2317
  /* harmony import */ var _select_opener_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(18);
2258
- /* harmony import */ var _separator_item_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(8);
2318
+ /* harmony import */ var _separator_item_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(7);
2259
2319
  /* harmony import */ var _util_constants_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(2);
2260
2320
  function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2261
2321
 
@@ -2806,32 +2866,20 @@ const styles = aphrodite__WEBPACK_IMPORTED_MODULE_1__["StyleSheet"].create({
2806
2866
 
2807
2867
  /***/ }),
2808
2868
  /* 26 */
2809
- /***/ (function(module, exports) {
2810
-
2811
- module.exports = require("react-popper");
2812
-
2813
- /***/ }),
2814
- /* 27 */
2815
- /***/ (function(module, exports) {
2816
-
2817
- module.exports = require("@khanacademy/wonder-blocks-modal");
2818
-
2819
- /***/ }),
2820
- /* 28 */
2821
2869
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
2822
2870
 
2823
2871
  "use strict";
2824
2872
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
2825
2873
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
2826
- /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9);
2874
+ /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8);
2827
2875
  /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);
2828
2876
  /* harmony import */ var react_window__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(19);
2829
2877
  /* harmony import */ var react_window__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_window__WEBPACK_IMPORTED_MODULE_2__);
2830
2878
  /* harmony import */ var _khanacademy_wonder_blocks_timing__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(17);
2831
2879
  /* harmony import */ var _khanacademy_wonder_blocks_timing__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_timing__WEBPACK_IMPORTED_MODULE_3__);
2832
- /* harmony import */ var _dropdown_core_virtualized_item_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(29);
2833
- /* harmony import */ var _search_text_input_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(11);
2834
- /* harmony import */ var _separator_item_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(8);
2880
+ /* harmony import */ var _dropdown_core_virtualized_item_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(27);
2881
+ /* harmony import */ var _search_text_input_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(10);
2882
+ /* harmony import */ var _separator_item_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(7);
2835
2883
  /* harmony import */ var _util_constants_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(2);
2836
2884
 
2837
2885
 
@@ -3040,13 +3088,13 @@ class DropdownCoreVirtualized extends react__WEBPACK_IMPORTED_MODULE_0__["Compon
3040
3088
  /* harmony default export */ __webpack_exports__["a"] = (Object(_khanacademy_wonder_blocks_timing__WEBPACK_IMPORTED_MODULE_3__["withActionScheduler"])(DropdownCoreVirtualized));
3041
3089
 
3042
3090
  /***/ }),
3043
- /* 29 */
3091
+ /* 27 */
3044
3092
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
3045
3093
 
3046
3094
  "use strict";
3047
3095
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
3048
3096
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
3049
- /* harmony import */ var _separator_item_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8);
3097
+ /* harmony import */ var _separator_item_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(7);
3050
3098
 
3051
3099
 
3052
3100
 
@@ -3094,13 +3142,101 @@ class DropdownVirtualizedItem extends react__WEBPACK_IMPORTED_MODULE_0__["Compon
3094
3142
  /* harmony default export */ __webpack_exports__["a"] = (DropdownVirtualizedItem);
3095
3143
 
3096
3144
  /***/ }),
3097
- /* 30 */
3145
+ /* 28 */
3098
3146
  /***/ (function(module, exports) {
3099
3147
 
3100
3148
  module.exports = require("@khanacademy/wonder-blocks-icon-button");
3101
3149
 
3150
+ /***/ }),
3151
+ /* 29 */
3152
+ /***/ (function(module, __webpack_exports__, __webpack_require__) {
3153
+
3154
+ "use strict";
3155
+ /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return DropdownPopper; });
3156
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(0);
3157
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
3158
+ /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(8);
3159
+ /* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);
3160
+ /* harmony import */ var react_popper__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(30);
3161
+ /* harmony import */ var react_popper__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_popper__WEBPACK_IMPORTED_MODULE_2__);
3162
+ /* harmony import */ var _khanacademy_wonder_blocks_modal__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(31);
3163
+ /* harmony import */ var _khanacademy_wonder_blocks_modal__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_modal__WEBPACK_IMPORTED_MODULE_3__);
3164
+
3165
+
3166
+
3167
+
3168
+ const modifiers = [{
3169
+ name: "preventOverflow",
3170
+ options: {
3171
+ rootBoundary: "viewport",
3172
+ // Allows to overlap the popper in case there's no more vertical
3173
+ // room in the viewport.
3174
+ altAxis: true,
3175
+ // Also needed to make sure the Popper will be displayed correctly
3176
+ // in different contexts (e.g inside a Modal)
3177
+ tether: false
3178
+ }
3179
+ }];
3180
+
3181
+ /**
3182
+ * A wrapper for PopperJS that renders the children inside a portal.
3183
+ */
3184
+ function DropdownPopper({
3185
+ children,
3186
+ alignment = "left",
3187
+ onPopperElement,
3188
+ referenceElement
3189
+ }) {
3190
+ // If we are in a modal, we find where we should be portalling the menu by
3191
+ // using the helper function from the modal package on the opener element.
3192
+ // If we are not in a modal, we use body as the location to portal to.
3193
+ const modalHost = Object(_khanacademy_wonder_blocks_modal__WEBPACK_IMPORTED_MODULE_3__["maybeGetPortalMountedModalHostElement"])(referenceElement) || document.querySelector("body");
3194
+
3195
+ if (!modalHost) {
3196
+ return null;
3197
+ }
3198
+
3199
+ return /*#__PURE__*/react_dom__WEBPACK_IMPORTED_MODULE_1___default.a.createPortal( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__["createElement"](react_popper__WEBPACK_IMPORTED_MODULE_2__["Popper"], {
3200
+ innerRef: node => {
3201
+ if (node && onPopperElement) {
3202
+ onPopperElement(node);
3203
+ }
3204
+ },
3205
+ referenceElement: referenceElement,
3206
+ strategy: "fixed",
3207
+ placement: alignment === "left" ? "bottom-start" : "bottom-end",
3208
+ modifiers: modifiers
3209
+ }, ({
3210
+ placement,
3211
+ ref,
3212
+ style,
3213
+ hasPopperEscaped,
3214
+ isReferenceHidden
3215
+ }) => {
3216
+ const shouldHidePopper = !!(hasPopperEscaped || isReferenceHidden);
3217
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__["createElement"]("div", {
3218
+ ref: ref,
3219
+ style: style,
3220
+ "data-test-id": "dropdown-popper",
3221
+ "data-placement": placement
3222
+ }, children(shouldHidePopper));
3223
+ }), modalHost);
3224
+ }
3225
+
3226
+ /***/ }),
3227
+ /* 30 */
3228
+ /***/ (function(module, exports) {
3229
+
3230
+ module.exports = require("react-popper");
3231
+
3102
3232
  /***/ }),
3103
3233
  /* 31 */
3234
+ /***/ (function(module, exports) {
3235
+
3236
+ module.exports = require("@khanacademy/wonder-blocks-modal");
3237
+
3238
+ /***/ }),
3239
+ /* 32 */
3104
3240
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
3105
3241
 
3106
3242
  "use strict";
@@ -3109,7 +3245,7 @@ module.exports = require("@khanacademy/wonder-blocks-icon-button");
3109
3245
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
3110
3246
  /* harmony import */ var aphrodite__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(4);
3111
3247
  /* harmony import */ var aphrodite__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(aphrodite__WEBPACK_IMPORTED_MODULE_1__);
3112
- /* harmony import */ var _khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7);
3248
+ /* harmony import */ var _khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(9);
3113
3249
  /* harmony import */ var _khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_typography__WEBPACK_IMPORTED_MODULE_2__);
3114
3250
  /* harmony import */ var _khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(1);
3115
3251
  /* harmony import */ var _khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_color__WEBPACK_IMPORTED_MODULE_3__);
@@ -3119,7 +3255,7 @@ module.exports = require("@khanacademy/wonder-blocks-icon-button");
3119
3255
  /* harmony import */ var _khanacademy_wonder_blocks_icon__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_icon__WEBPACK_IMPORTED_MODULE_5__);
3120
3256
  /* harmony import */ var _khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(3);
3121
3257
  /* harmony import */ var _khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_spacing__WEBPACK_IMPORTED_MODULE_6__);
3122
- /* harmony import */ var _khanacademy_wonder_blocks_layout__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(32);
3258
+ /* harmony import */ var _khanacademy_wonder_blocks_layout__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(33);
3123
3259
  /* harmony import */ var _khanacademy_wonder_blocks_layout__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_khanacademy_wonder_blocks_layout__WEBPACK_IMPORTED_MODULE_7__);
3124
3260
  /* harmony import */ var _util_constants_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(2);
3125
3261
  function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
@@ -3275,13 +3411,13 @@ const _generateStyles = color => {
3275
3411
  };
3276
3412
 
3277
3413
  /***/ }),
3278
- /* 32 */
3414
+ /* 33 */
3279
3415
  /***/ (function(module, exports) {
3280
3416
 
3281
3417
  module.exports = require("@khanacademy/wonder-blocks-layout");
3282
3418
 
3283
3419
  /***/ }),
3284
- /* 33 */
3420
+ /* 34 */
3285
3421
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
3286
3422
 
3287
3423
  "use strict";
@@ -3292,7 +3428,7 @@ __webpack_require__.r(__webpack_exports__);
3292
3428
  /* harmony import */ var _components_option_item_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(13);
3293
3429
  /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "OptionItem", function() { return _components_option_item_js__WEBPACK_IMPORTED_MODULE_1__["a"]; });
3294
3430
 
3295
- /* harmony import */ var _components_separator_item_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(8);
3431
+ /* harmony import */ var _components_separator_item_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(7);
3296
3432
  /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SeparatorItem", function() { return _components_separator_item_js__WEBPACK_IMPORTED_MODULE_2__["a"]; });
3297
3433
 
3298
3434
  /* harmony import */ var _components_action_menu_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(20);