@mui/material 6.3.0 → 6.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/Alert/Alert.d.ts +69 -0
  2. package/Alert/Alert.js +53 -21
  3. package/AppBar/AppBar.d.ts +1 -1
  4. package/AppBar/AppBar.js +1 -1
  5. package/Autocomplete/Autocomplete.d.ts +1 -1
  6. package/Autocomplete/Autocomplete.js +35 -48
  7. package/Button/Button.d.ts +18 -0
  8. package/Button/Button.js +233 -15
  9. package/Button/buttonClasses.d.ts +14 -0
  10. package/Button/buttonClasses.js +1 -1
  11. package/CHANGELOG.md +85 -0
  12. package/CardHeader/CardHeader.d.ts +114 -1
  13. package/CardHeader/CardHeader.js +99 -32
  14. package/CircularProgress/CircularProgress.js +2 -2
  15. package/IconButton/IconButton.d.ts +12 -0
  16. package/IconButton/IconButton.js +69 -7
  17. package/IconButton/iconButtonClasses.d.ts +4 -0
  18. package/IconButton/iconButtonClasses.js +1 -1
  19. package/LinearProgress/LinearProgress.js +4 -4
  20. package/LinearProgress/linearProgressClasses.d.ts +31 -9
  21. package/LinearProgress/linearProgressClasses.js +1 -1
  22. package/Link/getTextDecoration.js +3 -2
  23. package/Select/Select.js +10 -1
  24. package/Select/SelectInput.js +1 -1
  25. package/Select/selectClasses.d.ts +9 -3
  26. package/Slider/useSlider.js +5 -2
  27. package/StepLabel/StepLabel.d.ts +1 -1
  28. package/TableSortLabel/TableSortLabel.d.ts +43 -1
  29. package/TableSortLabel/TableSortLabel.js +40 -7
  30. package/Tooltip/Tooltip.d.ts +1 -1
  31. package/Tooltip/Tooltip.js +1 -1
  32. package/index.js +1 -1
  33. package/modern/Alert/Alert.js +53 -21
  34. package/modern/AppBar/AppBar.js +1 -1
  35. package/modern/Autocomplete/Autocomplete.js +35 -48
  36. package/modern/Button/Button.js +233 -15
  37. package/modern/Button/buttonClasses.js +1 -1
  38. package/modern/CardHeader/CardHeader.js +99 -32
  39. package/modern/CircularProgress/CircularProgress.js +2 -2
  40. package/modern/IconButton/IconButton.js +69 -7
  41. package/modern/IconButton/iconButtonClasses.js +1 -1
  42. package/modern/LinearProgress/LinearProgress.js +4 -4
  43. package/modern/LinearProgress/linearProgressClasses.js +1 -1
  44. package/modern/Link/getTextDecoration.js +3 -2
  45. package/modern/Select/Select.js +10 -1
  46. package/modern/Select/SelectInput.js +1 -1
  47. package/modern/Slider/useSlider.js +5 -2
  48. package/modern/TableSortLabel/TableSortLabel.js +40 -7
  49. package/modern/Tooltip/Tooltip.js +1 -1
  50. package/modern/index.js +1 -1
  51. package/modern/utils/index.js +1 -0
  52. package/modern/utils/mergeSlotProps.js +43 -0
  53. package/modern/utils/useSlot.js +5 -1
  54. package/modern/version/index.js +2 -2
  55. package/node/Alert/Alert.js +53 -21
  56. package/node/AppBar/AppBar.js +1 -1
  57. package/node/Autocomplete/Autocomplete.js +35 -48
  58. package/node/Button/Button.js +233 -15
  59. package/node/Button/buttonClasses.js +1 -1
  60. package/node/CardHeader/CardHeader.js +99 -32
  61. package/node/CircularProgress/CircularProgress.js +2 -2
  62. package/node/IconButton/IconButton.js +68 -6
  63. package/node/IconButton/iconButtonClasses.js +1 -1
  64. package/node/LinearProgress/LinearProgress.js +4 -4
  65. package/node/LinearProgress/linearProgressClasses.js +1 -1
  66. package/node/Link/getTextDecoration.js +3 -2
  67. package/node/Select/Select.js +10 -1
  68. package/node/Select/SelectInput.js +1 -1
  69. package/node/Slider/useSlider.js +5 -2
  70. package/node/TableSortLabel/TableSortLabel.js +40 -7
  71. package/node/Tooltip/Tooltip.js +1 -1
  72. package/node/index.js +1 -1
  73. package/node/utils/index.js +7 -0
  74. package/node/utils/mergeSlotProps.js +50 -0
  75. package/node/utils/useSlot.js +5 -1
  76. package/node/version/index.js +2 -2
  77. package/package.json +6 -6
  78. package/utils/index.d.ts +1 -0
  79. package/utils/index.js +1 -0
  80. package/utils/mergeSlotProps.d.ts +2 -0
  81. package/utils/mergeSlotProps.js +43 -0
  82. package/utils/useSlot.d.ts +8 -0
  83. package/utils/useSlot.js +5 -1
  84. package/version/index.js +2 -2
