tailwindcss 3.3.2 → 3.3.4

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 (65) hide show
  1. package/CHANGELOG.md +50 -1
  2. package/lib/cli/build/plugin.js +2 -2
  3. package/lib/cli/build/watching.js +1 -1
  4. package/lib/corePlugins.js +11 -7
  5. package/lib/css/preflight.css +9 -0
  6. package/lib/lib/defaultExtractor.js +16 -22
  7. package/lib/lib/evaluateTailwindFunctions.js +5 -3
  8. package/lib/lib/expandApplyAtRules.js +6 -0
  9. package/lib/lib/expandTailwindAtRules.js +20 -6
  10. package/lib/lib/generateRules.js +34 -24
  11. package/lib/lib/setupContextUtils.js +53 -33
  12. package/lib/lib/setupTrackingContext.js +2 -1
  13. package/lib/oxide/cli/build/plugin.js +2 -2
  14. package/lib/plugin.js +3 -3
  15. package/lib/processTailwindFeatures.js +2 -2
  16. package/lib/util/color.js +1 -1
  17. package/lib/util/dataTypes.js +100 -16
  18. package/lib/util/formatVariantSelector.js +10 -3
  19. package/lib/util/isPlainObject.js +1 -1
  20. package/lib/util/prefixSelector.js +1 -1
  21. package/lib/util/pseudoElements.js +18 -34
  22. package/lib/value-parser/LICENSE +22 -0
  23. package/lib/value-parser/README.md +3 -0
  24. package/lib/value-parser/index.d.js +2 -0
  25. package/lib/value-parser/index.js +22 -0
  26. package/lib/value-parser/parse.js +259 -0
  27. package/lib/value-parser/stringify.js +38 -0
  28. package/lib/value-parser/unit.js +86 -0
  29. package/lib/value-parser/walk.js +16 -0
  30. package/nesting/index.d.ts +4 -0
  31. package/package.json +5 -6
  32. package/peers/index.js +701 -617
  33. package/src/cli/build/plugin.js +2 -2
  34. package/src/cli/build/watching.js +1 -1
  35. package/src/corePlugins.js +13 -7
  36. package/src/css/preflight.css +9 -0
  37. package/src/featureFlags.js +0 -1
  38. package/src/lib/defaultExtractor.js +12 -13
  39. package/src/lib/evaluateTailwindFunctions.js +4 -1
  40. package/src/lib/expandApplyAtRules.js +7 -0
  41. package/src/lib/expandTailwindAtRules.js +20 -6
  42. package/src/lib/generateRules.js +34 -25
  43. package/src/lib/setupContextUtils.js +50 -35
  44. package/src/lib/setupTrackingContext.js +1 -3
  45. package/src/oxide/cli/build/plugin.ts +2 -2
  46. package/src/plugin.js +3 -3
  47. package/src/processTailwindFeatures.js +3 -2
  48. package/src/util/color.js +1 -1
  49. package/src/util/dataTypes.js +101 -18
  50. package/src/util/formatVariantSelector.js +11 -3
  51. package/src/util/isPlainObject.js +1 -1
  52. package/src/util/prefixSelector.js +1 -0
  53. package/src/util/pseudoElements.js +14 -17
  54. package/src/value-parser/LICENSE +22 -0
  55. package/src/value-parser/README.md +3 -0
  56. package/src/value-parser/index.d.ts +177 -0
  57. package/src/value-parser/index.js +28 -0
  58. package/src/value-parser/parse.js +303 -0
  59. package/src/value-parser/stringify.js +41 -0
  60. package/src/value-parser/unit.js +118 -0
  61. package/src/value-parser/walk.js +18 -0
  62. package/stubs/config.full.js +1 -0
  63. package/types/config.d.ts +6 -6
  64. package/types/generated/default-theme.d.ts +1 -0
  65. package/types/index.d.ts +7 -3
