tailwindcss 0.0.0-insiders.d3e754a → 0.0.0-insiders.d3f2221

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 (217) hide show
  1. package/README.md +13 -9
  2. package/colors.d.ts +3 -0
  3. package/defaultConfig.d.ts +3 -0
  4. package/defaultTheme.d.ts +4 -0
  5. package/index.css +5 -0
  6. package/lib/cli/build/index.js +57 -0
  7. package/lib/cli/build/plugin.js +431 -0
  8. package/lib/cli/build/utils.js +88 -0
  9. package/lib/cli/build/watching.js +182 -0
  10. package/lib/cli/help/index.js +73 -0
  11. package/lib/cli/index.js +231 -0
  12. package/lib/cli/init/index.js +63 -0
  13. package/lib/cli.js +1 -739
  14. package/lib/corePluginList.js +13 -3
  15. package/lib/corePlugins.js +1094 -478
  16. package/lib/css/preflight.css +17 -4
  17. package/lib/featureFlags.js +49 -23
  18. package/lib/index.js +1 -29
  19. package/lib/lib/cacheInvalidation.js +92 -0
  20. package/lib/lib/collapseAdjacentRules.js +12 -5
  21. package/lib/lib/collapseDuplicateDeclarations.js +12 -7
  22. package/lib/lib/content.js +207 -0
  23. package/lib/lib/defaultExtractor.js +217 -33
  24. package/lib/lib/detectNesting.js +15 -4
  25. package/lib/lib/evaluateTailwindFunctions.js +104 -37
  26. package/lib/lib/expandApplyAtRules.js +312 -211
  27. package/lib/lib/expandTailwindAtRules.js +149 -96
  28. package/lib/lib/findAtConfigPath.js +46 -0
  29. package/lib/lib/generateRules.js +437 -188
  30. package/lib/lib/getModuleDependencies.js +88 -37
  31. package/lib/lib/handleImportAtRules.js +50 -0
  32. package/lib/lib/load-config.js +42 -0
  33. package/lib/lib/normalizeTailwindDirectives.js +9 -19
  34. package/lib/lib/offsets.js +306 -0
  35. package/lib/lib/partitionApplyAtRules.js +11 -6
  36. package/lib/lib/regex.js +74 -0
  37. package/lib/lib/remap-bitfield.js +89 -0
  38. package/lib/lib/resolveDefaultsAtRules.js +80 -58
  39. package/lib/lib/setupContextUtils.js +683 -270
  40. package/lib/lib/setupTrackingContext.js +63 -67
  41. package/lib/lib/sharedState.js +39 -10
  42. package/lib/lib/substituteScreenAtRules.js +13 -9
  43. package/lib/plugin.js +164 -0
  44. package/lib/postcss-plugins/nesting/README.md +2 -2
  45. package/lib/postcss-plugins/nesting/index.js +10 -6
  46. package/lib/postcss-plugins/nesting/plugin.js +15 -11
  47. package/lib/processTailwindFeatures.js +33 -28
  48. package/lib/public/colors.js +55 -29
  49. package/lib/public/create-plugin.js +9 -5
  50. package/lib/public/default-config.js +10 -6
  51. package/lib/public/default-theme.js +10 -6
  52. package/lib/public/load-config.js +12 -0
  53. package/lib/public/resolve-config.js +11 -6
  54. package/lib/util/applyImportantSelector.js +36 -0
  55. package/lib/util/bigSign.js +6 -1
  56. package/lib/util/buildMediaQuery.js +12 -5
  57. package/lib/util/cloneDeep.js +8 -5
  58. package/lib/util/cloneNodes.js +11 -2
  59. package/lib/util/color.js +59 -42
  60. package/lib/util/colorNames.js +752 -0
  61. package/lib/util/configurePlugins.js +7 -2
  62. package/lib/util/createPlugin.js +8 -5
  63. package/lib/util/createUtilityPlugin.js +15 -11
  64. package/lib/util/dataTypes.js +172 -47
  65. package/lib/util/defaults.js +12 -7
  66. package/lib/util/escapeClassName.js +13 -8
  67. package/lib/util/escapeCommas.js +6 -1
  68. package/lib/util/flattenColorPalette.js +9 -8
  69. package/lib/util/formatVariantSelector.js +230 -151
  70. package/lib/util/getAllConfigs.js +34 -12
  71. package/lib/util/hashConfig.js +9 -4
  72. package/lib/util/isKeyframeRule.js +6 -1
  73. package/lib/util/isPlainObject.js +6 -1
  74. package/lib/util/{isValidArbitraryValue.js → isSyntacticallyValidPropertyValue.js} +15 -5
  75. package/lib/util/log.js +36 -9
  76. package/lib/util/nameClass.js +24 -7
  77. package/lib/util/negateValue.js +23 -6
  78. package/lib/util/normalizeConfig.js +142 -69
  79. package/lib/util/normalizeScreens.js +124 -5
  80. package/lib/util/parseAnimationValue.js +8 -4
  81. package/lib/util/parseBoxShadowValue.js +16 -45
  82. package/lib/util/parseDependency.js +38 -54
  83. package/lib/util/parseGlob.js +36 -0
  84. package/lib/util/parseObjectStyles.js +14 -9
  85. package/lib/util/pluginUtils.js +146 -51
  86. package/lib/util/prefixSelector.js +29 -10
  87. package/lib/util/pseudoElements.js +209 -0
  88. package/lib/util/removeAlphaVariables.js +31 -0
  89. package/lib/util/resolveConfig.js +100 -73
  90. package/lib/util/resolveConfigPath.js +27 -8
  91. package/lib/util/responsive.js +10 -5
  92. package/lib/util/splitAtTopLevelOnly.js +51 -0
  93. package/lib/util/tap.js +6 -1
  94. package/lib/util/toColorValue.js +6 -1
  95. package/lib/util/toPath.js +20 -2
  96. package/lib/util/transformThemeValue.js +21 -7
  97. package/lib/util/validateConfig.js +48 -0
  98. package/lib/util/validateFormalSyntax.js +26 -0
  99. package/lib/util/withAlphaVariable.js +24 -12
  100. package/lib/value-parser/LICENSE +22 -0
  101. package/lib/value-parser/README.md +3 -0
  102. package/lib/value-parser/index.d.js +2 -0
  103. package/lib/value-parser/index.js +22 -0
  104. package/lib/value-parser/parse.js +259 -0
  105. package/lib/value-parser/stringify.js +38 -0
  106. package/lib/value-parser/unit.js +86 -0
  107. package/lib/value-parser/walk.js +16 -0
  108. package/loadConfig.d.ts +4 -0
  109. package/loadConfig.js +2 -0
  110. package/package.json +58 -53
  111. package/plugin.d.ts +11 -0
  112. package/resolveConfig.d.ts +12 -0
  113. package/scripts/generate-types.js +105 -0
  114. package/scripts/release-channel.js +18 -0
  115. package/scripts/release-notes.js +21 -0
  116. package/scripts/type-utils.js +27 -0
  117. package/src/cli/build/index.js +53 -0
  118. package/src/cli/build/plugin.js +469 -0
  119. package/src/cli/build/utils.js +76 -0
  120. package/src/cli/build/watching.js +229 -0
  121. package/src/cli/help/index.js +70 -0
  122. package/src/cli/index.js +217 -0
  123. package/src/cli/init/index.js +79 -0
  124. package/src/cli.js +1 -813
  125. package/src/corePluginList.js +1 -1
  126. package/src/corePlugins.js +636 -117
  127. package/src/css/preflight.css +17 -4
  128. package/src/featureFlags.js +13 -3
  129. package/src/index.js +1 -28
  130. package/src/lib/cacheInvalidation.js +52 -0
  131. package/src/lib/collapseAdjacentRules.js +5 -1
  132. package/src/lib/content.js +240 -0
  133. package/src/lib/defaultExtractor.js +192 -35
  134. package/src/lib/detectNesting.js +9 -1
  135. package/src/lib/evaluateTailwindFunctions.js +82 -8
  136. package/src/lib/expandApplyAtRules.js +322 -189
  137. package/src/lib/expandTailwindAtRules.js +87 -60
  138. package/src/lib/findAtConfigPath.js +48 -0
  139. package/src/lib/generateRules.js +428 -128
  140. package/src/lib/getModuleDependencies.js +70 -30
  141. package/src/lib/handleImportAtRules.js +34 -0
  142. package/src/lib/load-config.ts +31 -0
  143. package/src/lib/normalizeTailwindDirectives.js +0 -27
  144. package/src/lib/offsets.js +373 -0
  145. package/src/lib/regex.js +74 -0
  146. package/src/lib/remap-bitfield.js +82 -0
  147. package/src/lib/resolveDefaultsAtRules.js +53 -36
  148. package/src/lib/setupContextUtils.js +608 -157
  149. package/src/lib/setupTrackingContext.js +44 -58
  150. package/src/lib/sharedState.js +14 -4
  151. package/src/plugin.js +133 -0
  152. package/src/postcss-plugins/nesting/README.md +2 -2
  153. package/src/processTailwindFeatures.js +3 -2
  154. package/src/public/colors.js +22 -0
  155. package/src/public/default-config.js +1 -1
  156. package/src/public/default-theme.js +2 -2
  157. package/src/public/load-config.js +2 -0
  158. package/src/util/applyImportantSelector.js +27 -0
  159. package/src/util/buildMediaQuery.js +5 -3
  160. package/src/util/cloneNodes.js +5 -1
  161. package/src/util/color.js +39 -20
  162. package/src/util/colorNames.js +150 -0
  163. package/src/util/dataTypes.js +115 -23
  164. package/src/util/formatVariantSelector.js +265 -144
  165. package/src/util/getAllConfigs.js +21 -2
  166. package/src/util/{isValidArbitraryValue.js → isSyntacticallyValidPropertyValue.js} +1 -1
  167. package/src/util/log.js +25 -1
  168. package/src/util/nameClass.js +4 -0
  169. package/src/util/negateValue.js +11 -3
  170. package/src/util/normalizeConfig.js +78 -20
  171. package/src/util/normalizeScreens.js +99 -4
  172. package/src/util/parseBoxShadowValue.js +3 -50
  173. package/src/util/parseDependency.js +37 -42
  174. package/src/util/parseGlob.js +24 -0
  175. package/src/util/pluginUtils.js +118 -23
  176. package/src/util/prefixSelector.js +29 -10
  177. package/src/util/pseudoElements.js +167 -0
  178. package/src/util/removeAlphaVariables.js +24 -0
  179. package/src/util/resolveConfig.js +70 -32
  180. package/src/util/resolveConfigPath.js +12 -1
  181. package/src/util/splitAtTopLevelOnly.js +52 -0
  182. package/src/util/toPath.js +1 -1
  183. package/src/util/transformThemeValue.js +13 -3
  184. package/src/util/validateConfig.js +36 -0
  185. package/src/util/validateFormalSyntax.js +34 -0
  186. package/src/util/withAlphaVariable.js +1 -1
  187. package/src/value-parser/LICENSE +22 -0
  188. package/src/value-parser/README.md +3 -0
  189. package/src/value-parser/index.d.ts +177 -0
  190. package/src/value-parser/index.js +28 -0
  191. package/src/value-parser/parse.js +303 -0
  192. package/src/value-parser/stringify.js +41 -0
  193. package/src/value-parser/unit.js +118 -0
  194. package/src/value-parser/walk.js +18 -0
  195. package/stubs/.gitignore +1 -0
  196. package/stubs/.prettierrc.json +6 -0
  197. package/stubs/{defaultConfig.stub.js → config.full.js} +224 -172
  198. package/stubs/{simpleConfig.stub.js → config.simple.js} +1 -1
  199. package/stubs/{defaultPostCssConfig.stub.js → postcss.config.cjs} +0 -1
  200. package/stubs/postcss.config.js +5 -0
  201. package/stubs/tailwind.config.cjs +2 -0
  202. package/stubs/tailwind.config.js +2 -0
  203. package/stubs/tailwind.config.ts +3 -0
  204. package/types/config.d.ts +369 -0
  205. package/types/generated/.gitkeep +0 -0
  206. package/types/generated/colors.d.ts +298 -0
  207. package/types/generated/corePluginList.d.ts +1 -0
  208. package/types/generated/default-theme.d.ts +378 -0
  209. package/types/index.d.ts +7 -0
  210. package/CHANGELOG.md +0 -2075
  211. package/lib/cli-peer-dependencies.js +0 -15
  212. package/lib/constants.js +0 -37
  213. package/peers/index.js +0 -75077
  214. package/scripts/install-integrations.js +0 -27
  215. package/scripts/rebuildFixtures.js +0 -68
  216. package/src/cli-peer-dependencies.js +0 -9
  217. package/src/constants.js +0 -17
