Skip to content

mleralec/jsx-to-styled

Repository files navigation

jsx-to-styled adds styled props to your React components

πŸ“ What it is ?

Inspired by xstyled and styled-system, jsx-to-styled adds styled props to your React styled-components. The main idea of this library is to stay really simple and performant.

All styled props injected by jsx-to-styled are prefixed by $ symbol to prevent forwarding props to html element, check the styled-components transiant props section for more informations.

πŸ”§ Installation

You must have react and styled-components already installed

npm i jsx-to-styled
# or
yarn add jsx-to-styled

πŸ’» Usage

You can use jsx-to-styled without theme (codesandbox example)

import styled from 'styled-components'
import system from 'jsx-to-styled'

// create your styled component with system props
const Box = styled.div(system)

// now you can use all jsx-to-styled props
return (
  <Box $color="white" $backgroundColor="tomato" $p="30px" $borderRadius="50%">
    Hello World!
  </Box>
)

Or use with a theme to use custom values (codesandbox example)

import styled, { ThemeProvider } from 'styled-components'
import system from 'jsx-to-styled'

// create your styled component with system props
const Box = styled.div(system)

// create your theme
const theme = {
  colors: {
    primary: 'white',
    secondary: 'tomato',
  },
  spaces: {
    xl: '30px',
  },
  radii: {
    half: '50%',
  },
}

// now you can use all jsx-to-styled props with theme values
return (
  <ThemeProvider theme={theme}>
    <Box $color="primary" $backgroundColor="secondary" $p="xl" $borderRadius="half">
      Hello World!
    </Box>
  </ThemeProvider>
)

✨ Typescript

Thanks to csstype, jsx-to-styled is fully typed. You will have autocomplete for all possible css values.

import system, { SystemProps } from 'jsx-to-styled'

// don't forget to add SystemProps type to your styled-component definition
const Box = styled.div<SystemProps>(system)

If you want to access to your theme values, you have to redefine "Theme" interface with your custom theme like that:

// theme.d.ts
import 'jsx-to-styled'
import { theme } from './theme'

type MyTheme = typeof theme

declare module 'jsx-to-styled' {
  export interface Theme extends MyTheme {}
}

πŸ“± Responsive (breakpoints)

You can use breakpoints in your styled props (codesandbox example)

// add "breakpoints" key in your theme
const theme = {
  colors: {
    primary: 'white',
    secondary: 'tomato',
  },
  breakpoints: {
    sm: '600px',
  },
}

// flexDirection will be "column" by default and "row" on screens > 600px
return (
  <Box $display="flex" $flexDirection={{ _: 'column', sm: 'row' }}>
    <Box>A</Box>
    <Box>B</Box>
  </Box>
)

🍱 States

You can use states in your styled props (codesandbox example)

// add "states" key in your theme
const theme = {
  colors: {
    primary: 'white',
    secondary: 'tomato',
  },
  states: {
    hover: '&:hover',
  },
}

// color will be "white" by default and "tomato" on hover
return <Box $color={{ _: 'primary', hover: 'secondary' }}>Hello World!</Box>

πŸ“• Props

System is composed by all of props below

Background

JSX Property CSS property Theme key
$background background
$backgroundImage background-image
$backgroundSize background-size
$backgroundPosition background-position
$backgroundRepeat background-repeat

Border

JSX Property CSS property Theme key
$border border
$borderWidth border-width borderWidths
$borderStyle border-style
$borderColor border-color colors
$borderRadius border-radius radii
$borderTop border-top
$borderTopWidth border-top-width borderWidths
$borderTopStyle border-top-style
$borderTopColor border-top-color colors
$borderTopLeftRadius border-top-left-radius radii
$borderTopRightRadius border-top-right-radius radii
$borderRight border-right
$borderRightWidth border-right-width borderWidths
$borderRightStyle border-right-style
$borderRightColor border-right-color colors
$borderBottom border-bottom
$borderBottomWidth border-bottom-width borderWidths
$borderBottomStyle border-bottom-style
$borderBottomColor border-bottom-color colors
$borderBottomLeftRadius border-bottom-left-radius radii
$borderBottomRightRadius border-bottom-right-radius radii
$borderLeft border-left
$borderLeftWidth border-left-width borderWidths
$borderLeftStyle border-left-style
$borderLeftColor border-left-color colors

Color

JSX Property CSS property Theme key
$backgroundColor background-color colors
$color color colors
$opacity opacity

Flex

JSX Property CSS property Theme key
$flex flex
$alignContent align-content
$alignItems align-items
$alignSelf align-self
$justifyContent justify-content
$justifyItems justify-items
$justifySelf justify-self
$flexBasis flex-basis
$flexDirection flex-direction
$flexGrow flex-grow
$flexShrink flex-shrink
$flexWrap flex-wrap
$order order

Grid

JSX Property CSS property Theme key
$gap gap spaces
$columnGap column-gap spaces
$rowGap row-gap spaces
$gridColumn grid-column
$gridRow grid-row
$gridArea grid-area
$gridAutoFlow grid-auto-flow
$gridAutoColumns grid-auto-columns
$gridAutoRows grid-auto-rows
$gridTemplateColumns grid-template-columns
$gridTemplateRows grid-template-rows
$gridTemplateAreas grid-template-areas

Layout

JSX Property CSS property Theme key
$w width sizes
$h height sizes
$minW min-width sizes
$maxW max-width sizes
$minH min-height sizes
$maxH max-height sizes
$display display
$verticalAlign vertical-align
$overflow overflow
$overflowX overflow-x
$overflowY overflow-y

Position

JSX Property CSS property Theme key
$position position
$zIndex z-index
$top op spaces
$right right spaces
$bottom bottom spaces
$left left spaces

Space

JSX Property CSS property Theme key
$m margin spaces
$mt margin-top spaces
$mr margin-right spaces
$mb margin-bottom spaces
$ml margin-left spaces
$my margin-top, margin-bottom spaces
$mx margin-right, margin-left spaces
$p padding spaces
$pt padding-top spaces
$pr padding-right spaces
$pb padding-bottom spaces
$pl padding-left spaces
$py padding-top, padding-bottom spaces
$px padding-right, padding-left spaces

Typography

JSX Property CSS property Theme key
$fontFamily font-family fonts
$fontSize font-size fontSizes
$fontWeight font-weight fontWeights
$lineHeight line-height lineHeights
$letterSpacing line-spacing letterSpacings
$textAlign text-align
$fontStyle font-style
$textDecoration text-decoration
$textTransform text-transform

Other

JSX Property CSS property Theme key
$cusor cursor
$float float
$objectFit object-fit
$objectPosition object-position
$transform transform
$visibility visibility

About

add styled props to your React styled-components

Resources

Stars

Watchers

Forks

Packages

No packages published