@mui/material 9.0.0-beta.0 → 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 (138) 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/CHANGELOG.md +48 -0
  22. package/CardActionArea/CardActionArea.js +1 -0
  23. package/CardActionArea/CardActionArea.mjs +1 -0
  24. package/Chip/Chip.d.mts +7 -0
  25. package/Chip/Chip.d.ts +7 -0
  26. package/Chip/Chip.js +18 -1
  27. package/Chip/Chip.mjs +18 -1
  28. package/Dialog/Dialog.d.mts +8 -1
  29. package/Dialog/Dialog.d.ts +8 -1
  30. package/Dialog/Dialog.js +9 -1
  31. package/Dialog/Dialog.mjs +9 -1
  32. package/Divider/Divider.js +0 -8
  33. package/Divider/Divider.mjs +0 -8
  34. package/Drawer/Drawer.d.mts +1 -1
  35. package/Drawer/Drawer.d.ts +1 -1
  36. package/Fab/Fab.js +1 -0
  37. package/Fab/Fab.mjs +1 -0
  38. package/FilledInput/FilledInput.js +1 -1
  39. package/FilledInput/FilledInput.mjs +1 -1
  40. package/Grid/Grid.d.mts +8 -3
  41. package/Grid/Grid.d.ts +8 -3
  42. package/Grid/Grid.js +8 -3
  43. package/Grid/Grid.mjs +8 -3
  44. package/Grid/gridClasses.js +1 -1
  45. package/Grid/gridClasses.mjs +1 -1
  46. package/IconButton/IconButton.js +1 -0
  47. package/IconButton/IconButton.mjs +1 -0
  48. package/Input/Input.js +1 -1
  49. package/Input/Input.mjs +1 -1
  50. package/InputAdornment/inputAdornmentClasses.d.mts +2 -2
  51. package/InputAdornment/inputAdornmentClasses.d.ts +2 -2
  52. package/ListItemButton/ListItemButton.js +1 -0
  53. package/ListItemButton/ListItemButton.mjs +1 -0
  54. package/ListItemIcon/ListItemIcon.js +1 -1
  55. package/ListItemIcon/ListItemIcon.mjs +1 -1
  56. package/ListSubheader/ListSubheader.js +0 -3
  57. package/ListSubheader/ListSubheader.mjs +0 -3
  58. package/Menu/Menu.d.mts +1 -1
  59. package/Menu/Menu.d.ts +1 -1
  60. package/Menu/Menu.js +15 -32
  61. package/Menu/Menu.mjs +15 -32
  62. package/MenuItem/MenuItem.js +36 -26
  63. package/MenuItem/MenuItem.mjs +34 -26
  64. package/MenuList/MenuList.js +136 -101
  65. package/MenuList/MenuList.mjs +135 -100
  66. package/MenuList/MenuListContext.d.mts +11 -0
  67. package/MenuList/MenuListContext.d.ts +11 -0
  68. package/MenuList/MenuListContext.js +25 -0
  69. package/MenuList/MenuListContext.mjs +19 -0
  70. package/PaginationItem/PaginationItem.d.mts +5 -0
  71. package/PaginationItem/PaginationItem.d.ts +5 -0
  72. package/PaginationItem/PaginationItem.js +6 -0
  73. package/PaginationItem/PaginationItem.mjs +6 -0
  74. package/PigmentGrid/PigmentGrid.d.mts +1 -1
  75. package/PigmentGrid/PigmentGrid.d.ts +1 -1
  76. package/PigmentGrid/PigmentGrid.js +1 -1
  77. package/PigmentGrid/PigmentGrid.mjs +1 -1
  78. package/Popover/Popover.d.mts +1 -1
  79. package/Popover/Popover.d.ts +1 -1
  80. package/Popover/Popover.js +19 -7
  81. package/Popover/Popover.mjs +18 -6
  82. package/Snackbar/Snackbar.d.mts +1 -1
  83. package/Snackbar/Snackbar.d.ts +1 -1
  84. package/SpeedDial/SpeedDial.d.mts +1 -1
  85. package/SpeedDial/SpeedDial.d.ts +1 -1
  86. package/StepButton/StepButton.js +44 -14
  87. package/StepButton/StepButton.mjs +44 -14
  88. package/StepContent/StepContent.d.mts +1 -1
  89. package/StepContent/StepContent.d.ts +1 -1
  90. package/Stepper/Stepper.js +54 -22
  91. package/Stepper/Stepper.mjs +54 -22
  92. package/Stepper/StepperContext.d.mts +0 -5
  93. package/Stepper/StepperContext.d.ts +0 -5
  94. package/Stepper/StepperContext.js +1 -2
  95. package/Stepper/StepperContext.mjs +0 -1
  96. package/Tab/Tab.js +17 -1
  97. package/Tab/Tab.mjs +17 -1
  98. package/TabScrollButton/TabScrollButton.d.mts +1 -1
  99. package/TabScrollButton/TabScrollButton.d.ts +1 -1
  100. package/TabScrollButton/TabScrollButton.js +6 -2
  101. package/TabScrollButton/TabScrollButton.mjs +6 -2
  102. package/TableSortLabel/TableSortLabel.js +4 -1
  103. package/TableSortLabel/TableSortLabel.mjs +4 -1
  104. package/Tabs/Tabs.js +30 -21
  105. package/Tabs/Tabs.mjs +29 -20
  106. package/ToggleButton/ToggleButton.js +1 -0
  107. package/ToggleButton/ToggleButton.mjs +1 -0
  108. package/Tooltip/Tooltip.d.mts +1 -1
  109. package/Tooltip/Tooltip.d.ts +1 -1
  110. package/index.js +1 -1
  111. package/index.mjs +1 -1
  112. package/internal/SwitchBase.d.mts +2 -2
  113. package/internal/SwitchBase.d.ts +2 -2
  114. package/internal/SwitchBase.js +5 -1
  115. package/internal/SwitchBase.mjs +5 -1
  116. package/locale/psAF.js +1 -1
  117. package/locale/psAF.mjs +1 -1
  118. package/package.json +5 -5
  119. package/styles/createThemeWithVars.js +9 -9
  120. package/styles/createThemeWithVars.mjs +9 -9
  121. package/useAutocomplete/useAutocomplete.js +8 -0
  122. package/useAutocomplete/useAutocomplete.mjs +8 -0
  123. package/utils/focusWithVisible.js +24 -0
  124. package/utils/focusWithVisible.mjs +19 -0
  125. package/utils/index.d.mts +0 -1
  126. package/utils/index.d.ts +0 -1
  127. package/utils/index.js +0 -7
  128. package/utils/index.mjs +0 -1
  129. package/utils/useFocusableWhenDisabled.d.mts +30 -0
  130. package/utils/useFocusableWhenDisabled.d.ts +30 -0
  131. package/utils/useFocusableWhenDisabled.js +47 -0
  132. package/utils/useFocusableWhenDisabled.mjs +41 -0
  133. package/utils/useRovingTabIndex.d.mts +1 -2
  134. package/utils/useRovingTabIndex.d.ts +1 -2
  135. package/utils/useRovingTabIndex.js +25 -4
  136. package/utils/useRovingTabIndex.mjs +1 -2
  137. package/version/index.js +2 -2
  138. package/version/index.mjs +2 -2