@@ -12,12 +12,14 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
12
12
  var _clsx = _interopRequireDefault(require("clsx"));
13
13
  var _chainPropTypes = _interopRequireDefault(require("@mui/utils/chainPropTypes"));
14
14
  var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
15
+ var _utils = require("@mui/material/utils");
15
16
  var _colorManipulator = require("@mui/system/colorManipulator");
16
17
  var _zeroStyled = require("../zero-styled");
17
18
  var _memoTheme = _interopRequireDefault(require("../utils/memoTheme"));
18
19
  var _createSimplePaletteValueFilter = _interopRequireDefault(require("../utils/createSimplePaletteValueFilter"));
19
20
  var _DefaultPropsProvider = require("../DefaultPropsProvider");
20
21
  var _ButtonBase = _interopRequireDefault(require("../ButtonBase"));
22
+ var _CircularProgress = _interopRequireDefault(require("../CircularProgress"));
21
23
  var _capitalize = _interopRequireDefault(require("../utils/capitalize"));
22
24
  var _iconButtonClasses = _interopRequireWildcard(require("./iconButtonClasses"));
23
25
  var _jsxRuntime = require("react/jsx-runtime");
@@ -27,10 +29,12 @@ const useUtilityClasses = ownerState => {
27
29
  disabled,
28
30
  color,
29
31
  edge,
30
- size
32
+ size,
33
+ loading
31
34
  } = ownerState;
32
35
  const slots = {
33
- root: ['root', disabled && 'disabled', color !== 'default' && `color${(0, _capitalize.default)(color)}`, edge && `edge${(0, _capitalize.default)(edge)}`, `size${(0, _capitalize.default)(size)}`]
36
+ root: ['root', loading && 'loading', disabled && 'disabled', color !== 'default' && `color${(0, _capitalize.default)(color)}`, edge && `edge${(0, _capitalize.default)(edge)}`, `size${(0, _capitalize.default)(size)}`],
37
+ loadingIndicator: ['loadingIndicator']
34
38
  };
35
39
  return (0, _composeClasses.default)(slots, _iconButtonClasses.getIconButtonUtilityClass, classes);
36
40
  };
