@entur/dropdown 5.0.0-beta.3 → 5.0.0-beta.4

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.
@@ -966,65 +966,7 @@ var Dropdown = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
966
966
  }, searchAbleProps))));
967
967
  });
968
968
 
969
- var _excluded$6 = ["className", "disabled", "readOnly", "items", "loadingText", "prepend", "style", "label", "variant", "feedback", "disableLabelAnimation"];
970
- var NativeDropdown = function NativeDropdown(_ref) {
971
- var className = _ref.className,
972
- _ref$disabled = _ref.disabled,
973
- disabled = _ref$disabled === void 0 ? false : _ref$disabled,
974
- _ref$readOnly = _ref.readOnly,
975
- readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
976
- items = _ref.items,
977
- loadingText = _ref.loadingText,
978
- prepend = _ref.prepend,
979
- style = _ref.style,
980
- label = _ref.label,
981
- variant = _ref.variant,
982
- feedback = _ref.feedback,
983
- disableLabelAnimation = _ref.disableLabelAnimation,
984
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$6);
985
- var _useResolvedItems = useResolvedItems(items),
986
- normalizedItems = _useResolvedItems.items,
987
- loading = _useResolvedItems.loading;
988
- var rightSideIcon = React.createElement(DownArrowIcon, {
989
- inline: true,
990
- "aria-hidden": "true"
991
- });
992
- if (disabled || readOnly) {
993
- rightSideIcon = null;
994
- } else if (loading) {
995
- rightSideIcon = React.createElement(DropdownLoadingDots, {
996
- "aria-hidden": "true"
997
- }, loadingText);
998
- }
999
- var nativeDropdownId = useRandomId('eds-native-dropdown');
1000
- return React.createElement(BaseFormControl, {
1001
- disabled: disabled,
1002
- readOnly: readOnly,
1003
- prepend: prepend,
1004
- append: rightSideIcon,
1005
- className: className,
1006
- style: style,
1007
- label: label,
1008
- labelId: nativeDropdownId,
1009
- variant: variant,
1010
- feedback: feedback,
1011
- disableLabelAnimation: disableLabelAnimation,
1012
- isFilled: true
1013
- }, React.createElement("select", _extends({
1014
- "aria-invalid": variant === 'error',
1015
- "aria-labelledby": nativeDropdownId,
1016
- "aria-busy": loading,
1017
- className: "eds-form-control eds-dropdown",
1018
- disabled: disabled || readOnly
1019
- }, rest), normalizedItems.map(function (item) {
1020
- return React.createElement("option", {
1021
- key: item.value,
1022
- value: item.value
1023
- }, item.label);
1024
- })));
1025
- };
1026
-
1027
- var _excluded$5 = ["className", "clearable", "debounceTimeout", "disabled", "feedback", "initialSelectedItems", "items", "itemsSelectedLabel", "label", "listStyle", "loading", "loadingText", "onChange", "openOnFocus", "readOnly", "style", "variant"];
969
+ var _excluded$6 = ["className", "clearable", "debounceTimeout", "disabled", "feedback", "initialSelectedItems", "items", "itemsSelectedLabel", "label", "listStyle", "loading", "loadingText", "onChange", "openOnFocus", "readOnly", "style", "variant"];
1028
970
  var MultiSelectContext = /*#__PURE__*/React.createContext(null);
1029
971
  var useMultiSelectContext = function useMultiSelectContext() {
1030
972
  var context = React.useContext(MultiSelectContext);
@@ -1039,8 +981,8 @@ actionAndChanges) {
1039
981
  var changes = actionAndChanges.changes,
1040
982
  type = actionAndChanges.type;
1041
983
  switch (type) {
1042
- case useSelect.stateChangeTypes.MenuKeyDownEnter:
1043
- case useSelect.stateChangeTypes.MenuKeyDownSpaceButton:
984
+ case useSelect.stateChangeTypes.ToggleButtonKeyDownEnter:
985
+ case useSelect.stateChangeTypes.ToggleButtonKeyDownSpaceButton:
1044
986
  case useSelect.stateChangeTypes.ItemClick:
1045
987
  return _extends({}, changes, {
1046
988
  isOpen: true,
@@ -1080,7 +1022,7 @@ var MultiSelect = function MultiSelect(_ref) {
1080
1022
  readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
1081
1023
  style = _ref.style,
1082
1024
  variant = _ref.variant,
1083
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$5);
1025
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$6);
1084
1026
  var _useResolvedItems = useResolvedItems(input, debounceTimeout),
1085
1027
  items = _useResolvedItems.items;
1086
1028
  var _useState = useState(initialSelectedItems),
@@ -1265,33 +1207,49 @@ function SelectedItemsLabel(items) {
1265
1207
  }).toString() : items.length + " elementer valgt";
1266
1208
  }
1267
1209
 
1268
- var _excluded$4 = ["selectedItems", "listItems", "inputValue", "isOpen", "getMenuProps", "getItemProps", "highlightedIndex", "showSelectAllInList", "loading", "selectAllCheckboxState", "selectAllItem", "listStyle", "noMatchesText", "loadingText", "selectedItemAriaLabel"];
1210
+ var _excluded$5 = ["ariaLabelSelectedItem", "getItemProps", "getMenuProps", "inputValue", "isOpen", "highlightedIndex", "listItems", "listStyle", "loading", "loadingText", "noMatchesText", "selectAllCheckboxState", "selectAllItem", "selectedItems", "showSelectAllInList"];
1269
1211
  var DropdownList = function DropdownList(_ref) {
1270
- var selectedItems = _ref.selectedItems,
1271
- listItems = _ref.listItems,
1272
- isOpen = _ref.isOpen,
1273
- getMenuProps = _ref.getMenuProps,
1212
+ var _ref$ariaLabelSelecte = _ref.ariaLabelSelectedItem,
1213
+ ariaLabelSelectedItem = _ref$ariaLabelSelecte === void 0 ? ', valgt element, trykk for å fjerne' : _ref$ariaLabelSelecte,
1274
1214
  getItemProps = _ref.getItemProps,
1215
+ getMenuProps = _ref.getMenuProps,
1216
+ isOpen = _ref.isOpen,
1275
1217
  highlightedIndex = _ref.highlightedIndex,
1218
+ listItems = _ref.listItems,
1219
+ listStyle = _ref.listStyle,
1276
1220
  _ref$loading = _ref.loading,
1277
1221
  loading = _ref$loading === void 0 ? false : _ref$loading,
1278
- selectAllCheckboxState = _ref.selectAllCheckboxState,
1279
- selectAllItem = _ref.selectAllItem,
1280
- listStyle = _ref.listStyle,
1281
- _ref$noMatchesText = _ref.noMatchesText,
1282
- noMatchesText = _ref$noMatchesText === void 0 ? 'Ingen treff for søket' : _ref$noMatchesText,
1283
1222
  _ref$loadingText = _ref.loadingText,
1284
1223
  loadingText = _ref$loadingText === void 0 ? 'Laster inn …' : _ref$loadingText,
1285
- _ref$selectedItemAria = _ref.selectedItemAriaLabel,
1286
- selectedItemAriaLabel = _ref$selectedItemAria === void 0 ? ', valgt element' : _ref$selectedItemAria,
1287
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$4);
1224
+ _ref$noMatchesText = _ref.noMatchesText,
1225
+ noMatchesText = _ref$noMatchesText === void 0 ? 'Ingen treff for søket' : _ref$noMatchesText,
1226
+ selectAllCheckboxState = _ref.selectAllCheckboxState,
1227
+ selectAllItem = _ref.selectAllItem,
1228
+ selectedItems = _ref.selectedItems,
1229
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$5);
1288
1230
  var isMultiselect = selectAllItem !== undefined;
1289
1231
  var isNoMatches = !loading && (listItems.length === 0 || listItems.length === 1 && listItems[0].value === (selectAllItem == null ? void 0 : selectAllItem.value));
