@mui/material 6.0.0-beta.2 → 6.0.0-beta.3

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 (56) hide show
  1. package/CHANGELOG.md +427 -33
  2. package/Fade/Fade.js +2 -1
  3. package/Grow/Grow.js +2 -1
  4. package/Paper/Paper.js +1 -1
  5. package/Rating/Rating.d.ts +1 -1
  6. package/Rating/Rating.js +2 -2
  7. package/Select/selectClasses.d.ts +2 -0
  8. package/Slide/Slide.js +2 -1
  9. package/Tooltip/Tooltip.js +2 -1
  10. package/Typography/Typography.d.ts +1 -0
  11. package/Typography/Typography.js +1 -0
  12. package/Typography/typographyClasses.d.ts +4 -1
  13. package/Zoom/Zoom.js +2 -1
  14. package/index.js +1 -1
  15. package/modern/Fade/Fade.js +2 -1
  16. package/modern/Grow/Grow.js +2 -1
  17. package/modern/Paper/Paper.js +1 -1
  18. package/modern/Rating/Rating.js +2 -2
  19. package/modern/Slide/Slide.js +2 -1
  20. package/modern/Tooltip/Tooltip.js +2 -1
  21. package/modern/Typography/Typography.js +1 -0
  22. package/modern/Zoom/Zoom.js +2 -1
  23. package/modern/index.js +1 -1
  24. package/modern/styles/CssVarsProvider.js +0 -1
  25. package/modern/styles/createGetSelector.js +36 -7
  26. package/modern/styles/excludeVariablesFromRoot.js +1 -1
  27. package/modern/styles/extendTheme.js +105 -65
  28. package/modern/styles/shouldSkipGeneratingVar.js +1 -1
  29. package/modern/utils/getChildRef.js +9 -0
  30. package/node/Fade/Fade.js +2 -1
  31. package/node/Grow/Grow.js +2 -1
  32. package/node/Paper/Paper.js +2 -2
  33. package/node/Rating/Rating.js +2 -2
  34. package/node/Slide/Slide.js +2 -1
  35. package/node/Tooltip/Tooltip.js +2 -1
  36. package/node/Typography/Typography.js +1 -0
  37. package/node/Zoom/Zoom.js +2 -1
  38. package/node/index.js +1 -1
  39. package/node/styles/CssVarsProvider.js +0 -1
  40. package/node/styles/createGetSelector.js +36 -7
  41. package/node/styles/excludeVariablesFromRoot.js +1 -1
  42. package/node/styles/extendTheme.js +105 -65
  43. package/node/styles/shouldSkipGeneratingVar.js +1 -1
  44. package/node/utils/getChildRef.js +17 -0
  45. package/package.json +6 -6
  46. package/styles/CssVarsProvider.d.ts +2 -1
  47. package/styles/CssVarsProvider.js +0 -1
  48. package/styles/createGetSelector.d.ts +6 -2
  49. package/styles/createGetSelector.js +36 -7
  50. package/styles/excludeVariablesFromRoot.d.ts +1 -1
  51. package/styles/excludeVariablesFromRoot.js +1 -1
  52. package/styles/extendTheme.d.ts +21 -16
  53. package/styles/extendTheme.js +105 -65
  54. package/styles/shouldSkipGeneratingVar.js +1 -1
  55. package/utils/getChildRef.d.ts +1 -0
  56. package/utils/getChildRef.js +9 -0
@@ -1,7 +1,8 @@
1
+ import _formatMuiErrorMessage from "@mui/utils/formatMuiErrorMessage";
1
2
  import deepmerge from '@mui/utils/deepmerge';
2
3
  import { unstable_createGetCssVar as systemCreateGetCssVar, createSpacing } from '@mui/system';
3
4
  import { createUnarySpacing } from '@mui/system/spacing';
4
- import { prepareCssVars, prepareTypographyVars } from '@mui/system/cssVars';
5
+ import { prepareCssVars, prepareTypographyVars, createGetColorSchemeSelector } from '@mui/system/cssVars';
5
6
  import styleFunctionSx, { unstable_defaultSxConfig as defaultSxConfig } from '@mui/system/styleFunctionSx';
