@@ -14,6 +14,7 @@ import { version as tailwindVersion } from '../package.json'
14
14
import log from './util/log'
15
15
import { normalizeScreens } from './util/normalizeScreens'
16
16
import { formatBoxShadowValue , parseBoxShadowValue } from './util/parseBoxShadowValue'
17
+ import { flagEnabled } from './featureFlags'
17
18
18
19
export let variantPlugins = {
19
20
pseudoElementVariants : ( { addVariant } ) => {
@@ -60,14 +61,14 @@ export let variantPlugins = {
60
61
} )
61
62
} ,
62
63
63
- pseudoClassVariants : ( { addVariant } ) => {
64
+ pseudoClassVariants : ( { addVariant, config } ) => {
64
65
let pseudoVariants = [
65
66
// Positional
66
- [ 'first' , ':first-child' ] ,
67
- [ 'last' , ':last-child' ] ,
68
- [ 'only' , ':only-child' ] ,
69
- [ 'odd' , ':nth-child(odd)' ] ,
70
- [ 'even' , ':nth-child(even)' ] ,
67
+ [ 'first' , '& :first-child' ] ,
68
+ [ 'last' , '& :last-child' ] ,
69
+ [ 'only' , '& :only-child' ] ,
70
+ [ 'odd' , '& :nth-child(odd)' ] ,
71
+ [ 'even' , '& :nth-child(even)' ] ,
71
72
'first-of-type' ,
72
73
'last-of-type' ,
73
74
'only-of-type' ,
@@ -92,11 +93,11 @@ export let variantPlugins = {
92
93
}
93
94
} )
94
95
95
- return ':visited'
96
+ return '& :visited'
96
97
} ,
97
98
] ,
98
99
'target' ,
99
- [ 'open' , '[open]' ] ,
100
+ [ 'open' , '& [open]' ] ,
100
101
101
102
// Forms
102
103
'default' ,
@@ -116,35 +117,40 @@ export let variantPlugins = {
116
117
117
118
// Interactive
118
119
'focus-within' ,
119
- 'hover' ,
120
+ [
121
+ 'hover' ,
122
+ ! flagEnabled ( config ( ) , 'hoverOnlyWhenSupported' )
123
+ ? '&:hover'
124
+ : '@media (hover: hover) and (pointer: fine) { &:hover }' ,
125
+ ] ,
120
126
'focus' ,
121
127
'focus-visible' ,
122
128
'active' ,
123
129
'enabled' ,
124
130
'disabled' ,
125
- ] . map ( ( variant ) => ( Array . isArray ( variant ) ? variant : [ variant , `:${ variant } ` ] ) )
131
+ ] . map ( ( variant ) => ( Array . isArray ( variant ) ? variant : [ variant , `& :${ variant } ` ] ) )
126
132
127
133
for ( let [ variantName , state ] of pseudoVariants ) {
128
134
addVariant ( variantName , ( ctx ) => {
129
135
let result = typeof state === 'function' ? state ( ctx ) : state
130
136
131
- return `& ${ result } `
137
+ return result
132
138
} )
133
139
}
134
140
135
141
for ( let [ variantName , state ] of pseudoVariants ) {
136
142
addVariant ( `group-${ variantName } ` , ( ctx ) => {
137
143
let result = typeof state === 'function' ? state ( ctx ) : state
138
144
139
- return ` :merge(.group)${ result } &`
145
+ return result . replace ( / & ( \S + ) / , ' :merge(.group)$1 &' )
140
146
} )
141
147
}
142
148
143
149
for ( let [ variantName , state ] of pseudoVariants ) {
144
150
addVariant ( `peer-${ variantName } ` , ( ctx ) => {
145
151
let result = typeof state === 'function' ? state ( ctx ) : state
146
152
147
- return ` :merge(.peer)${ result } ~ &`
153
+ return result . replace ( / & ( \S + ) / , ' :merge(.peer)$1 ~ &' )
148
154
} )
149
155
}
150
156
} ,
0 commit comments