@mui/system 6.0.0-beta.0 → 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 (36) hide show
  1. package/CHANGELOG.md +473 -31
  2. package/InitColorSchemeScript/InitColorSchemeScript.d.ts +3 -5
  3. package/InitColorSchemeScript/InitColorSchemeScript.js +26 -7
  4. package/Unstable_Grid/createGrid.js +2 -2
  5. package/createTheme/applyStyles.js +10 -4
  6. package/cssVars/createCssVarsProvider.d.ts +2 -11
  7. package/cssVars/createCssVarsProvider.js +33 -72
  8. package/cssVars/createCssVarsTheme.d.ts +2 -1
  9. package/cssVars/createCssVarsTheme.js +10 -2
  10. package/cssVars/getColorSchemeSelector.d.ts +1 -0
  11. package/cssVars/getColorSchemeSelector.js +26 -0
  12. package/cssVars/index.d.ts +1 -0
  13. package/cssVars/index.js +2 -1
  14. package/cssVars/prepareCssVars.d.ts +3 -2
  15. package/cssVars/prepareCssVars.js +58 -16
  16. package/cssVars/useCurrentColorScheme.d.ts +2 -2
  17. package/index.js +1 -1
  18. package/modern/InitColorSchemeScript/InitColorSchemeScript.js +26 -7
  19. package/modern/Unstable_Grid/createGrid.js +2 -2
  20. package/modern/createTheme/applyStyles.js +10 -4
  21. package/modern/cssVars/createCssVarsProvider.js +33 -72
  22. package/modern/cssVars/createCssVarsTheme.js +10 -2
  23. package/modern/cssVars/getColorSchemeSelector.js +26 -0
  24. package/modern/cssVars/index.js +2 -1
  25. package/modern/cssVars/prepareCssVars.js +58 -16
  26. package/modern/index.js +1 -1
  27. package/node/InitColorSchemeScript/InitColorSchemeScript.js +26 -7
  28. package/node/Unstable_Grid/createGrid.js +2 -2
  29. package/node/createTheme/applyStyles.js +11 -4
  30. package/node/cssVars/createCssVarsProvider.js +33 -72
  31. package/node/cssVars/createCssVarsTheme.js +10 -2
  32. package/node/cssVars/getColorSchemeSelector.js +32 -0
  33. package/node/cssVars/index.js +8 -1
  34. package/node/cssVars/prepareCssVars.js +61 -16
  35. package/node/index.js +1 -1
  36. package/package.json +7 -7
@@ -28,17 +28,12 @@ function createCssVarsProvider(options) {
28
28
  * It should also ideally have a vars object created using `prepareCssVars`.
29
29
  */
30
30
  theme: defaultTheme = {},
31
- attribute: defaultAttribute = _InitColorSchemeScript.DEFAULT_ATTRIBUTE,
32
31
  modeStorageKey: defaultModeStorageKey = _InitColorSchemeScript.DEFAULT_MODE_STORAGE_KEY,
33
32
  colorSchemeStorageKey: defaultColorSchemeStorageKey = _InitColorSchemeScript.DEFAULT_COLOR_SCHEME_STORAGE_KEY,
34
- defaultMode: designSystemMode = 'light',
35
- defaultColorScheme: designSystemColorScheme,
36
33
  disableTransitionOnChange: designSystemTransitionOnChange = false,
34
+ defaultColorScheme,
37
35
  resolveTheme
38
36
  } = options;
39
- if (!defaultTheme.colorSchemes || typeof designSystemColorScheme === 'string' && !defaultTheme.colorSchemes[designSystemColorScheme] || typeof designSystemColorScheme === 'object' && !defaultTheme.colorSchemes[designSystemColorScheme == null ? void 0 : designSystemColorScheme.light] || typeof designSystemColorScheme === 'object' && !defaultTheme.colorSchemes[designSystemColorScheme == null ? void 0 : designSystemColorScheme.dark]) {
40
- console.error(`MUI: \`${designSystemColorScheme}\` does not exist in \`theme.colorSchemes\`.`);
41
- }
42
37
  const ColorSchemeContext = /*#__PURE__*/React.createContext(undefined);
