tailwindcss 3.3.2 → 3.3.3
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.
- package/CHANGELOG.md +26 -1
- package/lib/cli/build/plugin.js +2 -2
- package/lib/corePlugins.js +11 -7
- package/lib/css/preflight.css +9 -0
- package/lib/lib/evaluateTailwindFunctions.js +5 -3
- package/lib/lib/expandTailwindAtRules.js +4 -4
- package/lib/lib/generateRules.js +15 -7
- package/lib/lib/setupContextUtils.js +24 -6
- package/lib/lib/setupTrackingContext.js +2 -1
- package/lib/plugin.js +3 -3
- package/lib/processTailwindFeatures.js +2 -2
- package/lib/util/dataTypes.js +14 -6
- package/lib/util/formatVariantSelector.js +2 -2
- package/lib/util/prefixSelector.js +1 -1
- package/lib/util/pseudoElements.js +18 -34
- package/lib/value-parser/LICENSE +22 -0
- package/lib/value-parser/README.md +3 -0
- package/lib/value-parser/index.d.js +2 -0
- package/lib/value-parser/index.js +22 -0
- package/lib/value-parser/parse.js +259 -0
- package/lib/value-parser/stringify.js +38 -0
- package/lib/value-parser/unit.js +86 -0
- package/lib/value-parser/walk.js +16 -0
- package/package.json +1 -2
- package/src/cli/build/plugin.js +2 -2
- package/src/corePlugins.js +13 -7
- package/src/css/preflight.css +9 -0
- package/src/lib/evaluateTailwindFunctions.js +4 -1
- package/src/lib/expandTailwindAtRules.js +9 -7
- package/src/lib/generateRules.js +15 -8
- package/src/lib/setupContextUtils.js +18 -5
- package/src/lib/setupTrackingContext.js +1 -3
- package/src/plugin.js +3 -3
- package/src/processTailwindFeatures.js +3 -2
- package/src/util/dataTypes.js +17 -6
- package/src/util/formatVariantSelector.js +2 -2
- package/src/util/prefixSelector.js +1 -0
- package/src/util/pseudoElements.js +14 -17
- package/src/value-parser/LICENSE +22 -0
- package/src/value-parser/README.md +3 -0
- package/src/value-parser/index.d.ts +177 -0
- package/src/value-parser/index.js +28 -0
- package/src/value-parser/parse.js +303 -0
- package/src/value-parser/stringify.js +41 -0
- package/src/value-parser/unit.js +118 -0
- package/src/value-parser/walk.js +18 -0
- package/stubs/config.full.js +1 -0
- package/types/generated/default-theme.d.ts +1 -0
|
@@ -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": "3.3.
|
|
3
|
+
"version": "3.3.3",
|
|
4
4
|
"description": "A utility-first CSS framework for rapidly building custom user interfaces.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "lib/index.js",
|
|
@@ -87,7 +87,6 @@
|
|
|
87
87
|
"postcss-load-config": "^4.0.1",
|
|
88
88
|
"postcss-nested": "^6.0.1",
|
|
89
89
|
"postcss-selector-parser": "^6.0.11",
|
|
90
|
-
"postcss-value-parser": "^4.2.0",
|
|
91
90
|
"resolve": "^1.22.2",
|
|
92
91
|
"sucrase": "^3.32.0"
|
|
93
92
|
},
|
package/src/cli/build/plugin.js
CHANGED
|
@@ -278,9 +278,9 @@ export async function createProcessor(args, cliConfigPath) {
|
|
|
278
278
|
let tailwindPlugin = () => {
|
|
279
279
|
return {
|
|
280
280
|
postcssPlugin: 'tailwindcss',
|
|
281
|
-
Once(root, { result }) {
|
|
281
|
+
async Once(root, { result }) {
|
|
282
282
|
env.DEBUG && console.time('Compiling CSS')
|
|
283
|
-
tailwind(({ createContext }) => {
|
|
283
|
+
await tailwind(({ createContext }) => {
|
|
284
284
|
console.error()
|
|
285
285
|
console.error('Rebuilding...')
|
|
286
286
|
|
package/src/corePlugins.js
CHANGED
|
@@ -22,6 +22,7 @@ import { formatBoxShadowValue, parseBoxShadowValue } from './util/parseBoxShadow
|
|
|
22
22
|
import { removeAlphaVariables } from './util/removeAlphaVariables'
|
|
23
23
|
import { flagEnabled } from './featureFlags'
|
|
24
24
|
import { normalize } from './util/dataTypes'
|
|
25
|
+
import { INTERNAL_FEATURES } from './lib/setupContextUtils'
|
|
25
26
|
|
|
26
27
|
export let variantPlugins = {
|
|
27
28
|
pseudoElementVariants: ({ addVariant }) => {
|
|
@@ -80,7 +81,7 @@ export let variantPlugins = {
|
|
|
80
81
|
})
|
|
81
82
|
},
|
|
82
83
|
|
|
83
|
-
pseudoClassVariants: ({ addVariant, matchVariant, config }) => {
|
|
84
|
+
pseudoClassVariants: ({ addVariant, matchVariant, config, prefix }) => {
|
|
84
85
|
let pseudoVariants = [
|
|
85
86
|
// Positional
|
|
86
87
|
['first', '&:first-child'],
|
|
@@ -151,12 +152,12 @@ export let variantPlugins = {
|
|
|
151
152
|
let variants = {
|
|
152
153
|
group: (_, { modifier }) =>
|
|
153
154
|
modifier
|
|
154
|
-
? [`:merge(.group\\/${escapeClassName(modifier)})`, ' &']
|
|
155
|
-
: [`:merge(.group)`, ' &'],
|
|
155
|
+
? [`:merge(${prefix('.group')}\\/${escapeClassName(modifier)})`, ' &']
|
|
156
|
+
: [`:merge(${prefix('.group')})`, ' &'],
|
|
156
157
|
peer: (_, { modifier }) =>
|
|
157
158
|
modifier
|
|
158
|
-
? [`:merge(.peer\\/${escapeClassName(modifier)})`, ' ~ &']
|
|
159
|
-
: [`:merge(.peer)`, ' ~ &'],
|
|
159
|
+
? [`:merge(${prefix('.peer')}\\/${escapeClassName(modifier)})`, ' ~ &']
|
|
160
|
+
: [`:merge(${prefix('.peer')})`, ' ~ &'],
|
|
160
161
|
}
|
|
161
162
|
|
|
162
163
|
for (let [name, fn] of Object.entries(variants)) {
|
|
@@ -192,7 +193,12 @@ export let variantPlugins = {
|
|
|
192
193
|
|
|
193
194
|
return result.slice(0, start) + a + result.slice(start + 1, end) + b + result.slice(end)
|
|
194
195
|
},
|
|
195
|
-
{
|
|
196
|
+
{
|
|
197
|
+
values: Object.fromEntries(pseudoVariants),
|
|
198
|
+
[INTERNAL_FEATURES]: {
|
|
199
|
+
respectPrefix: false,
|
|
200
|
+
},
|
|
201
|
+
}
|
|
196
202
|
)
|
|
197
203
|
}
|
|
198
204
|
},
|
|
@@ -913,7 +919,7 @@ export let corePlugins = {
|
|
|
913
919
|
},
|
|
914
920
|
|
|
915
921
|
animation: ({ matchUtilities, theme, config }) => {
|
|
916
|
-
let prefixName = (name) =>
|
|
922
|
+
let prefixName = (name) => escapeClassName(config('prefix') + name)
|
|
917
923
|
let keyframes = Object.fromEntries(
|
|
918
924
|
Object.entries(theme('keyframes') ?? {}).map(([key, value]) => {
|
|
919
925
|
return [key, { [`@keyframes ${prefixName(key)}`]: value }]
|
package/src/css/preflight.css
CHANGED
|
@@ -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 */
|
|
@@ -300,6 +302,13 @@ menu {
|
|
|
300
302
|
padding: 0;
|
|
301
303
|
}
|
|
302
304
|
|
|
305
|
+
/*
|
|
306
|
+
Reset default styling for dialogs.
|
|
307
|
+
*/
|
|
308
|
+
dialog {
|
|
309
|
+
padding: 0;
|
|
310
|
+
}
|
|
311
|
+
|
|
303
312
|
/*
|
|
304
313
|
Prevent resizing textareas horizontally by default.
|
|
305
314
|
*/
|
|
@@ -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 '
|
|
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)
|
|
@@ -98,7 +98,7 @@ function buildStylesheet(rules, context) {
|
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
export default function expandTailwindAtRules(context) {
|
|
101
|
-
return (root) => {
|
|
101
|
+
return async (root) => {
|
|
102
102
|
let layerNodes = {
|
|
103
103
|
base: null,
|
|
104
104
|
components: null,
|
|
@@ -145,12 +145,14 @@ export default function expandTailwindAtRules(context) {
|
|
|
145
145
|
// getClassCandidatesOxide(file, transformer(content), extractor, candidates, seen)
|
|
146
146
|
// }
|
|
147
147
|
} else {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
148
|
+
await Promise.all(
|
|
149
|
+
context.changedContent.map(async ({ file, content, extension }) => {
|
|
150
|
+
let transformer = getTransformer(context.tailwindConfig, extension)
|
|
151
|
+
let extractor = getExtractor(context, extension)
|
|
152
|
+
content = file ? await fs.promises.readFile(file, 'utf8') : content
|
|
153
|
+
getClassCandidates(transformer(content), extractor, candidates, seen)
|
|
154
|
+
})
|
|
155
|
+
)
|
|
154
156
|
}
|
|
155
157
|
|
|
156
158
|
env.DEBUG && console.timeEnd('Reading changed files')
|
package/src/lib/generateRules.js
CHANGED
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
} from '../util/formatVariantSelector'
|
|
14
14
|
import { asClass } from '../util/nameClass'
|
|
15
15
|
import { normalize } from '../util/dataTypes'
|
|
16
|
-
import { isValidVariantFormatString, parseVariant } from './setupContextUtils'
|
|
16
|
+
import { isValidVariantFormatString, parseVariant, INTERNAL_FEATURES } from './setupContextUtils'
|
|
17
17
|
import isValidArbitraryValue from '../util/isSyntacticallyValidPropertyValue'
|
|
18
18
|
import { splitAtTopLevelOnly } from '../util/splitAtTopLevelOnly.js'
|
|
19
19
|
import { flagEnabled } from '../featureFlags'
|
|
@@ -193,13 +193,13 @@ function applyVariant(variant, matches, context) {
|
|
|
193
193
|
// group[:hover] (`-` is missing)
|
|
194
194
|
let match = /(.)(-?)\[(.*)\]/g.exec(variant)
|
|
195
195
|
if (match) {
|
|
196
|
-
let [, char,
|
|
196
|
+
let [, char, separator, value] = match
|
|
197
197
|
// @-[200px] case
|
|
198
|
-
if (char === '@' &&
|
|
198
|
+
if (char === '@' && separator === '-') return []
|
|
199
199
|
// group[:hover] case
|
|
200
|
-
if (char !== '@' &&
|
|
200
|
+
if (char !== '@' && separator === '') return []
|
|
201
201
|
|
|
202
|
-
variant = variant.replace(`${
|
|
202
|
+
variant = variant.replace(`${separator}[${value}]`, '')
|
|
203
203
|
args.value = value
|
|
204
204
|
}
|
|
205
205
|
}
|
|
@@ -230,9 +230,16 @@ function applyVariant(variant, matches, context) {
|
|
|
230
230
|
|
|
231
231
|
if (context.variantMap.has(variant)) {
|
|
232
232
|
let isArbitraryVariant = isArbitraryValue(variant)
|
|
233
|
+
let internalFeatures = context.variantOptions.get(variant)?.[INTERNAL_FEATURES] ?? {}
|
|
233
234
|
let variantFunctionTuples = context.variantMap.get(variant).slice()
|
|
234
235
|
let result = []
|
|
235
236
|
|
|
237
|
+
let respectPrefix = (() => {
|
|
238
|
+
if (isArbitraryVariant) return false
|
|
239
|
+
if (internalFeatures.respectPrefix === false) return false
|
|
240
|
+
return true
|
|
241
|
+
})()
|
|
242
|
+
|
|
236
243
|
for (let [meta, rule] of matches) {
|
|
237
244
|
// Don't generate variants for user css
|
|
238
245
|
if (meta.layer === 'user') {
|
|
@@ -293,7 +300,7 @@ function applyVariant(variant, matches, context) {
|
|
|
293
300
|
format(selectorFormat) {
|
|
294
301
|
collectedFormats.push({
|
|
295
302
|
format: selectorFormat,
|
|
296
|
-
|
|
303
|
+
respectPrefix,
|
|
297
304
|
})
|
|
298
305
|
},
|
|
299
306
|
args,
|
|
@@ -322,7 +329,7 @@ function applyVariant(variant, matches, context) {
|
|
|
322
329
|
if (typeof ruleWithVariant === 'string') {
|
|
323
330
|
collectedFormats.push({
|
|
324
331
|
format: ruleWithVariant,
|
|
325
|
-
|
|
332
|
+
respectPrefix,
|
|
326
333
|
})
|
|
327
334
|
}
|
|
328
335
|
|
|
@@ -366,7 +373,7 @@ function applyVariant(variant, matches, context) {
|
|
|
366
373
|
// format: .foo &
|
|
367
374
|
collectedFormats.push({
|
|
368
375
|
format: modified.replace(rebuiltBase, '&'),
|
|
369
|
-
|
|
376
|
+
respectPrefix,
|
|
370
377
|
})
|
|
371
378
|
rule.selector = before
|
|
372
379
|
})
|