@mui/system 5.16.14 → 5.18.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,52 @@
1
1
  # [Versions](https://mui.com/versions/)
2
2
 
3
+ ## 5.18.0
4
+
5
+ <!-- generated comparing v5.17.1..v5.x -->
6
+
7
+ _Jun 26, 2025_
8
+
9
+ A big thanks to the 2 contributors who made this release possible.
10
+
11
+ CSS layers make it easier to override styles by splitting a single style sheet into multiple layers.
12
+ To learn more, check out the [CSS layers documentation](https://v5.mui.com/material-ui/customization/css-layers/).
13
+
14
+ ### `@mui/system@5.18.0`
15
+
16
+ - Backport CSS layers from v7 (#46320) @siriwatknp
17
+
18
+ ### `@mui/material-nextjs@5.18.0`
19
+
20
+ - Backport CSS layers from v7 (#46320) @siriwatknp
21
+
22
+ ### Docs
23
+
24
+ - Ease migration to v5 (#45991) @oliviertassinari
25
+ - Add AccordionSummary to the breaking change migration (@siriwatknp) (#45972) @siriwatknp
26
+
27
+ All contributors of this release in alphabetical order: @oliviertassinari, @siriwatknp
28
+
29
+ ## v5.17.1
30
+
31
+ <!-- generated comparing v5.17.0..v5.x -->
32
+
33
+ _Mar 18, 2025_
34
+
35
+ This release fixes the `@mui/types` dependencies in all packages to fix a package layout bug (#45612) @DiegoAndai
36
+
37
+ ## v5.17.0
38
+
39
+ _Mar 18, 2025_
40
+
41
+ A big thanks to the 2 contributors who made this release possible.
42
+
43
+ ### `@mui/material@5.17.0`
44
+
45
+ - [TextareaAutosize] Temporarily disconnect ResizeObserver to avoid loop error (#44540) (#45238) @DiegoAndai
46
+ - Support nested theme when upper theme is CSS vars theme (#45604) @siriwatknp
47
+
48
+ All contributors of this release in alphabetical order: @DiegoAndai, @siriwatknp
49
+
3
50
  ## v5.16.14
4
51
 
5
52
  <!-- generated comparing v5.16.13..v5.x -->
@@ -13,13 +13,37 @@ var _useTheme = _interopRequireDefault(require("../useTheme"));
13
13
  var _jsxRuntime = require("react/jsx-runtime");
14
14
  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); }
15
15
  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 && Object.prototype.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; }
16
+ function wrapGlobalLayer(styles) {
17
+ const serialized = (0, _styledEngine.internal_serializeStyles)(styles);
18
+ if (styles !== serialized && serialized.styles) {
19
+ if (!serialized.styles.match(/^@layer\s+[^{]*$/)) {
20
+ // If the styles are not already wrapped in a layer, wrap them in a global layer.
21
+ serialized.styles = `@layer global{${serialized.styles}}`;
22
+ }
23
+ return serialized;
24
+ }
25
+ return styles;
26
+ }
16
27
  function GlobalStyles({
17
28
  styles,
18
29
  themeId,
19
30
  defaultTheme = {}
20
31
  }) {
21
32
  const upperTheme = (0, _useTheme.default)(defaultTheme);
22
- const globalStyles = typeof styles === 'function' ? styles(themeId ? upperTheme[themeId] || upperTheme : upperTheme) : styles;
33
+ const resolvedTheme = themeId ? upperTheme[themeId] || upperTheme : upperTheme;
34
+ let globalStyles = typeof styles === 'function' ? styles(resolvedTheme) : styles;
35
+ if (resolvedTheme.modularCssLayers) {
36
+ if (Array.isArray(globalStyles)) {
37
+ globalStyles = globalStyles.map(styleArg => {
38
+ if (typeof styleArg === 'function') {
39
+ return wrapGlobalLayer(styleArg(resolvedTheme));
40
+ }
41
+ return wrapGlobalLayer(styleArg);
42
+ });
43
+ } else {
44
+ globalStyles = wrapGlobalLayer(globalStyles);
45
+ }
46
+ }
23
47
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_styledEngine.GlobalStyles, {
24
48
  styles: globalStyles
25
49
  });
@@ -15,6 +15,7 @@ var _styledEngine = require("@mui/styled-engine");
15
15
  var _useThemeWithoutDefault = _interopRequireDefault(require("../useThemeWithoutDefault"));
16
16
  var _RtlProvider = _interopRequireDefault(require("../RtlProvider"));
17
17
  var _DefaultPropsProvider = _interopRequireDefault(require("../DefaultPropsProvider"));
18
+ var _useLayerOrder = _interopRequireDefault(require("./useLayerOrder"));
18
19
  var _jsxRuntime = require("react/jsx-runtime");
19
20
  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); }
20
21
  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 && Object.prototype.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; }
@@ -63,15 +64,16 @@ function ThemeProvider(props) {
63
64
  const engineTheme = useThemeScoping(themeId, upperTheme, localTheme);
64
65
  const privateTheme = useThemeScoping(themeId, upperPrivateTheme, localTheme, true);
65
66
  const rtlValue = engineTheme.direction === 'rtl';
67
+ const layerOrder = (0, _useLayerOrder.default)(engineTheme);
66
68
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_privateTheming.ThemeProvider, {
67
69
  theme: privateTheme,
68
70
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_styledEngine.ThemeContext.Provider, {
69
71
  value: engineTheme,
70
72
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_RtlProvider.default, {
71
73
  value: rtlValue,
72
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_DefaultPropsProvider.default, {
74
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_DefaultPropsProvider.default, {
73
75
  value: engineTheme == null ? void 0 : engineTheme.components,
74
- children: children
76
+ children: [layerOrder, children]
75
77
  })
76
78
  })
77
79
  })
@@ -0,0 +1,8 @@
1
+ import * as React from 'react';
2
+ /**
3
+ * This hook returns a `GlobalStyles` component that sets the CSS layer order (for server-side rendering).
4
+ * Then on client-side, it injects the CSS layer order into the document head to ensure that the layer order is always present first before other Emotion styles.
5
+ */
6
+ export default function useLayerOrder(theme: {
7
+ modularCssLayers?: boolean | string;
8
+ }): React.JSX.Element | null;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ 'use client';
3
+
4
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = useLayerOrder;
9
+ var React = _interopRequireWildcard(require("react"));
10
+ var _useEnhancedEffect = _interopRequireDefault(require("@mui/utils/useEnhancedEffect"));
11
+ var _useId = _interopRequireDefault(require("@mui/utils/useId"));
12
+ var _GlobalStyles = _interopRequireDefault(require("../GlobalStyles"));
13
+ var _useThemeWithoutDefault = _interopRequireDefault(require("../useThemeWithoutDefault"));
14
+ var _jsxRuntime = require("react/jsx-runtime");
15
+ 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); }
16
+ 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 && Object.prototype.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; }
17
+ /**
18
+ * This hook returns a `GlobalStyles` component that sets the CSS layer order (for server-side rendering).
19
+ * Then on client-side, it injects the CSS layer order into the document head to ensure that the layer order is always present first before other Emotion styles.
20
+ */function useLayerOrder(theme) {
21
+ const upperTheme = (0, _useThemeWithoutDefault.default)();
22
+ const id = (0, _useId.default)() || '';
23
+ const {
24
+ modularCssLayers
25
+ } = theme;
26
+ let layerOrder = 'mui.global, mui.components, mui.theme, mui.custom, mui.sx';
27
+ if (!modularCssLayers || upperTheme !== null) {
28
+ // skip this hook if upper theme exists.
29
+ layerOrder = '';
30
+ } else if (typeof modularCssLayers === 'string') {
31
+ layerOrder = modularCssLayers.replace(/mui(?!\.)/g, layerOrder);
32
+ } else {
33
+ layerOrder = `@layer ${layerOrder};`;
34
+ }
35
+ (0, _useEnhancedEffect.default)(() => {
36
+ const head = document.querySelector('head');
37
+ if (!head) {
38
+ return;
39
+ }
40
+ const firstChild = head.firstChild;
41
+ if (layerOrder) {
42
+ var _firstChild$hasAttrib;
43
+ // Only insert if first child doesn't have data-mui-layer-order attribute
44
+ if (firstChild && (_firstChild$hasAttrib = firstChild.hasAttribute) != null && _firstChild$hasAttrib.call(firstChild, 'data-mui-layer-order') && firstChild.getAttribute('data-mui-layer-order') === id) {
45
+ return;
46
+ }
47
+ const styleElement = document.createElement('style');
48
+ styleElement.setAttribute('data-mui-layer-order', id);
49
+ styleElement.textContent = layerOrder;
50
+ head.prepend(styleElement);
51
+ } else {
52
+ var _head$querySelector;
53
+ (_head$querySelector = head.querySelector(`style[data-mui-layer-order="${id}"]`)) == null || _head$querySelector.remove();
54
+ }
55
+ }, [layerOrder, id]);
56
+ if (!layerOrder) {
57
+ return null;
58
+ }
59
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_GlobalStyles.default, {
60
+ styles: layerOrder
61
+ });
62
+ }
package/createStyled.js CHANGED
@@ -38,6 +38,13 @@ function isStringTag(tag) {
38
38
  function shouldForwardProp(prop) {
39
39
  return prop !== 'ownerState' && prop !== 'theme' && prop !== 'sx' && prop !== 'as';
40
40
  }
41
+ function shallowLayer(serialized, layerName) {
42
+ if (layerName && serialized && typeof serialized === 'object' && serialized.styles && !serialized.styles.startsWith('@layer') // only add the layer if it is not already there.
43
+ ) {
44
+ serialized.styles = `@layer ${layerName}{${String(serialized.styles)}}`;
45
+ }
46
+ return serialized;
47
+ }
41
48
  const systemDefaultTheme = exports.systemDefaultTheme = (0, _createTheme.default)();
42
49
  const lowercaseFirstLetter = string => {
43
50
  if (!string) {
@@ -58,7 +65,7 @@ function defaultOverridesResolver(slot) {
58
65
  }
59
66
  return (props, styles) => styles[slot];
60
67
  }
61
- function processStyleArg(callableStyle, _ref) {
68
+ function processStyleArg(callableStyle, _ref, layerName) {
62
69
  let {
63
70
  ownerState
64
71
  } = _ref,
@@ -69,7 +76,7 @@ function processStyleArg(callableStyle, _ref) {
69
76
  if (Array.isArray(resolvedStylesArg)) {
70
77
  return resolvedStylesArg.flatMap(resolvedStyle => processStyleArg(resolvedStyle, (0, _extends2.default)({
71
78
  ownerState
72
- }, props)));
79
+ }, props), layerName));
73
80
  }
74
81
  if (!!resolvedStylesArg && typeof resolvedStylesArg === 'object' && Array.isArray(resolvedStylesArg.variants)) {
75
82
  const {
@@ -94,14 +101,15 @@ function processStyleArg(callableStyle, _ref) {
94
101
  if (!Array.isArray(result)) {
95
102
  result = [result];
96
103
  }
97
- result.push(typeof variant.style === 'function' ? variant.style((0, _extends2.default)({
104
+ const variantStyle = typeof variant.style === 'function' ? variant.style((0, _extends2.default)({
98
105
  ownerState
99
- }, props, ownerState)) : variant.style);
106
+ }, props, ownerState)) : variant.style;
107
+ result.push(layerName ? shallowLayer((0, _styledEngine.internal_serializeStyles)(variantStyle), layerName) : variantStyle);
100
108
  }
101
109
  });
102
110
  return result;
103
111
  }