@@ -0,0 +1,303 @@
1
+ var openParentheses = '('.charCodeAt(0)
2
+ var closeParentheses = ')'.charCodeAt(0)
3
+ var singleQuote = "'".charCodeAt(0)
4
+ var doubleQuote = '"'.charCodeAt(0)
5
+ var backslash = '\\'.charCodeAt(0)
6
+ var slash = '/'.charCodeAt(0)
7
+ var comma = ','.charCodeAt(0)
8
+ var colon = ':'.charCodeAt(0)
9
+ var star = '*'.charCodeAt(0)
10
+ var uLower = 'u'.charCodeAt(0)
11
+ var uUpper = 'U'.charCodeAt(0)
12
+ var plus = '+'.charCodeAt(0)
13
+ var isUnicodeRange = /^[a-f0-9?-]+$/i
14
+
15
+ module.exports = function (input) {
16
+ var tokens = []
17
+ var value = input
18
+
19
+ var next, quote, prev, token, escape, escapePos, whitespacePos, parenthesesOpenPos
20
+ var pos = 0
21
+ var code = value.charCodeAt(pos)
22
+ var max = value.length
23
+ var stack = [{ nodes: tokens }]
24
+ var balanced = 0
25
+ var parent
26
+
27
+ var name = ''
28
+ var before = ''
29
+ var after = ''
30
+
31
+ while (pos < max) {
32
+ // Whitespaces
33
+ if (code <= 32) {
34
+ next = pos
35
+ do {
36
+ next += 1
37
+ code = value.charCodeAt(next)
38
+ } while (code <= 32)
39
+ token = value.slice(pos, next)
40
+
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 (
48
+ code === comma ||
49
+ code === colon ||
50
+ (code === slash &&
51
+ value.charCodeAt(next + 1) !== star &&
52
+ (!parent || (parent && parent.type === 'function' && false)))
53
+ ) {
54
+ before = token
55
+ } else {
56
+ tokens.push({
57
+ type: 'space',
58
+ sourceIndex: pos,
59
+ sourceEndIndex: next,
60
+ value: token,
61
+ })
62
+ }
63
+
64
+ pos = next
65
+
66
+ // Quotes
67
+ } else if (code === singleQuote || code === doubleQuote) {
68
+ next = pos
69
+ quote = code === singleQuote ? "'" : '"'
70
+ token = {
71
+ type: 'string',
72
+ sourceIndex: pos,
73
+ quote: quote,
74
+ }
75
+ do {
76
+ escape = false
77
+ next = value.indexOf(quote, next + 1)
78
+ if (~next) {
79
+ escapePos = next
80
+ while (value.charCodeAt(escapePos - 1) === backslash) {
81
+ escapePos -= 1
82
+ escape = !escape
83
+ }
84
+ } else {
85
+ value += quote
86
+ next = value.length - 1
87
+ token.unclosed = true
88
+ }
89
+ } while (escape)
90
+ token.value = value.slice(pos + 1, next)
91
+ token.sourceEndIndex = token.unclosed ? next : next + 1
92
+ tokens.push(token)
93
+ pos = next + 1
94
+ code = value.charCodeAt(pos)
95
+
96
+ // Comments
97
+ } else if (code === slash && value.charCodeAt(pos + 1) === star) {
98
+ next = value.indexOf('*/', pos)
99
+
100
+ token = {
101
+ type: 'comment',
102
+ sourceIndex: pos,
103
+ sourceEndIndex: next + 2,
104
+ }
105
+
106
+ if (next === -1) {
107
+ token.unclosed = true
108
+ next = value.length
109
+ token.sourceEndIndex = next
110
+ }
111
+
112
+ token.value = value.slice(pos + 2, next)
113
+ tokens.push(token)
114
+
115
+ pos = next + 2
116
+ code = value.charCodeAt(pos)
117
+
118
+ // Operation within calc
119
+ } else if ((code === slash || code === star) && parent && parent.type === 'function' && true) {
120
+ token = value[pos]
121
+ tokens.push({
122
+ type: 'word',
123
+ sourceIndex: pos - before.length,
124
+ sourceEndIndex: pos + token.length,
125
+ value: token,
126
+ })
127
+ pos += 1
128
+ code = value.charCodeAt(pos)
129
+
130
+ // Dividers
131
+ } else if (code === slash || code === comma || code === colon) {
132
+ token = value[pos]
133
+
134
+ tokens.push({
135
+ type: 'div',
136
+ sourceIndex: pos - before.length,
137
+ sourceEndIndex: pos + token.length,
138
+ value: token,
139
+ before: before,
140
+ after: '',
141
+ })
142
+ before = ''
143
+
144
+ pos += 1
145
+ code = value.charCodeAt(pos)
146
+
147
+ // Open parentheses
148
+ } else if (openParentheses === code) {
149
+ // Whitespaces after open parentheses
150
+ next = pos
151
+ do {
152
+ next += 1
153
+ code = value.charCodeAt(next)
154
+ } while (code <= 32)
155
+ parenthesesOpenPos = pos
156
+ token = {
157
+ type: 'function',
158
+ sourceIndex: pos - name.length,
159
+ value: name,
160
+ before: value.slice(parenthesesOpenPos + 1, next),
161
+ }
162
+ pos = next
163
+
164
+ if (name === 'url' && code !== singleQuote && code !== doubleQuote) {
165
+ next -= 1
166
+ do {
167
+ escape = false
168
+ next = value.indexOf(')', next + 1)
169
+ if (~next) {
170
+ escapePos = next
171
+ while (value.charCodeAt(escapePos - 1) === backslash) {
172
+ escapePos -= 1
173
+ escape = !escape
174
+ }
175
+ } else {
176
+ value += ')'
177
+ next = value.length - 1
178
+ token.unclosed = true
179
+ }
180
+ } while (escape)
181
+ // Whitespaces before closed
182
+ whitespacePos = next
183
+ do {
184
+ whitespacePos -= 1
185
+ code = value.charCodeAt(whitespacePos)
186
+ } while (code <= 32)
187
+ if (parenthesesOpenPos < whitespacePos) {
188
+ if (pos !== whitespacePos + 1) {
189
+ token.nodes = [
190
+ {
191
+ type: 'word',
192
+ sourceIndex: pos,
193
+ sourceEndIndex: whitespacePos + 1,
194
+ value: value.slice(pos, whitespacePos + 1),
195
+ },
196
+ ]
197
+ } else {
198
+ token.nodes = []
199
+ }
200
+ if (token.unclosed && whitespacePos + 1 !== next) {
201
+ token.after = ''
202
+ token.nodes.push({
203
+ type: 'space',
204
+ sourceIndex: whitespacePos + 1,
205
+ sourceEndIndex: next,
206
+ value: value.slice(whitespacePos + 1, next),
207
+ })
208
+ } else {
209
+ token.after = value.slice(whitespacePos + 1, next)
210
+ token.sourceEndIndex = next
211
+ }
212
+ } else {
213
+ token.after = ''
214
+ token.nodes = []
215
+ }
216
+ pos = next + 1
217
+ token.sourceEndIndex = token.unclosed ? next : pos
218
+ code = value.charCodeAt(pos)
219
+ tokens.push(token)
220
+ } else {
221
+ balanced += 1
222
+ token.after = ''
223
+ token.sourceEndIndex = pos + 1
224
+ tokens.push(token)
225
+ stack.push(token)
226
+ tokens = token.nodes = []
227
+ parent = token
228
+ }
229
+ name = ''
230
+
231
+ // Close parentheses
232
+ } else if (closeParentheses === code && balanced) {
233
+ pos += 1
234
+ code = value.charCodeAt(pos)
235
+
236
+ parent.after = after
237
+ parent.sourceEndIndex += after.length
238
+ after = ''
239
+ balanced -= 1
240
+ stack[stack.length - 1].sourceEndIndex = pos
241
+ stack.pop()
242
+ parent = stack[balanced]
243
+ tokens = parent.nodes
244
+
245
+ // Words
246
+ } else {
247
+ next = pos
248
+ do {
249
+ if (code === backslash) {
250
+ next += 1
251
+ }
252
+ next += 1
253
+ code = value.charCodeAt(next)
254
+ } while (
255
+ next < max &&
256
+ !(
257
+ code <= 32 ||
258
+ code === singleQuote ||
259
+ code === doubleQuote ||
260
+ code === comma ||
261
+ code === colon ||
262
+ code === slash ||
263
+ code === openParentheses ||
264
+ (code === star && parent && parent.type === 'function' && true) ||
265
+ (code === slash && parent.type === 'function' && true) ||
266
+ (code === closeParentheses && balanced)
267
+ )
268
+ )
269
+ token = value.slice(pos, next)
270
+
271
+ if (openParentheses === code) {
272
+ name = token
273
+ } else if (
274
+ (uLower === token.charCodeAt(0) || uUpper === token.charCodeAt(0)) &&
275
+ plus === token.charCodeAt(1) &&
276
+ isUnicodeRange.test(token.slice(2))
277
+ ) {
278
+ tokens.push({
279
+ type: 'unicode-range',
280
+ sourceIndex: pos,
281
+ sourceEndIndex: next,
282
+ value: token,
283
+ })
284
+ } else {
285
+ tokens.push({
286
+ type: 'word',
287
+ sourceIndex: pos,
288
+ sourceEndIndex: next,
289
+ value: token,
290
+ })
291
+ }
292
+
293
+ pos = next
294
+ }
295
+ }
296
+
297
+ for (pos = stack.length - 1; pos; pos -= 1) {
298
+ stack[pos].unclosed = true
299
+ stack[pos].sourceEndIndex = value.length
300
+ }
301
+
302
+ return stack[0].nodes
303
+ }
@@ -0,0 +1,41 @@
1
+ function stringifyNode(node, custom) {
2
+ var type = node.type
3
+ var value = node.value
4
+ var buf
5
+ var customResult
6
+
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
+
28
+ function stringify(nodes, custom) {
29
+ var result, i
30
+
31
+ if (Array.isArray(nodes)) {
32
+ result = ''
33
+ for (i = nodes.length - 1; ~i; i -= 1) {
34
+ result = stringifyNode(nodes[i], custom) + result
35
+ }
36
+ return result
37
+ }
38
+ return stringifyNode(nodes, custom)
39
+ }
40
+
41
+ module.exports = stringify
@@ -0,0 +1,118 @@
1
+ var minus = '-'.charCodeAt(0)
2
+ var plus = '+'.charCodeAt(0)
3
+ var dot = '.'.charCodeAt(0)
4
+ var exp = 'e'.charCodeAt(0)
5
+ var EXP = 'E'.charCodeAt(0)
6
+
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
+
13
+ if (code === plus || code === minus) {
14
+ nextCode = value.charCodeAt(1)
15
+
16
+ if (nextCode >= 48 && nextCode <= 57) {
17
+ return true
18
+ }
19
+
20
+ var nextNextCode = value.charCodeAt(2)
21
+
22
+ if (nextCode === dot && nextNextCode >= 48 && nextNextCode <= 57) {
23
+ return true
24
+ }
25
+
26
+ return false
27
+ }
28
+
29
+ if (code === dot) {
30
+ nextCode = value.charCodeAt(1)
31
+
32
+ if (nextCode >= 48 && nextCode <= 57) {
33
+ return true
34
+ }
35
+
36
+ return false
37
+ }
38
+
39
+ if (code >= 48 && code <= 57) {
40
+ return true
41
+ }
42
+
43
+ return false
44
+ }
45
+
46
+ // Consume a number
47
+ // https://www.w3.org/TR/css-syntax-3/#consume-number
48
+ module.exports = function (value) {
49
+ var pos = 0
50
+ var length = value.length
51
+ var code
52
+ var nextCode
53
+ var nextNextCode
54
+
55
+ if (length === 0 || !likeNumber(value)) {
56
+ return false
57
+ }
58
+
59
+ code = value.charCodeAt(pos)
60
+
61
+ if (code === plus || code === minus) {
62
+ pos++
63
+ }
64
+
65
+ while (pos < length) {
66
+ code = value.charCodeAt(pos)
67
+
68
+ if (code < 48 || code > 57) {
69
+ break
70
+ }
71
+
72
+ pos += 1
73
+ }
74
+
75
+ code = value.charCodeAt(pos)
76
+ nextCode = value.charCodeAt(pos + 1)
77
+
78
+ if (code === dot && nextCode >= 48 && nextCode <= 57) {
79
+ pos += 2
80
+
81
+ while (pos < length) {
82
+ code = value.charCodeAt(pos)
83
+
84
+ if (code < 48 || code > 57) {
85
+ break
86
+ }
87
+
88
+ pos += 1
89
+ }
90
+ }
91
+
92
+ code = value.charCodeAt(pos)
93
+ nextCode = value.charCodeAt(pos + 1)
94
+ nextNextCode = value.charCodeAt(pos + 2)
95
+
96
+ if (
97
+ (code === exp || code === EXP) &&
98
+ ((nextCode >= 48 && nextCode <= 57) ||
99
+ ((nextCode === plus || nextCode === minus) && nextNextCode >= 48 && nextNextCode <= 57))
100
+ ) {
101
+ pos += nextCode === plus || nextCode === minus ? 3 : 2
102
+
103
+ while (pos < length) {
104
+ code = value.charCodeAt(pos)
105
+
106
+ if (code < 48 || code > 57) {
107
+ break
108
+ }
109
+
110
+ pos += 1
111
+ }
112
+ }
113
+
114
+ return {
115
+ number: value.slice(0, pos),
116
+ unit: value.slice(pos),
117
+ }
118
+ }
@@ -0,0 +1,18 @@
1
+ module.exports = function walk(nodes, cb, bubble) {
2
+ var i, max, node, result
3
+
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
+
10
+ if (result !== false && node.type === 'function' && Array.isArray(node.nodes)) {
11
+ walk(node.nodes, cb, bubble)
12
+ }
13
+
14
+ if (bubble) {
15
+ cb(node, i, nodes)
16
+ }
17
+ }
18
+ }
@@ -15,6 +15,7 @@ module.exports = {
15
15
  bounce: 'bounce 1s infinite',
16
16
  },