43
38
  if (process.env.NODE_ENV !== 'production') {
44
39
  ColorSchemeContext.displayName = 'ColorSchemeContext';
@@ -51,20 +46,16 @@ function createCssVarsProvider(options) {
51
46
  return value;
52
47
  };
53
48
  function CssVarsProvider(props) {
54
- var _restThemeProp$genera, _theme$generateStyleS;
49
+ var _colorSchemes$restThe, _restThemeProp$genera, _theme$generateStyleS;
55
50
  const {
56
51
  children,
57
52
  theme: themeProp = defaultTheme,
58
53
  modeStorageKey = defaultModeStorageKey,
59
54
  colorSchemeStorageKey = defaultColorSchemeStorageKey,
60
- attribute = defaultAttribute,
61
- defaultMode = designSystemMode,
62
- defaultColorScheme = designSystemColorScheme,
63
55
  disableTransitionOnChange = designSystemTransitionOnChange,
64
56
  storageWindow = typeof window === 'undefined' ? undefined : window,
65
57
  documentNode = typeof document === 'undefined' ? undefined : document,
66
58
  colorSchemeNode = typeof document === 'undefined' ? undefined : document.documentElement,
67
- colorSchemeSelector = ':root',
68
59
  disableNestedContext = false,
69
60
  disableStyleSheetGeneration = false
70
61
  } = props;
@@ -79,9 +70,11 @@ function createCssVarsProvider(options) {
79
70
  cssVarPrefix,
80
71
  ...restThemeProp
81
72
  } = scopedTheme || themeProp;
82
- const allColorSchemes = Object.keys(colorSchemes);
73
+ const joinedColorSchemes = Object.keys(colorSchemes).filter(k => !!colorSchemes[k]).join(',');
74
+ const allColorSchemes = React.useMemo(() => joinedColorSchemes.split(','), [joinedColorSchemes]);
83
75
  const defaultLightColorScheme = typeof defaultColorScheme === 'string' ? defaultColorScheme : defaultColorScheme.light;
84
76
  const defaultDarkColorScheme = typeof defaultColorScheme === 'string' ? defaultColorScheme : defaultColorScheme.dark;
77
+ const defaultMode = colorSchemes[defaultLightColorScheme] && colorSchemes[defaultDarkColorScheme] ? 'system' : (_colorSchemes$restThe = colorSchemes[restThemeProp.defaultColorScheme]) == null || (_colorSchemes$restThe = _colorSchemes$restThe.palette) == null ? void 0 : _colorSchemes$restThe.mode;
85
78
 
86
79
  // 1. Get the data about the `mode`, `colorScheme`, and setter functions.
87
80
  const {
@@ -107,27 +100,9 @@ function createCssVarsProvider(options) {
107
100
  mode = ctx.mode;
108
101
  colorScheme = ctx.colorScheme;
109
102
  }
110
- const calculatedMode = (() => {
111
- if (mode) {
112
- return mode;
113
- }
114
- // This scope occurs on the server
115
- if (defaultMode === 'system') {
116
- return designSystemMode;
117
- }
118
- return defaultMode;
119
- })();
120
- const calculatedColorScheme = (() => {
121
- if (!colorScheme) {
122
- // This scope occurs on the server
123
- if (calculatedMode === 'dark') {
124
- return defaultDarkColorScheme;
125
- }
126
- // use light color scheme, if default mode is 'light' | 'system'
127
- return defaultLightColorScheme;
128
- }
129
- return colorScheme;
130
- })();
103
+
104
+ // `colorScheme` is undefined on the server
105
+ const calculatedColorScheme = colorScheme || restThemeProp.defaultColorScheme;
131
106
 
132
107
  // 2. get the `vars` object that refers to the CSS custom properties
133
108
  const themeVars = ((_restThemeProp$genera = restThemeProp.generateThemeVars) == null ? void 0 : _restThemeProp$genera.call(restThemeProp)) || restThemeProp.vars;
@@ -164,30 +139,34 @@ function createCssVarsProvider(options) {
164
139
  }
165
140
  }
166
141
  });
