An experimental css-in-js library built for React
This is pretty experimental and there will be breaking changes often. Don't use it for anything really important yet.
- Server side rendering just works. (just call react-dom'srenderToStringorrenderToNodeStream)
- You like the css prop.
- You want a flexible css-in-js library.
- It works with string styles.
- It works with object styles.
- It has great composition.
- There's no babel plugin, just babel macros.(There's also a babel plugin now if you want it)(i.e. style minification, labels and etc. will work in react-scripts@2)
- It only works with react@>=16.3.0.
- Don't use it if you're totally fine with the styling solution you're already using
- Styles won't be cached in SSR if two elements have the same style and they have no common ancestor with styles from emotion or a Provider
- It requires every style to be rendered in the react tree
- It renders style elements next to the elements that are being styled in SSR so using pseudo-classes like :first-childand:nth-childis unsafe and pseudo-classes like:first-of-typeand:nth-of-typeshould be used instead
yarn add @emotion/core/** @jsx jsx */
import { jsx } from '@emotion/core'
// must be react@>=16.3.0
import { render } from 'react-dom'
render(
  <div css={{ color: 'hotpink' }}>This is hotpink</div>,
  document.getElementById('root')
)yarn add @emotion/css
/** @jsx jsx */
import { jsx } from '@emotion/core'
import css from '@emotion/css'
// must be react@>=16.3.0
import { render } from 'react-dom'
render(
  <div
    css={css`
      color: hotpink;
    `}
  >
    This is hotpink
  </div>,
  document.getElementById('root')
)Note: Global styles are removed on unmount
import * as React from 'react'
import { Global } from '@emotion/core'
import css from '@emotion/css'
import { render } from 'react-dom'
render(
  <Global
    styles={[
      css`
        body {
          color: hotpink;
        }
      `,
      {
        html: {
          backgroundColor: 'darkgreen'
        }
      }
    ]}
  />,
  document.getElementById('root')
)yarn add @emotion/keyframes
/** @jsx jsx */
import { jsx } from '@emotion/core'
import css from '@emotion/css'
import keyframes from '@emotion/keyframes'
import { render } from 'react-dom'
const animation = keyframes(css`
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
`)
render(
  <div>
    <div
      css={css`
        animation: ${animation.name} infinite 20s linear;
        ${animation.styles};
      `}
    >
      This is getting rotated
    </div>
  </div>,
  document.getElementById('root')
)yarn add @emotion/styled
import * as React from 'react'
import styled from '@emotion/styled'
// must be react@>=16.3.0
import { render } from 'react-dom'
const Container = styled.div`
  color: hotpink;
`
render(<Container>This is hotpink</Container>, document.getElementById('root'))yarn add @emotion/provider
/** @jsx jsx */
import { jsx } from '@emotion/core'
import Provider from '@emotion/provider'
import css from '@emotion/css'
import { render } from 'react-dom'
render(
  <Provider theme={{ primary: 'hotpink' }}>
    <div
      css={theme => ({
        color: theme.primary
      })}
    />
  </Provider>,
  document.getElementById('root')
)import * as React from 'react'
import Provider from '@emotion/provider'
import css from '@emotion/css'
import { render } from 'react-dom'
const SomeComponent = styled.div`
  color: ${props => props.theme.primary};
`
render(
  <Provider theme={{ primary: 'hotpink' }}>
    <SomeComponent />
  </Provider>,
  document.getElementById('root')
)emotion next was heavily inspired by glam.