@mui/material 6.4.0 → 6.4.2

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 (99) hide show
  1. package/AppBar/AppBar.d.ts +1 -1
  2. package/ButtonBase/ButtonBase.d.ts +2 -0
  3. package/ButtonGroup/ButtonGroupButtonContext.js +2 -0
  4. package/ButtonGroup/ButtonGroupContext.js +2 -0
  5. package/CHANGELOG.md +69 -0
  6. package/Card/Card.d.ts +1 -1
  7. package/Dialog/Dialog.d.ts +85 -1
  8. package/Dialog/Dialog.js +91 -20
  9. package/Dialog/DialogContext.js +2 -0
  10. package/Drawer/Drawer.js +1 -1
  11. package/Drawer/drawerClasses.d.ts +32 -8
  12. package/Drawer/drawerClasses.js +1 -1
  13. package/FormControl/FormControl.js +9 -7
  14. package/FormControl/FormControlContext.js +2 -0
  15. package/Hidden/withWidth.js +2 -0
  16. package/IconButton/IconButton.d.ts +3 -2
  17. package/IconButton/IconButton.js +18 -7
  18. package/IconButton/iconButtonClasses.d.ts +2 -0
  19. package/IconButton/iconButtonClasses.js +1 -1
  20. package/OverridableComponent/index.d.ts +41 -0
  21. package/OverridableComponent/index.js +1 -0
  22. package/OverridableComponent/package.json +6 -0
  23. package/PaginationItem/PaginationItem.d.ts +1 -1
  24. package/RadioGroup/RadioGroupContext.js +2 -0
  25. package/Slider/useSlider.js +2 -2
  26. package/Step/StepContext.js +2 -0
  27. package/Stepper/StepperContext.js +2 -0
  28. package/Table/Tablelvl2Context.js +2 -0
  29. package/TextareaAutosize/TextareaAutosize.js +50 -40
  30. package/ToggleButtonGroup/ToggleButtonGroupButtonContext.js +2 -0
  31. package/ToggleButtonGroup/ToggleButtonGroupContext.js +2 -0
  32. package/index.js +1 -1
  33. package/modern/ButtonGroup/ButtonGroupButtonContext.js +2 -0
  34. package/modern/ButtonGroup/ButtonGroupContext.js +2 -0
  35. package/modern/Dialog/Dialog.js +91 -20
  36. package/modern/Dialog/DialogContext.js +2 -0
  37. package/modern/Drawer/Drawer.js +1 -1
  38. package/modern/Drawer/drawerClasses.js +1 -1
  39. package/modern/FormControl/FormControl.js +9 -7
  40. package/modern/FormControl/FormControlContext.js +2 -0
  41. package/modern/Hidden/withWidth.js +2 -0
  42. package/modern/IconButton/IconButton.js +18 -7
  43. package/modern/IconButton/iconButtonClasses.js +1 -1
  44. package/modern/OverridableComponent/index.js +1 -0
  45. package/modern/RadioGroup/RadioGroupContext.js +2 -0
  46. package/modern/Slider/useSlider.js +2 -2
  47. package/modern/Step/StepContext.js +2 -0
  48. package/modern/Stepper/StepperContext.js +2 -0
  49. package/modern/Table/Tablelvl2Context.js +2 -0
  50. package/modern/TextareaAutosize/TextareaAutosize.js +50 -40
  51. package/modern/ToggleButtonGroup/ToggleButtonGroupButtonContext.js +2 -0
  52. package/modern/ToggleButtonGroup/ToggleButtonGroupContext.js +2 -0
  53. package/modern/index.js +1 -1
  54. package/modern/styles/components.js +1 -0
  55. package/modern/styles/overrides.js +1 -0
  56. package/modern/styles/props.js +1 -0
  57. package/modern/styles/variants.js +1 -0
  58. package/modern/useAutocomplete/useAutocomplete.js +13 -10
  59. package/modern/version/index.js +2 -2
  60. package/node/ButtonGroup/ButtonGroupButtonContext.js +1 -0
  61. package/node/ButtonGroup/ButtonGroupContext.js +1 -0
  62. package/node/Dialog/Dialog.js +91 -20
  63. package/node/Dialog/DialogContext.js +1 -0
  64. package/node/Drawer/Drawer.js +1 -1
  65. package/node/Drawer/drawerClasses.js +1 -1
  66. package/node/FormControl/FormControl.js +9 -7
  67. package/node/FormControl/FormControlContext.js +1 -0
  68. package/node/Hidden/withWidth.js +1 -0
  69. package/node/IconButton/IconButton.js +18 -7
  70. package/node/IconButton/iconButtonClasses.js +1 -1
  71. package/node/OverridableComponent/index.js +5 -0
  72. package/node/RadioGroup/RadioGroupContext.js +1 -0
  73. package/node/Slider/useSlider.js +2 -2
  74. package/node/Step/StepContext.js +1 -0
  75. package/node/Stepper/StepperContext.js +1 -0
  76. package/node/Table/Tablelvl2Context.js +1 -0
  77. package/node/TextareaAutosize/TextareaAutosize.js +50 -40
  78. package/node/ToggleButtonGroup/ToggleButtonGroupButtonContext.js +1 -0
  79. package/node/ToggleButtonGroup/ToggleButtonGroupContext.js +1 -0
  80. package/node/index.js +1 -1
  81. package/node/styles/components.js +5 -0
  82. package/node/styles/overrides.js +5 -0
  83. package/node/styles/props.js +5 -0
  84. package/node/styles/variants.js +5 -0
  85. package/node/useAutocomplete/useAutocomplete.js +13 -10
  86. package/node/version/index.js +2 -2
  87. package/package.json +5 -5
  88. package/styles/components.d.ts +590 -591
  89. package/styles/components.js +1 -0
  90. package/styles/createThemeNoVars.d.ts +1 -1
  91. package/styles/overrides.d.ts +123 -142
  92. package/styles/overrides.js +1 -0
  93. package/styles/props.d.ts +120 -122
  94. package/styles/props.js +1 -0
  95. package/styles/variants.d.ts +7 -10
  96. package/styles/variants.js +1 -0
  97. package/useAutocomplete/useAutocomplete.js +13 -10
  98. package/version/index.js +2 -2
  99. package/OverridableComponent.d.ts +0 -67
