@@ -2,7 +2,6 @@ import { ConfigUtils } from './config-utils'
2
2
3
3
const SPLIT_CLASSES_REGEX = / \s + /
4
4
const IMPORTANT_MODIFIER = '!'
5
- const MODIFIER_SEPARATOR = ':'
6
5
7
6
export function mergeClassList ( classList : string , configUtils : ConfigUtils ) {
8
7
const { getClassGroupId, getConflictingClassGroupIds } = configUtils
@@ -33,18 +32,15 @@ export function mergeClassList(classList: string, configUtils: ConfigUtils) {
33
32
}
34
33
}
35
34
36
- const variantModifier =
37
- modifiers . length === 0
38
- ? ''
39
- : modifiers . sort ( ) . concat ( '' ) . join ( MODIFIER_SEPARATOR )
35
+ const variantModifier = sortModifiers ( modifiers ) . join ( '' )
40
36
41
- const fullModifier = hasImportantModifier
37
+ const modifierId = hasImportantModifier
42
38
? variantModifier + IMPORTANT_MODIFIER
43
39
: variantModifier
44
40
45
41
return {
46
42
isTailwindClass : true as const ,
47
- modifier : fullModifier ,
43
+ modifierId ,
48
44
classGroupId,
49
45
originalClassName,
50
46
}
@@ -56,9 +52,9 @@ export function mergeClassList(classList: string, configUtils: ConfigUtils) {
56
52
return true
57
53
}
58
54
59
- const { modifier , classGroupId } = parsed
55
+ const { modifierId , classGroupId } = parsed
60
56
61
- const classId = `${ modifier } ${ classGroupId } `
57
+ const classId = `${ modifierId } ${ classGroupId } `
62
58
63
59
if ( classGroupsInConflict . has ( classId ) ) {
64
60
return false
@@ -67,7 +63,7 @@ export function mergeClassList(classList: string, configUtils: ConfigUtils) {
67
63
classGroupsInConflict . add ( classId )
68
64
69
65
getConflictingClassGroupIds ( classGroupId ) . forEach ( ( group ) =>
70
- classGroupsInConflict . add ( `${ modifier } ${ group } ` )
66
+ classGroupsInConflict . add ( `${ modifierId } ${ group } ` )
71
67
)
72
68
73
69
return true
@@ -111,3 +107,32 @@ function splitModifiers(className: string) {
111
107
baseClassName,
112
108
}
113
109
}
110
+
111
+ /**
112
+ * Sorts modifiers according to following schema:
113
+ * - Predefined modifiers are sorted alphabetically
114
+ * - When an arbitrary variant appears, it's important to preserve which modifiers are before and after it
115
+ */
116
+ function sortModifiers ( modifiers : string [ ] ) {
117
+ if ( modifiers . length <= 1 ) {
118
+ return modifiers
119
+ }
120
+
121
+ const sortedModifiers = [ ]
122
+ let unsortedModifiers : string [ ] = [ ]
123
+
124
+ modifiers . forEach ( ( modifier ) => {
125
+ const isArbitraryVariant = modifier [ 0 ] === '['
126
+
127
+ if ( isArbitraryVariant ) {
128
+ sortedModifiers . push ( ...unsortedModifiers . sort ( ) , modifier )
129
+ unsortedModifiers = [ ]
130
+ } else {
131
+ unsortedModifiers . push ( modifier )
132
+ }
133
+ } )
134
+
135
+ sortedModifiers . push ( ...unsortedModifiers . sort ( ) )
136
+
137
+ return sortedModifiers
138
+ }
0 commit comments