Blame view

天文台pc/tianwentai-ui/node_modules/tailwind-merge/src/lib/merge-classlist.ts 2.75 KB
bc518174   王天杨   提交两个项目文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
  import { ConfigUtils } from './config-utils'
  import { IMPORTANT_MODIFIER } from './parse-class-name'
  
  const SPLIT_CLASSES_REGEX = /\s+/
  
  export const mergeClassList = (classList: string, configUtils: ConfigUtils) => {
      const { parseClassName, getClassGroupId, getConflictingClassGroupIds, sortModifiers } =
          configUtils
  
      /**
       * Set of classGroupIds in following format:
       * `{importantModifier}{variantModifiers}{classGroupId}`
       * @example 'float'
       * @example 'hover:focus:bg-color'
       * @example 'md:!pr'
       */
      const classGroupsInConflict: string[] = []
      const classNames = classList.trim().split(SPLIT_CLASSES_REGEX)
  
      let result = ''
  
      for (let index = classNames.length - 1; index >= 0; index -= 1) {
          const originalClassName = classNames[index]!
  
          const {
              isExternal,
              modifiers,
              hasImportantModifier,
              baseClassName,
              maybePostfixModifierPosition,
          } = parseClassName(originalClassName)
  
          if (isExternal) {
              result = originalClassName + (result.length > 0 ? ' ' + result : result)
              continue
          }
  
          let hasPostfixModifier = !!maybePostfixModifierPosition
          let classGroupId = getClassGroupId(
              hasPostfixModifier
                  ? baseClassName.substring(0, maybePostfixModifierPosition)
                  : baseClassName,
          )
  
          if (!classGroupId) {
              if (!hasPostfixModifier) {
                  // Not a Tailwind class
                  result = originalClassName + (result.length > 0 ? ' ' + result : result)
                  continue
              }
  
              classGroupId = getClassGroupId(baseClassName)
  
              if (!classGroupId) {
                  // Not a Tailwind class
                  result = originalClassName + (result.length > 0 ? ' ' + result : result)
                  continue
              }
  
              hasPostfixModifier = false
          }
  
          const variantModifier = sortModifiers(modifiers).join(':')
  
          const modifierId = hasImportantModifier
              ? variantModifier + IMPORTANT_MODIFIER
              : variantModifier
  
          const classId = modifierId + classGroupId
  
          if (classGroupsInConflict.includes(classId)) {
              // Tailwind class omitted due to conflict
              continue
          }
  
          classGroupsInConflict.push(classId)
  
          const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier)
          for (let i = 0; i < conflictGroups.length; ++i) {
              const group = conflictGroups[i]!
              classGroupsInConflict.push(modifierId + group)
          }
  
          // Tailwind class not in conflict
          result = originalClassName + (result.length > 0 ? ' ' + result : result)
      }
  
      return result
  }