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.
Files changed (48) hide show
  1. package/CHANGELOG.md +26 -1
  2. package/lib/cli/build/plugin.js +2 -2
  3. package/lib/corePlugins.js +11 -7
  4. package/lib/css/preflight.css +9 -0
  5. package/lib/lib/evaluateTailwindFunctions.js +5 -3
  6. package/lib/lib/expandTailwindAtRules.js +4 -4
  7. package/lib/lib/generateRules.js +15 -7
  8. package/lib/lib/setupContextUtils.js +24 -6
  9. package/lib/lib/setupTrackingContext.js +2 -1
  10. package/lib/plugin.js +3 -3
  11. package/lib/processTailwindFeatures.js +2 -2
  12. package/lib/util/dataTypes.js +14 -6
  13. package/lib/util/formatVariantSelector.js +2 -2
  14. package/lib/util/prefixSelector.js +1 -1
  15. package/lib/util/pseudoElements.js +18 -34
  16. package/lib/value-parser/LICENSE +22 -0
  17. package/lib/value-parser/README.md +3 -0
  18. package/lib/value-parser/index.d.js +2 -0
  19. package/lib/value-parser/index.js +22 -0
  20. package/lib/value-parser/parse.js +259 -0
  21. package/lib/value-parser/stringify.js +38 -0
  22. package/lib/value-parser/unit.js +86 -0
  23. package/lib/value-parser/walk.js +16 -0
  24. package/package.json +1 -2
  25. package/src/cli/build/plugin.js +2 -2
  26. package/src/corePlugins.js +13 -7
  27. package/src/css/preflight.css +9 -0
  28. package/src/lib/evaluateTailwindFunctions.js +4 -1
  29. package/src/lib/expandTailwindAtRules.js +9 -7
  30. package/src/lib/generateRules.js +15 -8
  31. package/src/lib/setupContextUtils.js +18 -5
  32. package/src/lib/setupTrackingContext.js +1 -3
  33. package/src/plugin.js +3 -3
  34. package/src/processTailwindFeatures.js +3 -2
  35. package/src/util/dataTypes.js +17 -6
  36. package/src/util/formatVariantSelector.js +2 -2
  37. package/src/util/prefixSelector.js +1 -0
  38. package/src/util/pseudoElements.js +14 -17
  39. package/src/value-parser/LICENSE +22 -0
  40. package/src/value-parser/README.md +3 -0
  41. package/src/value-parser/index.d.ts +177 -0
  42. package/src/value-parser/index.js +28 -0
  43. package/src/value-parser/parse.js +303 -0
  44. package/src/value-parser/stringify.js +41 -0
  45. package/src/value-parser/unit.js +118 -0
  46. package/src/value-parser/walk.js +18 -0
  47. package/stubs/config.full.js +1 -0
  48. 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.2",
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
  },
@@ -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
 
@@ -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
- { values: Object.fromEntries(pseudoVariants) }
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) => `${config('prefix')}${escapeClassName(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 }]
@@ -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 '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)
@@ -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
- for (let { file, content, extension } of context.changedContent) {
149
- let transformer = getTransformer(context.tailwindConfig, extension)
150
- let extractor = getExtractor(context, extension)
151
- content = file ? fs.readFileSync(file, 'utf8') : content
152
- getClassCandidates(transformer(content), extractor, candidates, seen)
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')
@@ -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, seperator, value] = match
196
+ let [, char, separator, value] = match
197
197
  // @-[200px] case
198
- if (char === '@' && seperator === '-') return []
198
+ if (char === '@' && separator === '-') return []
199
199
  // group[:hover] case
200
- if (char !== '@' && seperator === '') return []
200
+ if (char !== '@' && separator === '') return []
201
201
 
202
- variant = variant.replace(`${seperator}[${value}]`, '')
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
- isArbitraryVariant,
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
- isArbitraryVariant,
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
- isArbitraryVariant,
376
+ respectPrefix,
370
377
  })
371
378
  rule.selector = before
372
379
  })