@entur/dropdown 7.3.7 → 7.3.9-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -55,7 +55,7 @@ export type MultiSelectProps<ValueType> = Omit<DropdownProps<ValueType>, 'select
55
55
  /** Callback som kalles når brukeren går ut av input-feltet */
56
56
  onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;
57
57
  /** Callback når komponenten klikkes */
58
- onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;
58
+ onClick?: (event: React.MouseEvent<HTMLElement>) => void;
59
59
  /** Callback når en tast trykkes */
60
60
  onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;
61
61
  /** Callback når komponenten får fokus */
@@ -115,7 +115,7 @@ export declare const MultiSelect: <ValueType extends unknown>(props: Omit<Dropdo
115
115
  /** Callback som kalles når brukeren går ut av input-feltet */
116
116
  onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;
117
117
  /** Callback når komponenten klikkes */
118
- onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;
118
+ onClick?: (event: React.MouseEvent<HTMLElement>) => void;
119
119
  /** Callback når en tast trykkes */
120
120
  onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;
121
121
  /** Callback når komponenten får fokus */
@@ -17,7 +17,7 @@ export type SearchableDropdownProps<ValueType> = DropdownProps<ValueType> & {
17
17
  /** Callback som kalles når brukeren går ut av input-feltet */
18
18
  onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;
19
19
  /** Callback når komponenten klikkes */
20
- onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;
20
+ onClick?: (event: React.MouseEvent<HTMLElement>) => void;
21
21
  /** Callback når en tast trykkes */
22
22
  onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;
23
23
  /** Callback når komponenten får fokus */
@@ -39,7 +39,7 @@ export declare const SearchableDropdown: <ValueType extends unknown>(props: Drop
39
39
  /** Callback som kalles når brukeren går ut av input-feltet */
40
40
  onBlur?: (event: React.FocusEvent<HTMLInputElement>) => void;
41
41
  /** Callback når komponenten klikkes */
42
- onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;
42
+ onClick?: (event: React.MouseEvent<HTMLElement>) => void;
43
43
  /** Callback når en tast trykkes */
44
44
  onKeyDown?: (event: React.KeyboardEvent<HTMLDivElement>) => void;
45
45
  /** Callback når komponenten får fokus */
@@ -1,10 +1,9 @@
1
- import { default as React } from 'react';
1
+ import { default as React, MutableRefObject } from 'react';
2
2
  import { UseComboboxPropGetters, UseSelectPropGetters } from 'downshift';
3
3
  import { NormalizedDropdownItemType } from '../types';
4
4
  type DropdownListProps<ValueType> = {
5
5
  ariaLabelChosenSingular?: string;
6
6
  ariaLabelSelectedItem?: string;
7
- getMenuProps: UseComboboxPropGetters<ValueType>['getMenuProps'] | UseSelectPropGetters<ValueType>['getMenuProps'];
8
7
  getItemProps: UseComboboxPropGetters<ValueType>['getItemProps'] | UseSelectPropGetters<ValueType>['getItemProps'];
9
8
  highlightedIndex: number;
10
9
  isOpen: boolean;
@@ -12,15 +11,15 @@ type DropdownListProps<ValueType> = {
12
11
  floatingStyles: {
13
12
  [key: string]: any;
14
13
  } | undefined;
15
- setListRef: (node: HTMLElement | null) => void;
14
+ innerRef?: MutableRefObject<HTMLUListElement> | ((node: HTMLElement | null) => void);
16
15
  loading?: boolean;
17
16
  loadingText?: string;
18
17
  noMatchesText?: string;
19
- selectAllCheckboxState?: () => boolean | 'indeterminate';
18
+ selectAllCheckboxState?: boolean | 'indeterminate';
20
19
  selectAllItem?: NormalizedDropdownItemType<string>;
21
20
  selectedItems: NormalizedDropdownItemType<ValueType>[];
22
21
  style?: React.CSSProperties;
23
22
  readOnly?: boolean;
24
23
  };
25
- export declare const DropdownList: <ValueType extends unknown>({ ariaLabelChosenSingular, ariaLabelSelectedItem, getItemProps, getMenuProps, isOpen, highlightedIndex, listItems, floatingStyles, setListRef, loading, loadingText, noMatchesText, selectAllCheckboxState, selectAllItem, selectedItems, readOnly, ...rest }: DropdownListProps<ValueType>) => React.JSX.Element;
24
+ export declare const DropdownList: <ValueType extends unknown>({ ariaLabelChosenSingular, ariaLabelSelectedItem, getItemProps, isOpen, highlightedIndex, listItems, floatingStyles, innerRef, loading, loadingText, noMatchesText, readOnly, selectAllCheckboxState, selectAllItem, selectedItems, style, ...rest }: DropdownListProps<ValueType>) => React.JSX.Element;
26
25
  export {};
@@ -18,28 +18,32 @@ const DropdownList = ({
18
18
  ariaLabelChosenSingular = "valgt",
19
19
  ariaLabelSelectedItem = ", valgt element, trykk for å fjerne",
20
20
  getItemProps,
21
- getMenuProps,
22
21
  isOpen,
23
22
  highlightedIndex,
24
23
  listItems,
25
24
  floatingStyles,
26
- setListRef,
25
+ innerRef,
27
26
  loading = false,
28
27
  loadingText = "Laster inn …",
29
28
  noMatchesText = "Ingen treff for søket",
29
+ readOnly = false,
30
30
  selectAllCheckboxState,
31
31
  selectAllItem,
32
32
  selectedItems,
33
- readOnly = false,
33
+ style,
34
34
  ...rest
35
35
  }) => {
36
36
  const isMultiselect = selectAllItem !== void 0;
37
37
  const isNoMatches = !loading && (listItems.length === 0 || listItems?.length === 1 && listItems?.[0]?.value === selectAllItem?.value);
38
- const isItemSelected = (item) => selectedItems.some(
39
- (selectedItem) => selectedItem?.value === item?.value && selectedItem?.label === item?.label
40
- );
38
+ const isItemSelected = (item) => selectedItems.some((selectedItem) => {
39
+ if (selectedItem?.value !== item?.value) return false;
40
+ if (selectedItem?.label && item?.label) {
41
+ return selectedItem.label === item.label;
42
+ }
43
+ return true;
44
+ });
41
45
  const ariaValuesSelectAll = () => {
42
- switch (selectAllCheckboxState?.()) {
46
+ switch (selectAllCheckboxState) {
43
47
  case "indeterminate": {
44
48
  return {
45
49
  label: `${selectAllItem?.label}, delvis valgt`,
@@ -62,7 +66,7 @@ const DropdownList = ({
62
66
  form.Checkbox,
63
67
  {
64
68
  "aria-hidden": "true",
65
- checked: selectAllCheckboxState?.(),
69
+ checked: selectAllCheckboxState,
66
70
  className: "eds-dropdown__list__item__checkbox",
67
71
  tabIndex: -1,
68
72
  onChange: () => void 0
@@ -109,75 +113,68 @@ const DropdownList = ({
109
113
  }) : null
110
114
  ] });
111
115
  };
112
- return (
113
- // use popover from @entur/tooltip when that package upgrades to floating-ui
114
- /* @__PURE__ */ jsxRuntime.jsx(
115
- "ul",
116
- {
117
- ...getMenuProps({
118
- "aria-multiselectable": isMultiselect,
119
- ref: setListRef,
120
- className: "eds-dropdown__list",
121
- style: {
122
- ...floatingStyles,
123
- display: isOpen && !readOnly ? void 0 : "none",
124
- ...rest.style
125
- }
126
- }),
127
- children: (() => {
128
- if (!isOpen || readOnly) {
129
- return null;
130
- }
131
- if (loading) {
132
- return /* @__PURE__ */ jsxRuntime.jsx(
133
- "li",
134
- {
135
- className: "eds-dropdown__list__item",
136
- children: loadingText
137
- },
138
- "dropdown-list-loading"
139
- );
140
- }
141
- if (isNoMatches) {
142
- return /* @__PURE__ */ jsxRuntime.jsx(
143
- "li",
144
- {
145
- className: "eds-dropdown__list__item",
146
- children: noMatchesText
147
- },
148
- "dropdown-list-no-match"
149
- );
150
- }
151
- return listItems.map((item, index) => {
152
- const key = item.itemKey ?? `${item.label ?? ""}-${item.value ?? ""}-${(item.icons ?? []).map((icon) => icon?.displayName ?? icon?.name ?? "unknown").join("-")}`;
153
- const itemIsSelectAll = item.value === selectAllItem?.value;
154
- if (itemIsSelectAll && listItems.length <= 2) return null;
155
- return /* @__PURE__ */ jsxRuntime.jsx(
156
- "li",
157
- {
158
- className: classNames("eds-dropdown__list__item", {
159
- "eds-dropdown__list__item--select-all": itemIsSelectAll,
160
- "eds-dropdown__list__item--highlighted": highlightedIndex === index,
161
- "eds-dropdown__list__item--selected": !isMultiselect && isItemSelected(item)
162
- }),
163
- ...getItemProps({
164
- // @ts-expect-error Since getItemProps expects the same item type
165
- // here as items, it throws error when selectAllItem is a string.
166
- // This does, however, not cause any functional issues.
167
- item,
168
- index,
169
- "aria-selected": itemIsSelectAll ? ariaValuesSelectAll().selected : isItemSelected(item)
170
- }),
171
- children: itemIsSelectAll ? selectAllListItemContent() : listItemContent(
172
- item
173
- )
174
- },
175
- key
176
- );
177
- });
178
- })()
179
- }
180
- )
116
+ return /* @__PURE__ */ jsxRuntime.jsx(
117
+ "ul",
118
+ {
119
+ className: "eds-dropdown__list",
120
+ ref: innerRef,
121
+ style: {
122
+ display: isOpen && !readOnly ? void 0 : "none",
123
+ ...floatingStyles,
124
+ ...style
125
+ },
126
+ ...rest,
127
+ children: (() => {
128
+ if (!isOpen || readOnly) return null;
129
+ if (loading) {
130
+ return /* @__PURE__ */ jsxRuntime.jsx(
131
+ "li",
132
+ {
133
+ className: "eds-dropdown__list__item",
134
+ children: loadingText
135
+ },
136
+ "dropdown-list-loading"
137
+ );
138
+ }
139
+ if (isNoMatches) {
140
+ return /* @__PURE__ */ jsxRuntime.jsx(
141
+ "li",
142
+ {
143
+ className: "eds-dropdown__list__item",
144
+ children: noMatchesText
145
+ },
146
+ "dropdown-list-no-match"
147
+ );
148
+ }
149
+ return listItems.map((item, index) => {
150
+ const key = item.itemKey ?? `${item.label ?? ""}-${item.value ?? ""}-${(item.icons ?? []).map((icon) => icon?.displayName ?? icon?.name ?? "unknown").join("-")}`;
151
+ const itemIsSelectAll = item.value === selectAllItem?.value;
152
+ if (itemIsSelectAll && listItems.length <= 2) return null;
153
+ return /* @__PURE__ */ jsxRuntime.jsx(
154
+ "li",
155
+ {
156
+ className: classNames("eds-dropdown__list__item", {
157
+ "eds-dropdown__list__item--select-all": itemIsSelectAll,
158
+ "eds-dropdown__list__item--highlighted": highlightedIndex === index,
159
+ "eds-dropdown__list__item--selected": !isMultiselect && isItemSelected(item)
160
+ }),
161
+ ...getItemProps({
162
+ // @ts-expect-error Since getItemProps expects the same item type
163
+ // here as items, it throws error when selectAllItem is a string.
164
+ // This does, however, not cause any functional issues.
165
+ item,
166
+ index,
167
+ "aria-selected": itemIsSelectAll ? ariaValuesSelectAll().selected : isItemSelected(item)
168
+ }),
169
+ children: itemIsSelectAll ? selectAllListItemContent() : listItemContent(
170
+ item
171
+ )
172
+ },
173
+ key
174
+ );
175
+ });
176
+ })()
177
+ }
181
178
  );
182
179
  };
183
180
  const SelectedItemTag = ({
@@ -453,11 +450,11 @@ const useMultiselectUtils = ({
453
450
  (selectedItem) => selectedItem.value !== clickedItem.value
454
451
  )
455
452
  );
456
- const selectAllCheckboxState = () => {
453
+ const selectAllCheckboxState = React.useMemo(() => {
457
454
  if (allListItemsAreSelected) return true;
458
455
  if (someListItemsAreSelected) return "indeterminate";
459
456
  return false;
460
- };
457
+ }, [allListItemsAreSelected, someListItemsAreSelected]);
461
458
  const selectAllUnselectedItemsInListItems = (onChange) => {
462
459
  onChange([...selectedItems, ...unselectedItemsInListItems]);
463
460
  };
@@ -551,7 +548,6 @@ const SearchableDropdown = React.forwardRef(
551
548
  const resetInputState = ({
552
549
  changes
553
550
  }) => {
554
- updateListItems({ inputValue: EMPTY_INPUT });
555
551
  return {
556
552
  ...changes,
557
553
  inputValue: EMPTY_INPUT
@@ -580,11 +576,12 @@ const SearchableDropdown = React.forwardRef(
580
576
  // empty input to show selected item and reset dropdown list on item selection
581
577
  case downshift.useCombobox.stateChangeTypes.ItemClick:
582
578
  case downshift.useCombobox.stateChangeTypes.InputKeyDownEnter:
583
- case downshift.useCombobox.stateChangeTypes.InputBlur:
584
579
  return resetInputState({ changes });
580
+ case downshift.useCombobox.stateChangeTypes.InputBlur:
581
+ return resetInputState({
582
+ changes: { ...changes, selectedItem: value }
583
+ });
585
584
  case downshift.useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem:
586
- if (changes.selectedItem !== null && !inputHasFocus)
587
- setShowSelectedItem(true);
588
585
  return resetInputState({ changes });
589
586
  // remove leading whitespace, select element with spacebar on empty input
590
587
  case downshift.useCombobox.stateChangeTypes.InputChange: {
@@ -655,19 +652,17 @@ const SearchableDropdown = React.forwardRef(
655
652
  reactDom.offset(tokens.space.extraSmall2),
656
653
  reactDom.shift({ padding: tokens.space.extraSmall }),
657
654
  reactDom.size({
658
- apply({ rects, elements, availableHeight }) {
659
- Object.assign(elements.floating.style, {
660
- width: `${rects.reference.width}px`,
661
- // Floating will flip when smaller than 10*16 px
662
- // and never exceed 20*16 px.
663
- maxHeight: `${clamp(10 * 16, availableHeight, 20 * 16)}px`
664
- });
655
+ apply({ elements, availableHeight }) {
656
+ elements.floating.style.setProperty(
657
+ "--list-max-height",
658
+ `${clamp(10 * 16, availableHeight, 20 * 16)}px`
659
+ );
665
660
  }
666
661
  }),
667
662
  reactDom.flip({ fallbackStrategy: "initialPlacement" })
668
663
  ]
669
664
  });
670
- React.useEffect(() => {
665
+ React.useLayoutEffect(() => {
671
666
  if (isOpen && refs.reference.current && refs.floating.current) {
672
667
  return reactDom.autoUpdate(
673
668
  refs.reference.current,
@@ -698,9 +693,7 @@ const SearchableDropdown = React.forwardRef(
698
693
  labelProps: getLabelProps(),
699
694
  labelTooltip,
700
695
  onClick: (e) => {
701
- if (e.target === e.currentTarget) {
702
- getInputProps()?.onClick?.(e);
703
- }
696
+ if (e.target === e.currentTarget) getInputProps()?.onClick?.(e);
704
697
  onClick?.(e);
705
698
  },
706
699
  onKeyDown,
@@ -718,17 +711,19 @@ const SearchableDropdown = React.forwardRef(
718
711
  ariaLabelSelectedItem,
719
712
  floatingStyles,
720
713
  getItemProps,
721
- getMenuProps,
722
714
  highlightedIndex,
723
715
  isOpen,
724
716
  listItems,
725
- style: listStyle,
726
- setListRef: refs.setFloating,
727
717
  loading: loading ?? resolvedItemsLoading,
728
718
  loadingText,
729
719
  noMatchesText,
730
720
  selectedItems: selectedItem !== null ? [selectedItem] : [],
731
- readOnly
721
+ readOnly,
722
+ ...getMenuProps({
723
+ refKey: "innerRef",
724
+ ref: refs.setFloating,
725
+ style: listStyle
726
+ })
732
727
  }
733
728
  ),
734
729
  ...rest,
@@ -760,8 +755,9 @@ const SearchableDropdown = React.forwardRef(
760
755
  onKeyDown(e) {
761
756
  if (isOpen && e.key === "Tab") {
762
757
  const highlitedItem = listItems[highlightedIndex];
763
- if ((selectOnTab || selectOnBlur) && highlitedItem && highlitedItem !== selectedItem) {
758
+ if ((selectOnTab || selectOnBlur) && highlitedItem) {
764
759
  selectItem(highlitedItem);
760
+ setShowSelectedItem(true);
765
761
  }
766
762
  }
767
763
  },
@@ -883,15 +879,21 @@ const MultiSelect = React.forwardRef(
883
879
  ...!hideSelectAll ? [selectAll] : [],
884
880
  ...normalizedItems
885
881
  ]);
886
- const filterListItems = ({ inputValue: inputValue2 }) => setListItems([
887
- ...!hideSelectAll ? [selectAll] : [],
888
- ...normalizedItems.filter((item) => itemFilter(item, inputValue2))
889
- ]);
890
- const updateListItems = ({ inputValue: inputValue2 }) => {
891
- const shouldRefetchItems = isFunctionWithQueryArgument(initialItems);
892
- if (shouldRefetchItems) fetchItems(inputValue2 ?? EMPTY_INPUT);
893
- filterListItems({ inputValue: inputValue2 ?? EMPTY_INPUT });
894
- };
882
+ const filterListItems = React.useCallback(
883
+ ({ inputValue: inputValue2 }) => setListItems([
884
+ ...!hideSelectAll ? [selectAll] : [],
885
+ ...normalizedItems.filter((item) => itemFilter(item, inputValue2))
886
+ ]),
887
+ [hideSelectAll, selectAll, normalizedItems, itemFilter]
888
+ );
889
+ const updateListItems = React.useCallback(
890
+ ({ inputValue: inputValue2 }) => {
891
+ const shouldRefetchItems = isFunctionWithQueryArgument(initialItems);
892
+ if (shouldRefetchItems) fetchItems(inputValue2 ?? EMPTY_INPUT);
893
+ filterListItems({ inputValue: inputValue2 ?? EMPTY_INPUT });
894
+ },
895
+ [filterListItems, initialItems, fetchItems]
896
+ );
895
897
  React.useEffect(() => {
896
898
  filterListItems({ inputValue });
897
899
  }, [normalizedItems]);
@@ -956,6 +958,8 @@ const MultiSelect = React.forwardRef(
956
958
  case downshift.useCombobox.stateChangeTypes.InputChange: {
957
959
  const leadingWhitespaceTest = /^\s+/g;
958
960
  const isSpacePressedOnEmptyInput = changes.inputValue === " ";
961
+ if (!isSpacePressedOnEmptyInput)
962
+ setLastHighlightedIndex(hideSelectAll ? 0 : 1);
959
963
  if (changes.inputValue?.match(leadingWhitespaceTest)) {
960
964
  const sanitizedInputValue = changes.inputValue.replace(
961
965
  leadingWhitespaceTest,
@@ -977,13 +981,13 @@ const MultiSelect = React.forwardRef(
977
981
  }
978
982
  }
979
983
  }
980
- return changes;
984
+ return { ...changes, highlightedIndex: hideSelectAll ? 0 : 1 };
981
985
  }
982
986
  default:
983
987
  return changes;
984
988
  }
985
989
  },
986
- [hideSelectAll, normalizedItems, filterListItems, initialItems]
990
+ [hideSelectAll, normalizedItems, initialItems]
987
991
  );
988
992
  const {
989
993
  getInputProps,
@@ -992,7 +996,6 @@ const MultiSelect = React.forwardRef(
992
996
  getMenuProps,
993
997
  getToggleButtonProps,
994
998
  highlightedIndex,
995
- setHighlightedIndex,
996
999
  inputValue,
997
1000
  isOpen,
998
1001
  setInputValue
@@ -1005,8 +1008,6 @@ const MultiSelect = React.forwardRef(
1005
1008
  stateReducer,
1006
1009
  onInputValueChange(changes) {
1007
1010
  updateListItems({ inputValue: changes.inputValue });
1008
- setHighlightedIndex(hideSelectAll ? 0 : 1);
1009
- setLastHighlightedIndex(hideSelectAll ? 0 : 1);
1010
1011
  },
1011
1012
  onSelectedItemChange({ selectedItem: clickedItem }) {
1012
1013
  if (!clickedItem) return;
@@ -1030,19 +1031,17 @@ const MultiSelect = React.forwardRef(
1030
1031
  reactDom.offset(tokens.space.extraSmall2),
1031
1032
  reactDom.shift({ padding: tokens.space.extraSmall }),
1032
1033
  reactDom.size({
1033
- apply({ rects, elements, availableHeight }) {
1034
- Object.assign(elements.floating.style, {
1035
- width: `${rects.reference.width}px`,
1036
- // Floating will flip when smaller than 10*16 px
1037
- // and never exceed 20*16 px.
1038
- maxHeight: `${clamp(10 * 16, availableHeight, 20 * 16)}px`
1039
- });
1034
+ apply({ elements, availableHeight }) {
1035
+ elements.floating.style.setProperty(
1036
+ "--list-max-height",
1037
+ `${clamp(10 * 16, availableHeight, 20 * 16)}px`
1038
+ );
1040
1039
  }
1041
1040
  }),
1042
1041
  reactDom.flip({ fallbackStrategy: "initialPlacement" })
1043
1042
  ]
1044
1043
  });
1045
- React.useEffect(() => {
1044
+ React.useLayoutEffect(() => {
1046
1045
  if (isOpen && refs.reference.current && refs.floating.current) {
1047
1046
  return reactDom.autoUpdate(
1048
1047
  refs.reference.current,
@@ -1072,14 +1071,8 @@ const MultiSelect = React.forwardRef(
1072
1071
  labelId: getLabelProps().id,
1073
1072
  labelProps: getLabelProps(),
1074
1073
  labelTooltip,
1075
- onBlur: (e) => {
1076
- setInputValue("");
1077
- onBlur?.(e);
1078
- },
1079
1074
  onClick: (e) => {
1080
- if (e.target === e.currentTarget) {
1081
- getInputProps()?.onClick?.(e);
1082
- }
1075
+ if (e.target === e.currentTarget) getInputProps()?.onClick?.(e);
1083
1076
  onClick?.(e);
1084
1077
  },
1085
1078
  onKeyDown,
@@ -1095,19 +1088,22 @@ const MultiSelect = React.forwardRef(
1095
1088
  ariaLabelSelectedItem,
1096
1089
  floatingStyles,
1097
1090
  getItemProps,
1098
- getMenuProps,
1099
1091
  highlightedIndex,
1100
1092
  isOpen,
1101
1093
  listItems,
1102
- style: listStyle,
1103
- setListRef: refs.setFloating,
1104
1094
  loading: loading ?? resolvedItemsLoading,
1105
1095
  loadingText,
1106
1096
  noMatchesText,
1107
1097
  selectAllCheckboxState,
1108
1098
  selectAllItem: selectAll,
1109
1099
  selectedItems,
1110
- readOnly
1100
+ readOnly,
1101
+ ...getMenuProps({
1102
+ "aria-multiselectable": true,
1103
+ refKey: "innerRef",
1104
+ ref: refs.setFloating,
1105
+ style: listStyle
1106
+ })
1111
1107
  }
1112
1108
  ),
1113
1109
  ...rest,
@@ -1166,6 +1162,10 @@ const MultiSelect = React.forwardRef(
1166
1162
  });
1167
1163
  }
1168
1164
  },
1165
+ onBlur: (e) => {
1166
+ setInputValue("");
1167
+ onBlur?.(e);
1168
+ },
1169
1169
  ...getDropdownProps({
1170
1170
  preventKeyAction: isOpen,
1171
1171
  value: inputValue ?? EMPTY_INPUT,
@@ -1276,19 +1276,17 @@ const Dropdown = React.forwardRef(
1276
1276
  reactDom.offset(tokens.space.extraSmall2),
1277
1277
  reactDom.shift({ padding: tokens.space.extraSmall }),
1278
1278
  reactDom.size({
1279
- apply({ rects, elements, availableHeight }) {
1280
- Object.assign(elements.floating.style, {
1281
- width: `${rects.reference.width}px`,
1282
- // Floating will flip when smaller than 10*16 px
1283
- // and never exceed 20*16 px.
1284
- maxHeight: `${clamp(10 * 16, availableHeight, 20 * 16)}px`
1285
- });
1279
+ apply({ elements, availableHeight }) {
1280
+ elements.floating.style.setProperty(
1281
+ "--list-max-height",
1282
+ `${clamp(10 * 16, availableHeight, 20 * 16)}px`
1283
+ );
1286
1284
  }
1287
1285
  }),
1288
1286
  reactDom.flip({ fallbackStrategy: "initialPlacement" })
1289
1287
  ]
1290
1288
  });
1291
- React.useEffect(() => {
1289
+ React.useLayoutEffect(() => {
1292
1290
  if (isOpen && refs.reference.current && refs.floating.current) {
1293
1291
  return reactDom.autoUpdate(
1294
1292
  refs.reference.current,
@@ -1341,17 +1339,19 @@ const Dropdown = React.forwardRef(
1341
1339
  ariaLabelSelectedItem,
1342
1340
  floatingStyles,
1343
1341
  getItemProps,
1344
- getMenuProps,
1345
1342
  highlightedIndex,
1346
1343
  isOpen,
1347
1344
  listItems: normalizedItems,
1348
- noMatchesText,
1349
- style: listStyle,
1350
- setListRef: refs.setFloating,
1351
1345
  loading: loading ?? resolvedItemsLoading,
1352
1346
  loadingText,
1347
+ noMatchesText,
1353
1348
  selectedItems: selectedItem !== null ? [selectedItem] : [],
1354
- readOnly
1349
+ readOnly,
1350
+ ...getMenuProps({
1351
+ refKey: "innerRef",
1352
+ ref: refs.setFloating,
1353
+ style: listStyle
1354
+ })
1355
1355
  }
1356
1356
  ),
1357
1357
  ...rest,