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.
		
		
		
		
		
			
		
			
				
					
					
						
							272 lines
						
					
					
						
							5.1 KiB
						
					
					
				
			
		
		
	
	
							272 lines
						
					
					
						
							5.1 KiB
						
					
					
				| 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',
 | |
|     })
 | |
|   })
 | |
| })
 |