You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
291 lines
6.3 KiB
291 lines
6.3 KiB
import { system } from '../src'
|
|
|
|
test('returns a style parser', () => {
|
|
const parser = system({
|
|
color: true,
|
|
backgroundColor: {
|
|
property: 'backgroundColor',
|
|
scale: 'colors',
|
|
},
|
|
mx: {
|
|
scale: 'space',
|
|
properties: ['marginLeft', 'marginRight'],
|
|
},
|
|
})
|
|
expect(typeof parser).toBe('function')
|
|
const styles = parser({
|
|
theme: {
|
|
space: [0, 4, 8, 16, 32],
|
|
colors: {
|
|
primary: 'rebeccapurple',
|
|
},
|
|
},
|
|
color: 'tomato',
|
|
backgroundColor: 'primary',
|
|
mx: [2, 3, 4],
|
|
})
|
|
expect(styles).toEqual({
|
|
color: 'tomato',
|
|
backgroundColor: 'rebeccapurple',
|
|
marginLeft: 8,
|
|
marginRight: 8,
|
|
'@media screen and (min-width: 40em)': {
|
|
marginLeft: 16,
|
|
marginRight: 16,
|
|
},
|
|
'@media screen and (min-width: 52em)': {
|
|
marginLeft: 32,
|
|
marginRight: 32,
|
|
},
|
|
})
|
|
})
|
|
|
|
test('merges multiple responsive styles', () => {
|
|
const parser = system({
|
|
margin: true,
|
|
padding: true,
|
|
width: true,
|
|
})
|
|
const styles = parser({
|
|
margin: [0, 4, 8],
|
|
padding: [16, 32, 64],
|
|
width: ['100%', '50%'],
|
|
})
|
|
expect(styles).toEqual({
|
|
margin: 0,
|
|
padding: 16,
|
|
width: '100%',
|
|
'@media screen and (min-width: 40em)': {
|
|
margin: 4,
|
|
padding: 32,
|
|
width: '50%',
|
|
},
|
|
'@media screen and (min-width: 52em)': {
|
|
margin: 8,
|
|
padding: 64,
|
|
},
|
|
})
|
|
})
|
|
|
|
test('merges multiple responsive object styles', () => {
|
|
const parser = system({
|
|
margin: true,
|
|
padding: true,
|
|
width: true,
|
|
})
|
|
const styles = parser({
|
|
margin: { _: 0, 0: 4, 1: 8 },
|
|
padding: { _: 16, 0: 32, 1: 64 },
|
|
width: { _: '100%', 0: '50%' },
|
|
})
|
|
expect(styles).toEqual({
|
|
margin: 0,
|
|
padding: 16,
|
|
width: '100%',
|
|
'@media screen and (min-width: 40em)': {
|
|
margin: 4,
|
|
padding: 32,
|
|
width: '50%',
|
|
},
|
|
'@media screen and (min-width: 52em)': {
|
|
margin: 8,
|
|
padding: 64,
|
|
},
|
|
})
|
|
})
|
|
|
|
test('gets values from theme', () => {
|
|
const parser = system({
|
|
mx: {
|
|
properties: ['marginLeft', 'marginRight'],
|
|
scale: 'space',
|
|
},
|
|
color: {
|
|
property: 'color',
|
|
scale: 'colors',
|
|
},
|
|
})
|
|
const style = parser({
|
|
theme: {
|
|
colors: {
|
|
primary: 'tomato',
|
|
},
|
|
space: [0, 6, 12, 24, 48, 96],
|
|
},
|
|
mx: [0, 1, 2, 3],
|
|
color: ['primary', 'black'],
|
|
})
|
|
expect(style).toEqual({
|
|
color: 'tomato',
|
|
marginLeft: 0,
|
|
marginRight: 0,
|
|
'@media screen and (min-width: 40em)': {
|
|
color: 'black',
|
|
marginLeft: 6,
|
|
marginRight: 6,
|
|
},
|
|
'@media screen and (min-width: 52em)': {
|
|
marginLeft: 12,
|
|
marginRight: 12,
|
|
},
|
|
'@media screen and (min-width: 64em)': {
|
|
marginLeft: 24,
|
|
marginRight: 24,
|
|
},
|
|
})
|
|
})
|
|
|
|
test('gets 0 index values from theme', () => {
|
|
const parser = system({
|
|
width: {
|
|
property: 'width',
|
|
scale: 'sizes',
|
|
}
|
|
})
|
|
const style = parser({
|
|
theme: {
|
|
sizes: [ 24, 48 ],
|
|
},
|
|
width: 0,
|
|
})
|
|
expect(style).toEqual({ width: 24 })
|
|
})
|
|
|
|
test('ignores null values', () => {
|
|
const parser = system({
|
|
color: true,
|
|
})
|
|
const style = parser({ color: null })
|
|
expect(style).toEqual({})
|
|
})
|
|
|
|
test('returns a noop function with no arguments', () => {
|
|
const parser = system()
|
|
expect(typeof parser).toBe('function')
|
|
})
|
|
|
|
test('skips null values in arrays', () => {
|
|
const parser = system({
|
|
fontSize: true,
|
|
})
|
|
const style = parser({
|
|
fontSize: [ 16, null, null, 18 ],
|
|
})
|
|
expect(style).toEqual({
|
|
fontSize: 16,
|
|
// omitting these keys cause issues when using multiple
|
|
// responsive props together #561 #551 #549
|
|
'@media screen and (min-width: 40em)': {},
|
|
'@media screen and (min-width: 52em)': {},
|
|
'@media screen and (min-width: 64em)': {
|
|
fontSize: 18,
|
|
}
|
|
})
|
|
})
|
|
|
|
test('includes single property functions', () => {
|
|
const parser = system({
|
|
color: true,
|
|
backgroundColor: true,
|
|
width: true,
|
|
})
|
|
const a = parser.color({ color: 'tomato', backgroundColor: 'nope' })
|
|
const b = parser.width({ width: '100%', color: 'tomato', backgroundColor: 'nope' })
|
|
expect(a).toEqual({ color: 'tomato' })
|
|
expect(b).toEqual({ width: '100%' })
|
|
})
|
|
|
|
test('parser configs can be composed manually', () => {
|
|
const color = system({ color: true, backgroundColor: true })
|
|
const layout = system({ width: true, height: true })
|
|
const composed = system({ ...color.config, ...layout.config })
|
|
const style = composed({
|
|
color: 'tomato',
|
|
backgroundColor: 'black',
|
|
width: '100%',
|
|
})
|
|
expect(style).toEqual({
|
|
color: 'tomato',
|
|
backgroundColor: 'black',
|
|
width: '100%',
|
|
})
|
|
})
|
|
|
|
test('supports non-array breakpoints object', () => {
|
|
const parser = system({
|
|
margin: true,
|
|
padding: true,
|
|
width: true,
|
|
})
|
|
const styles = parser({
|
|
theme: {
|
|
disableStyledSystemCache: true,
|
|
breakpoints: {
|
|
sm: '32em',
|
|
md: '40em',
|
|
lg: '64em',
|
|
}
|
|
},
|
|
margin: { _: 0, sm: 4, md: 8 },
|
|
padding: { _: 16, lg: 64 },
|
|
})
|
|
expect(styles).toEqual({
|
|
margin: 0,
|
|
padding: 16,
|
|
'@media screen and (min-width: 32em)': {
|
|
margin: 4,
|
|
},
|
|
'@media screen and (min-width: 40em)': {
|
|
margin: 8,
|
|
},
|
|
'@media screen and (min-width: 64em)': {
|
|
padding: 64,
|
|
},
|
|
})
|
|
})
|
|
|
|
test('sorts media queries when responsive object values are used', () => {
|
|
const parser = system({
|
|
margin: true,
|
|
padding: true,
|
|
color: true,
|
|
})
|
|
const styles = parser({
|
|
theme: {
|
|
disableStyledSystemCache: true,
|
|
breakpoints: {
|
|
sm: '32em',
|
|
md: '40em',
|
|
lg: '64em',
|
|
xl: '128em',
|
|
}
|
|
},
|
|
padding: { _: 16, lg: 64, xl: 128 },
|
|
margin: { sm: 4, md: 8 },
|
|
color: { lg: 'tomato' },
|
|
})
|
|
expect(Object.keys(styles)).toEqual([
|
|
'@media screen and (min-width: 32em)',
|
|
'@media screen and (min-width: 40em)',
|
|
'@media screen and (min-width: 64em)',
|
|
'@media screen and (min-width: 128em)',
|
|
'padding',
|
|
])
|
|
})
|
|
|
|
test('transforms values', () => {
|
|
const parser = system({
|
|
margin: {
|
|
property: 'margin',
|
|
transform: (n, scale, props) => {
|
|
const m = props.multiply || 1
|
|
return m * n
|
|
}
|
|
}
|
|
})
|
|
const a = parser({ margin: 8 })
|
|
const b = parser({ margin: 12, multiply: 2 })
|
|
expect(a).toEqual({ margin: 8 })
|
|
expect(b).toEqual({ margin: 24 })
|
|
})
|