6
7
  import { private_safeColorChannel as safeColorChannel, private_safeAlpha as safeAlpha, private_safeDarken as safeDarken, private_safeLighten as safeLighten, private_safeEmphasize as safeEmphasize, hslToRgb } from '@mui/system/colorManipulator';
7
8
  import defaultShouldSkipGeneratingVar from './shouldSkipGeneratingVar';
@@ -65,64 +66,102 @@ const silent = fn => {
65
66
  return undefined;
66
67
  };
67
68
  export const createGetCssVar = (cssVarPrefix = 'mui') => systemCreateGetCssVar(cssVarPrefix);
69
+ function getOpacity(mode) {
70
+ return {
71
+ inputPlaceholder: mode === 'dark' ? 0.5 : 0.42,
72
+ inputUnderline: mode === 'dark' ? 0.7 : 0.42,
73
+ switchTrackDisabled: mode === 'dark' ? 0.2 : 0.12,
74
+ switchTrack: mode === 'dark' ? 0.3 : 0.38
75
+ };
76
+ }
77
+ function getOverlays(mode) {
78
+ return mode === 'dark' ? defaultDarkOverlays : [];
79
+ }
80
+ function attachColorScheme(colorSchemes, scheme, restTheme, colorScheme) {
81
+ if (!scheme) {
82
+ return undefined;
83
+ }
84
+ scheme = scheme === true ? {} : scheme;
85
+ const mode = colorScheme === 'dark' ? 'dark' : 'light';
86
+ const {
87
+ palette,
88
+ ...muiTheme
89
+ } = createThemeWithoutVars({
90
+ ...restTheme,
91
+ palette: {
92
+ mode,
93
+ ...scheme?.palette
94
+ }
95
+ });
96
+ colorSchemes[colorScheme] = {
97
+ ...scheme,
98
+ palette,
99
+ opacity: {
100
+ ...getOpacity(mode),
101
+ ...scheme?.opacity
102
+ },
103
+ overlays: scheme?.overlays || getOverlays(mode)
104
+ };
105
+ return muiTheme;
106
+ }
107
+
108
+ /**
109
+ * A default `extendTheme` comes with a single color scheme, either `light` or `dark` based on the `defaultColorScheme`.
110
+ * This is better suited for apps that only need a single color scheme.
111
+ *
112
+ * To enable built-in `light` and `dark` color schemes, either:
113
+ * 1. provide a `colorSchemeSelector` to define how the color schemes will change.
114
+ * 2. provide `colorSchemes.dark` will set `colorSchemeSelector: 'media'` by default.
115
+ */
68
116
  export default function extendTheme(options = {}, ...args) {
69
117
  const {
70
- colorSchemes: colorSchemesInput = {},
118
+ colorSchemes: colorSchemesInput = {
119
+ light: true
120
+ },
121
+ defaultColorScheme: defaultColorSchemeInput,
122
+ disableCssColorScheme = false,
71
123
  cssVarPrefix = 'mui',
72
124
  shouldSkipGeneratingVar = defaultShouldSkipGeneratingVar,
73
- getSelector,
125
+ colorSchemeSelector: selector = colorSchemesInput.light && colorSchemesInput.dark ? 'media' : undefined,
74
126
  ...input
75
127
  } = options;
128
+ const firstColorScheme = Object.keys(colorSchemesInput)[0];
129
+ const defaultColorScheme = defaultColorSchemeInput || (colorSchemesInput.light && firstColorScheme !== 'light' ? 'light' : firstColorScheme);
76
130
  const getCssVar = createGetCssVar(cssVarPrefix);
77
131
  const {
78
- palette: lightPalette,
79
- ...muiTheme
80
- } = createThemeWithoutVars({
81
- ...input,
82
- ...(colorSchemesInput.light && {
83
- palette: colorSchemesInput.light?.palette
84
- })
85
- });
86
- const {
87
- palette: darkPalette
88
- } = createThemeWithoutVars({
89
- palette: {
90
- mode: 'dark',
91
- ...colorSchemesInput.dark?.palette
92
- }
93
- });
132
+ [defaultColorScheme]: defaultSchemeInput,
133
+ light: builtInLight,
134
+ dark: builtInDark,
135
+ ...customColorSchemes
136
+ } = colorSchemesInput;
137
+ const colorSchemes = {
138
+ ...customColorSchemes
139
+ };
140
+ let defaultScheme = defaultSchemeInput;
141
+
142
+ // For built-in light and dark color schemes, ensure that the value is valid if they are the default color scheme.
143
+ if (defaultColorScheme === 'dark' && !('dark' in colorSchemesInput) || defaultColorScheme === 'light' && !('light' in colorSchemesInput)) {
144
+ defaultScheme = true;
145
+ }
146
+ if (!defaultScheme) {
147
+ throw new Error(process.env.NODE_ENV !== "production" ? `MUI: The provided \`colorSchemes.${defaultColorScheme}\` to the \`extendTheme\` function is either missing or invalid.` : _formatMuiErrorMessage(23, defaultColorScheme));
148
+ }
149
+
150
+ // Create the palette for the default color scheme, either `light`, `dark`, or custom color scheme.
151
+ const muiTheme = attachColorScheme(colorSchemes, defaultScheme, input, defaultColorScheme);
152
+ if (builtInLight && !colorSchemes.light) {
153
+ attachColorScheme(colorSchemes, builtInLight, undefined, 'light');
154
+ }
155
+ if (builtInDark && !colorSchemes.dark) {
156
+ attachColorScheme(colorSchemes, builtInDark, undefined, 'dark');
157
+ }
94
158
  let theme = {
95
- defaultColorScheme: 'light',
159
+ defaultColorScheme,
96
160
  ...muiTheme,
97
161
  cssVarPrefix,
162
+ colorSchemeSelector: selector,
98
163
  getCssVar,
99
- colorSchemes: {
100
- ...colorSchemesInput,
101
- light: {
102
- ...colorSchemesInput.light,
103
- palette: lightPalette,
104
- opacity: {
105
- inputPlaceholder: 0.42,
106
- inputUnderline: 0.42,
107
- switchTrackDisabled: 0.12,
108
- switchTrack: 0.38,
109
- ...colorSchemesInput.light?.opacity
110
- },
111
- overlays: colorSchemesInput.light?.overlays || []
112
- },
113
- dark: {
114
- ...colorSchemesInput.dark,
115
- palette: darkPalette,
116
- opacity: {
117
- inputPlaceholder: 0.5,
118
- inputUnderline: 0.7,
119
- switchTrackDisabled: 0.2,
120
- switchTrack: 0.3,
121
- ...colorSchemesInput.dark?.opacity
122
- },
123
- overlays: colorSchemesInput.dark?.overlays || defaultDarkOverlays
124
- }
125
- },
164
+ colorSchemes,
126
165
  font: {
127
166
  ...prepareTypographyVars(muiTheme.typography),
128
167
  ...muiTheme.font
@@ -139,17 +178,18 @@ export default function extendTheme(options = {}, ...args) {
139
178
  };
140
179
 
141
180
  // attach black & white channels to common node
142
- if (key === 'light') {
181
+ if (palette.mode === 'light') {
143
182
  setColor(palette.common, 'background', '#fff');
144
183
  setColor(palette.common, 'onBackground', '#000');
145
- } else {
184
+ }
185
+ if (palette.mode === 'dark') {
146
186
  setColor(palette.common, 'background', '#000');
147
187
  setColor(palette.common, 'onBackground', '#fff');
148
188
  }
149
189
 
150
190
  // assign component variables
151
191
  assignNode(palette, ['Alert', 'AppBar', 'Avatar', 'Button', 'Chip', 'FilledInput', 'LinearProgress', 'Skeleton', 'Slider', 'SnackbarContent', 'SpeedDialAction', 'StepConnector', 'StepContent', 'Switch', 'TableCell', 'Tooltip']);
152
- if (key === 'light') {
192
+ if (palette.mode === 'light') {
153
193
  setColor(palette.Alert, 'errorColor', safeDarken(palette.error.light, 0.6));
154
194
  setColor(palette.Alert, 'infoColor', safeDarken(palette.info.light, 0.6));
155
195
  setColor(palette.Alert, 'successColor', safeDarken(palette.success.light, 0.6));
@@ -158,10 +198,10 @@ export default function extendTheme(options = {}, ...args) {
158
198
  setColor(palette.Alert, 'infoFilledBg', setCssVarColor('palette-info-main'));
159
199
  setColor(palette.Alert, 'successFilledBg', setCssVarColor('palette-success-main'));
160
200
  setColor(palette.Alert, 'warningFilledBg', setCssVarColor('palette-warning-main'));
161
- setColor(palette.Alert, 'errorFilledColor', silent(() => lightPalette.getContrastText(palette.error.main)));
162
- setColor(palette.Alert, 'infoFilledColor', silent(() => lightPalette.getContrastText(palette.info.main)));
163
- setColor(palette.Alert, 'successFilledColor', silent(() => lightPalette.getContrastText(palette.success.main)));
164
- setColor(palette.Alert, 'warningFilledColor', silent(() => lightPalette.getContrastText(palette.warning.main)));
201
+ setColor(palette.Alert, 'errorFilledColor', silent(() => palette.getContrastText(palette.error.main)));
202
+ setColor(palette.Alert, 'infoFilledColor', silent(() => palette.getContrastText(palette.info.main)));
203
+ setColor(palette.Alert, 'successFilledColor', silent(() => palette.getContrastText(palette.success.main)));
204
+ setColor(palette.Alert, 'warningFilledColor', silent(() => palette.getContrastText(palette.warning.main)));
165
205
  setColor(palette.Alert, 'errorStandardBg', safeLighten(palette.error.light, 0.9));
166
206
  setColor(palette.Alert, 'infoStandardBg', safeLighten(palette.info.light, 0.9));
167
207
  setColor(palette.Alert, 'successStandardBg', safeLighten(palette.success.light, 0.9));
@@ -195,7 +235,7 @@ export default function extendTheme(options = {}, ...args) {
195
235
  setColor(palette.Slider, 'warningTrack', safeLighten(palette.warning.main, 0.62));
196
236
  const snackbarContentBackground = safeEmphasize(palette.background.default, 0.8);
197
237
  setColor(palette.SnackbarContent, 'bg', snackbarContentBackground);
198
- setColor(palette.SnackbarContent, 'color', silent(() => lightPalette.getContrastText(snackbarContentBackground)));
238
+ setColor(palette.SnackbarContent, 'color', silent(() => palette.getContrastText(snackbarContentBackground)));
199
239
  setColor(palette.SpeedDialAction, 'fabHoverBg', safeEmphasize(palette.background.paper, 0.15));
200
240
  setColor(palette.StepConnector, 'border', setCssVarColor('palette-grey-400'));
201
241
  setColor(palette.StepContent, 'border', setCssVarColor('palette-grey-400'));
@@ -209,7 +249,8 @@ export default function extendTheme(options = {}, ...args) {
209
249
  setColor(palette.Switch, 'warningDisabledColor', safeLighten(palette.warning.main, 0.62));
210
250
  setColor(palette.TableCell, 'border', safeLighten(safeAlpha(palette.divider, 1), 0.88));
211
251
  setColor(palette.Tooltip, 'bg', safeAlpha(palette.grey[700], 0.92));
212
- } else {
252
+ }
253
+ if (palette.mode === 'dark') {
213
254
  setColor(palette.Alert, 'errorColor', safeLighten(palette.error.light, 0.6));
214
255
  setColor(palette.Alert, 'infoColor', safeLighten(palette.info.light, 0.6));
215
256
  setColor(palette.Alert, 'successColor', safeLighten(palette.success.light, 0.6));
@@ -218,10 +259,10 @@ export default function extendTheme(options = {}, ...args) {
218
259
  setColor(palette.Alert, 'infoFilledBg', setCssVarColor('palette-info-dark'));
219
260
  setColor(palette.Alert, 'successFilledBg', setCssVarColor('palette-success-dark'));
220
261
  setColor(palette.Alert, 'warningFilledBg', setCssVarColor('palette-warning-dark'));
221
- setColor(palette.Alert, 'errorFilledColor', silent(() => darkPalette.getContrastText(palette.error.dark)));
222
- setColor(palette.Alert, 'infoFilledColor', silent(() => darkPalette.getContrastText(palette.info.dark)));
223
- setColor(palette.Alert, 'successFilledColor', silent(() => darkPalette.getContrastText(palette.success.dark)));
224
- setColor(palette.Alert, 'warningFilledColor', silent(() => darkPalette.getContrastText(palette.warning.dark)));
262
+ setColor(palette.Alert, 'errorFilledColor', silent(() => palette.getContrastText(palette.error.dark)));
263
+ setColor(palette.Alert, 'infoFilledColor', silent(() => palette.getContrastText(palette.info.dark)));
264
+ setColor(palette.Alert, 'successFilledColor', silent(() => palette.getContrastText(palette.success.dark)));
265
+ setColor(palette.Alert, 'warningFilledColor', silent(() => palette.getContrastText(palette.warning.dark)));
225
266
  setColor(palette.Alert, 'errorStandardBg', safeDarken(palette.error.light, 0.9));
226
267
  setColor(palette.Alert, 'infoStandardBg', safeDarken(palette.info.light, 0.9));
227
268
  setColor(palette.Alert, 'successStandardBg', safeDarken(palette.success.light, 0.9));
@@ -257,7 +298,7 @@ export default function extendTheme(options = {}, ...args) {
257
298
  setColor(palette.Slider, 'warningTrack', safeDarken(palette.warning.main, 0.5));
258
299
  const snackbarContentBackground = safeEmphasize(palette.background.default, 0.98);
259
300
  setColor(palette.SnackbarContent, 'bg', snackbarContentBackground);
260
- setColor(palette.SnackbarContent, 'color', silent(() => darkPalette.getContrastText(snackbarContentBackground)));
301
+ setColor(palette.SnackbarContent, 'color', silent(() => palette.getContrastText(snackbarContentBackground)));
261
302
  setColor(palette.SpeedDialAction, 'fabHoverBg', safeEmphasize(palette.background.paper, 0.15));
262
303
  setColor(palette.StepConnector, 'border', setCssVarColor('palette-grey-600'));
263
304
  setColor(palette.StepContent, 'border', setCssVarColor('palette-grey-600'));
@@ -320,16 +361,15 @@ export default function extendTheme(options = {}, ...args) {
320
361
  theme = args.reduce((acc, argument) => deepmerge(acc, argument), theme);
321
362
  const parserConfig = {
322
363
  prefix: cssVarPrefix,
364
+ disableCssColorScheme,
323
365
  shouldSkipGeneratingVar,
324
- getSelector: getSelector || defaultGetSelector(theme)
366
+ getSelector: defaultGetSelector(theme)
325
367
  };
326
368
  const {
327
369
  vars,
328
370
  generateThemeVars,
329
371
  generateStyleSheets
330
372
  } = prepareCssVars(theme, parserConfig);
331
- theme.attribute = 'data-mui-color-scheme';
332
- theme.colorSchemeSelector = ':root';
333
373
  theme.vars = vars;
334
374
  Object.entries(theme.colorSchemes[theme.defaultColorScheme]).forEach(([key, value]) => {
335
375
  theme[key] = value;
@@ -339,7 +379,7 @@ export default function extendTheme(options = {}, ...args) {
339
379
  theme.generateSpacing = function generateSpacing() {
340
380
  return createSpacing(input.spacing, createUnarySpacing(this));
341
381
  };
342
- theme.getColorSchemeSelector = colorScheme => `[${theme.attribute}="${colorScheme}"] &`;
382
+ theme.getColorSchemeSelector = createGetColorSchemeSelector(selector);
343
383
  theme.spacing = theme.generateSpacing();
344
384
  theme.shouldSkipGeneratingVar = shouldSkipGeneratingVar;
345
385
  theme.unstable_sxConfig = {
@@ -1,5 +1,5 @@
1
1
  export default function shouldSkipGeneratingVar(keys) {
2
- return !!keys[0].match(/(cssVarPrefix|typography|mixins|breakpoints|direction|transitions)/) || !!keys[0].match(/sxConfig$/) ||
2
+ return !!keys[0].match(/(cssVarPrefix|colorSchemeSelector|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
  }
@@ -0,0 +1 @@
1
+ export default function getChildRef(child: React.ReactElement): React.Ref<any> | null;
@@ -0,0 +1,9 @@
1
+ import * as React from 'react';
2
+ export default function getChildRef(child) {
3
+ if (!child || ! /*#__PURE__*/React.isValidElement(child)) {
4
+ return null;
5
+ }
6
+ // 'ref' is passed as prop in React 19, whereas 'ref' is directly attached to children in React 18
7
+ // below check is to ensure 'ref' is accessible in both cases
8
+ return child.props.propertyIsEnumerable('ref') ? child.props.ref : child.ref;
9
+ }