@mui/material 7.3.7 → 7.3.8

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.
package/Alert/Alert.js CHANGED
@@ -237,7 +237,7 @@ const Alert = /*#__PURE__*/React.forwardRef(function Alert(inProps, ref) {
237
237
  ...rootSlotProps,
238
238
  children: [icon !== false ? /*#__PURE__*/(0, _jsxRuntime.jsx)(IconSlot, {
239
239
  ...iconSlotProps,
240
- children: icon || iconMapping[severity]
240
+ children: icon || iconMapping[severity] || defaultIconMapping[severity]
241
241
  }) : null, /*#__PURE__*/(0, _jsxRuntime.jsx)(MessageSlot, {
242
242
  ...messageSlotProps,
243
243
  children: children
package/AppBar/AppBar.js CHANGED
@@ -33,7 +33,7 @@ const useUtilityClasses = ownerState => {
33
33
 
34
34
  // var2 is the fallback.
35
35
  // Ex. var1: 'var(--a)', var2: 'var(--b)'; return: 'var(--a, var(--b))'
36
- const joinVars = (var1, var2) => var1 ? `${var1?.replace(')', '')}, ${var2})` : var2;
36
+ const joinVars = (var1, var2) => var1 ? `${var1.replace(')', '')}, ${var2})` : var2;
37
37
  const AppBarRoot = (0, _zeroStyled.styled)(_Paper.default, {
38
38
  name: 'MuiAppBar',
39
39
  slot: 'Root',
@@ -283,7 +283,7 @@ export interface AutocompleteProps<Value, Multiple extends boolean | undefined,
283
283
  * @returns {ReactNode}
284
284
  */
285
285
  renderOption?: (props: React.HTMLAttributes<HTMLLIElement> & {
286
- key: any;
286
+ key: React.Key;
287
287
  }, option: Value, state: AutocompleteRenderOptionState, ownerState: AutocompleteOwnerState<Value, Multiple, DisableClearable, FreeSolo, ChipComponent>) => React.ReactNode;
288
288
  /**
289
289
  * Render the selected value when doing multiple selections.
@@ -669,7 +669,7 @@ const Autocomplete = /*#__PURE__*/React.forwardRef(function Autocomplete(inProps
669
669
  children: renderInput({
670
670
  id,
671
671
  disabled,
672
- fullWidth: true,
672
+ fullWidth: props.fullWidth ?? true,
673
673
  size: size === 'small' ? 'small' : undefined,
674
674
  InputLabelProps: getInputLabelProps(),
675
675
  InputProps: {
package/Badge/Badge.js CHANGED
@@ -100,110 +100,6 @@ const BadgeBadge = (0, _zeroStyled.styled)('span', {
100
100
  minWidth: RADIUS_DOT * 2,
101
101
  padding: 0
102
102
  }
103
- }, {
104
- props: ({
105
- ownerState
106
- }) => ownerState.anchorOrigin.vertical === 'top' && ownerState.anchorOrigin.horizontal === 'right' && ownerState.overlap === 'rectangular',
107
- style: {
108
- top: 0,
109
- right: 0,
110
- transform: 'scale(1) translate(50%, -50%)',
111
- transformOrigin: '100% 0%',
112
- [`&.${_badgeClasses.default.invisible}`]: {
113
- transform: 'scale(0) translate(50%, -50%)'
114
- }
115
- }
116
- }, {
117
- props: ({
118
- ownerState
119
- }) => ownerState.anchorOrigin.vertical === 'bottom' && ownerState.anchorOrigin.horizontal === 'right' && ownerState.overlap === 'rectangular',
120
- style: {
121
- bottom: 0,
122
- right: 0,
123
- transform: 'scale(1) translate(50%, 50%)',
124
- transformOrigin: '100% 100%',
125
- [`&.${_badgeClasses.default.invisible}`]: {
126
- transform: 'scale(0) translate(50%, 50%)'
127
- }
128
- }
129
- }, {
130
- props: ({
131
- ownerState
132
- }) => ownerState.anchorOrigin.vertical === 'top' && ownerState.anchorOrigin.horizontal === 'left' && ownerState.overlap === 'rectangular',
133
- style: {
134
- top: 0,
135
- left: 0,
136
- transform: 'scale(1) translate(-50%, -50%)',
137
- transformOrigin: '0% 0%',
138
- [`&.${_badgeClasses.default.invisible}`]: {
139
- transform: 'scale(0) translate(-50%, -50%)'
140
- }
141
- }
142
- }, {
143
- props: ({
144
- ownerState
145
- }) => ownerState.anchorOrigin.vertical === 'bottom' && ownerState.anchorOrigin.horizontal === 'left' && ownerState.overlap === 'rectangular',
146
- style: {
147
- bottom: 0,
148
- left: 0,
149
- transform: 'scale(1) translate(-50%, 50%)',
150
- transformOrigin: '0% 100%',
151
- [`&.${_badgeClasses.default.invisible}`]: {
152
- transform: 'scale(0) translate(-50%, 50%)'
153
- }
154
- }
155
- }, {
156
- props: ({
157
- ownerState
158
- }) => ownerState.anchorOrigin.vertical === 'top' && ownerState.anchorOrigin.horizontal === 'right' && ownerState.overlap === 'circular',
159
- style: {
160
- top: '14%',
161
- right: '14%',
162
- transform: 'scale(1) translate(50%, -50%)',
163
- transformOrigin: '100% 0%',
164
- [`&.${_badgeClasses.default.invisible}`]: {
165
- transform: 'scale(0) translate(50%, -50%)'
166
- }
167
- }
168
- }, {
169
- props: ({
170
- ownerState
171
- }) => ownerState.anchorOrigin.vertical === 'bottom' && ownerState.anchorOrigin.horizontal === 'right' && ownerState.overlap === 'circular',
172
- style: {
173
- bottom: '14%',
174
- right: '14%',
175
- transform: 'scale(1) translate(50%, 50%)',
176
- transformOrigin: '100% 100%',
177
- [`&.${_badgeClasses.default.invisible}`]: {
178
- transform: 'scale(0) translate(50%, 50%)'
179
- }
180
- }
181
- }, {
182
- props: ({
183
- ownerState
184
- }) => ownerState.anchorOrigin.vertical === 'top' && ownerState.anchorOrigin.horizontal === 'left' && ownerState.overlap === 'circular',
185
- style: {
186
- top: '14%',
187
- left: '14%',
188
- transform: 'scale(1) translate(-50%, -50%)',
189
- transformOrigin: '0% 0%',
190
- [`&.${_badgeClasses.default.invisible}`]: {
191
- transform: 'scale(0) translate(-50%, -50%)'
192
- }
193
- }
194
- }, {
195
- props: ({
196
- ownerState
197
- }) => ownerState.anchorOrigin.vertical === 'bottom' && ownerState.anchorOrigin.horizontal === 'left' && ownerState.overlap === 'circular',
198
- style: {
199
- bottom: '14%',
200
- left: '14%',
201
- transform: 'scale(1) translate(-50%, 50%)',
202
- transformOrigin: '0% 100%',
203
- [`&.${_badgeClasses.default.invisible}`]: {
204
- transform: 'scale(0) translate(-50%, 50%)'
205
- }
206
- }
207
103
  }, {
208
104
  props: {
209
105
  invisible: true
@@ -214,6 +110,29 @@ const BadgeBadge = (0, _zeroStyled.styled)('span', {
214
110
  duration: theme.transitions.duration.leavingScreen
215
111
  })
216
112
  }
113
+ }, {
114
+ style: ({
115
+ ownerState
116
+ }) => {
117
+ const {
118
+ vertical,
119
+ horizontal
120
+ } = ownerState.anchorOrigin;
121
+ const offset = ownerState.overlap === 'circular' ? '14%' : 0;
122
+ return {
123
+ '--Badge-translateX': horizontal === 'right' ? '50%' : '-50%',
124
+ '--Badge-translateY': vertical === 'top' ? '-50%' : '50%',
125
+ top: vertical === 'top' ? offset : 'initial',
126
+ bottom: vertical === 'bottom' ? offset : 'initial',
127
+ right: horizontal === 'right' ? offset : 'initial',
128
+ left: horizontal === 'left' ? offset : 'initial',
129
+ transform: 'scale(1) translate(var(--Badge-translateX), var(--Badge-translateY))',
130
+ transformOrigin: `${horizontal === 'right' ? '100%' : '0%'} ${vertical === 'top' ? '0%' : '100%'}`,
131
+ [`&.${_badgeClasses.default.invisible}`]: {
132
+ transform: 'scale(0) translate(var(--Badge-translateX), var(--Badge-translateY))'
133
+ }
134
+ };
135
+ }
217
136
  }]
218
137
  })));
219
138
  function getAnchorOrigin(anchorOrigin) {
package/CHANGELOG.md CHANGED
@@ -1,5 +1,67 @@
1
1
  # [Versions](https://mui.com/versions/)
2
2
 
3
+ ## 7.3.8
4
+
5
+ <!-- generated comparing v7.3.7..master -->
6
+
7
+ _Feb 12, 2026_
8
+
9
+ A big thanks to the 15 contributors who made this release possible. Here are some highlights ✨:
10
+
11
+ ### `@mui/material@7.3.8`
12
+
13
+ - [alert] Revert removing default icon mapping fallback (#47629) @ZeeshanTamboli
14
+ - [app-bar] Fix optional chaining in joinVars function (#47739) @sai6855
15
+ - [autocomplete] Fix scroll position resetting on reopen with `disableCloseOnSelect` (#47248) @ZeeshanTamboli
16
+ - [autocomplete] Pass fullWidth prop to input, with default as true (#47663) @silviuaavram
17
+ - [badge] Refactor variant styles generation (#47742) @sai6855
18
+ - [chip] Remove unnecessary `onDelete` check (#47753) @ZeeshanTamboli
19
+ - [switch][checkbox][radio] Remove `aria-disabled` from root span (#46318) @KirankumarAmbati
20
+ - [collapse] Remove unnecessary string concatenation (#47745) @sai6855
21
+ - [drawer] `persistent` and `permanent` variant Drawers should not override the styles via theme using `modal` class (#47581) @ZeeshanTamboli
22
+ - [tabs] Add ability to extend Tabs variant (#47590) @aditya1906
23
+ - [useAutocomplete] Add aria-multiselectable to listbox props when multiple is true (#47632) @silviuaavram
24
+ - [useAutocomplete] Use `React.Key` instead of `any` for `key` prop (#47619) @sonixx02
25
+
26
+ #### Core
27
+
28
+ - Revert "[docs-infra] Add Cookie Banner and Analytics Provider (#47445)" (868d23e) @dav-is
29
+ - Revert "[docs-infra] Update Cookie Consent Dialog styling and content (#47718)" (ae29d03) @dav-is
30
+ - [api-docs-builder] Validate slots prop and Slots interface export consistency (#47623) @Janpot
31
+ - [code-infra] Remove `window.muiDocConfig` (#47737) @Janpot
32
+ - [code-infra] Fix flaky Select test on Webkit (#47728) @Janpot
33
+ - [code-infra] Remove usage of NODE_ENV=test (#47692) @Janpot
34
+ - [code-infra] Prepare eslint rule rename (#47702) @Janpot
35
+ - [code-infra] Next.js 15.5.11 (security update) (#47697) @Janpot
36
+ - [code-infra] Fix Tooltip tests flakyness (#47669) @Janpot
37
+ - [code-infra] Improve instructions for error messages (#47668) @Janpot
38
+ - [code-infra] Add initial agent instructions (#47655) @Janpot
39
+ - [code-infra] Update broken links checker (#47633) @Janpot
40
+ - [code-infra] Improve Tooltip leaveDelay test (#47624) @Janpot
41
+ - [code-infra] Fix internal broken links (#47607) @Janpot
42
+ - [docs-infra] Resolve a few 301s in our docs (#47746) @Janpot
43
+ - [docs-infra] Update Cookie Consent Dialog styling and content (#47718) @dav-is
44
+ - [docs-infra] Add Cookie Banner and Analytics Provider (#47445) @dav-is
45
+ - [docs-infra] Make sure /customers page has a h1 (#47615) @Janpot
46
+ - [docs-infra] Fix privacy link (#47614) @Janpot
47
+ - [docs-infra] Resolve a few 301s (#47579) @Janpot
48
+ - [internal] Remove unused sponsor files (#47741) @oliviertassinari
49
+ - [markdown] Fix some broken hash links (#47609) @Janpot
50
+ - [test] Cleanup Table tests TODOs (#47656) @Ocheretovich
51
+
52
+ ### Docs
53
+
54
+ - [website] unclickable banner in the pricing page (#47634) @aemartos
55
+ - [blog] Company Update: What we've been working on (and why) (#47626) @alelthomas
56
+ - [docs] Remove outdated notifications (#47743) @bernardobelchior
57
+ - [docs] Make Demo component product-agnostic (#47635) @Janpot
58
+ - [docs] Copyedit the Number Field doc (#47469) @mapache-salvaje
59
+ - [docs] Fix Roboto font not loading in iframe demos (#47660) @Janpot
60
+ - [docs] Replace Checkbox with Icons in Combobox examples (#47654) @silviuaavram
61
+ - [docs] Fix punctuation in TypeScript guide description (#47617) @nodirbekprogrammer
62
+
63
+ All contributors of this release in alphabetical order: @aditya1906, @aemartos, @alelthomas, @bernardobelchior, @dav-is, @Janpot, @KirankumarAmbati, @mapache-salvaje, @nodirbekprogrammer, @Ocheretovich, @oliviertassinari, @sai6855, @silviuaavram, @sonixx02, @ZeeshanTamboli
64
+
3
65
  ## 7.3.7
4
66
 
5
67
  <!-- generated comparing v7.3.6..master -->
package/Chip/Chip.js CHANGED
@@ -388,9 +388,7 @@ const Chip = /*#__PURE__*/React.forwardRef(function Chip(inProps, ref) {
388
388
  const handleDeleteIconClick = event => {
389
389
  // Stop the event from bubbling up to the `Chip`
390
390
  event.stopPropagation();
391
- if (onDelete) {
392
- onDelete(event);
393
- }
391
+ onDelete(event);
394
392
  };
395
393
  const handleKeyDown = event => {
396
394
  // Ignore events from children of `Chip`.
@@ -29,11 +29,11 @@ const useUtilityClasses = ownerState => {
29
29
  classes
30
30
  } = ownerState;
31
31
  const slots = {
32
- root: ['root', `${orientation}`],
32
+ root: ['root', orientation],
33
33
  entered: ['entered'],
34
34
  hidden: ['hidden'],
35
- wrapper: ['wrapper', `${orientation}`],
36
- wrapperInner: ['wrapperInner', `${orientation}`]
35
+ wrapper: ['wrapper', orientation],
36
+ wrapperInner: ['wrapperInner', orientation]
37
37
  };
38
38
  return (0, _composeClasses.default)(slots, _collapseClasses.getCollapseUtilityClass, classes);
39
39
  };
package/Drawer/Drawer.js CHANGED
@@ -31,7 +31,7 @@ const overridesResolver = (props, styles) => {
31
31
  const {
32
32
  ownerState
33
33
  } = props;
34
- return [styles.root, (ownerState.variant === 'permanent' || ownerState.variant === 'persistent') && styles.docked, styles.modal];
34
+ return [styles.root, (ownerState.variant === 'permanent' || ownerState.variant === 'persistent') && styles.docked, ownerState.variant === 'temporary' && styles.modal];
35
35
  };
36
36
  const useUtilityClasses = ownerState => {
37
37
  const {
@@ -38,7 +38,7 @@ var _gridLegacyClasses = _interopRequireWildcard(require("./gridLegacyClasses"))
38
38
  var _jsxRuntime = require("react/jsx-runtime");
39
39
  let warnedOnce = false;
40
40
  function warnAboutDeprecatedGridLegacy() {
41
- if (!warnedOnce && process.env.NODE_ENV === 'development') {
41
+ if (!warnedOnce && process.env.NODE_ENV !== 'production') {
42
42
  warnedOnce = true;
43
43
  console.warn('MUI: The GridLegacy component is deprecated. See https://mui.com/material-ui/migration/upgrade-to-grid-v2/ for migration instructions.\n');
44
44
  }
@@ -157,7 +157,7 @@ const Popover = /*#__PURE__*/React.forwardRef(function Popover(inProps, ref) {
157
157
  const anchorRect = anchorElement.getBoundingClientRect();
158
158
  if (process.env.NODE_ENV !== 'production') {
159
159
  const box = anchorElement.getBoundingClientRect();
160
- if (process.env.NODE_ENV !== 'test' && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
160
+ if (!globalThis.MUI_TEST_ENV && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
161
161
  console.warn(['MUI: The `anchorEl` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', "Make sure the element is present in the document or that it's not display none."].join('\n'));
162
162
  }
163
163
  }
@@ -408,7 +408,7 @@ process.env.NODE_ENV !== "production" ? Popover.propTypes /* remove-proptypes */
408
408
  const resolvedAnchorEl = resolveAnchorEl(props.anchorEl);
409
409
  if (resolvedAnchorEl && resolvedAnchorEl.nodeType === 1) {
410
410
  const box = resolvedAnchorEl.getBoundingClientRect();
411
- if (process.env.NODE_ENV !== 'test' && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
411
+ if (process.env.NODE_ENV !== 'production' && !globalThis.MUI_TEST_ENV && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
412
412
  return new Error(['MUI: The `anchorEl` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', "Make sure the element is present in the document or that it's not display none."].join('\n'));
413
413
  }
414
414
  } else {
@@ -112,7 +112,7 @@ const PopperTooltip = /*#__PURE__*/React.forwardRef(function PopperTooltip(props
112
112
  if (process.env.NODE_ENV !== 'production') {
113
113
  if (resolvedAnchorElement && isHTMLElement(resolvedAnchorElement) && resolvedAnchorElement.nodeType === 1) {
114
114
  const box = resolvedAnchorElement.getBoundingClientRect();
115
- if (process.env.NODE_ENV !== 'test' && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
115
+ if (!globalThis.MUI_TEST_ENV && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
116
116
  console.warn(['MUI: The `anchorEl` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', "Make sure the element is present in the document or that it's not display none."].join('\n'));
117
117
  }
118
118
  }
@@ -274,7 +274,7 @@ process.env.NODE_ENV !== "production" ? Popper.propTypes /* remove-proptypes */
274
274
  const resolvedAnchorEl = resolveAnchorEl(props.anchorEl);
275
275
  if (resolvedAnchorEl && isHTMLElement(resolvedAnchorEl) && resolvedAnchorEl.nodeType === 1) {
276
276
  const box = resolvedAnchorEl.getBoundingClientRect();
277
- if (process.env.NODE_ENV !== 'test' && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
277
+ if (process.env.NODE_ENV !== 'production' && !globalThis.MUI_TEST_ENV && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
278
278
  return new Error(['MUI: The `anchorEl` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', "Make sure the element is present in the document or that it's not display none."].join('\n'));
279
279
  }
280
280
  } else if (!resolvedAnchorEl || typeof resolvedAnchorEl.getBoundingClientRect !== 'function' || isVirtualElement(resolvedAnchorEl) && resolvedAnchorEl.contextElement != null && resolvedAnchorEl.contextElement.nodeType !== 1) {
package/Slide/Slide.js CHANGED
@@ -270,7 +270,7 @@ process.env.NODE_ENV !== "production" ? Slide.propTypes /* remove-proptypes */ =
270
270
  const resolvedContainer = resolveContainer(props.container);
271
271
  if (resolvedContainer && resolvedContainer.nodeType === 1) {
272
272
  const box = resolvedContainer.getBoundingClientRect();
273
- if (process.env.NODE_ENV !== 'test' && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
273
+ if (process.env.NODE_ENV !== 'production' && !globalThis.MUI_TEST_ENV && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
274
274
  return new Error(['MUI: The `container` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', "Make sure the element is present in the document or that it's not display none."].join('\n'));
275
275
  }
276
276
  } else if (!resolvedContainer || typeof resolvedContainer.getBoundingClientRect !== 'function' || resolvedContainer.contextElement != null && resolvedContainer.contextElement.nodeType !== 1) {
package/Tabs/Tabs.d.ts CHANGED
@@ -8,6 +8,7 @@ import { OverridableComponent, OverrideProps } from "../OverridableComponent/ind
8
8
  import { TabsClasses } from "./tabsClasses.js";
9
9
  import SvgIcon from "../SvgIcon/index.js";
10
10
  export interface TabsPropsIndicatorColorOverrides {}
11
+ export interface TabsPropsVariantOverrides {}
11
12
  export interface TabsRootSlotPropsOverrides {}
12
13
  export interface TabsScrollerSlotPropsOverrides {}
13
14
  export interface TabsListSlotPropsOverrides {}
@@ -234,7 +235,7 @@ export interface TabsOwnProps extends TabsSlotsAndSlotProps {
234
235
  * - `standard` will render the default state.
235
236
  * @default 'standard'
236
237
  */
237
- variant?: 'standard' | 'scrollable' | 'fullWidth';
238
+ variant?: OverridableStringUnion<'standard' | 'scrollable' | 'fullWidth', TabsPropsVariantOverrides>;
238
239
  /**
239
240
  * If `true`, the scrollbar is visible. It can be useful when displaying
240
241
  * a long vertical list of tabs.
package/Tabs/Tabs.js CHANGED
@@ -385,7 +385,7 @@ const Tabs = /*#__PURE__*/React.forwardRef(function Tabs(inProps, ref) {
385
385
  }
386
386
  tabMeta = tab ? tab.getBoundingClientRect() : null;
387
387
  if (process.env.NODE_ENV !== 'production') {
388
- if (process.env.NODE_ENV !== 'test' && !warnedOnceTabPresent && tabMeta && tabMeta.width === 0 && tabMeta.height === 0 &&
388
+ if (!globalThis.MUI_TEST_ENV && !warnedOnceTabPresent && tabMeta && tabMeta.width === 0 && tabMeta.height === 0 &&
389
389
  // if the whole Tabs component is hidden, don't warn
390
390
  tabsMeta.clientWidth !== 0) {
391
391
  tabsMeta = null;
@@ -230,7 +230,7 @@ const Alert = /*#__PURE__*/React.forwardRef(function Alert(inProps, ref) {
230
230
  ...rootSlotProps,
231
231
  children: [icon !== false ? /*#__PURE__*/_jsx(IconSlot, {
232
232
  ...iconSlotProps,
233
- children: icon || iconMapping[severity]
233
+ children: icon || iconMapping[severity] || defaultIconMapping[severity]
234
234
  }) : null, /*#__PURE__*/_jsx(MessageSlot, {
235
235
  ...messageSlotProps,
236
236
  children: children
@@ -26,7 +26,7 @@ const useUtilityClasses = ownerState => {
26
26
 
27
27
  // var2 is the fallback.
28
28
  // Ex. var1: 'var(--a)', var2: 'var(--b)'; return: 'var(--a, var(--b))'
29
- const joinVars = (var1, var2) => var1 ? `${var1?.replace(')', '')}, ${var2})` : var2;
29
+ const joinVars = (var1, var2) => var1 ? `${var1.replace(')', '')}, ${var2})` : var2;
30
30
  const AppBarRoot = styled(Paper, {
31
31
  name: 'MuiAppBar',
32
32
  slot: 'Root',
@@ -283,7 +283,7 @@ export interface AutocompleteProps<Value, Multiple extends boolean | undefined,
283
283
  * @returns {ReactNode}
284
284
  */
285
285
  renderOption?: (props: React.HTMLAttributes<HTMLLIElement> & {
286
- key: any;
286
+ key: React.Key;
287
287
  }, option: Value, state: AutocompleteRenderOptionState, ownerState: AutocompleteOwnerState<Value, Multiple, DisableClearable, FreeSolo, ChipComponent>) => React.ReactNode;
288
288
  /**
289
289
  * Render the selected value when doing multiple selections.
@@ -657,7 +657,7 @@ const Autocomplete = /*#__PURE__*/React.forwardRef(function Autocomplete(inProps
657
657
  children: renderInput({
658
658
  id,
659
659
  disabled,
660
- fullWidth: true,
660
+ fullWidth: props.fullWidth ?? true,
661
661
  size: size === 'small' ? 'small' : undefined,
662
662
  InputLabelProps: getInputLabelProps(),
663
663
  InputProps: {
@@ -93,110 +93,6 @@ const BadgeBadge = styled('span', {
93
93
  minWidth: RADIUS_DOT * 2,
94
94
  padding: 0
95
95
  }
96
- }, {
97
- props: ({
98
- ownerState
99
- }) => ownerState.anchorOrigin.vertical === 'top' && ownerState.anchorOrigin.horizontal === 'right' && ownerState.overlap === 'rectangular',
100
- style: {
101
- top: 0,
102
- right: 0,
103
- transform: 'scale(1) translate(50%, -50%)',
104
- transformOrigin: '100% 0%',
105
- [`&.${badgeClasses.invisible}`]: {
106
- transform: 'scale(0) translate(50%, -50%)'
107
- }
108
- }
109
- }, {
110
- props: ({
111
- ownerState
112
- }) => ownerState.anchorOrigin.vertical === 'bottom' && ownerState.anchorOrigin.horizontal === 'right' && ownerState.overlap === 'rectangular',
113
- style: {
114
- bottom: 0,
115
- right: 0,
116
- transform: 'scale(1) translate(50%, 50%)',
117
- transformOrigin: '100% 100%',
118
- [`&.${badgeClasses.invisible}`]: {
119
- transform: 'scale(0) translate(50%, 50%)'
120
- }
121
- }
122
- }, {
123
- props: ({
124
- ownerState
125
- }) => ownerState.anchorOrigin.vertical === 'top' && ownerState.anchorOrigin.horizontal === 'left' && ownerState.overlap === 'rectangular',
126
- style: {
127
- top: 0,
128
- left: 0,
129
- transform: 'scale(1) translate(-50%, -50%)',
130
- transformOrigin: '0% 0%',
131
- [`&.${badgeClasses.invisible}`]: {
132
- transform: 'scale(0) translate(-50%, -50%)'
133
- }
134
- }
135
- }, {
136
- props: ({
137
- ownerState
138
- }) => ownerState.anchorOrigin.vertical === 'bottom' && ownerState.anchorOrigin.horizontal === 'left' && ownerState.overlap === 'rectangular',
139
- style: {
140
- bottom: 0,
141
- left: 0,
142
- transform: 'scale(1) translate(-50%, 50%)',
143
- transformOrigin: '0% 100%',
144
- [`&.${badgeClasses.invisible}`]: {
145
- transform: 'scale(0) translate(-50%, 50%)'
146
- }
147
- }
148
- }, {
149
- props: ({
150
- ownerState
151
- }) => ownerState.anchorOrigin.vertical === 'top' && ownerState.anchorOrigin.horizontal === 'right' && ownerState.overlap === 'circular',
152
- style: {
153
- top: '14%',
154
- right: '14%',
155
- transform: 'scale(1) translate(50%, -50%)',
156
- transformOrigin: '100% 0%',
157
- [`&.${badgeClasses.invisible}`]: {
158
- transform: 'scale(0) translate(50%, -50%)'
159
- }
160
- }
161
- }, {
162
- props: ({
163
- ownerState
164
- }) => ownerState.anchorOrigin.vertical === 'bottom' && ownerState.anchorOrigin.horizontal === 'right' && ownerState.overlap === 'circular',
165
- style: {
166
- bottom: '14%',
167
- right: '14%',
168
- transform: 'scale(1) translate(50%, 50%)',
169
- transformOrigin: '100% 100%',
170
- [`&.${badgeClasses.invisible}`]: {
171
- transform: 'scale(0) translate(50%, 50%)'
172
- }
173
- }
174
- }, {
175
- props: ({
176
- ownerState
177
- }) => ownerState.anchorOrigin.vertical === 'top' && ownerState.anchorOrigin.horizontal === 'left' && ownerState.overlap === 'circular',
178
- style: {
179
- top: '14%',
180
- left: '14%',
181
- transform: 'scale(1) translate(-50%, -50%)',
182
- transformOrigin: '0% 0%',
183
- [`&.${badgeClasses.invisible}`]: {
184
- transform: 'scale(0) translate(-50%, -50%)'
185
- }
186
- }
187
- }, {
188
- props: ({
189
- ownerState
190
- }) => ownerState.anchorOrigin.vertical === 'bottom' && ownerState.anchorOrigin.horizontal === 'left' && ownerState.overlap === 'circular',
191
- style: {
192
- bottom: '14%',
193
- left: '14%',
194
- transform: 'scale(1) translate(-50%, 50%)',
195
- transformOrigin: '0% 100%',
196
- [`&.${badgeClasses.invisible}`]: {
197
- transform: 'scale(0) translate(-50%, 50%)'
198
- }
199
- }
200
96
  }, {
201
97
  props: {
202
98
  invisible: true
@@ -207,6 +103,29 @@ const BadgeBadge = styled('span', {
207
103
  duration: theme.transitions.duration.leavingScreen
208
104
  })
209
105
  }
106
+ }, {
107
+ style: ({
108
+ ownerState
109
+ }) => {
110
+ const {
111
+ vertical,
112
+ horizontal
113
+ } = ownerState.anchorOrigin;
114
+ const offset = ownerState.overlap === 'circular' ? '14%' : 0;
115
+ return {
116
+ '--Badge-translateX': horizontal === 'right' ? '50%' : '-50%',
117
+ '--Badge-translateY': vertical === 'top' ? '-50%' : '50%',
118
+ top: vertical === 'top' ? offset : 'initial',
119
+ bottom: vertical === 'bottom' ? offset : 'initial',
120
+ right: horizontal === 'right' ? offset : 'initial',
121
+ left: horizontal === 'left' ? offset : 'initial',
122
+ transform: 'scale(1) translate(var(--Badge-translateX), var(--Badge-translateY))',
123
+ transformOrigin: `${horizontal === 'right' ? '100%' : '0%'} ${vertical === 'top' ? '0%' : '100%'}`,
124
+ [`&.${badgeClasses.invisible}`]: {
125
+ transform: 'scale(0) translate(var(--Badge-translateX), var(--Badge-translateY))'
126
+ }
127
+ };
128
+ }
210
129
  }]
211
130
  })));
212
131
  function getAnchorOrigin(anchorOrigin) {
package/esm/Chip/Chip.js CHANGED
@@ -381,9 +381,7 @@ const Chip = /*#__PURE__*/React.forwardRef(function Chip(inProps, ref) {
381
381
  const handleDeleteIconClick = event => {
382
382
  // Stop the event from bubbling up to the `Chip`
383
383
  event.stopPropagation();
384
- if (onDelete) {
385
- onDelete(event);
386
- }
384
+ onDelete(event);
387
385
  };
388
386
  const handleKeyDown = event => {
389
387
  // Ignore events from children of `Chip`.
@@ -22,11 +22,11 @@ const useUtilityClasses = ownerState => {
22
22
  classes
23
23
  } = ownerState;
24
24
  const slots = {
25
- root: ['root', `${orientation}`],
25
+ root: ['root', orientation],
26
26
  entered: ['entered'],
27
27
  hidden: ['hidden'],
28
- wrapper: ['wrapper', `${orientation}`],
29
- wrapperInner: ['wrapperInner', `${orientation}`]
28
+ wrapper: ['wrapper', orientation],
29
+ wrapperInner: ['wrapperInner', orientation]
30
30
  };
31
31
  return composeClasses(slots, getCollapseUtilityClass, classes);
32
32
  };
@@ -22,7 +22,7 @@ const overridesResolver = (props, styles) => {
22
22
  const {
23
23
  ownerState
24
24
  } = props;
25
- return [styles.root, (ownerState.variant === 'permanent' || ownerState.variant === 'persistent') && styles.docked, styles.modal];
25
+ return [styles.root, (ownerState.variant === 'permanent' || ownerState.variant === 'persistent') && styles.docked, ownerState.variant === 'temporary' && styles.modal];
26
26
  };
27
27
  const useUtilityClasses = ownerState => {
28
28
  const {
@@ -25,7 +25,7 @@ import gridLegacyClasses, { getGridLegacyUtilityClass } from "./gridLegacyClasse
25
25
  import { jsx as _jsx } from "react/jsx-runtime";
26
26
  let warnedOnce = false;
27
27
  function warnAboutDeprecatedGridLegacy() {
28
- if (!warnedOnce && process.env.NODE_ENV === 'development') {
28
+ if (!warnedOnce && process.env.NODE_ENV !== 'production') {
29
29
  warnedOnce = true;
30
30
  console.warn('MUI: The GridLegacy component is deprecated. See https://mui.com/material-ui/migration/upgrade-to-grid-v2/ for migration instructions.\n');
31
31
  }
@@ -148,7 +148,7 @@ const Popover = /*#__PURE__*/React.forwardRef(function Popover(inProps, ref) {
148
148
  const anchorRect = anchorElement.getBoundingClientRect();
149
149
  if (process.env.NODE_ENV !== 'production') {
150
150
  const box = anchorElement.getBoundingClientRect();
151
- if (process.env.NODE_ENV !== 'test' && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
151
+ if (!globalThis.MUI_TEST_ENV && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
152
152
  console.warn(['MUI: The `anchorEl` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', "Make sure the element is present in the document or that it's not display none."].join('\n'));
153
153
  }
154
154
  }
@@ -399,7 +399,7 @@ process.env.NODE_ENV !== "production" ? Popover.propTypes /* remove-proptypes */
399
399
  const resolvedAnchorEl = resolveAnchorEl(props.anchorEl);
400
400
  if (resolvedAnchorEl && resolvedAnchorEl.nodeType === 1) {
401
401
  const box = resolvedAnchorEl.getBoundingClientRect();
402
- if (process.env.NODE_ENV !== 'test' && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
402
+ if (process.env.NODE_ENV !== 'production' && !globalThis.MUI_TEST_ENV && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
403
403
  return new Error(['MUI: The `anchorEl` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', "Make sure the element is present in the document or that it's not display none."].join('\n'));
404
404
  }
405
405
  } else {
@@ -105,7 +105,7 @@ const PopperTooltip = /*#__PURE__*/React.forwardRef(function PopperTooltip(props
105
105
  if (process.env.NODE_ENV !== 'production') {
106
106
  if (resolvedAnchorElement && isHTMLElement(resolvedAnchorElement) && resolvedAnchorElement.nodeType === 1) {
107
107
  const box = resolvedAnchorElement.getBoundingClientRect();
108
- if (process.env.NODE_ENV !== 'test' && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
108
+ if (!globalThis.MUI_TEST_ENV && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
109
109
  console.warn(['MUI: The `anchorEl` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', "Make sure the element is present in the document or that it's not display none."].join('\n'));
110
110
  }
111
111
  }
@@ -267,7 +267,7 @@ process.env.NODE_ENV !== "production" ? Popper.propTypes /* remove-proptypes */
267
267
  const resolvedAnchorEl = resolveAnchorEl(props.anchorEl);
268
268
  if (resolvedAnchorEl && isHTMLElement(resolvedAnchorEl) && resolvedAnchorEl.nodeType === 1) {
269
269
  const box = resolvedAnchorEl.getBoundingClientRect();
270
- if (process.env.NODE_ENV !== 'test' && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
270
+ if (process.env.NODE_ENV !== 'production' && !globalThis.MUI_TEST_ENV && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
271
271
  return new Error(['MUI: The `anchorEl` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', "Make sure the element is present in the document or that it's not display none."].join('\n'));
272
272
  }
273
273
  } else if (!resolvedAnchorEl || typeof resolvedAnchorEl.getBoundingClientRect !== 'function' || isVirtualElement(resolvedAnchorEl) && resolvedAnchorEl.contextElement != null && resolvedAnchorEl.contextElement.nodeType !== 1) {
@@ -263,7 +263,7 @@ process.env.NODE_ENV !== "production" ? Slide.propTypes /* remove-proptypes */ =
263
263
  const resolvedContainer = resolveContainer(props.container);
264
264
  if (resolvedContainer && resolvedContainer.nodeType === 1) {
265
265
  const box = resolvedContainer.getBoundingClientRect();
266
- if (process.env.NODE_ENV !== 'test' && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
266
+ if (process.env.NODE_ENV !== 'production' && !globalThis.MUI_TEST_ENV && box.top === 0 && box.left === 0 && box.right === 0 && box.bottom === 0) {
267
267
  return new Error(['MUI: The `container` prop provided to the component is invalid.', 'The anchor element should be part of the document layout.', "Make sure the element is present in the document or that it's not display none."].join('\n'));
268
268
  }
269
269
  } else if (!resolvedContainer || typeof resolvedContainer.getBoundingClientRect !== 'function' || resolvedContainer.contextElement != null && resolvedContainer.contextElement.nodeType !== 1) {
@@ -8,6 +8,7 @@ import { OverridableComponent, OverrideProps } from "../OverridableComponent/ind
8
8
  import { TabsClasses } from "./tabsClasses.js";
9
9
  import SvgIcon from "../SvgIcon/index.js";
10
10
  export interface TabsPropsIndicatorColorOverrides {}
11
+ export interface TabsPropsVariantOverrides {}
11
12
  export interface TabsRootSlotPropsOverrides {}
12
13
  export interface TabsScrollerSlotPropsOverrides {}
13
14
  export interface TabsListSlotPropsOverrides {}
@@ -234,7 +235,7 @@ export interface TabsOwnProps extends TabsSlotsAndSlotProps {
234
235
  * - `standard` will render the default state.
235
236
  * @default 'standard'
236
237
  */
237
- variant?: 'standard' | 'scrollable' | 'fullWidth';
238
+ variant?: OverridableStringUnion<'standard' | 'scrollable' | 'fullWidth', TabsPropsVariantOverrides>;
238
239
  /**
239
240
  * If `true`, the scrollbar is visible. It can be useful when displaying
240
241
  * a long vertical list of tabs.
package/esm/Tabs/Tabs.js CHANGED
@@ -378,7 +378,7 @@ const Tabs = /*#__PURE__*/React.forwardRef(function Tabs(inProps, ref) {
378
378
  }
379
379
  tabMeta = tab ? tab.getBoundingClientRect() : null;
380
380
  if (process.env.NODE_ENV !== 'production') {
381
- if (process.env.NODE_ENV !== 'test' && !warnedOnceTabPresent && tabMeta && tabMeta.width === 0 && tabMeta.height === 0 &&
381
+ if (!globalThis.MUI_TEST_ENV && !warnedOnceTabPresent && tabMeta && tabMeta.width === 0 && tabMeta.height === 0 &&
382
382
  // if the whole Tabs component is hidden, don't warn
383
383
  tabsMeta.clientWidth !== 0) {
384
384
  tabsMeta = null;
package/esm/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/material v7.3.7
2
+ * @mui/material v7.3.8
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -192,7 +192,6 @@ const SwitchBase = /*#__PURE__*/React.forwardRef(function SwitchBase(props, ref)
192
192
  additionalProps: {
193
193
  centerRipple: true,
194
194
  focusRipple: !disableFocusRipple,
195
- disabled,
196
195
  role: undefined,
197
196
  tabIndex: null
198
197
  }
@@ -362,7 +362,7 @@ export interface UseAutocompleteReturnValue<Value, Multiple extends boolean | un
362
362
  * @returns props that should be spread on the li element
363
363
  */
364
364
  getOptionProps: (renderedOption: UseAutocompleteRenderedOption<Value>) => React.HTMLAttributes<HTMLLIElement> & {
365
- key: any;
365
+ key: React.Key;
366
366
  };
367
367
  /**
368
368
  * Id for the Autocomplete.
@@ -486,10 +486,10 @@ function useAutocomplete(props) {
486
486
  }, [componentName]);
487
487
  }
488
488
  React.useEffect(() => {
489
- if (filteredOptionsChanged || popupOpen) {
489
+ if (filteredOptionsChanged || popupOpen && !disableCloseOnSelect) {
490
490
  syncHighlightedIndex();
491
491
  }
492
- }, [syncHighlightedIndex, filteredOptionsChanged, popupOpen]);
492
+ }, [syncHighlightedIndex, filteredOptionsChanged, popupOpen, disableCloseOnSelect]);
493
493
  const handleOpen = event => {
494
494
  if (open) {
495
495
  return;
@@ -1043,6 +1043,7 @@ function useAutocomplete(props) {
1043
1043
  role: 'listbox',
1044
1044
  id: `${id}-listbox`,
1045
1045
  'aria-labelledby': `${id}-label`,
1046
+ 'aria-multiselectable': multiple || undefined,
1046
1047
  ref: handleListboxRef,
1047
1048
  onMouseDown: event => {
1048
1049
  // Prevent blur
@@ -1,6 +1,6 @@
1
- export const version = "7.3.7";
1
+ export const version = "7.3.8";
2
2
  export const major = Number("7");
3
3
  export const minor = Number("3");
4
- export const patch = Number("7");
4
+ export const patch = Number("8");
5
5
  export const prerelease = undefined;
6
6
  export default version;
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/material v7.3.7
2
+ * @mui/material v7.3.8
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -199,7 +199,6 @@ const SwitchBase = /*#__PURE__*/React.forwardRef(function SwitchBase(props, ref)
199
199
  additionalProps: {
200
200
  centerRipple: true,
201
201
  focusRipple: !disableFocusRipple,
202
- disabled,
203
202
  role: undefined,
204
203
  tabIndex: null
205
204
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/material",
3
- "version": "7.3.7",
3
+ "version": "7.3.8",
4
4
  "author": "MUI Team",
5
5
  "description": "Material UI is an open-source React component library that implements Google's Material Design. It's comprehensive and can be used in production out of the box.",
6
6
  "keywords": [
@@ -25,7 +25,7 @@
25
25
  "url": "https://opencollective.com/mui-org"
26
26
  },
27
27
  "dependencies": {
28
- "@babel/runtime": "^7.28.4",
28
+ "@babel/runtime": "^7.28.6",
29
29
  "@popperjs/core": "^2.11.8",
30
30
  "@types/react-transition-group": "^4.4.12",
31
31
  "clsx": "^2.1.1",
@@ -33,10 +33,10 @@
33
33
  "prop-types": "^15.8.1",
34
34
  "react-is": "^19.2.3",
35
35
  "react-transition-group": "^4.4.5",
36
- "@mui/core-downloads-tracker": "^7.3.7",
37
- "@mui/system": "^7.3.7",
38
- "@mui/utils": "^7.3.7",
39
- "@mui/types": "^7.4.10"
36
+ "@mui/core-downloads-tracker": "^7.3.8",
37
+ "@mui/system": "^7.3.8",
38
+ "@mui/types": "^7.4.11",
39
+ "@mui/utils": "^7.3.8"
40
40
  },
41
41
  "peerDependencies": {
42
42
  "@emotion/react": "^11.5.0",
@@ -44,7 +44,7 @@
44
44
  "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
45
45
  "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
46
46
  "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0",
47
- "@mui/material-pigment-css": "^7.3.7"
47
+ "@mui/material-pigment-css": "^7.3.8"
48
48
  },
49
49
  "peerDependenciesMeta": {
50
50
  "@types/react": {
@@ -362,7 +362,7 @@ export interface UseAutocompleteReturnValue<Value, Multiple extends boolean | un
362
362
  * @returns props that should be spread on the li element
363
363
  */
364
364
  getOptionProps: (renderedOption: UseAutocompleteRenderedOption<Value>) => React.HTMLAttributes<HTMLLIElement> & {
365
- key: any;
365
+ key: React.Key;
366
366
  };
367
367
  /**
368
368
  * Id for the Autocomplete.
@@ -494,10 +494,10 @@ function useAutocomplete(props) {
494
494
  }, [componentName]);
495
495
  }
496
496
  React.useEffect(() => {
497
- if (filteredOptionsChanged || popupOpen) {
497
+ if (filteredOptionsChanged || popupOpen && !disableCloseOnSelect) {
498
498
  syncHighlightedIndex();
499
499
  }
500
- }, [syncHighlightedIndex, filteredOptionsChanged, popupOpen]);
500
+ }, [syncHighlightedIndex, filteredOptionsChanged, popupOpen, disableCloseOnSelect]);
501
501
  const handleOpen = event => {
502
502
  if (open) {
503
503
  return;
@@ -1051,6 +1051,7 @@ function useAutocomplete(props) {
1051
1051
  role: 'listbox',
1052
1052
  id: `${id}-listbox`,
1053
1053
  'aria-labelledby': `${id}-label`,
1054
+ 'aria-multiselectable': multiple || undefined,
1054
1055
  ref: handleListboxRef,
1055
1056
  onMouseDown: event => {
1056
1057
  // Prevent blur
package/version/index.js CHANGED
@@ -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 = "7.3.7";
7
+ const version = exports.version = "7.3.8";
8
8
  const major = exports.major = Number("7");
9
9
  const minor = exports.minor = Number("3");
10
- const patch = exports.patch = Number("7");
10
+ const patch = exports.patch = Number("8");
11
11
  const prerelease = exports.prerelease = undefined;
12
12
  var _default = exports.default = version;