@@ -156,7 +156,7 @@ function serializeNumber(n) {
156
156
* https://drafts.csswg.org/css-values-4/#integers
157
157
* https://drafts.csswg.org/cssom/#ref-for-integer-value
158
158
*/
159
- exports . parseInteger = function parseInteger ( val ) {
159
+ exports . parseInteger = function parseInteger ( val , positive = false ) {
160
160
if ( val === '' ) {
161
161
return val ;
162
162
}
@@ -167,7 +167,13 @@ exports.parseInteger = function parseInteger(val) {
167
167
const res = numberRegEx . exec ( val ) ;
168
168
if ( res ) {
169
169
const [ , , integer , decimals , onlyDecimals , exponent ] = res ;
170
- if ( integer === undefined || decimals || onlyDecimals || ( exponent && exponent . slice ( 1 ) < 0 ) ) {
170
+ if (
171
+ integer === undefined ||
172
+ decimals ||
173
+ onlyDecimals ||
174
+ ( exponent && exponent . slice ( 1 ) < 0 ) ||
175
+ ( positive && integer < 0 )
176
+ ) {
171
177
return undefined ;
172
178
}
173
179
return serializeNumber ( val ) ;
@@ -179,7 +185,7 @@ exports.parseInteger = function parseInteger(val) {
179
185
* https://drafts.csswg.org/css-values-4/#numbers
180
186
* https://drafts.csswg.org/cssom/#ref-for-number-value
181
187
*/
182
- exports . parseNumber = function parseNumber ( val ) {
188
+ exports . parseNumber = function parseNumber ( val , positive = false ) {
183
189
if ( val === '' ) {
184
190
return val ;
185
191
}
@@ -188,6 +194,9 @@ exports.parseNumber = function parseNumber(val) {
188
194
val = calculated ;
189
195
}
190
196
if ( numberRegEx . test ( val ) ) {
197
+ if ( positive && val < 0 ) {
198
+ return undefined ;
199
+ }
191
200
return serializeNumber ( val ) ;
192
201
}
193
202
return exports . parseCustomVariable ( val ) ;
@@ -197,14 +206,14 @@ exports.parseNumber = function parseNumber(val) {
197
206
* https://drafts.csswg.org/css-values-4/#lengths
198
207
* https://drafts.csswg.org/cssom/#ref-for-length-value
199
208
*/
200
- exports . parseLength = function parseLength ( val , resolve = false ) {
209
+ exports . parseLength = function parseLength ( val , resolve = false , positive = false ) {
201
210
if ( val === '' ) {
202
211
return val ;
203
212
}
204
213
if ( val === '0' ) {
205
214
return '0px' ;
206
215
}
207
- const calculated = exports . parseCalc ( val , v => parseLength ( v , resolve ) ) ;
216
+ const calculated = exports . parseCalc ( val , v => parseLength ( v , resolve , positive ) ) ;
208
217
if ( calculated ) {
209
218
if ( ! resolve ) {
210
219
return calculated ;
@@ -214,6 +223,9 @@ exports.parseLength = function parseLength(val, resolve = false) {
214
223
const res = lengthRegEx . exec ( val ) ;
215
224
if ( res ) {
216
225
let [ , number , , , , , , unit ] = res ;
226
+ if ( positive && number < 0 ) {
227
+ return undefined ;
228
+ }
217
229
unit = unit . toLowerCase ( ) ;
218
230
if ( resolve ) {
219
231
switch ( unit ) {
@@ -252,14 +264,14 @@ exports.parseLength = function parseLength(val, resolve = false) {
252
264
* https://drafts.csswg.org/css-values-4/#percentages
253
265
* https://drafts.csswg.org/cssom/#ref-for-percentage-value
254
266
*/
255
- exports . parsePercentage = function parsePercentage ( val , resolve = false ) {
267
+ exports . parsePercentage = function parsePercentage ( val , resolve = false , positive = false ) {
256
268
if ( val === '' ) {
257
269
return val ;
258
270
}
259
271
if ( val === '0' ) {
260
272
return '0%' ;
261
273
}
262
- const calculated = exports . parseCalc ( val , v => parsePercentage ( v , resolve ) ) ;
274
+ const calculated = exports . parseCalc ( val , v => parsePercentage ( v , resolve , positive ) ) ;
263
275
if ( calculated ) {
264
276
if ( ! resolve ) {
265
277
return calculated ;
@@ -269,13 +281,18 @@ exports.parsePercentage = function parsePercentage(val, resolve = false) {
269
281
const res = percentageRegEx . exec ( val ) ;
270
282
if ( res ) {
271
283
const [ , number ] = res ;
284
+ if ( positive && number < 0 ) {
285
+ return undefined ;
286
+ }
272
287
return serializeNumber ( number ) + '%' ;
273
288
}
274
289
return exports . parseCustomVariable ( val ) ;
275
290
} ;
276
291
277
- exports . parseLengthOrPercentage = function parseLengthOrPercentage ( val , resolve ) {
278
- return exports . parseLength ( val , resolve ) || exports . parsePercentage ( val , resolve ) ;
292
+ exports . parseLengthOrPercentage = function parseLengthOrPercentage ( val , resolve , positive ) {
293
+ return (
294
+ exports . parseLength ( val , resolve , positive ) || exports . parsePercentage ( val , resolve , positive )
295
+ ) ;
279
296
} ;
280
297
281
298
/**
0 commit comments