104
- return resolvedStylesArg;
112
+ return layerName ? shallowLayer((0, _styledEngine.internal_serializeStyles)(resolvedStylesArg), layerName) : resolvedStylesArg;
105
113
  }
106
114
  function createStyled(input = {}) {
107
115
  const {
@@ -132,6 +140,7 @@ function createStyled(input = {}) {
132
140
  overridesResolver = defaultOverridesResolver(lowercaseFirstLetter(componentSlot))
133
141
  } = inputOptions,
134
142
  options = (0, _objectWithoutPropertiesLoose2.default)(inputOptions, _excluded3);
143
+ const layerName = componentName && componentName.startsWith('Mui') || !!componentSlot ? 'components' : 'custom';
135
144
 
136
145
  // if skipVariantsResolver option is defined, take the value, otherwise, true for root and false for other slots.
137
146
  const skipVariantsResolver = inputSkipVariantsResolver !== undefined ? inputSkipVariantsResolver :
@@ -169,13 +178,16 @@ function createStyled(input = {}) {
169
178
  // component stays as a function. This condition makes sure that we do not interpolate functions
170
179
  // which are basically components used as a selectors.
171
180
  if (typeof stylesArg === 'function' && stylesArg.__emotion_real !== stylesArg || (0, _deepmerge.isPlainObject)(stylesArg)) {
172
- return props => processStyleArg(stylesArg, (0, _extends2.default)({}, props, {
173
- theme: resolveTheme({
181
+ return props => {
182
+ const theme = resolveTheme({
174
183
  theme: props.theme,
175
184
  defaultTheme,
176
185
  themeId
177
- })
178
- }));
186
+ });
187
+ return processStyleArg(stylesArg, (0, _extends2.default)({}, props, {
188
+ theme
189
+ }), theme.modularCssLayers ? layerName : undefined);
190
+ };
179
191
  }
180
192
  return stylesArg;
181
193
  };
@@ -197,7 +209,7 @@ function createStyled(input = {}) {
197
209
  Object.entries(styleOverrides).forEach(([slotKey, slotStyle]) => {
198
210
  resolvedStyleOverrides[slotKey] = processStyleArg(slotStyle, (0, _extends2.default)({}, props, {
199
211
  theme
200
- }));
212
+ }), theme.modularCssLayers ? 'theme' : undefined);
201
213
  });
202
214
  return overridesResolver(props, resolvedStyleOverrides);
203
215
  });
@@ -214,7 +226,7 @@ function createStyled(input = {}) {
214
226
  variants: themeVariants
215
227
  }, (0, _extends2.default)({}, props, {
216
228
  theme
217
- }));
229
+ }), theme.modularCssLayers ? 'theme' : undefined);
218
230
  });
219
231
  }
