Similar to Storybook, react-styleguidist is used to show the custom UI elements.
It is easy to setup and use, it uses markdown file as example page:
install:
npm i react-styleguidist --save
Create styleguide.config.js file:
const path = require('path')
module.exports = {
styleguideComponents: {
Wrapper: path.join(__dirname, 'src/Provider.js'),
},
}
Provider.js
You can put all Providers inside this file, for example mine is:
import React from 'react' import { ThemeProvider } from 'styled-components' import { Provider } from 'react-redux' import { theme } from './theme' import { configureStore } from './configureStore' export default function Providers({ children }) { return ( <Provider store={configureStore()}> <ThemeProvider theme={theme}>{children}</ThemeProvider> </Provider> ) }
---
Now for example we want to display a button component:
components/Button.md
Primary and secondary buttons: ```jsx <Button variant="primary">Click me</Button> <Button variant="secondary">Click me</Button> ``` Disabled: ```jsx <Button variant="primary" disabled>Click me</Button> <Button variant="secondary" disabled>Click me</Button> ``` Button as a link: ```jsx <Button variant="primary" as="a" href="/">Click me</Button> <Button variant="secondary" as="a" href="/">Click me</Button> ```
components/Button.js:
import styled, { ThemeProvider } from 'styled-components' import PropTypes from 'prop-types' import css from '@styled-system/css' import { variant } from 'styled-system' const variants = { primary: { color: 'background', backgroundColor: 'primary', }, secondary: { color: 'primary', backgroundColor: 'background', }, } const Button = styled.button( css({ boxSizing: 'border-box', display: 'inline-block', textAlign: 'center', px: 4, py: 3, color: (props) => (props.variant === 'primary' ? 'background' : 'primary'), backgroundColor: (props) => props.variant === 'primary' ? 'primary' : 'background', border: '1px solid', borderColor: 'primary', borderRadius: 'round', fontFamily: 'body', fontSize: 'm', textDecoration: 'none', '&:hover:not(:disabled),&:active:not(:disabled),&:focus': { outline: 0, color: 'background', borderColor: 'accent', backgroundColor: 'accent', cursor: 'pointer', }, '&:disabled': { opacity: 0.6, filter: 'saturate(60%)', }, }), variant({ variants }), ) export default Button
Run:
styleguidist server
open: localhost:6060
---
theme.js:
// https://theme-ui.com/theme-spec/ export const theme = { colors: { text: '#333', background: '#fff', primary: '#783396', secondary: '#767676', accent: '#d396c3', muted: '#efefef', }, space: [ 0, '0.125rem', // 2px '0.25rem', // 4px '0.5rem', // 8px '1rem', // 16px '2rem', // 32px '4rem', // 64px '8rem', // 128px '16rem', // 256px ], fonts: { body: 'Helvetica Neue, Helvetica, Arial, sans-serif', heading: 'Helvetica Neue, Helvetica, Arial, sans-serif', }, fontSizes: { xl: '4rem', l: '2rem', m: '1rem', s: '0.9rem', xs: '0.75rem', }, fontWeights: { light: 200, normal: 400, bold: 700, }, lineHeights: { body: 1.5, heading: 1.1, }, borders: { none: 'none', thin: '1px solid', }, radii: { none: 0, base: '0.25em', round: 99999, }, }