@@ -0,0 +1,41 @@
1
+ import * as React from 'react';
2
+ import { DistributiveOmit } from '@mui/types';
3
+ import { StyledComponentProps } from '../styles';
4
+ /**
5
+ * A component whose root component can be controlled via a `component` prop.
6
+ *
7
+ * Adjusts valid props based on the type of `component`.
8
+ */
9
+ export interface OverridableComponent<TypeMap extends OverridableTypeMap> {
10
+ <RootComponent extends React.ElementType>(props: {
11
+ /**
12
+ * The component used for the root node.
13
+ * Either a string to use a HTML element or a component.
14
+ */
15
+ component: RootComponent;
16
+ } & OverrideProps<TypeMap, RootComponent>): React.JSX.Element | null;
17
+ (props: DefaultComponentProps<TypeMap>): React.JSX.Element | null;
18
+ }
19
+ /**
20
+ * Props of the component if `component={Component}` is used.
21
+ */
22
+ export type OverrideProps<TypeMap extends OverridableTypeMap, RootComponent extends React.ElementType> = (BaseProps<TypeMap> & DistributiveOmit<React.ComponentPropsWithRef<RootComponent>, keyof BaseProps<TypeMap>>);
23
+ /**
24
+ * Props if `component={Component}` is NOT used.
25
+ */
26
+ export type DefaultComponentProps<TypeMap extends OverridableTypeMap> = BaseProps<TypeMap> & DistributiveOmit<React.ComponentPropsWithRef<TypeMap['defaultComponent']>, keyof BaseProps<TypeMap>>;
27
+ /**
28
+ * Props defined on the component (+ common material-ui props).
29
+ */
30
+ export type BaseProps<TypeMap extends OverridableTypeMap> = TypeMap['props'] & CommonProps;
31
+ /**
32
+ * Props that are valid for material-ui components.
33
+ */
34
+ export interface CommonProps extends StyledComponentProps<never> {
35
+ className?: string;
36
+ style?: React.CSSProperties;
37
+ }
38
+ export interface OverridableTypeMap {
39
+ props: {};
40
+ defaultComponent: React.ElementType;
41
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ {
2
+ "sideEffects": false,
3
+ "module": "./index.js",
4
+ "main": "../node/OverridableComponent/index.js",
5
+ "types": "./index.d.ts"
6
+ }
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { OverridableStringUnion } from '@mui/types';
3
3
  import { SxProps } from '@mui/system';
4
- import { OverridableComponent, OverrideProps } from '@mui/material/OverridableComponent';
4
+ import { OverridableComponent, OverrideProps } from '../OverridableComponent';
5
5
  import { Theme } from '../styles';
6
6
  import { UsePaginationItem } from '../usePagination/usePagination';
7
7
  import { PaginationItemClasses } from './paginationItemClasses';
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+
1
3
  import * as React from 'react';
2
4
  /**
3
5
  * @ignore - internal component.
@@ -245,9 +245,9 @@ export function useSlider(parameters) {
245
245
  let newValue = valueInput;
246
246
  if (marks && step == null) {
247
247
  const maxMarksValue = marksValues[marksValues.length - 1];
248
- if (newValue > maxMarksValue) {
248
+ if (newValue >= maxMarksValue) {
249
249
  newValue = maxMarksValue;
250
- } else if (newValue < marksValues[0]) {
250
+ } else if (newValue <= marksValues[0]) {
251
251
  newValue = marksValues[0];
252
252
  } else {
253
253
  newValue = newValue < value ? marksValues[marksIndex - 1] : marksValues[marksIndex + 1];
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+
1
3
  import * as React from 'react';
2
4
  /**
3
5
  * Provides information about the current step in Stepper.
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+
1
3
  import * as React from 'react';
2
4
  /**
3
5
  * Provides information about the current step in Stepper.
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+
1
3
  import * as React from 'react';
2
4
 
3
5
  /**
@@ -22,8 +22,15 @@ const styles = {
22
22
  transform: 'translateZ(0)'
23
23
  }
24
24
  };
25
+ function isObjectEmpty(object) {
26
+ // eslint-disable-next-line
27
+ for (const _ in object) {
28
+ return false;
29
+ }
30
+ return true;
31
+ }
25
32
  function isEmpty(obj) {
26
- return obj === undefined || obj === null || Object.keys(obj).length === 0 || obj.outerHeightStyle === 0 && !obj.overflowing;
33
+ return isObjectEmpty(obj) || obj.outerHeightStyle === 0 && !obj.overflowing;
27
34
  }
28
35
 
29
36
  /**
@@ -48,14 +55,18 @@ const TextareaAutosize = /*#__PURE__*/React.forwardRef(function TextareaAutosize
48
55
  const {
49
56
  current: isControlled
50
57
  } = React.useRef(value != null);
51
- const inputRef = React.useRef(null);
52
- const handleRef = useForkRef(forwardedRef, inputRef);
58
+ const textareaRef = React.useRef(null);
59
+ const handleRef = useForkRef(forwardedRef, textareaRef);
53
60
  const heightRef = React.useRef(null);
54
- const shadowRef = React.useRef(null);
61
+ const hiddenTextareaRef = React.useRef(null);
55
62
  const calculateTextareaStyles = React.useCallback(() => {
56
- const input = inputRef.current;
57
- const containerWindow = ownerWindow(input);
58
- const computedStyle = containerWindow.getComputedStyle(input);
63
+ const textarea = textareaRef.current;
64
+ const hiddenTextarea = hiddenTextareaRef.current;
65
+ if (!textarea || !hiddenTextarea) {
66
+ return undefined;
67
+ }
68
+ const containerWindow = ownerWindow(textarea);
69
+ const computedStyle = containerWindow.getComputedStyle(textarea);
59
70
 
60
71
  // If input's width is shrunk and it's not visible, don't sync height.
61
72
  if (computedStyle.width === '0px') {
@@ -64,25 +75,24 @@ const TextareaAutosize = /*#__PURE__*/React.forwardRef(function TextareaAutosize
64
75
  overflowing: false
65
76
  };
66
77
  }
67
- const inputShallow = shadowRef.current;
68
- inputShallow.style.width = computedStyle.width;
69
- inputShallow.value = input.value || props.placeholder || 'x';
70
- if (inputShallow.value.slice(-1) === '\n') {
78
+ hiddenTextarea.style.width = computedStyle.width;
79
+ hiddenTextarea.value = textarea.value || props.placeholder || 'x';
80
+ if (hiddenTextarea.value.slice(-1) === '\n') {
71
81
  // Certain fonts which overflow the line height will cause the textarea
72
82
  // to report a different scrollHeight depending on whether the last line
73
83
  // is empty. Make it non-empty to avoid this issue.
74
- inputShallow.value += ' ';
84
+ hiddenTextarea.value += ' ';
75
85
  }
76
86
  const boxSizing = computedStyle.boxSizing;
77
87
  const padding = getStyleValue(computedStyle.paddingBottom) + getStyleValue(computedStyle.paddingTop);
78
88
  const border = getStyleValue(computedStyle.borderBottomWidth) + getStyleValue(computedStyle.borderTopWidth);
79
89
 
80
90
  // The height of the inner content
81
- const innerHeight = inputShallow.scrollHeight;
91
+ const innerHeight = hiddenTextarea.scrollHeight;
82
92
 
83
93
  // Measure height of a textarea with a single row
84
- inputShallow.value = 'x';
85
- const singleRowHeight = inputShallow.scrollHeight;
94
+ hiddenTextarea.value = 'x';
95
+ const singleRowHeight = hiddenTextarea.scrollHeight;
86
96
 
87
97
  // The height of the outer content
88
98
  let outerHeight = innerHeight;
@@ -103,45 +113,45 @@ const TextareaAutosize = /*#__PURE__*/React.forwardRef(function TextareaAutosize
103
113
  };
104
114
  }, [maxRows, minRows, props.placeholder]);
105
115
  const syncHeight = React.useCallback(() => {
116
+ const textarea = textareaRef.current;
106
117
  const textareaStyles = calculateTextareaStyles();
107
- if (isEmpty(textareaStyles)) {
118
+ if (!textarea || !textareaStyles || isEmpty(textareaStyles)) {
108
119
  return;
109
120
  }
110
121
  const outerHeightStyle = textareaStyles.outerHeightStyle;
111
- const input = inputRef.current;
112
122
  if (heightRef.current !== outerHeightStyle) {
113
123
  heightRef.current = outerHeightStyle;
114
- input.style.height = `${outerHeightStyle}px`;
124
+ textarea.style.height = `${outerHeightStyle}px`;
115
125
  }
116
- input.style.overflow = textareaStyles.overflowing ? 'hidden' : '';
126
+ textarea.style.overflow = textareaStyles.overflowing ? 'hidden' : '';
117
127
  }, [calculateTextareaStyles]);
128
+ const frameRef = React.useRef(-1);
118
129
  useEnhancedEffect(() => {
119
- const handleResize = () => {
120
- syncHeight();
121
- };
122
- // Workaround a "ResizeObserver loop completed with undelivered notifications" error
123
- // in test.
124
- // Note that we might need to use this logic in production per https://github.com/WICG/resize-observer/issues/38
125
- // Also see https://github.com/mui/mui-x/issues/8733
126
- let rAF;
127
- const rAFHandleResize = () => {
128
- cancelAnimationFrame(rAF);
129
- rAF = requestAnimationFrame(() => {
130
- handleResize();
131
- });
132
- };
133
- const debounceHandleResize = debounce(handleResize);
134
- const input = inputRef.current;
135
- const containerWindow = ownerWindow(input);
130
+ const debounceHandleResize = debounce(() => syncHeight());
131
+ const textarea = textareaRef?.current;
132
+ if (!textarea) {
133
+ return undefined;
134
+ }
135
+ const containerWindow = ownerWindow(textarea);
136
136
  containerWindow.addEventListener('resize', debounceHandleResize);
137
137
  let resizeObserver;
138
138
  if (typeof ResizeObserver !== 'undefined') {
139
- resizeObserver = new ResizeObserver(process.env.NODE_ENV === 'test' ? rAFHandleResize : handleResize);
140
- resizeObserver.observe(input);
139
+ resizeObserver = new ResizeObserver(() => {
140
+ // avoid "ResizeObserver loop completed with undelivered notifications" error
141
+ // by temporarily unobserving the textarea element while manipulating the height
142
+ // and reobserving one frame later
143
+ resizeObserver.unobserve(textarea);
144
+ cancelAnimationFrame(frameRef.current);
145
+ syncHeight();
146
+ frameRef.current = requestAnimationFrame(() => {
147
+ resizeObserver.observe(textarea);
148
+ });
149
+ });
150
+ resizeObserver.observe(textarea);
141
151
  }
142
152
  return () => {
143
153
  debounceHandleResize.clear();
144
- cancelAnimationFrame(rAF);
154
+ cancelAnimationFrame(frameRef.current);
145
155
  containerWindow.removeEventListener('resize', debounceHandleResize);
146
156
  if (resizeObserver) {
147
157
  resizeObserver.disconnect();
@@ -173,7 +183,7 @@ const TextareaAutosize = /*#__PURE__*/React.forwardRef(function TextareaAutosize
173
183
  "aria-hidden": true,
174
184
  className: props.className,
175
185
  readOnly: true,
176
- ref: shadowRef,
186
+ ref: hiddenTextareaRef,
177
187
  tabIndex: -1,
178
188
  style: {
179
189
  ...styles.shadow,
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+
1
3
  import * as React from 'react';
2
4
  /**
3
5
  * @ignore - internal component.
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+
1
3
  import * as React from 'react';
2
4
  /**
3
5
  * @ignore - internal component.
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/material v6.4.0
2
+ * @mui/material v6.4.2
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+
1
3
  import * as React from 'react';
2
4
  /**
3
5
  * @ignore - internal component.
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+
1
3
  import * as React from 'react';
2
4
  /**
3
5
  * @ignore - internal component.
@@ -15,6 +15,7 @@ import Backdrop from "../Backdrop/index.js";
15
15
  import { styled, useTheme } from "../zero-styled/index.js";
16
16
  import memoTheme from "../utils/memoTheme.js";
17
17
  import { useDefaultProps } from "../DefaultPropsProvider/index.js";
18
+ import useSlot from "../utils/useSlot.js";
18
19
  import { jsx as _jsx } from "react/jsx-runtime";
19
20
  const DialogBackdrop = styled(Backdrop, {
20
21
  name: 'MuiDialog',
@@ -218,6 +219,8 @@ const Dialog = /*#__PURE__*/React.forwardRef(function Dialog(inProps, ref) {
218
219
  PaperComponent = Paper,
219
220
  PaperProps = {},
220
221
  scroll = 'paper',
222
+ slots = {},
223
+ slotProps = {},
221
224
  TransitionComponent = Fade,
222
225
  transitionDuration = defaultTransitionDuration,
223
226
  TransitionProps,
@@ -261,46 +264,89 @@ const Dialog = /*#__PURE__*/React.forwardRef(function Dialog(inProps, ref) {
261
264
  titleId: ariaLabelledby
262
265
  };
263
266
  }, [ariaLabelledby]);
264
- return /*#__PURE__*/_jsx(DialogRoot, {
267
+ const backwardCompatibleSlots = {
268
+ transition: TransitionComponent,
269
+ ...slots
270
+ };
271
+ const backwardCompatibleSlotProps = {
272
+ transition: TransitionProps,
273
+ paper: PaperProps,
274
+ backdrop: BackdropProps,
275
+ ...slotProps
276
+ };
277
+ const externalForwardedProps = {
278
+ slots: backwardCompatibleSlots,
279
+ slotProps: backwardCompatibleSlotProps
280
+ };
281
+ const [RootSlot, rootSlotProps] = useSlot('root', {
282
+ elementType: DialogRoot,
283
+ shouldForwardComponentProp: true,
284
+ externalForwardedProps,
285
+ ownerState,
265
286
  className: clsx(classes.root, className),
287
+ ref
288
+ });
289
+ const [BackdropSlot, backdropSlotProps] = useSlot('backdrop', {
290
+ elementType: DialogBackdrop,
291
+ shouldForwardComponentProp: true,
292
+ externalForwardedProps,
293
+ ownerState
294
+ });
295
+ const [PaperSlot, paperSlotProps] = useSlot('paper', {
296
+ elementType: DialogPaper,
297
+ shouldForwardComponentProp: true,
298
+ externalForwardedProps,
299
+ ownerState,
300
+ className: clsx(classes.paper, PaperProps.className)
301
+ });
302
+ const [ContainerSlot, containerSlotProps] = useSlot('container', {
303
+ elementType: DialogContainer,
304
+ externalForwardedProps,
305
+ ownerState,
306
+ className: clsx(classes.container)
307
+ });
308
+ const [TransitionSlot, transitionSlotProps] = useSlot('transition', {
309
+ elementType: Fade,
310
+ externalForwardedProps,
311
+ ownerState,
312
+ additionalProps: {
313
+ appear: true,
314
+ in: open,
315
+ timeout: transitionDuration,
316
+ role: 'presentation'
317
+ }
318
+ });
319
+ return /*#__PURE__*/_jsx(RootSlot, {
266
320
  closeAfterTransition: true,
267
- components: {
268
- Backdrop: DialogBackdrop
321
+ slots: {
322
+ backdrop: BackdropSlot
269
323
  },
270
- componentsProps: {
324
+ slotProps: {
271
325
  backdrop: {
272
326
  transitionDuration,
273
327
  as: BackdropComponent,
274
- ...BackdropProps
328
+ ...backdropSlotProps
275
329
  }
276
330
  },
277
331
  disableEscapeKeyDown: disableEscapeKeyDown,
278
332
  onClose: onClose,
279
333
  open: open,
280
- ref: ref,
281
334
  onClick: handleBackdropClick,
282
- ownerState: ownerState,
335
+ ...rootSlotProps,
283
336
  ...other,
284
- children: /*#__PURE__*/_jsx(TransitionComponent, {
285
- appear: true,
286
- in: open,
287
- timeout: transitionDuration,
288
- role: "presentation",
289
- ...TransitionProps,
290
- children: /*#__PURE__*/_jsx(DialogContainer, {
291
- className: clsx(classes.container),
337
+ children: /*#__PURE__*/_jsx(TransitionSlot, {
338
+ ...transitionSlotProps,
339
+ children: /*#__PURE__*/_jsx(ContainerSlot, {
292
340
  onMouseDown: handleMouseDown,
293
- ownerState: ownerState,
294
- children: /*#__PURE__*/_jsx(DialogPaper, {
341
+ ...containerSlotProps,
342
+ children: /*#__PURE__*/_jsx(PaperSlot, {
295
343
  as: PaperComponent,
296
344
  elevation: 24,
297
345
  role: "dialog",
298
346
  "aria-describedby": ariaDescribedby,
299
347
  "aria-labelledby": ariaLabelledby,
300
348
  "aria-modal": ariaModal,
301
- ...PaperProps,
302
- className: clsx(classes.paper, PaperProps.className),
303
- ownerState: ownerState,
349
+ ...paperSlotProps,
304
350
  children: /*#__PURE__*/_jsx(DialogContext.Provider, {
305
351
  value: dialogContextValue,
306
352
  children: children
@@ -412,6 +458,7 @@ process.env.NODE_ENV !== "production" ? Dialog.propTypes /* remove-proptypes */
412
458
  /**
413
459
  * Props applied to the [`Paper`](https://mui.com/material-ui/api/paper/) element.
414
460
  * @default {}
461
+ * @deprecated Use `slotProps.paper` instead. This prop will be removed in v7. See [Migrating from deprecated APIs](/material-ui/migration/migrating-from-deprecated-apis/) for more details.
415
462
  */
416
463
  PaperProps: PropTypes.object,
417
464
  /**
@@ -419,6 +466,28 @@ process.env.NODE_ENV !== "production" ? Dialog.propTypes /* remove-proptypes */
419
466
  * @default 'paper'
420
467
  */
421
468
  scroll: PropTypes.oneOf(['body', 'paper']),
469
+ /**
470
+ * The props used for each slot inside.
471
+ * @default {}
472
+ */
473
+ slotProps: PropTypes.shape({
474
+ backdrop: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
475
+ container: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
476
+ paper: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
477
+ root: PropTypes.oneOfType([PropTypes.func, PropTypes.object]),
478
+ transition: PropTypes.oneOfType([PropTypes.func, PropTypes.object])
479
+ }),
480
+ /**
481
+ * The components used for each slot inside.
482
+ * @default {}
483
+ */
484
+ slots: PropTypes.shape({
485
+ backdrop: PropTypes.elementType,
486
+ container: PropTypes.elementType,
487
+ paper: PropTypes.elementType,
488
+ root: PropTypes.elementType,
489
+ transition: PropTypes.elementType
490
+ }),
422
491
  /**
423
492
  * The system prop that allows defining system overrides as well as additional CSS styles.
424
493
  */
@@ -427,6 +496,7 @@ process.env.NODE_ENV !== "production" ? Dialog.propTypes /* remove-proptypes */
427
496
  * The component used for the transition.
428
497
  * [Follow this guide](https://mui.com/material-ui/transitions/#transitioncomponent-prop) to learn more about the requirements for this component.
429
498
  * @default Fade
499
+ * @deprecated Use `slots.transition` instead. This prop will be removed in v7. See [Migrating from deprecated APIs](/material-ui/migration/migrating-from-deprecated-apis/) for more details.
430
500
  */
431
501
  TransitionComponent: PropTypes.elementType,
432
502
  /**
@@ -445,6 +515,7 @@ process.env.NODE_ENV !== "production" ? Dialog.propTypes /* remove-proptypes */
445
515
  /**
446
516
  * Props applied to the transition element.
447
517
  * By default, the element is based on this [`Transition`](https://reactcommunity.org/react-transition-group/transition/) component.
518
+ * @deprecated Use `slotProps.transition` instead. This prop will be removed in v7. See [Migrating from deprecated APIs](/material-ui/migration/migrating-from-deprecated-apis/) for more details.
448
519
  */
449
520
  TransitionProps: PropTypes.object
450
521
  } : void 0;
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+
1
3
  import * as React from 'react';
2
4
  const DialogContext = /*#__PURE__*/React.createContext({});
3
5
  if (process.env.NODE_ENV !== 'production') {
@@ -29,7 +29,7 @@ const useUtilityClasses = ownerState => {
29
29
  variant
30
30
  } = ownerState;
31
31
  const slots = {
32
- root: ['root'],
32
+ root: ['root', `anchor${capitalize(anchor)}`],
33
33
  docked: [(variant === 'permanent' || variant === 'persistent') && 'docked'],
34
34
  modal: ['modal'],
35
35
  paper: ['paper', `paperAnchor${capitalize(anchor)}`, variant !== 'temporary' && `paperAnchorDocked${capitalize(anchor)}`]
@@ -3,5 +3,5 @@ import generateUtilityClass from '@mui/utils/generateUtilityClass';
3
3
  export function getDrawerUtilityClass(slot) {
4
4
  return generateUtilityClass('MuiDrawer', slot);
5
5
  }
6
- const drawerClasses = generateUtilityClasses('MuiDrawer', ['root', 'docked', 'paper', 'paperAnchorLeft', 'paperAnchorRight', 'paperAnchorTop', 'paperAnchorBottom', 'paperAnchorDockedLeft', 'paperAnchorDockedRight', 'paperAnchorDockedTop', 'paperAnchorDockedBottom', 'modal']);
6
+ const drawerClasses = generateUtilityClasses('MuiDrawer', ['root', 'docked', 'paper', 'anchorLeft', 'anchorRight', 'anchorTop', 'anchorBottom', 'paperAnchorLeft', 'paperAnchorRight', 'paperAnchorTop', 'paperAnchorBottom', 'paperAnchorDockedLeft', 'paperAnchorDockedRight', 'paperAnchorDockedTop', 'paperAnchorDockedBottom', 'modal']);
7
7
  export default drawerClasses;
@@ -179,6 +179,12 @@ const FormControl = /*#__PURE__*/React.forwardRef(function FormControl(inProps,
179
179
  };
180
180
  };
181
181
  }
182
+ const onFilled = React.useCallback(() => {
183
+ setFilled(true);
184
+ }, []);
185
+ const onEmpty = React.useCallback(() => {
186
+ setFilled(false);
187
+ }, []);
182
188
  const childContext = React.useMemo(() => {
183
189
  return {
184
190
  adornedStart,
@@ -194,20 +200,16 @@ const FormControl = /*#__PURE__*/React.forwardRef(function FormControl(inProps,
194
200
  onBlur: () => {
195
201
  setFocused(false);
196
202
  },
197
- onEmpty: () => {
198
- setFilled(false);
199
- },
200
- onFilled: () => {
201
- setFilled(true);
202
- },
203
203
  onFocus: () => {
204
204
  setFocused(true);
205
205
  },
206
+ onEmpty,
207
+ onFilled,
206
208
  registerEffect,
207
209
  required,
208
210
  variant
209
211
  };
210
- }, [adornedStart, color, disabled, error, filled, focused, fullWidth, hiddenLabel, registerEffect, required, size, variant]);
212
+ }, [adornedStart, color, disabled, error, filled, focused, fullWidth, hiddenLabel, registerEffect, onEmpty, onFilled, required, size, variant]);
211
213
  return /*#__PURE__*/_jsx(FormControlContext.Provider, {
212
214
  value: childContext,
213
215
  children: /*#__PURE__*/_jsx(FormControlRoot, {
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+
1
3
  import * as React from 'react';
2
4
  /**
3
5
  * @ignore - internal component.
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+
1
3
  import * as React from 'react';
2
4
  import PropTypes from 'prop-types';
3
5
  import getDisplayName from '@mui/utils/getDisplayName';
@@ -27,7 +27,8 @@ const useUtilityClasses = ownerState => {
27
27
  } = ownerState;
28
28
  const slots = {
29
29
  root: ['root', loading && 'loading', disabled && 'disabled', color !== 'default' && `color${capitalize(color)}`, edge && `edge${capitalize(edge)}`, `size${capitalize(size)}`],
30
- loadingIndicator: ['loadingIndicator']
30
+ loadingIndicator: ['loadingIndicator'],
31
+ loadingWrapper: ['loadingWrapper']
31
32
  };
32
33
  return composeClasses(slots, getIconButtonUtilityClass, classes);
33
34
  };
@@ -188,7 +189,7 @@ const IconButton = /*#__PURE__*/React.forwardRef(function IconButton(inProps, re
188
189
  disableFocusRipple = false,
189
190
  size = 'medium',
190
191
  id: idProp,
191
- loading = false,
192
+ loading = null,
192
193
  loadingIndicator: loadingIndicatorProp,
193
194
  ...other
194
195
  } = props;
@@ -218,10 +219,19 @@ const IconButton = /*#__PURE__*/React.forwardRef(function IconButton(inProps, re
218
219
  ref: ref,
219
220
  ...other,
220
221
  ownerState: ownerState,
221
- children: [/*#__PURE__*/_jsx(IconButtonLoadingIndicator, {
222
- className: classes.loadingIndicator,
223
- ownerState: ownerState,
224
- children: loading && loadingIndicator
222
+ children: [typeof loading === 'boolean' &&
223
+ /*#__PURE__*/
224
+ // use plain HTML span to minimize the runtime overhead
225
+ _jsx("span", {
226
+ className: classes.loadingWrapper,
227
+ style: {
228
+ display: 'contents'
229
+ },
230
+ children: /*#__PURE__*/_jsx(IconButtonLoadingIndicator, {
231
+ className: classes.loadingIndicator,
232
+ ownerState: ownerState,
233
+ children: loading && loadingIndicator
234
+ })
225
235
  }), children]
226
236
  });
227
237
  });
@@ -287,7 +297,8 @@ process.env.NODE_ENV !== "production" ? IconButton.propTypes /* remove-proptypes
287
297
  id: PropTypes.string,
288
298
  /**
289
299
  * If `true`, the loading indicator is visible and the button is disabled.
290
- * @default false
300
+ * If `true | false`, the loading wrapper is always rendered before the children to prevent [Google Translation Crash](https://github.com/mui/material-ui/issues/27853).
301
+ * @default null
291
302
  */
292
303
  loading: PropTypes.bool,
293
304
  /**
@@ -3,5 +3,5 @@ import generateUtilityClass from '@mui/utils/generateUtilityClass';
3
3
  export function getIconButtonUtilityClass(slot) {
4
4
  return generateUtilityClass('MuiIconButton', slot);
5
5
  }
6
- const iconButtonClasses = generateUtilityClasses('MuiIconButton', ['root', 'disabled', 'colorInherit', 'colorPrimary', 'colorSecondary', 'colorError', 'colorInfo', 'colorSuccess', 'colorWarning', 'edgeStart', 'edgeEnd', 'sizeSmall', 'sizeMedium', 'sizeLarge', 'loading', 'loadingIndicator']);
6
+ const iconButtonClasses = generateUtilityClasses('MuiIconButton', ['root', 'disabled', 'colorInherit', 'colorPrimary', 'colorSecondary', 'colorError', 'colorInfo', 'colorSuccess', 'colorWarning', 'edgeStart', 'edgeEnd', 'sizeSmall', 'sizeMedium', 'sizeLarge', 'loading', 'loadingIndicator', 'loadingWrapper']);
7
7
  export default iconButtonClasses;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+
1
3
  import * as React from 'react';
2
4
  /**
3
5
  * @ignore - internal component.
@@ -245,9 +245,9 @@ export function useSlider(parameters) {
245
245
  let newValue = valueInput;
246
246
  if (marks && step == null) {
247
247
  const maxMarksValue = marksValues[marksValues.length - 1];
248
- if (newValue > maxMarksValue) {
248
+ if (newValue >= maxMarksValue) {
249
249
  newValue = maxMarksValue;
250
- } else if (newValue < marksValues[0]) {
250
+ } else if (newValue <= marksValues[0]) {
251
251
  newValue = marksValues[0];
252
252
  } else {
253
253
  newValue = newValue < value ? marksValues[marksIndex - 1] : marksValues[marksIndex + 1];
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+
1
3
  import * as React from 'react';
2
4
  /**
3
5
  * Provides information about the current step in Stepper.
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+
1
3
  import * as React from 'react';
2
4
  /**
3
5
  * Provides information about the current step in Stepper.
@@ -1,3 +1,5 @@
1
+ 'use client';
2
+
1
3
  import * as React from 'react';
2
4
 
3
5
  /**