tailwindcss 0.0.0-insiders.f4635e0 → 0.0.0-insiders.f4a2ccd

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 (238) hide show
  1. package/LICENSE +1 -2
  2. package/README.md +15 -7
  3. package/colors.d.ts +3 -0
  4. package/colors.js +2 -304
  5. package/defaultConfig.d.ts +3 -0
  6. package/defaultConfig.js +2 -4
  7. package/defaultTheme.d.ts +4 -0
  8. package/defaultTheme.js +2 -4
  9. package/lib/cli/build/deps.js +54 -0
  10. package/lib/cli/build/index.js +52 -0
  11. package/lib/cli/build/plugin.js +376 -0
  12. package/lib/cli/build/utils.js +78 -0
  13. package/lib/cli/build/watching.js +180 -0
  14. package/lib/cli/help/index.js +71 -0
  15. package/lib/cli/index.js +230 -0
  16. package/lib/cli/init/index.js +61 -0
  17. package/lib/cli-peer-dependencies.js +22 -14
  18. package/lib/cli.js +4 -762
  19. package/lib/corePluginList.js +182 -5
  20. package/lib/corePlugins.js +4109 -2952
  21. package/lib/css/preflight.css +24 -9
  22. package/lib/featureFlags.js +68 -50
  23. package/lib/index.js +5 -30
  24. package/lib/lib/cacheInvalidation.js +90 -0
  25. package/lib/lib/collapseAdjacentRules.js +52 -36
  26. package/lib/lib/collapseDuplicateDeclarations.js +83 -0
  27. package/lib/lib/content.js +177 -0
  28. package/lib/lib/defaultExtractor.js +241 -0
  29. package/lib/lib/detectNesting.js +39 -17
  30. package/lib/lib/evaluateTailwindFunctions.js +203 -161
  31. package/lib/lib/expandApplyAtRules.js +503 -221
  32. package/lib/lib/expandTailwindAtRules.js +255 -243
  33. package/lib/lib/findAtConfigPath.js +44 -0
  34. package/lib/lib/generateRules.js +831 -317
  35. package/lib/lib/getModuleDependencies.js +93 -49
  36. package/lib/lib/load-config.js +36 -0
  37. package/lib/lib/normalizeTailwindDirectives.js +79 -60
  38. package/lib/lib/offsets.js +304 -0
  39. package/lib/lib/partitionApplyAtRules.js +56 -0
  40. package/lib/lib/regex.js +60 -0
  41. package/lib/lib/remap-bitfield.js +87 -0
  42. package/lib/lib/resolveDefaultsAtRules.js +150 -94
  43. package/lib/lib/setupContextUtils.js +1197 -685
  44. package/lib/lib/setupTrackingContext.js +150 -177
  45. package/lib/lib/sharedState.js +70 -21
  46. package/lib/lib/substituteScreenAtRules.js +26 -28
  47. package/lib/oxide/cli/build/deps.js +81 -0
  48. package/lib/oxide/cli/build/index.js +51 -0
  49. package/lib/oxide/cli/build/plugin.js +373 -0
  50. package/lib/oxide/cli/build/utils.js +77 -0
  51. package/lib/oxide/cli/build/watching.js +177 -0
  52. package/lib/oxide/cli/help/index.js +70 -0
  53. package/lib/oxide/cli/index.js +214 -0
  54. package/lib/oxide/cli/init/index.js +50 -0
  55. package/lib/oxide/cli.js +5 -0
  56. package/lib/oxide/postcss-plugin.js +2 -0
  57. package/lib/plugin.js +98 -0
  58. package/{nesting → lib/postcss-plugins/nesting}/README.md +2 -2
  59. package/lib/postcss-plugins/nesting/index.js +19 -0
  60. package/lib/postcss-plugins/nesting/plugin.js +87 -0
  61. package/lib/processTailwindFeatures.js +58 -56
  62. package/lib/public/colors.js +353 -0
  63. package/lib/public/create-plugin.js +15 -0
  64. package/lib/public/default-config.js +16 -0
  65. package/lib/public/default-theme.js +16 -0
  66. package/lib/public/load-config.js +10 -0
  67. package/lib/public/resolve-config.js +22 -0
  68. package/lib/util/applyImportantSelector.js +22 -0
  69. package/lib/util/bigSign.js +7 -6
  70. package/lib/util/buildMediaQuery.js +21 -32
  71. package/lib/util/cloneDeep.js +16 -14
  72. package/lib/util/cloneNodes.js +29 -15
  73. package/lib/util/color.js +104 -66
  74. package/lib/util/configurePlugins.js +17 -15
  75. package/lib/util/createPlugin.js +23 -26
  76. package/lib/util/createUtilityPlugin.js +46 -46
  77. package/lib/util/dataTypes.js +266 -0
  78. package/lib/util/defaults.js +20 -15
  79. package/lib/util/escapeClassName.js +18 -17
  80. package/lib/util/escapeCommas.js +7 -6
  81. package/lib/util/flattenColorPalette.js +13 -12
  82. package/lib/util/formatVariantSelector.js +341 -0
  83. package/lib/util/getAllConfigs.js +44 -18
  84. package/lib/util/hashConfig.js +15 -12
  85. package/lib/util/isKeyframeRule.js +7 -6
  86. package/lib/util/isPlainObject.js +11 -11
  87. package/lib/util/isSyntacticallyValidPropertyValue.js +72 -0
  88. package/lib/util/log.js +52 -33
  89. package/lib/util/nameClass.js +35 -29
  90. package/lib/util/negateValue.js +31 -17
  91. package/lib/util/normalizeConfig.js +294 -0
  92. package/lib/util/normalizeScreens.js +170 -0
  93. package/lib/util/parseAnimationValue.js +85 -54
  94. package/lib/util/parseBoxShadowValue.js +84 -0
  95. package/lib/util/parseDependency.js +41 -70
  96. package/lib/util/parseGlob.js +34 -0
  97. package/lib/util/parseObjectStyles.js +30 -24
  98. package/lib/util/pluginUtils.js +234 -288
  99. package/lib/util/prefixSelector.js +33 -19
  100. package/lib/util/removeAlphaVariables.js +29 -0
  101. package/lib/util/resolveConfig.js +221 -256
  102. package/lib/util/resolveConfigPath.js +55 -48
  103. package/lib/util/responsive.js +18 -14
  104. package/lib/util/splitAtTopLevelOnly.js +49 -0
  105. package/lib/util/tap.js +8 -7
  106. package/lib/util/toColorValue.js +7 -6
  107. package/lib/util/toPath.js +27 -8
  108. package/lib/util/transformThemeValue.js +67 -28
  109. package/lib/util/validateConfig.js +24 -0
  110. package/lib/util/validateFormalSyntax.js +24 -0
  111. package/lib/util/withAlphaVariable.js +67 -57
  112. package/loadConfig.d.ts +4 -0
  113. package/loadConfig.js +2 -0
  114. package/nesting/index.js +2 -12
  115. package/package.json +69 -66
  116. package/peers/index.js +76328 -84169
  117. package/plugin.d.ts +11 -0
  118. package/plugin.js +1 -2
  119. package/resolveConfig.d.ts +12 -0
  120. package/resolveConfig.js +2 -7
  121. package/scripts/create-plugin-list.js +2 -2
  122. package/scripts/generate-types.js +105 -0
  123. package/scripts/release-channel.js +18 -0
  124. package/scripts/release-notes.js +21 -0
  125. package/scripts/swap-engines.js +40 -0
  126. package/scripts/type-utils.js +27 -0
  127. package/src/cli/build/deps.js +56 -0
  128. package/src/cli/build/index.js +49 -0
  129. package/src/cli/build/plugin.js +444 -0
  130. package/src/cli/build/utils.js +76 -0
  131. package/src/cli/build/watching.js +229 -0
  132. package/src/cli/help/index.js +70 -0
  133. package/src/cli/index.js +216 -0
  134. package/src/cli/init/index.js +79 -0
  135. package/src/cli-peer-dependencies.js +7 -1
  136. package/src/cli.js +4 -756
  137. package/src/corePluginList.js +1 -1
  138. package/src/corePlugins.js +2526 -1956
  139. package/src/css/preflight.css +24 -9
  140. package/src/featureFlags.js +33 -10
  141. package/src/index.js +4 -33
  142. package/src/lib/cacheInvalidation.js +52 -0
  143. package/src/lib/collapseAdjacentRules.js +21 -2
  144. package/src/lib/collapseDuplicateDeclarations.js +93 -0
  145. package/src/lib/content.js +208 -0
  146. package/src/lib/defaultExtractor.js +217 -0
  147. package/src/lib/detectNesting.js +30 -3
  148. package/src/lib/evaluateTailwindFunctions.js +84 -10
  149. package/src/lib/expandApplyAtRules.js +509 -153
  150. package/src/lib/expandTailwindAtRules.js +125 -104
  151. package/src/lib/findAtConfigPath.js +48 -0
  152. package/src/lib/generateRules.js +678 -70
  153. package/src/lib/getModuleDependencies.js +70 -30
  154. package/src/lib/load-config.ts +27 -0
  155. package/src/lib/normalizeTailwindDirectives.js +10 -3
  156. package/src/lib/offsets.js +373 -0
  157. package/src/lib/partitionApplyAtRules.js +52 -0
  158. package/src/lib/regex.js +74 -0
  159. package/src/lib/remap-bitfield.js +82 -0
  160. package/src/lib/resolveDefaultsAtRules.js +105 -47
  161. package/src/lib/setupContextUtils.js +848 -247
  162. package/src/lib/setupTrackingContext.js +53 -64
  163. package/src/lib/sharedState.js +60 -6
  164. package/src/lib/substituteScreenAtRules.js +6 -3
  165. package/src/oxide/cli/build/deps.ts +91 -0
  166. package/src/oxide/cli/build/index.ts +47 -0
  167. package/src/oxide/cli/build/plugin.ts +442 -0
  168. package/src/oxide/cli/build/utils.ts +74 -0
  169. package/src/oxide/cli/build/watching.ts +225 -0
  170. package/src/oxide/cli/help/index.ts +69 -0
  171. package/src/oxide/cli/index.ts +204 -0
  172. package/src/oxide/cli/init/index.ts +59 -0
  173. package/src/oxide/cli.ts +1 -0
  174. package/src/oxide/postcss-plugin.ts +1 -0
  175. package/src/plugin.js +107 -0
  176. package/src/postcss-plugins/nesting/README.md +42 -0
  177. package/src/postcss-plugins/nesting/index.js +13 -0
  178. package/src/postcss-plugins/nesting/plugin.js +80 -0
  179. package/src/processTailwindFeatures.js +18 -3
  180. package/src/public/colors.js +322 -0
  181. package/src/public/create-plugin.js +2 -0
  182. package/src/public/default-config.js +4 -0
  183. package/src/public/default-theme.js +4 -0
  184. package/src/public/load-config.js +2 -0
  185. package/src/public/resolve-config.js +7 -0
  186. package/src/util/applyImportantSelector.js +19 -0
  187. package/src/util/buildMediaQuery.js +14 -16
  188. package/src/util/cloneNodes.js +19 -2
  189. package/src/util/color.js +43 -11
  190. package/src/util/createUtilityPlugin.js +2 -11
  191. package/src/util/dataTypes.js +281 -0
  192. package/src/util/defaults.js +6 -0
  193. package/src/util/formatVariantSelector.js +412 -0
  194. package/src/util/getAllConfigs.js +21 -2
  195. package/src/util/isSyntacticallyValidPropertyValue.js +61 -0
  196. package/src/util/log.js +23 -22
  197. package/src/util/nameClass.js +6 -2
  198. package/src/util/negateValue.js +15 -5
  199. package/src/util/normalizeConfig.js +318 -0
  200. package/src/util/normalizeScreens.js +140 -0
  201. package/src/util/parseAnimationValue.js +7 -1
  202. package/src/util/parseBoxShadowValue.js +72 -0
  203. package/src/util/parseDependency.js +37 -38
  204. package/src/util/parseGlob.js +24 -0
  205. package/src/util/pluginUtils.js +219 -219
  206. package/src/util/prefixSelector.js +30 -13
  207. package/src/util/removeAlphaVariables.js +24 -0
  208. package/src/util/resolveConfig.js +86 -91
  209. package/src/util/resolveConfigPath.js +12 -1
  210. package/src/util/splitAtTopLevelOnly.js +52 -0
  211. package/src/util/toPath.js +23 -1
  212. package/src/util/transformThemeValue.js +33 -8
  213. package/src/util/validateConfig.js +13 -0
  214. package/src/util/validateFormalSyntax.js +34 -0
  215. package/src/util/withAlphaVariable.js +14 -9
  216. package/stubs/.gitignore +1 -0
  217. package/stubs/.prettierrc.json +6 -0
  218. package/stubs/{defaultConfig.stub.js → config.full.js} +332 -249
  219. package/stubs/{simpleConfig.stub.js → config.simple.js} +0 -1
  220. package/stubs/postcss.config.js +6 -0
  221. package/stubs/tailwind.config.cjs +2 -0
  222. package/stubs/tailwind.config.js +2 -0
  223. package/stubs/tailwind.config.ts +3 -0
  224. package/types/config.d.ts +373 -0
  225. package/types/generated/.gitkeep +0 -0
  226. package/types/generated/colors.d.ts +298 -0
  227. package/types/generated/corePluginList.d.ts +1 -0
  228. package/types/generated/default-theme.d.ts +347 -0
  229. package/types/index.d.ts +7 -0
  230. package/CHANGELOG.md +0 -1742
  231. package/lib/constants.js +0 -37
  232. package/lib/lib/setupWatchingContext.js +0 -331
  233. package/nesting/plugin.js +0 -41
  234. package/scripts/install-integrations.js +0 -27
  235. package/scripts/rebuildFixtures.js +0 -68
  236. package/src/constants.js +0 -17
  237. package/src/lib/setupWatchingContext.js +0 -307
  238. /package/stubs/{defaultPostCssConfig.stub.js → postcss.config.cjs} +0 -0
