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.
- package/LICENSE +1 -2
- package/README.md +15 -7
- package/colors.d.ts +3 -0
- package/colors.js +2 -304
- package/defaultConfig.d.ts +3 -0
- package/defaultConfig.js +2 -4
- package/defaultTheme.d.ts +4 -0
- package/defaultTheme.js +2 -4
- package/lib/cli/build/deps.js +54 -0
- package/lib/cli/build/index.js +52 -0
- package/lib/cli/build/plugin.js +376 -0
- package/lib/cli/build/utils.js +78 -0
- package/lib/cli/build/watching.js +180 -0
- package/lib/cli/help/index.js +71 -0
- package/lib/cli/index.js +230 -0
- package/lib/cli/init/index.js +61 -0
- package/lib/cli-peer-dependencies.js +22 -14
- package/lib/cli.js +4 -762
- package/lib/corePluginList.js +182 -5
- package/lib/corePlugins.js +4109 -2952
- package/lib/css/preflight.css +24 -9
- package/lib/featureFlags.js +68 -50
- package/lib/index.js +5 -30
- package/lib/lib/cacheInvalidation.js +90 -0
- package/lib/lib/collapseAdjacentRules.js +52 -36
- package/lib/lib/collapseDuplicateDeclarations.js +83 -0
- package/lib/lib/content.js +177 -0
- package/lib/lib/defaultExtractor.js +241 -0
- package/lib/lib/detectNesting.js +39 -17
- package/lib/lib/evaluateTailwindFunctions.js +203 -161
- package/lib/lib/expandApplyAtRules.js +503 -221
- package/lib/lib/expandTailwindAtRules.js +255 -243
- package/lib/lib/findAtConfigPath.js +44 -0
- package/lib/lib/generateRules.js +831 -317
- package/lib/lib/getModuleDependencies.js +93 -49
- package/lib/lib/load-config.js +36 -0
- package/lib/lib/normalizeTailwindDirectives.js +79 -60
- package/lib/lib/offsets.js +304 -0
- package/lib/lib/partitionApplyAtRules.js +56 -0
- package/lib/lib/regex.js +60 -0
- package/lib/lib/remap-bitfield.js +87 -0
- package/lib/lib/resolveDefaultsAtRules.js +150 -94
- package/lib/lib/setupContextUtils.js +1197 -685
- package/lib/lib/setupTrackingContext.js +150 -177
- package/lib/lib/sharedState.js +70 -21
- package/lib/lib/substituteScreenAtRules.js +26 -28
- package/lib/oxide/cli/build/deps.js +81 -0
- package/lib/oxide/cli/build/index.js +51 -0
- package/lib/oxide/cli/build/plugin.js +373 -0
- package/lib/oxide/cli/build/utils.js +77 -0
- package/lib/oxide/cli/build/watching.js +177 -0
- package/lib/oxide/cli/help/index.js +70 -0
- package/lib/oxide/cli/index.js +214 -0
- package/lib/oxide/cli/init/index.js +50 -0
- package/lib/oxide/cli.js +5 -0
- package/lib/oxide/postcss-plugin.js +2 -0
- package/lib/plugin.js +98 -0
- package/{nesting → lib/postcss-plugins/nesting}/README.md +2 -2
- package/lib/postcss-plugins/nesting/index.js +19 -0
- package/lib/postcss-plugins/nesting/plugin.js +87 -0
- package/lib/processTailwindFeatures.js +58 -56
- package/lib/public/colors.js +353 -0
- package/lib/public/create-plugin.js +15 -0
- package/lib/public/default-config.js +16 -0
- package/lib/public/default-theme.js +16 -0
- package/lib/public/load-config.js +10 -0
- package/lib/public/resolve-config.js +22 -0
- package/lib/util/applyImportantSelector.js +22 -0
- package/lib/util/bigSign.js +7 -6
- package/lib/util/buildMediaQuery.js +21 -32
- package/lib/util/cloneDeep.js +16 -14
- package/lib/util/cloneNodes.js +29 -15
- package/lib/util/color.js +104 -66
- package/lib/util/configurePlugins.js +17 -15
- package/lib/util/createPlugin.js +23 -26
- package/lib/util/createUtilityPlugin.js +46 -46
- package/lib/util/dataTypes.js +266 -0
- package/lib/util/defaults.js +20 -15
- package/lib/util/escapeClassName.js +18 -17
- package/lib/util/escapeCommas.js +7 -6
- package/lib/util/flattenColorPalette.js +13 -12
- package/lib/util/formatVariantSelector.js +341 -0
- package/lib/util/getAllConfigs.js +44 -18
- package/lib/util/hashConfig.js +15 -12
- package/lib/util/isKeyframeRule.js +7 -6
- package/lib/util/isPlainObject.js +11 -11
- package/lib/util/isSyntacticallyValidPropertyValue.js +72 -0
- package/lib/util/log.js +52 -33
- package/lib/util/nameClass.js +35 -29
- package/lib/util/negateValue.js +31 -17
- package/lib/util/normalizeConfig.js +294 -0
- package/lib/util/normalizeScreens.js +170 -0
- package/lib/util/parseAnimationValue.js +85 -54
- package/lib/util/parseBoxShadowValue.js +84 -0
- package/lib/util/parseDependency.js +41 -70
- package/lib/util/parseGlob.js +34 -0
- package/lib/util/parseObjectStyles.js +30 -24
- package/lib/util/pluginUtils.js +234 -288
- package/lib/util/prefixSelector.js +33 -19
- package/lib/util/removeAlphaVariables.js +29 -0
- package/lib/util/resolveConfig.js +221 -256
- package/lib/util/resolveConfigPath.js +55 -48
- package/lib/util/responsive.js +18 -14
- package/lib/util/splitAtTopLevelOnly.js +49 -0
- package/lib/util/tap.js +8 -7
- package/lib/util/toColorValue.js +7 -6
- package/lib/util/toPath.js +27 -8
- package/lib/util/transformThemeValue.js +67 -28
- package/lib/util/validateConfig.js +24 -0
- package/lib/util/validateFormalSyntax.js +24 -0
- package/lib/util/withAlphaVariable.js +67 -57
- package/loadConfig.d.ts +4 -0
- package/loadConfig.js +2 -0
- package/nesting/index.js +2 -12
- package/package.json +69 -66
- package/peers/index.js +76328 -84169
- package/plugin.d.ts +11 -0
- package/plugin.js +1 -2
- package/resolveConfig.d.ts +12 -0
- package/resolveConfig.js +2 -7
- package/scripts/create-plugin-list.js +2 -2
- package/scripts/generate-types.js +105 -0
- package/scripts/release-channel.js +18 -0
- package/scripts/release-notes.js +21 -0
- package/scripts/swap-engines.js +40 -0
- package/scripts/type-utils.js +27 -0
- package/src/cli/build/deps.js +56 -0
- package/src/cli/build/index.js +49 -0
- package/src/cli/build/plugin.js +444 -0
- package/src/cli/build/utils.js +76 -0
- package/src/cli/build/watching.js +229 -0
- package/src/cli/help/index.js +70 -0
- package/src/cli/index.js +216 -0
- package/src/cli/init/index.js +79 -0
- package/src/cli-peer-dependencies.js +7 -1
- package/src/cli.js +4 -756
- package/src/corePluginList.js +1 -1
- package/src/corePlugins.js +2526 -1956
- package/src/css/preflight.css +24 -9
- package/src/featureFlags.js +33 -10
- package/src/index.js +4 -33
- package/src/lib/cacheInvalidation.js +52 -0
- package/src/lib/collapseAdjacentRules.js +21 -2
- package/src/lib/collapseDuplicateDeclarations.js +93 -0
- package/src/lib/content.js +208 -0
- package/src/lib/defaultExtractor.js +217 -0
- package/src/lib/detectNesting.js +30 -3
- package/src/lib/evaluateTailwindFunctions.js +84 -10
- package/src/lib/expandApplyAtRules.js +509 -153
- package/src/lib/expandTailwindAtRules.js +125 -104
- package/src/lib/findAtConfigPath.js +48 -0
- package/src/lib/generateRules.js +678 -70
- package/src/lib/getModuleDependencies.js +70 -30
- package/src/lib/load-config.ts +27 -0
- package/src/lib/normalizeTailwindDirectives.js +10 -3
- package/src/lib/offsets.js +373 -0
- package/src/lib/partitionApplyAtRules.js +52 -0
- package/src/lib/regex.js +74 -0
- package/src/lib/remap-bitfield.js +82 -0
- package/src/lib/resolveDefaultsAtRules.js +105 -47
- package/src/lib/setupContextUtils.js +848 -247
- package/src/lib/setupTrackingContext.js +53 -64
- package/src/lib/sharedState.js +60 -6
- package/src/lib/substituteScreenAtRules.js +6 -3
- package/src/oxide/cli/build/deps.ts +91 -0
- package/src/oxide/cli/build/index.ts +47 -0
- package/src/oxide/cli/build/plugin.ts +442 -0
- package/src/oxide/cli/build/utils.ts +74 -0
- package/src/oxide/cli/build/watching.ts +225 -0
- package/src/oxide/cli/help/index.ts +69 -0
- package/src/oxide/cli/index.ts +204 -0
- package/src/oxide/cli/init/index.ts +59 -0
- package/src/oxide/cli.ts +1 -0
- package/src/oxide/postcss-plugin.ts +1 -0
- package/src/plugin.js +107 -0
- package/src/postcss-plugins/nesting/README.md +42 -0
- package/src/postcss-plugins/nesting/index.js +13 -0
- package/src/postcss-plugins/nesting/plugin.js +80 -0
- package/src/processTailwindFeatures.js +18 -3
- package/src/public/colors.js +322 -0
- package/src/public/create-plugin.js +2 -0
- package/src/public/default-config.js +4 -0
- package/src/public/default-theme.js +4 -0
- package/src/public/load-config.js +2 -0
- package/src/public/resolve-config.js +7 -0
- package/src/util/applyImportantSelector.js +19 -0
- package/src/util/buildMediaQuery.js +14 -16
- package/src/util/cloneNodes.js +19 -2
- package/src/util/color.js +43 -11
- package/src/util/createUtilityPlugin.js +2 -11
- package/src/util/dataTypes.js +281 -0
- package/src/util/defaults.js +6 -0
- package/src/util/formatVariantSelector.js +412 -0
- package/src/util/getAllConfigs.js +21 -2
- package/src/util/isSyntacticallyValidPropertyValue.js +61 -0
- package/src/util/log.js +23 -22
- package/src/util/nameClass.js +6 -2
- package/src/util/negateValue.js +15 -5
- package/src/util/normalizeConfig.js +318 -0
- package/src/util/normalizeScreens.js +140 -0
- package/src/util/parseAnimationValue.js +7 -1
- package/src/util/parseBoxShadowValue.js +72 -0
- package/src/util/parseDependency.js +37 -38
- package/src/util/parseGlob.js +24 -0
- package/src/util/pluginUtils.js +219 -219
- package/src/util/prefixSelector.js +30 -13
- package/src/util/removeAlphaVariables.js +24 -0
- package/src/util/resolveConfig.js +86 -91
- package/src/util/resolveConfigPath.js +12 -1
- package/src/util/splitAtTopLevelOnly.js +52 -0
- package/src/util/toPath.js +23 -1
- package/src/util/transformThemeValue.js +33 -8
- package/src/util/validateConfig.js +13 -0
- package/src/util/validateFormalSyntax.js +34 -0
- package/src/util/withAlphaVariable.js +14 -9
- package/stubs/.gitignore +1 -0
- package/stubs/.prettierrc.json +6 -0
- package/stubs/{defaultConfig.stub.js → config.full.js} +332 -249
- package/stubs/{simpleConfig.stub.js → config.simple.js} +0 -1
- package/stubs/postcss.config.js +6 -0
- package/stubs/tailwind.config.cjs +2 -0
- package/stubs/tailwind.config.js +2 -0
- package/stubs/tailwind.config.ts +3 -0
- package/types/config.d.ts +373 -0
- package/types/generated/.gitkeep +0 -0
- package/types/generated/colors.d.ts +298 -0
- package/types/generated/corePluginList.d.ts +1 -0
- package/types/generated/default-theme.d.ts +347 -0
- package/types/index.d.ts +7 -0
- package/CHANGELOG.md +0 -1742
- package/lib/constants.js +0 -37
- package/lib/lib/setupWatchingContext.js +0 -331
- package/nesting/plugin.js +0 -41
- package/scripts/install-integrations.js +0 -27
- package/scripts/rebuildFixtures.js +0 -68
- package/src/constants.js +0 -17
- package/src/lib/setupWatchingContext.js +0 -307
- /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 =
|
|
6
|
-
let SEP =
|
|
7
|
-
let ALPHA_SEP =
|
|
8
|
-
let
|
|
9
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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: [
|
|
46
|
-
alpha:
|
|
60
|
+
color: [color[0]],
|
|
61
|
+
alpha: color[1],
|
|
47
62
|
}
|
|
48
63
|
}
|
|
49
64
|
|
|
50
|
-
|
|
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,
|
|
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
|
+
}
|
package/src/util/defaults.js
CHANGED