@@ -41,7 +45,7 @@ const IconButtonRoot = (0, _zeroStyled.styled)(_ButtonBase.default, {
41
45
  const {
42
46
  ownerState
43
47
  } = props;
44
- return [styles.root, ownerState.color !== 'default' && styles[`color${(0, _capitalize.default)(ownerState.color)}`], ownerState.edge && styles[`edge${(0, _capitalize.default)(ownerState.edge)}`], styles[`size${(0, _capitalize.default)(ownerState.size)}`]];
48
+ return [styles.root, ownerState.loading && styles.loading, ownerState.color !== 'default' && styles[`color${(0, _capitalize.default)(ownerState.color)}`], ownerState.edge && styles[`edge${(0, _capitalize.default)(ownerState.edge)}`], styles[`size${(0, _capitalize.default)(ownerState.size)}`]];
45
49
  }
46
50
  })((0, _memoTheme.default)(({
47
51
  theme
@@ -144,8 +148,34 @@ const IconButtonRoot = (0, _zeroStyled.styled)(_ButtonBase.default, {
144
148
  [`&.${_iconButtonClasses.default.disabled}`]: {
145
149
  backgroundColor: 'transparent',
146
150
  color: (theme.vars || theme).palette.action.disabled
151
+ },
152
+ [`&.${_iconButtonClasses.default.loading}`]: {
153
+ color: 'transparent'
147
154
  }
148
155
  })));
156
+ const IconButtonLoadingIndicator = (0, _zeroStyled.styled)('span', {
157
+ name: 'MuiIconButton',
158
+ slot: 'LoadingIndicator',
159
+ overridesResolver: (props, styles) => styles.loadingIndicator
160
+ })(({
161
+ theme
162
+ }) => ({
163
+ display: 'none',
164
+ position: 'absolute',
165
+ visibility: 'visible',
166
+ top: '50%',
167
+ left: '50%',
168
+ transform: 'translate(-50%, -50%)',
169
+ color: (theme.vars || theme).palette.action.disabled,
170
+ variants: [{
171
+ props: {
172
+ loading: true
173
+ },
174
+ style: {
175
+ display: 'flex'
176
+ }
177
+ }]
178
+ }));
149
179
 
150
180
  /**
151
181
  * Refer to the [Icons](/material-ui/icons/) section of the documentation
@@ -164,26 +194,42 @@ const IconButton = /*#__PURE__*/React.forwardRef(function IconButton(inProps, re
164
194
  disabled = false,
165
195
  disableFocusRipple = false,
166
196
  size = 'medium',
197
+ id: idProp,
198
+ loading = false,
199
+ loadingIndicator: loadingIndicatorProp,
167
200
  ...other
168
201
  } = props;
202
+ const id = (0, _utils.unstable_useId)(idProp);
203
+ const loadingIndicator = loadingIndicatorProp ?? /*#__PURE__*/(0, _jsxRuntime.jsx)(_CircularProgress.default, {
204
+ "aria-labelledby": id,
205
+ color: "inherit",
206
+ size: 16
207
+ });
169
208
  const ownerState = {
170
209
  ...props,
171
210
  edge,
172
211
  color,
173
212
  disabled,
174
213
  disableFocusRipple,
214
+ loading,
215
+ loadingIndicator,
175
216
  size
176
217
  };
177
218
  const classes = useUtilityClasses(ownerState);
178
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(IconButtonRoot, {
219
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(IconButtonRoot, {
220
+ id: id,
179
221
  className: (0, _clsx.default)(classes.root, className),
180
222
  centerRipple: true,
181
223
  focusRipple: !disableFocusRipple,
182
- disabled: disabled,
224
+ disabled: disabled || loading,
183
225
  ref: ref,
184
226
  ...other,
185
227
  ownerState: ownerState,
186
- children: children
228
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(IconButtonLoadingIndicator, {
229
+ className: classes.loadingIndicator,
230
+ ownerState: ownerState,
231
+ children: loading && loadingIndicator
232
+ }), children]
187
233
  });
188
234
  });
189
235
  process.env.NODE_ENV !== "production" ? IconButton.propTypes /* remove-proptypes */ = {
@@ -242,6 +288,22 @@ process.env.NODE_ENV !== "production" ? IconButton.propTypes /* remove-proptypes
242
288
  * @default false
243
289
  */
244
290
  edge: _propTypes.default.oneOf(['end', 'start', false]),
291
+ /**
292
+ * @ignore
293
+ */
294
+ id: _propTypes.default.string,
295
+ /**
296
+ * If `true`, the loading indicator is visible and the button is disabled.
297
+ * @default false
298
+ */
299
+ loading: _propTypes.default.bool,
300
+ /**
301
+ * Element placed before the children if the button is in loading state.
302
+ * The node should contain an element with `role="progressbar"` with an accessible name.
303
+ * By default, it renders a `CircularProgress` that is labeled by the button itself.
304
+ * @default <CircularProgress color="inherit" size={16} />
305
+ */
306
+ loadingIndicator: _propTypes.default.node,
245
307
  /**
246
308
  * The size of the component.
247
309
  * `small` is equivalent to the dense button styling.
@@ -11,5 +11,5 @@ var _generateUtilityClass = _interopRequireDefault(require("@mui/utils/generateU
11
11
  function getIconButtonUtilityClass(slot) {
12
12
  return (0, _generateUtilityClass.default)('MuiIconButton', slot);
13
13
  }
14
- const iconButtonClasses = (0, _generateUtilityClasses.default)('MuiIconButton', ['root', 'disabled', 'colorInherit', 'colorPrimary', 'colorSecondary', 'colorError', 'colorInfo', 'colorSuccess', 'colorWarning', 'edgeStart', 'edgeEnd', 'sizeSmall', 'sizeMedium', 'sizeLarge']);
14
+ const iconButtonClasses = (0, _generateUtilityClasses.default)('MuiIconButton', ['root', 'disabled', 'colorInherit', 'colorPrimary', 'colorSecondary', 'colorError', 'colorInfo', 'colorSuccess', 'colorWarning', 'edgeStart', 'edgeEnd', 'sizeSmall', 'sizeMedium', 'sizeLarge', 'loading', 'loadingIndicator']);
15
15
  var _default = exports.default = iconButtonClasses;
@@ -91,8 +91,8 @@ const useUtilityClasses = ownerState => {
91
91
  const slots = {
92
92
  root: ['root', `color${(0, _capitalize.default)(color)}`, variant],
93
93
  dashed: ['dashed', `dashedColor${(0, _capitalize.default)(color)}`],
94
- bar1: ['bar', `barColor${(0, _capitalize.default)(color)}`, (variant === 'indeterminate' || variant === 'query') && 'bar1Indeterminate', variant === 'determinate' && 'bar1Determinate', variant === 'buffer' && 'bar1Buffer'],
95
- bar2: ['bar', variant !== 'buffer' && `barColor${(0, _capitalize.default)(color)}`, variant === 'buffer' && `color${(0, _capitalize.default)(color)}`, (variant === 'indeterminate' || variant === 'query') && 'bar2Indeterminate', variant === 'buffer' && 'bar2Buffer']
94
+ bar1: ['bar', 'bar1', `barColor${(0, _capitalize.default)(color)}`, (variant === 'indeterminate' || variant === 'query') && 'bar1Indeterminate', variant === 'determinate' && 'bar1Determinate', variant === 'buffer' && 'bar1Buffer'],
95
+ bar2: ['bar', 'bar2', variant !== 'buffer' && `barColor${(0, _capitalize.default)(color)}`, variant === 'buffer' && `color${(0, _capitalize.default)(color)}`, (variant === 'indeterminate' || variant === 'query') && 'bar2Indeterminate', variant === 'buffer' && 'bar2Buffer']
96
96
  };
97
97
  return (0, _composeClasses.default)(slots, _linearProgressClasses.getLinearProgressUtilityClass, classes);
98
98
  };
@@ -210,7 +210,7 @@ const LinearProgressBar1 = (0, _zeroStyled.styled)('span', {
210
210
  const {
211
211
  ownerState
212
212
  } = props;
213
- return [styles.bar, styles[`barColor${(0, _capitalize.default)(ownerState.color)}`], (ownerState.variant === 'indeterminate' || ownerState.variant === 'query') && styles.bar1Indeterminate, ownerState.variant === 'determinate' && styles.bar1Determinate, ownerState.variant === 'buffer' && styles.bar1Buffer];
213
+ return [styles.bar, styles.bar1, styles[`barColor${(0, _capitalize.default)(ownerState.color)}`], (ownerState.variant === 'indeterminate' || ownerState.variant === 'query') && styles.bar1Indeterminate, ownerState.variant === 'determinate' && styles.bar1Determinate, ownerState.variant === 'buffer' && styles.bar1Buffer];
214
214
  }
215
215
  })((0, _memoTheme.default)(({
216
216
  theme
@@ -274,7 +274,7 @@ const LinearProgressBar2 = (0, _zeroStyled.styled)('span', {
274
274
  const {
275
275
  ownerState
276
276
  } = props;
277
- return [styles.bar, styles[`barColor${(0, _capitalize.default)(ownerState.color)}`], (ownerState.variant === 'indeterminate' || ownerState.variant === 'query') && styles.bar2Indeterminate, ownerState.variant === 'buffer' && styles.bar2Buffer];
277
+ return [styles.bar, styles.bar2, styles[`barColor${(0, _capitalize.default)(ownerState.color)}`], (ownerState.variant === 'indeterminate' || ownerState.variant === 'query') && styles.bar2Indeterminate, ownerState.variant === 'buffer' && styles.bar2Buffer];
278
278
  }
279
279
  })((0, _memoTheme.default)(({
280
280
  theme
@@ -11,5 +11,5 @@ var _generateUtilityClass = _interopRequireDefault(require("@mui/utils/generateU
11
11
  function getLinearProgressUtilityClass(slot) {
12
12
  return (0, _generateUtilityClass.default)('MuiLinearProgress', slot);
13
13
  }
14
- const linearProgressClasses = (0, _generateUtilityClasses.default)('MuiLinearProgress', ['root', 'colorPrimary', 'colorSecondary', 'determinate', 'indeterminate', 'buffer', 'query', 'dashed', 'dashedColorPrimary', 'dashedColorSecondary', 'bar', 'barColorPrimary', 'barColorSecondary', 'bar1Indeterminate', 'bar1Determinate', 'bar1Buffer', 'bar2Indeterminate', 'bar2Buffer']);
14
+ const linearProgressClasses = (0, _generateUtilityClasses.default)('MuiLinearProgress', ['root', 'colorPrimary', 'colorSecondary', 'determinate', 'indeterminate', 'buffer', 'query', 'dashed', 'dashedColorPrimary', 'dashedColorSecondary', 'bar', 'bar1', 'bar2', 'barColorPrimary', 'barColorSecondary', 'bar1Indeterminate', 'bar1Determinate', 'bar1Buffer', 'bar2Indeterminate', 'bar2Buffer']);
15
15
  var _default = exports.default = linearProgressClasses;
@@ -11,8 +11,9 @@ const getTextDecoration = ({
11
11
  ownerState
12
12
  }) => {
13
13
  const transformedColor = ownerState.color;
14
- const color = (0, _style.getPath)(theme, `palette.${transformedColor}`, false) || ownerState.color;
15
- const channelColor = (0, _style.getPath)(theme, `palette.${transformedColor}Channel`);
14
+ // check the `main` color first for a custom palette, then fallback to the color itself
15
+ const color = (0, _style.getPath)(theme, `palette.${transformedColor}.main`, false) || (0, _style.getPath)(theme, `palette.${transformedColor}`, false) || ownerState.color;
16
+ const channelColor = (0, _style.getPath)(theme, `palette.${transformedColor}.mainChannel`) || (0, _style.getPath)(theme, `palette.${transformedColor}Channel`);
16
17
  if ('vars' in theme && channelColor) {
17
18
  return `rgba(${channelColor} / 0.4)`;
18
19
  }
@@ -11,6 +11,7 @@ var React = _interopRequireWildcard(require("react"));
11
11
  var _propTypes = _interopRequireDefault(require("prop-types"));
12
12
  var _clsx = _interopRequireDefault(require("clsx"));
13
13
  var _deepmerge = _interopRequireDefault(require("@mui/utils/deepmerge"));
14
+ var _composeClasses = _interopRequireDefault(require("@mui/utils/composeClasses"));
14
15
  var _getReactElementRef = _interopRequireDefault(require("@mui/utils/getReactElementRef"));
15
16
  var _SelectInput = _interopRequireDefault(require("./SelectInput"));
16
17
  var _formControlState = _interopRequireDefault(require("../FormControl/formControlState"));
@@ -24,12 +25,20 @@ var _DefaultPropsProvider = require("../DefaultPropsProvider");
24
25
  var _useForkRef = _interopRequireDefault(require("../utils/useForkRef"));
25
26
  var _zeroStyled = require("../zero-styled");
26
27
  var _rootShouldForwardProp = _interopRequireDefault(require("../styles/rootShouldForwardProp"));
28
+ var _selectClasses = require("./selectClasses");
27
29
  var _jsxRuntime = require("react/jsx-runtime");
28
30
  const useUtilityClasses = ownerState => {
29
31
  const {
30
32
  classes
31
33
  } = ownerState;
32
- return classes;
34
+ const slots = {
35
+ root: ['root']
36
+ };
37
+ const composedClasses = (0, _composeClasses.default)(slots, _selectClasses.getSelectUtilityClasses, classes);
38
+ return {
39
+ ...classes,
40
+ ...composedClasses
41
+ };
33
42
  };
34
43
  const styledRootConfig = {
35
44
  name: 'MuiSelect',
@@ -450,7 +450,7 @@ const SelectInput = /*#__PURE__*/React.forwardRef(function SelectInput(props, re
450
450
  ref: handleDisplayRef,
451
451
  tabIndex: tabIndex,
452
452
  role: "combobox",
453
- "aria-controls": listboxId,
453
+ "aria-controls": open ? listboxId : undefined,
454
454
  "aria-disabled": disabled ? 'true' : undefined,
455
455
  "aria-expanded": open ? 'true' : 'false',
456
456
  "aria-haspopup": "listbox",
@@ -198,6 +198,8 @@ function useSlider(parameters) {
198
198
  const [open, setOpen] = React.useState(-1);
199
199
  const [dragging, setDragging] = React.useState(false);
200
200
  const moveCount = React.useRef(0);
201
+ // lastChangedValue is updated whenever onChange is triggered.
202
+ const lastChangedValue = React.useRef(null);
201
203
  const [valueDerived, setValueState] = (0, _utils.unstable_useControlled)({
202
204
  controlled: valueProp,
203
205
  default: defaultValue ?? min,
@@ -218,6 +220,7 @@ function useSlider(parameters) {
218
220
  name
219
221
  }
220
222
  });
223
+ lastChangedValue.current = value;
221
224
  onChange(clonedEvent, value, thumbIndex);
222
225
  });
223
226
  const range = Array.isArray(valueDerived);
@@ -289,7 +292,7 @@ function useSlider(parameters) {
289
292
  handleChange(event, newValue, index);
290
293
  }
291
294
  if (onChangeCommitted) {
292
- onChangeCommitted(event, newValue);
295
+ onChangeCommitted(event, lastChangedValue.current ?? newValue);
293
296
  }
294
297
  };
295
298
  const createHandleHiddenInputKeyDown = otherHandlers => event => {
@@ -494,7 +497,7 @@ function useSlider(parameters) {
494
497
  setOpen(-1);
495
498
  }
496
499
  if (onChangeCommitted) {
497
- onChangeCommitted(nativeEvent, newValue);
500
+ onChangeCommitted(nativeEvent, lastChangedValue.current ?? newValue);
498
501
  }
499
502
  touchId.current = undefined;
500
503
 
@@ -18,6 +18,7 @@ var _memoTheme = _interopRequireDefault(require("../utils/memoTheme"));
18
18
  var _DefaultPropsProvider = require("../DefaultPropsProvider");
19
19
  var _capitalize = _interopRequireDefault(require("../utils/capitalize"));
20
20
  var _tableSortLabelClasses = _interopRequireWildcard(require("./tableSortLabelClasses"));
21
+ var _useSlot = _interopRequireDefault(require("../utils/useSlot"));
21
22
  var _jsxRuntime = require("react/jsx-runtime");
22
23
  const useUtilityClasses = ownerState => {
23
24
  const {
@@ -117,6 +118,8 @@ const TableSortLabel = /*#__PURE__*/React.forwardRef(function TableSortLabel(inP
117
118
  direction = 'asc',
118
119
  hideSortIcon = false,
119
120
  IconComponent = _ArrowDownward.default,
121
+ slots = {},
122
+ slotProps = {},
120
123
  ...other
121
124
  } = props;
122
125
  const ownerState = {
@@ -127,17 +130,31 @@ const TableSortLabel = /*#__PURE__*/React.forwardRef(function TableSortLabel(inP
127
130
  IconComponent
128
131
  };
129
132
  const classes = useUtilityClasses(ownerState);
130
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)(TableSortLabelRoot, {
133
+ const externalForwardedProps = {
134
+ slots,
135
+ slotProps
136
+ };
137
+ const [RootSlot, rootProps] = (0, _useSlot.default)('root', {
138
+ elementType: TableSortLabelRoot,
139
+ externalForwardedProps,
140
+ ownerState,
131
141
  className: (0, _clsx.default)(classes.root, className),
132
- component: "span",
142
+ ref
143
+ });
144
+ const [IconSlot, iconProps] = (0, _useSlot.default)('icon', {
145
+ elementType: TableSortLabelIcon,
146
+ externalForwardedProps,
147
+ ownerState,
148
+ className: classes.icon
149
+ });
150
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(RootSlot, {
133
151
  disableRipple: true,
134
- ownerState: ownerState,
135
- ref: ref,
152
+ component: "span",
153
+ ...rootProps,
136
154
  ...other,
137
- children: [children, hideSortIcon && !active ? null : /*#__PURE__*/(0, _jsxRuntime.jsx)(TableSortLabelIcon, {
155
+ children: [children, hideSortIcon && !active ? null : /*#__PURE__*/(0, _jsxRuntime.jsx)(IconSlot, {
138
156
  as: IconComponent,
139
- className: (0, _clsx.default)(classes.icon),
140
- ownerState: ownerState
157
+ ...iconProps
141
158
  })]
142
159
  });
143
160
  });
@@ -178,6 +195,22 @@ process.env.NODE_ENV !== "production" ? TableSortLabel.propTypes /* remove-propt
178
195
  * @default ArrowDownwardIcon
179
196
  */
180
197
  IconComponent: _propTypes.default.elementType,
198
+ /**
199
+ * The props used for each slot inside.
200
+ * @default {}
201
+ */
202
+ slotProps: _propTypes.default.shape({
203
+ icon: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object]),
204
+ root: _propTypes.default.oneOfType([_propTypes.default.func, _propTypes.default.object])
205
+ }),
206
+ /**
207
+ * The components used for each slot inside.
208
+ * @default {}
209
+ */
210
+ slots: _propTypes.default.shape({
211
+ icon: _propTypes.default.elementType,
212
+ root: _propTypes.default.elementType
213
+ }),
181
214
  /**
182
215
  * The system prop that allows defining system overrides as well as additional CSS styles.
183
216
  */
@@ -387,7 +387,7 @@ const Tooltip = /*#__PURE__*/React.forwardRef(function Tooltip(inProps, ref) {
387
387
  // eslint-disable-next-line react-hooks/rules-of-hooks -- process.env never changes
388
388
  React.useEffect(() => {
389
389
  if (childNode && childNode.disabled && !isControlled && title !== '' && childNode.tagName.toLowerCase() === 'button') {
390
- console.error(['MUI: You are providing a disabled `button` child to the Tooltip component.', 'A disabled element does not fire events.', "Tooltip needs to listen to the child element's events to display the title.", '', 'Add a simple wrapper element, such as a `span`.'].join('\n'));
390
+ console.warn(['MUI: You are providing a disabled `button` child to the Tooltip component.', 'A disabled element does not fire events.', "Tooltip needs to listen to the child element's events to display the title.", '', 'Add a simple wrapper element, such as a `span`.'].join('\n'));
391
391
  }
392
392
  }, [title, childNode, isControlled]);
393
393
  }
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/material v6.3.0
2
+ * @mui/material v6.4.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -41,6 +41,12 @@ Object.defineProperty(exports, "isMuiElement", {
41
41
  return _isMuiElement.default;
42
42
  }
43
43
  });
44
+ Object.defineProperty(exports, "mergeSlotProps", {
45
+ enumerable: true,
46
+ get: function () {
47
+ return _mergeSlotProps.default;
48
+ }
49
+ });
44
50
  Object.defineProperty(exports, "ownerDocument", {
45
51
  enumerable: true,
46
52
  get: function () {
@@ -126,6 +132,7 @@ var _unsupportedProp = _interopRequireDefault(require("./unsupportedProp"));
126
132
  var _useControlled = _interopRequireDefault(require("./useControlled"));
127
133
  var _useEventCallback = _interopRequireDefault(require("./useEventCallback"));
128
134
  var _useForkRef = _interopRequireDefault(require("./useForkRef"));
135
+ var _mergeSlotProps = _interopRequireDefault(require("./mergeSlotProps"));
129
136
  // TODO: remove this export once ClassNameGenerator is stable
130
137
  // eslint-disable-next-line @typescript-eslint/naming-convention
131
138
  const unstable_ClassNameGenerator = exports.unstable_ClassNameGenerator = {
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = mergeSlotProps;
8
+ var _clsx = _interopRequireDefault(require("clsx"));
9
+ function mergeSlotProps(externalSlotProps, defaultSlotProps) {
10
+ if (!externalSlotProps) {
11
+ return defaultSlotProps;
12
+ }
13
+ if (typeof externalSlotProps === 'function' || typeof defaultSlotProps === 'function') {
14
+ return ownerState => {
15
+ const defaultSlotPropsValue = typeof defaultSlotProps === 'function' ? defaultSlotProps(ownerState) : defaultSlotProps;
16
+ const externalSlotPropsValue = typeof externalSlotProps === 'function' ? externalSlotProps({
17
+ ...ownerState,
18
+ ...defaultSlotPropsValue
19
+ }) : externalSlotProps;
20
+ const className = (0, _clsx.default)(ownerState?.className, defaultSlotPropsValue?.className, externalSlotPropsValue?.className);
21
+ return {
22
+ ...defaultSlotPropsValue,
23
+ ...externalSlotPropsValue,
24
+ ...(!!className && {
25
+ className
26
+ }),
27
+ ...(defaultSlotPropsValue?.style && externalSlotPropsValue?.style && {
28
+ style: {
29
+ ...defaultSlotPropsValue.style,
30
+ ...externalSlotPropsValue.style
31
+ }
32
+ })
33
+ };
34
+ };
35
+ }
36
+ const className = (0, _clsx.default)(defaultSlotProps?.className, externalSlotProps?.className);
37
+ return {
38
+ ...defaultSlotProps,
39
+ ...externalSlotProps,
40
+ ...(!!className && {
41
+ className
42
+ }),
43
+ ...(defaultSlotProps?.style && externalSlotProps?.style && {
44
+ style: {
45
+ ...defaultSlotProps.style,
46
+ ...externalSlotProps.style
47
+ }
48
+ })
49
+ };
50
+ }
@@ -38,6 +38,7 @@ name, parameters) {
38
38
  ownerState,
39
39
  externalForwardedProps,
40
40
  internalForwardedProps,
41
+ shouldForwardComponentProp = false,
41
42
  ...useSlotPropsParams
42
43
  } = parameters;
43
44
  const {
@@ -73,9 +74,12 @@ name, parameters) {
73
74
  ...(name === 'root' && !rootComponent && !slots[name] && internalForwardedProps),
74
75
  ...(name !== 'root' && !slots[name] && internalForwardedProps),
75
76
  ...mergedProps,
76
- ...(LeafComponent && {
77
+ ...(LeafComponent && !shouldForwardComponentProp && {
77
78
  as: LeafComponent
78
79
  }),
80
+ ...(LeafComponent && shouldForwardComponentProp && {
81
+ component: LeafComponent
82
+ }),
79
83
  ref
80
84
  }, ownerState);
81
85
  return [elementType, props];
@@ -4,9 +4,9 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.version = exports.prerelease = exports.patch = exports.minor = exports.major = exports.default = void 0;
7
- const version = exports.version = "6.3.0";
7
+ const version = exports.version = "6.4.0";
8
8
  const major = exports.major = Number("6");
9
- const minor = exports.minor = Number("3");
9
+ const minor = exports.minor = Number("4");
10
10
  const patch = exports.patch = Number("0");
11
11
  const prerelease = exports.prerelease = undefined;
12
12
  var _default = exports.default = version;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/material",
3
- "version": "6.3.0",
3
+ "version": "6.4.0",
4
4
  "private": false,
5
5
  "author": "MUI Team",
6
6
  "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.",
@@ -35,10 +35,10 @@
35
35
  "prop-types": "^15.8.1",
36
36
  "react-is": "^19.0.0",
37
37
  "react-transition-group": "^4.4.5",
38
- "@mui/types": "^7.2.20",
39
- "@mui/utils": "^6.3.0",
40
- "@mui/system": "^6.3.0",
41
- "@mui/core-downloads-tracker": "^6.3.0"
38
+ "@mui/core-downloads-tracker": "^6.4.0",
39
+ "@mui/utils": "^6.4.0",
40
+ "@mui/types": "^7.2.21",
41
+ "@mui/system": "^6.4.0"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "@emotion/react": "^11.5.0",
@@ -46,7 +46,7 @@
46
46
  "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
47
47
  "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
48
48
  "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0",
49
- "@mui/material-pigment-css": "^6.3.0"
49
+ "@mui/material-pigment-css": "^6.4.0"
50
50
  },
51
51
  "peerDependenciesMeta": {
52
52
  "@types/react": {
package/utils/index.d.ts CHANGED
@@ -16,4 +16,5 @@ export { default as unsupportedProp } from './unsupportedProp';
16
16
  export { default as useControlled } from './useControlled';
17
17
  export { default as useEventCallback } from './useEventCallback';
18
18
  export { default as useForkRef } from './useForkRef';
19
+ export { default as mergeSlotProps } from './mergeSlotProps';
19
20
  export * from './types';
package/utils/index.js CHANGED
@@ -18,6 +18,7 @@ export { default as unsupportedProp } from "./unsupportedProp.js";
18
18
  export { default as useControlled } from "./useControlled.js";
19
19
  export { default as useEventCallback } from "./useEventCallback.js";
20
20
  export { default as useForkRef } from "./useForkRef.js";
21
+ export { default as mergeSlotProps } from "./mergeSlotProps.js";
21
22
  // TODO: remove this export once ClassNameGenerator is stable
22
23
  // eslint-disable-next-line @typescript-eslint/naming-convention
23
24
  export const unstable_ClassNameGenerator = {
@@ -0,0 +1,2 @@
1
+ import { SlotComponentProps } from '@mui/utils';
2
+ export default function mergeSlotProps<T extends SlotComponentProps<React.ElementType, {}, {}>, K = T, U = T extends Function ? T : K extends Function ? K : T extends undefined ? K : T>(externalSlotProps: T | undefined, defaultSlotProps: K): U;
@@ -0,0 +1,43 @@
1
+ import clsx from 'clsx';
2
+ export default function mergeSlotProps(externalSlotProps, defaultSlotProps) {
3
+ if (!externalSlotProps) {
4
+ return defaultSlotProps;
5
+ }
6
+ if (typeof externalSlotProps === 'function' || typeof defaultSlotProps === 'function') {
7
+ return ownerState => {
8
+ const defaultSlotPropsValue = typeof defaultSlotProps === 'function' ? defaultSlotProps(ownerState) : defaultSlotProps;
9
+ const externalSlotPropsValue = typeof externalSlotProps === 'function' ? externalSlotProps({
10
+ ...ownerState,
11
+ ...defaultSlotPropsValue
12
+ }) : externalSlotProps;
13
+ const className = clsx(ownerState?.className, defaultSlotPropsValue?.className, externalSlotPropsValue?.className);
14
+ return {
15
+ ...defaultSlotPropsValue,
16
+ ...externalSlotPropsValue,
17
+ ...(!!className && {
18
+ className
19
+ }),
20
+ ...(defaultSlotPropsValue?.style && externalSlotPropsValue?.style && {
21
+ style: {
22
+ ...defaultSlotPropsValue.style,
23
+ ...externalSlotPropsValue.style
24
+ }
25
+ })
26
+ };
27
+ };
28
+ }
29
+ const className = clsx(defaultSlotProps?.className, externalSlotProps?.className);
30
+ return {
31
+ ...defaultSlotProps,
32
+ ...externalSlotProps,
33
+ ...(!!className && {
34
+ className
35
+ }),
36
+ ...(defaultSlotProps?.style && externalSlotProps?.style && {
37
+ style: {
38
+ ...defaultSlotProps.style,
39
+ ...externalSlotProps.style
40
+ }
41
+ })
42
+ };
43
+ }
@@ -70,6 +70,14 @@ name: T, parameters: (T extends 'root' ? {
70
70
  * e.g. Autocomplete's listbox uses Popper + StyledComponent
71
71
  */
72
72
  internalForwardedProps?: any;
73
+ /**
74
+ * Set to true if the `elementType` is a styled component of another Material UI component.
75
+ *
76
+ * For example, the AlertRoot is a styled component of the Paper component.
77
+ * This flag is used to forward the `component` and `slotProps.root.component` to the Paper component.
78
+ * Otherwise, the `component` prop will be converted to `as` prop which replaces the Paper component (the paper styles are gone).
79
+ */
80
+ shouldForwardComponentProp?: boolean;
73
81
  }): [ElementType, {
74
82
  className: string;
75
83
  ownerState: OwnerState & SlotOwnerState;
package/utils/useSlot.js CHANGED
@@ -32,6 +32,7 @@ name, parameters) {
32
32
  ownerState,
33
33
  externalForwardedProps,
34
34
  internalForwardedProps,
35
+ shouldForwardComponentProp = false,
35
36
  ...useSlotPropsParams
36
37
  } = parameters;
37
38
  const {
@@ -67,9 +68,12 @@ name, parameters) {
67
68
  ...(name === 'root' && !rootComponent && !slots[name] && internalForwardedProps),
68
69
  ...(name !== 'root' && !slots[name] && internalForwardedProps),
69
70
  ...mergedProps,
70
- ...(LeafComponent && {
71
+ ...(LeafComponent && !shouldForwardComponentProp && {
71
72
  as: LeafComponent
72
73
  }),
74
+ ...(LeafComponent && shouldForwardComponentProp && {
75
+ component: LeafComponent
76
+ }),
73
77
  ref
74
78
  }, ownerState);
75
79
  return [elementType, props];
package/version/index.js CHANGED
@@ -1,6 +1,6 @@
1
- export const version = "6.3.0";
1
+ export const version = "6.4.0";
2
2
  export const major = Number("6");
3
- export const minor = Number("3");
3
+ export const minor = Number("4");
4
4
  export const patch = Number("0");
5
5
  export const prerelease = undefined;
6
6
  export default version;