package/src/util/color.js CHANGED
@@ -2,14 +2,21 @@ import namedColors from 'color-name'
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*`
8
- let RGB_HSL = new RegExp(
9
- `^(rgb|hsl)a?\\(\\s*(${VALUE})${SEP}(${VALUE})${SEP}(${VALUE})(?:${ALPHA_SEP}(${VALUE}))?\\s*\\)$`
5
+ let VALUE = /(?:\d+|\d*\.\d+)%?/
6
+ let SEP = /(?:\s*,\s*|\s+)/
7
+ let ALPHA_SEP = /\s*[,/]\s*/
8
+ let CUSTOM_PROPERTY = /var\(--(?:[^ )]*?)\)/
9
+
10
+ let RGB = new RegExp(
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*\\)$`
12
+ )
13
+ let HSL = new RegExp(
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*\\)$`
10
15
  )
11
16
 
12
- 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 } = {}) {
13
20
  if (typeof value !== 'string') {
14
21
  return null
15
22
  }
@@ -37,20 +44,45 @@ export function parseColor(value) {
37
44
  }
38
45
  }
39
46
 
40
- let match = value.match(RGB_HSL)
47
+ let match = value.match(RGB) ?? value.match(HSL)
48
+
49
+ if (match === null) {
50
+ return null
51
+ }
52
+
53
+ let color = [match[2], match[3], match[4]].filter(Boolean).map((v) => v.toString())
41
54
 
42
- if (match !== null) {
55
+ // rgba(var(--my-color), 0.1)
56
+ // hsla(var(--my-color), 0.1)
57
+ if (color.length === 2 && color[0].startsWith('var(')) {
43
58
  return {
44
59
  mode: match[1],
45
- color: [match[2], match[3], match[4]].map((v) => v.toString()),
46
- alpha: match[5]?.toString?.(),
60
+ color: [color[0]],
61
+ alpha: color[1],
47
62
  }
48
63
  }
49
64
 
50
- 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
+ }
51
78
  }
52
79
 
53
80
  export function formatColor({ mode, color, alpha }) {
54
81
  let hasAlpha = alpha !== undefined
82
+
83
+ if (mode === 'rgba' || mode === 'hsla') {
84
+ return `${mode}(${color.join(', ')}${hasAlpha ? `, ${alpha}` : ''})`
85
+ }
86
+
55
87
  return `${mode}(${color.join(' ')}${hasAlpha ? ` / ${alpha}` : ''})`
56
88
  }
@@ -1,18 +1,9 @@
1
1
  import transformThemeValue from './transformThemeValue'
2
- import { asValue, asColor, asAngle, asLength, asLookupValue } from '../util/pluginUtils'
3
-
4
- let asMap = new Map([
5
- [asValue, 'any'],
6
- [asColor, 'color'],
7
- [asAngle, 'angle'],
8
- [asLength, 'length'],
9
- [asLookupValue, 'lookup'],
10
- ])
11
2
 
12
3
  export default function createUtilityPlugin(
13
4
  themeKey,
14
5
  utilityVariations = [[themeKey, [themeKey]]],
15
- { filterDefault = false, resolveArbitraryValue = asValue } = {}
6
+ { filterDefault = false, ...options } = {}
16
7
  ) {
17
8
  let transformValue = transformThemeValue(themeKey)
18
9
  return function ({ matchUtilities, theme }) {
@@ -33,12 +24,12 @@ export default function createUtilityPlugin(
33
24
  })
34
25
  }, {}),
35
26
  {
27
+ ...options,
36
28
  values: filterDefault
37
29
  ? Object.fromEntries(
38
30
  Object.entries(theme(themeKey) ?? {}).filter(([modifier]) => modifier !== 'DEFAULT')
39
31
  )
40
32
  : theme(themeKey),
41
- type: asMap.get(resolveArbitraryValue) ?? 'any',
42
33
  }
43
34
  )
44
35
  }
@@ -0,0 +1,281 @@
1
+ import { parseColor } from './color'
2
+ import { parseBoxShadowValue } from './parseBoxShadowValue'
3
+ import { splitAtTopLevelOnly } from './splitAtTopLevelOnly'
4
+
5
+ let cssFunctions = ['min', 'max', 'clamp', 'calc']
6
+
7
+ // Ref: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Types
8
+
9
+ function isCSSFunction(value) {
10
+ return cssFunctions.some((fn) => new RegExp(`^${fn}\\(.*\\)`).test(value))
11
+ }
12
+
13
+ const placeholder = '--tw-placeholder'
14
+ const placeholderRe = new RegExp(placeholder, 'g')
15
+
16
+ // This is not a data type, but rather a function that can normalize the
17
+ // correct values.
18
+ export function normalize(value, isRoot = true) {
19
+ if (value.startsWith('--')) {
20
+ return `var(${value})`
21
+ }
22
+
23
+ // Keep raw strings if it starts with `url(`
24
+ if (value.includes('url(')) {
25
+ return value
26
+ .split(/(url\(.*?\))/g)
27
+ .filter(Boolean)
28
+ .map((part) => {
29
+ if (/^url\(.*?\)$/.test(part)) {
30
+ return part
31
+ }
32
+
33
+ return normalize(part, false)
34
+ })
35
+ .join('')
36
+ }
37
+
38
+ // Convert `_` to ` `, except for escaped underscores `\_`
39
+ value = value
40
+ .replace(
41
+ /([^\\])_+/g,
42
+ (fullMatch, characterBefore) => characterBefore + ' '.repeat(fullMatch.length - 1)
43
+ )
44
+ .replace(/^_/g, ' ')
45
+ .replace(/\\_/g, '_')
46
+
47
+ // Remove leftover whitespace
48
+ if (isRoot) {
49
+ value = value.trim()
50
+ }
51
+
52
+ // Add spaces around operators inside math functions like calc() that do not follow an operator
53
+ // or '('.
54
+ value = value.replace(/(calc|min|max|clamp)\(.+\)/g, (match) => {
55
+ let vars = []
56
+ return match
57
+ .replace(/var\((--.+?)[,)]/g, (match, g1) => {
58
+ vars.push(g1)
59
+ return match.replace(g1, placeholder)
60
+ })
61
+ .replace(/(-?\d*\.?\d(?!\b-\d.+[,)](?![^+\-/*])\D)(?:%|[a-z]+)?|\))([+\-/*])/g, '$1 $2 ')
62
+ .replace(placeholderRe, () => vars.shift())
63
+ })
64
+
65
+ return value
66
+ }
67
+
68
+ export function url(value) {
69
+ return value.startsWith('url(')
70
+ }
71
+
72
+ export function number(value) {
73
+ return !isNaN(Number(value)) || isCSSFunction(value)
74
+ }
75
+
76
+ export function percentage(value) {
77
+ return (value.endsWith('%') && number(value.slice(0, -1))) || isCSSFunction(value)
78
+ }
79
+
80
+ // Please refer to MDN when updating this list:
81
+ // https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Values_and_units
82
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Container_Queries#container_query_length_units
83
+ let lengthUnits = [
84
+ 'cm',
85
+ 'mm',
86
+ 'Q',
87
+ 'in',
88
+ 'pc',
89
+ 'pt',
90
+ 'px',
91
+ 'em',
92
+ 'ex',
93
+ 'ch',
94
+ 'rem',
95
+ 'lh',
96
+ 'rlh',
97
+ 'vw',
98
+ 'vh',
99
+ 'vmin',
100
+ 'vmax',
101
+ 'vb',
102
+ 'vi',
103
+ 'svw',
104
+ 'svh',
105
+ 'lvw',
106
+ 'lvh',
107
+ 'dvw',
108
+ 'dvh',
109
+ 'cqw',
110
+ 'cqh',
111
+ 'cqi',
112
+ 'cqb',
113
+ 'cqmin',
114
+ 'cqmax',
115
+ ]
116
+ let lengthUnitsPattern = `(?:${lengthUnits.join('|')})`
117
+ export function length(value) {
118
+ return (
119
+ value === '0' ||
120
+ new RegExp(`^[+-]?[0-9]*\.?[0-9]+(?:[eE][+-]?[0-9]+)?${lengthUnitsPattern}$`).test(value) ||
121
+ isCSSFunction(value)
122
+ )
123
+ }
124
+
125
+ let lineWidths = new Set(['thin', 'medium', 'thick'])
126
+ export function lineWidth(value) {
127
+ return lineWidths.has(value)
128
+ }
129
+
130
+ export function shadow(value) {
131
+ let parsedShadows = parseBoxShadowValue(normalize(value))
132
+
133
+ for (let parsedShadow of parsedShadows) {
134
+ if (!parsedShadow.valid) {
135
+ return false
136
+ }
137
+ }
138
+
139
+ return true
140
+ }
141
+
142
+ export function color(value) {
143
+ let colors = 0
144
+
145
+ let result = splitAtTopLevelOnly(value, '_').every((part) => {
146
+ part = normalize(part)
147
+
148
+ if (part.startsWith('var(')) return true
149
+ if (parseColor(part, { loose: true }) !== null) return colors++, true
150
+
151
+ return false
152
+ })
153
+
154
+ if (!result) return false
155
+ return colors > 0
156
+ }
157
+
158
+ export function image(value) {
159
+ let images = 0
160
+ let result = splitAtTopLevelOnly(value, ',').every((part) => {
161
+ part = normalize(part)
162
+
163
+ if (part.startsWith('var(')) return true
164
+ if (
165
+ url(part) ||
166
+ gradient(part) ||
167
+ ['element(', 'image(', 'cross-fade(', 'image-set('].some((fn) => part.startsWith(fn))
168
+ ) {
169
+ images++
170
+ return true
171
+ }
172
+
173
+ return false
174
+ })
175
+
176
+ if (!result) return false
177
+ return images > 0
178
+ }
179
+
180
+ let gradientTypes = new Set([
181
+ 'linear-gradient',
182
+ 'radial-gradient',
183
+ 'repeating-linear-gradient',
184
+ 'repeating-radial-gradient',
185
+ 'conic-gradient',
186
+ ])
187
+ export function gradient(value) {
188
+ value = normalize(value)
189
+
190
+ for (let type of gradientTypes) {
191
+ if (value.startsWith(`${type}(`)) {
192
+ return true
193
+ }
194
+ }
195
+ return false
196
+ }
197
+
198
+ let validPositions = new Set(['center', 'top', 'right', 'bottom', 'left'])
199
+ export function position(value) {
200
+ let positions = 0
201
+ let result = splitAtTopLevelOnly(value, '_').every((part) => {
202
+ part = normalize(part)
203
+
204
+ if (part.startsWith('var(')) return true
205
+ if (validPositions.has(part) || length(part) || percentage(part)) {
206
+ positions++
207
+ return true
208
+ }
209
+
210
+ return false
211
+ })
212
+
213
+ if (!result) return false
214
+ return positions > 0
215
+ }
216
+
217
+ export function familyName(value) {
218
+ let fonts = 0
219
+ let result = splitAtTopLevelOnly(value, ',').every((part) => {
220
+ part = normalize(part)
221
+
222
+ if (part.startsWith('var(')) return true
223
+
224
+ // If it contains spaces, then it should be quoted
225
+ if (part.includes(' ')) {
226
+ if (!/(['"])([^"']+)\1/g.test(part)) {
227
+ return false
228
+ }
229
+ }
230
+
231
+ // If it starts with a number, it's invalid
232
+ if (/^\d/g.test(part)) {
233
+ return false
234
+ }
235
+
236
+ fonts++
237
+
238
+ return true
239
+ })
240
+
241
+ if (!result) return false
242
+ return fonts > 0
243
+ }
244
+
245
+ let genericNames = new Set([
246
+ 'serif',
247
+ 'sans-serif',
248
+ 'monospace',
249
+ 'cursive',
250
+ 'fantasy',
251
+ 'system-ui',
252
+ 'ui-serif',
253
+ 'ui-sans-serif',
254
+ 'ui-monospace',
255
+ 'ui-rounded',
256
+ 'math',
257
+ 'emoji',
258
+ 'fangsong',
259
+ ])
260
+ export function genericName(value) {
261
+ return genericNames.has(value)
262
+ }
263
+
264
+ let absoluteSizes = new Set([
265
+ 'xx-small',
266
+ 'x-small',
267
+ 'small',
268
+ 'medium',
269
+ 'large',
270
+ 'x-large',
271
+ 'x-large',
272
+ 'xxx-large',
273
+ ])
274
+ export function absoluteSize(value) {
275
+ return absoluteSizes.has(value)
276
+ }
277
+
278
+ let relativeSizes = new Set(['larger', 'smaller'])
279
+ export function relativeSize(value) {
280
+ return relativeSizes.has(value)
281
+ }
@@ -5,6 +5,12 @@ export function defaults(target, ...sources) {
5
5
  target[k] = source[k]
6
6
  }
7
7
  }
8
+
9
+ for (let k of Object.getOwnPropertySymbols(source)) {
10
+ if (!target?.hasOwnProperty?.(k)) {
11
+ target[k] = source[k]
12
+ }
13
+ }
8
14
  }
9
15
 
10
16
  return target