@mui/material 6.3.1 → 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 (69) hide show
  1. package/Alert/Alert.d.ts +69 -0
  2. package/Alert/Alert.js +53 -21
  3. package/Autocomplete/Autocomplete.d.ts +1 -1
  4. package/Button/Button.d.ts +18 -0
  5. package/Button/Button.js +233 -15
  6. package/Button/buttonClasses.d.ts +14 -0
  7. package/Button/buttonClasses.js +1 -1
  8. package/CHANGELOG.md +49 -0
  9. package/CardHeader/CardHeader.d.ts +114 -1
  10. package/CardHeader/CardHeader.js +99 -32
  11. package/CircularProgress/CircularProgress.js +2 -2
  12. package/IconButton/IconButton.d.ts +12 -0
  13. package/IconButton/IconButton.js +69 -7
  14. package/IconButton/iconButtonClasses.d.ts +4 -0
  15. package/IconButton/iconButtonClasses.js +1 -1
  16. package/LinearProgress/LinearProgress.js +4 -4
  17. package/LinearProgress/linearProgressClasses.d.ts +31 -9
  18. package/LinearProgress/linearProgressClasses.js +1 -1
  19. package/Link/getTextDecoration.js +3 -2
  20. package/Select/Select.js +10 -1
  21. package/Select/SelectInput.js +1 -1
  22. package/Slider/useSlider.js +5 -2
  23. package/StepLabel/StepLabel.d.ts +1 -1
  24. package/Tooltip/Tooltip.d.ts +1 -1
  25. package/index.js +1 -1
  26. package/modern/Alert/Alert.js +53 -21
  27. package/modern/Button/Button.js +233 -15
  28. package/modern/Button/buttonClasses.js +1 -1
  29. package/modern/CardHeader/CardHeader.js +99 -32
  30. package/modern/CircularProgress/CircularProgress.js +2 -2
  31. package/modern/IconButton/IconButton.js +69 -7
  32. package/modern/IconButton/iconButtonClasses.js +1 -1
  33. package/modern/LinearProgress/LinearProgress.js +4 -4
  34. package/modern/LinearProgress/linearProgressClasses.js +1 -1
  35. package/modern/Link/getTextDecoration.js +3 -2
  36. package/modern/Select/Select.js +10 -1
  37. package/modern/Select/SelectInput.js +1 -1
  38. package/modern/Slider/useSlider.js +5 -2
  39. package/modern/index.js +1 -1
  40. package/modern/utils/index.js +1 -0
  41. package/modern/utils/mergeSlotProps.js +43 -0
  42. package/modern/utils/useSlot.js +5 -1
  43. package/modern/version/index.js +3 -3
  44. package/node/Alert/Alert.js +53 -21
  45. package/node/Button/Button.js +233 -15
  46. package/node/Button/buttonClasses.js +1 -1
  47. package/node/CardHeader/CardHeader.js +99 -32
  48. package/node/CircularProgress/CircularProgress.js +2 -2
  49. package/node/IconButton/IconButton.js +68 -6
  50. package/node/IconButton/iconButtonClasses.js +1 -1
  51. package/node/LinearProgress/LinearProgress.js +4 -4
  52. package/node/LinearProgress/linearProgressClasses.js +1 -1
  53. package/node/Link/getTextDecoration.js +3 -2
  54. package/node/Select/Select.js +10 -1
  55. package/node/Select/SelectInput.js +1 -1
  56. package/node/Slider/useSlider.js +5 -2
  57. package/node/index.js +1 -1
  58. package/node/utils/index.js +7 -0
  59. package/node/utils/mergeSlotProps.js +50 -0
  60. package/node/utils/useSlot.js +5 -1
  61. package/node/version/index.js +3 -3
  62. package/package.json +5 -5
  63. package/utils/index.d.ts +1 -0
  64. package/utils/index.js +1 -0
  65. package/utils/mergeSlotProps.d.ts +2 -0
  66. package/utils/mergeSlotProps.js +43 -0
  67. package/utils/useSlot.d.ts +8 -0
  68. package/utils/useSlot.js +5 -1
  69. package/version/index.js +3 -3
@@ -41,8 +41,8 @@ const circularDashKeyframe = (0, _zeroStyled.keyframes)`
41
41
  }
42
42
 
43
43
  100% {
44
- stroke-dasharray: 100px, 200px;
45
- stroke-dashoffset: -125px;
44
+ stroke-dasharray: 1px, 200px;
45
+ stroke-dashoffset: -126px;
46
46
  }
47
47
  `;
48
48
 
@@ -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
 
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/material v6.3.1
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.1";
7
+ const version = exports.version = "6.4.0";
8
8
  const major = exports.major = Number("6");
9
- const minor = exports.minor = Number("3");
10
- const patch = exports.patch = Number("1");
9
+ const minor = exports.minor = Number("4");
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.1",
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/core-downloads-tracker": "^6.3.1",
38
+ "@mui/core-downloads-tracker": "^6.4.0",
39
+ "@mui/utils": "^6.4.0",
39
40
  "@mui/types": "^7.2.21",
40
- "@mui/system": "^6.3.1",
41
- "@mui/utils": "^6.3.1"
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.1"
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.1";
1
+ export const version = "6.4.0";
2
2
  export const major = Number("6");
3
- export const minor = Number("3");
4
- export const patch = Number("1");
3
+ export const minor = Number("4");
4
+ export const patch = Number("0");
5
5
  export const prerelease = undefined;
6
6
  export default version;