UNPKG

@mui/system

Version:

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.

51 lines (50 loc) 1.94 kB
import useEnhancedEffect from '@mui/utils/useEnhancedEffect'; import useId from '@mui/utils/useId'; import GlobalStyles from "../GlobalStyles/index.js"; import useThemeWithoutDefault from "../useThemeWithoutDefault/index.js"; /** * This hook returns a `GlobalStyles` component that sets the CSS layer order (for server-side rendering). * 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. */ import { jsx as _jsx } from "react/jsx-runtime"; export default function useLayerOrder(theme) { const upperTheme = useThemeWithoutDefault(); const id = useId() || ''; const { modularCssLayers } = theme; let layerOrder = 'mui.global, mui.components, mui.theme, mui.custom, mui.sx'; if (!modularCssLayers || upperTheme !== null) { // skip this hook if upper theme exists. layerOrder = ''; } else if (typeof modularCssLayers === 'string') { layerOrder = modularCssLayers.replace(/mui(?!\.)/g, layerOrder); } else { layerOrder = `@layer ${layerOrder};`; } useEnhancedEffect(() => { const head = document.querySelector('head'); if (!head) { return; } const firstChild = head.firstChild; if (layerOrder) { // Only insert if first child doesn't have data-mui-layer-order attribute if (firstChild && firstChild.hasAttribute?.('data-mui-layer-order') && firstChild.getAttribute('data-mui-layer-order') === id) { return; } const styleElement = document.createElement('style'); styleElement.setAttribute('data-mui-layer-order', id); styleElement.textContent = layerOrder; head.prepend(styleElement); } else { head.querySelector(`style[data-mui-layer-order="${id}"]`)?.remove(); } }, [layerOrder, id]); if (!layerOrder) { return null; } return /*#__PURE__*/_jsx(GlobalStyles, { styles: layerOrder }); }