テンプレートを作っておくと何かと楽なので、メモを含めて作成
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