@@ -17,15 +17,34 @@ function parseGradient(str) {
1717 // match side and any corner, in browser,
1818 // `top right` and `right top` are the same,
1919 // so we should put this situation into consideration
20- /* eslint-disable max-len */
21- var rSideCorner = / t o \s + ( (?: l e f t | r i g h t | t o p | b o t t o m ) | (?: (?: (?: l e f t | r i g h t ) \s + (?: t o p | b o t t o m ) ) | (?: (?: t o p | b o t t o m ) \s + (?: l e f t | r i g h t ) ) ) ) (? = \s * , ) / ;
20+ var rSideCorner = new RegExp (
21+ '(' + // 1
22+ '(?:to\\s+)?' +
23+ '(?:' +
24+ '(?:left|right|top|bottom)' +
25+ '|' +
26+ '(?:' +
27+ '(?:' + // left top, left bottom, right top, right bottom
28+ '(?:left|right)\\s+(?:top|bottom)' +
29+ ')' +
30+ '|' +
31+ '(?:' + // top left, top right, bottom left, bottom right
32+ '(?:top|bottom)\\s+(?:left|right)' +
33+ ')' +
34+ ')' +
35+ ')' +
36+ ')' + // end 1
37+ '(?=\\s*,)'
38+ ) ;
39+
2240 // match color stops, the color format is not very precise
41+ /* eslint-disable max-len */
2342 var rColorStops = / \s * ( # [ 0 - 9 a - f ] { 3 , 6 } | (?: h s l | r g b ) a ? \( .+ ?\) | \w + ) (?: \s + ( (?: [ + - ] ? \d * \. ? \d + ) (?: % | [ a - z ] + ) ? ) ) ? / gi;
2443 // the final gradient line regexp
2544 var rGradientLine = new RegExp ( '^\\s*' + rAngle . source + '|' + rSideCorner . source , 'i' ) ;
2645 /* eslint-enable max-len */
2746
28- var position = str . match ( rGradientLine ) || [ '' , null , 'deg' , 'bottom' ] ;
47+ var position = str . match ( rGradientLine ) || [ '' , null , 'deg' , 'to bottom' ] ;
2948 var angle = position [ 1 ] ;
3049 var sideCorner = position [ 3 ] ;
3150 var unit = position [ 2 ] ;
@@ -105,8 +124,27 @@ function getDirection(gradient) {
105124
106125 if ( gradient . sideCorner ) {
107126 segs = gradient . sideCorner . split ( / \s + / ) ;
127+
128+ var to = segs [ 0 ] === 'to' ;
129+ if ( to ) {
130+ // sideCorner starts with "to" so we shift it off since we don't
131+ // need this element anymore, and continue with generating the
132+ // gradient in the normal direction.
133+ segs . shift ( ) ;
134+ } else {
135+ // sideCorner does not start with "to", so we need to reverse the
136+ // direction.
137+ var reverseDirections = {
138+ top : 'bottom' ,
139+ bottom : 'top' ,
140+ left : 'right' ,
141+ right : 'left'
142+ } ;
143+ segs [ 0 ] = reverseDirections [ segs [ 0 ] ] ;
144+ }
145+
108146 result . direction = segs [ 0 ] ;
109- // side corner is `top right` or `bottm left` etc.
147+ // side corner is `top right` or `bottom left` etc.
110148 if ( segs . length > 1 ) {
111149 // fallback to one direction
112150 result . isFallback = true ;
0 commit comments