220
232
  if (!skipSx) {
@@ -2,16 +2,40 @@
2
2
 
3
3
  import * as React from 'react';
4
4
  import PropTypes from 'prop-types';
5
- import { GlobalStyles as MuiGlobalStyles } from '@mui/styled-engine';
5
+ import { GlobalStyles as MuiGlobalStyles, internal_serializeStyles as serializeStyles } from '@mui/styled-engine';
6
6
  import useTheme from '../useTheme';
7
7
  import { jsx as _jsx } from "react/jsx-runtime";
8
+ function wrapGlobalLayer(styles) {
9
+ const serialized = serializeStyles(styles);
10
+ if (styles !== serialized && serialized.styles) {
11
+ if (!serialized.styles.match(/^@layer\s+[^{]*$/)) {
12
+ // If the styles are not already wrapped in a layer, wrap them in a global layer.
13
+ serialized.styles = `@layer global{${serialized.styles}}`;
14
+ }
15
+ return serialized;
16
+ }
17
+ return styles;
18
+ }
8
19
  function GlobalStyles({
9
20
  styles,
10
21
  themeId,
11
22
  defaultTheme = {}
12
23
  }) {
13
24
  const upperTheme = useTheme(defaultTheme);
14
- const globalStyles = typeof styles === 'function' ? styles(themeId ? upperTheme[themeId] || upperTheme : upperTheme) : styles;
25
+ const resolvedTheme = themeId ? upperTheme[themeId] || upperTheme : upperTheme;
26
+ let globalStyles = typeof styles === 'function' ? styles(resolvedTheme) : styles;
27
+ if (resolvedTheme.modularCssLayers) {
28
+ if (Array.isArray(globalStyles)) {
29
+ globalStyles = globalStyles.map(styleArg => {
30
+ if (typeof styleArg === 'function') {
31
+ return wrapGlobalLayer(styleArg(resolvedTheme));
32
+ }
33
+ return wrapGlobalLayer(styleArg);
34
+ });
35
+ } else {
36
+ globalStyles = wrapGlobalLayer(globalStyles);
37
+ }
38
+ }
15
39
  return /*#__PURE__*/_jsx(MuiGlobalStyles, {
16
40
  styles: globalStyles
17
41
  });
@@ -9,6 +9,8 @@ import { ThemeContext as StyledEngineThemeContext } from '@mui/styled-engine';
9
9
  import useThemeWithoutDefault from '../useThemeWithoutDefault';
10
10
  import RtlProvider from '../RtlProvider';
11
11
  import DefaultPropsProvider from '../DefaultPropsProvider';
12
+ import useLayerOrder from './useLayerOrder';
13
+ import { jsxs as _jsxs } from "react/jsx-runtime";
12
14
  import { jsx as _jsx } from "react/jsx-runtime";
13
15
  const EMPTY_THEME = {};
14
16
  function useThemeScoping(themeId, upperTheme, localTheme, isPrivate = false) {
@@ -55,15 +57,16 @@ function ThemeProvider(props) {
55
57
  const engineTheme = useThemeScoping(themeId, upperTheme, localTheme);
56
58
  const privateTheme = useThemeScoping(themeId, upperPrivateTheme, localTheme, true);
57
59
  const rtlValue = engineTheme.direction === 'rtl';
60
+ const layerOrder = useLayerOrder(engineTheme);
58
61
  return /*#__PURE__*/_jsx(MuiThemeProvider, {
59
62
  theme: privateTheme,
60
63
  children: /*#__PURE__*/_jsx(StyledEngineThemeContext.Provider, {
61
64
  value: engineTheme,
62
65
  children: /*#__PURE__*/_jsx(RtlProvider, {
63
66
  value: rtlValue,
64
- children: /*#__PURE__*/_jsx(DefaultPropsProvider, {
67
+ children: /*#__PURE__*/_jsxs(DefaultPropsProvider, {
65
68
  value: engineTheme == null ? void 0 : engineTheme.components,
66
- children: children
69
+ children: [layerOrder, children]
67
70
  })
68
71
  })
69
72
  })
@@ -0,0 +1,56 @@
1
+ 'use client';
2
+
3
+ import * as React from 'react';
4
+ import useEnhancedEffect from '@mui/utils/useEnhancedEffect';
5
+ import useId from '@mui/utils/useId';
6
+ import GlobalStyles from '../GlobalStyles';
7
+ import useThemeWithoutDefault from '../useThemeWithoutDefault';
8
+
9
+ /**
10
+ * This hook returns a `GlobalStyles` component that sets the CSS layer order (for server-side rendering).
11
+ * Then on client-side, it injects the CSS layer order into the document head to ensure that the layer order is always present first before other Emotion styles.
12
+ */
13
+ import { jsx as _jsx } from "react/jsx-runtime";
14
+ export default function useLayerOrder(theme) {
15
+ const upperTheme = useThemeWithoutDefault();
16
+ const id = useId() || '';
17
+ const {
18
+ modularCssLayers
19
+ } = theme;
20
+ let layerOrder = 'mui.global, mui.components, mui.theme, mui.custom, mui.sx';
21
+ if (!modularCssLayers || upperTheme !== null) {
22
+ // skip this hook if upper theme exists.
23
+ layerOrder = '';
24
+ } else if (typeof modularCssLayers === 'string') {
25
+ layerOrder = modularCssLayers.replace(/mui(?!\.)/g, layerOrder);
26
+ } else {
27
+ layerOrder = `@layer ${layerOrder};`;
28
+ }
29
+ useEnhancedEffect(() => {
30
+ const head = document.querySelector('head');
31
+ if (!head) {
32
+ return;
33
+ }
34
+ const firstChild = head.firstChild;
35
+ if (layerOrder) {
36
+ var _firstChild$hasAttrib;
37
+ // Only insert if first child doesn't have data-mui-layer-order attribute
38
+ if (firstChild && (_firstChild$hasAttrib = firstChild.hasAttribute) != null && _firstChild$hasAttrib.call(firstChild, 'data-mui-layer-order') && firstChild.getAttribute('data-mui-layer-order') === id) {
39
+ return;
40
+ }
41
+ const styleElement = document.createElement('style');
42
+ styleElement.setAttribute('data-mui-layer-order', id);
43
+ styleElement.textContent = layerOrder;
44
+ head.prepend(styleElement);
45
+ } else {
46
+ var _head$querySelector;
47
+ (_head$querySelector = head.querySelector(`style[data-mui-layer-order="${id}"]`)) == null || _head$querySelector.remove();
48
+ }
49
+ }, [layerOrder, id]);
50
+ if (!layerOrder) {
51
+ return null;
52
+ }
53
+ return /*#__PURE__*/_jsx(GlobalStyles, {
54
+ styles: layerOrder
55
+ });
56
+ }
@@ -4,7 +4,7 @@ const _excluded = ["ownerState"],
4
4
  _excluded2 = ["variants"],
5
5
  _excluded3 = ["name", "slot", "skipVariantsResolver", "skipSx", "overridesResolver"];
6
6
  /* eslint-disable no-underscore-dangle */
7
- import styledEngineStyled, { internal_processStyles as processStyles } from '@mui/styled-engine';
7
+ import styledEngineStyled, { internal_processStyles as processStyles, internal_serializeStyles as serializeStyles } from '@mui/styled-engine';
8
8
  import { isPlainObject } from '@mui/utils/deepmerge';
9
9
  import capitalize from '@mui/utils/capitalize';
10
10
  import getDisplayName from '@mui/utils/getDisplayName';
@@ -27,6 +27,13 @@ function isStringTag(tag) {
27
27
  export function shouldForwardProp(prop) {
28
28
  return prop !== 'ownerState' && prop !== 'theme' && prop !== 'sx' && prop !== 'as';
29
29
  }
30
+ function shallowLayer(serialized, layerName) {
31
+ if (layerName && serialized && typeof serialized === 'object' && serialized.styles && !serialized.styles.startsWith('@layer') // only add the layer if it is not already there.
32
+ ) {
33
+ serialized.styles = `@layer ${layerName}{${String(serialized.styles)}}`;
34
+ }
35
+ return serialized;
36
+ }
30
37
  export const systemDefaultTheme = createTheme();
31
38
  const lowercaseFirstLetter = string => {
32
39
  if (!string) {
@@ -47,7 +54,7 @@ function defaultOverridesResolver(slot) {
47
54
  }
48
55
  return (props, styles) => styles[slot];
49
56
  }
50
- function processStyleArg(callableStyle, _ref) {
57
+ function processStyleArg(callableStyle, _ref, layerName) {
51
58
  let {
52
59
  ownerState
53
60
  } = _ref,
@@ -58,7 +65,7 @@ function processStyleArg(callableStyle, _ref) {
58
65
  if (Array.isArray(resolvedStylesArg)) {
59
66
  return resolvedStylesArg.flatMap(resolvedStyle => processStyleArg(resolvedStyle, _extends({
60
67
  ownerState
61
- }, props)));
68
+ }, props), layerName));
62
69
  }
63
70
  if (!!resolvedStylesArg && typeof resolvedStylesArg === 'object' && Array.isArray(resolvedStylesArg.variants)) {
64
71
  const {
@@ -83,14 +90,15 @@ function processStyleArg(callableStyle, _ref) {
83
90
  if (!Array.isArray(result)) {
84
91
  result = [result];
85
92
  }
86
- result.push(typeof variant.style === 'function' ? variant.style(_extends({
93
+ const variantStyle = typeof variant.style === 'function' ? variant.style(_extends({
87
94
  ownerState
88
- }, props, ownerState)) : variant.style);
95
+ }, props, ownerState)) : variant.style;
96
+ result.push(layerName ? shallowLayer(serializeStyles(variantStyle), layerName) : variantStyle);
89
97
  }
90
98
  });
91
99
  return result;
92
100
  }
93
- return resolvedStylesArg;
101
+ return layerName ? shallowLayer(serializeStyles(resolvedStylesArg), layerName) : resolvedStylesArg;
94
102
  }
95
103
  export default function createStyled(input = {}) {
96
104
  const {
@@ -121,6 +129,7 @@ export default function createStyled(input = {}) {
121
129
  overridesResolver = defaultOverridesResolver(lowercaseFirstLetter(componentSlot))
122
130
  } = inputOptions,
123
131
  options = _objectWithoutPropertiesLoose(inputOptions, _excluded3);
132
+ const layerName = componentName && componentName.startsWith('Mui') || !!componentSlot ? 'components' : 'custom';
124
133
 
125
134
  // if skipVariantsResolver option is defined, take the value, otherwise, true for root and false for other slots.
126
135
  const skipVariantsResolver = inputSkipVariantsResolver !== undefined ? inputSkipVariantsResolver :
@@ -158,13 +167,16 @@ export default function createStyled(input = {}) {
158
167
  // component stays as a function. This condition makes sure that we do not interpolate functions
159
168
  // which are basically components used as a selectors.
160
169
  if (typeof stylesArg === 'function' && stylesArg.__emotion_real !== stylesArg || isPlainObject(stylesArg)) {
161
- return props => processStyleArg(stylesArg, _extends({}, props, {
162
- theme: resolveTheme({
170
+ return props => {
171
+ const theme = resolveTheme({
163
172
  theme: props.theme,
164
173
  defaultTheme,
165
174
  themeId
166
- })
167
- }));
175
+ });
176
+ return processStyleArg(stylesArg, _extends({}, props, {
177
+ theme
178
+ }), theme.modularCssLayers ? layerName : undefined);
179
+ };
168
180
  }
169
181
  return stylesArg;
170
182
  };
@@ -186,7 +198,7 @@ export default function createStyled(input = {}) {
186
198
  Object.entries(styleOverrides).forEach(([slotKey, slotStyle]) => {
187
199
  resolvedStyleOverrides[slotKey] = processStyleArg(slotStyle, _extends({}, props, {
188
200
  theme
189
- }));
201
+ }), theme.modularCssLayers ? 'theme' : undefined);
190
202
  });
191
203
  return overridesResolver(props, resolvedStyleOverrides);
192
204
  });
@@ -203,7 +215,7 @@ export default function createStyled(input = {}) {
203
215
  variants: themeVariants
204
216
  }, _extends({}, props, {
205
217
  theme
206
- }));
218
+ }), theme.modularCssLayers ? 'theme' : undefined);
207
219
  });
