@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
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.createGetCssVar = void 0;
8
8
  exports.default = extendTheme;
9
+ var _formatMuiErrorMessage2 = _interopRequireDefault(require("@mui/utils/formatMuiErrorMessage"));
9
10
  var _deepmerge = _interopRequireDefault(require("@mui/utils/deepmerge"));
10
11
  var _system = require("@mui/system");
11
12
  var _spacing = require("@mui/system/spacing");
@@ -76,65 +77,103 @@ const silent = fn => {
76
77
  };
77
78
  const createGetCssVar = (cssVarPrefix = 'mui') => (0, _system.unstable_createGetCssVar)(cssVarPrefix);
78
79
  exports.createGetCssVar = createGetCssVar;
80
+ function getOpacity(mode) {
81
+ return {
82
+ inputPlaceholder: mode === 'dark' ? 0.5 : 0.42,
83
+ inputUnderline: mode === 'dark' ? 0.7 : 0.42,
84
+ switchTrackDisabled: mode === 'dark' ? 0.2 : 0.12,
85
+ switchTrack: mode === 'dark' ? 0.3 : 0.38
86
+ };
87
+ }
88
+ function getOverlays(mode) {
89
+ return mode === 'dark' ? defaultDarkOverlays : [];
90
+ }
91
+ function attachColorScheme(colorSchemes, scheme, restTheme, colorScheme) {
92
+ var _scheme, _scheme2, _scheme3;
93
+ if (!scheme) {
94
+ return undefined;
95
+ }
96
+ scheme = scheme === true ? {} : scheme;
97
+ const mode = colorScheme === 'dark' ? 'dark' : 'light';
98
+ const {
99
+ palette,
100
+ ...muiTheme
101
+ } = (0, _createTheme.default)({
102
+ ...restTheme,
103
+ palette: {
104
+ mode,
105
+ ...((_scheme = scheme) == null ? void 0 : _scheme.palette)
106
+ }
107
+ });
108
+ colorSchemes[colorScheme] = {
109
+ ...scheme,
110
+ palette,
111
+ opacity: {
112
+ ...getOpacity(mode),
113
+ ...((_scheme2 = scheme) == null ? void 0 : _scheme2.opacity)
114
+ },
115
+ overlays: ((_scheme3 = scheme) == null ? void 0 : _scheme3.overlays) || getOverlays(mode)
116
+ };
117
+ return muiTheme;
118
+ }
119
+
120
+ /**
121
+ * A default `extendTheme` comes with a single color scheme, either `light` or `dark` based on the `defaultColorScheme`.
122
+ * This is better suited for apps that only need a single color scheme.
123
+ *
124
+ * To enable built-in `light` and `dark` color schemes, either:
125
+ * 1. provide a `colorSchemeSelector` to define how the color schemes will change.
126
+ * 2. provide `colorSchemes.dark` will set `colorSchemeSelector: 'media'` by default.
127
+ */
79
128
  function extendTheme(options = {}, ...args) {
80
- var _colorSchemesInput$li, _colorSchemesInput$da, _colorSchemesInput$li2, _colorSchemesInput$li3, _colorSchemesInput$da2, _colorSchemesInput$da3;
81
129
  const {
82
- colorSchemes: colorSchemesInput = {},
130
+ colorSchemes: colorSchemesInput = {
131
+ light: true
132
+ },
133
+ defaultColorScheme: defaultColorSchemeInput,
134
+ disableCssColorScheme = false,
83
135
  cssVarPrefix = 'mui',
84
136
  shouldSkipGeneratingVar = _shouldSkipGeneratingVar.default,
85
- getSelector,
137
+ colorSchemeSelector: selector = colorSchemesInput.light && colorSchemesInput.dark ? 'media' : undefined,
86
138
  ...input
87
139
  } = options;
140
+ const firstColorScheme = Object.keys(colorSchemesInput)[0];
141
+ const defaultColorScheme = defaultColorSchemeInput || (colorSchemesInput.light && firstColorScheme !== 'light' ? 'light' : firstColorScheme);
88
142
  const getCssVar = createGetCssVar(cssVarPrefix);
89
143
  const {
90
- palette: lightPalette,
91
- ...muiTheme
92
- } = (0, _createTheme.default)({
93
- ...input,
94
- ...(colorSchemesInput.light && {
95
- palette: (_colorSchemesInput$li = colorSchemesInput.light) == null ? void 0 : _colorSchemesInput$li.palette
96
- })
97
- });
98
- const {
99
- palette: darkPalette
100
- } = (0, _createTheme.default)({
101
- palette: {
102
- mode: 'dark',
103
- ...((_colorSchemesInput$da = colorSchemesInput.dark) == null ? void 0 : _colorSchemesInput$da.palette)
104
- }
105
- });
144
+ [defaultColorScheme]: defaultSchemeInput,
145
+ light: builtInLight,
146
+ dark: builtInDark,
147
+ ...customColorSchemes
148
+ } = colorSchemesInput;
149
+ const colorSchemes = {
150
+ ...customColorSchemes
151
+ };
152
+ let defaultScheme = defaultSchemeInput;
153
+
154
+ // For built-in light and dark color schemes, ensure that the value is valid if they are the default color scheme.
155
+ if (defaultColorScheme === 'dark' && !('dark' in colorSchemesInput) || defaultColorScheme === 'light' && !('light' in colorSchemesInput)) {
156
+ defaultScheme = true;
157
+ }
158
+ if (!defaultScheme) {
159
+ throw new Error(process.env.NODE_ENV !== "production" ? `MUI: The provided \`colorSchemes.${defaultColorScheme}\` to the \`extendTheme\` function is either missing or invalid.` : (0, _formatMuiErrorMessage2.default)(23, defaultColorScheme));
160
+ }
161
+
162
+ // Create the palette for the default color scheme, either `light`, `dark`, or custom color scheme.
163
+ const muiTheme = attachColorScheme(colorSchemes, defaultScheme, input, defaultColorScheme);
164
+ if (builtInLight && !colorSchemes.light) {
165
+ attachColorScheme(colorSchemes, builtInLight, undefined, 'light');
166
+ }
167
+ if (builtInDark && !colorSchemes.dark) {
168
+ attachColorScheme(colorSchemes, builtInDark, undefined, 'dark');
169
+ }
106
170
  let theme = {
107
- defaultColorScheme: 'light',
171
+ defaultColorScheme,
108
172
  ...muiTheme,
109
173
  cssVarPrefix,
174
+ colorSchemeSelector: selector,
110
175
  getCssVar,
111
- colorSchemes: {
112
- ...colorSchemesInput,
113
- light: {
114
- ...colorSchemesInput.light,
115
- palette: lightPalette,
116
- opacity: {
117
- inputPlaceholder: 0.42,
118
- inputUnderline: 0.42,
119
- switchTrackDisabled: 0.12,
120
- switchTrack: 0.38,
121
- ...((_colorSchemesInput$li2 = colorSchemesInput.light) == null ? void 0 : _colorSchemesInput$li2.opacity)
122
- },
123
- overlays: ((_colorSchemesInput$li3 = colorSchemesInput.light) == null ? void 0 : _colorSchemesInput$li3.overlays) || []
124
- },
125
- dark: {
126
- ...colorSchemesInput.dark,
127
- palette: darkPalette,
128
- opacity: {
129
- inputPlaceholder: 0.5,
130
- inputUnderline: 0.7,
131
- switchTrackDisabled: 0.2,
132
- switchTrack: 0.3,
133
- ...((_colorSchemesInput$da2 = colorSchemesInput.dark) == null ? void 0 : _colorSchemesInput$da2.opacity)
134
- },
135
- overlays: ((_colorSchemesInput$da3 = colorSchemesInput.dark) == null ? void 0 : _colorSchemesInput$da3.overlays) || defaultDarkOverlays
136
- }
137
- },
176
+ colorSchemes,
138
177
  font: {
139
178
  ...(0, _cssVars.prepareTypographyVars)(muiTheme.typography),
140
179
  ...muiTheme.font
@@ -151,17 +190,18 @@ function extendTheme(options = {}, ...args) {
151
190
  };
152
191
 
153
192
  // attach black & white channels to common node
154
- if (key === 'light') {
193
+ if (palette.mode === 'light') {
155
194
  setColor(palette.common, 'background', '#fff');
156
195
  setColor(palette.common, 'onBackground', '#000');
157
- } else {
196
+ }
197
+ if (palette.mode === 'dark') {
158
198
  setColor(palette.common, 'background', '#000');
159
199
  setColor(palette.common, 'onBackground', '#fff');
160
200
  }
161
201
 
162
202
  // assign component variables
163
203
  assignNode(palette, ['Alert', 'AppBar', 'Avatar', 'Button', 'Chip', 'FilledInput', 'LinearProgress', 'Skeleton', 'Slider', 'SnackbarContent', 'SpeedDialAction', 'StepConnector', 'StepContent', 'Switch', 'TableCell', 'Tooltip']);
164
- if (key === 'light') {
204
+ if (palette.mode === 'light') {
165
205
  setColor(palette.Alert, 'errorColor', (0, _colorManipulator.private_safeDarken)(palette.error.light, 0.6));
166
206
  setColor(palette.Alert, 'infoColor', (0, _colorManipulator.private_safeDarken)(palette.info.light, 0.6));
167
207
  setColor(palette.Alert, 'successColor', (0, _colorManipulator.private_safeDarken)(palette.success.light, 0.6));
@@ -170,10 +210,10 @@ function extendTheme(options = {}, ...args) {
170
210
  setColor(palette.Alert, 'infoFilledBg', setCssVarColor('palette-info-main'));
171
211
  setColor(palette.Alert, 'successFilledBg', setCssVarColor('palette-success-main'));
172
212
  setColor(palette.Alert, 'warningFilledBg', setCssVarColor('palette-warning-main'));
173
- setColor(palette.Alert, 'errorFilledColor', silent(() => lightPalette.getContrastText(palette.error.main)));
174
- setColor(palette.Alert, 'infoFilledColor', silent(() => lightPalette.getContrastText(palette.info.main)));
175
- setColor(palette.Alert, 'successFilledColor', silent(() => lightPalette.getContrastText(palette.success.main)));
176
- setColor(palette.Alert, 'warningFilledColor', silent(() => lightPalette.getContrastText(palette.warning.main)));
213
+ setColor(palette.Alert, 'errorFilledColor', silent(() => palette.getContrastText(palette.error.main)));
214
+ setColor(palette.Alert, 'infoFilledColor', silent(() => palette.getContrastText(palette.info.main)));
215
+ setColor(palette.Alert, 'successFilledColor', silent(() => palette.getContrastText(palette.success.main)));
216
+ setColor(palette.Alert, 'warningFilledColor', silent(() => palette.getContrastText(palette.warning.main)));
177
217
  setColor(palette.Alert, 'errorStandardBg', (0, _colorManipulator.private_safeLighten)(palette.error.light, 0.9));
178
218
  setColor(palette.Alert, 'infoStandardBg', (0, _colorManipulator.private_safeLighten)(palette.info.light, 0.9));
179
219
  setColor(palette.Alert, 'successStandardBg', (0, _colorManipulator.private_safeLighten)(palette.success.light, 0.9));
@@ -207,7 +247,7 @@ function extendTheme(options = {}, ...args) {
207
247
  setColor(palette.Slider, 'warningTrack', (0, _colorManipulator.private_safeLighten)(palette.warning.main, 0.62));
208
248
  const snackbarContentBackground = (0, _colorManipulator.private_safeEmphasize)(palette.background.default, 0.8);
209
249
  setColor(palette.SnackbarContent, 'bg', snackbarContentBackground);
210
- setColor(palette.SnackbarContent, 'color', silent(() => lightPalette.getContrastText(snackbarContentBackground)));
250
+ setColor(palette.SnackbarContent, 'color', silent(() => palette.getContrastText(snackbarContentBackground)));
211
251
  setColor(palette.SpeedDialAction, 'fabHoverBg', (0, _colorManipulator.private_safeEmphasize)(palette.background.paper, 0.15));
212
252
  setColor(palette.StepConnector, 'border', setCssVarColor('palette-grey-400'));
213
253
  setColor(palette.StepContent, 'border', setCssVarColor('palette-grey-400'));
@@ -221,7 +261,8 @@ function extendTheme(options = {}, ...args) {
221
261
  setColor(palette.Switch, 'warningDisabledColor', (0, _colorManipulator.private_safeLighten)(palette.warning.main, 0.62));
222
262
  setColor(palette.TableCell, 'border', (0, _colorManipulator.private_safeLighten)((0, _colorManipulator.private_safeAlpha)(palette.divider, 1), 0.88));
223
263
  setColor(palette.Tooltip, 'bg', (0, _colorManipulator.private_safeAlpha)(palette.grey[700], 0.92));
224
- } else {
264
+ }
265
+ if (palette.mode === 'dark') {
225
266
  setColor(palette.Alert, 'errorColor', (0, _colorManipulator.private_safeLighten)(palette.error.light, 0.6));
226
267
  setColor(palette.Alert, 'infoColor', (0, _colorManipulator.private_safeLighten)(palette.info.light, 0.6));
227
268
  setColor(palette.Alert, 'successColor', (0, _colorManipulator.private_safeLighten)(palette.success.light, 0.6));
@@ -230,10 +271,10 @@ function extendTheme(options = {}, ...args) {
230
271
  setColor(palette.Alert, 'infoFilledBg', setCssVarColor('palette-info-dark'));
231
272
  setColor(palette.Alert, 'successFilledBg', setCssVarColor('palette-success-dark'));
232
273
  setColor(palette.Alert, 'warningFilledBg', setCssVarColor('palette-warning-dark'));
233
- setColor(palette.Alert, 'errorFilledColor', silent(() => darkPalette.getContrastText(palette.error.dark)));
234
- setColor(palette.Alert, 'infoFilledColor', silent(() => darkPalette.getContrastText(palette.info.dark)));
235
- setColor(palette.Alert, 'successFilledColor', silent(() => darkPalette.getContrastText(palette.success.dark)));
236
- setColor(palette.Alert, 'warningFilledColor', silent(() => darkPalette.getContrastText(palette.warning.dark)));
274
+ setColor(palette.Alert, 'errorFilledColor', silent(() => palette.getContrastText(palette.error.dark)));
275
+ setColor(palette.Alert, 'infoFilledColor', silent(() => palette.getContrastText(palette.info.dark)));
276
+ setColor(palette.Alert, 'successFilledColor', silent(() => palette.getContrastText(palette.success.dark)));
277
+ setColor(palette.Alert, 'warningFilledColor', silent(() => palette.getContrastText(palette.warning.dark)));
237
278
  setColor(palette.Alert, 'errorStandardBg', (0, _colorManipulator.private_safeDarken)(palette.error.light, 0.9));
238
279
  setColor(palette.Alert, 'infoStandardBg', (0, _colorManipulator.private_safeDarken)(palette.info.light, 0.9));
239
280
  setColor(palette.Alert, 'successStandardBg', (0, _colorManipulator.private_safeDarken)(palette.success.light, 0.9));
@@ -269,7 +310,7 @@ function extendTheme(options = {}, ...args) {
269
310
  setColor(palette.Slider, 'warningTrack', (0, _colorManipulator.private_safeDarken)(palette.warning.main, 0.5));
270
311
  const snackbarContentBackground = (0, _colorManipulator.private_safeEmphasize)(palette.background.default, 0.98);
271
312
  setColor(palette.SnackbarContent, 'bg', snackbarContentBackground);
272
- setColor(palette.SnackbarContent, 'color', silent(() => darkPalette.getContrastText(snackbarContentBackground)));
313
+ setColor(palette.SnackbarContent, 'color', silent(() => palette.getContrastText(snackbarContentBackground)));
273
314
  setColor(palette.SpeedDialAction, 'fabHoverBg', (0, _colorManipulator.private_safeEmphasize)(palette.background.paper, 0.15));
274
315
  setColor(palette.StepConnector, 'border', setCssVarColor('palette-grey-600'));
275
316
  setColor(palette.StepContent, 'border', setCssVarColor('palette-grey-600'));
@@ -332,16 +373,15 @@ function extendTheme(options = {}, ...args) {
332
373
  theme = args.reduce((acc, argument) => (0, _deepmerge.default)(acc, argument), theme);
333
374
  const parserConfig = {
334
375
  prefix: cssVarPrefix,
376
+ disableCssColorScheme,
335
377
  shouldSkipGeneratingVar,
336
- getSelector: getSelector || (0, _createGetSelector.default)(theme)
378
+ getSelector: (0, _createGetSelector.default)(theme)
337
379
  };
338
380
  const {
339
381
  vars,
340
382
  generateThemeVars,
341
383
  generateStyleSheets
342
384
  } = (0, _cssVars.prepareCssVars)(theme, parserConfig);
343
- theme.attribute = 'data-mui-color-scheme';
344
- theme.colorSchemeSelector = ':root';
345
385
  theme.vars = vars;
346
386
  Object.entries(theme.colorSchemes[theme.defaultColorScheme]).forEach(([key, value]) => {
347
387
  theme[key] = value;
@@ -351,7 +391,7 @@ function extendTheme(options = {}, ...args) {
351
391
  theme.generateSpacing = function generateSpacing() {
352
392
  return (0, _system.createSpacing)(input.spacing, (0, _spacing.createUnarySpacing)(this));
353
393
  };
354
- theme.getColorSchemeSelector = colorScheme => `[${theme.attribute}="${colorScheme}"] &`;
394
+ theme.getColorSchemeSelector = (0, _cssVars.createGetColorSchemeSelector)(selector);
355
395
  theme.spacing = theme.generateSpacing();
356
396
  theme.shouldSkipGeneratingVar = shouldSkipGeneratingVar;
357
397
  theme.unstable_sxConfig = {
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = shouldSkipGeneratingVar;
7
7
  function shouldSkipGeneratingVar(keys) {
8
8
  var _keys$;
9
- return !!keys[0].match(/(cssVarPrefix|typography|mixins|breakpoints|direction|transitions)/) || !!keys[0].match(/sxConfig$/) ||
9
+ return !!keys[0].match(/(cssVarPrefix|colorSchemeSelector|typography|mixins|breakpoints|direction|transitions)/) || !!keys[0].match(/sxConfig$/) ||
10
10
  // ends with sxConfig
11
11
  keys[0] === 'palette' && !!((_keys$ = keys[1]) != null && _keys$.match(/(mode|contrastThreshold|tonalOffset)/));
12
12
  }
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = getChildRef;
7
+ var React = _interopRequireWildcard(require("react"));
8
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
9
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
10
+ function getChildRef(child) {
11
+ if (!child || ! /*#__PURE__*/React.isValidElement(child)) {
12
+ return null;
13
+ }
14
+ // 'ref' is passed as prop in React 19, whereas 'ref' is directly attached to children in React 18
15
+ // below check is to ensure 'ref' is accessible in both cases
16
+ return child.props.propertyIsEnumerable('ref') ? child.props.ref : child.ref;
17
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/material",
3
- "version": "6.0.0-beta.2",
3
+ "version": "6.0.0-beta.3",
4
4
  "private": false,
5
5
  "author": "MUI Team",
6
6
  "description": "Material UI is an open-source React component library that implements Google's Material Design. It's comprehensive and can be used in production out of the box.",
@@ -35,10 +35,10 @@
35
35
  "prop-types": "^15.8.1",
36
36
  "react-is": "^18.3.1",
37
37
  "react-transition-group": "^4.4.5",
38
- "@mui/core-downloads-tracker": "^6.0.0-beta.2",
39
- "@mui/utils": "6.0.0-beta.1",
40
- "@mui/system": "6.0.0-beta.1",
41
- "@mui/types": "^7.2.14"
38
+ "@mui/system": "6.0.0-beta.3",
39
+ "@mui/core-downloads-tracker": "^6.0.0-beta.3",
40
+ "@mui/types": "^7.2.14",
41
+ "@mui/utils": "6.0.0-beta.3"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "@emotion/react": "^11.5.0",
@@ -46,7 +46,7 @@
46
46
  "@types/react": "^17.0.0 || ^18.0.0",
47
47
  "react": "^17.0.0 || ^18.0.0",
48
48
  "react-dom": "^17.0.0 || ^18.0.0",
49
- "@mui/material-pigment-css": "^6.0.0-beta.1"
49
+ "@mui/material-pigment-css": "^6.0.0-beta.3"
50
50
  },
51
51
  "peerDependenciesMeta": {
52
52
  "@types/react": {
@@ -4,15 +4,16 @@ declare const CssVarsProvider: (props: React.PropsWithChildren<Partial<import("@
4
4
  theme?: {
5
5
  cssVarPrefix?: string | undefined;
6
6
  colorSchemes: Record<SupportedColorScheme, Record<string, any>>;
7
+ colorSchemeSelector?: string | undefined;
7
8
  } | {
8
9
  $$material: {
9
10
  cssVarPrefix?: string | undefined;
10
11
  colorSchemes: Record<SupportedColorScheme, Record<string, any>>;
12
+ colorSchemeSelector?: string | undefined;
11
13
  };
12
14
  } | undefined;
13
15
  documentNode?: Document | null | undefined;
14
16
  colorSchemeNode?: Element | null | undefined;
15
- colorSchemeSelector?: string | undefined;
16
17
  storageWindow?: Window | null | undefined;
17
18
  disableNestedContext?: boolean | undefined;
18
19
  disableStyleSheetGeneration?: boolean | undefined;
@@ -16,7 +16,6 @@ const {
16
16
  } = createCssVarsProvider({
17
17
  themeId: THEME_ID,
18
18
  theme: defaultTheme,
19
- attribute: defaultConfig.attribute,
20
19
  colorSchemeStorageKey: defaultConfig.colorSchemeStorageKey,
21
20
  modeStorageKey: defaultConfig.modeStorageKey,
22
21
  defaultColorScheme: {
@@ -1,10 +1,14 @@
1
1
  declare const _default: <T extends {
2
- attribute: string;
3
- colorSchemeSelector: string;
2
+ colorSchemeSelector?: string | undefined;
4
3
  colorSchemes?: Record<string, any> | undefined;
5
4
  defaultColorScheme?: string | undefined;
6
5
  cssVarPrefix?: string | undefined;
7
6
  }>(theme: T) => (colorScheme: keyof T['colorSchemes'] | undefined, css: Record<string, any>) => string | {
7
+ ':root': Record<string, any>;
8
+ '@media (prefers-color-scheme: dark) { :root': Record<string, any>;
9
+ } | {
8
10
  [x: string]: Record<string, any>;
11
+ ':root': Record<string, any>;
12
+ '@media (prefers-color-scheme: dark) { :root'?: undefined;
9
13
  };
10
14
  export default _default;
@@ -1,5 +1,17 @@
1
1
  import excludeVariablesFromRoot from './excludeVariablesFromRoot';
2
2
  export default (theme => (colorScheme, css) => {
3
+ const selector = theme.colorSchemeSelector;
4
+ let rule = selector;
5
+ if (selector === 'class') {
6
+ rule = '.%s';
7
+ }
8
+ if (selector === 'data') {
9
+ rule = '[data-%s]';
10
+ }
11
+ if (selector?.startsWith('data-') && !selector.includes('%s')) {
12
+ // 'data-mui-color-scheme' -> '[data-mui-color-scheme="%s"]'
13
+ rule = `[${selector}="%s"]`;
14
+ }
3
15
  if (theme.defaultColorScheme === colorScheme) {
4
16
  if (colorScheme === 'dark') {
5
17
  const excludedVariables = {};
@@ -7,15 +19,32 @@ export default (theme => (colorScheme, css) => {
7
19
  excludedVariables[cssVar] = css[cssVar];
8
20
  delete css[cssVar];
9
21
  });
22
+ if (rule === 'media') {
23
+ return {
24
+ ':root': css,
25
+ '@media (prefers-color-scheme: dark) { :root': excludedVariables
26
+ };
27
+ }
28
+ if (rule) {
29
+ return {
30
+ [rule.replace('%s', colorScheme)]: excludedVariables,
31
+ ':root': css
32
+ };
33
+ }
10
34
  return {
11
- [`[${theme.attribute}="${String(colorScheme)}"]`]: excludedVariables,
12
- [theme.colorSchemeSelector]: css
35
+ ':root': {
36
+ ...css,
37
+ ...excludedVariables
38
+ }
13
39
  };
14
40
  }
15
- return `${theme.colorSchemeSelector}, [${theme.attribute}="${String(colorScheme)}"]`;
16
- }
17
- if (colorScheme) {
18
- return `[${theme.attribute}="${String(colorScheme)}"]`;
41
+ } else if (colorScheme) {
42
+ if (rule === 'media') {
43
+ return `@media (prefers-color-scheme: ${String(colorScheme)}) { :root`;
44
+ }
45
+ if (rule) {
46
+ return rule.replace('%s', String(colorScheme));
47
+ }
19
48
  }
20
- return theme.colorSchemeSelector;
49
+ return ':root';
21
50
  });
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @internal These variables should not appear in the :root stylesheet when the `defaultMode="dark"`
2
+ * @internal These variables should not appear in the :root stylesheet when the `defaultColorScheme="dark"`
3
3
  */
4
4
  declare const excludeVariablesFromRoot: (cssVarPrefix?: string) => string[];
5
5
  export default excludeVariablesFromRoot;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @internal These variables should not appear in the :root stylesheet when the `defaultMode="dark"`
2
+ * @internal These variables should not appear in the :root stylesheet when the `defaultColorScheme="dark"`
3
3
  */
4
4
  const excludeVariablesFromRoot = cssVarPrefix => [...[...Array(24)].map((_, index) => `--${cssVarPrefix ? `${cssVarPrefix}-` : ''}overlays-${index + 1}`), `--${cssVarPrefix ? `${cssVarPrefix}-` : ''}palette-AppBar-darkBg`, `--${cssVarPrefix ? `${cssVarPrefix}-` : ''}palette-AppBar-darkColor`];
5
5
  export default excludeVariablesFromRoot;
@@ -276,6 +276,10 @@ export interface ColorSystem {
276
276
  }
277
277
 
278
278
  export interface CssVarsThemeOptions extends Omit<ThemeOptions, 'palette' | 'components'> {
279
+ /**
280
+ * @default 'light'
281
+ */
282
+ defaultColorScheme?: SupportedColorScheme;
279
283
  /**
280
284
  * Prefix of the generated CSS variables
281
285
  * @default 'mui'
@@ -288,27 +292,27 @@ export interface CssVarsThemeOptions extends Omit<ThemeOptions, 'palette' | 'com
288
292
  /**
289
293
  * Color schemes configuration
290
294
  */
291
- colorSchemes?: Partial<Record<SupportedColorScheme, ColorSystemOptions>>;
295
+ colorSchemes?: Partial<Record<DefaultColorScheme, boolean | ColorSystemOptions>> &
296
+ (ExtendedColorScheme extends string ? Record<ExtendedColorScheme, ColorSystemOptions> : {});
292
297
  /**
293
- * If provided, it will be used to create a selector for the color scheme.
294
- * This is useful if you want to use class or data-* attributes to apply the color scheme.
298
+ * The strategy to generate CSS variables
295
299
  *
296
- * The callback receives the colorScheme with the possible values of:
297
- * - undefined: the selector for tokens that are not color scheme dependent
298
- * - string: the selector for the color scheme
300
+ * @example 'media'
301
+ * Generate CSS variables using [prefers-color-scheme](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme)
299
302
  *
300
- * @example
301
- * // class selector
302
- * (colorScheme) => colorScheme !== 'light' ? `.theme-${colorScheme}` : ":root"
303
+ * @example '.mode-%s'
304
+ * Generate CSS variables within a class .mode-light, .mode-dark
303
305
  *
304
- * @example
305
- * // data-* attribute selector
306
- * (colorScheme) => colorScheme !== 'light' ? `[data-theme="${colorScheme}"`] : ":root"
306
+ * @example '[data-mode-%s]'
307
+ * Generate CSS variables within a data attribute [data-mode-light], [data-mode-dark]
308
+ */
309
+ colorSchemeSelector?: 'media' | 'class' | 'data' | string;
310
+ /**
311
+ * If `true`, the CSS color-scheme will not be set.
312
+ * https://developer.mozilla.org/en-US/docs/Web/CSS/color-scheme
313
+ * @default false
307
314
  */
308
- getSelector?: (
309
- colorScheme: SupportedColorScheme | undefined,
310
- css: Record<string, any>,
311
- ) => string | Record<string, any>;
315
+ disableCssColorScheme?: boolean;
312
316
  /**
313
317
  * A function to determine if the key, value should be attached as CSS Variable
314
318
  * `keys` is an array that represents the object path keys.
@@ -427,6 +431,7 @@ export type ThemeCssVar = OverridableStringUnion<
427
431
  */
428
432
  export interface CssVarsTheme extends ColorSystem {
429
433
  colorSchemes: Record<SupportedColorScheme, ColorSystem>;
434
+ colorSchemeSelector: 'media' | 'class' | 'data' | string;
430
435
  cssVarPrefix: string;
431
436
  vars: ThemeVars;
432
437
  getCssVar: (field: ThemeCssVar, ...vars: ThemeCssVar[]) => string;