Skip to main content
Community Plugin
View plugin on GitHub
See starters using this

gatsby-theme-material-ui

A Gatsby theme for Material-UI: The fastest way to build server-side rendered Material-UI websites

Install

// with npm
npm install gatsby-theme-material-ui @material-ui/core

// with yarn
yarn add gatsby-theme-material-ui @material-ui/core

Theme vs. Plugin

  • gatsby-plugin-material-ui solves FOUC, auto prefixing and minification.
  • gatsby-theme-material-ui uses the plugin under the hood, adds web fonts, meta-viewport, CSS baseline and mui theme support and has material ui styled gatsby link components

How to use

Edit gatsby-config.js

module.exports = {
  plugins: [`gatsby-theme-material-ui`],
};

top-layout

You’ll see several references below to the “top-layout” theme. Its role is to prevent the Flash Of Unstyle Content.

Style Library Interoperability

This theme is compatible with other CSS-in-JS solutions out of the box. To prevent unintentional style clobbering, Material-UI styles are injected before those generated by your styling library of choice. Read more about this strategy at the Material-UI docs.

Autoprefixing and minification

By default, the plugin adds vendor-specific prefixes and minimizes the server-side CSS. The following options are available for deactivating:

Option Default Description
disableAutoprefixing false Opt-out Autoprefixing (autoprefixer)
disableMinification false Opt-out minification (clean-css)
module.exports = {
  plugins: [
    {
      resolve: `gatsby-theme-material-ui`,
      options: {
        stylesConfig: {
          // disableAutoprefixing: true,
          // disableMinification: true
        },
      },
    },
  ],
};

WebFonts

Material-UI was designed with the Roboto font in mind. The Roboto font will be automatically loaded by gatsby-theme-material-ui. You can override this behavior as follows:

Edit theme.js

// src/gatsby-theme-material-ui-top-layout/theme.js

import { createMuiTheme } from "@material-ui/core";

const theme = createMuiTheme({
  typography: {
    fontFamily: [
        'Montserrat',
        'sans-serif'
      ].join(','),
    },
    ...
  });

export default theme;

Edit gatsby-config.js

// gatsby-config.js

module.exports = {
  plugins: [
    {
      resolve: `gatsby-theme-material-ui`,
      options: {
        webFontsConfig: {
          fonts: {
            google: [
              {
                family: `Montserrat`,
                variants: [`300`, `400`, `500`],
              },
            ],
          },
        },
      },
    },
  ],
};

For more options, have a look at the plugin readme.

Theming

Create & Edit src/gatsby-theme-material-ui-top-layout/theme.js

import { createMuiTheme } from "@material-ui/core";

const theme = createMuiTheme({
  //   palette: {
  //     type: 'dark',
  //   },
});

export default theme;
import React from "react";
import { Typography } from "@material-ui/core";
//import { Link } from "gatsby"
import { Link } from "gatsby-theme-material-ui";

const Page = () => (
  <div>
    <Typography>
      Check out my <Link to="/blog">blog</Link>!
    </Typography>
  </div>
);

export default Page;

The following components have also been adapted for use with Gatsby:

import {
  BottomNavigationAction,
  Button,
  CardActionArea,
  Fab,
  IconButton,
  Link,
} from "gatsby-theme-material-ui";

For <Button>s with href URLs, use the to attribute instead of href, to enable Gatsby link features.

Customizing

Create & Edit src/gatsby-theme-material-ui-top-layout/components/top-layout.js

import React from "react";
import { Provider } from "react-redux";
import ThemeTopLayout from "gatsby-theme-material-ui-top-layout/src/components/top-layout";

import createStore from "../../state/createStore";

export default function TopLayout({ children, theme }) {
  const store = createStore();

  return (
    <Provider store={store}>
      <ThemeTopLayout theme={theme}>{children}</ThemeTopLayout>
    </Provider>
  );
}

License

MIT