@mui/material 7.1.2 → 7.3.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 (110) hide show
  1. package/Accordion/Accordion.d.ts +11 -0
  2. package/Accordion/Accordion.js +19 -5
  3. package/Alert/Alert.js +2 -3
  4. package/Autocomplete/Autocomplete.js +4 -4
  5. package/Backdrop/Backdrop.js +1 -0
  6. package/Breadcrumbs/BreadcrumbCollapsed.js +3 -1
  7. package/Button/Button.js +5 -6
  8. package/ButtonGroup/ButtonGroup.js +3 -4
  9. package/CHANGELOG.md +141 -0
  10. package/Checkbox/Checkbox.js +2 -3
  11. package/Chip/Chip.js +11 -11
  12. package/Divider/Divider.js +1 -2
  13. package/FilledInput/FilledInput.js +1 -1
  14. package/IconButton/IconButton.js +2 -3
  15. package/Input/Input.js +1 -1
  16. package/Input/inputClasses.d.ts +12 -4
  17. package/LinearProgress/LinearProgress.js +1 -2
  18. package/Link/Link.js +11 -4
  19. package/Link/getTextDecoration.js +5 -0
  20. package/ListItemButton/ListItemButton.js +4 -5
  21. package/MenuItem/MenuItem.js +4 -5
  22. package/NativeSelect/NativeSelectInput.js +6 -2
  23. package/OutlinedInput/NotchedOutline.js +2 -0
  24. package/OutlinedInput/OutlinedInput.js +2 -2
  25. package/OutlinedInput/outlinedInputClasses.d.ts +12 -4
  26. package/PaginationItem/PaginationItem.js +7 -8
  27. package/Radio/Radio.js +2 -3
  28. package/Radio/RadioButtonIcon.js +7 -2
  29. package/Select/SelectInput.js +69 -20
  30. package/Skeleton/Skeleton.js +1 -1
  31. package/Slider/Slider.js +6 -15
  32. package/Snackbar/Snackbar.js +2 -8
  33. package/SpeedDial/SpeedDial.js +20 -6
  34. package/SwipeableDrawer/SwipeArea.js +1 -0
  35. package/Switch/Switch.js +6 -4
  36. package/TableCell/TableCell.js +1 -2
  37. package/TableRow/TableRow.js +2 -3
  38. package/ToggleButton/ToggleButton.js +7 -8
  39. package/Tooltip/Tooltip.js +2 -3
  40. package/esm/Accordion/Accordion.d.ts +11 -0
  41. package/esm/Accordion/Accordion.js +19 -5
  42. package/esm/Alert/Alert.js +2 -3
  43. package/esm/Autocomplete/Autocomplete.js +4 -4
  44. package/esm/Backdrop/Backdrop.js +1 -0
  45. package/esm/Breadcrumbs/BreadcrumbCollapsed.js +3 -1
  46. package/esm/Button/Button.js +5 -6
  47. package/esm/ButtonGroup/ButtonGroup.js +3 -4
  48. package/esm/Checkbox/Checkbox.js +2 -3
  49. package/esm/Chip/Chip.js +11 -11
  50. package/esm/Divider/Divider.js +1 -2
  51. package/esm/FilledInput/FilledInput.js +1 -1
  52. package/esm/IconButton/IconButton.js +2 -3
  53. package/esm/Input/Input.js +1 -1
  54. package/esm/Input/inputClasses.d.ts +12 -4
  55. package/esm/LinearProgress/LinearProgress.js +1 -2
  56. package/esm/Link/Link.js +11 -4
  57. package/esm/Link/getTextDecoration.js +5 -0
  58. package/esm/ListItemButton/ListItemButton.js +4 -5
  59. package/esm/MenuItem/MenuItem.js +4 -5
  60. package/esm/NativeSelect/NativeSelectInput.js +6 -2
  61. package/esm/OutlinedInput/NotchedOutline.js +2 -0
  62. package/esm/OutlinedInput/OutlinedInput.js +2 -2
  63. package/esm/OutlinedInput/outlinedInputClasses.d.ts +12 -4
  64. package/esm/PaginationItem/PaginationItem.js +7 -8
  65. package/esm/Radio/Radio.js +2 -3
  66. package/esm/Radio/RadioButtonIcon.js +7 -2
  67. package/esm/Select/SelectInput.js +69 -20
  68. package/esm/Skeleton/Skeleton.js +2 -2
  69. package/esm/Slider/Slider.js +6 -15
  70. package/esm/Snackbar/Snackbar.js +2 -8
  71. package/esm/SpeedDial/SpeedDial.js +20 -6
  72. package/esm/SwipeableDrawer/SwipeArea.js +1 -0
  73. package/esm/Switch/Switch.js +6 -4
  74. package/esm/TableCell/TableCell.js +1 -2
  75. package/esm/TableRow/TableRow.js +2 -3
  76. package/esm/ToggleButton/ToggleButton.js +7 -8
  77. package/esm/Tooltip/Tooltip.js +2 -3
  78. package/esm/index.js +1 -1
  79. package/esm/internal/SwitchBase.js +4 -1
  80. package/esm/locale/index.js +6 -3
  81. package/esm/styles/components.d.ts +5 -0
  82. package/esm/styles/createColorScheme.d.ts +3 -1
  83. package/esm/styles/createColorScheme.js +6 -1
  84. package/esm/styles/createPalette.js +29 -2
  85. package/esm/styles/createTheme.d.ts +1 -1
  86. package/esm/styles/createThemeNoVars.d.ts +4 -0
  87. package/esm/styles/createThemeNoVars.js +59 -1
  88. package/esm/styles/createThemeWithVars.d.ts +4 -0
  89. package/esm/styles/createThemeWithVars.js +98 -69
  90. package/esm/styles/shouldSkipGeneratingVar.js +1 -1
  91. package/esm/useAutocomplete/useAutocomplete.d.ts +1 -0
  92. package/esm/useAutocomplete/useAutocomplete.js +21 -3
  93. package/esm/version/index.js +3 -3
  94. package/index.js +1 -1
  95. package/internal/SwitchBase.js +4 -1
  96. package/locale/index.js +6 -3
  97. package/package.json +9 -11
  98. package/styles/components.d.ts +5 -0
  99. package/styles/createColorScheme.d.ts +3 -1
  100. package/styles/createColorScheme.js +6 -1
  101. package/styles/createPalette.js +30 -2
  102. package/styles/createTheme.d.ts +1 -1
  103. package/styles/createThemeNoVars.d.ts +4 -0
  104. package/styles/createThemeNoVars.js +59 -1
  105. package/styles/createThemeWithVars.d.ts +4 -0
  106. package/styles/createThemeWithVars.js +98 -69
  107. package/styles/shouldSkipGeneratingVar.js +1 -1
  108. package/useAutocomplete/useAutocomplete.d.ts +1 -0
  109. package/useAutocomplete/useAutocomplete.js +22 -3
  110. package/version/index.js +3 -3
