modernizeArbitraryValuesVariant() — tailwindcss Function Reference
Architecture documentation for the modernizeArbitraryValuesVariant() function in canonicalize-candidates.ts from the tailwindcss codebase.
Entity Profile
Dependency Diagram
graph TD 4af25bcc_7295_c96c_9ddc_5c19bf644f5e["modernizeArbitraryValuesVariant()"] f6c14bbb_2e42_58cc_18f1_c89a243da9c0["canonicalize-candidates.ts"] 4af25bcc_7295_c96c_9ddc_5c19bf644f5e -->|defined in| f6c14bbb_2e42_58cc_18f1_c89a243da9c0 0d3d890d_0584_dd18_a64e_8e1494d409e5["walkVariants()"] 4af25bcc_7295_c96c_9ddc_5c19bf644f5e -->|calls| 0d3d890d_0584_dd18_a64e_8e1494d409e5 a034f1d2_851b_cca2_4906_04b989aa247c["isSingleSelector()"] 4af25bcc_7295_c96c_9ddc_5c19bf644f5e -->|calls| a034f1d2_851b_cca2_4906_04b989aa247c 38b866f2_6f5f_ed0c_8931_4489835420d2["replaceObject()"] 4af25bcc_7295_c96c_9ddc_5c19bf644f5e -->|calls| 38b866f2_6f5f_ed0c_8931_4489835420d2 5719096b_0f51_ab16_7fbd_4455f835804c["parseVariant()"] 4af25bcc_7295_c96c_9ddc_5c19bf644f5e -->|calls| 5719096b_0f51_ab16_7fbd_4455f835804c fe10eff5_7df3_1553_1351_7802a9ea48a5["printVariant()"] 4af25bcc_7295_c96c_9ddc_5c19bf644f5e -->|calls| fe10eff5_7df3_1553_1351_7802a9ea48a5 e8216baa_6336_474b_cdd6_520fd85b00e7["isAttributeSelector()"] 4af25bcc_7295_c96c_9ddc_5c19bf644f5e -->|calls| e8216baa_6336_474b_cdd6_520fd85b00e7 ac5460b2_b2bd_a183_380b_ab78b5beefb4["selector()"] 4af25bcc_7295_c96c_9ddc_5c19bf644f5e -->|calls| ac5460b2_b2bd_a183_380b_ab78b5beefb4 2b202e81_c79a_bf7e_74f9_fe9a98bbea87["isPositiveInteger()"] 4af25bcc_7295_c96c_9ddc_5c19bf644f5e -->|calls| 2b202e81_c79a_bf7e_74f9_fe9a98bbea87 2820372c_b982_9e06_fc23_f8f4ac308d00["get()"] 4af25bcc_7295_c96c_9ddc_5c19bf644f5e -->|calls| 2820372c_b982_9e06_fc23_f8f4ac308d00 4982d9ce_98d4_85d9_44af_7cc47b93c482["walk()"] 4af25bcc_7295_c96c_9ddc_5c19bf644f5e -->|calls| 4982d9ce_98d4_85d9_44af_7cc47b93c482 117bca28_0677_ab3f_6eec_6019671b392d["parse()"] 4af25bcc_7295_c96c_9ddc_5c19bf644f5e -->|calls| 117bca28_0677_ab3f_6eec_6019671b392d 9b49f3c6_0c8d_5c62_965c_30a1db6499f8["toCss()"] 4af25bcc_7295_c96c_9ddc_5c19bf644f5e -->|calls| 9b49f3c6_0c8d_5c62_965c_30a1db6499f8 style 4af25bcc_7295_c96c_9ddc_5c19bf644f5e fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
packages/tailwindcss/src/canonicalize-candidates.ts lines 1540–1911
function modernizeArbitraryValuesVariant(
variant: Variant,
options: InternalCanonicalizeOptions,
): Variant | Variant[] {
let result = [variant]
let designSystem = options.designSystem
let signatures = designSystem.storage[VARIANT_SIGNATURE_KEY]
let iterator = walkVariants(variant)
for (let [variant, parent] of iterator) {
// Forward modifier from the root to the compound variant
if (
variant.kind === 'compound' &&
(variant.root === 'has' || variant.root === 'not' || variant.root === 'in')
) {
if (variant.modifier !== null) {
if ('modifier' in variant.variant) {
variant.variant.modifier = variant.modifier
variant.modifier = null
}
}
}
// Expecting an arbitrary variant
if (variant.kind === 'arbitrary') {
// Expecting a non-relative arbitrary variant
if (variant.relative) continue
let ast = SelectorParser.parse(variant.selector.trim())
// Expecting a single selector node
if (!isSingleSelector(ast)) continue
// `[&>*]` can be replaced with `*`
if (
// Only top-level, so `has-[&>*]` is not supported
parent === null &&
// [&_>_*]:flex
// ^ ^ ^
ast.length === 3 &&
ast[0].kind === 'selector' &&
ast[0].value === '&' &&
ast[1].kind === 'combinator' &&
ast[1].value.trim() === '>' &&
ast[2].kind === 'selector' &&
ast[2].value === '*'
) {
replaceObject(variant, designSystem.parseVariant('*'))
continue
}
// `[&_*]` can be replaced with `**`
if (
// Only top-level, so `has-[&_*]` is not supported
parent === null &&
// [&_*]:flex
// ^ ^
ast.length === 3 &&
ast[0].kind === 'selector' &&
ast[0].value === '&' &&
ast[1].kind === 'combinator' &&
ast[1].value.trim() === '' && // space, but trimmed because there could be multiple spaces
ast[2].kind === 'selector' &&
ast[2].value === '*'
) {
replaceObject(variant, designSystem.parseVariant('**'))
continue
}
// `in-*` variant. If the selector ends with ` &`, we can convert it to an
// `in-*` variant.
//
// E.g.: `[[data-visible]_&]` => `in-data-visible`
if (
// Only top-level, so `in-[&_[data-visible]]` is not supported
parent === null &&
// [[data-visible]___&]:flex
// ^^^^^^^^^^^^^^ ^ ^
ast.length === 3 &&
ast[1].kind === 'combinator' &&
ast[1].value.trim() === '' && // Space, but trimmed because there could be multiple spaces
Domain
Subdomains
Calls
Source
Frequently Asked Questions
What does modernizeArbitraryValuesVariant() do?
modernizeArbitraryValuesVariant() is a function in the tailwindcss codebase, defined in packages/tailwindcss/src/canonicalize-candidates.ts.
Where is modernizeArbitraryValuesVariant() defined?
modernizeArbitraryValuesVariant() is defined in packages/tailwindcss/src/canonicalize-candidates.ts at line 1540.
What does modernizeArbitraryValuesVariant() call?
modernizeArbitraryValuesVariant() calls 12 function(s): get, isAttributeSelector, isPositiveInteger, isSingleSelector, parse, parseVariant, printVariant, replaceObject, and 4 more.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free