PHP 8.2.30
Preview: index.js Size: 5.09 KB
/home/byroehnu/easepay.easetack.com/node_modules/@styled-system/variant/test/index.js

import {
  variant,
  textStyle,
  colorStyle,
} from '../src'
import { system, compose } from '@styled-system/core'

const theme = {
  colors: {
    blue: '#07c',
    black: '#111',
  },
}

const fontSize = system({ fontSize: true })
const color = system({ color: true })

test('variant returns style objects from theme', () => {
  const buttons = variant({ key: 'buttons' })
  const a = buttons({
    theme: {
      buttons: {
        primary: {
          padding: '32px',
          backgroundColor: 'tomato',
        },
      },
    },
    variant: 'primary',
  })
  expect(a).toEqual({
    padding: '32px',
    backgroundColor: 'tomato',
  })
})

test('variant prop can be customized', () => {
  const buttons = variant({ key: 'buttons', prop: 'type' })
  const a = buttons({
    theme: {
      buttons: {
        primary: {
          padding: '32px',
          backgroundColor: 'tomato',
        },
      },
    },
    type: 'primary',
  })
  expect(a).toEqual({
    padding: '32px',
    backgroundColor: 'tomato',
  })
})

test('variant can be composed', () => {
  const system = compose(
    variant({ key: 'typography' }),
    fontSize,
    color
  )
  const result = system({
    theme: {
      typography: {
        primary: {
          fontSize: '32px',
          color: '#fff',
        },
      },
    },
    variant: 'primary',
    color: '#111',
  })
  expect(result).toEqual({
    fontSize: '32px',
    color: '#111',
  })
})

test('textStyle prop returns theme.textStyles object', () => {
  const a = textStyle({
    theme: {
      textStyles: {
        heading: {
          fontWeight: 'bold',
          lineHeight: 1.25,
        },
      },
    },
    textStyle: 'heading',
  })
  expect(a).toEqual({
    fontWeight: 'bold',
    lineHeight: 1.25,
  })
})

test('colors prop returns theme.colorStyles object', () => {
  const a = colorStyle({
    theme: {
      colorStyles: {
        dark: {
          color: '#fff',
          backgroundColor: '#000',
        },
      },
    },
    colors: 'dark',
  })
  expect(a).toEqual({
    color: '#fff',
    backgroundColor: '#000',
  })
})

describe('component variant', () => {
  test('returns a variant defined inline', () => {
    const comp = variant({
      variants: {
        primary: {
          color: 'black',
          bg: 'tomato',
        },
        secondary: {
          color: 'white',
          bg: 'purple',
        },
      }
    })
    const primary = comp({ variant: 'primary' })
    const secondary = comp({ variant: 'secondary' })
    expect(primary).toEqual({
      color: 'black',
      backgroundColor: 'tomato',
    })
    expect(secondary).toEqual({
      color: 'white',
      backgroundColor: 'purple',
    })
  })

  test('returns theme-aware styles', () => {
    const comp = variant({
      variants: {
        primary: {
          p: 3,
          fontSize: 1,
          color: 'white',
          bg: 'primary',
        },
      }
    })
    const style = comp({
      variant: 'primary',
      theme: {
        colors: {
          primary: '#07c',
        }
      }
    })
    expect(style).toEqual({
      padding: 16,
      fontSize: 14,
      color: 'white',
      backgroundColor: '#07c',
    })
  })

  test('can use a custom prop name', () => {
    const comp = variant({
      prop: 'size',
      variants: {
        big: {
          fontSize: 32,
          fontWeight: 900,
          lineHeight: 1.25,
        },
      }
    })
    const style = comp({ size: 'big' })
    expect(style).toEqual({
      fontSize: 32,
      fontWeight: 900,
      lineHeight: 1.25,
    })
  })

  test('does not throw when no variants are found', () => {
    const comp = variant({
      variants: {
        beep: {}
      }
    })
    let style
    expect(() => {
      style = comp({ variant: 'beep' })
    }).not.toThrow()
    expect(style).toEqual({})
  })

  test('returns empty object when no prop is provided', () => {
    const comp = variant({
      variants: {
        beep: {}
      }
    })
    const style = comp({})
    expect(style).toEqual({})
  })

  test('can be composed with other style props', () => {
    const parser = compose(
      variant({
        variants: {
          tomato: {
            color: 'tomato',
            fontSize: 20,
            fontWeight: 'bold',
          }
        }
      }),
      color,
      fontSize
    )
    const a = parser({
      variant: 'tomato',
    })
    const b = parser({
      variant: 'tomato',
      color: 'blue',
      fontSize: 32,
    })
    expect(a).toEqual({
      color: 'tomato',
      fontSize: 20,
      fontWeight: 'bold',
    })
    expect(b).toEqual({
      color: 'blue',
      fontSize: 32,
      fontWeight: 'bold',
    })
  })

  test('theme-based variants override local variants', () => {
    const comp = variant({
      variants: {
        primary: {
          color: 'white',
          bg: 'blue',
        }
      },
      scale: 'buttons',
    })
    const style = comp({
      variant: 'primary',
      theme: {
        buttons: {
          primary: {
            color: 'black',
            bg: 'cyan',
          }
        }
      }
    })
    expect(style).toEqual({
      color: 'black',
      backgroundColor: 'cyan',
    })
  })
})

Directory Contents

Dirs: 0 × Files: 2

Name Size Perms Modified Actions
127 B lr--r--r-- 2026-03-14 01:49:09
Edit Download
5.09 KB lrw-r--r-- 2026-02-28 00:27:10
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).