@cssxjs/css-to-react-native 3.2.0-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +115 -0
  3. package/index.d.ts +17 -0
  4. package/index.js +930 -0
  5. package/package.json +68 -0
  6. package/src/TokenStream.js +74 -0
  7. package/src/__tests__/aspectRatio.js +23 -0
  8. package/src/__tests__/border.js +141 -0
  9. package/src/__tests__/borderColor.js +92 -0
  10. package/src/__tests__/boxModel.js +136 -0
  11. package/src/__tests__/boxShadow.js +167 -0
  12. package/src/__tests__/colors.js +31 -0
  13. package/src/__tests__/flex.js +122 -0
  14. package/src/__tests__/flexFlow.js +22 -0
  15. package/src/__tests__/font.js +117 -0
  16. package/src/__tests__/fontFamily.js +43 -0
  17. package/src/__tests__/fontVariant.js +15 -0
  18. package/src/__tests__/fontWeight.js +8 -0
  19. package/src/__tests__/index.js +238 -0
  20. package/src/__tests__/placeContent.js +19 -0
  21. package/src/__tests__/shadowOffsets.js +13 -0
  22. package/src/__tests__/textDecoration.js +165 -0
  23. package/src/__tests__/textDecorationLine.js +23 -0
  24. package/src/__tests__/textShadow.js +107 -0
  25. package/src/__tests__/transform.js +69 -0
  26. package/src/__tests__/units.js +132 -0
  27. package/src/devPropertiesWithoutUnitsRegExp.js +19 -0
  28. package/src/index.js +90 -0
  29. package/src/tokenTypes.js +112 -0
  30. package/src/transforms/aspectRatio.js +12 -0
  31. package/src/transforms/border.js +57 -0
  32. package/src/transforms/boxShadow.js +11 -0
  33. package/src/transforms/flex.js +65 -0
  34. package/src/transforms/flexFlow.js +37 -0
  35. package/src/transforms/font.js +63 -0
  36. package/src/transforms/fontFamily.js +20 -0
  37. package/src/transforms/fontVariant.js +14 -0
  38. package/src/transforms/index.js +78 -0
  39. package/src/transforms/placeContent.js +24 -0
  40. package/src/transforms/textDecoration.js +56 -0
  41. package/src/transforms/textDecorationLine.js +18 -0
  42. package/src/transforms/textShadow.js +10 -0
  43. package/src/transforms/transform.js +74 -0
  44. package/src/transforms/util.js +103 -0
