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
			| 
											3 years ago
										 | 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', | ||
|  |     }) | ||
|  |   }) | ||
|  | }) |