tailwindcss 0.0.0-oxide-insiders.a7f7b76 → 0.0.0-oxide-insiders.764f6a1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -163,6 +163,8 @@ optgroup,
163
163
  select,
164
164
  textarea {
165
165
  font-family: inherit; /* 1 */
166
+ font-feature-settings: inherit; /* 1 */
167
+ font-variation-settings: inherit; /* 1 */
166
168
  font-size: 100%; /* 1 */
167
169
  font-weight: inherit; /* 1 */
168
170
  line-height: inherit; /* 1 */
@@ -264,7 +266,7 @@ summary {
264
266
  }
265
267
 
266
268
  /*
267
- Removes the default spacing and border for appropriate elements.
269
+ Removes the default spacing for appropriate elements.
268
270
  */
269
271
 
270
272
  blockquote,
@@ -300,6 +302,10 @@ menu {
300
302
  padding: 0;
301
303
  }
302
304
 
305
+ dialog {
306
+ padding: 0;
307
+ }
308
+
303
309
  /*
304
310
  Prevent resizing textareas horizontally by default.
305
311
  */
@@ -11,7 +11,7 @@ Object.defineProperty(exports, "default", {
11
11
  const _dlv = /*#__PURE__*/ _interop_require_default(require("dlv"));
12
12
  const _didyoumean = /*#__PURE__*/ _interop_require_default(require("didyoumean"));
13
13
  const _transformThemeValue = /*#__PURE__*/ _interop_require_default(require("../util/transformThemeValue"));
14
- const _postcssvalueparser = /*#__PURE__*/ _interop_require_default(require("postcss-value-parser"));
14
+ const _index = /*#__PURE__*/ _interop_require_default(require("../value-parser/index"));
15
15
  const _normalizeScreens = require("../util/normalizeScreens");
16
16
  const _buildMediaQuery = /*#__PURE__*/ _interop_require_default(require("../util/buildMediaQuery"));
17
17
  const _toPath = require("../util/toPath");
@@ -121,7 +121,7 @@ function extractArgs(node, vNodes, functions) {
121
121
  if (vNode.type === "div" && vNode.value === ",") {
122
122
  args.push("");
123
123
  } else {
124
- args[args.length - 1] += _postcssvalueparser.default.stringify(vNode);
124
+ args[args.length - 1] += _index.default.stringify(vNode);
125
125
  }
126
126
  }
127
127
  return args;
@@ -135,7 +135,9 @@ function resolveVNode(node, vNode, functions) {
135
135
  return vNode;
136
136
  }
137
137
  function resolveFunctions(node, input, functions) {
138
- return (0, _postcssvalueparser.default)(input).walk((vNode)=>{
138
+ let hasAnyFn = Object.keys(functions).some((fn)=>input.includes(`${fn}(`));
139
+ if (!hasAnyFn) return input;
140
+ return (0, _index.default)(input).walk((vNode)=>{
139
141
  resolveVNode(node, vNode, functions);
140
142
  }).toString();
141
143
  }
@@ -89,16 +89,23 @@ function normalize(value, isRoot = true) {
89
89
  if (isRoot) {
90
90
  value = value.trim();
91
91
  }
92
- // Add spaces around operators inside math functions like calc() that do not follow an operator
93
- // or '('.
94
- value = value.replace(/(calc|min|max|clamp)\(.+\)/g, (match)=>{
92
+ value = normalizeMathOperatorSpacing(value);
93
+ return value;
94
+ }
95
+ /**
96
+ * Add spaces around operators inside math functions
97
+ * like calc() that do not follow an operator or '('.
98
+ *
99
+ * @param {string} value
100
+ * @returns {string}
101
+ */ function normalizeMathOperatorSpacing(value) {
102
+ return value.replace(/(calc|min|max|clamp)\(.+\)/g, (match)=>{
95
103
  let vars = [];
96
104
  return match.replace(/var\((--.+?)[,)]/g, (match, g1)=>{
97
105
  vars.push(g1);
98
106
  return match.replace(g1, placeholder);
99
107
  }).replace(/(-?\d*\.?\d(?!\b-\d.+[,)](?![^+\-/*])\D)(?:%|[a-z]+)?|\))([+\-/*])/g, "$1 $2 ").replace(placeholderRe, ()=>vars.shift());
100
108
  });
101
- return value;
102
109
  }
103
110
  function url(value) {
104
111
  return value.startsWith("url(");
@@ -199,11 +206,12 @@ function image(value) {
199
206
  return images > 0;
200
207
  }
201
208
  let gradientTypes = new Set([
209
+ "conic-gradient",
202
210
  "linear-gradient",
203
211
  "radial-gradient",
212
+ "repeating-conic-gradient",
204
213
  "repeating-linear-gradient",
205
- "repeating-radial-gradient",
206
- "conic-gradient"
214
+ "repeating-radial-gradient"
207
215
  ]);
208
216
  function gradient(value) {
209
217
  value = normalize(value);
@@ -0,0 +1,22 @@
1
+ Copyright (c) Bogdan Chadkin <trysound@yandex.ru>
2
+
3
+ Permission is hereby granted, free of charge, to any person
4
+ obtaining a copy of this software and associated documentation
5
+ files (the "Software"), to deal in the Software without
6
+ restriction, including without limitation the rights to use,
7
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ copies of the Software, and to permit persons to whom the
9
+ Software is furnished to do so, subject to the following
10
+ conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
17
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
19
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
20
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,3 @@
1
+ # postcss-value-parser (forked + inlined)
2
+
3
+ This is a customized version of of [PostCSS Value Parser](https://github.com/TrySound/postcss-value-parser) to fix some bugs around parsing CSS functions.
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ module.exports = postcssValueParser;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var parse = require("./parse");
3
+ var walk = require("./walk");
4
+ var stringify = require("./stringify");
5
+ function ValueParser(value) {
6
+ if (this instanceof ValueParser) {
7
+ this.nodes = parse(value);
8
+ return this;
9
+ }
10
+ return new ValueParser(value);
11
+ }
12
+ ValueParser.prototype.toString = function() {
13
+ return Array.isArray(this.nodes) ? stringify(this.nodes) : "";
14
+ };
15
+ ValueParser.prototype.walk = function(cb, bubble) {
16
+ walk(this.nodes, cb, bubble);
17
+ return this;
18
+ };
19
+ ValueParser.unit = require("./unit");
20
+ ValueParser.walk = walk;
21
+ ValueParser.stringify = stringify;
22
+ module.exports = ValueParser;
@@ -0,0 +1,259 @@
1
+ "use strict";
2
+ var openParentheses = "(".charCodeAt(0);
3
+ var closeParentheses = ")".charCodeAt(0);
4
+ var singleQuote = "'".charCodeAt(0);
5
+ var doubleQuote = '"'.charCodeAt(0);
6
+ var backslash = "\\".charCodeAt(0);
7
+ var slash = "/".charCodeAt(0);
8
+ var comma = ",".charCodeAt(0);
9
+ var colon = ":".charCodeAt(0);
10
+ var star = "*".charCodeAt(0);
11
+ var uLower = "u".charCodeAt(0);
12
+ var uUpper = "U".charCodeAt(0);
13
+ var plus = "+".charCodeAt(0);
14
+ var isUnicodeRange = /^[a-f0-9?-]+$/i;
15
+ module.exports = function(input) {
16
+ var tokens = [];
17
+ var value = input;
18
+ var next, quote, prev, token, escape, escapePos, whitespacePos, parenthesesOpenPos;
19
+ var pos = 0;
20
+ var code = value.charCodeAt(pos);
21
+ var max = value.length;
22
+ var stack = [
23
+ {
24
+ nodes: tokens
25
+ }
26
+ ];
27
+ var balanced = 0;
28
+ var parent;
29
+ var name = "";
30
+ var before = "";
31
+ var after = "";
32
+ while(pos < max){
33
+ // Whitespaces
34
+ if (code <= 32) {
35
+ next = pos;
36
+ do {
37
+ next += 1;
38
+ code = value.charCodeAt(next);
39
+ }while (code <= 32);
40
+ token = value.slice(pos, next);
41
+ prev = tokens[tokens.length - 1];
42
+ if (code === closeParentheses && balanced) {
43
+ after = token;
44
+ } else if (prev && prev.type === "div") {
45
+ prev.after = token;
46
+ prev.sourceEndIndex += token.length;
47
+ } else if (code === comma || code === colon || code === slash && value.charCodeAt(next + 1) !== star && (!parent || parent && parent.type === "function" && false)) {
48
+ before = token;
49
+ } else {
50
+ tokens.push({
51
+ type: "space",
52
+ sourceIndex: pos,
53
+ sourceEndIndex: next,
54
+ value: token
55
+ });
56
+ }
57
+ pos = next;
58
+ // Quotes
59
+ } else if (code === singleQuote || code === doubleQuote) {
60
+ next = pos;
61
+ quote = code === singleQuote ? "'" : '"';
62
+ token = {
63
+ type: "string",
64
+ sourceIndex: pos,
65
+ quote: quote
66
+ };
67
+ do {
68
+ escape = false;
69
+ next = value.indexOf(quote, next + 1);
70
+ if (~next) {
71
+ escapePos = next;
72
+ while(value.charCodeAt(escapePos - 1) === backslash){
73
+ escapePos -= 1;
74
+ escape = !escape;
75
+ }
76
+ } else {
77
+ value += quote;
78
+ next = value.length - 1;
79
+ token.unclosed = true;
80
+ }
81
+ }while (escape);
82
+ token.value = value.slice(pos + 1, next);
83
+ token.sourceEndIndex = token.unclosed ? next : next + 1;
84
+ tokens.push(token);
85
+ pos = next + 1;
86
+ code = value.charCodeAt(pos);
87
+ // Comments
88
+ } else if (code === slash && value.charCodeAt(pos + 1) === star) {
89
+ next = value.indexOf("*/", pos);
90
+ token = {
91
+ type: "comment",
92
+ sourceIndex: pos,
93
+ sourceEndIndex: next + 2
94
+ };
95
+ if (next === -1) {
96
+ token.unclosed = true;
97
+ next = value.length;
98
+ token.sourceEndIndex = next;
99
+ }
100
+ token.value = value.slice(pos + 2, next);
101
+ tokens.push(token);
102
+ pos = next + 2;
103
+ code = value.charCodeAt(pos);
104
+ // Operation within calc
105
+ } else if ((code === slash || code === star) && parent && parent.type === "function" && true) {
106
+ token = value[pos];
107
+ tokens.push({
108
+ type: "word",
109
+ sourceIndex: pos - before.length,
110
+ sourceEndIndex: pos + token.length,
111
+ value: token
112
+ });
113
+ pos += 1;
114
+ code = value.charCodeAt(pos);
115
+ // Dividers
116
+ } else if (code === slash || code === comma || code === colon) {
117
+ token = value[pos];
118
+ tokens.push({
119
+ type: "div",
120
+ sourceIndex: pos - before.length,
121
+ sourceEndIndex: pos + token.length,
122
+ value: token,
123
+ before: before,
124
+ after: ""
125
+ });
126
+ before = "";
127
+ pos += 1;
128
+ code = value.charCodeAt(pos);
129
+ // Open parentheses
130
+ } else if (openParentheses === code) {
131
+ // Whitespaces after open parentheses
132
+ next = pos;
133
+ do {
134
+ next += 1;
135
+ code = value.charCodeAt(next);
136
+ }while (code <= 32);
137
+ parenthesesOpenPos = pos;
138
+ token = {
139
+ type: "function",
140
+ sourceIndex: pos - name.length,
141
+ value: name,
142
+ before: value.slice(parenthesesOpenPos + 1, next)
143
+ };
144
+ pos = next;
145
+ if (name === "url" && code !== singleQuote && code !== doubleQuote) {
146
+ next -= 1;
147
+ do {
148
+ escape = false;
149
+ next = value.indexOf(")", next + 1);
150
+ if (~next) {
151
+ escapePos = next;
152
+ while(value.charCodeAt(escapePos - 1) === backslash){
153
+ escapePos -= 1;
154
+ escape = !escape;
155
+ }
156
+ } else {
157
+ value += ")";
158
+ next = value.length - 1;
159
+ token.unclosed = true;
160
+ }
161
+ }while (escape);
162
+ // Whitespaces before closed
163
+ whitespacePos = next;
164
+ do {
165
+ whitespacePos -= 1;
166
+ code = value.charCodeAt(whitespacePos);
167
+ }while (code <= 32);
168
+ if (parenthesesOpenPos < whitespacePos) {
169
+ if (pos !== whitespacePos + 1) {
170
+ token.nodes = [
171
+ {
172
+ type: "word",
173
+ sourceIndex: pos,
174
+ sourceEndIndex: whitespacePos + 1,
175
+ value: value.slice(pos, whitespacePos + 1)
176
+ }
177
+ ];
178
+ } else {
179
+ token.nodes = [];
180
+ }
181
+ if (token.unclosed && whitespacePos + 1 !== next) {
182
+ token.after = "";
183
+ token.nodes.push({
184
+ type: "space",
185
+ sourceIndex: whitespacePos + 1,
186
+ sourceEndIndex: next,
187
+ value: value.slice(whitespacePos + 1, next)
188
+ });
189
+ } else {
190
+ token.after = value.slice(whitespacePos + 1, next);
191
+ token.sourceEndIndex = next;
192
+ }
193
+ } else {
194
+ token.after = "";
195
+ token.nodes = [];
196
+ }
197
+ pos = next + 1;
198
+ token.sourceEndIndex = token.unclosed ? next : pos;
199
+ code = value.charCodeAt(pos);
200
+ tokens.push(token);
201
+ } else {
202
+ balanced += 1;
203
+ token.after = "";
204
+ token.sourceEndIndex = pos + 1;
205
+ tokens.push(token);
206
+ stack.push(token);
207
+ tokens = token.nodes = [];
208
+ parent = token;
209
+ }
210
+ name = "";
211
+ // Close parentheses
212
+ } else if (closeParentheses === code && balanced) {
213
+ pos += 1;
214
+ code = value.charCodeAt(pos);
215
+ parent.after = after;
216
+ parent.sourceEndIndex += after.length;
217
+ after = "";
218
+ balanced -= 1;
219
+ stack[stack.length - 1].sourceEndIndex = pos;
220
+ stack.pop();
221
+ parent = stack[balanced];
222
+ tokens = parent.nodes;
223
+ // Words
224
+ } else {
225
+ next = pos;
226
+ do {
227
+ if (code === backslash) {
228
+ next += 1;
229
+ }
230
+ next += 1;
231
+ code = value.charCodeAt(next);
232
+ }while (next < max && !(code <= 32 || code === singleQuote || code === doubleQuote || code === comma || code === colon || code === slash || code === openParentheses || code === star && parent && parent.type === "function" && true || code === slash && parent.type === "function" && true || code === closeParentheses && balanced));
233
+ token = value.slice(pos, next);
234
+ if (openParentheses === code) {
235
+ name = token;
236
+ } else if ((uLower === token.charCodeAt(0) || uUpper === token.charCodeAt(0)) && plus === token.charCodeAt(1) && isUnicodeRange.test(token.slice(2))) {
237
+ tokens.push({
238
+ type: "unicode-range",
239
+ sourceIndex: pos,
240
+ sourceEndIndex: next,
241
+ value: token
242
+ });
243
+ } else {
244
+ tokens.push({
245
+ type: "word",
246
+ sourceIndex: pos,
247
+ sourceEndIndex: next,
248
+ value: token
249
+ });
250
+ }
251
+ pos = next;
252
+ }
253
+ }
254
+ for(pos = stack.length - 1; pos; pos -= 1){
255
+ stack[pos].unclosed = true;
256
+ stack[pos].sourceEndIndex = value.length;
257
+ }
258
+ return stack[0].nodes;
259
+ };
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ function stringifyNode(node, custom) {
3
+ var type = node.type;
4
+ var value = node.value;
5
+ var buf;
6
+ var customResult;
7
+ if (custom && (customResult = custom(node)) !== undefined) {
8
+ return customResult;
9
+ } else if (type === "word" || type === "space") {
10
+ return value;
11
+ } else if (type === "string") {
12
+ buf = node.quote || "";
13
+ return buf + value + (node.unclosed ? "" : buf);
14
+ } else if (type === "comment") {
15
+ return "/*" + value + (node.unclosed ? "" : "*/");
16
+ } else if (type === "div") {
17
+ return (node.before || "") + value + (node.after || "");
18
+ } else if (Array.isArray(node.nodes)) {
19
+ buf = stringify(node.nodes, custom);
20
+ if (type !== "function") {
21
+ return buf;
22
+ }
23
+ return value + "(" + (node.before || "") + buf + (node.after || "") + (node.unclosed ? "" : ")");
24
+ }
25
+ return value;
26
+ }
27
+ function stringify(nodes, custom) {
28
+ var result, i;
29
+ if (Array.isArray(nodes)) {
30
+ result = "";
31
+ for(i = nodes.length - 1; ~i; i -= 1){
32
+ result = stringifyNode(nodes[i], custom) + result;
33
+ }
34
+ return result;
35
+ }
36
+ return stringifyNode(nodes, custom);
37
+ }
38
+ module.exports = stringify;
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ var minus = "-".charCodeAt(0);
3
+ var plus = "+".charCodeAt(0);
4
+ var dot = ".".charCodeAt(0);
5
+ var exp = "e".charCodeAt(0);
6
+ var EXP = "E".charCodeAt(0);
7
+ // Check if three code points would start a number
8
+ // https://www.w3.org/TR/css-syntax-3/#starts-with-a-number
9
+ function likeNumber(value) {
10
+ var code = value.charCodeAt(0);
11
+ var nextCode;
12
+ if (code === plus || code === minus) {
13
+ nextCode = value.charCodeAt(1);
14
+ if (nextCode >= 48 && nextCode <= 57) {
15
+ return true;
16
+ }
17
+ var nextNextCode = value.charCodeAt(2);
18
+ if (nextCode === dot && nextNextCode >= 48 && nextNextCode <= 57) {
19
+ return true;
20
+ }
21
+ return false;
22
+ }
23
+ if (code === dot) {
24
+ nextCode = value.charCodeAt(1);
25
+ if (nextCode >= 48 && nextCode <= 57) {
26
+ return true;
27
+ }
28
+ return false;
29
+ }
30
+ if (code >= 48 && code <= 57) {
31
+ return true;
32
+ }
33
+ return false;
34
+ }
35
+ // Consume a number
36
+ // https://www.w3.org/TR/css-syntax-3/#consume-number
37
+ module.exports = function(value) {
38
+ var pos = 0;
39
+ var length = value.length;
40
+ var code;
41
+ var nextCode;
42
+ var nextNextCode;
43
+ if (length === 0 || !likeNumber(value)) {
44
+ return false;
45
+ }
46
+ code = value.charCodeAt(pos);
47
+ if (code === plus || code === minus) {
48
+ pos++;
49
+ }
50
+ while(pos < length){
51
+ code = value.charCodeAt(pos);
52
+ if (code < 48 || code > 57) {
53
+ break;
54
+ }
55
+ pos += 1;
56
+ }
57
+ code = value.charCodeAt(pos);
58
+ nextCode = value.charCodeAt(pos + 1);
59
+ if (code === dot && nextCode >= 48 && nextCode <= 57) {
60
+ pos += 2;
61
+ while(pos < length){
62
+ code = value.charCodeAt(pos);
63
+ if (code < 48 || code > 57) {
64
+ break;
65
+ }
66
+ pos += 1;
67
+ }
68
+ }
69
+ code = value.charCodeAt(pos);
70
+ nextCode = value.charCodeAt(pos + 1);
71
+ nextNextCode = value.charCodeAt(pos + 2);
72
+ if ((code === exp || code === EXP) && (nextCode >= 48 && nextCode <= 57 || (nextCode === plus || nextCode === minus) && nextNextCode >= 48 && nextNextCode <= 57)) {
73
+ pos += nextCode === plus || nextCode === minus ? 3 : 2;
74
+ while(pos < length){
75
+ code = value.charCodeAt(pos);
76
+ if (code < 48 || code > 57) {
77
+ break;
78
+ }
79
+ pos += 1;
80
+ }
81
+ }
82
+ return {
83
+ number: value.slice(0, pos),
84
+ unit: value.slice(pos)
85
+ };
86
+ };
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ module.exports = function walk(nodes, cb, bubble) {
3
+ var i, max, node, result;
4
+ for(i = 0, max = nodes.length; i < max; i += 1){
5
+ node = nodes[i];
6
+ if (!bubble) {
7
+ result = cb(node, i, nodes);
8
+ }
9
+ if (result !== false && node.type === "function" && Array.isArray(node.nodes)) {
10
+ walk(node.nodes, cb, bubble);
11
+ }
12
+ if (bubble) {
13
+ cb(node, i, nodes);
14
+ }
15
+ }
16
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tailwindcss",
3
- "version": "0.0.0-oxide-insiders.a7f7b76",
3
+ "version": "0.0.0-oxide-insiders.764f6a1",
4
4
  "description": "A utility-first CSS framework for rapidly building custom user interfaces.",
5
5
  "license": "MIT",
6
6
  "main": "lib/index.js",
@@ -68,7 +68,7 @@
68
68
  },
69
69
  "dependencies": {
70
70
  "@alloc/quick-lru": "^5.2.0",
71
- "@tailwindcss/oxide": "0.0.0-oxide-insiders.a7f7b76",
71
+ "@tailwindcss/oxide": "0.0.0-oxide-insiders.764f6a1",
72
72
  "arg": "^5.0.2",
73
73
  "browserslist": "^4.21.5",
74
74
  "chokidar": "^3.5.3",
@@ -163,6 +163,8 @@ optgroup,
163
163
  select,
164
164
  textarea {
165
165
  font-family: inherit; /* 1 */
166
+ font-feature-settings: inherit; /* 1 */
167
+ font-variation-settings: inherit; /* 1 */
166
168
  font-size: 100%; /* 1 */
167
169
  font-weight: inherit; /* 1 */
168
170
  line-height: inherit; /* 1 */
@@ -264,7 +266,7 @@ summary {
264
266
  }
265
267
 
266
268
  /*
267
- Removes the default spacing and border for appropriate elements.
269
+ Removes the default spacing for appropriate elements.
268
270
  */
269
271
 
270
272
  blockquote,
@@ -300,6 +302,10 @@ menu {
300
302
  padding: 0;
301
303
  }
302
304
 
305
+ dialog {
306
+ padding: 0;
307
+ }
308
+
303
309
  /*
304
310
  Prevent resizing textareas horizontally by default.
305
311
  */
@@ -1,7 +1,7 @@
1
1
  import dlv from 'dlv'
2
2
  import didYouMean from 'didyoumean'
3
3
  import transformThemeValue from '../util/transformThemeValue'
4
- import parseValue from 'postcss-value-parser'
4
+ import parseValue from '../value-parser/index'
5
5
  import { normalizeScreens } from '../util/normalizeScreens'
6
6
  import buildMediaQuery from '../util/buildMediaQuery'
7
7
  import { toPath } from '../util/toPath'
@@ -146,6 +146,9 @@ function resolveVNode(node, vNode, functions) {
146
146
  }
147
147
 
148
148
  function resolveFunctions(node, input, functions) {
149
+ let hasAnyFn = Object.keys(functions).some((fn) => input.includes(`${fn}(`))
150
+ if (!hasAnyFn) return input
151
+
149
152
  return parseValue(input)
150
153
  .walk((vNode) => {
151
154
  resolveVNode(node, vNode, functions)
@@ -49,10 +49,22 @@ export function normalize(value, isRoot = true) {
49
49
  value = value.trim()
50
50
  }
51
51
 
52
- // Add spaces around operators inside math functions like calc() that do not follow an operator
53
- // or '('.
54
- value = value.replace(/(calc|min|max|clamp)\(.+\)/g, (match) => {
52
+ value = normalizeMathOperatorSpacing(value)
53
+
54
+ return value
55
+ }
56
+
57
+ /**
58
+ * Add spaces around operators inside math functions
59
+ * like calc() that do not follow an operator or '('.
60
+ *
61
+ * @param {string} value
62
+ * @returns {string}
63
+ */
64
+ function normalizeMathOperatorSpacing(value) {
65
+ return value.replace(/(calc|min|max|clamp)\(.+\)/g, (match) => {
55
66
  let vars = []
67
+
56
68
  return match
57
69
  .replace(/var\((--.+?)[,)]/g, (match, g1) => {
58
70
  vars.push(g1)
@@ -61,8 +73,6 @@ export function normalize(value, isRoot = true) {
61
73
  .replace(/(-?\d*\.?\d(?!\b-\d.+[,)](?![^+\-/*])\D)(?:%|[a-z]+)?|\))([+\-/*])/g, '$1 $2 ')
62
74
  .replace(placeholderRe, () => vars.shift())
63
75
  })
64
-
65
- return value
66
76
  }
67
77
 
68
78
  export function url(value) {
@@ -178,11 +188,12 @@ export function image(value) {
178
188
  }
179
189
 
180
190
  let gradientTypes = new Set([
191
+ 'conic-gradient',
181
192
  'linear-gradient',
182
193
  'radial-gradient',
194
+ 'repeating-conic-gradient',
183
195
  'repeating-linear-gradient',
184
196
  'repeating-radial-gradient',
185
- 'conic-gradient',
186
197
  ])
187
198
  export function gradient(value) {
188
199
  value = normalize(value)