Migration Guide
Migrate your legacy Gatsby site to Reflexjs.
This guide is a work in progress. If you find any issues migrating your site, create an issue on GitHub. We will help you.
Notes#
The most important change to note when migrating to Reflexjs is we are moving away from custom components.
All Reflexjs style props now works with JSX: div, p, button and form
instead of Div, P, Button and Form
.
To help you upgrade your site, we have created a Codemod. The CodeMod will migrate your @reflexjs/components
to JSX
with style props.
Example:
import { Div, H1, Button } from "@reflexjs/components"export default function () {return (<Div d="flex"><H1>This is a heading</H1><Button variant="primary lg">Button</Button></Div>)}
Will be transformed to:
export default function () {return (<div display="flex"><h1 variant="heading.h1">This is a heading</h1><button variant="button.primary.lg">Button</button></div>)}
Migration Guide#
- Install dependencies
npm install reflexjs gatsby-plugin-reflexjs babel-preset-gatsby
- Create a
.babelrc
file with the following:
{"presets": ["babel-preset-gatsby", "reflexjs/babel"]}
- Add
gatsby-plugin-reflexjs
togatsby-config.js
module.exports = {siteMetadata: {title: "Reflexjs",description: "Starter for Reflexjs.",siteUrl: process.env.SITE_URL || "http://localhost:8000",},plugins: [`gatsby-plugin-reflexjs`],}
- Move your
theme.js
file fromsrc/@reflexjs/gatsby-theme-base/theme.js
tosrc/gatsby-plugin-reflexjs/index.js
.
src/gatsby-plugin-reflexjs/index.jsimport base from "@reflexjs/preset-base"export default {preset: base,colors: {primary: `#005ae0`,},}
- We are now ready to run the codemod. You can commit your changes before proceeding.
The codemod will migrate @reflexjs/components
code to JSX with style props.
Run the following command from the root of your site:
npx @reflexjs/codemod to-reflexjs
Once the upgrade is done, you can run gatsby clean && gatsby develop
to re-run your Gatsby server.
Changes#
The following is a list of changes for migrating to Reflexjs. The codemod should upgrade most of the components for you. If anything is not working, refer to the list below:
- Rename all custom components to JSX.
- <Div bg="primary">- <P>Hello World</P>- </Div>+ <div bg="primary">+ <p>Hello World</p>+ </div>
- Button and headings now use
variant
.
- <Button variant="primary">Primary</Button>+ <button variant="button.primary">Primary</button>- <Button variant="secondary lg">Secondary</Button>+ <button variant="button.secondary.lg">Secondary</button>- <H1>Heading One</H1>+ <h1 variant="heading.h1">Heading One</h1>
- Rename
Container
to<div variant="container" />
.
- <Container>Hello World</Container>+ <div variant="container">Hello World</div>
- Add
variant
prop to input, textarea and select.
- <Input type="text" />+ <input variant="input" type="text" />- <Textarea></Textarea>+ <textarea variant="textarea"></textarea>- <Select>- <Option>Option One</Option>- </Select>+ <select variant="select">+ <option>Option One</option>+ </select>
- Rename
d
prop todisplay
.
- <Div d="flex" />+ <div display="flex" />- <Span d="block" />+ <span display="block" />
- Replace hover and focus props with
_hover
and_focus
:
- <Button hoverBg="secondary" hoverColor="white" />+ <button _hover={{+ bg: "secondary",+ color: "white",+ }} />- <A focusBg="secondary" />+ <a _focus={{+ bg: "secondary",+ }} />
Note: only _hover
and _focus
pseudo classes are supported. For other classes such as :before
, use the sx
prop.
<divsx={{":before": {content: '""',},}}/>
Future-proofing your site#
Reflexjs is, essentially, a styling library. In the future, we would probably drop support for custom components such as Flex
and Grid
.
Here are a few (optional) changes you can make to future-proof your site.
- Replace
Flexbox
andFlex
with<div display="flex" />
.
- <Flexbox>Hello World</Flexbox>+ <div display="flex" justifyContent="center">Hello World</div>- <Flex>Hello World</Flex>+ <div display="flex" justifyContent="center">Hello World</div>
- Replace
Grid
with<div display="grid" />
.
- <Grid col="2|4" />+ <div display="grid" col="2|4" />
Note: We will continue supporting the Icon
and VisuallyHidden
components.