@@ -8,13 +8,15 @@ let ALPHA_SEP = /\s*[,/]\s*/
88let CUSTOM_PROPERTY = / v a r \( - - (?: [ ^ ) ] * ?) \) /
99
1010let 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*\\)$`
1212)
1313let 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*\\)$`
1515)
1616
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 } = { } ) {
1820 if ( typeof value !== 'string' ) {
1921 return null
2022 }
@@ -42,27 +44,27 @@ export function parseColor(value) {
4244 }
4345 }
4446
45- let rgbMatch = value . match ( RGB )
47+ let match = value . match ( RGB ) ?? value . match ( HSL )
4648
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
5351 }
5452
55- let hslMatch = value . match ( HSL )
53+ let color = [ match [ 2 ] , match [ 3 ] , match [ 4 ] ] . filter ( Boolean ) . map ( ( v ) => v . toString ( ) )
5654
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
6357 }
6458
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+ }
6668}
6769
6870export function formatColor ( { mode, color, alpha } ) {
0 commit comments