@@ -10,6 +10,7 @@ import createColorScheme, { getOpacity, getOverlays } from "./createColorScheme.
10
10
  import defaultShouldSkipGeneratingVar from "./shouldSkipGeneratingVar.js";
11
11
  import defaultGetSelector from "./createGetSelector.js";
12
12
  import { stringifyTheme } from "./stringifyTheme.js";
13
+ import { light, dark } from "./createPalette.js";
13
14
  function assignNode(obj, keys) {
14
15
  keys.forEach(k => {
15
16
  if (!obj[k]) {
@@ -53,7 +54,7 @@ const silent = fn => {
53
54
  return undefined;
54
55
  };
55
56
  export const createGetCssVar = (cssVarPrefix = 'mui') => systemCreateGetCssVar(cssVarPrefix);
56
- function attachColorScheme(colorSchemes, scheme, restTheme, colorScheme) {
57
+ function attachColorScheme(colorSpace, colorSchemes, scheme, restTheme, colorScheme) {
57
58
  if (!scheme) {
58
59
  return undefined;
59
60
  }
@@ -65,7 +66,8 @@ function attachColorScheme(colorSchemes, scheme, restTheme, colorScheme) {
65
66
  palette: {
66
67
  mode,
67
68
  ...scheme?.palette
68
- }
69
+ },
70
+ colorSpace
69
71
  });
70
72
  return undefined;
71
73
  }
@@ -77,7 +79,8 @@ function attachColorScheme(colorSchemes, scheme, restTheme, colorScheme) {
77
79
  palette: {
78
80
  mode,
79
81
  ...scheme?.palette
80
- }
82
+ },
83
+ colorSpace
81
84
  });
82
85
  colorSchemes[colorScheme] = {
83
86
  ...scheme,
@@ -107,6 +110,7 @@ export default function createThemeWithVars(options = {}, ...args) {
107
110
  defaultColorScheme: defaultColorSchemeInput,
108
111
  disableCssColorScheme = false,
109
112
  cssVarPrefix = 'mui',
113
+ nativeColor = false,
110
114
  shouldSkipGeneratingVar = defaultShouldSkipGeneratingVar,
111
115
  colorSchemeSelector: selector = colorSchemesInput.light && colorSchemesInput.dark ? 'media' : undefined,
112
116
  rootSelector = ':root',
@@ -134,13 +138,19 @@ export default function createThemeWithVars(options = {}, ...args) {
134
138
  throw new Error(process.env.NODE_ENV !== "production" ? `MUI: The \`colorSchemes.${defaultColorScheme}\` option is either missing or invalid.` : _formatErrorMessage(21, defaultColorScheme));
135
139
  }
136
140
 
141
+ // The reason to use `oklch` is that it is the most perceptually uniform color space and widely supported.
142
+ let colorSpace;
143
+ if (nativeColor) {
144
+ colorSpace = 'oklch';
145
+ }
146
+
137
147
  // Create the palette for the default color scheme, either `light`, `dark`, or custom color scheme.
138
- const muiTheme = attachColorScheme(colorSchemes, defaultScheme, input, defaultColorScheme);
148
+ const muiTheme = attachColorScheme(colorSpace, colorSchemes, defaultScheme, input, defaultColorScheme);
139
149
  if (builtInLight && !colorSchemes.light) {
140
- attachColorScheme(colorSchemes, builtInLight, undefined, 'light');
150
+ attachColorScheme(colorSpace, colorSchemes, builtInLight, undefined, 'light');
141
151
  }
142
152
  if (builtInDark && !colorSchemes.dark) {
143
- attachColorScheme(colorSchemes, builtInDark, undefined, 'dark');
153
+ attachColorScheme(colorSpace, colorSchemes, builtInDark, undefined, 'dark');
144
154
  }
145
155
  let theme = {
146
156
  defaultColorScheme,
@@ -174,14 +184,30 @@ export default function createThemeWithVars(options = {}, ...args) {
174
184
  setColor(palette.common, 'background', '#000');
175
185
  setColor(palette.common, 'onBackground', '#fff');
176
186
  }
187
+ function colorMix(method, color, coefficient) {
188
+ if (colorSpace) {
189
+ let mixer;
190
+ if (method === safeAlpha) {
191
+ mixer = `transparent ${((1 - coefficient) * 100).toFixed(0)}%`;
192
+ }
193
+ if (method === safeDarken) {
194
+ mixer = `#000 ${(coefficient * 100).toFixed(0)}%`;
195
+ }
196
+ if (method === safeLighten) {
197
+ mixer = `#fff ${(coefficient * 100).toFixed(0)}%`;
198
+ }
199
+ return `color-mix(in ${colorSpace}, ${color}, ${mixer})`;
200
+ }
201
+ return method(color, coefficient);
202
+ }
177
203
 
178
204
  // assign component variables
179
205
  assignNode(palette, ['Alert', 'AppBar', 'Avatar', 'Button', 'Chip', 'FilledInput', 'LinearProgress', 'Skeleton', 'Slider', 'SnackbarContent', 'SpeedDialAction', 'StepConnector', 'StepContent', 'Switch', 'TableCell', 'Tooltip']);
180
206
  if (palette.mode === 'light') {
181
- setColor(palette.Alert, 'errorColor', safeDarken(palette.error.light, 0.6));
182
- setColor(palette.Alert, 'infoColor', safeDarken(palette.info.light, 0.6));
183
- setColor(palette.Alert, 'successColor', safeDarken(palette.success.light, 0.6));
184
- setColor(palette.Alert, 'warningColor', safeDarken(palette.warning.light, 0.6));
207
+ setColor(palette.Alert, 'errorColor', colorMix(safeDarken, palette.error.light, 0.6));
208
+ setColor(palette.Alert, 'infoColor', colorMix(safeDarken, palette.info.light, 0.6));
209
+ setColor(palette.Alert, 'successColor', colorMix(safeDarken, palette.success.light, 0.6));
210
+ setColor(palette.Alert, 'warningColor', colorMix(safeDarken, palette.warning.light, 0.6));
185
211
  setColor(palette.Alert, 'errorFilledBg', setCssVarColor('palette-error-main'));
186
212
  setColor(palette.Alert, 'infoFilledBg', setCssVarColor('palette-info-main'));
187
213
  setColor(palette.Alert, 'successFilledBg', setCssVarColor('palette-success-main'));
@@ -190,10 +216,10 @@ export default function createThemeWithVars(options = {}, ...args) {
190
216
  setColor(palette.Alert, 'infoFilledColor', silent(() => palette.getContrastText(palette.info.main)));
191
217
  setColor(palette.Alert, 'successFilledColor', silent(() => palette.getContrastText(palette.success.main)));
192
218
  setColor(palette.Alert, 'warningFilledColor', silent(() => palette.getContrastText(palette.warning.main)));
193
- setColor(palette.Alert, 'errorStandardBg', safeLighten(palette.error.light, 0.9));
194
- setColor(palette.Alert, 'infoStandardBg', safeLighten(palette.info.light, 0.9));
195
- setColor(palette.Alert, 'successStandardBg', safeLighten(palette.success.light, 0.9));
196
- setColor(palette.Alert, 'warningStandardBg', safeLighten(palette.warning.light, 0.9));
219
+ setColor(palette.Alert, 'errorStandardBg', colorMix(safeLighten, palette.error.light, 0.9));
220
+ setColor(palette.Alert, 'infoStandardBg', colorMix(safeLighten, palette.info.light, 0.9));
221
+ setColor(palette.Alert, 'successStandardBg', colorMix(safeLighten, palette.success.light, 0.9));
222
+ setColor(palette.Alert, 'warningStandardBg', colorMix(safeLighten, palette.warning.light, 0.9));
197
223
  setColor(palette.Alert, 'errorIconColor', setCssVarColor('palette-error-main'));
198
224
  setColor(palette.Alert, 'infoIconColor', setCssVarColor('palette-info-main'));
199
225
  setColor(palette.Alert, 'successIconColor', setCssVarColor('palette-success-main'));
@@ -208,41 +234,42 @@ export default function createThemeWithVars(options = {}, ...args) {
208
234
  setColor(palette.FilledInput, 'bg', 'rgba(0, 0, 0, 0.06)');
209
235
  setColor(palette.FilledInput, 'hoverBg', 'rgba(0, 0, 0, 0.09)');
210
236
  setColor(palette.FilledInput, 'disabledBg', 'rgba(0, 0, 0, 0.12)');
211
- setColor(palette.LinearProgress, 'primaryBg', safeLighten(palette.primary.main, 0.62));
212
- setColor(palette.LinearProgress, 'secondaryBg', safeLighten(palette.secondary.main, 0.62));
213
- setColor(palette.LinearProgress, 'errorBg', safeLighten(palette.error.main, 0.62));
214
- setColor(palette.LinearProgress, 'infoBg', safeLighten(palette.info.main, 0.62));
215
- setColor(palette.LinearProgress, 'successBg', safeLighten(palette.success.main, 0.62));
216
- setColor(palette.LinearProgress, 'warningBg', safeLighten(palette.warning.main, 0.62));
217
- setColor(palette.Skeleton, 'bg', `rgba(${setCssVarColor('palette-text-primaryChannel')} / 0.11)`);
218
- setColor(palette.Slider, 'primaryTrack', safeLighten(palette.primary.main, 0.62));
219
- setColor(palette.Slider, 'secondaryTrack', safeLighten(palette.secondary.main, 0.62));
220
- setColor(palette.Slider, 'errorTrack', safeLighten(palette.error.main, 0.62));
221
- setColor(palette.Slider, 'infoTrack', safeLighten(palette.info.main, 0.62));
222
- setColor(palette.Slider, 'successTrack', safeLighten(palette.success.main, 0.62));
223
- setColor(palette.Slider, 'warningTrack', safeLighten(palette.warning.main, 0.62));
224
- const snackbarContentBackground = safeEmphasize(palette.background.default, 0.8);
237
+ setColor(palette.LinearProgress, 'primaryBg', colorMix(safeLighten, palette.primary.main, 0.62));
238
+ setColor(palette.LinearProgress, 'secondaryBg', colorMix(safeLighten, palette.secondary.main, 0.62));
239
+ setColor(palette.LinearProgress, 'errorBg', colorMix(safeLighten, palette.error.main, 0.62));
240
+ setColor(palette.LinearProgress, 'infoBg', colorMix(safeLighten, palette.info.main, 0.62));
241
+ setColor(palette.LinearProgress, 'successBg', colorMix(safeLighten, palette.success.main, 0.62));
242
+ setColor(palette.LinearProgress, 'warningBg', colorMix(safeLighten, palette.warning.main, 0.62));
243
+ setColor(palette.Skeleton, 'bg', colorSpace ? colorMix(safeAlpha, palette.text.primary, 0.11) : `rgba(${setCssVarColor('palette-text-primaryChannel')} / 0.11)`);
244
+ setColor(palette.Slider, 'primaryTrack', colorMix(safeLighten, palette.primary.main, 0.62));
245
+ setColor(palette.Slider, 'secondaryTrack', colorMix(safeLighten, palette.secondary.main, 0.62));
246
+ setColor(palette.Slider, 'errorTrack', colorMix(safeLighten, palette.error.main, 0.62));
247
+ setColor(palette.Slider, 'infoTrack', colorMix(safeLighten, palette.info.main, 0.62));
248
+ setColor(palette.Slider, 'successTrack', colorMix(safeLighten, palette.success.main, 0.62));
249
+ setColor(palette.Slider, 'warningTrack', colorMix(safeLighten, palette.warning.main, 0.62));
250
+ const snackbarContentBackground = colorSpace ? colorMix(safeDarken, palette.background.default, 0.6825) // use `0.6825` instead of `0.8` to match the contrast ratio of JS implementation
251
+ : safeEmphasize(palette.background.default, 0.8);
225
252
  setColor(palette.SnackbarContent, 'bg', snackbarContentBackground);
226
- setColor(palette.SnackbarContent, 'color', silent(() => palette.getContrastText(snackbarContentBackground)));
253
+ setColor(palette.SnackbarContent, 'color', silent(() => colorSpace ? dark.text.primary : palette.getContrastText(snackbarContentBackground)));
227
254
  setColor(palette.SpeedDialAction, 'fabHoverBg', safeEmphasize(palette.background.paper, 0.15));
228
255
  setColor(palette.StepConnector, 'border', setCssVarColor('palette-grey-400'));
229
256
  setColor(palette.StepContent, 'border', setCssVarColor('palette-grey-400'));
230
257
  setColor(palette.Switch, 'defaultColor', setCssVarColor('palette-common-white'));
231
258
  setColor(palette.Switch, 'defaultDisabledColor', setCssVarColor('palette-grey-100'));
232
- setColor(palette.Switch, 'primaryDisabledColor', safeLighten(palette.primary.main, 0.62));
233
- setColor(palette.Switch, 'secondaryDisabledColor', safeLighten(palette.secondary.main, 0.62));
234
- setColor(palette.Switch, 'errorDisabledColor', safeLighten(palette.error.main, 0.62));
235
- setColor(palette.Switch, 'infoDisabledColor', safeLighten(palette.info.main, 0.62));
236
- setColor(palette.Switch, 'successDisabledColor', safeLighten(palette.success.main, 0.62));
237
- setColor(palette.Switch, 'warningDisabledColor', safeLighten(palette.warning.main, 0.62));
238
- setColor(palette.TableCell, 'border', safeLighten(safeAlpha(palette.divider, 1), 0.88));
239
- setColor(palette.Tooltip, 'bg', safeAlpha(palette.grey[700], 0.92));
259
+ setColor(palette.Switch, 'primaryDisabledColor', colorMix(safeLighten, palette.primary.main, 0.62));
260
+ setColor(palette.Switch, 'secondaryDisabledColor', colorMix(safeLighten, palette.secondary.main, 0.62));
261
+ setColor(palette.Switch, 'errorDisabledColor', colorMix(safeLighten, palette.error.main, 0.62));
262
+ setColor(palette.Switch, 'infoDisabledColor', colorMix(safeLighten, palette.info.main, 0.62));
263
+ setColor(palette.Switch, 'successDisabledColor', colorMix(safeLighten, palette.success.main, 0.62));
264
+ setColor(palette.Switch, 'warningDisabledColor', colorMix(safeLighten, palette.warning.main, 0.62));
265
+ setColor(palette.TableCell, 'border', colorMix(safeLighten, colorMix(safeAlpha, palette.divider, 1), 0.88));
266
+ setColor(palette.Tooltip, 'bg', colorMix(safeAlpha, palette.grey[700], 0.92));
240
267
  }
241
268
  if (palette.mode === 'dark') {
242
- setColor(palette.Alert, 'errorColor', safeLighten(palette.error.light, 0.6));
243
- setColor(palette.Alert, 'infoColor', safeLighten(palette.info.light, 0.6));
244
- setColor(palette.Alert, 'successColor', safeLighten(palette.success.light, 0.6));
245
- setColor(palette.Alert, 'warningColor', safeLighten(palette.warning.light, 0.6));
269
+ setColor(palette.Alert, 'errorColor', colorMix(safeLighten, palette.error.light, 0.6));
270
+ setColor(palette.Alert, 'infoColor', colorMix(safeLighten, palette.info.light, 0.6));
271
+ setColor(palette.Alert, 'successColor', colorMix(safeLighten, palette.success.light, 0.6));
272
+ setColor(palette.Alert, 'warningColor', colorMix(safeLighten, palette.warning.light, 0.6));
246
273
  setColor(palette.Alert, 'errorFilledBg', setCssVarColor('palette-error-dark'));
247
274
  setColor(palette.Alert, 'infoFilledBg', setCssVarColor('palette-info-dark'));
248
275
  setColor(palette.Alert, 'successFilledBg', setCssVarColor('palette-success-dark'));
@@ -251,10 +278,10 @@ export default function createThemeWithVars(options = {}, ...args) {
251
278
  setColor(palette.Alert, 'infoFilledColor', silent(() => palette.getContrastText(palette.info.dark)));
252
279
  setColor(palette.Alert, 'successFilledColor', silent(() => palette.getContrastText(palette.success.dark)));
253
280
  setColor(palette.Alert, 'warningFilledColor', silent(() => palette.getContrastText(palette.warning.dark)));
254
- setColor(palette.Alert, 'errorStandardBg', safeDarken(palette.error.light, 0.9));
255
- setColor(palette.Alert, 'infoStandardBg', safeDarken(palette.info.light, 0.9));
256
- setColor(palette.Alert, 'successStandardBg', safeDarken(palette.success.light, 0.9));
257
- setColor(palette.Alert, 'warningStandardBg', safeDarken(palette.warning.light, 0.9));
281
+ setColor(palette.Alert, 'errorStandardBg', colorMix(safeDarken, palette.error.light, 0.9));
282
+ setColor(palette.Alert, 'infoStandardBg', colorMix(safeDarken, palette.info.light, 0.9));
283
+ setColor(palette.Alert, 'successStandardBg', colorMix(safeDarken, palette.success.light, 0.9));
284
+ setColor(palette.Alert, 'warningStandardBg', colorMix(safeDarken, palette.warning.light, 0.9));
258
285
  setColor(palette.Alert, 'errorIconColor', setCssVarColor('palette-error-main'));
259
286
  setColor(palette.Alert, 'infoIconColor', setCssVarColor('palette-info-main'));
260
287
  setColor(palette.Alert, 'successIconColor', setCssVarColor('palette-success-main'));
@@ -271,35 +298,36 @@ export default function createThemeWithVars(options = {}, ...args) {
271
298
  setColor(palette.FilledInput, 'bg', 'rgba(255, 255, 255, 0.09)');
272
299
  setColor(palette.FilledInput, 'hoverBg', 'rgba(255, 255, 255, 0.13)');
273
300
  setColor(palette.FilledInput, 'disabledBg', 'rgba(255, 255, 255, 0.12)');
274
- setColor(palette.LinearProgress, 'primaryBg', safeDarken(palette.primary.main, 0.5));
275
- setColor(palette.LinearProgress, 'secondaryBg', safeDarken(palette.secondary.main, 0.5));
276
- setColor(palette.LinearProgress, 'errorBg', safeDarken(palette.error.main, 0.5));
277
- setColor(palette.LinearProgress, 'infoBg', safeDarken(palette.info.main, 0.5));
278
- setColor(palette.LinearProgress, 'successBg', safeDarken(palette.success.main, 0.5));
279
- setColor(palette.LinearProgress, 'warningBg', safeDarken(palette.warning.main, 0.5));
280
- setColor(palette.Skeleton, 'bg', `rgba(${setCssVarColor('palette-text-primaryChannel')} / 0.13)`);
281
- setColor(palette.Slider, 'primaryTrack', safeDarken(palette.primary.main, 0.5));
282
- setColor(palette.Slider, 'secondaryTrack', safeDarken(palette.secondary.main, 0.5));
283
- setColor(palette.Slider, 'errorTrack', safeDarken(palette.error.main, 0.5));
284
- setColor(palette.Slider, 'infoTrack', safeDarken(palette.info.main, 0.5));
285
- setColor(palette.Slider, 'successTrack', safeDarken(palette.success.main, 0.5));
286
- setColor(palette.Slider, 'warningTrack', safeDarken(palette.warning.main, 0.5));
287
- const snackbarContentBackground = safeEmphasize(palette.background.default, 0.98);
301
+ setColor(palette.LinearProgress, 'primaryBg', colorMix(safeDarken, palette.primary.main, 0.5));
302
+ setColor(palette.LinearProgress, 'secondaryBg', colorMix(safeDarken, palette.secondary.main, 0.5));
303
+ setColor(palette.LinearProgress, 'errorBg', colorMix(safeDarken, palette.error.main, 0.5));
304
+ setColor(palette.LinearProgress, 'infoBg', colorMix(safeDarken, palette.info.main, 0.5));
305
+ setColor(palette.LinearProgress, 'successBg', colorMix(safeDarken, palette.success.main, 0.5));
306
+ setColor(palette.LinearProgress, 'warningBg', colorMix(safeDarken, palette.warning.main, 0.5));
307
+ setColor(palette.Skeleton, 'bg', colorSpace ? colorMix(safeAlpha, palette.text.primary, 0.13) : `rgba(${setCssVarColor('palette-text-primaryChannel')} / 0.13)`);
308
+ setColor(palette.Slider, 'primaryTrack', colorMix(safeDarken, palette.primary.main, 0.5));
309
+ setColor(palette.Slider, 'secondaryTrack', colorMix(safeDarken, palette.secondary.main, 0.5));
310
+ setColor(palette.Slider, 'errorTrack', colorMix(safeDarken, palette.error.main, 0.5));
311
+ setColor(palette.Slider, 'infoTrack', colorMix(safeDarken, palette.info.main, 0.5));
312
+ setColor(palette.Slider, 'successTrack', colorMix(safeDarken, palette.success.main, 0.5));
313
+ setColor(palette.Slider, 'warningTrack', colorMix(safeDarken, palette.warning.main, 0.5));
314
+ const snackbarContentBackground = colorSpace ? colorMix(safeLighten, palette.background.default, 0.985) // use `0.985` instead of `0.98` to match the contrast ratio of JS implementation
315
+ : safeEmphasize(palette.background.default, 0.98);
288
316
  setColor(palette.SnackbarContent, 'bg', snackbarContentBackground);
289
- setColor(palette.SnackbarContent, 'color', silent(() => palette.getContrastText(snackbarContentBackground)));
317
+ setColor(palette.SnackbarContent, 'color', silent(() => colorSpace ? light.text.primary : palette.getContrastText(snackbarContentBackground)));
290
318
  setColor(palette.SpeedDialAction, 'fabHoverBg', safeEmphasize(palette.background.paper, 0.15));
291
319
  setColor(palette.StepConnector, 'border', setCssVarColor('palette-grey-600'));
292
320
  setColor(palette.StepContent, 'border', setCssVarColor('palette-grey-600'));
293
321
  setColor(palette.Switch, 'defaultColor', setCssVarColor('palette-grey-300'));
294
322
  setColor(palette.Switch, 'defaultDisabledColor', setCssVarColor('palette-grey-600'));
295
- setColor(palette.Switch, 'primaryDisabledColor', safeDarken(palette.primary.main, 0.55));
296
- setColor(palette.Switch, 'secondaryDisabledColor', safeDarken(palette.secondary.main, 0.55));
297
- setColor(palette.Switch, 'errorDisabledColor', safeDarken(palette.error.main, 0.55));
298
- setColor(palette.Switch, 'infoDisabledColor', safeDarken(palette.info.main, 0.55));
299
- setColor(palette.Switch, 'successDisabledColor', safeDarken(palette.success.main, 0.55));
300
- setColor(palette.Switch, 'warningDisabledColor', safeDarken(palette.warning.main, 0.55));
301
- setColor(palette.TableCell, 'border', safeDarken(safeAlpha(palette.divider, 1), 0.68));
302
- setColor(palette.Tooltip, 'bg', safeAlpha(palette.grey[700], 0.92));
323
+ setColor(palette.Switch, 'primaryDisabledColor', colorMix(safeDarken, palette.primary.main, 0.55));
324
+ setColor(palette.Switch, 'secondaryDisabledColor', colorMix(safeDarken, palette.secondary.main, 0.55));
325
+ setColor(palette.Switch, 'errorDisabledColor', colorMix(safeDarken, palette.error.main, 0.55));
326
+ setColor(palette.Switch, 'infoDisabledColor', colorMix(safeDarken, palette.info.main, 0.55));
327
+ setColor(palette.Switch, 'successDisabledColor', colorMix(safeDarken, palette.success.main, 0.55));
328
+ setColor(palette.Switch, 'warningDisabledColor', colorMix(safeDarken, palette.warning.main, 0.55));
329
+ setColor(palette.TableCell, 'border', colorMix(safeDarken, colorMix(safeAlpha, palette.divider, 1), 0.68));
330
+ setColor(palette.Tooltip, 'bg', colorMix(safeAlpha, palette.grey[700], 0.92));
303
331
  }
304
332
 
305
333
  // MUI X - DataGrid needs this token.
@@ -351,7 +379,8 @@ export default function createThemeWithVars(options = {}, ...args) {
351
379
  prefix: cssVarPrefix,
352
380
  disableCssColorScheme,
353
381
  shouldSkipGeneratingVar,
354
- getSelector: defaultGetSelector(theme)
382
+ getSelector: defaultGetSelector(theme),
383
+ enableContrastVars: nativeColor
355
384
  };
356
385
  const {
357
386
  vars,
@@ -1,5 +1,5 @@
1
1
  export default function shouldSkipGeneratingVar(keys) {
2
- return !!keys[0].match(/(cssVarPrefix|colorSchemeSelector|rootSelector|typography|mixins|breakpoints|direction|transitions)/) || !!keys[0].match(/sxConfig$/) ||
2
+ return !!keys[0].match(/(cssVarPrefix|colorSchemeSelector|modularCssLayers|rootSelector|typography|mixins|breakpoints|direction|transitions)/) || !!keys[0].match(/sxConfig$/) ||
3
3
  // ends with sxConfig
4
4
  keys[0] === 'palette' && !!keys[1]?.match(/(mode|contrastThreshold|tonalOffset)/);
5
5
  }
@@ -135,6 +135,7 @@ export interface UseAutocompleteProps<Value, Multiple extends boolean | undefine
135
135
  * Used to determine the disabled state for a given option.
136
136
  *
137
137
  * @param {Value} option The option to test.
138
+ * @template Value The option shape. Will be the same shape as an item of the options.
138
139
  * @returns {boolean}
139
140
  */
140
141
  getOptionDisabled?: (option: Value) => boolean;
@@ -6,6 +6,13 @@ import useEventCallback from '@mui/utils/useEventCallback';
6
6
  import useControlled from '@mui/utils/useControlled';
7
7
  import useId from '@mui/utils/useId';
8
8
  import usePreviousProps from '@mui/utils/usePreviousProps';
9
+ function areArraysSame({
10
+ array1,
11
+ array2,
12
+ parser = value => value
13
+ }) {
14
+ return array1 && array2 && array1.length === array2.length && array1.every((prevOption, index) => parser(prevOption) === parser(array2[index]));
15
+ }
9
16
 
10
17
  // https://stackoverflow.com/questions/990904/remove-accents-diacritics-in-a-string-in-javascript
11
18
  function stripDiacritics(string) {
@@ -368,13 +375,22 @@ function useAutocomplete(props) {
368
375
  }
369
376
  }
370
377
  });
378
+ const filteredOptionsChanged = !areArraysSame({
379
+ array1: previousProps.filteredOptions,
380
+ array2: filteredOptions,
381
+ parser: getOptionLabel
382
+ });
371
383
  const getPreviousHighlightedOptionIndex = () => {
372
384
  const isSameValue = (value1, value2) => {
373
385
  const label1 = value1 ? getOptionLabel(value1) : '';
374
386
  const label2 = value2 ? getOptionLabel(value2) : '';
375
387
  return label1 === label2;
376
388
  };
377
- if (highlightedIndexRef.current !== -1 && previousProps.filteredOptions && previousProps.filteredOptions.length !== filteredOptions.length && previousProps.inputValue === inputValue && (multiple ? value.length === previousProps.value.length && previousProps.value.every((val, i) => getOptionLabel(value[i]) === getOptionLabel(val)) : isSameValue(previousProps.value, value))) {
389
+ if (highlightedIndexRef.current !== -1 && !areArraysSame({
390
+ array1: previousProps.filteredOptions,
391
+ array2: filteredOptions,
392
+ parser: getOptionLabel
393
+ }) && previousProps.inputValue === inputValue && (multiple ? value.length === previousProps.value.length && previousProps.value.every((val, i) => getOptionLabel(value[i]) === getOptionLabel(val)) : isSameValue(previousProps.value, value))) {
378
394
  const previousHighlightedOption = previousProps.filteredOptions[highlightedIndexRef.current];
379
395
  if (previousHighlightedOption) {
380
396
  return filteredOptions.findIndex(option => {
@@ -470,8 +486,10 @@ function useAutocomplete(props) {
470
486
  }, [componentName]);
471
487
  }
472
488
  React.useEffect(() => {
473
- syncHighlightedIndex();
474
- }, [syncHighlightedIndex]);
489
+ if (filteredOptionsChanged) {
490
+ syncHighlightedIndex();
491
+ }
492
+ }, [syncHighlightedIndex, filteredOptionsChanged]);
475
493
  const handleOpen = event => {
476
494
  if (open) {
477
495
  return;
@@ -1,6 +1,6 @@
1
- export const version = "7.1.2";
1
+ export const version = "7.3.0";
2
2
  export const major = Number("7");
3
- export const minor = Number("1");
4
- export const patch = Number("2");
3
+ export const minor = Number("3");
4
+ export const patch = Number("0");
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.1.2
2
+ * @mui/material v7.3.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -33,7 +33,9 @@ const useUtilityClasses = ownerState => {
33
33
  };
34
34
  return (0, _composeClasses.default)(slots, _switchBaseClasses.getSwitchBaseUtilityClass, classes);
35
35
  };
36
- const SwitchBaseRoot = (0, _zeroStyled.styled)(_ButtonBase.default)({
36
+ const SwitchBaseRoot = (0, _zeroStyled.styled)(_ButtonBase.default, {
37
+ name: 'MuiSwitchBase'
38
+ })({
37
39
  padding: 9,
38
40
  borderRadius: '50%',
39
41
  variants: [{
@@ -71,6 +73,7 @@ const SwitchBaseRoot = (0, _zeroStyled.styled)(_ButtonBase.default)({
71
73
  }]
72
74
  });
73
75
  const SwitchBaseInput = (0, _zeroStyled.styled)('input', {
76
+ name: 'MuiSwitchBase',
74
77
  shouldForwardProp: _rootShouldForwardProp.default
75
78
  })({
76
79
  cursor: 'inherit',
package/locale/index.js CHANGED
@@ -3284,9 +3284,12 @@ const roRO = exports.roRO = {
3284
3284
  // if (type === 'previous') {
3285
3285
  return 'Mergi la pagina precedentă';
3286
3286
  },
3287
- labelRowsPerPage: 'Rânduri pe pagină:'
3288
- // labelDisplayedRows: ({ from, to, count }) =>
3289
- // `${from}–${to} din ${count !== -1 ? count : `more than ${to}`}`,
3287
+ labelRowsPerPage: 'Rânduri pe pagină:',
3288
+ labelDisplayedRows: ({
3289
+ from,
3290
+ to,
3291
+ count
3292
+ }) => `${from}–${to} din ${count !== -1 ? count : `mai mult de ${to}`}`
3290
3293
  }
3291
3294
  },
3292
3295
  MuiRating: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/material",
3
- "version": "7.1.2",
3
+ "version": "7.3.0",
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
  "main": "./index.js",
@@ -26,18 +26,18 @@
26
26
  "url": "https://opencollective.com/mui-org"
27
27
  },
28
28
  "dependencies": {
29
- "@babel/runtime": "^7.27.1",
29
+ "@babel/runtime": "^7.28.2",
30
30
  "@popperjs/core": "^2.11.8",
31
31
  "@types/react-transition-group": "^4.4.12",
32
32
  "clsx": "^2.1.1",
33
33
  "csstype": "^3.1.3",
34
34
  "prop-types": "^15.8.1",
35
- "react-is": "^19.1.0",
35
+ "react-is": "^19.1.1",
36
36
  "react-transition-group": "^4.4.5",
37
- "@mui/core-downloads-tracker": "^7.1.2",
38
- "@mui/types": "^7.4.3",
39
- "@mui/system": "^7.1.1",
40
- "@mui/utils": "^7.1.1"
37
+ "@mui/system": "^7.3.0",
38
+ "@mui/types": "^7.4.5",
39
+ "@mui/utils": "^7.3.0",
40
+ "@mui/core-downloads-tracker": "^7.3.0"
41
41
  },
42
42
  "peerDependencies": {
43
43
  "@emotion/react": "^11.5.0",
@@ -45,7 +45,7 @@
45
45
  "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
46
46
  "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
47
47
  "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0",
48
- "@mui/material-pigment-css": "^7.1.1"
48
+ "@mui/material-pigment-css": "^7.3.0"
49
49
  },
50
50
  "peerDependenciesMeta": {
51
51
  "@types/react": {
@@ -63,8 +63,7 @@
63
63
  },
64
64
  "sideEffects": false,
65
65
  "publishConfig": {
66
- "access": "public",
67
- "directory": "build"
66
+ "access": "public"
68
67
  },
69
68
  "engines": {
70
69
  "node": ">=14.0.0"
@@ -117,6 +116,5 @@
117
116
  }
118
117
  },
119
118
  "private": false,
120
- "module": "./esm/index.js",
121
119
  "types": "./index.d.ts"
122
120
  }
@@ -2,6 +2,11 @@ import { ComponentsProps } from "./props.js";
2
2
  import { ComponentsOverrides } from "./overrides.js";
3
3
  import { ComponentsVariants } from "./variants.js";
4
4
  export interface Components<Theme = unknown> {
5
+ /**
6
+ * Whether to merge the className and style coming from the component props with the default props.
7
+ * @default false
8
+ */
9
+ mergeClassNameAndStyle?: boolean;
5
10
  MuiAlert?: {
6
11
  defaultProps?: ComponentsProps['MuiAlert'];
7
12
  styleOverrides?: ComponentsOverrides<Theme>['MuiAlert'];
@@ -6,4 +6,6 @@ export declare function getOpacity(mode: 'light' | 'dark'): {
6
6
  switchTrack: number;
7
7
  };
8
8
  export declare function getOverlays(mode: 'light' | 'dark'): string[];
9
- export default function createColorScheme(options: ColorSystemOptions): ColorSystemOptions;
9
+ export default function createColorScheme(options: ColorSystemOptions & {
10
+ colorSpace?: string;
11
+ }): ColorSystemOptions;
@@ -35,9 +35,14 @@ function createColorScheme(options) {
35
35
  // need to cast to avoid module augmentation test
36
36
  opacity,
37
37
  overlays,
38
+ colorSpace,
38
39
  ...rest
39
40
  } = options;
40
- const palette = (0, _createPalette.default)(paletteInput);
41
+ // need to cast because `colorSpace` is considered internal at the moment.
42
+ const palette = (0, _createPalette.default)({
43
+ ...paletteInput,
44
+ colorSpace
45
+ });
41
46
  return {
42
47
  palette,
43
48
  opacity: {
@@ -4,6 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
+ exports.contrastColor = contrastColor;
7
8
  exports.dark = void 0;
8
9
  exports.default = createPalette;
9
10
  exports.light = void 0;
@@ -101,6 +102,19 @@ function addLightOrDark(intent, direction, shade, tonalOffset) {
101
102
  }
102
103
  }
103
104
  }
105
+ function mixLightOrDark(colorSpace, intent, direction, shade, tonalOffset) {
106
+ const tonalOffsetLight = tonalOffset.light || tonalOffset;
107
+ const tonalOffsetDark = tonalOffset.dark || tonalOffset * 1.5;
108
+ if (!intent[direction]) {
109
+ if (intent.hasOwnProperty(shade)) {
110
+ intent[direction] = intent[shade];
111
+ } else if (direction === 'light') {
112
+ intent.light = `color-mix(in ${colorSpace}, ${intent.main}, #fff ${(tonalOffsetLight * 100).toFixed(0)}%)`;
113
+ } else if (direction === 'dark') {
114
+ intent.dark = `color-mix(in ${colorSpace}, ${intent.main}, #000 ${(tonalOffsetDark * 100).toFixed(0)}%)`;
115
+ }
116
+ }
117
+ }
104
118
  function getDefaultPrimary(mode = 'light') {
105
119
  if (mode === 'dark') {
106
120
  return {
@@ -186,11 +200,17 @@ function getDefaultWarning(mode = 'light') {
186
200
  dark: _orange.default[900]
187
201
  };
188
202
  }
203
+
204
+ // Use the same name as the experimental CSS `contrast-color` function.
205
+ function contrastColor(background) {
206
+ return `oklch(from ${background} var(--__l) 0 h / var(--__a))`;
207
+ }
189
208
  function createPalette(palette) {
190
209
  const {
191
210
  mode = 'light',
192
211
  contrastThreshold = 3,
193
212
  tonalOffset = 0.2,
213
+ colorSpace,
194
214
  ...other
195
215
  } = palette;
196
216
  const primary = palette.primary || getDefaultPrimary(mode);
@@ -204,6 +224,9 @@ function createPalette(palette) {
204
224
  // Bootstrap: https://github.com/twbs/bootstrap/blob/1d6e3710dd447de1a200f29e8fa521f8a0908f70/scss/_functions.scss#L59
205
225
  // and material-components-web https://github.com/material-components/material-components-web/blob/ac46b8863c4dab9fc22c4c662dc6bd1b65dd652f/packages/mdc-theme/_functions.scss#L54
206
226
  function getContrastText(background) {
227
+ if (colorSpace) {
228
+ return contrastColor(background);
229
+ }
207
230
  const contrastText = (0, _colorManipulator.getContrastRatio)(background, dark.text.primary) >= contrastThreshold ? dark.text.primary : light.text.primary;
208
231
  if (process.env.NODE_ENV !== 'production') {
209
232
  const contrast = (0, _colorManipulator.getContrastRatio)(background, contrastText);
@@ -232,8 +255,13 @@ function createPalette(palette) {
232
255
  if (typeof color.main !== 'string') {
233
256
  throw new Error(process.env.NODE_ENV !== "production" ? `MUI: The color${name ? ` (${name})` : ''} provided to augmentColor(color) is invalid.\n` + `\`color.main\` should be a string, but \`${JSON.stringify(color.main)}\` was provided instead.\n` + '\n' + 'Did you intend to use one of the following approaches?\n' + '\n' + 'import { green } from "@mui/material/colors";\n' + '\n' + 'const theme1 = createTheme({ palette: {\n' + ' primary: green,\n' + '} });\n' + '\n' + 'const theme2 = createTheme({ palette: {\n' + ' primary: { main: green[500] },\n' + '} });' : (0, _formatMuiErrorMessage.default)(12, name ? ` (${name})` : '', JSON.stringify(color.main)));
234
257
  }
235
- addLightOrDark(color, 'light', lightShade, tonalOffset);
236
- addLightOrDark(color, 'dark', darkShade, tonalOffset);
258
+ if (colorSpace) {
259
+ mixLightOrDark(colorSpace, color, 'light', lightShade, tonalOffset);
260
+ mixLightOrDark(colorSpace, color, 'dark', darkShade, tonalOffset);
261
+ } else {
262
+ addLightOrDark(color, 'light', lightShade, tonalOffset);
263
+ addLightOrDark(color, 'dark', darkShade, tonalOffset);
264
+ }
237
265
  if (!color.contrastText) {
238
266
  color.contrastText = getContrastText(color.main);
239
267
  }
@@ -8,7 +8,7 @@ export type { ThemeOptions, Theme, CssThemeVariables } from "./createThemeNoVars
8
8
  * @returns A complete, ready-to-use theme object.
9
9
  */
10
10
  export default function createTheme(options?: Omit<ThemeOptions, 'components'> & Pick<CssVarsThemeOptions, 'defaultColorScheme' | 'colorSchemes' | 'components'> & {
11
- cssVariables?: boolean | Pick<CssVarsThemeOptions, 'colorSchemeSelector' | 'rootSelector' | 'disableCssColorScheme' | 'cssVarPrefix' | 'shouldSkipGeneratingVar'>;
11
+ cssVariables?: boolean | Pick<CssVarsThemeOptions, 'colorSchemeSelector' | 'rootSelector' | 'disableCssColorScheme' | 'cssVarPrefix' | 'shouldSkipGeneratingVar' | 'nativeColor'>;
12
12
  },
13
13
  // cast type to skip module augmentation test
14
14
  ...args: object[]): Theme;
@@ -32,6 +32,7 @@ export interface ThemeOptions extends Omit<SystemThemeOptions, 'zIndex'>, CssVar
32
32
  zIndex?: ZIndexOptions;
33
33
  unstable_strictMode?: boolean;
34
34
  unstable_sxConfig?: SxConfig;
35
+ modularCssLayers?: boolean | string;
35
36
  }
36
37
  export interface BaseTheme extends SystemTheme {
37
38
  mixins: Mixins;
@@ -59,6 +60,9 @@ export interface Theme extends BaseTheme, CssVarsProperties {
59
60
  components?: Components<BaseTheme>;
60
61
  unstable_sx: (props: SxProps<Theme>) => CSSObject;
61
62
  unstable_sxConfig: SxConfig;
63
+ alpha: (color: string, value: number | string) => string;
64
+ lighten: (color: string, coefficient: number | string) => string;
65
+ darken: (color: string, coefficient: number | string) => string;
62
66
  }
63
67
 
64
68
  /**