Home / Function/ modernizeArbitraryValuesVariant() — tailwindcss Function Reference

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

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