Skip to content
+

Theme scoping

Learn how to use multiple styling solutions in a single Material UI app.

Starting with v5.12.0, Material UI can coexist with other component libraries that depend on Emotion or styled-components—this is possible thanks to theme scoping.

To do this, you need to render Material UI's ThemeProvider as an inner provider and use the THEME_ID to store the theme, as shown below:

import { ThemeProvider, THEME_ID, createTheme } from '@mui/material/styles';
import { AnotherThemeProvider } from 'another-ui-library';

const materialTheme = createTheme(/* your theme */);

function App() {
  return (
    <AnotherThemeProvider>
      <ThemeProvider theme={{ [THEME_ID]: materialTheme }}>
        {/* components from another library and Material UI */}
      </ThemeProvider>
    </AnotherThemeProvider>
  );
}

The Material UI theme will be separated from the other library, so when you use APIs such as styled, the sx prop, and useTheme, you'll be able to access Material UI's theme like you normally would.

Minimum version

Theme scoping was introduced in Material UI v5.12.0, so make sure you're running that version or higher.

Using with Theme UI

Render Material UI's theme provider below Theme UI's provider and assign the materialTheme to the THEME_ID property:

import { ThemeUIProvider } from 'theme-ui';
import { createTheme as materialCreateTheme, THEME_ID } from '@mui/material/styles';

const themeUITheme = {
  fonts: {
    body: 'system-ui, sans-serif',
    heading: '"Avenir Next", sans-serif',
    monospace: 'Menlo, monospace',
  },
  colors: {
    text: '#000',
    background: '#fff',
    primary: '#33e',
  },
};

const materialTheme = materialCreateTheme();

function App() {
  return (
    <ThemeUIProvider theme={themeUITheme}>
      <MaterialThemeProvider theme={{ [THEME_ID]: materialTheme }}>
        Theme UI components and Material UI components
      </MaterialThemeProvider>
    </ThemeUIProvider>
  );
}

Using with Chakra UI

Render Material UI's theme provider below Chakra UI's provider and assign the materialTheme to the THEME_ID property:

import { ChakraProvider, extendTheme as chakraExtendTheme } from '@chakra-ui/react';
import {
  ThemeProvider as MaterialThemeProvider,
  createTheme as muiCreateTheme,
  THEME_ID,
} from '@mui/material/styles';

const chakraTheme = chakraExtendTheme();
const materialTheme = muiCreateTheme();

function App() {
  return (
    <ChakraProvider theme={chakraTheme} resetCSS>
      <MaterialThemeProvider theme={{ [THEME_ID]: materialTheme }}>
        Chakra UI components and Material UI components
      </MaterialThemeProvider>
    </ChakraProvider>
  );
}