package/Tabs/Tabs.mjs CHANGED
@@ -20,7 +20,10 @@ import tabsClasses, { getTabsUtilityClass } from "./tabsClasses.mjs";
20
20
  import ownerWindow from "../utils/ownerWindow.mjs";
21
21
  import isLayoutSupported from "../utils/isLayoutSupported.mjs";
22
22
  import useSlot from "../utils/useSlot.mjs";
23
- import { ownerDocument, useForkRef, getActiveElement, useRovingTabIndex } from "../utils/index.mjs";
23
+ import getActiveElement from "../utils/getActiveElement.mjs";
24
+ import ownerDocument from "../utils/ownerDocument.mjs";
25
+ import useForkRef from "../utils/useForkRef.mjs";
26
+ import { RovingTabIndexContext, useRovingTabIndexRoot } from "../utils/useRovingTabIndex.mjs";
24
27
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
25
28
  const useUtilityClasses = ownerState => {
26
29
  const {
@@ -287,6 +290,10 @@ const Tabs = /*#__PURE__*/React.forwardRef(function Tabs(inProps, ref) {
287
290
  const [displayStartScroll, setDisplayStartScroll] = React.useState(false);
288
291
  const [displayEndScroll, setDisplayEndScroll] = React.useState(false);
289
292
  const [updateScrollObserver, setUpdateScrollObserver] = React.useState(false);
293
+ const selectedValue = value === false ? null : value;
294
+ // Tracks whether DOM focus is currently inside the tab list. When it is, roving focus
295
+ // should follow in-list keyboard movement instead of snapping back to `selectedValue`.
296
+ const [isFocusWithinList, setIsFocusWithinList] = React.useState(false);
290
297
  const [scrollerStyle, setScrollerStyle] = React.useState({
291
298
  overflow: 'hidden',
292
299
  scrollbarWidth: 0
@@ -614,6 +621,12 @@ const Tabs = /*#__PURE__*/React.forwardRef(function Tabs(inProps, ref) {
614
621
  const indicator = /*#__PURE__*/_jsx(IndicatorSlot, {
615
622
  ...indicatorSlotProps
616
623
  });
624
+ const rovingContainer = useRovingTabIndexRoot({
625
+ activeItemId: isFocusWithinList ? undefined : selectedValue,
626
+ orientation,
627
+ isRtl
628
+ });
629
+ const rovingContainerProps = rovingContainer.getContainerProps();
617
630
  const validChildren = React.Children.toArray(childrenProp).filter(React.isValidElement).map((child, index) => {
618
631
  const childValue = child.props.value === undefined ? index : child.props.value;
619
632
  if (process.env.NODE_ENV !== 'production') {
@@ -628,23 +641,11 @@ const Tabs = /*#__PURE__*/React.forwardRef(function Tabs(inProps, ref) {
628
641
  childValue
629
642
  };
630
643
  });
631
- const focusableIndex = valueToIndex.get(value);
632
- const {
633
- getContainerProps,
634
- getItemProps
635
- } = useRovingTabIndex({
636
- focusableIndex,
637
- orientation,
638
- isRtl
639
- });
640
- const rovingTabIndexContainerProps = getContainerProps();
641
644
  const children = validChildren.map(({
642
645
  child,
643
- index,
644
646
  childValue
645
647
  }) => {
646
648
  const selected = childValue === value;
647
- const rovingTabIndexItemProps = getItemProps(index, child.ref);
648
649
  return /*#__PURE__*/React.cloneElement(child, {
649
650
  fullWidth: variant === 'fullWidth',
650
651
  indicator: selected && !mounted && indicator,
@@ -652,9 +653,7 @@ const Tabs = /*#__PURE__*/React.forwardRef(function Tabs(inProps, ref) {
652
653
  selectionFollowsFocus,
653
654
  onChange,
654
655
  textColor,
655
- value: childValue,
656
- ref: rovingTabIndexItemProps.ref,
657
- tabIndex: child.props.tabIndex ?? rovingTabIndexItemProps.tabIndex
656
+ value: childValue
658
657
  });
659
658
  });
660
659
  const conditionalElements = getConditionalElements();
@@ -682,7 +681,7 @@ const Tabs = /*#__PURE__*/React.forwardRef(function Tabs(inProps, ref) {
682
681
  }
683
682
  }
684
683
  });
685
- const mergedRef = useForkRef(rovingTabIndexContainerProps.ref, tabListRef);
684
+ const mergedRef = useForkRef(rovingContainerProps.ref, tabListRef);
686
685
  const handleKeyDown = event => {
687
686
  const list = tabListRef.current;
688
687
  const currentFocus = getActiveElement(ownerDocument(list));
@@ -693,7 +692,7 @@ const Tabs = /*#__PURE__*/React.forwardRef(function Tabs(inProps, ref) {
693
692
  if (role !== 'tab') {
694
693
  return;
695
694
  }
696
- rovingTabIndexContainerProps.onKeyDown(event);
695
+ rovingContainerProps.onKeyDown(event);
697
696
  };
698
697
  const [ListSlot, listSlotProps] = useSlot('list', {
699
698
  ref: mergedRef,
@@ -703,12 +702,19 @@ const Tabs = /*#__PURE__*/React.forwardRef(function Tabs(inProps, ref) {
703
702
  ownerState,
704
703
  getSlotProps: handlers => ({
705
704
  ...handlers,
705
+ onBlur: event => {
706
+ if (!event.currentTarget.contains(event.relatedTarget)) {
707
+ setIsFocusWithinList(false);
708
+ }
709
+ handlers.onBlur?.(event);
710
+ },
706
711
  onKeyDown: event => {
707
712
  handleKeyDown(event);
708
713
  handlers.onKeyDown?.(event);
709
714
  },
710
715
  onFocus: event => {
711
- rovingTabIndexContainerProps.onFocus(event);
716
+ setIsFocusWithinList(true);
717
+ rovingContainerProps.onFocus(event);
712
718
  handlers.onFocus?.(event);
713
719
  }
714
720
  })
@@ -723,7 +729,10 @@ const Tabs = /*#__PURE__*/React.forwardRef(function Tabs(inProps, ref) {
723
729
  "aria-orientation": orientation === 'vertical' ? 'vertical' : null,
724
730
  role: "tablist",
725
731
  ...listSlotProps,
726
- children: children
732
+ children: /*#__PURE__*/_jsx(RovingTabIndexContext.Provider, {
733
+ value: rovingContainer,
734
+ children: children
735
+ })
727
736
  }), mounted && indicator]
728
737
  }), conditionalElements.scrollButtonEnd]
729
738
  });
@@ -178,6 +178,7 @@ const ToggleButton = /*#__PURE__*/React.forwardRef(function ToggleButton(inProps
178
178
  const positionClassName = toggleButtonGroupButtonContextPositionClassName || '';
179
179
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(ToggleButtonRoot, {
180
180
  className: (0, _clsx.default)(contextProps.className, classes.root, className, positionClassName),
181
+ internalNativeButton: true,
181
182
  disabled: disabled,
182
183
  focusRipple: !disableFocusRipple,
183
184
  ref: ref,
@@ -171,6 +171,7 @@ const ToggleButton = /*#__PURE__*/React.forwardRef(function ToggleButton(inProps
171
171
  const positionClassName = toggleButtonGroupButtonContextPositionClassName || '';
172
172
  return /*#__PURE__*/_jsx(ToggleButtonRoot, {
173
173
  className: clsx(contextProps.className, classes.root, className, positionClassName),
174
+ internalNativeButton: true,
174
175
  disabled: disabled,
175
176
  focusRipple: !disableFocusRipple,
176
177
  ref: ref,
@@ -41,7 +41,7 @@ export type TooltipSlotsAndSlotProps = CreateSlotsAndSlotProps<TooltipSlots, {
41
41
  * Props forwarded to the transition slot.
42
42
  * By default, the available props are based on the [Grow](https://mui.com/material-ui/api/grow/#props) component.
43
43
  */
44
- transition: SlotProps<React.ElementType, TransitionProps & TooltipTransitionSlotPropsOverrides, TooltipOwnerState>;
44
+ transition: SlotProps<React.ElementType<TransitionProps>, TransitionProps & TooltipTransitionSlotPropsOverrides, TooltipOwnerState>;
45
45
  /**
46
46
  * Props forwarded to the tooltip slot.
47
47
  * By default, the available props are based on the div element.
@@ -41,7 +41,7 @@ export type TooltipSlotsAndSlotProps = CreateSlotsAndSlotProps<TooltipSlots, {
41
41
  * Props forwarded to the transition slot.
42
42
  * By default, the available props are based on the [Grow](https://mui.com/material-ui/api/grow/#props) component.
43
43
  */
44
- transition: SlotProps<React.ElementType, TransitionProps & TooltipTransitionSlotPropsOverrides, TooltipOwnerState>;
44
+ transition: SlotProps<React.ElementType<TransitionProps>, TransitionProps & TooltipTransitionSlotPropsOverrides, TooltipOwnerState>;
45
45
  /**
46
46
  * Props forwarded to the tooltip slot.
47
47
  * By default, the available props are based on the div element.
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/material v9.0.0-beta.0
2
+ * @mui/material v9.0.0-beta.1
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
package/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/material v9.0.0-beta.0
2
+ * @mui/material v9.0.0-beta.1
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -20,13 +20,13 @@ type SwitchBaseSlotsAndSlotProps = CreateSlotsAndSlotProps<SwitchBaseSlots, {
20
20
  * Props forwarded to the root slot.
21
21
  * By default, the available props are based on the [ButtonBase](https://mui.com/material-ui/api/button-base/#props) component.
22
22
  */
23
- root: SlotProps<React.ElementType<ButtonBaseProps>, {}, SwitchBaseOwnerState>;
23
+ root: SlotProps<React.ElementType<Omit<ButtonBaseProps, 'nativeButton'>>, {}, SwitchBaseOwnerState>;
24
24
  /**
25
25
  * Props forwarded to the input slot.
26
26
  */
27
27
  input: SlotProps<'input', {}, SwitchBaseOwnerState>;
28
28
  }>;
29
- export interface SwitchBaseProps extends StandardProps<ButtonBaseProps, 'children' | 'onChange' | 'type' | 'value'>, SwitchBaseSlotsAndSlotProps {
29
+ export interface SwitchBaseProps extends StandardProps<Omit<ButtonBaseProps, 'nativeButton'>, 'children' | 'onChange' | 'type' | 'value'>, SwitchBaseSlotsAndSlotProps {
30
30
  autoFocus?: boolean | undefined;
31
31
  /**
32
32
  * If `true`, the component is checked.
@@ -20,13 +20,13 @@ type SwitchBaseSlotsAndSlotProps = CreateSlotsAndSlotProps<SwitchBaseSlots, {
20
20
  * Props forwarded to the root slot.
21
21
  * By default, the available props are based on the [ButtonBase](https://mui.com/material-ui/api/button-base/#props) component.
22
22
  */
23
- root: SlotProps<React.ElementType<ButtonBaseProps>, {}, SwitchBaseOwnerState>;
23
+ root: SlotProps<React.ElementType<Omit<ButtonBaseProps, 'nativeButton'>>, {}, SwitchBaseOwnerState>;
24
24
  /**
25
25
  * Props forwarded to the input slot.
26
26
  */
27
27
  input: SlotProps<'input', {}, SwitchBaseOwnerState>;
28
28
  }>;
29
- export interface SwitchBaseProps extends StandardProps<ButtonBaseProps, 'children' | 'onChange' | 'type' | 'value'>, SwitchBaseSlotsAndSlotProps {
29
+ export interface SwitchBaseProps extends StandardProps<Omit<ButtonBaseProps, 'nativeButton'>, 'children' | 'onChange' | 'type' | 'value'>, SwitchBaseSlotsAndSlotProps {
30
30
  autoFocus?: boolean | undefined;
31
31
  /**
32
32
  * If `true`, the component is checked.
@@ -114,6 +114,10 @@ const SwitchBase = /*#__PURE__*/React.forwardRef(function SwitchBase(props, ref)
114
114
  slotProps = {},
115
115
  ...other
116
116
  } = props;
117
+ const {
118
+ nativeButton,
119
+ ...buttonBaseProps
120
+ } = other;
117
121
  const [checked, setCheckedState] = (0, _useControlled.default)({
118
122
  controlled: checkedProp,
119
123
  default: Boolean(defaultChecked),
@@ -176,7 +180,7 @@ const SwitchBase = /*#__PURE__*/React.forwardRef(function SwitchBase(props, ref)
176
180
  externalForwardedProps: {
177
181
  ...externalForwardedProps,
178
182
  component: 'span',
179
- ...other
183
+ ...buttonBaseProps
180
184
  },
181
185
  getSlotProps: handlers => ({
182
186
  ...handlers,
@@ -107,6 +107,10 @@ const SwitchBase = /*#__PURE__*/React.forwardRef(function SwitchBase(props, ref)
107
107
  slotProps = {},
108
108
  ...other
109
109
  } = props;
110
+ const {
111
+ nativeButton,
112
+ ...buttonBaseProps
113
+ } = other;
110
114
  const [checked, setCheckedState] = useControlled({
111
115
  controlled: checkedProp,
112
116
  default: Boolean(defaultChecked),
@@ -169,7 +173,7 @@ const SwitchBase = /*#__PURE__*/React.forwardRef(function SwitchBase(props, ref)
169
173
  externalForwardedProps: {
170
174
  ...externalForwardedProps,
171
175
  component: 'span',
172
- ...other
176
+ ...buttonBaseProps
173
177
  },
174
178
  getSlotProps: handlers => ({
175
179
  ...handlers,
package/locale/psAF.js CHANGED
@@ -47,7 +47,7 @@ const psAF = exports.psAF = {
47
47
  defaultProps: {
48
48
  clearText: 'پاک کول',
49
49
  closeText: 'تړل',
50
- loadingText: '... لوډ کیږی',
50
+ loadingText: ' لوډ کیږی',
51
51
  noOptionsText: 'بی پایلی',
52
52
  openText: 'خلاصول'
53
53
  }
package/locale/psAF.mjs CHANGED
@@ -40,7 +40,7 @@ export const psAF = {
40
40
  defaultProps: {
41
41
  clearText: 'پاک کول',
42
42
  closeText: 'تړل',
43
- loadingText: '... لوډ کیږی',
43
+ loadingText: ' لوډ کیږی',
44
44
  noOptionsText: 'بی پایلی',
45
45
  openText: 'خلاصول'
46
46
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/material",
3
- "version": "9.0.0-beta.0",
3
+ "version": "9.0.0-beta.1",
4
4
  "author": "MUI Team",
5
5
  "description": "Material UI is an open-source React component library that implements Google's Material Design. It's comprehensive and can be used in production out of the box.",
6
6
  "keywords": [
@@ -33,10 +33,10 @@
33
33
  "prop-types": "^15.8.1",
34
34
  "react-is": "^19.2.4",
35
35
  "react-transition-group": "^4.4.5",
36
+ "@mui/system": "9.0.0-beta.1",
37
+ "@mui/utils": "9.0.0-beta.1",
36
38
  "@mui/types": "^9.0.0-beta.0",
37
- "@mui/core-downloads-tracker": "^9.0.0-beta.0",
38
- "@mui/system": "9.0.0-beta.0",
39
- "@mui/utils": "9.0.0-beta.0"
39
+ "@mui/core-downloads-tracker": "^9.0.0-beta.1"
40
40
  },
41
41
  "peerDependencies": {
42
42
  "@emotion/react": "^11.5.0",
@@ -44,7 +44,7 @@
44
44
  "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
45
45
  "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
46
46
  "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0",
47
- "@mui/material-pigment-css": "9.0.0-beta.0"
47
+ "@mui/material-pigment-css": "9.0.0-beta.1"
48
48
  },
49
49
  "peerDependenciesMeta": {
50
50
  "@types/react": {
@@ -339,21 +339,21 @@ function createThemeWithVars(options = {}, ...args) {
339
339
  setColor(palette.TableCell, 'border', colorMix(_colorManipulator.private_safeDarken, (0, _colorManipulator.private_safeAlpha)(nativeColor ? getCssVar('palette-divider') : palette.divider, 1), 0.68));
340
340
  setColor(palette.Tooltip, 'bg', colorMix(_colorManipulator.private_safeAlpha, nativeColor ? getCssVar('palette-grey-700') : palette.grey[700], 0.92));
341
341
  }
342
+ if (!nativeColor) {
343
+ setColorChannel(palette.background, 'default');
342
344
 
343
- // MUI X - DataGrid needs this token.
344
- setColorChannel(palette.background, 'default');
345
-
346
- // added for consistency with the `background.default` token
347
- setColorChannel(palette.background, 'paper');
348
- setColorChannel(palette.common, 'background');
349
- setColorChannel(palette.common, 'onBackground');
350
- setColorChannel(palette, 'divider');
345
+ // added for consistency with the `background.default` token
346
+ setColorChannel(palette.background, 'paper');
347
+ setColorChannel(palette.common, 'background');
348
+ setColorChannel(palette.common, 'onBackground');
349
+ setColorChannel(palette, 'divider');
350
+ }
351
351
  Object.keys(palette).forEach(color => {
352
352
  const colors = palette[color];
353
353
 
354
354
  // The default palettes (primary, secondary, error, info, success, and warning) errors are handled by the above `createTheme(...)`.
355
355
 
356
- if (color !== 'tonalOffset' && colors && typeof colors === 'object') {
356
+ if (color !== 'tonalOffset' && !nativeColor && colors && typeof colors === 'object') {
357
357
  // Silent the error for custom palettes.
358
358
  if (colors.main) {
359
359
  setColor(palette[color], 'mainChannel', (0, _colorManipulator.private_safeColorChannel)(toRgb(colors.main)));
@@ -329,21 +329,21 @@ export default function createThemeWithVars(options = {}, ...args) {
329
329
  setColor(palette.TableCell, 'border', colorMix(safeDarken, safeAlpha(nativeColor ? getCssVar('palette-divider') : palette.divider, 1), 0.68));
330
330
  setColor(palette.Tooltip, 'bg', colorMix(safeAlpha, nativeColor ? getCssVar('palette-grey-700') : palette.grey[700], 0.92));
331
331
  }
332
+ if (!nativeColor) {
333
+ setColorChannel(palette.background, 'default');
332
334
 
333
- // MUI X - DataGrid needs this token.
334
- setColorChannel(palette.background, 'default');
335
-
336
- // added for consistency with the `background.default` token
337
- setColorChannel(palette.background, 'paper');
338
- setColorChannel(palette.common, 'background');
339
- setColorChannel(palette.common, 'onBackground');
340
- setColorChannel(palette, 'divider');
335
+ // added for consistency with the `background.default` token
336
+ setColorChannel(palette.background, 'paper');
337
+ setColorChannel(palette.common, 'background');
338
+ setColorChannel(palette.common, 'onBackground');
339
+ setColorChannel(palette, 'divider');
340
+ }
341
341
  Object.keys(palette).forEach(color => {
342
342
  const colors = palette[color];
343
343
 
344
344
  // The default palettes (primary, secondary, error, info, success, and warning) errors are handled by the above `createTheme(...)`.
345
345
 
346
- if (color !== 'tonalOffset' && colors && typeof colors === 'object') {
346
+ if (color !== 'tonalOffset' && !nativeColor && colors && typeof colors === 'object') {
347
347
  // Silent the error for custom palettes.
348
348
  if (colors.main) {
349
349
  setColor(palette[color], 'mainChannel', safeColorChannel(toRgb(colors.main)));
@@ -965,6 +965,10 @@ function useAutocomplete(props) {
965
965
  if (!event.currentTarget.contains(event.target)) {
966
966
  return;
967
967
  }
968
+ // Don't interfere with interactions outside the input area (e.g. helper text)
969
+ if (anchorEl && !anchorEl.contains(event.target)) {
970
+ return;
971
+ }
968
972
  if (event.target.getAttribute('id') !== id) {
969
973
  event.preventDefault();
970
974
  }
@@ -976,6 +980,10 @@ function useAutocomplete(props) {
976
980
  if (!event.currentTarget.contains(event.target)) {
977
981
  return;
978
982
  }
983
+ // Don't interfere with interactions outside the input area (e.g. helper text)
984
+ if (anchorEl && !anchorEl.contains(event.target)) {
985
+ return;
986
+ }
979
987
  inputRef.current.focus();
980
988
  if (selectOnFocus && firstFocus.current && inputRef.current.selectionEnd - inputRef.current.selectionStart === 0) {
981
989
  inputRef.current.select();
@@ -957,6 +957,10 @@ function useAutocomplete(props) {
957
957
  if (!event.currentTarget.contains(event.target)) {
958
958
  return;
959
959
  }
960
+ // Don't interfere with interactions outside the input area (e.g. helper text)
961
+ if (anchorEl && !anchorEl.contains(event.target)) {
962
+ return;
963
+ }
960
964
  if (event.target.getAttribute('id') !== id) {
961
965
  event.preventDefault();
962
966
  }
@@ -968,6 +972,10 @@ function useAutocomplete(props) {
968
972
  if (!event.currentTarget.contains(event.target)) {
969
973
  return;
970
974
  }
975
+ // Don't interfere with interactions outside the input area (e.g. helper text)
976
+ if (anchorEl && !anchorEl.contains(event.target)) {
977
+ return;
978
+ }
971
979
  inputRef.current.focus();
972
980
  if (selectOnFocus && firstFocus.current && inputRef.current.selectionEnd - inputRef.current.selectionStart === 0) {
973
981
  inputRef.current.select();
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ 'use client';
3
+
4
+ /**
5
+ * If `focusSource` is present, attempt to pass `focusVisible` through `focus()` options.
6
+ * Fall back to a plain focus call when the browser does not support it.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", {
9
+ value: true
10
+ });
11
+ exports.default = focusWithVisible;
12
+ function focusWithVisible(element, focusSource) {
13
+ if (focusSource == null) {
14
+ element.focus();
15
+ return;
16
+ }
17
+ try {
18
+ element.focus({
19
+ focusVisible: focusSource === 'keyboard'
20
+ });
21
+ } catch (error) {
22
+ element.focus();
23
+ }
24
+ }
@@ -0,0 +1,19 @@
1
+ 'use client';
2
+
3
+ /**
4
+ * If `focusSource` is present, attempt to pass `focusVisible` through `focus()` options.
5
+ * Fall back to a plain focus call when the browser does not support it.
6
+ */
7
+ export default function focusWithVisible(element, focusSource) {
8
+ if (focusSource == null) {
9
+ element.focus();
10
+ return;
11
+ }
12
+ try {
13
+ element.focus({
14
+ focusVisible: focusSource === 'keyboard'
15
+ });
16
+ } catch (error) {
17
+ element.focus();
18
+ }
19
+ }
package/utils/index.d.mts CHANGED
@@ -16,7 +16,6 @@ export { default as unstable_useId } from "./useId.mjs";
16
16
  export { default as unsupportedProp } from "./unsupportedProp.mjs";
17
17
  export { default as useControlled } from "./useControlled.mjs";
18
18
  export { default as useEventCallback } from "./useEventCallback.mjs";
19
- export { default as useRovingTabIndex } from "./useRovingTabIndex.mjs";
20
19
  export { default as useForkRef } from "./useForkRef.mjs";
21
20
  export { default as mergeSlotProps } from "./mergeSlotProps.mjs";
22
21
  export * from "./types.mjs";
package/utils/index.d.ts CHANGED
@@ -16,7 +16,6 @@ export { default as unstable_useId } from "./useId.js";
16
16
  export { default as unsupportedProp } from "./unsupportedProp.js";
17
17
  export { default as useControlled } from "./useControlled.js";
18
18
  export { default as useEventCallback } from "./useEventCallback.js";
19
- export { default as useRovingTabIndex } from "./useRovingTabIndex.js";
20
19
  export { default as useForkRef } from "./useForkRef.js";
21
20
  export { default as mergeSlotProps } from "./mergeSlotProps.js";
22
21
  export * from "./types.js";
package/utils/index.js CHANGED
@@ -120,12 +120,6 @@ Object.defineProperty(exports, "useForkRef", {
120
120
  return _useForkRef.default;
121
121
  }
122
122
  });
123
- Object.defineProperty(exports, "useRovingTabIndex", {
124
- enumerable: true,
125
- get: function () {
126
- return _useRovingTabIndex.default;
127
- }
128
- });
129
123
  var _ClassNameGenerator = _interopRequireDefault(require("@mui/utils/ClassNameGenerator"));
130
124
  var _capitalize = _interopRequireDefault(require("./capitalize"));
131
125
  var _createChainedFunction = _interopRequireDefault(require("./createChainedFunction"));
@@ -144,7 +138,6 @@ var _useId = _interopRequireDefault(require("./useId"));
144
138
  var _unsupportedProp = _interopRequireDefault(require("./unsupportedProp"));
145
139
  var _useControlled = _interopRequireDefault(require("./useControlled"));
146
140
  var _useEventCallback = _interopRequireDefault(require("./useEventCallback"));
147
- var _useRovingTabIndex = _interopRequireDefault(require("./useRovingTabIndex"));
148
141
  var _useForkRef = _interopRequireDefault(require("./useForkRef"));
149
142
  var _mergeSlotProps = _interopRequireDefault(require("./mergeSlotProps"));
150
143
  // TODO: remove this export once ClassNameGenerator is stable
package/utils/index.mjs CHANGED
@@ -18,7 +18,6 @@ export { default as unstable_useId } from "./useId.mjs";
18
18
  export { default as unsupportedProp } from "./unsupportedProp.mjs";
19
19
  export { default as useControlled } from "./useControlled.mjs";
20
20
  export { default as useEventCallback } from "./useEventCallback.mjs";
21
- export { default as useRovingTabIndex } from "./useRovingTabIndex.mjs";
22
21
  export { default as useForkRef } from "./useForkRef.mjs";
23
22
  export { default as mergeSlotProps } from "./mergeSlotProps.mjs";
24
23
  // TODO: remove this export once ClassNameGenerator is stable
@@ -0,0 +1,30 @@
1
+ import * as React from 'react';
2
+ export interface UseFocusableWhenDisabledParameters {
3
+ /**
4
+ * Whether the component should be focusable when disabled.
5
+ * When `undefined`, composite items are focusable when disabled by default.
6
+ */
7
+ focusableWhenDisabled?: boolean | undefined;
8
+ /**
9
+ * The disabled state of the component.
10
+ */
11
+ disabled: boolean;
12
+ /**
13
+ * Whether this is a composite item or not.
14
+ * @default false
15
+ */
16
+ composite?: boolean | undefined;
17
+ /**
18
+ * @default 0
19
+ */
20
+ tabIndex?: number | undefined;
21
+ isNativeButton: boolean;
22
+ }
23
+ interface FocusableWhenDisabledProps {
24
+ 'aria-disabled'?: boolean | undefined;
25
+ disabled?: boolean | undefined;
26
+ onKeyDown: (event: React.KeyboardEvent) => void;
27
+ tabIndex?: number | undefined;
28
+ }
29
+ export default function useFocusableWhenDisabled(parameters: UseFocusableWhenDisabledParameters): FocusableWhenDisabledProps;
30
+ export {};
@@ -0,0 +1,30 @@
1
+ import * as React from 'react';
2
+ export interface UseFocusableWhenDisabledParameters {
3
+ /**
4
+ * Whether the component should be focusable when disabled.
5
+ * When `undefined`, composite items are focusable when disabled by default.
6
+ */
7
+ focusableWhenDisabled?: boolean | undefined;
8
+ /**
9
+ * The disabled state of the component.
10
+ */
11
+ disabled: boolean;
12
+ /**
13
+ * Whether this is a composite item or not.
14
+ * @default false
15
+ */
16
+ composite?: boolean | undefined;
17
+ /**
18
+ * @default 0
19
+ */
20
+ tabIndex?: number | undefined;
21
+ isNativeButton: boolean;
22
+ }
23
+ interface FocusableWhenDisabledProps {
24
+ 'aria-disabled'?: boolean | undefined;
25
+ disabled?: boolean | undefined;
26
+ onKeyDown: (event: React.KeyboardEvent) => void;
27
+ tabIndex?: number | undefined;
28
+ }
29
+ export default function useFocusableWhenDisabled(parameters: UseFocusableWhenDisabledParameters): FocusableWhenDisabledProps;
30
+ export {};
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ 'use client';
3
+
4
+ var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = useFocusableWhenDisabled;
9
+ var React = _interopRequireWildcard(require("react"));
10
+ function useFocusableWhenDisabled(parameters) {
11
+ const {
12
+ focusableWhenDisabled,
13
+ disabled,
14
+ composite = false,
15
+ tabIndex: tabIndexProp = 0,
16
+ isNativeButton
17
+ } = parameters;
18
+ const isFocusableComposite = composite && focusableWhenDisabled !== false;
19
+ const isNonFocusableComposite = composite && focusableWhenDisabled === false;
20
+
21
+ // we can't explicitly assign `undefined` to any of these props because it
22
+ // would otherwise prevent subsequently merged props from setting them
23
+ const props = React.useMemo(() => {
24
+ const additionalProps = {
25
+ // allow Tabbing away from focusableWhenDisabled elements
26
+ onKeyDown(event) {
27
+ if (disabled && focusableWhenDisabled && event.key !== 'Tab') {
28
+ event.preventDefault();
29
+ }
30
+ }
31
+ };
32
+ if (!composite) {
33
+ additionalProps.tabIndex = tabIndexProp;
34
+ if (!isNativeButton && disabled) {
35
+ additionalProps.tabIndex = focusableWhenDisabled ? tabIndexProp : -1;
36
+ }
37
+ }
38
+ if (isNativeButton && (focusableWhenDisabled || isFocusableComposite) || !isNativeButton && disabled) {
39
+ additionalProps['aria-disabled'] = disabled;
40
+ }
41
+ if (isNativeButton && (!focusableWhenDisabled || isNonFocusableComposite)) {
42
+ additionalProps.disabled = disabled;
43
+ }
44
+ return additionalProps;
45
+ }, [composite, disabled, focusableWhenDisabled, isFocusableComposite, isNonFocusableComposite, isNativeButton, tabIndexProp]);
46
+ return props;
47
+ }