tailwindcss 3.4.1 → 4.0.0-alpha.2

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 (280) hide show
  1. package/README.md +5 -6
  2. package/dist/lib.d.mts +324 -0
  3. package/dist/lib.d.ts +324 -0
  4. package/dist/lib.js +11 -0
  5. package/dist/lib.mjs +11 -0
  6. package/index.css +5 -0
  7. package/package.json +29 -107
  8. package/preflight.css +355 -0
  9. package/theme.css +465 -0
  10. package/CHANGELOG.md +0 -2571
  11. package/base.css +0 -1
  12. package/colors.d.ts +0 -3
  13. package/colors.js +0 -2
  14. package/components.css +0 -1
  15. package/defaultConfig.d.ts +0 -3
  16. package/defaultConfig.js +0 -2
  17. package/defaultTheme.d.ts +0 -4
  18. package/defaultTheme.js +0 -2
  19. package/lib/cli/build/deps.js +0 -62
  20. package/lib/cli/build/index.js +0 -54
  21. package/lib/cli/build/plugin.js +0 -378
  22. package/lib/cli/build/utils.js +0 -88
  23. package/lib/cli/build/watching.js +0 -182
  24. package/lib/cli/help/index.js +0 -73
  25. package/lib/cli/index.js +0 -230
  26. package/lib/cli/init/index.js +0 -63
  27. package/lib/cli-peer-dependencies.js +0 -36
  28. package/lib/cli.js +0 -7
  29. package/lib/corePluginList.js +0 -190
  30. package/lib/corePlugins.js +0 -4282
  31. package/lib/css/LICENSE +0 -25
  32. package/lib/css/preflight.css +0 -385
  33. package/lib/featureFlags.js +0 -83
  34. package/lib/index.js +0 -2
  35. package/lib/lib/cacheInvalidation.js +0 -92
  36. package/lib/lib/collapseAdjacentRules.js +0 -61
  37. package/lib/lib/collapseDuplicateDeclarations.js +0 -85
  38. package/lib/lib/content.js +0 -181
  39. package/lib/lib/defaultExtractor.js +0 -251
  40. package/lib/lib/detectNesting.js +0 -45
  41. package/lib/lib/evaluateTailwindFunctions.js +0 -238
  42. package/lib/lib/expandApplyAtRules.js +0 -540
  43. package/lib/lib/expandTailwindAtRules.js +0 -291
  44. package/lib/lib/findAtConfigPath.js +0 -46
  45. package/lib/lib/generateRules.js +0 -904
  46. package/lib/lib/getModuleDependencies.js +0 -99
  47. package/lib/lib/load-config.js +0 -53
  48. package/lib/lib/normalizeTailwindDirectives.js +0 -89
  49. package/lib/lib/offsets.js +0 -306
  50. package/lib/lib/partitionApplyAtRules.js +0 -58
  51. package/lib/lib/regex.js +0 -74
  52. package/lib/lib/remap-bitfield.js +0 -89
  53. package/lib/lib/resolveDefaultsAtRules.js +0 -165
  54. package/lib/lib/setupContextUtils.js +0 -1294
  55. package/lib/lib/setupTrackingContext.js +0 -166
  56. package/lib/lib/sharedState.js +0 -87
  57. package/lib/lib/substituteScreenAtRules.js +0 -31
  58. package/lib/oxide/cli/build/deps.js +0 -89
  59. package/lib/oxide/cli/build/index.js +0 -53
  60. package/lib/oxide/cli/build/plugin.js +0 -375
  61. package/lib/oxide/cli/build/utils.js +0 -87
  62. package/lib/oxide/cli/build/watching.js +0 -179
  63. package/lib/oxide/cli/help/index.js +0 -72
  64. package/lib/oxide/cli/index.js +0 -214
  65. package/lib/oxide/cli/init/index.js +0 -52
  66. package/lib/oxide/cli.js +0 -5
  67. package/lib/oxide/postcss-plugin.js +0 -2
  68. package/lib/plugin.js +0 -98
  69. package/lib/postcss-plugins/nesting/README.md +0 -42
  70. package/lib/postcss-plugins/nesting/index.js +0 -21
  71. package/lib/postcss-plugins/nesting/plugin.js +0 -89
  72. package/lib/processTailwindFeatures.js +0 -64
  73. package/lib/public/colors.js +0 -355
  74. package/lib/public/create-plugin.js +0 -17
  75. package/lib/public/default-config.js +0 -18
  76. package/lib/public/default-theme.js +0 -18
  77. package/lib/public/load-config.js +0 -12
  78. package/lib/public/resolve-config.js +0 -24
  79. package/lib/util/applyImportantSelector.js +0 -36
  80. package/lib/util/bigSign.js +0 -13
  81. package/lib/util/buildMediaQuery.js +0 -27
  82. package/lib/util/cloneDeep.js +0 -22
  83. package/lib/util/cloneNodes.js +0 -54
  84. package/lib/util/color.js +0 -116
  85. package/lib/util/colorNames.js +0 -752
  86. package/lib/util/configurePlugins.js +0 -23
  87. package/lib/util/createPlugin.js +0 -32
  88. package/lib/util/createUtilityPlugin.js +0 -53
  89. package/lib/util/dataTypes.js +0 -415
  90. package/lib/util/defaults.js +0 -27
  91. package/lib/util/escapeClassName.js +0 -24
  92. package/lib/util/escapeCommas.js +0 -13
  93. package/lib/util/flattenColorPalette.js +0 -18
  94. package/lib/util/formatVariantSelector.js +0 -270
  95. package/lib/util/getAllConfigs.js +0 -50
  96. package/lib/util/hashConfig.js +0 -21
  97. package/lib/util/isKeyframeRule.js +0 -13
  98. package/lib/util/isPlainObject.js +0 -17
  99. package/lib/util/isSyntacticallyValidPropertyValue.js +0 -74
  100. package/lib/util/log.js +0 -61
  101. package/lib/util/nameClass.js +0 -49
  102. package/lib/util/negateValue.js +0 -36
  103. package/lib/util/normalizeConfig.js +0 -282
  104. package/lib/util/normalizeScreens.js +0 -178
  105. package/lib/util/parseAnimationValue.js +0 -93
  106. package/lib/util/parseBoxShadowValue.js +0 -88
  107. package/lib/util/parseDependency.js +0 -47
  108. package/lib/util/parseGlob.js +0 -36
  109. package/lib/util/parseObjectStyles.js +0 -36
  110. package/lib/util/pluginUtils.js +0 -289
  111. package/lib/util/prefixSelector.js +0 -39
  112. package/lib/util/pseudoElements.js +0 -212
  113. package/lib/util/removeAlphaVariables.js +0 -31
  114. package/lib/util/resolveConfig.js +0 -256
  115. package/lib/util/resolveConfigPath.js +0 -70
  116. package/lib/util/responsive.js +0 -24
  117. package/lib/util/splitAtTopLevelOnly.js +0 -51
  118. package/lib/util/tap.js +0 -14
  119. package/lib/util/toColorValue.js +0 -13
  120. package/lib/util/toPath.js +0 -32
  121. package/lib/util/transformThemeValue.js +0 -73
  122. package/lib/util/validateConfig.js +0 -37
  123. package/lib/util/validateFormalSyntax.js +0 -26
  124. package/lib/util/withAlphaVariable.js +0 -79
  125. package/lib/value-parser/LICENSE +0 -22
  126. package/lib/value-parser/README.md +0 -3
  127. package/lib/value-parser/index.d.js +0 -2
  128. package/lib/value-parser/index.js +0 -22
  129. package/lib/value-parser/parse.js +0 -259
  130. package/lib/value-parser/stringify.js +0 -38
  131. package/lib/value-parser/unit.js +0 -86
  132. package/lib/value-parser/walk.js +0 -16
  133. package/loadConfig.d.ts +0 -4
  134. package/loadConfig.js +0 -2
  135. package/nesting/index.d.ts +0 -4
  136. package/nesting/index.js +0 -2
  137. package/peers/index.js +0 -96624
  138. package/plugin.d.ts +0 -11
  139. package/plugin.js +0 -2
  140. package/prettier.config.js +0 -19
  141. package/resolveConfig.d.ts +0 -31
  142. package/resolveConfig.js +0 -2
  143. package/screens.css +0 -1
  144. package/scripts/create-plugin-list.js +0 -10
  145. package/scripts/generate-types.js +0 -104
  146. package/scripts/release-channel.js +0 -18
  147. package/scripts/release-notes.js +0 -21
  148. package/scripts/swap-engines.js +0 -40
  149. package/scripts/type-utils.js +0 -27
  150. package/src/cli/build/deps.js +0 -56
  151. package/src/cli/build/index.js +0 -49
  152. package/src/cli/build/plugin.js +0 -444
  153. package/src/cli/build/utils.js +0 -76
  154. package/src/cli/build/watching.js +0 -229
  155. package/src/cli/help/index.js +0 -70
  156. package/src/cli/index.js +0 -216
  157. package/src/cli/init/index.js +0 -79
  158. package/src/cli-peer-dependencies.js +0 -15
  159. package/src/cli.js +0 -7
  160. package/src/corePluginList.js +0 -1
  161. package/src/corePlugins.js +0 -2943
  162. package/src/css/LICENSE +0 -25
  163. package/src/css/preflight.css +0 -385
  164. package/src/featureFlags.js +0 -66
  165. package/src/index.js +0 -1
  166. package/src/lib/cacheInvalidation.js +0 -52
  167. package/src/lib/collapseAdjacentRules.js +0 -58
  168. package/src/lib/collapseDuplicateDeclarations.js +0 -93
  169. package/src/lib/content.js +0 -208
  170. package/src/lib/defaultExtractor.js +0 -230
  171. package/src/lib/detectNesting.js +0 -47
  172. package/src/lib/evaluateTailwindFunctions.js +0 -272
  173. package/src/lib/expandApplyAtRules.js +0 -620
  174. package/src/lib/expandTailwindAtRules.js +0 -300
  175. package/src/lib/findAtConfigPath.js +0 -48
  176. package/src/lib/generateRules.js +0 -951
  177. package/src/lib/getModuleDependencies.js +0 -79
  178. package/src/lib/load-config.ts +0 -39
  179. package/src/lib/normalizeTailwindDirectives.js +0 -84
  180. package/src/lib/offsets.js +0 -373
  181. package/src/lib/partitionApplyAtRules.js +0 -52
  182. package/src/lib/regex.js +0 -74
  183. package/src/lib/remap-bitfield.js +0 -82
  184. package/src/lib/resolveDefaultsAtRules.js +0 -163
  185. package/src/lib/setupContextUtils.js +0 -1366
  186. package/src/lib/setupTrackingContext.js +0 -169
  187. package/src/lib/sharedState.js +0 -61
  188. package/src/lib/substituteScreenAtRules.js +0 -19
  189. package/src/oxide/cli/build/deps.ts +0 -91
  190. package/src/oxide/cli/build/index.ts +0 -47
  191. package/src/oxide/cli/build/plugin.ts +0 -442
  192. package/src/oxide/cli/build/utils.ts +0 -74
  193. package/src/oxide/cli/build/watching.ts +0 -225
  194. package/src/oxide/cli/help/index.ts +0 -69
  195. package/src/oxide/cli/index.ts +0 -204
  196. package/src/oxide/cli/init/index.ts +0 -59
  197. package/src/oxide/cli.ts +0 -1
  198. package/src/oxide/postcss-plugin.ts +0 -1
  199. package/src/plugin.js +0 -107
  200. package/src/postcss-plugins/nesting/README.md +0 -42
  201. package/src/postcss-plugins/nesting/index.js +0 -13
  202. package/src/postcss-plugins/nesting/plugin.js +0 -80
  203. package/src/processTailwindFeatures.js +0 -59
  204. package/src/public/colors.js +0 -322
  205. package/src/public/create-plugin.js +0 -2
  206. package/src/public/default-config.js +0 -4
  207. package/src/public/default-theme.js +0 -4
  208. package/src/public/load-config.js +0 -2
  209. package/src/public/resolve-config.js +0 -7
  210. package/src/util/applyImportantSelector.js +0 -27
  211. package/src/util/bigSign.js +0 -3
  212. package/src/util/buildMediaQuery.js +0 -22
  213. package/src/util/cloneDeep.js +0 -11
  214. package/src/util/cloneNodes.js +0 -49
  215. package/src/util/color.js +0 -88
  216. package/src/util/colorNames.js +0 -150
  217. package/src/util/configurePlugins.js +0 -23
  218. package/src/util/createPlugin.js +0 -27
  219. package/src/util/createUtilityPlugin.js +0 -37
  220. package/src/util/dataTypes.js +0 -406
  221. package/src/util/defaults.js +0 -17
  222. package/src/util/escapeClassName.js +0 -8
  223. package/src/util/escapeCommas.js +0 -3
  224. package/src/util/flattenColorPalette.js +0 -13
  225. package/src/util/formatVariantSelector.js +0 -324
  226. package/src/util/getAllConfigs.js +0 -38
  227. package/src/util/hashConfig.js +0 -5
  228. package/src/util/isKeyframeRule.js +0 -3
  229. package/src/util/isPlainObject.js +0 -8
  230. package/src/util/isSyntacticallyValidPropertyValue.js +0 -61
  231. package/src/util/log.js +0 -29
  232. package/src/util/nameClass.js +0 -30
  233. package/src/util/negateValue.js +0 -24
  234. package/src/util/normalizeConfig.js +0 -301
  235. package/src/util/normalizeScreens.js +0 -140
  236. package/src/util/parseAnimationValue.js +0 -68
  237. package/src/util/parseBoxShadowValue.js +0 -72
  238. package/src/util/parseDependency.js +0 -44
  239. package/src/util/parseGlob.js +0 -24
  240. package/src/util/parseObjectStyles.js +0 -19
  241. package/src/util/pluginUtils.js +0 -307
  242. package/src/util/prefixSelector.js +0 -33
  243. package/src/util/pseudoElements.js +0 -171
  244. package/src/util/removeAlphaVariables.js +0 -24
  245. package/src/util/resolveConfig.js +0 -277
  246. package/src/util/resolveConfigPath.js +0 -66
  247. package/src/util/responsive.js +0 -10
  248. package/src/util/splitAtTopLevelOnly.js +0 -52
  249. package/src/util/tap.js +0 -4
  250. package/src/util/toColorValue.js +0 -3
  251. package/src/util/toPath.js +0 -26
  252. package/src/util/transformThemeValue.js +0 -62
  253. package/src/util/validateConfig.js +0 -26
  254. package/src/util/validateFormalSyntax.js +0 -34
  255. package/src/util/withAlphaVariable.js +0 -49
  256. package/src/value-parser/LICENSE +0 -22
  257. package/src/value-parser/README.md +0 -3
  258. package/src/value-parser/index.d.ts +0 -177
  259. package/src/value-parser/index.js +0 -28
  260. package/src/value-parser/parse.js +0 -303
  261. package/src/value-parser/stringify.js +0 -41
  262. package/src/value-parser/unit.js +0 -118
  263. package/src/value-parser/walk.js +0 -18
  264. package/stubs/.gitignore +0 -1
  265. package/stubs/.prettierrc.json +0 -6
  266. package/stubs/config.full.js +0 -1062
  267. package/stubs/config.simple.js +0 -7
  268. package/stubs/postcss.config.cjs +0 -6
  269. package/stubs/postcss.config.js +0 -6
  270. package/stubs/tailwind.config.cjs +0 -2
  271. package/stubs/tailwind.config.js +0 -2
  272. package/stubs/tailwind.config.ts +0 -3
  273. package/tailwind.css +0 -5
  274. package/types/config.d.ts +0 -376
  275. package/types/generated/.gitkeep +0 -0
  276. package/types/generated/colors.d.ts +0 -298
  277. package/types/generated/corePluginList.d.ts +0 -1
  278. package/types/generated/default-theme.d.ts +0 -397
  279. package/types/index.d.ts +0 -11
  280. package/variants.css +0 -1
