@entur/dropdown 7.3.9-beta.0 → 7.3.10

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