1290
- var itemIsSelected = function itemIsSelected(item) {
1232
+ var isItemSelected = function isItemSelected(item) {
1291
1233
  return selectedItems.some(function (selectedItem) {
1292
1234
  return selectedItem.value === item.value;
1293
1235
  });
1294
1236
  };
1237
+ var ariaLabelSelectAll = function ariaLabelSelectAll() {
1238
+ switch (selectAllCheckboxState == null ? void 0 : selectAllCheckboxState()) {
1239
+ case 'indeterminate':
1240
+ {
1241
+ return (selectAllItem == null ? void 0 : selectAllItem.label) + ", delvis valgt";
1242
+ }
1243
+ case true:
1244
+ {
1245
+ return (selectAllItem == null ? void 0 : selectAllItem.label) + ", valgt";
1246
+ }
1247
+ default:
1248
+ {
1249
+ return "" + (selectAllItem == null ? void 0 : selectAllItem.label);
1250
+ }
1251
+ }
1252
+ };
1295
1253
  var selectAllListItemContent = function selectAllListItemContent() {
1296
1254
  return React.createElement(React.Fragment, null, React.createElement(Checkbox, {
1297
1255
  "aria-hidden": "true",
@@ -1302,13 +1260,14 @@ var DropdownList = function DropdownList(_ref) {
1302
1260
  },
1303
1261
  tabIndex: -1
1304
1262
  }), React.createElement("span", {
1305
- className: "eds-dropdown__list__item__text"
1263
+ className: "eds-dropdown__list__item__text",
1264
+ "aria-label": ariaLabelSelectAll()
1306
1265
  }, selectAllItem == null ? void 0 : selectAllItem.label));
1307
1266
  };
1308
1267
  var listItemContent = function listItemContent(item) {
1309
1268
  return React.createElement(React.Fragment, null, React.createElement(Checkbox, {
1310
1269
  "aria-hidden": "true",
1311
- checked: itemIsSelected(item),
1270
+ checked: isItemSelected(item),
1312
1271
  className: "eds-dropdown__list__item__checkbox",
1313
1272
  onChange: function onChange() {
1314
1273
  return;
@@ -1319,7 +1278,7 @@ var DropdownList = function DropdownList(_ref) {
1319
1278
  tabIndex: -1
1320
1279
  }), React.createElement("span", {
1321
1280
  className: "eds-dropdown__list__item__text"
1322
- }, item.label, React.createElement(VisuallyHidden, null, selectedItemAriaLabel)), item.icons && React.createElement("span", null, item.icons.map(function (Icon, index) {
1281
+ }, item.label, React.createElement(VisuallyHidden, null, isItemSelected(item) ? ariaLabelSelectedItem : '')), item.icons && React.createElement("span", null, item.icons.map(function (Icon, index) {
1323
1282
  return React.createElement(Icon, {
1324
1283
  key: index,
1325
1284
  inline: true,
@@ -1328,13 +1287,13 @@ var DropdownList = function DropdownList(_ref) {
1328
1287
  })));
1329
1288
  };
1330
1289
  return (
1331
- // use popover from @entur/tooltip when the package uses floating-ui
1290
+ // use popover from @entur/tooltip when that package upgrades to floating-ui
1332
1291
  React.createElement("ul", _extends({}, getMenuProps(), {
1333
1292
  className: classNames('eds-dropdown__list', {
1334
1293
  'eds-dropdown__list--open': isOpen
1335
1294
  }),
1336
1295
  style: _extends({}, rest.style, listStyle)
1337
- }), isOpen && listItems.length > 0 && listItems.map(function (item, index) {
1296
+ }), listItems.length > 0 && listItems.map(function (item, index) {
1338
1297
  var itemIsSelectAll = item.value === (selectAllItem == null ? void 0 : selectAllItem.value);
1339
1298
  if (itemIsSelectAll && listItems.length <= 2) return React.createElement(React.Fragment, null);
1340
1299
  return React.createElement("li", _extends({
@@ -1342,21 +1301,148 @@ var DropdownList = function DropdownList(_ref) {
1342
1301
  className: classNames('eds-dropdown__list__item', {
1343
1302
  'eds-dropdown__list__item--select-all': itemIsSelectAll,
1344
1303
  'eds-dropdown__list__item--highlighted': highlightedIndex === index,
1345
- 'eds-dropdown__list__item--selected': !isMultiselect && itemIsSelected(item)
1304
+ 'eds-dropdown__list__item--selected': !isMultiselect && isItemSelected(item)
1346
1305
  })
1347
1306
  }, getItemProps({
1348
1307
  key: "" + index + item.value,
1349
1308
  item: item,
1350
1309
  index: index
1351
1310
  })), itemIsSelectAll ? selectAllListItemContent() : listItemContent(item));
1352
- }), isOpen && isNoMatches && React.createElement("li", {
1311
+ }), isNoMatches && React.createElement("li", {
1353
1312
  className: "eds-dropdown__list__item"
1354
- }, noMatchesText), isOpen && loading && React.createElement("li", {
1313
+ }, noMatchesText), loading && React.createElement("li", {
1355
1314
  className: "eds-dropdown__list__item"
1356
1315
  }, loadingText))
1357
1316
  );
1358
1317
  };
1359
1318
 
1319
+ var _excluded$4 = ["tabIndex"];
1320
+ var SelectedItemTag = function SelectedItemTag(_ref) {
1321
+ var _getSelectedItemProps;
1322
+ var ariaLabelRemoveSelected = _ref.ariaLabelRemoveSelected,
1323
+ _ref$ariaLabelChosen = _ref.ariaLabelChosen,
1324
+ ariaLabelChosen = _ref$ariaLabelChosen === void 0 ? 'valgt' : _ref$ariaLabelChosen,
1325
+ disabled = _ref.disabled,
1326
+ getSelectedItemProps = _ref.getSelectedItemProps,
1327
+ index = _ref.index,
1328
+ readOnly = _ref.readOnly,
1329
+ removeSelectedItem = _ref.removeSelectedItem,
1330
+ selectedItem = _ref.selectedItem;
1331
+ var _ref2 = (_getSelectedItemProps = getSelectedItemProps == null ? void 0 : getSelectedItemProps({
1332
+ selectedItem: selectedItem,
1333
+ index: index
1334
+ })) != null ? _getSelectedItemProps : {},
1335
+ selectedItemProps = _objectWithoutPropertiesLoose(_ref2, _excluded$4);
1336
+ return React.createElement(TagChip, _extends({
1337
+ className: classNames('eds-dropdown__selected-item-tag', {
1338
+ 'eds-dropdown__selected-item-tag--readonly': readOnly,
1339
+ 'eds-dropdown__selected-item-tag--disabled': disabled
1340
+ })
1341
+ }, selectedItemProps, {
1342
+ onClose: function onClose(e) {
1343
+ e.stopPropagation();
1344
+ removeSelectedItem(selectedItem);
1345
+ },
1346
+ closeButtonAriaLabel: selectedItem.label + " " + ariaLabelChosen + ", " + ariaLabelRemoveSelected + " ",
1347
+ key: selectedItem.value,
1348
+ "aria-live": "polite"
1349
+ }), React.createElement("span", {
1350
+ "aria-hidden": "true"
1351
+ }, selectedItem.label));
1352
+ };
1353
+ var FieldAppend$1 = function FieldAppend(_ref3) {
1354
+ var _ref3$ariaHiddenToggl = _ref3.ariaHiddenToggleButton,
1355
+ ariaHiddenToggleButton = _ref3$ariaHiddenToggl === void 0 ? false : _ref3$ariaHiddenToggl,
1356
+ ariaLabelCloseList = _ref3.ariaLabelCloseList,
1357
+ ariaLabelOpenList = _ref3.ariaLabelOpenList,
1358
+ _ref3$clearable = _ref3.clearable,
1359
+ clearable = _ref3$clearable === void 0 ? false : _ref3$clearable,
1360
+ labelClearSelectedItems = _ref3.labelClearSelectedItems,
1361
+ _ref3$disabled = _ref3.disabled,
1362
+ disabled = _ref3$disabled === void 0 ? false : _ref3$disabled,
1363
+ _ref3$focusable = _ref3.focusable,
1364
+ focusable = _ref3$focusable === void 0 ? false : _ref3$focusable,
1365
+ getToggleButtonProps = _ref3.getToggleButtonProps,
1366
+ isOpen = _ref3.isOpen,
1367
+ _ref3$loading = _ref3.loading,
1368
+ loading = _ref3$loading === void 0 ? false : _ref3$loading,
1369
+ _ref3$loadingText = _ref3.loadingText,
1370
+ loadingText = _ref3$loadingText === void 0 ? 'Laster resultater …' : _ref3$loadingText,
1371
+ onClear = _ref3.onClear,
1372
+ selectedItems = _ref3.selectedItems;
1373
+ if (loading) {
1374
+ return React.createElement("div", {
1375
+ className: 'eds-dropdown-appendix__toggle-button--loading-dots'
1376
+ }, React.createElement(LoadingDots, {
1377
+ "aria-label": loadingText
1378
+ }));
1379
+ }
1380
+ if (disabled) {
1381
+ return null;
1382
+ }
1383
+ return React.createElement("div", {
1384
+ className: "eds-dropdown-appendix"
1385
+ }, clearable && (selectedItems == null ? void 0 : selectedItems.length) > 0 && selectedItems[0] !== null && React.createElement(React.Fragment, null, React.createElement(ClearableButton, {
1386
+ onClear: onClear,
1387
+ focusable: true,
1388
+ labelClearSelectedItems: labelClearSelectedItems
1389
+ }), React.createElement("div", {
1390
+ className: "eds-dropdown-appendix__divider"
1391
+ })), React.createElement(ToggleButton, {
1392
+ "aria-hidden": ariaHiddenToggleButton,
1393
+ ariaLabelCloseList: ariaLabelCloseList,
1394
+ ariaLabelOpenList: ariaLabelOpenList,
1395
+ getToggleButtonProps: getToggleButtonProps,
1396
+ isOpen: isOpen,
1397
+ focusable: focusable
1398
+ }));
1399
+ };
1400
+ var ClearableButton = function ClearableButton(_ref4) {
1401
+ var onClear = _ref4.onClear,
1402
+ _ref4$labelClearSelec = _ref4.labelClearSelectedItems,
1403
+ labelClearSelectedItems = _ref4$labelClearSelec === void 0 ? 'Fjern valgte' : _ref4$labelClearSelec,
1404
+ _ref4$focusable = _ref4.focusable,
1405
+ focusable = _ref4$focusable === void 0 ? false : _ref4$focusable;
1406
+ return React.createElement(Tooltip, {
1407
+ "aria-hidden": "true",
1408
+ placement: "right",
1409
+ content: labelClearSelectedItems
1410
+ }, React.createElement(IconButton, {
1411
+ className: "eds-dropdown-appendix__clear-button",
1412
+ type: "button",
1413
+ tabIndex: focusable ? 0 : 1,
1414
+ onClick: onClear,
1415
+ "aria-label": labelClearSelectedItems
1416
+ }, React.createElement(CloseSmallIcon, {
1417
+ "aria-hidden": "true"
1418
+ })));
1419
+ };
1420
+ var ToggleButton = function ToggleButton(_ref5) {
1421
+ var getToggleButtonProps = _ref5.getToggleButtonProps,
1422
+ isOpen = _ref5.isOpen,
1423
+ _ref5$ariaHidden = _ref5['aria-hidden'],
1424
+ ariaHidden = _ref5$ariaHidden === void 0 ? false : _ref5$ariaHidden,
1425
+ _ref5$ariaLabelCloseL = _ref5.ariaLabelCloseList,
1426
+ ariaLabelCloseList = _ref5$ariaLabelCloseL === void 0 ? 'Lukk liste med valg' : _ref5$ariaLabelCloseL,
1427
+ _ref5$ariaLabelOpenLi = _ref5.ariaLabelOpenList,
1428
+ ariaLabelOpenList = _ref5$ariaLabelOpenLi === void 0 ? 'Åpne liste med valg' : _ref5$ariaLabelOpenLi,
1429
+ _ref5$focusable = _ref5.focusable,
1430
+ focusable = _ref5$focusable === void 0 ? false : _ref5$focusable;
1431
+ return React.createElement(IconButton, _extends({}, getToggleButtonProps({
1432
+ className: classNames('eds-dropdown-appendix__toggle-button', {
1433
+ 'eds-dropdown-appendix__toggle-button--open': isOpen
1434
+ })
1435
+ }), {
1436
+ "aria-hidden": ariaHidden,
1437
+ "aria-label": isOpen ? ariaLabelCloseList : ariaLabelOpenList,
1438
+ tabIndex: focusable ? 0 : -1,
1439
+ type: "button"
1440
+ }), React.createElement(DownArrowIcon, {
1441
+ "aria-hidden": "true"
1442
+ }));
1443
+ };
1444
+
1445
+ /* start general utils */
1360
1446
  var EMPTY_INPUT = '';
1361
1447
  function lowerCaseFilterTest(item, input) {
1362
1448
  if (!input) {
@@ -1372,10 +1458,10 @@ var itemToString = function itemToString(item) {
1372
1458
  var useMultiselectUtils = function useMultiselectUtils(_ref) {
1373
1459
  var listItems = _ref.listItems,
1374
1460
  selectedItems = _ref.selectedItems,
1375
- selectAllValue = _ref.selectAllValue;
1461
+ selectAll = _ref.selectAll;
1376
1462
  var hasSelectedItems = selectedItems.length > 0;
1377
1463
  var listItemsWithoutSelectAll = listItems.filter(function (item) {
1378
- return item.value !== selectAllValue;
1464
+ return item.value !== selectAll.value;
1379
1465
  });
1380
1466
  var allListItemsAreSelected = listItemsWithoutSelectAll.filter(function (item) {
1381
1467
  return !selectedItems.includes(item);
@@ -1392,18 +1478,21 @@ var useMultiselectUtils = function useMultiselectUtils(_ref) {
1392
1478
  });
1393
1479
  };
1394
1480
  var clickedItemIsSelectAll = function clickedItemIsSelectAll(clickedItem) {
1395
- return clickedItem.value === selectAllValue;
1481
+ return clickedItem.value === selectAll.value;
1396
1482
  };
1397
1483
  var handleListItemClicked = function handleListItemClicked(_ref2) {
1398
1484
  var clickedItem = _ref2.clickedItem,
1399
- onChange = _ref2.onChange;
1485
+ onChange = _ref2.onChange,
1486
+ setLastRemovedItem = _ref2.setLastRemovedItem;
1400
1487
  if (clickedItemIsSelectAll(clickedItem)) {
1401
1488
  if (allListItemsAreSelected) {
1489
+ setLastRemovedItem(selectAll);
1402
1490
  return unselectAllListItems(onChange);
1403
1491
  }
1404
1492
  return selectAllUnselectedItemsInListItems(onChange);
1405
1493
  }
1406
1494
  if (clickedItemIsInSelectedItems(clickedItem)) {
1495
+ setLastRemovedItem(clickedItem);
1407
1496
  return removeClickedItemFromSelectedItems(clickedItem, onChange);
1408
1497
  }
1409
1498
  addClickedItemToSelectedItems(clickedItem, onChange);
@@ -1443,125 +1532,63 @@ var useMultiselectUtils = function useMultiselectUtils(_ref) {
1443
1532
  unselectAllListItems: unselectAllListItems
1444
1533
  };
1445
1534
  };
1446
-
1447
- var _excluded$3 = ["tabIndex"];
1448
- var SelectedItemTag = function SelectedItemTag(_ref) {
1449
- var _getSelectedItemProps;
1450
- var ariaLabelRemoveSelected = _ref.ariaLabelRemoveSelected,
1451
- disabled = _ref.disabled,
1452
- getSelectedItemProps = _ref.getSelectedItemProps,
1453
- index = _ref.index,
1454
- readOnly = _ref.readOnly,
1455
- removeSelectedItem = _ref.removeSelectedItem,
1456
- selectedItem = _ref.selectedItem;
1457
- var _ref2 = (_getSelectedItemProps = getSelectedItemProps == null ? void 0 : getSelectedItemProps({
1458
- selectedItem: selectedItem,
1459
- index: index
1460
- })) != null ? _getSelectedItemProps : {},
1461
- selectedItemProps = _objectWithoutPropertiesLoose(_ref2, _excluded$3);
1462
- return React.createElement(TagChip, _extends({
1463
- className: classNames('eds-dropdown__selected-item-tag', {
1464
- 'eds-dropdown__selected-item-tag--readonly': readOnly,
1465
- 'eds-dropdown__selected-item-tag--disabled': disabled
1466
- })
1467
- }, selectedItemProps, {
1468
- onClose: function onClose(e) {
1469
- e.stopPropagation();
1470
- removeSelectedItem(selectedItem);
1471
- },
1472
- closeButtonAriaLabel: selectedItem.label + ", " + ariaLabelRemoveSelected + " ",
1473
- key: selectedItem.value
1474
- }), React.createElement("span", {
1475
- "aria-hidden": "true"
1476
- }, selectedItem.label));
1477
- };
1478
- var FieldAppend = function FieldAppend(_ref3) {
1479
- var _ref3$clearable = _ref3.clearable,
1480
- clearable = _ref3$clearable === void 0 ? false : _ref3$clearable,
1481
- clearSelectedItemsLabel = _ref3.clearSelectedItemsLabel,
1482
- _ref3$disabled = _ref3.disabled,
1483
- disabled = _ref3$disabled === void 0 ? false : _ref3$disabled,
1484
- _ref3$focusable = _ref3.focusable,
1485
- focusable = _ref3$focusable === void 0 ? false : _ref3$focusable,
1486
- getToggleButtonProps = _ref3.getToggleButtonProps,
1487
- isOpen = _ref3.isOpen,
1488
- _ref3$loading = _ref3.loading,
1489
- loading = _ref3$loading === void 0 ? false : _ref3$loading,
1490
- _ref3$loadingText = _ref3.loadingText,
1491
- loadingText = _ref3$loadingText === void 0 ? 'Laster resultater …' : _ref3$loadingText,
1492
- onClear = _ref3.onClear,
1493
- selectedItems = _ref3.selectedItems;
1494
- if (loading) {
1495
- return React.createElement(DropdownLoadingDots, null, loadingText);
1535
+ function getA11yStatusMessage(options) {
1536
+ var isOpen = options.isOpen,
1537
+ resultCount = options.resultCount,
1538
+ previousResultCount = options.previousResultCount,
1539
+ _options$selectAllIte = options.selectAllItemIncluded,
1540
+ selectAllItemIncluded = _options$selectAllIte === void 0 ? false : _options$selectAllIte,
1541
+ _options$ariaLabelNoR = options.ariaLabelNoResults,
1542
+ ariaLabelNoResults = _options$ariaLabelNoR === void 0 ? 'Ingen resultater' : _options$ariaLabelNoR;
1543
+ if (!isOpen) {
1544
+ return '';
1496
1545
  }
1497
- if (disabled) {
1498
- return null;
1546
+ var resultCountWithoutSelectAll = selectAllItemIncluded ? resultCount - 1 : resultCount;
1547
+ if (resultCountWithoutSelectAll === 0) {
1548
+ return ariaLabelNoResults;
1499
1549
  }
1500
- return (
1501
- // to have a natural tab order, these elements are ordered opposite of how they are displayed
1502
- React.createElement("div", {
1503
- className: "eds-dropdown-appendix"
1504
- }, React.createElement(ToggleButton, {
1505
- getToggleButtonProps: getToggleButtonProps,
1506
- isOpen: isOpen,
1507
- focusable: focusable
1508
- }), clearable && (selectedItems == null ? void 0 : selectedItems.length) > 0 && selectedItems[0] !== null && React.createElement(React.Fragment, null, React.createElement("div", {
1509
- className: "eds-dropdown-appendix__divider"
1510
- }), React.createElement(ClearableButton, {
1511
- onClear: onClear,
1512
- focusable: true,
1513
- clearSelectedItemsLabel: clearSelectedItemsLabel
1514
- })))
1515
- );
1516
- };
1517
- var ClearableButton = function ClearableButton(_ref4) {
1518
- var onClear = _ref4.onClear,
1519
- _ref4$clearSelectedIt = _ref4.clearSelectedItemsLabel,
1520
- clearSelectedItemsLabel = _ref4$clearSelectedIt === void 0 ? 'Fjern valgte' : _ref4$clearSelectedIt,
1521
- _ref4$focusable = _ref4.focusable,
1522
- focusable = _ref4$focusable === void 0 ? false : _ref4$focusable;
1523
- return React.createElement(Tooltip, {
1524
- "aria-hidden": "true",
1525
- placement: "right",
1526
- content: clearSelectedItemsLabel
1527
- }, React.createElement(IconButton, {
1528
- className: "eds-dropdown-appendix__clear-button",
1529
- type: "button",
1530
- tabIndex: focusable ? 0 : 1,
1531
- onClick: onClear,
1532
- "aria-label": clearSelectedItemsLabel
1533
- }, React.createElement(CloseSmallIcon, {
1534
- "aria-hidden": "true"
1535
- })));
1536
- };
1537
- var ToggleButton = function ToggleButton(_ref5) {
1538
- var getToggleButtonProps = _ref5.getToggleButtonProps,
1539
- isOpen = _ref5.isOpen,
1540
- _ref5$closeAriaLabel = _ref5.closeAriaLabel,
1541
- closeAriaLabel = _ref5$closeAriaLabel === void 0 ? 'Lukk liste med valg' : _ref5$closeAriaLabel,
1542
- _ref5$openAriaLabel = _ref5.openAriaLabel,
1543
- openAriaLabel = _ref5$openAriaLabel === void 0 ? 'Åpne liste med valg' : _ref5$openAriaLabel,
1544
- _ref5$focusable = _ref5.focusable,
1545
- focusable = _ref5$focusable === void 0 ? false : _ref5$focusable;
1546
- return React.createElement(IconButton, _extends({}, getToggleButtonProps({
1547
- className: classNames('eds-dropdown-appendix__toggle-button', {
1548
- 'eds-dropdown-appendix__toggle-button--open': isOpen
1549
- })
1550
- }), {
1551
- "aria-label": isOpen ? closeAriaLabel : openAriaLabel,
1552
- tabIndex: focusable ? 0 : -1,
1553
- type: "button"
1554
- }), React.createElement(DownArrowIcon, {
1555
- "aria-hidden": "true"
1556
- }));
1550
+ if (resultCount !== previousResultCount) {
1551
+ return resultCountWithoutSelectAll + " resultat" + (resultCountWithoutSelectAll === 1 ? '' : 'er') + " tilgjengelig, naviger med pil opp eller ned, velg elementer med enter.";
1552
+ }
1553
+ return '';
1554
+ }
1555
+ function getA11ySelectionMessage(options) {
1556
+ var selectedItem = options.selectedItem,
1557
+ itemToStringLocal = options.itemToString,
1558
+ selectAllItem = options.selectAllItem;
1559
+ if ((selectedItem == null ? void 0 : selectedItem.value) === (selectAllItem == null ? void 0 : selectAllItem.value)) return 'Alle elementer i listen valgt.';
1560
+ return selectedItem ? itemToStringLocal(selectedItem) + " er valgt." : '';
1561
+ }
1562
+ function getA11yRemovalMessage(options) {
1563
+ var itemToString = options.itemToString,
1564
+ selectAllItem = options.selectAllItem,
1565
+ removedItem = options.removedItem;
1566
+ if (removedItem === undefined) return '';
1567
+ if (removedItem.value === (selectAllItem == null ? void 0 : selectAllItem.value)) return 'Alle elementer i listen fjernet fra valgte.';
1568
+ return itemToString(removedItem) + " fjernet fra valgte.";
1569
+ }
1570
+ /**A VoiceOver click is always preformed in the center of the clicked element.
1571
+ This functions expolits that to check if the performed click likely is
1572
+ made by VoiceOver. */
1573
+ var isVoiceOverClick = function isVoiceOverClick(clickEvent) {
1574
+ var targetElementRect = clickEvent.currentTarget.getBoundingClientRect();
1575
+ var targetElementMiddleX = Math.floor(targetElementRect.x + targetElementRect.width / 2);
1576
+ var targetElementMiddleY = Math.floor(targetElementRect.y + targetElementRect.height / 2);
1577
+ var clickPositionX = clickEvent.clientX;
1578
+ var clickPositionY = clickEvent.clientY;
1579
+ console.log('targetX:', targetElementMiddleX, 'targetY:', targetElementMiddleY, 'clickX:', clickPositionX, 'clickY:', clickPositionY);
1580
+ return Math.abs(targetElementMiddleX - clickPositionX) <= 1 && Math.abs(targetElementMiddleY - clickPositionY) <= 1;
1557
1581
  };
1582
+ /* end a11y utils */
1558
1583
 
1559
- var _excluded$2 = ["className", "clearable", "debounceTimeout", "disabled", "disableLabelAnimation", "feedback", "itemFilter", "items", "label", "listStyle", "loadingText", "onChange", "openOnFocus", "placeholder", "prepend", "readOnly", "selectedItem", "selectOnBlur", "style", "variant"];
1584
+ var _excluded$3 = ["ariaLabelCloseList", "ariaLabelOpenList", "className", "clearable", "debounceTimeout", "disabled", "disableLabelAnimation", "feedback", "itemFilter", "items", "label", "labelClearSelectedItem", "listStyle", "loadingText", "onChange", "placeholder", "prepend", "readOnly", "selectedItem", "selectOnBlur", "style", "variant"];
1560
1585
  var SearchableDropdownBeta = function SearchableDropdownBeta(_ref) {
1561
1586
  var _selectedItem$label;
1562
- var className = _ref.className,
1587
+ var ariaLabelCloseList = _ref.ariaLabelCloseList,
1588
+ ariaLabelOpenList = _ref.ariaLabelOpenList,
1589
+ className = _ref.className,
1563
1590
  _ref$clearable = _ref.clearable,
1564
- clearable = _ref$clearable === void 0 ? false : _ref$clearable,
1591
+ clearable = _ref$clearable === void 0 ? true : _ref$clearable,
1565
1592
  debounceTimeout = _ref.debounceTimeout,
1566
1593
  _ref$disabled = _ref.disabled,
1567
1594
  disabled = _ref$disabled === void 0 ? false : _ref$disabled,
@@ -1572,11 +1599,11 @@ var SearchableDropdownBeta = function SearchableDropdownBeta(_ref) {
1572
1599
  itemFilter = _ref$itemFilter === void 0 ? lowerCaseFilterTest : _ref$itemFilter,
1573
1600
  initialItems = _ref.items,
1574
1601
  label = _ref.label,
1602
+ _ref$labelClearSelect = _ref.labelClearSelectedItem,
1603
+ labelClearSelectedItem = _ref$labelClearSelect === void 0 ? 'fjern valgt' : _ref$labelClearSelect,
1575
1604
  listStyle = _ref.listStyle,
1576
1605
  loadingText = _ref.loadingText,
1577
1606
  onChange = _ref.onChange,
1578
- _ref$openOnFocus = _ref.openOnFocus,
1579
- openOnFocus = _ref$openOnFocus === void 0 ? false : _ref$openOnFocus,
1580
1607
  placeholder = _ref.placeholder,
1581
1608
  prepend = _ref.prepend,
1582
1609
  _ref$readOnly = _ref.readOnly,
@@ -1587,7 +1614,7 @@ var SearchableDropdownBeta = function SearchableDropdownBeta(_ref) {
1587
1614
  style = _ref.style,
1588
1615
  _ref$variant = _ref.variant,
1589
1616
  variant = _ref$variant === void 0 ? 'info' : _ref$variant,
1590
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$2);
1617
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$3);
1591
1618
  var _useState = useState(false),
1592
1619
  hideSelectedItem = _useState[0],
1593
1620
  setHideSelectedItem = _useState[1];
@@ -1627,6 +1654,7 @@ var SearchableDropdownBeta = function SearchableDropdownBeta(_ref) {
1627
1654
  setLastHighlightedIndex(changes == null ? void 0 : changes.highlightedIndex);
1628
1655
  }
1629
1656
  switch (type) {
1657
+ // empty input to show selected item and reset dropdown list on item selection
1630
1658
  case useCombobox.stateChangeTypes.ItemClick:
1631
1659
  case useCombobox.stateChangeTypes.InputKeyDownEnter:
1632
1660
  case useCombobox.stateChangeTypes.InputBlur:
@@ -1636,21 +1664,21 @@ var SearchableDropdownBeta = function SearchableDropdownBeta(_ref) {
1636
1664
  inputValue: EMPTY_INPUT
1637
1665
  });
1638
1666
  return _extends({}, changes, {
1639
- inputValue: EMPTY_INPUT // reset input value to show placeholder on focus
1667
+ inputValue: EMPTY_INPUT
1640
1668
  });
1641
1669
  }
1642
-
1670
+ // remove leading whitespace, select element with spacebar on empty input, and filter list based on input
1643
1671
  case useCombobox.stateChangeTypes.InputChange:
1644
1672
  {
1645
1673
  var _changes$inputValue;
1646
1674
  var leadingWhitespaceTest = /^\s+/g;
1647
- var isSpacePressedOnEmptyInput = changes.inputValue == ' ';
1675
+ var isSpacePressedOnEmptyInput = changes.inputValue === ' ';
1648
1676
  if ((_changes$inputValue = changes.inputValue) != null && _changes$inputValue.match(leadingWhitespaceTest)) {
1649
1677
  setInputValue(changes.inputValue.replace(leadingWhitespaceTest, EMPTY_INPUT));
1650
1678
  if (isSpacePressedOnEmptyInput) {
1651
1679
  openMenu();
1652
1680
  if (isOpen && changes.highlightedIndex !== undefined) {
1653
- onChange(listItems[changes.highlightedIndex]);
1681
+ onChange == null ? void 0 : onChange(listItems[changes.highlightedIndex]);
1654
1682
  }
1655
1683
  }
1656
1684
  } else {
@@ -1679,8 +1707,15 @@ var SearchableDropdownBeta = function SearchableDropdownBeta(_ref) {
1679
1707
  if (!selectOnBlur) break;
1680
1708
  case useCombobox.stateChangeTypes.InputKeyDownEnter: // eslint-disable-line no-fallthrough
1681
1709
  case useCombobox.stateChangeTypes.ItemClick:
1682
- onChange(clickedItem != null ? clickedItem : null);
1710
+ onChange == null ? void 0 : onChange(clickedItem != null ? clickedItem : null);
1683
1711
  }
1712
+ },
1713
+ // Accessibility
1714
+ getA11yStatusMessage: getA11yStatusMessage,
1715
+ // The following A11y-helper does not work due to a bug (https://github.com/downshift-js/downshift/issues/1227)
1716
+ // but is left here for when it is fixed
1717
+ getA11ySelectionMessage: function getA11ySelectionMessage$1(options) {
1718
+ return getA11ySelectionMessage(options);
1684
1719
  }
1685
1720
  }, rest)),
1686
1721
  isOpen = _useCombobox.isOpen,
@@ -1689,7 +1724,6 @@ var SearchableDropdownBeta = function SearchableDropdownBeta(_ref) {
1689
1724
  getLabelProps = _useCombobox.getLabelProps,
1690
1725
  getMenuProps = _useCombobox.getMenuProps,
1691
1726
  getInputProps = _useCombobox.getInputProps,
1692
- getComboboxProps = _useCombobox.getComboboxProps,
1693
1727
  highlightedIndex = _useCombobox.highlightedIndex,
1694
1728
  getItemProps = _useCombobox.getItemProps,
1695
1729
  selectedItem = _useCombobox.selectedItem,
@@ -1697,7 +1731,7 @@ var SearchableDropdownBeta = function SearchableDropdownBeta(_ref) {
1697
1731
  setInputValue = _useCombobox.setInputValue;
1698
1732
  var handleOnClear = function handleOnClear() {
1699
1733
  var _inputRef$current;
1700
- onChange(null);
1734
+ onChange == null ? void 0 : onChange(null);
1701
1735
  setInputValue(EMPTY_INPUT);
1702
1736
  (_inputRef$current = inputRef.current) == null ? void 0 : _inputRef$current.focus();
1703
1737
  updateListItems({
@@ -1707,9 +1741,11 @@ var SearchableDropdownBeta = function SearchableDropdownBeta(_ref) {
1707
1741
  return React.createElement("div", {
1708
1742
  className: "eds-dropdown__wrapper"
1709
1743
  }, React.createElement(BaseFormControl, _extends({
1710
- append: React.createElement(FieldAppend, {
1744
+ append: React.createElement(FieldAppend$1, {
1745
+ ariaLabelCloseList: ariaLabelCloseList,
1746
+ ariaLabelOpenList: ariaLabelOpenList,
1711
1747
  clearable: clearable,
1712
- clearSelectedItemsLabel: "Fjern valgt",
1748
+ labelClearSelectedItems: labelClearSelectedItem,
1713
1749
  disabled: readOnly || disabled,
1714
1750
  focusable: false,
1715
1751
  getToggleButtonProps: getToggleButtonProps,
@@ -1723,15 +1759,17 @@ var SearchableDropdownBeta = function SearchableDropdownBeta(_ref) {
1723
1759
  disabled: disabled,
1724
1760
  disableLabelAnimation: disableLabelAnimation,
1725
1761
  feedback: feedback,
1726
- isFilled: selectedItem || inputValue !== EMPTY_INPUT,
1762
+ isFilled: selectedItem !== null || inputValue !== EMPTY_INPUT,
1727
1763
  label: label,
1764
+ labelId: getLabelProps().id,
1728
1765
  labelProps: getLabelProps(),
1729
1766
  prepend: prepend,
1730
1767
  readOnly: readOnly,
1731
1768
  style: style,
1732
1769
  variant: variant
1733
- }, getComboboxProps(), rest), !hideSelectedItem && selectedItem && !inputValue && React.createElement("span", {
1734
- className: "eds-dropdown__selected-item__wrapper"
1770
+ }, rest), !hideSelectedItem && selectedItem && !inputValue && React.createElement("span", {
1771
+ className: "eds-dropdown__selected-item__wrapper",
1772
+ "aria-hidden": "true"
1735
1773
  }, React.createElement("span", {
1736
1774
  className: "eds-dropdown__selected-item",
1737
1775
  onClick: function onClick() {
@@ -1743,11 +1781,13 @@ var SearchableDropdownBeta = function SearchableDropdownBeta(_ref) {
1743
1781
  disabled: readOnly || disabled,
1744
1782
  placeholder: (_selectedItem$label = selectedItem == null ? void 0 : selectedItem.label) != null ? _selectedItem$label : placeholder
1745
1783
  }, getInputProps({
1784
+ onClick: function onClick(e) {
1785
+ if (!isOpen && isVoiceOverClick(e)) openMenu();
1786
+ },
1746
1787
  onBlur: function onBlur() {
1747
1788
  setHideSelectedItem(false);
1748
1789
  },
1749
1790
  onFocus: function onFocus() {
1750
- if (!isOpen && openOnFocus) openMenu();
1751
1791
  setHideSelectedItem(true);
1752
1792
  },
1753
1793
  ref: inputRef
@@ -1764,15 +1804,11 @@ var SearchableDropdownBeta = function SearchableDropdownBeta(_ref) {
1764
1804
  }));
1765
1805
  };
1766
1806
 
1767
- var _excluded$1 = ["allItemsSelectedLabel", "ariaLabelRemoveSelected", "className", "clearable", "clearInputOnSelect", "debounceTimeout", "disabled", "feedback", "hideSelectAll", "items", "label", "listStyle", "loadingText", "maxTags", "onChange", "openOnFocus", "placeholder", "readOnly", "clearAllItemsAriaLabel", "selectAllLabel", "selectedItems", "selectOnBlur", "style", "variant"];
1807
+ var _excluded$2 = ["className", "clearable", "clearInputOnSelect", "debounceTimeout", "disabled", "feedback", "hideSelectAll", "items", "label", "labelAllItemsSelected", "labelClearAllItems", "labelSelectAll", "listStyle", "loadingText", "maxTags", "onChange", "placeholder", "readOnly", "selectedItems", "selectOnBlur", "style", "variant", "ariaLabelChosenSingular", "ariaLabelChosenPlural", "ariaLabelCloseList", "ariaLabelJumpToInput", "ariaLabelOpenList", "ariaLabelRemoveSelected"];
1768
1808
  var MultiSelectBeta = function MultiSelectBeta(_ref) {
1769
- var _ref$allItemsSelected = _ref.allItemsSelectedLabel,
1770
- allItemsSelectedLabel = _ref$allItemsSelected === void 0 ? 'Alle valgt' : _ref$allItemsSelected,
1771
- _ref$ariaLabelRemoveS = _ref.ariaLabelRemoveSelected,
1772
- ariaLabelRemoveSelected = _ref$ariaLabelRemoveS === void 0 ? 'trykk for å fjerne valg' : _ref$ariaLabelRemoveS,
1773
- className = _ref.className,
1809
+ var className = _ref.className,
1774
1810
  _ref$clearable = _ref.clearable,
1775
- clearable = _ref$clearable === void 0 ? false : _ref$clearable,
1811
+ clearable = _ref$clearable === void 0 ? true : _ref$clearable,
1776
1812
  _ref$clearInputOnSele = _ref.clearInputOnSelect,
1777
1813
  clearInputOnSelect = _ref$clearInputOnSele === void 0 ? false : _ref$clearInputOnSele,
1778
1814
  _ref$disabled = _ref.disabled,
@@ -1782,46 +1818,65 @@ var MultiSelectBeta = function MultiSelectBeta(_ref) {
1782
1818
  hideSelectAll = _ref$hideSelectAll === void 0 ? false : _ref$hideSelectAll,
1783
1819
  initialItems = _ref.items,
1784
1820
  label = _ref.label,
1821
+ _ref$labelAllItemsSel = _ref.labelAllItemsSelected,
1822
+ labelAllItemsSelected = _ref$labelAllItemsSel === void 0 ? 'Alle valgt' : _ref$labelAllItemsSel,
1823
+ _ref$labelClearAllIte = _ref.labelClearAllItems,
1824
+ labelClearAllItems = _ref$labelClearAllIte === void 0 ? 'Fjern valgte' : _ref$labelClearAllIte,
1825
+ _ref$labelSelectAll = _ref.labelSelectAll,
1826
+ labelSelectAll = _ref$labelSelectAll === void 0 ? 'Velg alle' : _ref$labelSelectAll,
1785
1827
  listStyle = _ref.listStyle,
1786
1828
  loadingText = _ref.loadingText,
1787
1829
  _ref$maxTags = _ref.maxTags,
1788
1830
  maxTags = _ref$maxTags === void 0 ? 10 : _ref$maxTags,
1789
- onChange = _ref.onChange,
1790
- _ref$openOnFocus = _ref.openOnFocus,
1791
- openOnFocus = _ref$openOnFocus === void 0 ? false : _ref$openOnFocus,
1831
+ _ref$onChange = _ref.onChange,
1832
+ onChange = _ref$onChange === void 0 ? function () {
1833
+ return undefined;
1834
+ } : _ref$onChange,
1792
1835
  placeholder = _ref.placeholder,
1793
1836
  _ref$readOnly = _ref.readOnly,
1794
1837
  readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
1795
- _ref$clearAllItemsAri = _ref.clearAllItemsAriaLabel,
1796
- clearAllItemsAriaLabel = _ref$clearAllItemsAri === void 0 ? 'Fjern valgte' : _ref$clearAllItemsAri,
1797
- _ref$selectAllLabel = _ref.selectAllLabel,
1798
- selectAllLabel = _ref$selectAllLabel === void 0 ? 'Velg alle' : _ref$selectAllLabel,
1799
1838
  selectedItems = _ref.selectedItems,
1800
1839
  _ref$selectOnBlur = _ref.selectOnBlur,
1801
1840
  selectOnBlur = _ref$selectOnBlur === void 0 ? false : _ref$selectOnBlur,
1802
1841
  style = _ref.style,
1803
1842
  _ref$variant = _ref.variant,
1804
1843
  variant = _ref$variant === void 0 ? 'info' : _ref$variant,
1805
- rest = _objectWithoutPropertiesLoose(_ref, _excluded$1);
1844
+ _ref$ariaLabelChosenS = _ref.ariaLabelChosenSingular,
1845
+ ariaLabelChosenSingular = _ref$ariaLabelChosenS === void 0 ? 'valgt' : _ref$ariaLabelChosenS,
1846
+ _ref$ariaLabelChosenP = _ref.ariaLabelChosenPlural,
1847
+ ariaLabelChosenPlural = _ref$ariaLabelChosenP === void 0 ? 'valgte' : _ref$ariaLabelChosenP,
1848
+ ariaLabelCloseList = _ref.ariaLabelCloseList,
1849
+ _ref$ariaLabelJumpToI = _ref.ariaLabelJumpToInput,
1850
+ ariaLabelJumpToInput = _ref$ariaLabelJumpToI === void 0 ? selectedItems.length + " valgte elementer, trykk for \xE5 hoppe til tekstfeltet" : _ref$ariaLabelJumpToI,
1851
+ ariaLabelOpenList = _ref.ariaLabelOpenList,
1852
+ _ref$ariaLabelRemoveS = _ref.ariaLabelRemoveSelected,
1853
+ ariaLabelRemoveSelected = _ref$ariaLabelRemoveS === void 0 ? 'trykk for å fjerne valg' : _ref$ariaLabelRemoveS,
1854
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$2);
1806
1855
  var _React$useState = React.useState(0),
1807
1856
  lastHighlightedIndex = _React$useState[0],
1808
1857
  setLastHighlightedIndex = _React$useState[1];
1858
+ var _React$useState2 = React.useState(undefined),
1859
+ lastRemovedItem = _React$useState2[0],
1860
+ setLastRemovedItem = _React$useState2[1];
1809
1861
  var inputRef = useRef(null);
1810
1862
  var _useResolvedItems = useResolvedItems(initialItems),
1811
1863
  normalizedItems = _useResolvedItems.items,
1812
1864
  loading = _useResolvedItems.loading,
1813
1865
  fetchItems = _useResolvedItems.fetchItems;
1814
1866
  var isAllNonAsyncItemsSelected = typeof initialItems !== 'function' && selectedItems.length === normalizedItems.length;
1867
+ // special 'item' used as Select All entry in the dropdown list
1815
1868
  var selectAll = {
1816
1869
  value: useRandomId('select-all'),
1817
- label: selectAllLabel
1870
+ label: labelSelectAll
1818
1871
  };
1872
+ // special 'item' used as a replacement selected item tag for when
1873
+ // there are more selected element than maxTags
1819
1874
  var summarySelectedItems = React.useMemo(function () {
1820
1875
  return {
1821
1876
  value: EMPTY_INPUT,
1822
- label: isAllNonAsyncItemsSelected ? allItemsSelectedLabel : selectedItems.length + ' valgte'
1877
+ label: isAllNonAsyncItemsSelected ? labelAllItemsSelected : selectedItems.length + ' ' + ariaLabelChosenPlural
1823
1878
  };
1824
- }, [isAllNonAsyncItemsSelected, selectedItems, allItemsSelectedLabel]);
1879
+ }, [isAllNonAsyncItemsSelected, selectedItems, labelAllItemsSelected]);
1825
1880
  var _useState = useState([].concat(!hideSelectAll ? [selectAll] : [], normalizedItems)),
1826
1881
  listItems = _useState[0],
1827
1882
  setListItems = _useState[1];
@@ -1843,25 +1898,27 @@ var MultiSelectBeta = function MultiSelectBeta(_ref) {
1843
1898
  inputValue: inputValue
1844
1899
  });
1845
1900
  }, [normalizedItems]); // eslint-disable-line react-hooks/exhaustive-deps
1846
- var _useMultipleSelection = useMultipleSelection({
1847
- selectedItems: selectedItems,
1848
- itemToString: itemToString,
1849
- onSelectedItemsChange: function onSelectedItemsChange(changes) {
1850
- var _changes$selectedItem;
1851
- onChange((_changes$selectedItem = changes.selectedItems) != null ? _changes$selectedItem : []);
1852
- }
1853
- }),
1854
- getSelectedItemProps = _useMultipleSelection.getSelectedItemProps,
1855
- getDropdownProps = _useMultipleSelection.getDropdownProps,
1856
- removeSelectedItem = _useMultipleSelection.removeSelectedItem;
1857
1901
  var _useMultiselectUtils = useMultiselectUtils({
1858
1902
  listItems: listItems,
1859
- selectAllValue: selectAll.value,
1903
+ selectAll: selectAll,
1860
1904
  selectedItems: selectedItems
1861
1905
  }),
1862
1906
  hasSelectedItems = _useMultiselectUtils.hasSelectedItems,
1863
1907
  handleListItemClicked = _useMultiselectUtils.handleListItemClicked,
1864
1908
  selectAllCheckboxState = _useMultiselectUtils.selectAllCheckboxState;
1909
+ var _useMultipleSelection = useMultipleSelection({
1910
+ selectedItems: selectedItems,
1911
+ itemToString: itemToString,
1912
+ // Accessibility
1913
+ getA11yRemovalMessage: function getA11yRemovalMessage$1(options) {
1914
+ return getA11yRemovalMessage(_extends({}, options, {
1915
+ selectAllItem: selectAll,
1916
+ removedItem: lastRemovedItem
1917
+ }));
1918
+ }
1919
+ }),
1920
+ getSelectedItemProps = _useMultipleSelection.getSelectedItemProps,
1921
+ getDropdownProps = _useMultipleSelection.getDropdownProps;
1865
1922
  var stateReducer = React.useCallback(function (_, _ref4) {
1866
1923
  var changes = _ref4.changes,
1867
1924
  type = _ref4.type;
@@ -1869,6 +1926,7 @@ var MultiSelectBeta = function MultiSelectBeta(_ref) {
1869
1926
  setLastHighlightedIndex(changes == null ? void 0 : changes.highlightedIndex);
1870
1927
  }
1871
1928
  switch (type) {
1929
+ // keep menu open and edit input value on item selection
1872
1930
  case useCombobox.stateChangeTypes.InputKeyDownEnter:
1873
1931
  case useCombobox.stateChangeTypes.ItemClick:
1874
1932
  {
@@ -1883,6 +1941,7 @@ var MultiSelectBeta = function MultiSelectBeta(_ref) {
1883
1941
  inputValue: clearInputOnSelect ? EMPTY_INPUT : (_inputRef$current$val = inputRef == null ? void 0 : (_inputRef$current = inputRef.current) == null ? void 0 : _inputRef$current.value) != null ? _inputRef$current$val : EMPTY_INPUT
1884
1942
  });
1885
1943
  }
1944
+ // edit input value when selected items is updated outside component
1886
1945
  case useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem:
1887
1946
  {
1888
1947
  var _inputRef$current$val2, _inputRef$current2;
@@ -1890,6 +1949,7 @@ var MultiSelectBeta = function MultiSelectBeta(_ref) {
1890
1949
  inputValue: clearInputOnSelect ? EMPTY_INPUT : (_inputRef$current$val2 = inputRef == null ? void 0 : (_inputRef$current2 = inputRef.current) == null ? void 0 : _inputRef$current2.value) != null ? _inputRef$current$val2 : EMPTY_INPUT
1891
1950
  });
1892
1951
  }
1952
+ // remove leading whitespace, select item with spacebar if input is empty and filter list items
1893
1953
  case useCombobox.stateChangeTypes.InputChange:
1894
1954
  {
1895
1955
  var _changes$inputValue;
@@ -1899,10 +1959,11 @@ var MultiSelectBeta = function MultiSelectBeta(_ref) {
1899
1959
  setInputValue(changes.inputValue.replace(leadingWhitespaceTest, EMPTY_INPUT));
1900
1960
  if (isSpacePressedOnEmptyInput) {
1901
1961
  openMenu();
1902
- if (isOpen && changes.highlightedIndex) {
1962
+ if (isOpen && changes.highlightedIndex !== undefined) {
1903
1963
  handleListItemClicked({
1904
1964
  clickedItem: listItems[changes.highlightedIndex],
1905
- onChange: onChange
1965
+ onChange: onChange,
1966
+ setLastRemovedItem: setLastRemovedItem
1906
1967
  });
1907
1968
  }
1908
1969
  }
@@ -1913,6 +1974,7 @@ var MultiSelectBeta = function MultiSelectBeta(_ref) {
1913
1974
  }
1914
1975
  return changes;
1915
1976
  }
1977
+ // reset input value when leaving input field
1916
1978
  case useCombobox.stateChangeTypes.InputBlur:
1917
1979
  {
1918
1980
  return _extends({}, changes, {
@@ -1940,14 +2002,29 @@ var MultiSelectBeta = function MultiSelectBeta(_ref) {
1940
2002
  if (!selectOnBlur) break;
1941
2003
  case useCombobox.stateChangeTypes.InputKeyDownEnter: // eslint-disable-line no-fallthrough
1942
2004
  case useCombobox.stateChangeTypes.ItemClick:
1943
- handleListItemClicked({
1944
- clickedItem: clickedItem,
1945
- onChange: onChange
1946
- });
2005
+ {
2006
+ handleListItemClicked({
2007
+ clickedItem: clickedItem,
2008
+ onChange: onChange,
2009
+ setLastRemovedItem: setLastRemovedItem
2010
+ });
2011
+ }
1947
2012
  }
2013
+ },
2014
+ // Accessibility
2015
+ getA11yStatusMessage: function getA11yStatusMessage$1(options) {
2016
+ return getA11yStatusMessage(_extends({}, options, {
2017
+ selectAllItemIncluded: !hideSelectAll
2018
+ }));
2019
+ },
2020
+ // The following A11y-helper does not work due to a bug (https://github.com/downshift-js/downshift/issues/1227)
2021
+ // but is left here for when it is fixed
2022
+ getA11ySelectionMessage: function getA11ySelectionMessage$1(options) {
2023
+ return getA11ySelectionMessage(_extends({}, options, {
2024
+ selectAllItem: selectAll
2025
+ }));
1948
2026
  }
1949
2027
  }, rest)),
1950
- getComboboxProps = _useCombobox.getComboboxProps,
1951
2028
  getInputProps = _useCombobox.getInputProps,
1952
2029
  getItemProps = _useCombobox.getItemProps,
1953
2030
  getLabelProps = _useCombobox.getLabelProps,
@@ -1967,18 +2044,16 @@ var MultiSelectBeta = function MultiSelectBeta(_ref) {
1967
2044
  inputValue: inputValue
1968
2045
  });
1969
2046
  };
1970
- // role=combobox leads to strange VoiceOver behavior and is therefor omitted
1971
- // const { role: _, ...comboboxProps } = getComboboxProps();
1972
- var _getComboboxProps = getComboboxProps(),
1973
- comboboxProps = _extends({}, (_objectDestructuringEmpty(_getComboboxProps), _getComboboxProps));
1974
2047
  return React.createElement("div", {
1975
2048
  className: "eds-dropdown__wrapper"
1976
2049
  }, React.createElement(BaseFormControl, _extends({
1977
- append: React.createElement(FieldAppend, {
2050
+ append: React.createElement(FieldAppend$1, {
2051
+ ariaLabelCloseList: ariaLabelCloseList,
2052
+ ariaLabelOpenList: ariaLabelOpenList,
1978
2053
  selectedItems: selectedItems,
1979
2054
  isOpen: isOpen,
1980
2055
  clearable: clearable,
1981
- clearSelectedItemsLabel: clearAllItemsAriaLabel,
2056
+ labelClearSelectedItems: labelClearAllItems,
1982
2057
  focusable: false,
1983
2058
  loading: loading,
1984
2059
  loadingText: loadingText,
@@ -1991,13 +2066,12 @@ var MultiSelectBeta = function MultiSelectBeta(_ref) {
1991
2066
  feedback: feedback,
1992
2067
  isFilled: hasSelectedItems || inputValue !== EMPTY_INPUT,
1993
2068
  label: label,
1994
- labelProps: _extends({
1995
- 'aria-label': label + ", multiselect, " + selectedItems.length + " valgte elementer"
1996
- }, getLabelProps()),
2069
+ labelId: getLabelProps().id,
2070
+ labelProps: getLabelProps(),
1997
2071
  readOnly: readOnly,
1998
2072
  style: style,
1999
2073
  variant: variant
2000
- }, comboboxProps, rest), React.createElement("div", {
2074
+ }, rest), React.createElement("div", {
2001
2075
  className: classNames('eds-dropdown__selected-items-and-input', {
2002
2076
  'eds-dropdown__selected-items-and-input--filled': hasSelectedItems
2003
2077
  }),
@@ -2005,19 +2079,34 @@ var MultiSelectBeta = function MultiSelectBeta(_ref) {
2005
2079
  var _inputRef$current4;
2006
2080
  if (e.target === e.currentTarget) (_inputRef$current4 = inputRef.current) == null ? void 0 : _inputRef$current4.focus();
2007
2081
  }
2008
- }, selectedItems.length < maxTags ? selectedItems.map(function (selectedItem, index) {
2082
+ }, selectedItems.length < maxTags ? React.createElement(React.Fragment, null, selectedItems.length > 1 ? React.createElement(VisuallyHidden, {
2083
+ onClick: function onClick() {
2084
+ var _inputRef$current5;
2085
+ return (_inputRef$current5 = inputRef.current) == null ? void 0 : _inputRef$current5.focus();
2086
+ }
2087
+ }, ariaLabelJumpToInput) : React.createElement(React.Fragment, null), selectedItems.map(function (selectedItem, index) {
2009
2088
  return React.createElement(SelectedItemTag, {
2089
+ ariaLabelChosen: ariaLabelChosenSingular,
2010
2090
  ariaLabelRemoveSelected: ariaLabelRemoveSelected,
2011
2091
  disabled: disabled,
2012
2092
  getSelectedItemProps: getSelectedItemProps,
2013
2093
  index: index,
2014
2094
  key: selectedItem.value,
2015
2095
  readOnly: readOnly,
2016
- removeSelectedItem: removeSelectedItem,
2096
+ removeSelectedItem: function removeSelectedItem() {
2097
+ var _inputRef$current6;
2098
+ handleListItemClicked({
2099
+ clickedItem: selectedItem,
2100
+ onChange: onChange,
2101
+ setLastRemovedItem: setLastRemovedItem
2102
+ });
2103
+ inputRef == null ? void 0 : (_inputRef$current6 = inputRef.current) == null ? void 0 : _inputRef$current6.focus();
2104
+ },
2017
2105
  selectedItem: selectedItem
2018
2106
  });
2019
- }) : React.createElement(SelectedItemTag, {
2020
- ariaLabelRemoveSelected: clearAllItemsAriaLabel,
2107
+ })) : React.createElement(SelectedItemTag, {
2108
+ ariaLabelRemoveSelected: labelClearAllItems,
2109
+ ariaLabelChosen: "",
2021
2110
  disabled: disabled,
2022
2111
  readOnly: readOnly,
2023
2112
  removeSelectedItem: handleOnClear,
@@ -2025,13 +2114,12 @@ var MultiSelectBeta = function MultiSelectBeta(_ref) {
2025
2114
  }), React.createElement("input", _extends({
2026
2115
  placeholder: placeholder,
2027
2116
  className: "eds-dropdown__input eds-form-control",
2028
- disabled: readOnly || disabled,
2029
- role: "combobox" // eslint-disable-line jsx-a11y/role-has-required-aria-props
2117
+ disabled: readOnly || disabled
2030
2118
  }, getInputProps(getDropdownProps({
2031
- preventKeyAction: isOpen,
2032
- onFocus: function onFocus() {
2033
- if (!isOpen && openOnFocus) openMenu();
2119
+ onClick: function onClick(e) {
2120
+ if (!isOpen && isVoiceOverClick(e)) openMenu();
2034
2121
  },
2122
+ preventKeyAction: isOpen,
2035
2123
  ref: inputRef,
2036
2124
  value: inputValue != null ? inputValue : EMPTY_INPUT
2037
2125
  })))))), React.createElement(DropdownList, {
@@ -2050,17 +2138,20 @@ var MultiSelectBeta = function MultiSelectBeta(_ref) {
2050
2138
  }));
2051
2139
  };
2052
2140
 
2053
- var _excluded = ["className", "clearable", "disabled", "disableLabelAnimation", "feedback", "items", "label", "labelTooltip", "listStyle", "loadingText", "onChange", "placeholder", "prepend", "readOnly", "selectedItem", "selectOnBlur", "style", "variant"];
2141
+ var _excluded$1 = ["ariaLabelCloseList", "ariaLabelOpenList", "className", "clearable", "disabled", "disableLabelAnimation", "feedback", "items", "label", "labelClearSelectedItem", "listStyle", "loadingText", "onChange", "placeholder", "prepend", "readOnly", "selectedItem", "selectOnBlur", "style", "variant"];
2054
2142
  var DropdownBeta = function DropdownBeta(_ref) {
2055
2143
  var _ref3, _selectedItem$label;
2056
- var className = _ref.className,
2144
+ var ariaLabelCloseList = _ref.ariaLabelCloseList,
2145
+ ariaLabelOpenList = _ref.ariaLabelOpenList,
2146
+ className = _ref.className,
2057
2147
  _ref$disabled = _ref.disabled,
2058
2148
  disabled = _ref$disabled === void 0 ? false : _ref$disabled,
2059
2149
  disableLabelAnimation = _ref.disableLabelAnimation,
2060
2150
  feedback = _ref.feedback,
2061
2151
  initialItems = _ref.items,
2062
2152
  label = _ref.label,
2063
- labelTooltip = _ref.labelTooltip,
2153
+ _ref$labelClearSelect = _ref.labelClearSelectedItem,
2154
+ labelClearSelectedItem = _ref$labelClearSelect === void 0 ? 'fjern valgt' : _ref$labelClearSelect,
2064
2155
  listStyle = _ref.listStyle,
2065
2156
  loadingText = _ref.loadingText,
2066
2157
  onChange = _ref.onChange,
@@ -2074,14 +2165,14 @@ var DropdownBeta = function DropdownBeta(_ref) {
2074
2165
  style = _ref.style,
2075
2166
  _ref$variant = _ref.variant,
2076
2167
  variant = _ref$variant === void 0 ? 'info' : _ref$variant,
2077
- rest = _objectWithoutPropertiesLoose(_ref, _excluded);
2078
- // TODO Husk å @deprecate searchable-prop-en til Dropdown når denne komponenten skal ha official release
2168
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded$1);
2079
2169
  var _useResolvedItems = useResolvedItems(initialItems),
2080
2170
  normalizedItems = _useResolvedItems.items,
2081
2171
  loading = _useResolvedItems.loading;
2082
2172
  var isFilled = selectedItem !== null || placeholder !== undefined;
2083
2173
  var _useSelect = useSelect({
2084
2174
  items: normalizedItems,
2175
+ defaultHighlightedIndex: selectedItem ? undefined : 0,
2085
2176
  selectedItem: selectedItem,
2086
2177
  onStateChange: function onStateChange(_ref2) {
2087
2178
  var type = _ref2.type,
@@ -2090,7 +2181,7 @@ var DropdownBeta = function DropdownBeta(_ref) {
2090
2181
  // @ts-expect-error This falltrough is wanted
2091
2182
  case useSelect.stateChangeTypes.InputBlur:
2092
2183
  if (!selectOnBlur) break;
2093
- case useSelect.stateChangeTypes.MenuKeyDownEnter: // eslint-disable-line no-fallthrough
2184
+ case useSelect.stateChangeTypes.ToggleButtonKeyDownEnter: // eslint-disable-line no-fallthrough
2094
2185
  case useSelect.stateChangeTypes.ItemClick:
2095
2186
  onChange == null ? void 0 : onChange(clickedItem !== undefined ? clickedItem : null);
2096
2187
  }
@@ -2106,10 +2197,13 @@ var DropdownBeta = function DropdownBeta(_ref) {
2106
2197
  return React.createElement("div", {
2107
2198
  className: "eds-dropdown__wrapper"
2108
2199
  }, React.createElement(BaseFormControl, _extends({
2109
- append: React.createElement(FieldAppend, {
2200
+ append: React.createElement(FieldAppend$1, {
2201
+ ariaHiddenToggleButton: true,
2202
+ ariaLabelCloseList: ariaLabelCloseList,
2203
+ ariaLabelOpenList: ariaLabelOpenList,
2110
2204
  clearable: true,
2111
- clearSelectedItemsLabel: "Fjern valgt",
2112
- focusable: true,
2205
+ labelClearSelectedItems: labelClearSelectedItem,
2206
+ focusable: false,
2113
2207
  getToggleButtonProps: getToggleButtonProps,
2114
2208
  isOpen: isOpen,
2115
2209
  loading: loading,
@@ -2130,12 +2224,11 @@ var DropdownBeta = function DropdownBeta(_ref) {
2130
2224
  label: label,
2131
2225
  labelId: getLabelProps().id,
2132
2226
  labelProps: getLabelProps(),
2133
- labelTooltip: labelTooltip,
2134
2227
  prepend: prepend,
2135
2228
  readOnly: readOnly,
2136
2229
  style: style,
2137
2230
  variant: variant
2138
- }, rest), React.createElement("div", _extends({
2231
+ }, rest), React.createElement("button", _extends({
2139
2232
  className: "eds-dropdown__selected-item-button"
2140
2233
  }, getToggleButtonProps()), (_ref3 = (_selectedItem$label = selectedItem == null ? void 0 : selectedItem.label) != null ? _selectedItem$label : React.createElement("span", {
2141
2234
  className: classNames('eds-dropdown__selected-item-button__placeholder', {
@@ -2154,6 +2247,90 @@ var DropdownBeta = function DropdownBeta(_ref) {
2154
2247
  }));
2155
2248
  };
2156
2249
 
2250
+ var _excluded = ["className", "disabled", "disableLabelAnimation", "feedback", "items", "label", "loadingText", "onChange", "prepend", "readOnly", "selectedItem", "style", "value", "variant"];
2251
+ var NativeDropdown = function NativeDropdown(_ref) {
2252
+ var _ref2;
2253
+ var className = _ref.className,
2254
+ _ref$disabled = _ref.disabled,
2255
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
2256
+ disableLabelAnimation = _ref.disableLabelAnimation,
2257
+ feedback = _ref.feedback,
2258
+ items = _ref.items,
2259
+ label = _ref.label,
2260
+ loadingText = _ref.loadingText,
2261
+ _onChange = _ref.onChange,
2262
+ prepend = _ref.prepend,
2263
+ _ref$readOnly = _ref.readOnly,
2264
+ readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
2265
+ selectedItem = _ref.selectedItem,
2266
+ style = _ref.style,
2267
+ value = _ref.value,
2268
+ variant = _ref.variant,
2269
+ rest = _objectWithoutPropertiesLoose(_ref, _excluded);
2270
+ var _useResolvedItems = useResolvedItems(items),
2271
+ normalizedItems = _useResolvedItems.items,
2272
+ loading = _useResolvedItems.loading;
2273
+ var nativeDropdownId = useRandomId('eds-dropdown-native');
2274
+ return React.createElement(BaseFormControl, {
2275
+ disabled: disabled,
2276
+ readOnly: readOnly,
2277
+ prepend: prepend,
2278
+ append: React.createElement(FieldAppend, {
2279
+ hidden: disabled || readOnly,
2280
+ loading: loading,
2281
+ loadingText: loadingText
2282
+ }),
2283
+ className: className,
2284
+ style: style,
2285
+ label: label,
2286
+ labelId: nativeDropdownId,
2287
+ variant: variant,
2288
+ feedback: feedback,
2289
+ disableLabelAnimation: disableLabelAnimation,
2290
+ isFilled: true
2291
+ }, React.createElement("select", _extends({
2292
+ "aria-invalid": variant === 'error',
2293
+ "aria-labelledby": nativeDropdownId,
2294
+ "aria-busy": loading,
2295
+ className: "eds-form-control eds-dropdown--native",
2296
+ disabled: disabled || readOnly,
2297
+ onChange: function onChange(event) {
2298
+ var _normalizedItems$find;
2299
+ _onChange == null ? void 0 : _onChange({
2300
+ value: event.target.value,
2301
+ selectedItem: (_normalizedItems$find = normalizedItems.find(function (item) {
2302
+ return item.value === event.target.value;
2303
+ })) != null ? _normalizedItems$find : null,
2304
+ target: event.target
2305
+ });
2306
+ },
2307
+ value: (_ref2 = value != null ? value : selectedItem == null ? void 0 : selectedItem.value) != null ? _ref2 : undefined
2308
+ }, rest), normalizedItems.map(function (item) {
2309
+ return React.createElement("option", {
2310
+ key: item.value,
2311
+ value: item.value
2312
+ }, item.label);
2313
+ })));
2314
+ };
2315
+ var FieldAppend = function FieldAppend(_ref3) {
2316
+ var loading = _ref3.loading,
2317
+ loadingText = _ref3.loadingText,
2318
+ hidden = _ref3.hidden;
2319
+ if (loading) {
2320
+ return React.createElement("div", {
2321
+ className: "eds-dropdown-native__loading-dots"
2322
+ }, React.createElement(LoadingDots, {
2323
+ "aria-label": loadingText
2324
+ }));
2325
+ }
2326
+ if (hidden) {
2327
+ return React.createElement(React.Fragment, null);
2328
+ }
2329
+ return React.createElement(DownArrowIcon, {
2330
+ inline: true
2331
+ });
2332
+ };
2333
+
2157
2334
  warnAboutMissingStyles('dropdown', 'form', 'a11y', 'chip');
2158
2335
 
2159
2336
  export { Dropdown, DropdownBeta, MultiSelect, MultiSelectBeta, NativeDropdown, SearchableDropdownBeta };