167
- const resolvedDefaultColorScheme = (() => {
168
- if (typeof defaultColorScheme === 'string') {
169
- return defaultColorScheme;
170
- }
171
- if (defaultMode === 'dark') {
172
- return defaultColorScheme.dark;
173
- }
174
- return defaultColorScheme.light;
175
- })();
176
- themeProp.defaultColorScheme = resolvedDefaultColorScheme;
177
- themeProp.colorSchemeSelector = colorSchemeSelector;
178
- themeProp.attribute = attribute;
179
- if (!theme.getColorSchemeSelector) {
180
- theme.getColorSchemeSelector = targetColorScheme => `[${attribute}="${targetColorScheme}"] &`;
181
- }
182
142
 
183
143
  // 5. Declaring effects
184
144
  // 5.1 Updates the selector value to use the current color scheme which tells CSS to use the proper stylesheet.
145
+ const colorSchemeSelector = restThemeProp.colorSchemeSelector;
185
146
  React.useEffect(() => {
186
- if (colorScheme && colorSchemeNode) {
187
- // attaches attribute to <html> because the css variables are attached to :root (html)
188
- colorSchemeNode.setAttribute(attribute, colorScheme);
147
+ if (colorScheme && colorSchemeNode && colorSchemeSelector && colorSchemeSelector !== 'media') {
148
+ const selector = colorSchemeSelector.replace('%s', colorScheme);
149
+ if (selector.startsWith('.')) {
150
+ colorSchemeNode.classList.remove(...allColorSchemes.map(scheme => colorSchemeSelector.substring(1).replace('%s', scheme)));
151
+ colorSchemeNode.classList.add(selector.substring(1));
152
+ } else {
153
+ const matches = selector.match(/\[([^\]]+)\]/);
154
+ if (matches) {
155
+ const [attr, value] = matches[1].split('=');
156
+ if (!value) {
157
+ // for attributes like `data-theme-dark`, `data-theme-light`
158
+ // remove all the existing data attributes before setting the new one
159
+ allColorSchemes.forEach(scheme => {
160
+ colorSchemeNode.removeAttribute(attr.replace(colorScheme, scheme));
161
+ });
162
+ }
163
+ colorSchemeNode.setAttribute(attr, value ? value.replace(/"|'/g, '') : '');
164
+ } else {
165
+ colorSchemeNode.setAttribute(selector, colorScheme);
166
+ }
167
+ }
189
168
  }
190
- }, [colorScheme, attribute, colorSchemeNode]);
169
+ }, [colorScheme, colorSchemeSelector, colorSchemeNode, allColorSchemes]);
191
170
 
192
171
  // 5.2 Remove the CSS transition when color scheme changes to create instant experience.
193
172
  // credit: https://github.com/pacocoursey/next-themes/blob/b5c2bad50de2d61ad7b52a9c5cdc801a78507d7a/index.tsx#L313
@@ -248,10 +227,6 @@ function createCssVarsProvider(options) {
248
227
  });
249
228
  }
250
229
  process.env.NODE_ENV !== "production" ? CssVarsProvider.propTypes = {
251
- /**
252
- * The body attribute name to attach colorScheme.
253
- */
254
- attribute: _propTypes.default.string,
255
230
  /**
256
231
  * The component tree.
257
232
  */
@@ -260,22 +235,10 @@ function createCssVarsProvider(options) {
260
235
  * The node used to attach the color-scheme attribute
261
236
  */
262
237
  colorSchemeNode: _propTypes.default.any,
263
- /**
264
- * The CSS selector for attaching the generated custom properties
265
- */
266
- colorSchemeSelector: _propTypes.default.string,
267
238
  /**
268
239
  * localStorage key used to store `colorScheme`
269
240
  */
270
241
  colorSchemeStorageKey: _propTypes.default.string,
271
- /**
272
- * The initial color scheme used.
273
- */
274
- defaultColorScheme: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.object]),
275
- /**
276
- * The initial mode used.
277
- */
278
- defaultMode: _propTypes.default.string,
279
242
  /**
280
243
  * If `true`, the provider creates its own context and generate stylesheet as if it is a root `CssVarsProvider`.
281
244
  */