17
17
  aria: {
18
+ busy: 'busy="true"',
18
19
  checked: 'checked="true"',
19
20
  disabled: 'disabled="true"',
20
21
  expanded: 'expanded="true"',
package/types/config.d.ts CHANGED
@@ -46,13 +46,13 @@ type PrefixConfig = string
46
46
  type SeparatorConfig = string
47
47
 
48
48
  // Safelist related config
49
- type SafelistConfig = (string | { pattern: RegExp; variants?: string[] })[]
49
+ type SafelistConfig = string | { pattern: RegExp; variants?: string[] }
50
50
 
51
51
  // Blocklist related config
52
- type BlocklistConfig = string[]
52
+ type BlocklistConfig = string
53
53
 
54
54
  // Presets related config
55
- type PresetsConfig = Config[]
55
+ type PresetsConfig = Partial<Config>
56
56
 
57
57
  // Future related config
58
58
  type FutureConfigValues =
@@ -352,9 +352,9 @@ interface OptionalConfig {
352
352
  important: Partial<ImportantConfig>
353
353
  prefix: Partial<PrefixConfig>
354
354
  separator: Partial<SeparatorConfig>
355
- safelist: Partial<SafelistConfig>
356
- blocklist: Partial<BlocklistConfig>
357
- presets: Partial<PresetsConfig>
355
+ safelist: Array<SafelistConfig>
356
+ blocklist: Array<BlocklistConfig>
357
+ presets: Array<PresetsConfig>
358
358
  future: Partial<FutureConfig>
359
359
  experimental: Partial<ExperimentalConfig>
360
360
  darkMode: Partial<DarkModeConfig>
@@ -3,6 +3,7 @@ type CSSDeclarationList = Record<string, string>
3
3
  export type DefaultTheme = Config['theme'] & {
4
4
  animation: Record<'none' | 'spin' | 'ping' | 'pulse' | 'bounce', string>
5
5
  aria: Record<
6
+ | 'busy'
6
7
  | 'checked'
7
8
  | 'disabled'
8
9
  | 'expanded'
package/types/index.d.ts CHANGED
@@ -1,7 +1,11 @@
1
- import { PluginCreator } from 'postcss'
1
+ import type { PluginCreator } from 'postcss'
2
2
  import type { Config } from './config.d'
3
3
 
4
4
  declare const plugin: PluginCreator<string | Config | { config: string | Config }>
5
5
 
6
- export { Config }
7
- export default plugin
6
+ declare type _Config = Config
7
+ declare namespace plugin {
8
+ export type { _Config as Config }
9
+ }
10
+
11
+ export = plugin