@mui/material 9.0.0-alpha.4 → 9.0.0-beta.1

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.
Files changed (308) hide show
  1. package/Accordion/Accordion.d.mts +1 -1
  2. package/Accordion/Accordion.d.ts +1 -1
  3. package/AccordionSummary/AccordionSummary.js +1 -0
  4. package/AccordionSummary/AccordionSummary.mjs +1 -0
  5. package/Backdrop/Backdrop.d.mts +1 -1
  6. package/Backdrop/Backdrop.d.ts +1 -1
  7. package/BottomNavigationAction/BottomNavigationAction.js +1 -0
  8. package/BottomNavigationAction/BottomNavigationAction.mjs +1 -0
  9. package/Breadcrumbs/BreadcrumbCollapsed.js +5 -1
  10. package/Breadcrumbs/BreadcrumbCollapsed.mjs +5 -1
  11. package/Button/Button.js +1 -0
  12. package/Button/Button.mjs +1 -0
  13. package/ButtonBase/ButtonBase.d.mts +5 -0
  14. package/ButtonBase/ButtonBase.d.ts +5 -0
  15. package/ButtonBase/ButtonBase.js +84 -85
  16. package/ButtonBase/ButtonBase.mjs +84 -85
  17. package/ButtonBase/useButtonBase.d.mts +91 -0
  18. package/ButtonBase/useButtonBase.d.ts +91 -0
  19. package/ButtonBase/useButtonBase.js +174 -0
  20. package/ButtonBase/useButtonBase.mjs +167 -0
  21. package/ButtonGroup/ButtonGroup.js +1 -9
  22. package/ButtonGroup/ButtonGroup.mjs +1 -9
  23. package/ButtonGroup/buttonGroupClasses.d.mts +0 -68
  24. package/ButtonGroup/buttonGroupClasses.d.ts +0 -68
  25. package/ButtonGroup/buttonGroupClasses.js +1 -1
  26. package/ButtonGroup/buttonGroupClasses.mjs +1 -1
  27. package/CHANGELOG.md +119 -4
  28. package/CardActionArea/CardActionArea.js +1 -0
  29. package/CardActionArea/CardActionArea.mjs +1 -0
  30. package/CardHeader/CardHeader.d.mts +13 -21
  31. package/CardHeader/CardHeader.d.ts +13 -21
  32. package/CardHeader/CardHeader.js +3 -21
  33. package/CardHeader/CardHeader.mjs +3 -21
  34. package/Checkbox/Checkbox.js +1 -7
  35. package/Checkbox/Checkbox.mjs +1 -7
  36. package/Chip/Chip.d.mts +7 -0
  37. package/Chip/Chip.d.ts +7 -0
  38. package/Chip/Chip.js +66 -55
  39. package/Chip/Chip.mjs +66 -55
  40. package/Chip/chipClasses.d.mts +0 -104
  41. package/Chip/chipClasses.d.ts +0 -104
  42. package/Chip/chipClasses.js +1 -1
  43. package/Chip/chipClasses.mjs +1 -1
  44. package/Dialog/Dialog.d.mts +8 -22
  45. package/Dialog/Dialog.d.ts +8 -22
  46. package/Dialog/Dialog.js +43 -72
  47. package/Dialog/Dialog.mjs +43 -72
  48. package/Dialog/dialogClasses.d.mts +0 -8
  49. package/Dialog/dialogClasses.d.ts +0 -8
  50. package/Dialog/dialogClasses.js +1 -1
  51. package/Dialog/dialogClasses.mjs +1 -1
  52. package/Divider/Divider.js +2 -10
  53. package/Divider/Divider.mjs +2 -10
  54. package/Divider/dividerClasses.d.mts +0 -4
  55. package/Divider/dividerClasses.d.ts +0 -4
  56. package/Divider/dividerClasses.js +1 -1
  57. package/Divider/dividerClasses.mjs +1 -1
  58. package/Drawer/Drawer.d.mts +1 -13
  59. package/Drawer/Drawer.d.ts +1 -13
  60. package/Drawer/Drawer.js +6 -40
  61. package/Drawer/Drawer.mjs +6 -40
  62. package/Drawer/drawerClasses.d.mts +0 -32
  63. package/Drawer/drawerClasses.d.ts +0 -32
  64. package/Drawer/drawerClasses.js +1 -1
  65. package/Drawer/drawerClasses.mjs +1 -1
  66. package/Fab/Fab.js +1 -0
  67. package/Fab/Fab.mjs +1 -0
  68. package/FilledInput/FilledInput.js +4 -33
  69. package/FilledInput/FilledInput.mjs +4 -33
  70. package/Grid/Grid.d.mts +8 -3
  71. package/Grid/Grid.d.ts +8 -3
  72. package/Grid/Grid.js +8 -3
  73. package/Grid/Grid.mjs +8 -3
  74. package/Grid/gridClasses.js +1 -1
  75. package/Grid/gridClasses.mjs +1 -1
  76. package/IconButton/IconButton.js +1 -0
  77. package/IconButton/IconButton.mjs +1 -0
  78. package/ImageListItemBar/ImageListItemBar.js +4 -17
  79. package/ImageListItemBar/ImageListItemBar.mjs +4 -17
  80. package/ImageListItemBar/imageListItemBarClasses.d.mts +0 -16
  81. package/ImageListItemBar/imageListItemBarClasses.d.ts +0 -16
  82. package/ImageListItemBar/imageListItemBarClasses.js +1 -1
  83. package/ImageListItemBar/imageListItemBarClasses.mjs +1 -1
  84. package/Input/Input.js +4 -33
  85. package/Input/Input.mjs +4 -33
  86. package/Input/inputClasses.d.mts +0 -16
  87. package/Input/inputClasses.d.ts +0 -16
  88. package/InputAdornment/inputAdornmentClasses.d.mts +2 -2
  89. package/InputAdornment/inputAdornmentClasses.d.ts +2 -2
  90. package/InputBase/InputBase.d.mts +0 -27
  91. package/InputBase/InputBase.d.ts +0 -27
  92. package/InputBase/InputBase.js +6 -35
  93. package/InputBase/InputBase.mjs +6 -35
  94. package/InputBase/inputBaseClasses.d.mts +0 -20
  95. package/InputBase/inputBaseClasses.d.ts +0 -20
  96. package/InputBase/inputBaseClasses.js +1 -1
  97. package/InputBase/inputBaseClasses.mjs +1 -1
  98. package/InputLabel/InputLabel.js +1 -1
  99. package/InputLabel/InputLabel.mjs +1 -1
  100. package/LinearProgress/LinearProgress.js +6 -18
  101. package/LinearProgress/LinearProgress.mjs +6 -18
  102. package/LinearProgress/linearProgressClasses.d.mts +0 -36
  103. package/LinearProgress/linearProgressClasses.d.ts +0 -36
  104. package/LinearProgress/linearProgressClasses.js +1 -1
  105. package/LinearProgress/linearProgressClasses.mjs +1 -1
  106. package/Link/Link.d.mts +1 -1
  107. package/Link/Link.d.ts +1 -1
  108. package/ListItem/ListItem.d.mts +2 -36
  109. package/ListItem/ListItem.d.ts +2 -36
  110. package/ListItem/ListItem.js +27 -152
  111. package/ListItem/ListItem.mjs +27 -152
  112. package/ListItem/listItemClasses.d.mts +2 -4
  113. package/ListItem/listItemClasses.d.ts +2 -4
  114. package/ListItem/listItemClasses.js +1 -1
  115. package/ListItem/listItemClasses.mjs +1 -1
  116. package/ListItemButton/ListItemButton.d.mts +1 -2
  117. package/ListItemButton/ListItemButton.d.ts +1 -2
  118. package/ListItemButton/ListItemButton.js +2 -2
  119. package/ListItemButton/ListItemButton.mjs +2 -2
  120. package/ListItemIcon/ListItemIcon.js +1 -1
  121. package/ListItemIcon/ListItemIcon.mjs +1 -1
  122. package/ListItemSecondaryAction/ListItemSecondaryAction.d.mts +10 -6
  123. package/ListItemSecondaryAction/ListItemSecondaryAction.d.ts +10 -6
  124. package/ListItemSecondaryAction/ListItemSecondaryAction.js +7 -2
  125. package/ListItemSecondaryAction/ListItemSecondaryAction.mjs +7 -2
  126. package/ListItemText/ListItemText.d.mts +12 -20
  127. package/ListItemText/ListItemText.d.ts +12 -20
  128. package/ListItemText/ListItemText.js +2 -20
  129. package/ListItemText/ListItemText.mjs +2 -20
  130. package/ListSubheader/ListSubheader.js +0 -3
  131. package/ListSubheader/ListSubheader.mjs +0 -3
  132. package/Menu/Menu.d.mts +1 -1
  133. package/Menu/Menu.d.ts +1 -1
  134. package/Menu/Menu.js +15 -32
  135. package/Menu/Menu.mjs +15 -32
  136. package/MenuItem/MenuItem.js +36 -26
  137. package/MenuItem/MenuItem.mjs +34 -26
  138. package/MenuList/MenuList.js +136 -101
  139. package/MenuList/MenuList.mjs +135 -100
  140. package/MenuList/MenuListContext.d.mts +11 -0
  141. package/MenuList/MenuListContext.d.ts +11 -0
  142. package/MenuList/MenuListContext.js +25 -0
  143. package/MenuList/MenuListContext.mjs +19 -0
  144. package/Modal/Modal.d.mts +1 -41
  145. package/Modal/Modal.d.ts +1 -41
  146. package/Modal/Modal.js +5 -58
  147. package/Modal/Modal.mjs +5 -58
  148. package/OutlinedInput/OutlinedInput.js +2 -14
  149. package/OutlinedInput/OutlinedInput.mjs +2 -14
  150. package/OutlinedInput/outlinedInputClasses.d.mts +0 -16
  151. package/OutlinedInput/outlinedInputClasses.d.ts +0 -16
  152. package/PaginationItem/PaginationItem.d.mts +5 -15
  153. package/PaginationItem/PaginationItem.d.ts +5 -15
  154. package/PaginationItem/PaginationItem.js +9 -24
  155. package/PaginationItem/PaginationItem.mjs +9 -24
  156. package/PaginationItem/paginationItemClasses.d.mts +0 -16
  157. package/PaginationItem/paginationItemClasses.d.ts +0 -16
  158. package/PaginationItem/paginationItemClasses.js +1 -1
  159. package/PaginationItem/paginationItemClasses.mjs +1 -1
  160. package/PigmentGrid/PigmentGrid.d.mts +1 -1
  161. package/PigmentGrid/PigmentGrid.d.ts +1 -1
  162. package/PigmentGrid/PigmentGrid.js +1 -1
  163. package/PigmentGrid/PigmentGrid.mjs +1 -1
  164. package/Popover/Popover.d.mts +1 -1
  165. package/Popover/Popover.d.ts +1 -1
  166. package/Popover/Popover.js +19 -7
  167. package/Popover/Popover.mjs +18 -6
  168. package/Radio/Radio.js +1 -13
  169. package/Radio/Radio.mjs +1 -13
  170. package/Rating/Rating.d.mts +0 -9
  171. package/Rating/Rating.d.ts +0 -9
  172. package/Rating/Rating.js +1 -17
  173. package/Rating/Rating.mjs +1 -17
  174. package/Select/SelectInput.js +2 -3
  175. package/Select/SelectInput.mjs +2 -3
  176. package/Select/selectClasses.d.mts +0 -12
  177. package/Select/selectClasses.d.ts +0 -12
  178. package/Select/selectClasses.js +1 -1
  179. package/Select/selectClasses.mjs +1 -1
  180. package/Slider/Slider.d.mts +0 -5
  181. package/Slider/Slider.d.ts +0 -5
  182. package/Slider/Slider.js +2 -8
  183. package/Slider/Slider.mjs +2 -8
  184. package/Slider/sliderClasses.d.mts +0 -28
  185. package/Slider/sliderClasses.d.ts +0 -28
  186. package/Slider/sliderClasses.js +1 -1
  187. package/Slider/sliderClasses.mjs +1 -1
  188. package/Snackbar/Snackbar.d.mts +1 -1
  189. package/Snackbar/Snackbar.d.ts +1 -1
  190. package/SpeedDial/SpeedDial.d.mts +1 -1
  191. package/SpeedDial/SpeedDial.d.ts +1 -1
  192. package/Stack/Stack.d.mts +2 -2
  193. package/Stack/Stack.d.ts +2 -2
  194. package/StepButton/StepButton.js +44 -14
  195. package/StepButton/StepButton.mjs +44 -14
  196. package/StepConnector/StepConnector.js +2 -8
  197. package/StepConnector/StepConnector.mjs +2 -8
  198. package/StepConnector/stepConnectorClasses.d.mts +0 -8
  199. package/StepConnector/stepConnectorClasses.d.ts +0 -8
  200. package/StepConnector/stepConnectorClasses.js +1 -1
  201. package/StepConnector/stepConnectorClasses.mjs +1 -1
  202. package/StepContent/StepContent.d.mts +2 -17
  203. package/StepContent/StepContent.d.ts +2 -17
  204. package/StepContent/StepContent.js +3 -22
  205. package/StepContent/StepContent.mjs +3 -22
  206. package/StepLabel/StepLabel.d.mts +0 -22
  207. package/StepLabel/StepLabel.d.ts +0 -22
  208. package/StepLabel/StepLabel.js +2 -31
  209. package/StepLabel/StepLabel.mjs +2 -31
  210. package/Stepper/Stepper.js +54 -22
  211. package/Stepper/Stepper.mjs +54 -22
  212. package/Stepper/StepperContext.d.mts +0 -5
  213. package/Stepper/StepperContext.d.ts +0 -5
  214. package/Stepper/StepperContext.js +1 -2
  215. package/Stepper/StepperContext.mjs +0 -1
  216. package/SvgIcon/createSvgIcon.d.mts +2 -0
  217. package/SvgIcon/createSvgIcon.d.ts +2 -0
  218. package/SvgIcon/createSvgIcon.js +31 -0
  219. package/SvgIcon/createSvgIcon.mjs +26 -0
  220. package/SvgIcon/index.d.mts +1 -0
  221. package/SvgIcon/index.d.ts +1 -0
  222. package/SvgIcon/index.js +8 -0
  223. package/SvgIcon/index.mjs +1 -0
  224. package/SwipeableDrawer/SwipeableDrawer.d.mts +0 -5
  225. package/SwipeableDrawer/SwipeableDrawer.d.ts +0 -5
  226. package/SwipeableDrawer/SwipeableDrawer.js +6 -37
  227. package/SwipeableDrawer/SwipeableDrawer.mjs +6 -37
  228. package/Switch/Switch.js +0 -11
  229. package/Switch/Switch.mjs +0 -11
  230. package/Tab/Tab.js +18 -4
  231. package/Tab/Tab.mjs +18 -4
  232. package/Tab/tabClasses.d.mts +0 -4
  233. package/Tab/tabClasses.d.ts +0 -4
  234. package/Tab/tabClasses.js +1 -1
  235. package/Tab/tabClasses.mjs +1 -1
  236. package/TabScrollButton/TabScrollButton.d.mts +1 -1
  237. package/TabScrollButton/TabScrollButton.d.ts +1 -1
  238. package/TabScrollButton/TabScrollButton.js +6 -2
  239. package/TabScrollButton/TabScrollButton.mjs +6 -2
  240. package/TablePagination/TablePagination.d.mts +0 -24
  241. package/TablePagination/TablePagination.d.ts +0 -24
  242. package/TablePagination/TablePagination.js +1 -29
  243. package/TablePagination/TablePagination.mjs +1 -29
  244. package/TablePaginationActions/TablePaginationActions.d.mts +0 -10
  245. package/TablePaginationActions/TablePaginationActions.d.ts +0 -10
  246. package/TablePaginationActions/TablePaginationActions.js +2 -14
  247. package/TablePaginationActions/TablePaginationActions.mjs +2 -14
  248. package/TableSortLabel/TableSortLabel.js +6 -8
  249. package/TableSortLabel/TableSortLabel.mjs +6 -8
  250. package/TableSortLabel/tableSortLabelClasses.d.mts +0 -8
  251. package/TableSortLabel/tableSortLabelClasses.d.ts +0 -8
  252. package/TableSortLabel/tableSortLabelClasses.js +1 -1
  253. package/TableSortLabel/tableSortLabelClasses.mjs +1 -1
  254. package/Tabs/Tabs.js +33 -24
  255. package/Tabs/Tabs.mjs +32 -23
  256. package/Tabs/tabsClasses.d.mts +0 -6
  257. package/Tabs/tabsClasses.d.ts +0 -6
  258. package/Tabs/tabsClasses.js +1 -1
  259. package/Tabs/tabsClasses.mjs +1 -1
  260. package/ToggleButton/ToggleButton.js +1 -0
  261. package/ToggleButton/ToggleButton.mjs +1 -0
  262. package/ToggleButtonGroup/ToggleButtonGroup.js +1 -4
  263. package/ToggleButtonGroup/ToggleButtonGroup.mjs +1 -4
  264. package/ToggleButtonGroup/toggleButtonGroupClasses.d.mts +0 -8
  265. package/ToggleButtonGroup/toggleButtonGroupClasses.d.ts +0 -8
  266. package/ToggleButtonGroup/toggleButtonGroupClasses.js +1 -1
  267. package/ToggleButtonGroup/toggleButtonGroupClasses.mjs +1 -1
  268. package/Tooltip/Tooltip.d.mts +1 -1
  269. package/Tooltip/Tooltip.d.ts +1 -1
  270. package/Typography/Typography.d.mts +3 -3
  271. package/Typography/Typography.d.ts +3 -3
  272. package/Typography/Typography.js +2 -24
  273. package/Typography/Typography.mjs +3 -25
  274. package/index.js +1 -1
  275. package/index.mjs +1 -1
  276. package/internal/SwitchBase.d.mts +2 -12
  277. package/internal/SwitchBase.d.ts +2 -12
  278. package/internal/SwitchBase.js +6 -17
  279. package/internal/SwitchBase.mjs +6 -17
  280. package/locale/psAF.js +1 -1
  281. package/locale/psAF.mjs +1 -1
  282. package/package.json +7 -7
  283. package/styles/createThemeWithVars.js +10 -9
  284. package/styles/createThemeWithVars.mjs +10 -9
  285. package/styles/stringifyTheme.js +1 -1
  286. package/styles/stringifyTheme.mjs +1 -1
  287. package/useAutocomplete/useAutocomplete.js +8 -0
  288. package/useAutocomplete/useAutocomplete.mjs +8 -0
  289. package/utils/createSvgIcon.d.mts +4 -2
  290. package/utils/createSvgIcon.d.ts +4 -2
  291. package/utils/createSvgIcon.js +6 -24
  292. package/utils/createSvgIcon.mjs +2 -24
  293. package/utils/focusWithVisible.js +24 -0
  294. package/utils/focusWithVisible.mjs +19 -0
  295. package/utils/index.d.mts +0 -1
  296. package/utils/index.d.ts +0 -1
  297. package/utils/index.js +0 -7
  298. package/utils/index.mjs +0 -1
  299. package/utils/useFocusableWhenDisabled.d.mts +30 -0
  300. package/utils/useFocusableWhenDisabled.d.ts +30 -0
  301. package/utils/useFocusableWhenDisabled.js +47 -0
  302. package/utils/useFocusableWhenDisabled.mjs +41 -0
  303. package/utils/useRovingTabIndex.d.mts +1 -2
  304. package/utils/useRovingTabIndex.d.ts +1 -2
  305. package/utils/useRovingTabIndex.js +25 -4
  306. package/utils/useRovingTabIndex.mjs +1 -2
  307. package/version/index.js +2 -2
  308. package/version/index.mjs +2 -2