package/src/util/color.js CHANGED
@@ -1,18 +1,22 @@
1
- import namedColors from 'color-name'
1
+ import namedColors from './colorNames'
2
2
 
3
3
  let HEX = /^#([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?$/i
4
4
  let SHORT_HEX = /^#([a-f\d])([a-f\d])([a-f\d])([a-f\d])?$/i
5
- let VALUE = `(?:\\d+|\\d*\\.\\d+)%?`
6
- let SEP = `(?:\\s*,\\s*|\\s+)`
7
- let ALPHA_SEP = `\\s*[,/]\\s*`
5
+ let VALUE = /(?:\d+|\d*\.\d+)%?/
6
+ let SEP = /(?:\s*,\s*|\s+)/
7
+ let ALPHA_SEP = /\s*[,/]\s*/
8
+ let CUSTOM_PROPERTY = /var\(--(?:[^ )]*?)(?:,(?:[^ )]*?|var\(--[^ )]*?\)))?\)/
9
+
8
10
  let RGB = new RegExp(
9
- `^rgba?\\(\\s*(${VALUE})${SEP}(${VALUE})${SEP}(${VALUE})(?:${ALPHA_SEP}(${VALUE}))?\\s*\\)$`
11
+ `^(rgba?)\\(\\s*(${VALUE.source}|${CUSTOM_PROPERTY.source})(?:${SEP.source}(${VALUE.source}|${CUSTOM_PROPERTY.source}))?(?:${SEP.source}(${VALUE.source}|${CUSTOM_PROPERTY.source}))?(?:${ALPHA_SEP.source}(${VALUE.source}|${CUSTOM_PROPERTY.source}))?\\s*\\)$`
10
12
  )