208
220
  }
209
221
  if (!skipSx) {
@@ -64,7 +64,8 @@ export function unstable_createStyleFunctionSx() {
64
64
  var _theme$unstable_sxCon;
65
65
  const {
66
66
  sx,
67
- theme = {}
67
+ theme = {},
68
+ nested
68
69
  } = props || {};
69
70
  if (!sx) {
70
71
  return null; // Emotion & styled-components will neglect null
@@ -105,7 +106,8 @@ export function unstable_createStyleFunctionSx() {
105
106
  if (objectsHaveSameKeys(breakpointsValues, value)) {
106
107
  css[styleKey] = styleFunctionSx({
107
108
  sx: value,
108
- theme
109
+ theme,
110
+ nested: true
109
111
  });
110
112
  } else {
111
113
  css = merge(css, breakpointsValues);
@@ -116,6 +118,11 @@ export function unstable_createStyleFunctionSx() {
116
118
  }
117
119
  }
118
120
  });
121
+ if (!nested && theme.modularCssLayers) {
122
+ return {
123
+ '@layer sx': removeUnusedBreakpoints(breakpointsKeys, css)
124
+ };
125
+ }
119
126
  return removeUnusedBreakpoints(breakpointsKeys, css);
120
127
  }
121
128
  return Array.isArray(sx) ? sx.map(traverse) : traverse(sx);
@@ -1,7 +1,7 @@
1
- export const version = "5.16.14";
1
+ export const version = "5.18.0";
2
2
  export const major = Number("5");
3
- export const minor = Number("16");
4
- export const patch = Number("14");
3
+ export const minor = Number("18");
4
+ export const patch = Number("0");
5
5
  export const preReleaseLabel = undefined || null;
6
6
  export const preReleaseNumber = Number(undefined) || null;
7
7
  export default version;
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/system v5.16.14
2
+ * @mui/system v5.18.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -2,16 +2,40 @@
2
2
 
3
3
  import * as React from 'react';
4
4
  import PropTypes from 'prop-types';
5
- import { GlobalStyles as MuiGlobalStyles } from '@mui/styled-engine';
5
+ import { GlobalStyles as MuiGlobalStyles, internal_serializeStyles as serializeStyles } from '@mui/styled-engine';
6
6
  import useTheme from '../useTheme';
7
7
  import { jsx as _jsx } from "react/jsx-runtime";
8
+ function wrapGlobalLayer(styles) {
9
+ var serialized = serializeStyles(styles);
10
+ if (styles !== serialized && serialized.styles) {
11
+ if (!serialized.styles.match(/^@layer\s+[^{]*$/)) {
12
+ // If the styles are not already wrapped in a layer, wrap them in a global layer.
13
+ serialized.styles = "@layer global{".concat(serialized.styles, "}");
14
+ }
15
+ return serialized;
16
+ }
17
+ return styles;
18
+ }
8
19
  function GlobalStyles(_ref) {
9
20
  var styles = _ref.styles,
10
21
  themeId = _ref.themeId,
11
22
  _ref$defaultTheme = _ref.defaultTheme,
12
23
  defaultTheme = _ref$defaultTheme === void 0 ? {} : _ref$defaultTheme;
13
24
  var upperTheme = useTheme(defaultTheme);
14
- var globalStyles = typeof styles === 'function' ? styles(themeId ? upperTheme[themeId] || upperTheme : upperTheme) : styles;
25
+ var resolvedTheme = themeId ? upperTheme[themeId] || upperTheme : upperTheme;
26
+ var globalStyles = typeof styles === 'function' ? styles(resolvedTheme) : styles;
27
+ if (resolvedTheme.modularCssLayers) {
28
+ if (Array.isArray(globalStyles)) {
29
+ globalStyles = globalStyles.map(function (styleArg) {
30
+ if (typeof styleArg === 'function') {
31
+ return wrapGlobalLayer(styleArg(resolvedTheme));
32
+ }
33
+ return wrapGlobalLayer(styleArg);
34
+ });
35
+ } else {
36
+ globalStyles = wrapGlobalLayer(globalStyles);
37
+ }
38
+ }
15
39
  return /*#__PURE__*/_jsx(MuiGlobalStyles, {
16
40
  styles: globalStyles
17
41
  });
@@ -10,6 +10,8 @@ import { ThemeContext as StyledEngineThemeContext } from '@mui/styled-engine';
10
10
  import useThemeWithoutDefault from '../useThemeWithoutDefault';
11
11
  import RtlProvider from '../RtlProvider';
12
12
  import DefaultPropsProvider from '../DefaultPropsProvider';
13
+ import useLayerOrder from './useLayerOrder';
14
+ import { jsxs as _jsxs } from "react/jsx-runtime";
13
15
  import { jsx as _jsx } from "react/jsx-runtime";
14
16
  var EMPTY_THEME = {};
15
17
  function useThemeScoping(themeId, upperTheme, localTheme) {
@@ -53,15 +55,16 @@ function ThemeProvider(props) {
53
55
  var engineTheme = useThemeScoping(themeId, upperTheme, localTheme);
54
56
  var privateTheme = useThemeScoping(themeId, upperPrivateTheme, localTheme, true);
55
57
  var rtlValue = engineTheme.direction === 'rtl';
58
+ var layerOrder = useLayerOrder(engineTheme);
56
59
  return /*#__PURE__*/_jsx(MuiThemeProvider, {
57
60
  theme: privateTheme,
58
61
  children: /*#__PURE__*/_jsx(StyledEngineThemeContext.Provider, {
59
62
  value: engineTheme,
60
63
  children: /*#__PURE__*/_jsx(RtlProvider, {
61
64
  value: rtlValue,
62
- children: /*#__PURE__*/_jsx(DefaultPropsProvider, {
65
+ children: /*#__PURE__*/_jsxs(DefaultPropsProvider, {
63
66
  value: engineTheme == null ? void 0 : engineTheme.components,
64
- children: children
67
+ children: [layerOrder, children]
65
68
  })
66
69
  })
67
70
  })
@@ -0,0 +1,54 @@
1
+ 'use client';
2
+
3
+ import * as React from 'react';
4
+ import useEnhancedEffect from '@mui/utils/useEnhancedEffect';
5
+ import useId from '@mui/utils/useId';
6
+ import GlobalStyles from '../GlobalStyles';
7
+ import useThemeWithoutDefault from '../useThemeWithoutDefault';
8
+
9
+ /**
10
+ * This hook returns a `GlobalStyles` component that sets the CSS layer order (for server-side rendering).
11
+ * Then on client-side, it injects the CSS layer order into the document head to ensure that the layer order is always present first before other Emotion styles.
12
+ */
13
+ import { jsx as _jsx } from "react/jsx-runtime";
14
+ export default function useLayerOrder(theme) {
15
+ var upperTheme = useThemeWithoutDefault();
16
+ var id = useId() || '';
17
+ var modularCssLayers = theme.modularCssLayers;
18
+ var layerOrder = 'mui.global, mui.components, mui.theme, mui.custom, mui.sx';
19
+ if (!modularCssLayers || upperTheme !== null) {
20
+ // skip this hook if upper theme exists.
21
+ layerOrder = '';
22
+ } else if (typeof modularCssLayers === 'string') {
23
+ layerOrder = modularCssLayers.replace(/mui(?!\.)/g, layerOrder);
24
+ } else {
25
+ layerOrder = "@layer ".concat(layerOrder, ";");
26
+ }
27
+ useEnhancedEffect(function () {
28
+ var head = document.querySelector('head');
29
+ if (!head) {
30
+ return;
31
+ }
32
+ var firstChild = head.firstChild;
33
+ if (layerOrder) {
34
+ var _firstChild$hasAttrib;
35
+ // Only insert if first child doesn't have data-mui-layer-order attribute
36
+ if (firstChild && (_firstChild$hasAttrib = firstChild.hasAttribute) != null && _firstChild$hasAttrib.call(firstChild, 'data-mui-layer-order') && firstChild.getAttribute('data-mui-layer-order') === id) {
37
+ return;
38
+ }
39
+ var styleElement = document.createElement('style');
40
+ styleElement.setAttribute('data-mui-layer-order', id);
41
+ styleElement.textContent = layerOrder;
42
+ head.prepend(styleElement);
43
+ } else {
44
+ var _head$querySelector;
45
+ (_head$querySelector = head.querySelector("style[data-mui-layer-order=\"".concat(id, "\"]"))) == null || _head$querySelector.remove();
46
+ }
47
+ }, [layerOrder, id]);
48
+ if (!layerOrder) {
49
+ return null;
50
+ }
51
+ return /*#__PURE__*/_jsx(GlobalStyles, {
52
+ styles: layerOrder
53
+ });
54
+ }
@@ -1,10 +1,10 @@
1
1
  import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
2
  import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
3
- import _typeof from "@babel/runtime/helpers/esm/typeof";
4
3
  import _extends from "@babel/runtime/helpers/esm/extends";
5
4
  import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
5
+ import _typeof from "@babel/runtime/helpers/esm/typeof";
6
6
  /* eslint-disable no-underscore-dangle */
7
- import styledEngineStyled, { internal_processStyles as processStyles } from '@mui/styled-engine';
7
+ import styledEngineStyled, { internal_processStyles as processStyles, internal_serializeStyles as serializeStyles } from '@mui/styled-engine';
8
8
  import { isPlainObject } from '@mui/utils/deepmerge';
9
9
  import capitalize from '@mui/utils/capitalize';
10
10
  import getDisplayName from '@mui/utils/getDisplayName';
@@ -27,6 +27,13 @@ function isStringTag(tag) {
27
27
  export function shouldForwardProp(prop) {
28
28
  return prop !== 'ownerState' && prop !== 'theme' && prop !== 'sx' && prop !== 'as';
29
29
  }
30
+ function shallowLayer(serialized, layerName) {
31
+ if (layerName && serialized && _typeof(serialized) === 'object' && serialized.styles && !serialized.styles.startsWith('@layer') // only add the layer if it is not already there.
32
+ ) {
33
+ serialized.styles = "@layer ".concat(layerName, "{").concat(String(serialized.styles), "}");
34
+ }
35
+ return serialized;
36
+ }
30
37
  export var systemDefaultTheme = createTheme();
31
38
  var lowercaseFirstLetter = function lowercaseFirstLetter(string) {
32
39
  if (!string) {
@@ -48,7 +55,7 @@ function defaultOverridesResolver(slot) {
48
55
  return styles[slot];
49
56
  };
50
57
  }
51
- function processStyleArg(callableStyle, _ref2) {
58
+ function processStyleArg(callableStyle, _ref2, layerName) {
52
59
  var ownerState = _ref2.ownerState,
53
60
  props = _objectWithoutProperties(_ref2, ["ownerState"]);
54
61
  var resolvedStylesArg = typeof callableStyle === 'function' ? callableStyle(_extends({
@@ -58,7 +65,7 @@ function processStyleArg(callableStyle, _ref2) {
58
65
  return resolvedStylesArg.flatMap(function (resolvedStyle) {
59
66
  return processStyleArg(resolvedStyle, _extends({
60
67
  ownerState: ownerState
61
- }, props));
68
+ }, props), layerName);
62
69
  });
63
70
  }
64
71
  if (!!resolvedStylesArg && _typeof(resolvedStylesArg) === 'object' && Array.isArray(resolvedStylesArg.variants)) {
@@ -83,14 +90,15 @@ function processStyleArg(callableStyle, _ref2) {
83
90
  if (!Array.isArray(result)) {
84
91
  result = [result];
85
92
  }
86
- result.push(typeof variant.style === 'function' ? variant.style(_extends({
93
+ var variantStyle = typeof variant.style === 'function' ? variant.style(_extends({
87
94
  ownerState: ownerState
88
- }, props, ownerState)) : variant.style);
95
+ }, props, ownerState)) : variant.style;
96
+ result.push(layerName ? shallowLayer(serializeStyles(variantStyle), layerName) : variantStyle);
89
97
  }
90
98
  });
91
99
  return result;
92
100
  }
93
- return resolvedStylesArg;
101
+ return layerName ? shallowLayer(serializeStyles(resolvedStylesArg), layerName) : resolvedStylesArg;
94
102
  }
95
103
  export default function createStyled() {
96
104
  var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
@@ -124,7 +132,10 @@ export default function createStyled() {
124
132
  inputSkipSx = inputOptions.skipSx,
125
133
  _inputOptions$overrid = inputOptions.overridesResolver,
126
134
  overridesResolver = _inputOptions$overrid === void 0 ? defaultOverridesResolver(lowercaseFirstLetter(componentSlot)) : _inputOptions$overrid,
127
- options = _objectWithoutProperties(inputOptions, ["name", "slot", "skipVariantsResolver", "skipSx", "overridesResolver"]); // if skipVariantsResolver option is defined, take the value, otherwise, true for root and false for other slots.
135
+ options = _objectWithoutProperties(inputOptions, ["name", "slot", "skipVariantsResolver", "skipSx", "overridesResolver"]);
136
+ var layerName = componentName && componentName.startsWith('Mui') || !!componentSlot ? 'components' : 'custom';
137
+
138
+ // if skipVariantsResolver option is defined, take the value, otherwise, true for root and false for other slots.
128
139
  var skipVariantsResolver = inputSkipVariantsResolver !== undefined ? inputSkipVariantsResolver :
129
140
  // TODO v6: remove `Root` in the next major release
130
141
  // For more details: https://github.com/mui/material-ui/pull/37908
@@ -161,13 +172,14 @@ export default function createStyled() {
161
172
  // which are basically components used as a selectors.
162
173
  if (typeof stylesArg === 'function' && stylesArg.__emotion_real !== stylesArg || isPlainObject(stylesArg)) {
163
174
  return function (props) {
175
+ var theme = resolveTheme({
176
+ theme: props.theme,
177
+ defaultTheme: defaultTheme,
178
+ themeId: themeId
179
+ });
164
180
  return processStyleArg(stylesArg, _extends({}, props, {
165
- theme: resolveTheme({
166
- theme: props.theme,
167
- defaultTheme: defaultTheme,
168
- themeId: themeId
169
- })
170
- }));
181
+ theme: theme
182
+ }), theme.modularCssLayers ? layerName : undefined);
171
183
  };
172
184
  }
173
185
  return stylesArg;
@@ -196,7 +208,7 @@ export default function createStyled() {
196
208
  slotStyle = _ref4[1];
197
209
  resolvedStyleOverrides[slotKey] = processStyleArg(slotStyle, _extends({}, props, {
198
210
  theme: theme
199
- }));
211
+ }), theme.modularCssLayers ? 'theme' : undefined);
200
212
  });
201
213
  return overridesResolver(props, resolvedStyleOverrides);
202
214
  });
@@ -213,7 +225,7 @@ export default function createStyled() {
213
225
  variants: themeVariants
214
226
  }, _extends({}, props, {
215
227
  theme: theme
216
- }));
228
+ }), theme.modularCssLayers ? 'theme' : undefined);
217
229
  });