@@ -18,30 +18,17 @@ var _DefaultPropsProvider = require("../DefaultPropsProvider");
18
18
  var _ListContext = _interopRequireDefault(require("../List/ListContext"));
19
19
  var _ButtonBase = _interopRequireDefault(require("../ButtonBase"));
20
20
  var _useEnhancedEffect = _interopRequireDefault(require("../utils/useEnhancedEffect"));
21
+ var _focusWithVisible = _interopRequireDefault(require("../utils/focusWithVisible"));
21
22
  var _useForkRef = _interopRequireDefault(require("../utils/useForkRef"));
23
+ var _useId = _interopRequireDefault(require("../utils/useId"));
24
+ var _useRovingTabIndex = require("../utils/useRovingTabIndex");
22
25
  var _Divider = require("../Divider");
23
26
  var _ListItemIcon = require("../ListItemIcon");
24
27
  var _ListItemText = require("../ListItemText");
28
+ var _MenuListContext = require("../MenuList/MenuListContext");
29
+ var _utils = require("../Select/utils");
25
30
  var _menuItemClasses = _interopRequireWildcard(require("./menuItemClasses"));
26
- var _Select = require("../Select");
27
31
  var _jsxRuntime = require("react/jsx-runtime");
28
- /**
29
- * If autoFocus is an object, it will attempt to call `element.focus()` with the options argument.
30
- * If the browser doesn't support the options argument, it will fall back to a simple `element.focus()` call.
31
- */function focusWithVisible(element, focusSource) {
32
- if (focusSource == null) {
33
- element.focus();
34
- return;
35
- }
36
- try {
37
- element.focus({
38
- focusVisible: focusSource === 'keyboard'
39
- });
40
- } catch (error) {
41
- // If the browser doesn't support the focus options argument, fall back to a simple focus call.
42
- element.focus();
43
- }
44
- }
45
32
  const overridesResolver = (props, styles) => {
46
33
  const {
47
34
  ownerState
@@ -177,7 +164,7 @@ const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem(inProps, ref) {
177
164
  name: 'MuiMenuItem'
178
165
  });
179
166
  const {
180
- autoFocus = false,
167
+ autoFocus: shouldAutoFocusOnMount = false,
181
168
  component = 'li',
182
169
  dense = false,
183
170
  divider = false,
@@ -188,23 +175,30 @@ const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem(inProps, ref) {
188
175
  className,
189
176
  ...other
190
177
  } = props;
191
- const focusSource = (0, _Select.useSelectFocusSource)();
178
+ const focusSource = (0, _utils.useSelectFocusSource)();
192
179
  const context = React.useContext(_ListContext.default);
193
180
  const childContext = React.useMemo(() => ({
194
181
  dense: dense || context.dense || false,
195
182
  disableGutters
196
183
  }), [context.dense, dense, disableGutters]);
184
+ const menuListContext = (0, _MenuListContext.useMenuListContext)();
185
+ const rovingItemId = (0, _useId.default)();
186
+ // Escape hatch via ButtonBase for when an anchored <Menu> is opened with a pointer
187
+ // interaction on a trigger, the item should receive DOM focus but without focus visible
188
+ // styling. Current API does not allow a reliable `openInteractionType` for anchored menus.
189
+ const suppressFocusVisible = menuListContext.suppressInitialFocusVisible;
190
+ const itemsFocusableWhenDisabled = menuListContext.itemsFocusableWhenDisabled;
197
191
  const menuItemRef = React.useRef(null);
198
192
  (0, _useEnhancedEffect.default)(() => {
199
- if (autoFocus) {
193
+ if (shouldAutoFocusOnMount) {
200
194
  if (menuItemRef.current) {
201
- focusWithVisible(menuItemRef.current, focusSource);
195
+ (0, _focusWithVisible.default)(menuItemRef.current, focusSource);
202
196
  } else if (process.env.NODE_ENV !== 'production') {
203
197
  console.error('MUI: Unable to set focus to a MenuItem whose component has not been rendered.');
204
198
  }
205
199
  }
206
200
  // eslint-disable-next-line react-hooks/exhaustive-deps
207
- }, [autoFocus]);
201
+ }, [shouldAutoFocusOnMount]);
208
202
  const ownerState = {
209
203
  ...props,
210
204
  dense: childContext.dense,
@@ -212,10 +206,23 @@ const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem(inProps, ref) {
212
206
  disableGutters
213
207
  };
214
208
  const classes = useUtilityClasses(props);
215
- const handleRef = (0, _useForkRef.default)(menuItemRef, ref);
209
+ const rovingItemProps = (0, _useRovingTabIndex.useRovingTabIndexItem)({
210
+ id: rovingItemId,
211
+ ref,
212
+ disabled: props.disabled,
213
+ focusableWhenDisabled: itemsFocusableWhenDisabled,
214
+ selected: props.selected
215
+ });
216
+ const handleRef = (0, _useForkRef.default)(menuItemRef, rovingItemProps.ref);
216
217
  let tabIndex;
217
- if (!props.disabled) {
218
- tabIndex = tabIndexProp !== undefined ? tabIndexProp : -1;
218
+ if (tabIndexProp !== undefined) {
219
+ tabIndex = tabIndexProp;
220
+ } else if (menuListContext.variant === 'selectedMenu') {
221
+ tabIndex = rovingItemProps.tabIndex;
222
+ } else if (!props.disabled || itemsFocusableWhenDisabled) {
223
+ // In `menu` variant, registration still drives arrow-key navigation even
224
+ // though each item keeps `tabIndex={-1}`.
225
+ tabIndex = -1;
219
226
  }
220
227
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ListContext.default.Provider, {
221
228
  value: childContext,
@@ -224,6 +231,9 @@ const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem(inProps, ref) {
224
231
  role: role,
225
232
  tabIndex: tabIndex,
226
233
  component: component,
234
+ internalNativeButton: false,
235
+ focusableWhenDisabled: itemsFocusableWhenDisabled,
236
+ suppressFocusVisible: suppressFocusVisible,
227
237
  focusVisibleClassName: (0, _clsx.default)(classes.focusVisible, focusVisibleClassName),
228
238
  className: (0, _clsx.default)(classes.root, className),
229
239
  ...other,
@@ -11,32 +11,17 @@ import { useDefaultProps } from "../DefaultPropsProvider/index.mjs";
11
11
  import ListContext from "../List/ListContext.mjs";
12
12
  import ButtonBase from "../ButtonBase/index.mjs";
13
13
  import useEnhancedEffect from "../utils/useEnhancedEffect.mjs";
14
+ import focusWithVisible from "../utils/focusWithVisible.mjs";
14
15
  import useForkRef from "../utils/useForkRef.mjs";
16
+ import useId from "../utils/useId.mjs";
17
+ import { useRovingTabIndexItem } from "../utils/useRovingTabIndex.mjs";
15
18
  import { dividerClasses } from "../Divider/index.mjs";
16
19
  import { listItemIconClasses } from "../ListItemIcon/index.mjs";
17
20
  import { listItemTextClasses } from "../ListItemText/index.mjs";
21
+ import { useMenuListContext } from "../MenuList/MenuListContext.mjs";
22
+ import { useSelectFocusSource } from "../Select/utils/index.mjs";
18
23
  import menuItemClasses, { getMenuItemUtilityClass } from "./menuItemClasses.mjs";
19
- import { useSelectFocusSource } from "../Select/index.mjs";
20
-
21
- /**
22
- * If autoFocus is an object, it will attempt to call `element.focus()` with the options argument.
23
- * If the browser doesn't support the options argument, it will fall back to a simple `element.focus()` call.
24
- */
25
24
  import { jsx as _jsx } from "react/jsx-runtime";
26
- function focusWithVisible(element, focusSource) {
27
- if (focusSource == null) {
28
- element.focus();
29
- return;
30
- }
31
- try {
32
- element.focus({
33
- focusVisible: focusSource === 'keyboard'
34
- });
35
- } catch (error) {
36
- // If the browser doesn't support the focus options argument, fall back to a simple focus call.
37
- element.focus();
38
- }
39
- }
40
25
  export const overridesResolver = (props, styles) => {
41
26
  const {
42
27
  ownerState
@@ -171,7 +156,7 @@ const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem(inProps, ref) {
171
156
  name: 'MuiMenuItem'
172
157
  });
173
158
  const {
174
- autoFocus = false,
159
+ autoFocus: shouldAutoFocusOnMount = false,
175
160
  component = 'li',
176
161
  dense = false,
177
162
  divider = false,
@@ -188,9 +173,16 @@ const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem(inProps, ref) {
188
173
  dense: dense || context.dense || false,
189
174
  disableGutters
190
175
  }), [context.dense, dense, disableGutters]);
176
+ const menuListContext = useMenuListContext();
177
+ const rovingItemId = useId();
178
+ // Escape hatch via ButtonBase for when an anchored <Menu> is opened with a pointer
179
+ // interaction on a trigger, the item should receive DOM focus but without focus visible
180
+ // styling. Current API does not allow a reliable `openInteractionType` for anchored menus.
181
+ const suppressFocusVisible = menuListContext.suppressInitialFocusVisible;
182
+ const itemsFocusableWhenDisabled = menuListContext.itemsFocusableWhenDisabled;
191
183
  const menuItemRef = React.useRef(null);
192
184
  useEnhancedEffect(() => {
193
- if (autoFocus) {
185
+ if (shouldAutoFocusOnMount) {
194
186
  if (menuItemRef.current) {
195
187
  focusWithVisible(menuItemRef.current, focusSource);
196
188
  } else if (process.env.NODE_ENV !== 'production') {
@@ -198,7 +190,7 @@ const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem(inProps, ref) {
198
190
  }
199
191
  }
200
192
  // eslint-disable-next-line react-hooks/exhaustive-deps
201
- }, [autoFocus]);
193
+ }, [shouldAutoFocusOnMount]);
202
194
  const ownerState = {
203
195
  ...props,
204
196
  dense: childContext.dense,
@@ -206,10 +198,23 @@ const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem(inProps, ref) {
206
198
  disableGutters
207
199
  };
208
200
  const classes = useUtilityClasses(props);
209
- const handleRef = useForkRef(menuItemRef, ref);
201
+ const rovingItemProps = useRovingTabIndexItem({
202
+ id: rovingItemId,
203
+ ref,
204
+ disabled: props.disabled,
205
+ focusableWhenDisabled: itemsFocusableWhenDisabled,
206
+ selected: props.selected
207
+ });
208
+ const handleRef = useForkRef(menuItemRef, rovingItemProps.ref);
210
209
  let tabIndex;
211
- if (!props.disabled) {
212
- tabIndex = tabIndexProp !== undefined ? tabIndexProp : -1;
210
+ if (tabIndexProp !== undefined) {
211
+ tabIndex = tabIndexProp;
212
+ } else if (menuListContext.variant === 'selectedMenu') {
213
+ tabIndex = rovingItemProps.tabIndex;
214
+ } else if (!props.disabled || itemsFocusableWhenDisabled) {
215
+ // In `menu` variant, registration still drives arrow-key navigation even
216
+ // though each item keeps `tabIndex={-1}`.
217
+ tabIndex = -1;
213
218
  }
214
219
  return /*#__PURE__*/_jsx(ListContext.Provider, {
215
220
  value: childContext,
@@ -218,6 +223,9 @@ const MenuItem = /*#__PURE__*/React.forwardRef(function MenuItem(inProps, ref) {
218
223
  role: role,
219
224
  tabIndex: tabIndex,
220
225
  component: component,
226
+ internalNativeButton: false,
227
+ focusableWhenDisabled: itemsFocusableWhenDisabled,
228
+ suppressFocusVisible: suppressFocusVisible,
221
229
  focusVisibleClassName: clsx(classes.focusVisible, focusVisibleClassName),
222
230
  className: clsx(classes.root, className),
223
231
  ...other,
@@ -8,26 +8,41 @@ Object.defineProperty(exports, "__esModule", {
8
8
  });
9
9
  exports.default = void 0;
10
10
  var React = _interopRequireWildcard(require("react"));
11
- var _reactIs = require("react-is");
12
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
13
- var _useRovingTabIndex = _interopRequireDefault(require("../utils/useRovingTabIndex"));
12
+ var _useRovingTabIndex = require("@mui/utils/useRovingTabIndex");
14
13
  var _ownerDocument = _interopRequireDefault(require("../utils/ownerDocument"));
15
- var _List = _interopRequireDefault(require("../List"));
16
14
  var _getActiveElement = _interopRequireDefault(require("../utils/getActiveElement"));
17
15
  var _getScrollbarSize = _interopRequireDefault(require("../utils/getScrollbarSize"));
16
+ var _focusWithVisible = _interopRequireDefault(require("../utils/focusWithVisible"));
17
+ var _useEventCallback = _interopRequireDefault(require("../utils/useEventCallback"));
18
18
  var _useForkRef = _interopRequireDefault(require("../utils/useForkRef"));
19
19
  var _useEnhancedEffect = _interopRequireDefault(require("../utils/useEnhancedEffect"));
20
- var _utils = require("../utils");
20
+ var _useRovingTabIndex2 = require("../utils/useRovingTabIndex");
21
+ var _ownerWindow = _interopRequireDefault(require("../utils/ownerWindow"));
22
+ var _List = _interopRequireDefault(require("../List"));
23
+ var _utils = require("../Select/utils");
24
+ var _MenuListContext = require("./MenuListContext");
21
25
  var _jsxRuntime = require("react/jsx-runtime");
22
- function textCriteriaMatches(nextFocus, textCriteria) {
23
- if (textCriteria === undefined) {
24
- return true;
26
+ function getItemText(itemOrElement) {
27
+ const element = itemOrElement?.element ?? itemOrElement;
28
+ if (!element) {
29
+ return '';
25
30
  }
26
- let text = nextFocus.innerText;
31
+ if (itemOrElement?.textValue !== undefined) {
32
+ return itemOrElement.textValue;
33
+ }
34
+ let text = element.innerText;
27
35
  if (text === undefined) {
28
36
  // jsdom doesn't support innerText
29
- text = nextFocus.textContent;
37
+ text = element.textContent;
30
38
  }
39
+ return text ?? '';
40
+ }
41
+ function textCriteriaMatches(itemOrElement, textCriteria) {
42
+ if (textCriteria === undefined) {
43
+ return true;
44
+ }
45
+ let text = getItemText(itemOrElement);
31
46
  text = text.trim().toLowerCase();
32
47
  if (text.length === 0) {
33
48
  return false;
@@ -37,20 +52,17 @@ function textCriteriaMatches(nextFocus, textCriteria) {
37
52
  }
38
53
  return text.startsWith(textCriteria.keys.join(''));
39
54
  }
40
- function shouldFocusWithTextCriteria(element, criteria, disabledItemsFocusable) {
41
- if (!textCriteriaMatches(element, criteria)) {
55
+ function isItemFocusableWithTextCriteria(item, criteria) {
56
+ if (!textCriteriaMatches(item, criteria)) {
42
57
  return false;
43
58
  }
44
- return shouldFocus(element, disabledItemsFocusable);
59
+ return (0, _useRovingTabIndex.isItemFocusable)(item);
45
60
  }
46
- function shouldFocus(element, disabledItemsFocusable) {
47
- if (!element || !element.hasAttribute('tabindex')) {
48
- return false;
49
- }
50
- if (disabledItemsFocusable) {
51
- return true;
52
- }
53
- return !element.disabled && element.getAttribute('aria-disabled') !== 'true';
61
+
62
+ // Menu auto-focus is not always keyboard-driven. On open we often move focus to the
63
+ // active item programmatically so arrow-key navigation starts from the right place.
64
+ function focusInitialItem(element, focusSource) {
65
+ (0, _focusWithVisible.default)(element, focusSource);
54
66
  }
55
67
 
56
68
  /**
@@ -64,8 +76,8 @@ const MenuList = /*#__PURE__*/React.forwardRef(function MenuList(props, ref) {
64
76
  // private
65
77
  // eslint-disable-next-line react/prop-types
66
78
  actions,
67
- autoFocus = false,
68
- autoFocusItem = false,
79
+ autoFocus: autoFocusList = false,
80
+ autoFocusItem: autoFocusActiveItem = false,
69
81
  children,
70
82
  className,
71
83
  disabledItemsFocusable = false,
@@ -75,17 +87,85 @@ const MenuList = /*#__PURE__*/React.forwardRef(function MenuList(props, ref) {
75
87
  ...other
76
88
  } = props;
77
89
  const listRef = React.useRef(null);
90
+ const hasFocusedInitialTargetRef = React.useRef(false);
91
+ // Escape hatch for <Menu variant="menu"> (items have no selection state). When opened with
92
+ // mouse/pointer, the initial focused item should still receive DOM focus, but ButtonBase
93
+ // should suppress its focus-visible state for that one initial handoff.
94
+ const [suppressInitialFocusVisible, setSuppressInitialFocusVisible] = React.useState(false);
95
+ // Current anchored <Menu>s cannot receive a `openInteractionType` signal from a trigger
96
+ // the API only receives `open` and `anchorEl`. When <MenuList> is used in <Select>, the
97
+ // internal <SelectInput> is able to achieve this via `useSelectFocusSource`.
98
+ const focusSource = (0, _utils.useSelectFocusSource)();
78
99
  const textCriteriaRef = React.useRef({
79
100
  keys: [],
80
101
  repeating: true,
81
102
  previousKeyMatched: true,
82
103
  lastTime: null
83
104
  });
84
- (0, _useEnhancedEffect.default)(() => {
85
- if (autoFocus) {
105
+ const getDefaultActiveItemId = React.useCallback(items => {
106
+ if (variant === 'selectedMenu') {
107
+ return items.find(item => item.selected && (0, _useRovingTabIndex.isItemFocusable)(item))?.id ?? items.find(item => (0, _useRovingTabIndex.isItemFocusable)(item))?.id ?? null;
108
+ }
109
+ return items.find(item => (0, _useRovingTabIndex.isItemFocusable)(item))?.id ?? null;
110
+ }, [variant]);
111
+ const rovingContainer = (0, _useRovingTabIndex2.useRovingTabIndexRoot)({
112
+ activeItemId: undefined,
113
+ getDefaultActiveItemId,
114
+ orientation: 'vertical',
115
+ wrap: !disableListWrap
116
+ });
117
+ const {
118
+ activeItemId,
119
+ focusNext,
120
+ getActiveItem,
121
+ getContainerProps,
122
+ getItemMap
123
+ } = rovingContainer;
124
+ const focusInitialTarget = (0, _useEventCallback.default)((force = false) => {
125
+ // `force` is used by the imperative action when `Menu` asks `MenuList` to restore its
126
+ // initial focus target after the popover finishes entering, even if this list already
127
+ // completed its normal one-time initial-focus path on an earlier render.
128
+ if (!listRef.current || !force && hasFocusedInitialTargetRef.current) {
129
+ return null;
130
+ }
131
+ if (autoFocusActiveItem) {
132
+ const activeItem = getActiveItem();
133
+ if (activeItem?.element) {
134
+ const hasSelectedItem = Array.from(getItemMap().values()).some(item => item.selected);
135
+ const shouldSuppressInitialFocusVisible = variant === 'menu' && hasSelectedItem && !activeItem.selected && focusSource == null;
136
+ setSuppressInitialFocusVisible(shouldSuppressInitialFocusVisible);
137
+ focusInitialItem(activeItem.element, focusSource);
138
+ hasFocusedInitialTargetRef.current = true;
139
+ return activeItem.element;
140
+ }
141
+ if (!autoFocusList) {
142
+ return null;
143
+ }
144
+
145
+ // Keep the list container focusable while waiting for items to register,
146
+ // or when there is no focusable item to move to.
147
+ setSuppressInitialFocusVisible(false);
86
148
  listRef.current.focus();
149
+ return listRef.current;
87
150
  }
88
- }, [autoFocus]);
151
+ if (!autoFocusList) {
152
+ setSuppressInitialFocusVisible(false);
153
+ return null;
154
+ }
155
+ setSuppressInitialFocusVisible(false);
156
+ listRef.current.focus();
157
+ hasFocusedInitialTargetRef.current = true;
158
+ return listRef.current;
159
+ });
160
+ (0, _useEnhancedEffect.default)(() => {
161
+ if (!autoFocusList && !autoFocusActiveItem) {
162
+ hasFocusedInitialTargetRef.current = false;
163
+ setSuppressInitialFocusVisible(false);
164
+ return undefined;
165
+ }
166
+ focusInitialTarget();
167
+ return undefined;
168
+ }, [activeItemId, autoFocusActiveItem, autoFocusList, focusInitialTarget]);
89
169
  React.useImperativeHandle(actions, () => ({
90
170
  adjustStyleForScrollbar: (containerElement, {
91
171
  direction
@@ -94,91 +174,40 @@ const MenuList = /*#__PURE__*/React.forwardRef(function MenuList(props, ref) {
94
174
  // of the menu.
95
175
  const noExplicitWidth = !listRef.current.style.width;
96
176
  if (containerElement.clientHeight < listRef.current.clientHeight && noExplicitWidth) {
97
- const scrollbarSize = `${(0, _getScrollbarSize.default)((0, _utils.ownerWindow)(containerElement))}px`;
177
+ const scrollbarSize = `${(0, _getScrollbarSize.default)((0, _ownerWindow.default)(containerElement))}px`;
98
178
  listRef.current.style[direction === 'rtl' ? 'paddingLeft' : 'paddingRight'] = scrollbarSize;
99
179
  listRef.current.style.width = `calc(100% + ${scrollbarSize})`;
100
180
  }
101
181
  return listRef.current;
102
- }
103
- }), []);
104
-
105
- /**
106
- * the index of the item should receive focus
107
- * in a `variant="selectedMenu"` it's the first `selected` item
108
- * otherwise it's the very first item.
109
- */
110
- let activeItemIndex = -1;
111
- // since we inject focus related props into children we have to do a lookahead
112
- // to check if there is a `selected` item. We're looking for the last `selected`
113
- // item and use the first valid item as a fallback
114
- React.Children.forEach(children, (child, index) => {
115
- if (! /*#__PURE__*/React.isValidElement(child)) {
116
- if (activeItemIndex === index) {
117
- activeItemIndex += 1;
118
- if (activeItemIndex >= children.length) {
119
- // there are no focusable items within the list.
120
- activeItemIndex = -1;
121
- }
122
- }
123
- return;
124
- }
125
- if (process.env.NODE_ENV !== 'production') {
126
- if ((0, _reactIs.isFragment)(child)) {
127
- console.error(["MUI: The Menu component doesn't accept a Fragment as a child.", 'Consider providing an array instead.'].join('\n'));
128
- }
129
- }
130
- if (!child.props.disabled) {
131
- if (variant === 'selectedMenu' && child.props.selected) {
132
- activeItemIndex = index;
133
- } else if (activeItemIndex === -1) {
134
- activeItemIndex = index;
182
+ },
183
+ focusInitialTarget: () => {
184
+ if (!listRef.current) {
185
+ return null;
135
186
  }
136
- }
137
- if (activeItemIndex === index && (child.props.disabled || child.props.muiSkipListHighlight || child.type.muiSkipListHighlight)) {
138
- activeItemIndex += 1;
139
- if (activeItemIndex >= children.length) {
140
- // there are no focusable items within the list.
141
- activeItemIndex = -1;
187
+ const currentFocus = (0, _getActiveElement.default)((0, _ownerDocument.default)(listRef.current));
188
+ if (currentFocus && listRef.current.contains(currentFocus)) {
189
+ return currentFocus;
142
190
  }
191
+ return focusInitialTarget(true);
143
192
  }
144
- });
145
- const {
146
- focusNext,
147
- getContainerProps,
148
- getItemProps
149
- } = (0, _useRovingTabIndex.default)({
150
- focusableIndex: activeItemIndex,
151
- orientation: 'vertical',
152
- shouldWrap: !disableListWrap,
153
- shouldFocus: element => shouldFocus(element, disabledItemsFocusable)
154
- });
155
- const rovingTabIndexContainerProps = getContainerProps();
156
- const handleRef = (0, _useForkRef.default)(listRef, rovingTabIndexContainerProps.ref, ref);
157
- let focusableIndex = 0;
158
- const items = React.Children.map(children, (child, index) => {
159
- if (! /*#__PURE__*/React.isValidElement(child) || child.props.muiSkipListHighlight || child.type.muiSkipListHighlight) {
160
- return child;
161
- }
162
- const rovingTabIndexItemProps = getItemProps(focusableIndex, child.ref);
163
- const newChildProps = {
164
- ref: rovingTabIndexItemProps.ref
165
- };
166
- if (child.props.tabIndex === undefined && variant === 'selectedMenu') {
167
- newChildProps.tabIndex = rovingTabIndexItemProps.tabIndex;
193
+ }), [focusInitialTarget]);
194
+ const rovingContainerProps = getContainerProps();
195
+ const handleRef = (0, _useForkRef.default)(listRef, rovingContainerProps.ref, ref);
196
+ const menuListContextValue = React.useMemo(() => ({
197
+ itemsFocusableWhenDisabled: disabledItemsFocusable,
198
+ suppressInitialFocusVisible,
199
+ variant
200
+ }), [disabledItemsFocusable, suppressInitialFocusVisible, variant]);
201
+ const handleKeyDown = (0, _useEventCallback.default)(event => {
202
+ if (suppressInitialFocusVisible) {
203
+ setSuppressInitialFocusVisible(false);
168
204
  }
169
- if (index === activeItemIndex && autoFocusItem) {
170
- newChildProps.autoFocus = true;
171
- }
172
- focusableIndex += 1;
173
- return /*#__PURE__*/React.cloneElement(child, newChildProps);
174
- });
175
- const handleKeyDown = event => {
176
205
  const isModifierKeyPressed = event.ctrlKey || event.metaKey || event.altKey;
177
206
  if (isModifierKeyPressed && onKeyDown) {
178
207
  onKeyDown(event);
179
208
  return;
180
209
  }
181
- rovingTabIndexContainerProps.onKeyDown(event);
210
+ rovingContainerProps.onKeyDown(event);
182
211
  if (event.key.length === 1) {
183
212
  const criteria = textCriteriaRef.current;
184
213
  const lowerKey = event.key.toLowerCase();
@@ -197,7 +226,7 @@ const MenuList = /*#__PURE__*/React.forwardRef(function MenuList(props, ref) {
197
226
  criteria.keys.push(lowerKey);
198
227
  const currentFocus = (0, _getActiveElement.default)((0, _ownerDocument.default)(listRef.current));
199
228
  const keepFocusOnCurrent = currentFocus && !criteria.repeating && textCriteriaMatches(currentFocus, criteria);
200
- if (criteria.previousKeyMatched && (keepFocusOnCurrent || focusNext(element => shouldFocusWithTextCriteria(element, criteria, disabledItemsFocusable)) !== -1)) {
229
+ if (criteria.previousKeyMatched && (keepFocusOnCurrent || focusNext(item => isItemFocusableWithTextCriteria(item, criteria)) != null)) {
201
230
  event.preventDefault();
202
231
  } else {
203
232
  criteria.previousKeyMatched = false;
@@ -206,16 +235,22 @@ const MenuList = /*#__PURE__*/React.forwardRef(function MenuList(props, ref) {
206
235
  if (onKeyDown) {
207
236
  onKeyDown(event);
208
237
  }
209
- };
238
+ });
210
239
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_List.default, {
211
240
  role: "menu",
212
241
  ref: handleRef,
213
242
  className: className,
214
243
  onKeyDown: handleKeyDown,
215
- onFocus: rovingTabIndexContainerProps.onFocus,
244
+ onFocus: rovingContainerProps.onFocus,
216
245
  tabIndex: -1,
217
246
  ...other,
218
- children: items
247
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MenuListContext.MenuListContext.Provider, {
248
+ value: menuListContextValue,
249
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_useRovingTabIndex2.RovingTabIndexContext.Provider, {
250
+ value: rovingContainer,
251
+ children: children
252
+ })
253
+ })
219
254
  });
220
255
  });
221
256
  process.env.NODE_ENV !== "production" ? MenuList.propTypes /* remove-proptypes */ = {