Theming

Using Tokens

There are various ways to consume Panda tokens depending on your need at that point in time.

Style Properties

The recommended way to consume your tokens is in the css function or style props.

import { css } from '../styled-system/css'
 
const App = () => (
  <div
    className={css({
      color: 'green.400',
      background: 'gray.200'
    })}
  />
)

Composite values

Some CSS properties like border, box-shadow allow you to specify multiple properties in its value. Panda allows you to reference tokens in these composite values by using the token() function.

import { css } from '../styled-system/css'
 
const className = css({ border: '1px solid token(colors.red.400)' })

You can also provide a fallback value.

import { css } from '../styled-system/css'
 
const className = css({ border: '1px solid token(colors.red.400, red)' })

You can also use it in media queries or any other CSS at-rule.

import { css } from '../styled-system/css'
 
const className = css({
  '@media screen and (min-width: token(sizes.4xl))': {
    color: 'green.400'
  }
})

Vanilla JS

Use the generated token function to query design tokens in your project. This is useful if you need direct access to your design tokens in the style attribute or when using CSS-in-JS libraries like styled-components or @emotion/styled

💡

This approach is useful for incrementally adopting Panda in existing projects.

Style Attribute

import { token } from '../styled-system/tokens'
 
function App() {
  return (
    <div
      style={{
        background: token('colors.blue.200')
      }}
    />
  )
}

Each of your design tokens will be available in the generated /tokens folder. It looks like this:

const tokens = {
  // ...
  'colors.blue.200': {
    value: '#bfdbfe',
    variable: 'var(--colors-blue-200)'
  }
  // ...
}
  • The token() function returns the raw value of the token.
  • The token.var() function returns the CSS custom property used to reference the token.

Both functions are typesafe and expect a known dot-separated token path, they also accept a fallback value as a second argument.

Using the example above, token('colors.blue.200') would return #bfdbfe and token.var('colors.blue.200') would return var(--colors-blue-200).

Styled Components

import styled from 'styled-components'
 
const Button = styled.button`
  background: ${token('colors.blue.200')};
`

Emotion

import styled from '@emotion/styled'
 
const Button = styled.button`
  background: ${token('colors.blue.200')};
`