@@ -8,13 +8,15 @@ let ALPHA_SEP = /\s*[,/]\s*/
8
8
let CUSTOM_PROPERTY = / v a r \( - - (?: [ ^ ) ] * ?) \) /
9
9
10
10
let RGB = new RegExp (
11
- `^rgba ?\\(\\s*(${ VALUE . source } |${ CUSTOM_PROPERTY . source } )${ SEP . source } (${ VALUE . source } |${ CUSTOM_PROPERTY . source } )${ SEP . source } (${ VALUE . source } |${ CUSTOM_PROPERTY . source } )(?:${ ALPHA_SEP . source } (${ VALUE . source } |${ CUSTOM_PROPERTY . source } ))?\\s*\\)$`
11
+ `^(rgb)a ?\\(\\s*(${ VALUE . source } |${ CUSTOM_PROPERTY . source } )(?: ${ SEP . source } (${ VALUE . source } |${ CUSTOM_PROPERTY . source } ))?(?: ${ SEP . source } (${ VALUE . source } |${ CUSTOM_PROPERTY . source } ))? (?:${ ALPHA_SEP . source } (${ VALUE . source } |${ CUSTOM_PROPERTY . source } ))?\\s*\\)$`
12
12
)
13
13
let HSL = new RegExp (
14
- `^hsla ?\\(\\s*((?:${ VALUE . source } )(?:deg|rad|grad|turn)?|${ CUSTOM_PROPERTY . source } )${ SEP . source } (${ VALUE . source } |${ CUSTOM_PROPERTY . source } )${ SEP . source } (${ VALUE . source } |${ CUSTOM_PROPERTY . source } )(?:${ ALPHA_SEP . source } (${ VALUE . source } |${ CUSTOM_PROPERTY . source } ))?\\s*\\)$`
14
+ `^(hsl)a ?\\(\\s*((?:${ VALUE . source } )(?:deg|rad|grad|turn)?|${ CUSTOM_PROPERTY . source } )(?: ${ SEP . source } (${ VALUE . source } |${ CUSTOM_PROPERTY . source } ))?(?: ${ SEP . source } (${ VALUE . source } |${ CUSTOM_PROPERTY . source } ))? (?:${ ALPHA_SEP . source } (${ VALUE . source } |${ CUSTOM_PROPERTY . source } ))?\\s*\\)$`
15
15
)
16
16
17
- export function parseColor ( value ) {
17
+ // In "loose" mode the color may contain fewer than 3 parts, as long as at least
18
+ // one of the parts is variable.
19
+ export function parseColor ( value , { loose = false } = { } ) {
18
20
if ( typeof value !== 'string' ) {
19
21
return null
20
22
}
@@ -42,27 +44,27 @@ export function parseColor(value) {
42
44
}
43
45
}
44
46
45
- let rgbMatch = value . match ( RGB )
47
+ let match = value . match ( RGB ) ?? value . match ( HSL )
46
48
47
- if ( rgbMatch !== null ) {
48
- return {
49
- mode : 'rgb' ,
50
- color : [ rgbMatch [ 1 ] , rgbMatch [ 2 ] , rgbMatch [ 3 ] ] . map ( ( v ) => v . toString ( ) ) ,
51
- alpha : rgbMatch [ 4 ] ?. toString ?. ( ) ,
52
- }
49
+ if ( match === null ) {
50
+ return null
53
51
}
54
52
55
- let hslMatch = value . match ( HSL )
53
+ let color = [ match [ 2 ] , match [ 3 ] , match [ 4 ] ] . filter ( Boolean ) . map ( ( v ) => v . toString ( ) )
56
54
57
- if ( hslMatch !== null ) {
58
- return {
59
- mode : 'hsl' ,
60
- color : [ hslMatch [ 1 ] , hslMatch [ 2 ] , hslMatch [ 3 ] ] . map ( ( v ) => v . toString ( ) ) ,
61
- alpha : hslMatch [ 4 ] ?. toString ?. ( ) ,
62
- }
55
+ if ( ! loose && color . length !== 3 ) {
56
+ return null
63
57
}
64
58
65
- return null
59
+ if ( color . length < 3 && ! color . some ( ( part ) => / ^ v a r \( .* ?\) $ / . test ( part ) ) ) {
60
+ return null
61
+ }
62
+
63
+ return {
64
+ mode : match [ 1 ] ,
65
+ color,
66
+ alpha : match [ 5 ] ?. toString ?. ( ) ,
67
+ }
66
68
}
67
69
68
70
export function formatColor ( { mode, color, alpha } ) {
0 commit comments