@@ -6,6 +6,10 @@ let cssFunctions = ['min', 'max', 'clamp', 'calc']
6
6
7
7
// Ref: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Types
8
8
9
+ function isCSSFunction ( value ) {
10
+ return cssFunctions . some ( ( fn ) => new RegExp ( `^${ fn } \\(.*\\)` ) . test ( value ) )
11
+ }
12
+
9
13
// This is not a data type, but rather a function that can normalize the
10
14
// correct values.
11
15
export function normalize ( value , isRoot = true ) {
@@ -55,13 +59,11 @@ export function url(value) {
55
59
}
56
60
57
61
export function number ( value ) {
58
- return ! isNaN ( Number ( value ) ) || cssFunctions . some ( ( fn ) => new RegExp ( `^ ${ fn } \\(.+?` ) . test ( value ) )
62
+ return ! isNaN ( Number ( value ) ) || isCSSFunction ( value )
59
63
}
60
64
61
65
export function percentage ( value ) {
62
- return splitAtTopLevelOnly ( value , '_' ) . every ( ( part ) => {
63
- return / % $ / g. test ( part ) || cssFunctions . some ( ( fn ) => new RegExp ( `^${ fn } \\(.+?%` ) . test ( part ) )
64
- } )
66
+ return ( value . endsWith ( '%' ) && number ( value . slice ( 0 , - 1 ) ) ) || isCSSFunction ( value )
65
67
}
66
68
67
69
let lengthUnits = [
@@ -84,13 +86,11 @@ let lengthUnits = [
84
86
]
85
87
let lengthUnitsPattern = `(?:${ lengthUnits . join ( '|' ) } )`
86
88
export function length ( value ) {
87
- return splitAtTopLevelOnly ( value , '_' ) . every ( ( part ) => {
88
- return (
89
- part === '0' ||
90
- new RegExp ( `${ lengthUnitsPattern } $` ) . test ( part ) ||
91
- cssFunctions . some ( ( fn ) => new RegExp ( `^${ fn } \\(.+?${ lengthUnitsPattern } ` ) . test ( part ) )
92
- )
93
- } )
89
+ return (
90
+ value === '0' ||
91
+ new RegExp ( `^[+-]?[0-9]*\.?[0-9]+(?:[eE][+-]?[0-9]+)?${ lengthUnitsPattern } $` ) . test ( value ) ||
92
+ isCSSFunction ( value )
93
+ )
94
94
}
95
95
96
96
let lineWidths = new Set ( [ 'thin' , 'medium' , 'thick' ] )
0 commit comments