package/package.json ADDED
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "@cssxjs/css-to-react-native",
3
+ "version": "3.2.0-0",
4
+ "publishConfig": {
5
+ "access": "public"
6
+ },
7
+ "description": "Convert CSS text to a React Native stylesheet object",
8
+ "main": "index.js",
9
+ "types": "index.d.ts",
10
+ "scripts": {
11
+ "build": "rollup ./src/index.js -o index.js --f cjs && babel index.js -o index.js",
12
+ "test": "jest",
13
+ "test:watch": "jest --watch",
14
+ "lint": "eslint src",
15
+ "prepublish": "npm run build",
16
+ "precommit": "lint-staged",
17
+ "lint-staged": "lint-staged"
18
+ },
19
+ "files": [
20
+ "index.js",
21
+ "index.d.ts",
22
+ "src"
23
+ ],
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/styled-components/css-to-react-native.git"
27
+ },
28
+ "keywords": [
29
+ "styled-components",
30
+ "React",
31
+ "ReactNative",
32
+ "styles",
33
+ "CSS"
34
+ ],
35
+ "author": "Jacob Parker",
36
+ "license": "MIT",
37
+ "bugs": {
38
+ "url": "https://github.com/styled-components/css-to-react-native/issues"
39
+ },
40
+ "homepage": "https://github.com/styled-components/css-to-react-native#readme",
41
+ "jest": {
42
+ "testURL": "http://localhost"
43
+ },
44
+ "devDependencies": {
45
+ "@babel/cli": "^7.6.2",
46
+ "@babel/preset-env": "^7.6.2",
47
+ "eslint": "^4.17.0",
48
+ "eslint-config-airbnb-base": "^12.1.0",
49
+ "eslint-config-prettier": "^2.9.0",
50
+ "eslint-plugin-import": "^2.8.0",
51
+ "eslint-plugin-prettier": "^2.6.0",
52
+ "jest": "^24.9.0",
53
+ "lint-staged": "^6.1.0",
54
+ "prettier": "^1.18.2",
55
+ "rollup": "^1.22.0"
56
+ },
57
+ "dependencies": {
58
+ "camelize": "^1.0.0",
59
+ "css-color-keywords": "^1.0.0",
60
+ "postcss-value-parser": "^4.0.2"
61
+ },
62
+ "lint-staged": {
63
+ "*.js": [
64
+ "eslint --fix",
65
+ "git add"
66
+ ]
67
+ }
68
+ }
@@ -0,0 +1,74 @@
1
+ const SYMBOL_MATCH = 'SYMBOL_MATCH'
2
+
3
+ export default class TokenStream {
4
+ constructor(nodes, parent) {
5
+ this.index = 0
6
+ this.nodes = nodes
7
+ this.functionName = parent != null ? parent.value : null
8
+ this.lastValue = null
9
+ this.rewindIndex = -1
10
+ }
11
+
12
+ hasTokens() {
13
+ return this.index <= this.nodes.length - 1
14
+ }
15
+
16
+ [SYMBOL_MATCH](...tokenDescriptors) {
17
+ if (!this.hasTokens()) return null
18
+
19
+ const node = this.nodes[this.index]
20
+
21
+ for (let i = 0; i < tokenDescriptors.length; i += 1) {
22
+ const tokenDescriptor = tokenDescriptors[i]
23
+ const value = tokenDescriptor(node)
24
+ if (value !== null) {
25
+ this.index += 1
26
+ this.lastValue = value
27
+ return value
28
+ }
29
+ }
30
+
31
+ return null
32
+ }
33
+
34
+ matches(...tokenDescriptors) {
35
+ return this[SYMBOL_MATCH](...tokenDescriptors) !== null
36
+ }
37
+
38
+ expect(...tokenDescriptors) {
39
+ const value = this[SYMBOL_MATCH](...tokenDescriptors)
40
+ return value !== null ? value : this.throw()
41
+ }
42
+
43
+ matchesFunction() {
44
+ const node = this.nodes[this.index]
45
+ if (node.type !== 'function') return null
46
+ const value = new TokenStream(node.nodes, node)
47
+ this.index += 1
48
+ this.lastValue = null
49
+ return value
50
+ }
51
+
52
+ expectFunction() {
53
+ const value = this.matchesFunction()
54
+ return value !== null ? value : this.throw()
55
+ }
56
+
57
+ expectEmpty() {
58
+ if (this.hasTokens()) this.throw()
59
+ }
60
+
61
+ throw() {
62
+ throw new Error(`Unexpected token type: ${this.nodes[this.index].type}`)
63
+ }
64
+
65
+ saveRewindPoint() {
66
+ this.rewindIndex = this.index
67
+ }
68
+
69
+ rewind() {
70
+ if (this.rewindIndex === -1) throw new Error('Internal error')
71
+ this.index = this.rewindIndex
72
+ this.lastValue = null
73
+ }
74
+ }
@@ -0,0 +1,23 @@
1
+ import transformCss from '..'
2
+
3
+ it('handles regular aspect ratio values', () => {
4
+ expect(transformCss([['aspect-ratio', '1.5']])).toEqual({
5
+ aspectRatio: 1.5,
6
+ })
7
+ })
8
+
9
+ it('handles CSS-style aspect ratios', () => {
10
+ expect(transformCss([['aspect-ratio', '3 / 2']])).toEqual({
11
+ aspectRatio: 1.5,
12
+ })
13
+ })
14
+
15
+ it('handles CSS-style aspect ratios without spaces', () => {
16
+ expect(transformCss([['aspect-ratio', '3/2']])).toEqual({
17
+ aspectRatio: 1.5,
18
+ })
19
+ })
20
+
21
+ it('throws when omitting second value after slash', () => {
22
+ expect(() => transformCss([['aspect-ratio', '3/']])).toThrow()
23
+ })
@@ -0,0 +1,141 @@
1
+ import transformCss from '..'
2
+
3
+ it('transforms border none', () => {
4
+ expect(transformCss([['border', 'none']])).toEqual({
5
+ borderWidth: 0,
6
+ borderColor: 'black',
7
+ borderStyle: 'solid',
8
+ })
9
+ })
10
+
11
+ it('transforms border shorthand', () => {
12
+ expect(transformCss([['border', '2px dashed #f00']])).toEqual({
13
+ borderWidth: 2,
14
+ borderColor: '#f00',
15
+ borderStyle: 'dashed',
16
+ })
17
+ })
18
+
19
+ it('transforms border shorthand in other order', () => {
20
+ expect(transformCss([['border', '#f00 2px dashed']])).toEqual({
21
+ borderWidth: 2,
22
+ borderColor: '#f00',
23
+ borderStyle: 'dashed',
24
+ })
25
+ })
26
+
27
+ it('transforms border shorthand missing color', () => {
28
+ expect(transformCss([['border', '2px dashed']])).toEqual({
29
+ borderWidth: 2,
30
+ borderColor: 'black',
31
+ borderStyle: 'dashed',
32
+ })
33
+ })
34
+
35
+ it('transforms border shorthand missing style', () => {
36
+ expect(transformCss([['border', '2px #f00']])).toEqual({
37
+ borderWidth: 2,
38
+ borderColor: '#f00',
39
+ borderStyle: 'solid',
40
+ })
41
+ })
42
+
43
+ it('transforms border shorthand missing width', () => {
44
+ expect(transformCss([['border', '#f00 dashed']])).toEqual({
45
+ borderWidth: 1,
46
+ borderColor: '#f00',
47
+ borderStyle: 'dashed',
48
+ })
49
+ })
50
+
51
+ it('transforms border shorthand missing color & width', () => {
52
+ expect(transformCss([['border', 'dashed']])).toEqual({
53
+ borderWidth: 1,
54
+ borderColor: 'black',
55
+ borderStyle: 'dashed',
56
+ })
57
+ })
58
+
59
+ it('transforms border shorthand missing style & width', () => {
60
+ expect(transformCss([['border', '#f00']])).toEqual({
61
+ borderWidth: 1,
62
+ borderColor: '#f00',
63
+ borderStyle: 'solid',
64
+ })
65
+ })
66
+
67
+ it('transforms border shorthand missing color & style', () => {
68
+ expect(transformCss([['border', '2px']])).toEqual({
69
+ borderWidth: 2,
70
+ borderColor: 'black',
71
+ borderStyle: 'solid',
72
+ })
73
+ })
74
+
75
+ it('transforms border for unsupported units', () => {
76
+ expect(transformCss([['border', '3em solid black']])).toEqual({
77
+ borderWidth: '3em',
78
+ borderColor: 'black',
79
+ borderStyle: 'solid',
80
+ })
81
+ })
82
+
83
+ it('does not transform border with percentage width', () => {
84
+ expect(() => transformCss([['border', '3% solid black']])).toThrow()
85
+ })
86
+
87
+ it('transforms border with var() for color', () => {
88
+ expect(transformCss([['border', '2px solid var(--primary-color)']])).toEqual({
89
+ borderWidth: 2,
90
+ borderColor: 'var(--primary-color)',
91
+ borderStyle: 'solid',
92
+ })
93
+ })
94
+
95
+ it('transforms border with var() and named color fallback', () => {
96
+ expect(
97
+ transformCss([['border', '2px solid var(--primary-color, red)']])
98
+ ).toEqual({
99
+ borderWidth: 2,
100
+ borderColor: 'var(--primary-color, red)',
101
+ borderStyle: 'solid',
102
+ })
103
+ })
104
+
105
+ it('transforms border with var() and hex color fallback', () => {
106
+ expect(
107
+ transformCss([['border', '2px solid var(--primary-color, #f00)']])
108
+ ).toEqual({
109
+ borderWidth: 2,
110
+ borderColor: 'var(--primary-color, #f00)',
111
+ borderStyle: 'solid',
112
+ })
113
+ })
114
+
115
+ it('transforms border with var() and rgb color fallback', () => {
116
+ expect(
117
+ transformCss([['border', '2px solid var(--primary-color, rgb(255, 0, 0))']])
118
+ ).toEqual({
119
+ borderWidth: 2,
120
+ borderColor: 'var(--primary-color, rgb(255,0,0))',
121
+ borderStyle: 'solid',
122
+ })
123
+ })
124
+
125
+ it('transforms border with var() in different order', () => {
126
+ expect(transformCss([['border', 'var(--primary-color) 2px dashed']])).toEqual(
127
+ {
128
+ borderWidth: 2,
129
+ borderColor: 'var(--primary-color)',
130
+ borderStyle: 'dashed',
131
+ }
132
+ )
133
+ })
134
+
135
+ it('transforms border with only var() color', () => {
136
+ expect(transformCss([['border', 'var(--primary-color)']])).toEqual({
137
+ borderWidth: 1,
138
+ borderColor: 'var(--primary-color)',
139
+ borderStyle: 'solid',
140
+ })
141
+ })
@@ -0,0 +1,92 @@
1
+ import transformCss from '..'
2
+
3
+ it('transforms border color with multiple values', () => {
4
+ expect(transformCss([['border-color', 'red yellow green blue']])).toEqual({
5
+ borderTopColor: 'red',
6
+ borderRightColor: 'yellow',
7
+ borderBottomColor: 'green',
8
+ borderLeftColor: 'blue',
9
+ })
10
+ })
11
+
12
+ it('transforms border color with hex color', () => {
13
+ expect(transformCss([['border-color', '#f00']])).toEqual({
14
+ borderBottomColor: '#f00',
15
+ borderLeftColor: '#f00',
16
+ borderRightColor: '#f00',
17
+ borderTopColor: '#f00',
18
+ })
19
+ })
20
+
21
+ it('transforms border color with rgb color', () => {
22
+ expect(transformCss([['border-color', 'rgb(255, 0, 0)']])).toEqual({
23
+ borderBottomColor: 'rgb(255, 0, 0)',
24
+ borderLeftColor: 'rgb(255, 0, 0)',
25
+ borderRightColor: 'rgb(255, 0, 0)',
26
+ borderTopColor: 'rgb(255, 0, 0)',
27
+ })
28
+ })
29
+
30
+ it('transforms border color with rgba color', () => {
31
+ expect(transformCss([['border-color', 'rgba(255, 0, 0, 0.1)']])).toEqual({
32
+ borderBottomColor: 'rgba(255, 0, 0, 0.1)',
33
+ borderLeftColor: 'rgba(255, 0, 0, 0.1)',
34
+ borderRightColor: 'rgba(255, 0, 0, 0.1)',
35
+ borderTopColor: 'rgba(255, 0, 0, 0.1)',
36
+ })
37
+ })
38
+
39
+ it('transforms border color with var()', () => {
40
+ expect(transformCss([['border-color', 'var(--primary-color)']])).toEqual({
41
+ borderBottomColor: 'var(--primary-color)',
42
+ borderLeftColor: 'var(--primary-color)',
43
+ borderRightColor: 'var(--primary-color)',
44
+ borderTopColor: 'var(--primary-color)',
45
+ })
46
+ })
47
+
48
+ it('transforms border color with var() and fallback', () => {
49
+ expect(transformCss([['border-color', 'var(--primary-color, red)']])).toEqual(
50
+ {
51
+ borderBottomColor: 'var(--primary-color, red)',
52
+ borderLeftColor: 'var(--primary-color, red)',
53
+ borderRightColor: 'var(--primary-color, red)',
54
+ borderTopColor: 'var(--primary-color, red)',
55
+ }
56
+ )
57
+ })
58
+
59
+ it('transforms border color with multiple var() values', () => {
60
+ expect(
61
+ transformCss([
62
+ ['border-color', 'var(--top) var(--right) var(--bottom) var(--left)'],
63
+ ])
64
+ ).toEqual({
65
+ borderTopColor: 'var(--top)',
66
+ borderRightColor: 'var(--right)',
67
+ borderBottomColor: 'var(--bottom)',
68
+ borderLeftColor: 'var(--left)',
69
+ })
70
+ })
71
+
72
+ it('transforms border color with var() and hex fallback', () => {
73
+ expect(
74
+ transformCss([['border-color', 'var(--primary-color, #f00)']])
75
+ ).toEqual({
76
+ borderBottomColor: 'var(--primary-color, #f00)',
77
+ borderLeftColor: 'var(--primary-color, #f00)',
78
+ borderRightColor: 'var(--primary-color, #f00)',
79
+ borderTopColor: 'var(--primary-color, #f00)',
80
+ })
81
+ })
82
+
83
+ it('transforms border color with var() and rgb fallback', () => {
84
+ expect(
85
+ transformCss([['border-color', 'var(--primary-color, rgb(255, 0, 0))']])
86
+ ).toEqual({
87
+ borderBottomColor: 'var(--primary-color, rgb(255,0,0))',
88
+ borderLeftColor: 'var(--primary-color, rgb(255,0,0))',
89
+ borderRightColor: 'var(--primary-color, rgb(255,0,0))',
90
+ borderTopColor: 'var(--primary-color, rgb(255,0,0))',
91
+ })
92
+ })
@@ -0,0 +1,136 @@
1
+ import transformCss from '..'
2
+
3
+ it('transforms margin, padding with 1 value', () => {
4
+ expect(transformCss([['margin', '1px']])).toEqual({
5
+ marginTop: 1,
6
+ marginRight: 1,
7
+ marginBottom: 1,
8
+ marginLeft: 1,
9
+ })
10
+ expect(transformCss([['padding', '1px']])).toEqual({
11
+ paddingTop: 1,
12
+ paddingRight: 1,
13
+ paddingBottom: 1,
14
+ paddingLeft: 1,
15
+ })
16
+ })
17
+
18
+ it('transforms margin, padding with 2 values', () => {
19
+ expect(transformCss([['margin', '1px 2px']])).toEqual({
20
+ marginTop: 1,
21
+ marginRight: 2,
22
+ marginBottom: 1,
23
+ marginLeft: 2,
24
+ })
25
+ expect(transformCss([['padding', '1px 2px']])).toEqual({
26
+ paddingTop: 1,
27
+ paddingRight: 2,
28
+ paddingBottom: 1,
29
+ paddingLeft: 2,
30
+ })
31
+ })
32
+
33
+ it('transforms margin, padding with 3 values', () => {
34
+ expect(transformCss([['margin', '1px 2px 3px']])).toEqual({
35
+ marginTop: 1,
36
+ marginRight: 2,
37
+ marginBottom: 3,
38
+ marginLeft: 2,
39
+ })
40
+ expect(transformCss([['padding', '1px 2px 3px']])).toEqual({
41
+ paddingTop: 1,
42
+ paddingRight: 2,
43
+ paddingBottom: 3,
44
+ paddingLeft: 2,
45
+ })
46
+ })
47
+
48
+ it('transforms margin, padding with 4 values', () => {
49
+ expect(transformCss([['margin', '1px 2px 3px 4px']])).toEqual({
50
+ marginTop: 1,
51
+ marginRight: 2,
52
+ marginBottom: 3,
53
+ marginLeft: 4,
54
+ })
55
+ expect(transformCss([['padding', '1px 2px 3px 4px']])).toEqual({
56
+ paddingTop: 1,
57
+ paddingRight: 2,
58
+ paddingBottom: 3,
59
+ paddingLeft: 4,
60
+ })
61
+ })
62
+
63
+ it('transforms margin, allowing unitless zero, percentages', () => {
64
+ expect(transformCss([['margin', '0 0% 10% 100%']])).toEqual({
65
+ marginTop: 0,
66
+ marginRight: '0%',
67
+ marginBottom: '10%',
68
+ marginLeft: '100%',
69
+ })
70
+ expect(transformCss([['padding', '0 0% 10% 100%']])).toEqual({
71
+ paddingTop: 0,
72
+ paddingRight: '0%',
73
+ paddingBottom: '10%',
74
+ paddingLeft: '100%',
75
+ })
76
+ })
77
+
78
+ it('transforms shorthand and overrides previous values', () => {
79
+ expect(transformCss([['margin-top', '2px'], ['margin', '1px']])).toEqual({
80
+ marginTop: 1,
81
+ marginRight: 1,
82
+ marginBottom: 1,
83
+ marginLeft: 1,
84
+ })
85
+ })
86
+
87
+ it('transforms margin shorthand with auto', () => {
88
+ expect(transformCss([['margin', 'auto']])).toEqual({
89
+ marginTop: 'auto',
90
+ marginRight: 'auto',
91
+ marginBottom: 'auto',
92
+ marginLeft: 'auto',
93
+ })
94
+ expect(transformCss([['margin', '0 auto']])).toEqual({
95
+ marginTop: 0,
96
+ marginRight: 'auto',
97
+ marginBottom: 0,
98
+ marginLeft: 'auto',
99
+ })
100
+ expect(transformCss([['margin', 'auto 0']])).toEqual({
101
+ marginTop: 'auto',
102
+ marginRight: 0,
103
+ marginBottom: 'auto',
104
+ marginLeft: 0,
105
+ })
106
+ expect(transformCss([['margin', '2px 3px auto']])).toEqual({
107
+ marginTop: 2,
108
+ marginRight: 3,
109
+ marginBottom: 'auto',
110
+ marginLeft: 3,
111
+ })
112
+ expect(transformCss([['margin', '10px auto 4px']])).toEqual({
113
+ marginTop: 10,
114
+ marginRight: 'auto',
115
+ marginBottom: 4,
116
+ marginLeft: 'auto',
117
+ })
118
+ })
119
+
120
+ it('transforms border width', () => {
121
+ expect(transformCss([['border-width', '1px 2px 3px 4px']])).toEqual({
122
+ borderTopWidth: 1,
123
+ borderRightWidth: 2,
124
+ borderBottomWidth: 3,
125
+ borderLeftWidth: 4,
126
+ })
127
+ })
128
+
129
+ it('transforms border radius', () => {
130
+ expect(transformCss([['border-radius', '1px 2px 3px 4px']])).toEqual({
131
+ borderTopLeftRadius: 1,
132
+ borderTopRightRadius: 2,
133
+ borderBottomRightRadius: 3,
134
+ borderBottomLeftRadius: 4,
135
+ })
136
+ })
@@ -0,0 +1,167 @@
1
+ import transformCss from '..'
2
+
3
+ it('transforms box-shadow into shadow- properties', () => {
4
+ expect(transformCss([['box-shadow', '10px 20px 30px red']])).toEqual({
5
+ shadowOffset: { width: 10, height: 20 },
6
+ shadowRadius: 30,
7
+ shadowColor: 'red',
8
+ shadowOpacity: 1,
9
+ })
10
+ })
11
+
12
+ it('transforms box-shadow without blur-radius', () => {
13
+ expect(transformCss([['box-shadow', '10px 20px red']])).toEqual({
14
+ shadowOffset: { width: 10, height: 20 },
15
+ shadowRadius: 0,
16
+ shadowColor: 'red',
17
+ shadowOpacity: 1,
18
+ })
19
+ })
20
+
21
+ it('transforms box-shadow without color', () => {
22
+ expect(transformCss([['box-shadow', '10px 20px']])).toEqual({
23
+ shadowOffset: { width: 10, height: 20 },
24
+ shadowRadius: 0,
25
+ shadowColor: 'black',
26
+ shadowOpacity: 1,
27
+ })
28
+ })
29
+
30
+ it('transforms box-shadow with rgb color', () => {
31
+ expect(
32
+ transformCss([['box-shadow', '10px 20px rgb(100, 100, 100)']])
33
+ ).toEqual({
34
+ shadowOffset: { width: 10, height: 20 },
35
+ shadowRadius: 0,
36
+ shadowColor: 'rgb(100, 100, 100)',
37
+ shadowOpacity: 1,
38
+ })
39
+ })
40
+
41
+ it('transforms box-shadow with rgba color', () => {
42
+ expect(
43
+ transformCss([['box-shadow', '10px 20px rgba(100, 100, 100, 0.5)']])
44
+ ).toEqual({
45
+ shadowOffset: { width: 10, height: 20 },
46
+ shadowRadius: 0,
47
+ shadowColor: 'rgba(100, 100, 100, 0.5)',
48
+ shadowOpacity: 1,
49
+ })
50
+ })
51
+
52
+ it('transforms box-shadow with hsl color', () => {
53
+ expect(
54
+ transformCss([['box-shadow', '10px 20px hsl(120, 100%, 50%)']])
55
+ ).toEqual({
56
+ shadowOffset: { width: 10, height: 20 },
57
+ shadowRadius: 0,
58
+ shadowColor: 'hsl(120, 100%, 50%)',
59
+ shadowOpacity: 1,
60
+ })
61
+ })
62
+
63
+ it('transforms box-shadow with hsla color', () => {
64
+ expect(
65
+ transformCss([['box-shadow', '10px 20px hsla(120, 100%, 50%, 0.7)']])
66
+ ).toEqual({
67
+ shadowOffset: { width: 10, height: 20 },
68
+ shadowRadius: 0,
69
+ shadowColor: 'hsla(120, 100%, 50%, 0.7)',
70
+ shadowOpacity: 1,
71
+ })
72
+ })
73
+
74
+ it('transforms box-shadow and throws if multiple colors are used', () => {
75
+ expect(() =>
76
+ transformCss([['box-shadow', '0 0 0 red yellow green blue']])
77
+ ).toThrow()
78
+ })
79
+
80
+ it('transforms box-shadow enforces offset to be present', () => {
81
+ expect(() => transformCss([['box-shadow', 'red']])).toThrow()
82
+ expect(() => transformCss([['box-shadow', '10px red']])).toThrow()
83
+ })
84
+
85
+ it('transforms box-shadow with var() for color', () => {
86
+ expect(
87
+ transformCss([['box-shadow', '10px 20px var(--primary-color)']])
88
+ ).toEqual({
89
+ shadowOffset: { width: 10, height: 20 },
90
+ shadowRadius: 0,
91
+ shadowColor: 'var(--primary-color)',
92
+ shadowOpacity: 1,
93
+ })
94
+ })
95
+
96
+ it('transforms box-shadow with var() and blur-radius', () => {
97
+ expect(
98
+ transformCss([['box-shadow', '10px 20px 30px var(--primary-color)']])
99
+ ).toEqual({
100
+ shadowOffset: { width: 10, height: 20 },
101
+ shadowRadius: 30,
102
+ shadowColor: 'var(--primary-color)',
103
+ shadowOpacity: 1,
104
+ })
105
+ })
106
+
107
+ it('transforms box-shadow with var() and named color fallback', () => {
108
+ expect(
109
+ transformCss([['box-shadow', '10px 20px var(--primary-color, red)']])
110
+ ).toEqual({
111
+ shadowOffset: { width: 10, height: 20 },
112
+ shadowRadius: 0,
113
+ shadowColor: 'var(--primary-color, red)',
114
+ shadowOpacity: 1,
115
+ })
116
+ })
117
+
118
+ it('transforms box-shadow with var() and hex color fallback', () => {
119
+ expect(
120
+ transformCss([['box-shadow', '10px 20px var(--primary-color, #f00)']])
121
+ ).toEqual({
122
+ shadowOffset: { width: 10, height: 20 },
123
+ shadowRadius: 0,
124
+ shadowColor: 'var(--primary-color, #f00)',
125
+ shadowOpacity: 1,
126
+ })
127
+ })
128
+
129
+ it('transforms box-shadow with var() and rgb color fallback', () => {
130
+ expect(
131
+ transformCss([
132
+ ['box-shadow', '10px 20px var(--primary-color, rgb(255, 0, 0))'],
133
+ ])
134
+ ).toEqual({
135
+ shadowOffset: { width: 10, height: 20 },
136
+ shadowRadius: 0,
137
+ shadowColor: 'var(--primary-color, rgb(255,0,0))',
138
+ shadowOpacity: 1,
139
+ })
140
+ })
141
+
142
+ it('transforms box-shadow with var() and rgba color fallback', () => {
143
+ expect(
144
+ transformCss([
145
+ [
146
+ 'box-shadow',
147
+ '10px 20px var(--primary-color, rgba(100, 100, 100, 0.5))',
148
+ ],
149
+ ])
150
+ ).toEqual({
151
+ shadowOffset: { width: 10, height: 20 },
152
+ shadowRadius: 0,
153
+ shadowColor: 'var(--primary-color, rgba(100,100,100,0.5))',
154
+ shadowOpacity: 1,
155
+ })
156
+ })
157
+
158
+ it('transforms box-shadow with var() color before offset', () => {
159
+ expect(
160
+ transformCss([['box-shadow', 'var(--primary-color) 10px 20px 30px']])
161
+ ).toEqual({
162
+ shadowOffset: { width: 10, height: 20 },
163
+ shadowRadius: 30,
164
+ shadowColor: 'var(--primary-color)',
165
+ shadowOpacity: 1,
166
+ })
167
+ })