11
13
  let HSL = new RegExp(
12
- `^hsla?\\(\\s*((?:${VALUE})(?:deg|rad|grad|turn)?)${SEP}(${VALUE})${SEP}(${VALUE})(?:${ALPHA_SEP}(${VALUE}))?\\s*\\)$`
14
+ `^(hsla?)\\(\\s*((?:${VALUE.source})(?:deg|rad|grad|turn)?|${CUSTOM_PROPERTY.source})(?:${SEP.source}(${VALUE.source}|${CUSTOM_PROPERTY.source}))?(?:${SEP.source}(${VALUE.source}|${CUSTOM_PROPERTY.source}))?(?:${ALPHA_SEP.source}(${VALUE.source}|${CUSTOM_PROPERTY.source}))?\\s*\\)$`
13
15
  )
14
16
 
15
- export function parseColor(value) {
17
+ // In "loose" mode the color may contain fewer than 3 parts, as long as at least
18
+ // one of the parts is variable.
19
+ export function parseColor(value, { loose = false } = {}) {
16
20
  if (typeof value !== 'string') {
17
21
  return null
18
22
  }
@@ -40,30 +44,45 @@ export function parseColor(value) {
40
44
  }
41
45
  }
42
46
 
43
- let rgbMatch = value.match(RGB)
47
+ let match = value.match(RGB) ?? value.match(HSL)
44
48
 
45
- if (rgbMatch !== null) {
46
- return {
47
- mode: 'rgb',
48
- color: [rgbMatch[1], rgbMatch[2], rgbMatch[3]].map((v) => v.toString()),
49
- alpha: rgbMatch[4]?.toString?.(),
50
- }
49
+ if (match === null) {
50
+ return null
51
51
  }
52
52
 
53
- let hslMatch = value.match(HSL)
53
+ let color = [match[2], match[3], match[4]].filter(Boolean).map((v) => v.toString())
54
54
 
55
- if (hslMatch !== null) {
55
+ // rgba(var(--my-color), 0.1)
56
+ // hsla(var(--my-color), 0.1)
57
+ if (color.length === 2 && color[0].startsWith('var(')) {
56
58
  return {
57
- mode: 'hsl',
58
- color: [hslMatch[1], hslMatch[2], hslMatch[3]].map((v) => v.toString()),
59
- alpha: hslMatch[4]?.toString?.(),
59
+ mode: match[1],
60
+ color: [color[0]],
61
+ alpha: color[1],
60
62
  }
61
63
  }
62
64
 
63
- return null
65
+ if (!loose && color.length !== 3) {
66
+ return null
67
+ }
68
+
69
+ if (color.length < 3 && !color.some((part) => /^var\(.*?\)$/.test(part))) {
70
+ return null
71
+ }
72
+
73
+ return {
74
+ mode: match[1],
75
+ color,
76
+ alpha: match[5]?.toString?.(),
77
+ }
64
78
  }
65
79
 
66
80
  export function formatColor({ mode, color, alpha }) {
67
81
  let hasAlpha = alpha !== undefined
82
+
83
+ if (mode === 'rgba' || mode === 'hsla') {
84
+ return `${mode}(${color.join(', ')}${hasAlpha ? `, ${alpha}` : ''})`
85
+ }
86
+
68
87
  return `${mode}(${color.join(' ')}${hasAlpha ? ` / ${alpha}` : ''})`
69
88
  }
@@ -0,0 +1,150 @@
1
+ export default {
2
+ aliceblue: [240, 248, 255],
3
+ antiquewhite: [250, 235, 215],
4
+ aqua: [0, 255, 255],
5
+ aquamarine: [127, 255, 212],
6
+ azure: [240, 255, 255],
7
+ beige: [245, 245, 220],
8
+ bisque: [255, 228, 196],
9
+ black: [0, 0, 0],
10
+ blanchedalmond: [255, 235, 205],
11
+ blue: [0, 0, 255],
12
+ blueviolet: [138, 43, 226],
13
+ brown: [165, 42, 42],
14
+ burlywood: [222, 184, 135],
15
+ cadetblue: [95, 158, 160],
16
+ chartreuse: [127, 255, 0],
17
+ chocolate: [210, 105, 30],
18
+ coral: [255, 127, 80],
19
+ cornflowerblue: [100, 149, 237],
20
+ cornsilk: [255, 248, 220],
21
+ crimson: [220, 20, 60],
22
+ cyan: [0, 255, 255],
23
+ darkblue: [0, 0, 139],
24
+ darkcyan: [0, 139, 139],
25
+ darkgoldenrod: [184, 134, 11],
26
+ darkgray: [169, 169, 169],
27
+ darkgreen: [0, 100, 0],
28
+ darkgrey: [169, 169, 169],
29
+ darkkhaki: [189, 183, 107],
30
+ darkmagenta: [139, 0, 139],
31
+ darkolivegreen: [85, 107, 47],
32
+ darkorange: [255, 140, 0],
33
+ darkorchid: [153, 50, 204],
34
+ darkred: [139, 0, 0],
35
+ darksalmon: [233, 150, 122],
36
+ darkseagreen: [143, 188, 143],
37
+ darkslateblue: [72, 61, 139],
38
+ darkslategray: [47, 79, 79],
39
+ darkslategrey: [47, 79, 79],
40
+ darkturquoise: [0, 206, 209],
41
+ darkviolet: [148, 0, 211],
42
+ deeppink: [255, 20, 147],
43
+ deepskyblue: [0, 191, 255],
44
+ dimgray: [105, 105, 105],
45
+ dimgrey: [105, 105, 105],
46
+ dodgerblue: [30, 144, 255],
47
+ firebrick: [178, 34, 34],
48
+ floralwhite: [255, 250, 240],
49
+ forestgreen: [34, 139, 34],
50
+ fuchsia: [255, 0, 255],
51
+ gainsboro: [220, 220, 220],
52
+ ghostwhite: [248, 248, 255],
53
+ gold: [255, 215, 0],
54
+ goldenrod: [218, 165, 32],
55
+ gray: [128, 128, 128],
56
+ green: [0, 128, 0],
57
+ greenyellow: [173, 255, 47],
58
+ grey: [128, 128, 128],
59
+ honeydew: [240, 255, 240],
60
+ hotpink: [255, 105, 180],
61
+ indianred: [205, 92, 92],
62
+ indigo: [75, 0, 130],
63
+ ivory: [255, 255, 240],
64
+ khaki: [240, 230, 140],
65
+ lavender: [230, 230, 250],
66
+ lavenderblush: [255, 240, 245],
67
+ lawngreen: [124, 252, 0],
68
+ lemonchiffon: [255, 250, 205],
69
+ lightblue: [173, 216, 230],
70
+ lightcoral: [240, 128, 128],
71
+ lightcyan: [224, 255, 255],
72
+ lightgoldenrodyellow: [250, 250, 210],
73
+ lightgray: [211, 211, 211],
74
+ lightgreen: [144, 238, 144],
75
+ lightgrey: [211, 211, 211],
76
+ lightpink: [255, 182, 193],
77
+ lightsalmon: [255, 160, 122],
78
+ lightseagreen: [32, 178, 170],
79
+ lightskyblue: [135, 206, 250],
80
+ lightslategray: [119, 136, 153],
81
+ lightslategrey: [119, 136, 153],
82
+ lightsteelblue: [176, 196, 222],
83
+ lightyellow: [255, 255, 224],
84
+ lime: [0, 255, 0],
85
+ limegreen: [50, 205, 50],
86
+ linen: [250, 240, 230],
87
+ magenta: [255, 0, 255],
88
+ maroon: [128, 0, 0],
89
+ mediumaquamarine: [102, 205, 170],
90
+ mediumblue: [0, 0, 205],
91
+ mediumorchid: [186, 85, 211],
92
+ mediumpurple: [147, 112, 219],
93
+ mediumseagreen: [60, 179, 113],
94
+ mediumslateblue: [123, 104, 238],
95
+ mediumspringgreen: [0, 250, 154],
96
+ mediumturquoise: [72, 209, 204],
97
+ mediumvioletred: [199, 21, 133],
98
+ midnightblue: [25, 25, 112],
99
+ mintcream: [245, 255, 250],
100
+ mistyrose: [255, 228, 225],
101
+ moccasin: [255, 228, 181],
102
+ navajowhite: [255, 222, 173],
103
+ navy: [0, 0, 128],
104
+ oldlace: [253, 245, 230],
105
+ olive: [128, 128, 0],
106
+ olivedrab: [107, 142, 35],
107
+ orange: [255, 165, 0],
108
+ orangered: [255, 69, 0],
109
+ orchid: [218, 112, 214],
110
+ palegoldenrod: [238, 232, 170],
111
+ palegreen: [152, 251, 152],
112
+ paleturquoise: [175, 238, 238],
113
+ palevioletred: [219, 112, 147],
114
+ papayawhip: [255, 239, 213],
115
+ peachpuff: [255, 218, 185],
116
+ peru: [205, 133, 63],
117
+ pink: [255, 192, 203],
118
+ plum: [221, 160, 221],
119
+ powderblue: [176, 224, 230],
120
+ purple: [128, 0, 128],
121
+ rebeccapurple: [102, 51, 153],
122
+ red: [255, 0, 0],
123
+ rosybrown: [188, 143, 143],
124
+ royalblue: [65, 105, 225],
125
+ saddlebrown: [139, 69, 19],
126
+ salmon: [250, 128, 114],
127
+ sandybrown: [244, 164, 96],
128
+ seagreen: [46, 139, 87],
129
+ seashell: [255, 245, 238],
130
+ sienna: [160, 82, 45],
131
+ silver: [192, 192, 192],
132
+ skyblue: [135, 206, 235],
133
+ slateblue: [106, 90, 205],
134
+ slategray: [112, 128, 144],
135
+ slategrey: [112, 128, 144],
136
+ snow: [255, 250, 250],
137
+ springgreen: [0, 255, 127],
138
+ steelblue: [70, 130, 180],
139
+ tan: [210, 180, 140],
140
+ teal: [0, 128, 128],
141
+ thistle: [216, 191, 216],
142
+ tomato: [255, 99, 71],
143
+ turquoise: [64, 224, 208],
144
+ violet: [238, 130, 238],
145
+ wheat: [245, 222, 179],
146
+ white: [255, 255, 255],
147
+ whitesmoke: [245, 245, 245],
148
+ yellow: [255, 255, 0],
149
+ yellowgreen: [154, 205, 50],
150
+ }
@@ -1,16 +1,22 @@
1
1
  import { parseColor } from './color'
2
2
  import { parseBoxShadowValue } from './parseBoxShadowValue'
3
+ import { splitAtTopLevelOnly } from './splitAtTopLevelOnly'
3
4
 
4
5
  let cssFunctions = ['min', 'max', 'clamp', 'calc']
5
6
 
6
7
  // Ref: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Types
7
8
 
8
- let COMMA = /,(?![^(]*\))/g // Comma separator that is not located between brackets. E.g.: `cubiz-bezier(a, b, c)` these don't count.
9
- let UNDERSCORE = /_(?![^(]*\))/g // Underscore separator that is not located between brackets. E.g.: `rgba(255,_255,_255)_black` these don't count.
9
+ function isCSSFunction(value) {
10
+ return cssFunctions.some((fn) => new RegExp(`^${fn}\\(.*\\)`).test(value))
11
+ }
10
12
 
11
13
  // This is not a data type, but rather a function that can normalize the
12
14
  // correct values.
13
15
  export function normalize(value, isRoot = true) {
16
+ if (value.startsWith('--')) {
17
+ return `var(${value})`
18
+ }
19
+
14
20
  // Keep raw strings if it starts with `url(`
15
21
  if (value.includes('url(')) {
16
22
  return value
@@ -40,12 +46,81 @@ export function normalize(value, isRoot = true) {
40
46
  value = value.trim()
41
47
  }
42
48
 
43
- // Add spaces around operators inside calc() that do not follow an operator
44
- // or '('.
45
- return value.replace(
46
- /(-?\d*\.?\d(?!\b-.+[,)](?![^+\-/*])\D)(?:%|[a-z]+)?|\))([+\-/*])/g,
47
- '$1 $2 '
48
- )
49
+ value = normalizeMathOperatorSpacing(value)
50
+
51
+ return value
52
+ }
53
+
54
+ /**
55
+ * Add spaces around operators inside math functions
56
+ * like calc() that do not follow an operator or '('.
57
+ *
58
+ * @param {string} value
59
+ * @returns {string}
60
+ */
61
+ function normalizeMathOperatorSpacing(value) {
62
+ let preventFormattingInFunctions = ['theme']
63
+
64
+ return value.replace(/(calc|min|max|clamp)\(.+\)/g, (match) => {
65
+ let result = ''
66
+
67
+ function lastChar() {
68
+ let char = result.trimEnd()
69
+ return char[char.length - 1]
70
+ }
71
+
72
+ for (let i = 0; i < match.length; i++) {
73
+ function peek(word) {
74
+ return word.split('').every((char, j) => match[i + j] === char)
75
+ }
76
+
77
+ function consumeUntil(chars) {
78
+ let minIndex = Infinity
79
+ for (let char of chars) {
80
+ let index = match.indexOf(char, i)
81
+ if (index !== -1 && index < minIndex) {
82
+ minIndex = index
83
+ }
84
+ }
85
+
86
+ let result = match.slice(i, minIndex)
87
+ i += result.length - 1
88
+ return result
89
+ }
90
+
91
+ let char = match[i]
92
+
93
+ // Handle `var(--variable)`
94
+ if (peek('var')) {
95
+ // When we consume until `)`, then we are dealing with this scenario:
96
+ // `var(--example)`
97
+ //
98
+ // When we consume until `,`, then we are dealing with this scenario:
99
+ // `var(--example, 1rem)`
100
+ //
101
+ // In this case we do want to "format", the default value as well
102
+ result += consumeUntil([')', ','])
103
+ }
104
+
105
+ // Skip formatting inside known functions
106
+ else if (preventFormattingInFunctions.some((fn) => peek(fn))) {
107
+ result += consumeUntil([')'])
108
+ }
109
+
110
+ // Handle operators
111
+ else if (
112
+ ['+', '-', '*', '/'].includes(char) &&
113
+ !['(', '+', '-', '*', '/'].includes(lastChar())
114
+ ) {
115
+ result += ` ${char} `
116
+ } else {
117
+ result += char
118
+ }
119
+ }
120
+
121
+ // Simplify multiple spaces
122
+ return result.replace(/\s+/g, ' ')
123
+ })
49
124
  }
50
125
 
51
126
  export function url(value) {
@@ -53,13 +128,16 @@ export function url(value) {
53
128
  }
54
129
 
55
130
  export function number(value) {
56
- return !isNaN(Number(value)) || cssFunctions.some((fn) => new RegExp(`^${fn}\\(.+?`).test(value))
131
+ return !isNaN(Number(value)) || isCSSFunction(value)
57
132
  }
58
133
 
59
134
  export function percentage(value) {
60
- return /%$/g.test(value) || cssFunctions.some((fn) => new RegExp(`^${fn}\\(.+?%`).test(value))
135
+ return (value.endsWith('%') && number(value.slice(0, -1))) || isCSSFunction(value)
61
136
  }
62
137
 
138
+ // Please refer to MDN when updating this list:
139
+ // https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Values_and_units
140
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Container_Queries#container_query_length_units
63
141
  let lengthUnits = [
64
142
  'cm',
65
143
  'mm',
@@ -73,20 +151,33 @@ let lengthUnits = [
73
151
  'ch',
74
152
  'rem',
75
153
  'lh',
154
+ 'rlh',
76
155
  'vw',
77
156
  'vh',
78
157
  'vmin',
79
158
  'vmax',
159
+ 'vb',
160
+ 'vi',
161
+ 'svw',
162
+ 'svh',
163
+ 'lvw',
164
+ 'lvh',
165
+ 'dvw',
166
+ 'dvh',
167
+ 'cqw',
168
+ 'cqh',
169
+ 'cqi',
170
+ 'cqb',
171
+ 'cqmin',
172
+ 'cqmax',
80
173
  ]
81
174
  let lengthUnitsPattern = `(?:${lengthUnits.join('|')})`
82
175
  export function length(value) {
83
- return value.split(UNDERSCORE).every((part) => {
84
- return (
85
- part === '0' ||
86
- new RegExp(`${lengthUnitsPattern}$`).test(part) ||
87
- cssFunctions.some((fn) => new RegExp(`^${fn}\\(.+?${lengthUnitsPattern}`).test(part))
88
- )
89
- })
176
+ return (
177
+ value === '0' ||
178
+ new RegExp(`^[+-]?[0-9]*\.?[0-9]+(?:[eE][+-]?[0-9]+)?${lengthUnitsPattern}$`).test(value) ||
179
+ isCSSFunction(value)
180
+ )
90
181
  }
91
182
 
92
183
  let lineWidths = new Set(['thin', 'medium', 'thick'])
@@ -109,11 +200,11 @@ export function shadow(value) {
109
200
  export function color(value) {
110
201
  let colors = 0
111
202
 
112
- let result = value.split(UNDERSCORE).every((part) => {
203
+ let result = splitAtTopLevelOnly(value, '_').every((part) => {
113
204
  part = normalize(part)
114
205
 
115
206
  if (part.startsWith('var(')) return true
116
- if (parseColor(part) !== null) return colors++, true
207
+ if (parseColor(part, { loose: true }) !== null) return colors++, true
117
208
 
118
209
  return false
119
210
  })
@@ -124,7 +215,7 @@ export function color(value) {
124
215
 
125
216
  export function image(value) {
126
217
  let images = 0
127
- let result = value.split(COMMA).every((part) => {
218
+ let result = splitAtTopLevelOnly(value, ',').every((part) => {
128
219
  part = normalize(part)
129
220
 
130
221
  if (part.startsWith('var(')) return true
@@ -145,11 +236,12 @@ export function image(value) {
145
236
  }
146
237
 
147
238
  let gradientTypes = new Set([
239
+ 'conic-gradient',
148
240
  'linear-gradient',
149
241
  'radial-gradient',
242
+ 'repeating-conic-gradient',
150
243
  'repeating-linear-gradient',
151
244
  'repeating-radial-gradient',
152
- 'conic-gradient',
153
245
  ])
154
246
  export function gradient(value) {
155
247
  value = normalize(value)
@@ -165,7 +257,7 @@ export function gradient(value) {
165
257
  let validPositions = new Set(['center', 'top', 'right', 'bottom', 'left'])
166
258
  export function position(value) {
167
259
  let positions = 0
168
- let result = value.split(UNDERSCORE).every((part) => {
260
+ let result = splitAtTopLevelOnly(value, '_').every((part) => {
169
261
  part = normalize(part)
170
262
 
171
263
  if (part.startsWith('var(')) return true
@@ -183,7 +275,7 @@ export function position(value) {
183
275
 
184
276
  export function familyName(value) {
185
277
  let fonts = 0
186
- let result = value.split(COMMA).every((part) => {
278
+ let result = splitAtTopLevelOnly(value, ',').every((part) => {
187
279
  part = normalize(part)
188
280
 
189
281
  if (part.startsWith('var(')) return true