218
230
  }
219
231
  if (!skipSx) {
package/legacy/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/system v5.16.14
2
+ * @mui/system v5.18.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -64,7 +64,8 @@ export function unstable_createStyleFunctionSx() {
64
64
  var _ref4 = props || {},
65
65
  sx = _ref4.sx,
66
66
  _ref4$theme = _ref4.theme,
67
- theme = _ref4$theme === void 0 ? {} : _ref4$theme;
67
+ theme = _ref4$theme === void 0 ? {} : _ref4$theme,
68
+ nested = _ref4.nested;
68
69
  if (!sx) {
69
70
  return null; // Emotion & styled-components will neglect null
70
71
  }
@@ -104,7 +105,8 @@ export function unstable_createStyleFunctionSx() {
104
105
  if (objectsHaveSameKeys(breakpointsValues, value)) {
105
106
  css[styleKey] = styleFunctionSx({
106
107
  sx: value,
107
- theme: theme
108
+ theme: theme,
109
+ nested: true
108
110
  });
109
111
  } else {
110
112
  css = merge(css, breakpointsValues);
@@ -115,6 +117,11 @@ export function unstable_createStyleFunctionSx() {
115
117
  }
116
118
  }
117
119
  });
120
+ if (!nested && theme.modularCssLayers) {
121
+ return {
122
+ '@layer sx': removeUnusedBreakpoints(breakpointsKeys, css)
123
+ };
124
+ }
118
125
  return removeUnusedBreakpoints(breakpointsKeys, css);
119
126
  }
