design-units

0.2.0 • Public • Published

design-units

Lightweight alternative to styled-system

Only ~700b bytes (minified and gzipped) and does not force developers to use component props for styling

Read more about design systems

examples

import styled from "react-emotion";
import units from "design-units";

const Footer = styled.div`
  position: fixed;
  left: 0;
  bottom: 0;
  ${units({
    backgroundColor: "primary",
    width: 1,
    fontSize: [1, 2]
  })};
`;

This requires theme provider with theme units

export const theme = {
  breakpoints: [320, 480, 640],
  space: [0, 4, 8, 16, 32, 64, 128, 256, 512],
  fontSizes: [12, 14, 16, 20, 24, 36, 48, 80, 96],
  // ...
}

import { ThemeProvider } from 'emotion-theming'

 <ThemeProvider theme={theme}>
    <Footer />
  </ThemeProvider>

Usage

for any value design-units tries to find defined units in the theme, if it's a number, then it looks by array index, if it's a string, then it's just a dictionary lookup

styled.div`
  ${units({
    fontSize: 1,
    color: "red",
    width: "100em"
  })}
`  

is equivalent to

styled.div`
    fontSize: ${props => props.theme.fontSizes[1]};
    color: ${props => props.theme.colors.red};
    width: 100em;
  `

if desgin value is not found, then original value is used

Space (padding and margins)

Units for padding and margin (including paddingLeft, marginTop etc..) are mapped to theme.space

Width

If width value <= 1, then it is used as percentage, e.g. width: 1/2 is equivalent width: "50%"

for values bigger than 1 it's converted to pixels width: 200 -> width: '200px'

Colors

properties that have color keyword in it are mapped to theme.colors

All other props

All other props are mapped to ${popertyName}s, e.g. lineHeight: heading -> theme.lineHeights.heading

Responsive

Whenever multiple values defined the unit, it means that those values should be used for different breakpoints

theme = { 
  breakpoints: [320, 480, 640],
  ...
}

styled.div`
${units({
  width: [1, 1/2, 1/4]
})}
`

is converted to

styled.div`
  width: 100%;
  @media (min-width: 320px) {
    width: 50%;
  }  

  @media (min-width: 480px) {
    width: 25%;
  }

`

Nested selectors

styled.div`
${units({
  color: "black", 
  "&:hover": {
    color: "blue"
  }
})}
`

Package Sidebar

Install

npm i design-units

Weekly Downloads

0

Version

0.2.0

License

MIT

Unpacked Size

9.93 kB

Total Files

7

Last publish

Collaborators

  • romanlv