Default (Popper.js)
+FloatingPopup
++ Dropdown flips when there is not enough space below. +
+
+ The dropdown uses var(--anchor-width) to match the input width. Autocomplete
+ already passes style.width via additionalProps, but the CSS
+ variable is also available.
+
+ The dropdown stays in the DOM when closed (inspect to verify). +
+
+ {'
+
+ Uses autoPlacement() middleware. Scroll the button near an edge, then hover.
+
+ FloatingPopup sets --anchor-width, --anchor-height,{' '}
+ --available-width, --available-height on the floating element.
+
Default (Popper.js)
+FloatingPopup
+
+ {'
+
useState. Also works: RefObject (resolved lazily via Derivable pattern + useLayoutEffect)."
+ }
+ },
+ "classDescriptions": {}
+}
diff --git a/packages/mui-material/package.json b/packages/mui-material/package.json
index c048e78287d664..a9568d430a1140 100644
--- a/packages/mui-material/package.json
+++ b/packages/mui-material/package.json
@@ -34,6 +34,7 @@
},
"dependencies": {
"@babel/runtime": "^7.29.2",
+ "@floating-ui/react-dom": "^2.1.6",
"@mui/core-downloads-tracker": "workspace:^",
"@mui/system": "workspace:*",
"@mui/types": "workspace:^",
@@ -99,6 +100,7 @@
"./ClickAwayListener": "./src/ClickAwayListener/index.ts",
"./darkScrollbar": "./src/darkScrollbar/index.ts",
"./DefaultPropsProvider": "./src/DefaultPropsProvider/index.ts",
+ "./FloatingPopup": "./src/FloatingPopup/index.ts",
"./generateUtilityClass": "./src/generateUtilityClass/index.ts",
"./generateUtilityClasses": "./src/generateUtilityClasses/index.ts",
"./Grid": "./src/Grid/index.ts",
diff --git a/packages/mui-material/src/Autocomplete/Autocomplete.d.ts b/packages/mui-material/src/Autocomplete/Autocomplete.d.ts
index cf58f50550c5e3..fa0771cfb120d7 100644
--- a/packages/mui-material/src/Autocomplete/Autocomplete.d.ts
+++ b/packages/mui-material/src/Autocomplete/Autocomplete.d.ts
@@ -20,9 +20,13 @@ import useAutocomplete, {
} from '../useAutocomplete';
import { AutocompleteClasses } from './autocompleteClasses';
import { CreateSlotsAndSlotProps, SlotProps } from '../utils/types';
+import { FloatingPopupProps } from '../FloatingPopup';
export interface AutocompletePaperSlotPropsOverrides {}
-export interface AutocompletePopperSlotPropsOverrides {}
+export interface AutocompletePopperSlotPropsOverrides extends Pick<
+ FloatingPopupProps,
+ 'middleware' | 'strategy' | 'transform' | 'arrowPadding'
+> {}
export {
AutocompleteChangeDetails,
@@ -145,7 +149,7 @@ export interface AutocompleteSlots {
* The component used to position the popup.
* @default Popper
*/
- popper: React.JSXElementConstructor