120
127
  return Array.isArray(sx) ? sx.map(traverse) : traverse(sx);
@@ -1,7 +1,7 @@
1
- export var version = "5.16.14";
1
+ export var version = "5.18.0";
2
2
  export var major = Number("5");
3
- export var minor = Number("16");
4
- export var patch = Number("14");
3
+ export var minor = Number("18");
4
+ export var patch = Number("0");
5
5
  export var preReleaseLabel = undefined || null;
6
6
  export var preReleaseNumber = Number(undefined) || null;
7
7
  export default version;
@@ -2,16 +2,40 @@
2
2
 
3
3
  import * as React from 'react';
4
4
  import PropTypes from 'prop-types';
5
- import { GlobalStyles as MuiGlobalStyles } from '@mui/styled-engine';
5
+ import { GlobalStyles as MuiGlobalStyles, internal_serializeStyles as serializeStyles } from '@mui/styled-engine';
6
6
  import useTheme from '../useTheme';
7
7
  import { jsx as _jsx } from "react/jsx-runtime";
8
+ function wrapGlobalLayer(styles) {
9
+ const serialized = serializeStyles(styles);
10
+ if (styles !== serialized && serialized.styles) {
11
+ if (!serialized.styles.match(/^@layer\s+[^{]*$/)) {
12
+ // If the styles are not already wrapped in a layer, wrap them in a global layer.
13
+ serialized.styles = `@layer global{${serialized.styles}}`;
14
+ }
15
+ return serialized;
16
+ }
17
+ return styles;
18
+ }
8
19
  function GlobalStyles({
9
20
  styles,
10
21
  themeId,
11
22
  defaultTheme = {}
12
23
  }) {
13
24
  const upperTheme = useTheme(defaultTheme);
14
- const globalStyles = typeof styles === 'function' ? styles(themeId ? upperTheme[themeId] || upperTheme : upperTheme) : styles;
25
+ const resolvedTheme = themeId ? upperTheme[themeId] || upperTheme : upperTheme;
26
+ let globalStyles = typeof styles === 'function' ? styles(resolvedTheme) : styles;
27
+ if (resolvedTheme.modularCssLayers) {
28
+ if (Array.isArray(globalStyles)) {
29
+ globalStyles = globalStyles.map(styleArg => {
30
+ if (typeof styleArg === 'function') {
31
+ return wrapGlobalLayer(styleArg(resolvedTheme));
32
+ }
33
+ return wrapGlobalLayer(styleArg);
34
+ });
35
+ } else {
36
+ globalStyles = wrapGlobalLayer(globalStyles);
37
+ }
38
+ }
15
39
  return /*#__PURE__*/_jsx(MuiGlobalStyles, {
16
40
  styles: globalStyles
17
41
  });
@@ -9,6 +9,8 @@ import { ThemeContext as StyledEngineThemeContext } from '@mui/styled-engine';
9
9
  import useThemeWithoutDefault from '../useThemeWithoutDefault';
10
10
  import RtlProvider from '../RtlProvider';
11
11
  import DefaultPropsProvider from '../DefaultPropsProvider';
12
+ import useLayerOrder from './useLayerOrder';
13
+ import { jsxs as _jsxs } from "react/jsx-runtime";
12
14
  import { jsx as _jsx } from "react/jsx-runtime";
13
15
  const EMPTY_THEME = {};
14
16
  function useThemeScoping(themeId, upperTheme, localTheme, isPrivate = false) {
@@ -55,15 +57,16 @@ function ThemeProvider(props) {
55
57
  const engineTheme = useThemeScoping(themeId, upperTheme, localTheme);
56
58
  const privateTheme = useThemeScoping(themeId, upperPrivateTheme, localTheme, true);
57
59
  const rtlValue = engineTheme.direction === 'rtl';
60
+ const layerOrder = useLayerOrder(engineTheme);
58
61
  return /*#__PURE__*/_jsx(MuiThemeProvider, {
59
62
  theme: privateTheme,
60
63
  children: /*#__PURE__*/_jsx(StyledEngineThemeContext.Provider, {
61
64
  value: engineTheme,
62
65
  children: /*#__PURE__*/_jsx(RtlProvider, {
63
66
  value: rtlValue,
64
- children: /*#__PURE__*/_jsx(DefaultPropsProvider, {
67
+ children: /*#__PURE__*/_jsxs(DefaultPropsProvider, {
65
68
  value: engineTheme?.components,
66
- children: children
69
+ children: [layerOrder, children]
67
70
  })
68
71
  })
69
72
  })
@@ -0,0 +1,54 @@
1
+ 'use client';
2
+
3
+ import * as React from 'react';
4
+ import useEnhancedEffect from '@mui/utils/useEnhancedEffect';
5
+ import useId from '@mui/utils/useId';
6
+ import GlobalStyles from '../GlobalStyles';
7
+ import useThemeWithoutDefault from '../useThemeWithoutDefault';
8
+
9
+ /**
10
+ * This hook returns a `GlobalStyles` component that sets the CSS layer order (for server-side rendering).
11
+ * Then on client-side, it injects the CSS layer order into the document head to ensure that the layer order is always present first before other Emotion styles.
12
+ */
13
+ import { jsx as _jsx } from "react/jsx-runtime";
14
+ export default function useLayerOrder(theme) {
15
+ const upperTheme = useThemeWithoutDefault();
16
+ const id = useId() || '';
17
+ const {
18
+ modularCssLayers
19
+ } = theme;
20
+ let layerOrder = 'mui.global, mui.components, mui.theme, mui.custom, mui.sx';
21
+ if (!modularCssLayers || upperTheme !== null) {
22
+ // skip this hook if upper theme exists.
23
+ layerOrder = '';
24
+ } else if (typeof modularCssLayers === 'string') {
25
+ layerOrder = modularCssLayers.replace(/mui(?!\.)/g, layerOrder);
26
+ } else {
27
+ layerOrder = `@layer ${layerOrder};`;
28
+ }
29
+ useEnhancedEffect(() => {
30
+ const head = document.querySelector('head');
31
+ if (!head) {
32
+ return;
33
+ }
34
+ const firstChild = head.firstChild;
35
+ if (layerOrder) {
36
+ // Only insert if first child doesn't have data-mui-layer-order attribute
37
+ if (firstChild && firstChild.hasAttribute?.('data-mui-layer-order') && firstChild.getAttribute('data-mui-layer-order') === id) {
38
+ return;
39
+ }
40
+ const styleElement = document.createElement('style');
41
+ styleElement.setAttribute('data-mui-layer-order', id);
42
+ styleElement.textContent = layerOrder;
43
+ head.prepend(styleElement);
44
+ } else {
45
+ head.querySelector(`style[data-mui-layer-order="${id}"]`)?.remove();
46
+ }
47
+ }, [layerOrder, id]);
48
+ if (!layerOrder) {
49
+ return null;
50
+ }
51
+ return /*#__PURE__*/_jsx(GlobalStyles, {
52
+ styles: layerOrder
53
+ });
54
+ }
@@ -4,7 +4,7 @@ const _excluded = ["ownerState"],
4
4
  _excluded2 = ["variants"],
5
5
  _excluded3 = ["name", "slot", "skipVariantsResolver", "skipSx", "overridesResolver"];
6
6
  /* eslint-disable no-underscore-dangle */
7
- import styledEngineStyled, { internal_processStyles as processStyles } from '@mui/styled-engine';
7
+ import styledEngineStyled, { internal_processStyles as processStyles, internal_serializeStyles as serializeStyles } from '@mui/styled-engine';
8
8
  import { isPlainObject } from '@mui/utils/deepmerge';
9
9
  import capitalize from '@mui/utils/capitalize';
10
10
  import getDisplayName from '@mui/utils/getDisplayName';
@@ -27,6 +27,13 @@ function isStringTag(tag) {
27
27
  export function shouldForwardProp(prop) {
28
28
  return prop !== 'ownerState' && prop !== 'theme' && prop !== 'sx' && prop !== 'as';
29
29
  }
30
+ function shallowLayer(serialized, layerName) {
31
+ if (layerName && serialized && typeof serialized === 'object' && serialized.styles && !serialized.styles.startsWith('@layer') // only add the layer if it is not already there.
32
+ ) {
33
+ serialized.styles = `@layer ${layerName}{${String(serialized.styles)}}`;
34
+ }
35
+ return serialized;
36
+ }
30
37
  export const systemDefaultTheme = createTheme();
31
38
  const lowercaseFirstLetter = string => {
32
39
  if (!string) {
@@ -47,7 +54,7 @@ function defaultOverridesResolver(slot) {
47
54
  }
48
55
  return (props, styles) => styles[slot];
49
56
  }
50
- function processStyleArg(callableStyle, _ref) {
57
+ function processStyleArg(callableStyle, _ref, layerName) {
51
58
  let {
52
59
  ownerState
53
60
  } = _ref,
@@ -58,7 +65,7 @@ function processStyleArg(callableStyle, _ref) {
58
65
  if (Array.isArray(resolvedStylesArg)) {
59
66
  return resolvedStylesArg.flatMap(resolvedStyle => processStyleArg(resolvedStyle, _extends({
60
67
  ownerState
61
- }, props)));
68
+ }, props), layerName));
62
69
  }
63
70
  if (!!resolvedStylesArg && typeof resolvedStylesArg === 'object' && Array.isArray(resolvedStylesArg.variants)) {
64
71
  const {
@@ -83,14 +90,15 @@ function processStyleArg(callableStyle, _ref) {
83
90
  if (!Array.isArray(result)) {
84
91
  result = [result];
85
92
  }
86
- result.push(typeof variant.style === 'function' ? variant.style(_extends({
93
+ const variantStyle = typeof variant.style === 'function' ? variant.style(_extends({
87
94
  ownerState
88
- }, props, ownerState)) : variant.style);
95
+ }, props, ownerState)) : variant.style;
96
+ result.push(layerName ? shallowLayer(serializeStyles(variantStyle), layerName) : variantStyle);
89
97
  }
90
98
  });
91
99
  return result;
92
100
  }
93
- return resolvedStylesArg;
101
+ return layerName ? shallowLayer(serializeStyles(resolvedStylesArg), layerName) : resolvedStylesArg;
94
102
  }
95
103
  export default function createStyled(input = {}) {
96
104
  const {
@@ -121,6 +129,7 @@ export default function createStyled(input = {}) {
121
129
  overridesResolver = defaultOverridesResolver(lowercaseFirstLetter(componentSlot))
122
130
  } = inputOptions,
123
131
  options = _objectWithoutPropertiesLoose(inputOptions, _excluded3);
132
+ const layerName = componentName && componentName.startsWith('Mui') || !!componentSlot ? 'components' : 'custom';
124
133
 
125
134
  // if skipVariantsResolver option is defined, take the value, otherwise, true for root and false for other slots.
126
135
  const skipVariantsResolver = inputSkipVariantsResolver !== undefined ? inputSkipVariantsResolver :
@@ -158,13 +167,16 @@ export default function createStyled(input = {}) {
158
167
  // component stays as a function. This condition makes sure that we do not interpolate functions
159
168
  // which are basically components used as a selectors.
160
169
  if (typeof stylesArg === 'function' && stylesArg.__emotion_real !== stylesArg || isPlainObject(stylesArg)) {
161
- return props => processStyleArg(stylesArg, _extends({}, props, {
162
- theme: resolveTheme({
170
+ return props => {
171
+ const theme = resolveTheme({
163
172
  theme: props.theme,
164
173
  defaultTheme,
165
174
  themeId
166
- })
167
- }));
175
+ });
176
+ return processStyleArg(stylesArg, _extends({}, props, {
177
+ theme
178
+ }), theme.modularCssLayers ? layerName : undefined);
179
+ };
168
180
  }
169
181
  return stylesArg;
170
182
  };
@@ -186,7 +198,7 @@ export default function createStyled(input = {}) {
186
198
  Object.entries(styleOverrides).forEach(([slotKey, slotStyle]) => {
187
199
  resolvedStyleOverrides[slotKey] = processStyleArg(slotStyle, _extends({}, props, {
188
200
  theme
189
- }));
201
+ }), theme.modularCssLayers ? 'theme' : undefined);
190
202
  });
191
203
  return overridesResolver(props, resolvedStyleOverrides);
192
204
  });
@@ -202,7 +214,7 @@ export default function createStyled(input = {}) {
202
214
  variants: themeVariants
203
215
  }, _extends({}, props, {
204
216
  theme
205
- }));
217
+ }), theme.modularCssLayers ? 'theme' : undefined);
206
218
  });
