Home / Function/ parseVariant() — tailwindcss Function Reference

parseVariant() — tailwindcss Function Reference

Architecture documentation for the parseVariant() function in candidate.ts from the tailwindcss codebase.

Function typescript Oxide Extractor calls 5 called by 7

Entity Profile

Dependency Diagram

graph TD
  5719096b_0f51_ab16_7fbd_4455f835804c["parseVariant()"]
  ba6fca27_7720_5839_0f92_bc2abb8db636["candidate.ts"]
  5719096b_0f51_ab16_7fbd_4455f835804c -->|defined in| ba6fca27_7720_5839_0f92_bc2abb8db636
  7a380dd4_2f8e_5aa7_b4ee_bf219cb7807f["migrateArbitraryVariants()"]
  7a380dd4_2f8e_5aa7_b4ee_bf219cb7807f -->|calls| 5719096b_0f51_ab16_7fbd_4455f835804c
  95e8edc9_45de_ca00_e4d2_601d3ae22f9f["migrateModernizeArbitraryValues()"]
  95e8edc9_45de_ca00_e4d2_601d3ae22f9f -->|calls| 5719096b_0f51_ab16_7fbd_4455f835804c
  7d328a86_10c6_b5c1_6390_36f4fffe9c14["parseCandidate()"]
  7d328a86_10c6_b5c1_6390_36f4fffe9c14 -->|calls| 5719096b_0f51_ab16_7fbd_4455f835804c
  b3ddb484_a420_850d_607a_2221ddf995ca["arbitraryVariants()"]
  b3ddb484_a420_850d_607a_2221ddf995ca -->|calls| 5719096b_0f51_ab16_7fbd_4455f835804c
  4af25bcc_7295_c96c_9ddc_5c19bf644f5e["modernizeArbitraryValuesVariant()"]
  4af25bcc_7295_c96c_9ddc_5c19bf644f5e -->|calls| 5719096b_0f51_ab16_7fbd_4455f835804c
  e557c8a4_bb27_ee44_c462_9e238157ad04["buildDesignSystem()"]
  e557c8a4_bb27_ee44_c462_9e238157ad04 -->|calls| 5719096b_0f51_ab16_7fbd_4455f835804c
  3a0ec0d5_1240_2a2d_bde3_145d361401fa["substituteAtVariant()"]
  3a0ec0d5_1240_2a2d_bde3_145d361401fa -->|calls| 5719096b_0f51_ab16_7fbd_4455f835804c
  8e4634e2_7c1f_b6c1_18b2_bd8f97be3651["decodeArbitraryValue()"]
  5719096b_0f51_ab16_7fbd_4455f835804c -->|calls| 8e4634e2_7c1f_b6c1_18b2_bd8f97be3651
  a9f719d7_a217_57d4_ebad_6e23afe26bca["isValidArbitrary()"]
  5719096b_0f51_ab16_7fbd_4455f835804c -->|calls| a9f719d7_a217_57d4_ebad_6e23afe26bca
  c58cbb33_f3cc_0b4f_844a_15bf66a1dc61["segment()"]
  5719096b_0f51_ab16_7fbd_4455f835804c -->|calls| c58cbb33_f3cc_0b4f_844a_15bf66a1dc61
  2fcdeca3_897e_3e5c_c457_c32a9a3f7218["findRoots()"]
  5719096b_0f51_ab16_7fbd_4455f835804c -->|calls| 2fcdeca3_897e_3e5c_c457_c32a9a3f7218
  ee401cf1_8419_7e3d_fd95_c624f65c3dba["parseModifier()"]
  5719096b_0f51_ab16_7fbd_4455f835804c -->|calls| ee401cf1_8419_7e3d_fd95_c624f65c3dba
  style 5719096b_0f51_ab16_7fbd_4455f835804c fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

packages/tailwindcss/src/candidate.ts lines 661–849

export function parseVariant(variant: string, designSystem: DesignSystem): Variant | null {
  // Arbitrary variants
  if (variant[0] === '[' && variant[variant.length - 1] === ']') {
    /**
     * TODO: Breaking change
     *
     * @deprecated Arbitrary variants containing at-rules with other selectors
     * are deprecated. Use stacked variants instead.
     *
     * Before:
     *  - `[@media(width>=123px){&:hover}]:`
     *
     * After:
     *  - `[@media(width>=123px)]:[&:hover]:`
     *  - `[@media(width>=123px)]:hover:`
     */
    if (variant[1] === '@' && variant.includes('&')) return null

    let selector = decodeArbitraryValue(variant.slice(1, -1))

    // Values can't contain `;` or `}` characters at the top-level.
    if (!isValidArbitrary(selector)) return null

    // Empty arbitrary values are invalid. E.g.: `[]:`
    //                                            ^^
    if (selector.length === 0 || selector.trim().length === 0) return null

    let relative = selector[0] === '>' || selector[0] === '+' || selector[0] === '~'

    // Ensure `&` is always present by wrapping the selector in `&:is(…)`,
    // unless it's a relative selector like `> img`.
    //
    // E.g.:
    //
    // - `[p]:flex`
    if (!relative && selector[0] !== '@' && !selector.includes('&')) {
      selector = `&:is(${selector})`
    }

    return {
      kind: 'arbitrary',
      selector,
      relative,
    }
  }

  // Static, functional and compound variants
  {
    // group-hover/group-name
    // ^^^^^^^^^^^            -> Variant without modifier
    //             ^^^^^^^^^^ -> Modifier
    let [variantWithoutModifier, modifier = null, additionalModifier] = segment(variant, '/')

    // If there's more than one modifier, the variant is invalid.
    //
    // E.g.:
    //
    // - `group-hover/foo/bar`
    if (additionalModifier) return null

    let roots = findRoots(variantWithoutModifier, (root) => {
      return designSystem.variants.has(root)
    })

    for (let [root, value] of roots) {
      switch (designSystem.variants.kind(root)) {
        case 'static': {
          // Static variants do not have a value
          if (value !== null) return null

          // Static variants do not have a modifier
          if (modifier !== null) return null

          return {
            kind: 'static',
            root,
          }
        }

        case 'functional': {
          let parsedModifier = modifier === null ? null : parseModifier(modifier)

Domain

Subdomains

Frequently Asked Questions

What does parseVariant() do?
parseVariant() is a function in the tailwindcss codebase, defined in packages/tailwindcss/src/candidate.ts.
Where is parseVariant() defined?
parseVariant() is defined in packages/tailwindcss/src/candidate.ts at line 661.
What does parseVariant() call?
parseVariant() calls 5 function(s): decodeArbitraryValue, findRoots, isValidArbitrary, parseModifier, segment.
What calls parseVariant()?
parseVariant() is called by 7 function(s): arbitraryVariants, buildDesignSystem, migrateArbitraryVariants, migrateModernizeArbitraryValues, modernizeArbitraryValuesVariant, parseCandidate, substituteAtVariant.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free