@@ -1,208 +0,0 @@
1
- // @ts-check
2
-
3
- import fs from 'fs'
4
- import path from 'path'
5
- import isGlob from 'is-glob'
6
- import fastGlob from 'fast-glob'
7
- import normalizePath from 'normalize-path'
8
- import { parseGlob } from '../util/parseGlob'
9
- import { env } from './sharedState'
10
-
11
- /** @typedef {import('../../types/config.js').RawFile} RawFile */
12
- /** @typedef {import('../../types/config.js').FilePath} FilePath */
13
-
14
- /**
15
- * @typedef {object} ContentPath
16
- * @property {string} original
17
- * @property {string} base
18
- * @property {string | null} glob
19
- * @property {boolean} ignore
20
- * @property {string} pattern
21
- */
22
-
23
- /**
24
- * Turn a list of content paths (absolute or not; glob or not) into a list of
25
- * absolute file paths that exist on the filesystem
26
- *
27
- * If there are symlinks in the path then multiple paths will be returned
28
- * one for the symlink and one for the actual file
29
- *
30
- * @param {*} context
31
- * @param {import('tailwindcss').Config} tailwindConfig
32
- * @returns {ContentPath[]}
33
- */
34
- export function parseCandidateFiles(context, tailwindConfig) {
35
- let files = tailwindConfig.content.files
36
-
37
- // Normalize the file globs
38
- files = files.filter((filePath) => typeof filePath === 'string')
39
- files = files.map(normalizePath)
40
-
41
- // Split into included and excluded globs
42
- let tasks = fastGlob.generateTasks(files)
43
-
44
- /** @type {ContentPath[]} */
45
- let included = []
46
-
47
- /** @type {ContentPath[]} */
48
- let excluded = []
49
-
50
- for (const task of tasks) {
51
- included.push(...task.positive.map((filePath) => parseFilePath(filePath, false)))
52
- excluded.push(...task.negative.map((filePath) => parseFilePath(filePath, true)))
53
- }
54
-
55
- let paths = [...included, ...excluded]
56
-
57
- // Resolve paths relative to the config file or cwd
58
- paths = resolveRelativePaths(context, paths)
59
-
60
- // Resolve symlinks if possible
61
- paths = paths.flatMap(resolvePathSymlinks)
62
-
63
- // Update cached patterns
64
- paths = paths.map(resolveGlobPattern)
65
-
66
- return paths
67
- }
68
-
69
- /**
70
- *
71
- * @param {string} filePath
72
- * @param {boolean} ignore
73
- * @returns {ContentPath}
74
- */
75
- function parseFilePath(filePath, ignore) {
76
- let contentPath = {
77
- original: filePath,
78
- base: filePath,
79
- ignore,
80
- pattern: filePath,
81
- glob: null,
82
- }
83
-
84
- if (isGlob(filePath)) {
85
- Object.assign(contentPath, parseGlob(filePath))
86
- }
87
-
88
- return contentPath
89
- }
90
-
91
- /**
92
- *
93
- * @param {ContentPath} contentPath
94
- * @returns {ContentPath}
95
- */
96
- function resolveGlobPattern(contentPath) {
97
- // This is required for Windows support to properly pick up Glob paths.
98
- // Afaik, this technically shouldn't be needed but there's probably
99
- // some internal, direct path matching with a normalized path in
100
- // a package which can't handle mixed directory separators
101
- let base = normalizePath(contentPath.base)
102
-
103
- // If the user's file path contains any special characters (like parens) for instance fast-glob
104
- // is like "OOOH SHINY" and treats them as such. So we have to escape the base path to fix this
105
- base = fastGlob.escapePath(base)
106
-
107
- contentPath.pattern = contentPath.glob ? `${base}/${contentPath.glob}` : base
108
- contentPath.pattern = contentPath.ignore ? `!${contentPath.pattern}` : contentPath.pattern
109
-
110
- return contentPath
111
- }
112
-
113
- /**
114
- * Resolve each path relative to the config file (when possible) if the experimental flag is enabled
115
- * Otherwise, resolve relative to the current working directory
116
- *
117
- * @param {any} context
118
- * @param {ContentPath[]} contentPaths
119
- * @returns {ContentPath[]}
120
- */
121
- function resolveRelativePaths(context, contentPaths) {
122
- let resolveFrom = []
123
-
124
- // Resolve base paths relative to the config file (when possible) if the experimental flag is enabled
125
- if (context.userConfigPath && context.tailwindConfig.content.relative) {
126
- resolveFrom = [path.dirname(context.userConfigPath)]
127
- }
128
-
129
- return contentPaths.map((contentPath) => {
130
- contentPath.base = path.resolve(...resolveFrom, contentPath.base)
131
-
132
- return contentPath
133
- })
134
- }
135
-
136
- /**
137
- * Resolve the symlink for the base directory / file in each path
138
- * These are added as additional dependencies to watch for changes because
139
- * some tools (like webpack) will only watch the actual file or directory
140
- * but not the symlink itself even in projects that use monorepos.
141
- *
142
- * @param {ContentPath} contentPath
143
- * @returns {ContentPath[]}
144
- */
145
- function resolvePathSymlinks(contentPath) {
146
- let paths = [contentPath]
147
-
148
- try {
149
- let resolvedPath = fs.realpathSync(contentPath.base)
150
- if (resolvedPath !== contentPath.base) {
151
- paths.push({
152
- ...contentPath,
153
- base: resolvedPath,
154
- })
155
- }
156
- } catch {
157
- // TODO: log this?
158
- }
159
-
160
- return paths
161
- }
162
-
163
- /**
164
- * @param {any} context
165
- * @param {ContentPath[]} candidateFiles
166
- * @param {Map<string, number>} fileModifiedMap
167
- * @returns {[{ content: string, extension: string }[], Map<string, number>]}
168
- */
169
- export function resolvedChangedContent(context, candidateFiles, fileModifiedMap) {
170
- let changedContent = context.tailwindConfig.content.files
171
- .filter((item) => typeof item.raw === 'string')
172
- .map(({ raw, extension = 'html' }) => ({ content: raw, extension }))
173
-
174
- let [changedFiles, mTimesToCommit] = resolveChangedFiles(candidateFiles, fileModifiedMap)
175
-
176
- for (let changedFile of changedFiles) {
177
- let extension = path.extname(changedFile).slice(1)
178
- changedContent.push({ file: changedFile, extension })
179
- }
180
-
181
- return [changedContent, mTimesToCommit]
182
- }
183
-
184
- /**
185
- *
186
- * @param {ContentPath[]} candidateFiles
187
- * @param {Map<string, number>} fileModifiedMap
188
- * @returns {[Set<string>, Map<string, number>]}
189
- */
190
- function resolveChangedFiles(candidateFiles, fileModifiedMap) {
191
- let paths = candidateFiles.map((contentPath) => contentPath.pattern)
192
- let mTimesToCommit = new Map()
193
-
194
- let changedFiles = new Set()
195
- env.DEBUG && console.time('Finding changed files')
196
- let files = fastGlob.sync(paths, { absolute: true })
197
- for (let file of files) {
198
- let prevModified = fileModifiedMap.get(file) || -Infinity
199
- let modified = fs.statSync(file).mtimeMs
200
-
201
- if (modified > prevModified) {
202
- changedFiles.add(file)
203
- mTimesToCommit.set(file, modified)
204
- }
205
- }
206
- env.DEBUG && console.timeEnd('Finding changed files')
207
- return [changedFiles, mTimesToCommit]
208
- }
@@ -1,230 +0,0 @@
1
- import * as regex from './regex'
2
-
3
- export function defaultExtractor(context) {
4
- let patterns = Array.from(buildRegExps(context))
5
-
6
- /**
7
- * @param {string} content
8
- */
9
- return (content) => {
10
- /** @type {(string|string)[]} */
11
- let results = []
12
-
13
- for (let pattern of patterns) {
14
- for (let result of content.match(pattern) ?? []) {
15
- results.push(clipAtBalancedParens(result))
16
- }
17
- }
18
-
19
- return results
20
- }
21
- }
22
-
23
- function* buildRegExps(context) {
24
- let separator = context.tailwindConfig.separator
25
- let prefix =
26
- context.tailwindConfig.prefix !== ''
27
- ? regex.optional(regex.pattern([/-?/, regex.escape(context.tailwindConfig.prefix)]))
28
- : ''
29
-
30
- let utility = regex.any([
31
- // Arbitrary properties (without square brackets)
32
- /\[[^\s:'"`]+:[^\s\[\]]+\]/,
33
-
34
- // Arbitrary properties with balanced square brackets
35
- // This is a targeted fix to continue to allow theme()
36
- // with square brackets to work in arbitrary properties
37
- // while fixing a problem with the regex matching too much
38
- /\[[^\s:'"`\]]+:[^\s]+?\[[^\s]+\][^\s]+?\]/,
39
-
40
- // Utilities
41
- regex.pattern([
42
- // Utility Name / Group Name
43
- regex.any([
44
- /-?(?:\w+)/,
45
-
46
- // This is here to make sure @container supports everything that other utilities do
47
- /@(?:\w+)/,
48
- ]),
49
-
50
- // Normal/Arbitrary values
51
- regex.optional(
52
- regex.any([
53
- regex.pattern([
54
- // Arbitrary values
55
- regex.any([
56
- /-(?:\w+-)*\['[^\s]+'\]/,
57
- /-(?:\w+-)*\["[^\s]+"\]/,
58
- /-(?:\w+-)*\[`[^\s]+`\]/,
59
- /-(?:\w+-)*\[(?:[^\s\[\]]+\[[^\s\[\]]+\])*[^\s:\[\]]+\]/,
60
- ]),
61
-
62
- // Not immediately followed by an `{[(`
63
- /(?![{([]])/,
64
-
65
- // optionally followed by an opacity modifier
66
- /(?:\/[^\s'"`\\><$]*)?/,
67
- ]),
68
-
69
- regex.pattern([
70
- // Arbitrary values
71
- regex.any([
72
- /-(?:\w+-)*\['[^\s]+'\]/,
73
- /-(?:\w+-)*\["[^\s]+"\]/,
74
- /-(?:\w+-)*\[`[^\s]+`\]/,
75
- /-(?:\w+-)*\[(?:[^\s\[\]]+\[[^\s\[\]]+\])*[^\s\[\]]+\]/,
76
- ]),
77
-
78
- // Not immediately followed by an `{[(`
79
- /(?![{([]])/,
80
-
81
- // optionally followed by an opacity modifier
82
- /(?:\/[^\s'"`\\$]*)?/,
83
- ]),
84
-
85
- // Normal values w/o quotes — may include an opacity modifier
86
- /[-\/][^\s'"`\\$={><]*/,
87
- ])
88
- ),
89
- ]),
90
- ])
91
-
92
- let variantPatterns = [
93
- // Without quotes
94
- regex.any([
95
- // This is here to provide special support for the `@` variant
96
- regex.pattern([/@\[[^\s"'`]+\](\/[^\s"'`]+)?/, separator]),
97
-
98
- // With variant modifier (e.g.: group-[..]/modifier)
99
- regex.pattern([/([^\s"'`\[\\]+-)?\[[^\s"'`]+\]\/\w+/, separator]),
100
-
101
- regex.pattern([/([^\s"'`\[\\]+-)?\[[^\s"'`]+\]/, separator]),
102
- regex.pattern([/[^\s"'`\[\\]+/, separator]),
103
- ]),
104
-
105
- // With quotes allowed
106
- regex.any([
107
- // With variant modifier (e.g.: group-[..]/modifier)
108
- regex.pattern([/([^\s"'`\[\\]+-)?\[[^\s`]+\]\/\w+/, separator]),
109
-
110
- regex.pattern([/([^\s"'`\[\\]+-)?\[[^\s`]+\]/, separator]),
111
- regex.pattern([/[^\s`\[\\]+/, separator]),
112
- ]),
113
- ]
114
-
115
- for (const variantPattern of variantPatterns) {
116
- yield regex.pattern([
117
- // Variants
118
- '((?=((',
119
- variantPattern,
120
- ')+))\\2)?',
121
-
122
- // Important (optional)
123
- /!?/,
124
-
125
- prefix,
126
-
127
- utility,
128
- ])
129
- }
130
-
131
- // 5. Inner matches
132
- yield /[^<>"'`\s.(){}[\]#=%$]*[^<>"'`\s.(){}[\]#=%:$]/g
133
- }
134
-
135
- // We want to capture any "special" characters
136
- // AND the characters immediately following them (if there is one)
137
- let SPECIALS = /([\[\]'"`])([^\[\]'"`])?/g
138
- let ALLOWED_CLASS_CHARACTERS = /[^"'`\s<>\]]+/
139
-
140
- /**
141
- * Clips a string ensuring that parentheses, quotes, etc… are balanced
142
- * Used for arbitrary values only
143
- *
144
- * We will go past the end of the balanced parens until we find a non-class character
145
- *
146
- * Depth matching behavior:
147
- * w-[calc(100%-theme('spacing[some_key][1.5]'))]']
148
- * ┬ ┬ ┬┬ ┬ ┬┬ ┬┬┬┬┬┬┬
149
- * 1 2 3 4 34 3 210 END
150
- * ╰────┴──────────┴────────┴────────┴┴───┴─┴┴┴
151
- *
152
- * @param {string} input
153
- */
154
- function clipAtBalancedParens(input) {
155
- // We are care about this for arbitrary values
156
- if (!input.includes('-[')) {
157
- return input
158
- }
159
-
160
- let depth = 0
161
- let openStringTypes = []
162
-
163
- // Find all parens, brackets, quotes, etc
164
- // Stop when we end at a balanced pair
165
- // This is naive and will treat mismatched parens as balanced
166
- // This shouldn't be a problem in practice though
167
- let matches = input.matchAll(SPECIALS)
168
-
169
- // We can't use lookbehind assertions because we have to support Safari
170
- // So, instead, we've emulated it using capture groups and we'll re-work the matches to accommodate
171
- matches = Array.from(matches).flatMap((match) => {
172
- const [, ...groups] = match
173
-
174
- return groups.map((group, idx) =>
175
- Object.assign([], match, {
176
- index: match.index + idx,
177
- 0: group,
178
- })
179
- )
180
- })
181
-
182
- for (let match of matches) {
183
- let char = match[0]
184
- let inStringType = openStringTypes[openStringTypes.length - 1]
185
-
186
- if (char === inStringType) {
187
- openStringTypes.pop()
188
- } else if (char === "'" || char === '"' || char === '`') {
189
- openStringTypes.push(char)
190
- }
191
-
192
- if (inStringType) {
193
- continue
194
- } else if (char === '[') {
195
- depth++
196
- continue
197
- } else if (char === ']') {
198
- depth--
199
- continue
200
- }
201
-
202
- // We've gone one character past the point where we should stop
203
- // This means that there was an extra closing `]`
204
- // We'll clip to just before it
205
- if (depth < 0) {
206
- return input.substring(0, match.index - 1)
207
- }
208
-
209
- // We've finished balancing the brackets but there still may be characters that can be included
210
- // For example in the class `text-[#336699]/[.35]`
211
- // The depth goes to `0` at the closing `]` but goes up again at the `[`
212
-
213
- // If we're at zero and encounter a non-class character then we clip the class there
214
- if (depth === 0 && !ALLOWED_CLASS_CHARACTERS.test(char)) {
215
- return input.substring(0, match.index)
216
- }
217
- }
218
-
219
- return input
220
- }
221
-
222
- // Regular utilities
223
- // {{modifier}:}*{namespace}{-{suffix}}*{/{opacityModifier}}?
224
-
225
- // Arbitrary values
226
- // {{modifier}:}*{namespace}-[{arbitraryValue}]{/{opacityModifier}}?
227
- // arbitraryValue: no whitespace, balanced quotes unless within quotes, balanced brackets unless within quotes
228
-
229
- // Arbitrary properties
230
- // {{modifier}:}*[{validCssPropertyName}:{arbitraryValue}]
@@ -1,47 +0,0 @@
1
- function isRoot(node) {
2
- return node.type === 'root'
3
- }
4
-
5
- function isAtLayer(node) {
6
- return node.type === 'atrule' && node.name === 'layer'
7
- }
8
-
9
- export default function (_context) {
10
- return (root, result) => {
11
- let found = false
12
-
13
- root.walkAtRules('tailwind', (node) => {
14
- if (found) return false
15
-
16
- if (node.parent && !(isRoot(node.parent) || isAtLayer(node.parent))) {
17
- found = true
18
- node.warn(
19
- result,
20
- [
21
- 'Nested @tailwind rules were detected, but are not supported.',
22
- "Consider using a prefix to scope Tailwind's classes: https://tailwindcss.com/docs/configuration#prefix",
23
- 'Alternatively, use the important selector strategy: https://tailwindcss.com/docs/configuration#selector-strategy',
24
- ].join('\n')
25
- )
26
- return false
27
- }
28
- })
29
-
30
- root.walkRules((rule) => {
31
- if (found) return false
32
-
33
- rule.walkRules((nestedRule) => {
34
- found = true
35
- nestedRule.warn(
36
- result,
37
- [
38
- 'Nested CSS was detected, but CSS nesting has not been configured correctly.',
39
- 'Please enable a CSS nesting plugin *before* Tailwind in your configuration.',
40
- 'See how here: https://tailwindcss.com/docs/using-with-preprocessors#nesting',
41
- ].join('\n')
42
- )
43
- return false
44
- })
45
- })
46
- }
47
- }