207
219
  }
208
220
  if (!skipSx) {
package/modern/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/system v5.16.14
2
+ * @mui/system v5.18.0
3
3
  *
4
4
  * @license MIT
5
5
  * This source code is licensed under the MIT license found in the
@@ -63,7 +63,8 @@ export function unstable_createStyleFunctionSx() {
63
63
  function styleFunctionSx(props) {
64
64
  const {
65
65
  sx,
66
- theme = {}
66
+ theme = {},
67
+ nested
67
68
  } = props || {};
68
69
  if (!sx) {
69
70
  return null; // Emotion & styled-components will neglect null
@@ -104,7 +105,8 @@ export function unstable_createStyleFunctionSx() {
104
105
  if (objectsHaveSameKeys(breakpointsValues, value)) {
105
106
  css[styleKey] = styleFunctionSx({
106
107
  sx: value,
107
- theme
108
+ theme,
109
+ nested: true
108
110
  });
109
111
  } else {
110
112
  css = merge(css, breakpointsValues);
@@ -115,6 +117,11 @@ export function unstable_createStyleFunctionSx() {
115
117
  }
116
118
  }
117
119
  });
120
+ if (!nested && theme.modularCssLayers) {
121
+ return {
122
+ '@layer sx': removeUnusedBreakpoints(breakpointsKeys, css)
123
+ };
124
+ }
118
125
  return removeUnusedBreakpoints(breakpointsKeys, css);
119
126
  }
120
127
  return Array.isArray(sx) ? sx.map(traverse) : traverse(sx);
@@ -1,7 +1,7 @@
1
- export const version = "5.16.14";
1
+ export const version = "5.18.0";
2
2
  export const major = Number("5");
3
- export const minor = Number("16");
4
- export const patch = Number("14");
3
+ export const minor = Number("18");
4
+ export const patch = Number("0");
5
5
  export const preReleaseLabel = undefined || null;
6
6
  export const preReleaseNumber = Number(undefined) || null;
7
7
  export default version;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/system",
3
- "version": "5.16.14",
3
+ "version": "5.18.0",
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.",
@@ -30,10 +30,10 @@
30
30
  "clsx": "^2.1.0",
31
31
  "csstype": "^3.1.3",
32
32
  "prop-types": "^15.8.1",
33
- "@mui/private-theming": "^5.16.14",
34
- "@mui/styled-engine": "^5.16.14",
35
- "@mui/utils": "^5.16.14",
36
- "@mui/types": "^7.2.15"
33
+ "@mui/styled-engine": "^5.18.0",
34
+ "@mui/types": "~7.2.15",
35
+ "@mui/utils": "^5.17.1",
36
+ "@mui/private-theming": "^5.17.1"
37
37
  },
38
38
  "peerDependencies": {
39
39
  "@emotion/react": "^11.5.0",
@@ -72,7 +72,8 @@ function unstable_createStyleFunctionSx() {
72
72
  var _theme$unstable_sxCon;
73
73
  const {
74
74
  sx,
75
- theme = {}
75
+ theme = {},
76
+ nested
76
77
  } = props || {};
77
78
  if (!sx) {
78
79
  return null; // Emotion & styled-components will neglect null
@@ -113,7 +114,8 @@ function unstable_createStyleFunctionSx() {
113
114
  if (objectsHaveSameKeys(breakpointsValues, value)) {
114
115
  css[styleKey] = styleFunctionSx({
115
116
  sx: value,
116
- theme
117
+ theme,
118
+ nested: true
117
119
  });
118
120
  } else {
119
121
  css = (0, _merge.default)(css, breakpointsValues);
@@ -124,6 +126,11 @@ function unstable_createStyleFunctionSx() {
124
126
  }
125
127
  }
126
128
  });
129
+ if (!nested && theme.modularCssLayers) {
130
+ return {
131
+ '@layer sx': (0, _breakpoints.removeUnusedBreakpoints)(breakpointsKeys, css)
132
+ };
133
+ }
127
134
  return (0, _breakpoints.removeUnusedBreakpoints)(breakpointsKeys, css);
128
135
  }
129
136
  return Array.isArray(sx) ? sx.map(traverse) : traverse(sx);
package/version/index.js CHANGED
@@ -4,10 +4,10 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.version = exports.preReleaseNumber = exports.preReleaseLabel = exports.patch = exports.minor = exports.major = exports.default = void 0;
7
- const version = exports.version = "5.16.14";
7
+ const version = exports.version = "5.18.0";
8
8
  const major = exports.major = Number("5");
9
- const minor = exports.minor = Number("16");
10
- const patch = exports.patch = Number("14");
9
+ const minor = exports.minor = Number("18");
10
+ const patch = exports.patch = Number("0");
11
11
  const preReleaseLabel = exports.preReleaseLabel = undefined || null;
12
12
  const preReleaseNumber = exports.preReleaseNumber = Number(undefined) || null;
13
13
  var _default = exports.default = version;