@@ -308,12 +271,10 @@ function createCssVarsProvider(options) {
308
271
  */
309
272
  theme: _propTypes.default.object
310
273
  } : void 0;
311
- const defaultLightColorScheme = typeof designSystemColorScheme === 'string' ? designSystemColorScheme : designSystemColorScheme.light;
312
- const defaultDarkColorScheme = typeof designSystemColorScheme === 'string' ? designSystemColorScheme : designSystemColorScheme.dark;
274
+ const defaultLightColorScheme = typeof defaultColorScheme === 'string' ? defaultColorScheme : defaultColorScheme.light;
275
+ const defaultDarkColorScheme = typeof defaultColorScheme === 'string' ? defaultColorScheme : defaultColorScheme.dark;
313
276
  const getInitColorSchemeScript = params => (0, _InitColorSchemeScript.default)({
314
- attribute: defaultAttribute,
315
277
  colorSchemeStorageKey: defaultColorSchemeStorageKey,
316
- defaultMode: designSystemMode,
317
278
  defaultLightColorScheme,
318
279
  defaultDarkColorScheme,
319
280
  modeStorageKey: defaultModeStorageKey,
@@ -6,15 +6,23 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  var _prepareCssVars = _interopRequireDefault(require("./prepareCssVars"));
9
- function createCssVarsTheme(theme) {
9
+ var _getColorSchemeSelector = require("./getColorSchemeSelector");
10
+ var _InitColorSchemeScript = require("../InitColorSchemeScript/InitColorSchemeScript");
11
+ function createCssVarsTheme({
12
+ colorSchemeSelector = `[${_InitColorSchemeScript.DEFAULT_ATTRIBUTE}="%s"]`,
13
+ ...theme
14
+ }) {
10
15
  const output = theme;
11
16
  const result = (0, _prepareCssVars.default)(output, {
12
17
  ...theme,
13
- prefix: theme.cssVarPrefix
18
+ prefix: theme.cssVarPrefix,
19
+ colorSchemeSelector
14
20
  });
15
21
  output.vars = result.vars;
16
22
  output.generateThemeVars = result.generateThemeVars;
17
23
  output.generateStyleSheets = result.generateStyleSheets;
24
+ output.colorSchemeSelector = colorSchemeSelector;
25
+ output.getColorSchemeSelector = (0, _getColorSchemeSelector.createGetColorSchemeSelector)(colorSchemeSelector);
18
26
  return output;
19
27
  }
20
28
  var _default = exports.default = createCssVarsTheme;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createGetColorSchemeSelector = createGetColorSchemeSelector;
7
+ /* eslint-disable import/prefer-default-export */
8
+ function createGetColorSchemeSelector(selector) {
9
+ return function getColorSchemeSelector(colorScheme) {
10
+ if (selector === 'media') {
11
+ if (process.env.NODE_ENV !== 'production') {
12
+ if (colorScheme !== 'light' && colorScheme !== 'dark') {
13
+ console.error(`MUI: @media (prefers-color-scheme) supports only 'light' or 'dark', but receive '${colorScheme}'.`);
14
+ }
15
+ }
16
+ return `@media (prefers-color-scheme: ${colorScheme})`;
17
+ }
18
+ if (selector) {
19
+ if (selector.startsWith('data-') && !selector.includes('%s')) {
20
+ return `[${selector}="${colorScheme}"] &`;
21
+ }
22
+ if (selector === 'class') {
23
+ return `.${colorScheme} &`;
24
+ }
25
+ if (selector === 'data') {
26
+ return `[data-${colorScheme}] &`;
27
+ }
28
+ return `${selector.replace('%s', colorScheme)} &`;
29
+ }
30
+ return '&';
31
+ };
32
+ }
@@ -11,6 +11,12 @@ Object.defineProperty(exports, "createCssVarsTheme", {
11
11
  return _createCssVarsTheme.default;
12
12
  }
13
13
  });
14
+ Object.defineProperty(exports, "createGetColorSchemeSelector", {
15
+ enumerable: true,
16
+ get: function () {
17
+ return _getColorSchemeSelector.createGetColorSchemeSelector;
18
+ }
19
+ });
14
20
  Object.defineProperty(exports, "default", {
15
21
  enumerable: true,
16
22
  get: function () {
@@ -32,4 +38,5 @@ Object.defineProperty(exports, "prepareTypographyVars", {
32
38
  var _createCssVarsProvider = _interopRequireDefault(require("./createCssVarsProvider"));
33
39
  var _prepareCssVars = _interopRequireDefault(require("./prepareCssVars"));
34
40
  var _prepareTypographyVars = _interopRequireDefault(require("./prepareTypographyVars"));
35
- var _createCssVarsTheme = _interopRequireDefault(require("./createCssVarsTheme"));
41
+ var _createCssVarsTheme = _interopRequireDefault(require("./createCssVarsTheme"));
42
+ var _getColorSchemeSelector = require("./getColorSchemeSelector");
@@ -7,10 +7,12 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.default = void 0;
8
8
  var _deepmerge = _interopRequireDefault(require("@mui/utils/deepmerge"));
9
9
  var _cssVarsParser = _interopRequireDefault(require("./cssVarsParser"));
10
- function prepareCssVars(theme, {
11
- getSelector,
12
- ...parserConfig
13
- } = {}) {
10
+ function prepareCssVars(theme, parserConfig = {}) {
11
+ const {
12
+ getSelector = defaultGetSelector,
13
+ disableCssColorScheme,
14
+ colorSchemeSelector: selector
15
+ } = parserConfig;
14
16
  // @ts-ignore - ignore components do not exist
15
17
  const {
16
18
  colorSchemes = {},
@@ -54,6 +56,33 @@ function prepareCssVars(theme, {
54
56
  vars
55
57
  };
56
58
  }
59
+ function defaultGetSelector(colorScheme) {
60
+ let rule = selector;
61
+ if (selector === 'class') {
62
+ rule = '.%s';
63
+ }
64
+ if (selector === 'data') {
65
+ rule = '[data-%s]';
66
+ }
67
+ if (selector != null && selector.startsWith('data-') && !selector.includes('%s')) {
68
+ // 'data-joy-color-scheme' -> '[data-joy-color-scheme="%s"]'
69
+ rule = `[${selector}="%s"]`;
70
+ }
71
+ if (colorScheme) {
72
+ if (rule === 'media') {
73
+ var _colorSchemes;
74
+ if (theme.defaultColorScheme === colorScheme) {
75
+ return ':root';
76
+ }
77
+ const mode = ((_colorSchemes = colorSchemes[colorScheme]) == null || (_colorSchemes = _colorSchemes.palette) == null ? void 0 : _colorSchemes.mode) || colorScheme;
78
+ return `@media (prefers-color-scheme: ${mode}) { :root`;
79
+ }
80
+ if (rule) {
81
+ return rule.replace('%s', String(colorScheme));
82
+ }
83
+ }
84
+ return ':root';
85
+ }
57
86
  const generateThemeVars = () => {
58
87
  let vars = {
59
88
  ...rootVars
@@ -68,37 +97,53 @@ function prepareCssVars(theme, {
68
97
  const generateStyleSheets = () => {
69
98
  const stylesheets = [];
70
99
  const colorScheme = theme.defaultColorScheme || 'light';
71
- function insertStyleSheet(selector, css) {
100
+ function insertStyleSheet(key, css) {
72
101
  if (Object.keys(css).length) {
73
- stylesheets.push(typeof selector === 'string' ? {
74
- [selector]: {
102
+ stylesheets.push(typeof key === 'string' ? {
103
+ [key]: {
75
104
  ...css
76
105
  }
77
- } : selector);
106
+ } : key);
78
107
  }
79
108
  }
80
- insertStyleSheet((getSelector == null ? void 0 : getSelector(undefined, {
109
+ insertStyleSheet(getSelector(undefined, {
81
110
  ...rootCss
82
- })) || ':root', rootCss);
111
+ }), rootCss);
83
112
  const {
84
113
  [colorScheme]: defaultSchemeVal,
85
- ...rest
114
+ ...other
86
115
  } = colorSchemesMap;
87
116
  if (defaultSchemeVal) {
117
+ var _colorSchemes$colorSc;
88
118
  // default color scheme has to come before other color schemes
89
119
  const {
90
120
  css
91
121
  } = defaultSchemeVal;
92
- insertStyleSheet((getSelector == null ? void 0 : getSelector(colorScheme, {
122
+ const cssColorSheme = (_colorSchemes$colorSc = colorSchemes[colorScheme]) == null || (_colorSchemes$colorSc = _colorSchemes$colorSc.palette) == null ? void 0 : _colorSchemes$colorSc.mode;
123
+ const finalCss = !disableCssColorScheme && cssColorSheme ? {
124
+ colorScheme: cssColorSheme,
93
125
  ...css
94
- })) || `[${theme.attribute || 'data-color-scheme'}="${colorScheme}"]`, css);
126
+ } : {
127
+ ...css
128
+ };
129
+ insertStyleSheet(getSelector(colorScheme, {
130
+ ...finalCss
131
+ }), finalCss);
95
132
  }
96
- Object.entries(rest).forEach(([key, {
133
+ Object.entries(other).forEach(([key, {
97
134
  css
98
135
  }]) => {
99
- insertStyleSheet((getSelector == null ? void 0 : getSelector(key, {
136
+ var _colorSchemes$key;
137
+ const cssColorSheme = (_colorSchemes$key = colorSchemes[key]) == null || (_colorSchemes$key = _colorSchemes$key.palette) == null ? void 0 : _colorSchemes$key.mode;
138
+ const finalCss = !disableCssColorScheme && cssColorSheme ? {
139
+ colorScheme: cssColorSheme,
140
+ ...css
141
+ } : {
100
142
  ...css
101
- })) || `[${theme.attribute || 'data-color-scheme'}="${key}"]`, css);
143
+ };
144
+ insertStyleSheet(getSelector(key, {
145
+ ...finalCss
146
+ }), finalCss);
102
147
  });
103
148
  return stylesheets;
104
149
  };
package/node/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/system v6.0.0-beta.0
2
+ * @mui/system v6.0.0-beta.3
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/system",
3
- "version": "6.0.0-beta.0",
3
+ "version": "6.0.0-beta.3",
4
4
  "private": false,
5
5
  "author": "MUI Team",
6
6
  "description": "MUI System is a set of CSS utilities to help you build custom designs more efficiently. It makes it possible to rapidly lay out custom designs.",
@@ -26,14 +26,14 @@
26
26
  "url": "https://opencollective.com/mui-org"
27
27
  },
28
28
  "dependencies": {
29
- "@babel/runtime": "^7.24.7",
29
+ "@babel/runtime": "^7.24.8",
30
30
  "clsx": "^2.1.1",
31
31
  "csstype": "^3.1.3",
32
32
  "prop-types": "^15.8.1",
33
- "@mui/private-theming": "6.0.0-beta.0",
34
- "@mui/utils": "6.0.0-beta.0",
35
- "@mui/styled-engine": "6.0.0-beta.0",
36
- "@mui/types": "^7.2.14"
33
+ "@mui/private-theming": "6.0.0-beta.3",
34
+ "@mui/styled-engine": "6.0.0-beta.3",
35
+ "@mui/types": "^7.2.14",
36
+ "@mui/utils": "6.0.0-beta.3"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "@emotion/react": "^11.5.0",
@@ -58,7 +58,7 @@
58
58
  "directory": "build"
59
59
  },
60
60
  "engines": {
61
- "node": ">=12.0.0"
61
+ "node": ">=14.0.0"
62
62
  },
63
63
  "module": "./index.js",
64
64
  "types": "./index.d.ts"