テンプレートを作っておくと何かと楽なので、メモを含めて作成
npm init gatsby
yarn add @chakra-ui/gatsby-plugin @chakra-ui/react @emotion/react @emotion/styled framer-motion
gatsby-config.js にプラグインを追加
// gatsby-config.js
module.exports = {
  plugins: [
    {
      resolve: "@chakra-ui/gatsby-plugin",
      options: {
        resetCSS: true,
        isUsingColorMode: true,
      },
    },
  ],
}
theme.js を作成
// src/@chakra-ui/gatsby-plugin/theme.js
import { extendTheme } from '@chakra-ui/react'
// componentのスタイルをカスタムする
const Container = {
  baseStyle: {
    maxW: { base: 'calc(100vw - 40px)', lg: '60vw' },
  },
}
const theme = {
  components: {
    Container,
    Text: {
      baseStyle: {
        lineHeight: 2,
        fontWeight: 700,
        letterSpacing: '2px',
      },
    },
    GridItem: {
      baseStyle: {
        letterSpacing: '4px',
      },
    },
  },
  colors: {
    primary: '#F01',
    dark: '#000',
  },
  fonts: {
    heading: 'futura-pt, sans-serif',
    body: 'source-han-sans-japanese, "Noto Sans JP"',
  },
  textStyles: {
    en: {
      fontFamily: 'futura-pt',
    },
    italic: {
      fontFamily: 'Dancing Script',
    },
  },
}
export default extendTheme(theme)
Provider コンポーネントを作成
// src/@chakra-ui/gatsby-plugin/Provider.js
import { ChakraProvider } from '@chakra-ui/react'
import React from 'react'
import theme from './theme'
const ThemeProvider = (props) => {
  return (
    <ChakraProvider
      theme={theme}
      resetCSS={props.resetCSS || true}
      portalZIndex={props.portalZIndex || 40}
    >
      {props.element}
    </ChakraProvider>
  )
}
export default ThemeProvider
wrapper.js component を作成して、gatsby-ssr.js と gatsby-browser.js を作成
// src/wrapper.js
import React from 'react'
import ThemeProvider from './@chakra-ui/gatsby-plugin/Provider'
import Layout from './components/layout'
import './styles/global.css'
export const wrapPageElement = ({ element, props }) => {
  return <Layout {...props}>{element}</Layout>
}
export const wrapRootElement = ({ element }) => {
  return <ThemeProvider element={element} />
}
// gatsby-browser.js
import { wrapPageElement as wrap } from './src/wrapper'
export const wrapPageElement = wrap
// gatsby-ssr.js
import { wrapPageElement as wrap } from './src/wrapper'
export const wrapPageElement = wrap