@@ -14,6 +14,7 @@ import { version as tailwindVersion } from '../package.json'
1414import log from './util/log'
1515import { normalizeScreens } from './util/normalizeScreens'
1616import { formatBoxShadowValue , parseBoxShadowValue } from './util/parseBoxShadowValue'
17+ import { flagEnabled } from './featureFlags'
1718
1819export let variantPlugins = {
1920 pseudoElementVariants : ( { addVariant } ) => {
@@ -60,14 +61,14 @@ export let variantPlugins = {
6061 } )
6162 } ,
6263
63- pseudoClassVariants : ( { addVariant } ) => {
64+ pseudoClassVariants : ( { addVariant, config } ) => {
6465 let pseudoVariants = [
6566 // 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)' ] ,
7172 'first-of-type' ,
7273 'last-of-type' ,
7374 'only-of-type' ,
@@ -92,11 +93,11 @@ export let variantPlugins = {
9293 }
9394 } )
9495
95- return ':visited'
96+ return '& :visited'
9697 } ,
9798 ] ,
9899 'target' ,
99- [ 'open' , '[open]' ] ,
100+ [ 'open' , '& [open]' ] ,
100101
101102 // Forms
102103 'default' ,
@@ -116,35 +117,40 @@ export let variantPlugins = {
116117
117118 // Interactive
118119 'focus-within' ,
119- 'hover' ,
120+ [
121+ 'hover' ,
122+ ! flagEnabled ( config ( ) , 'hoverOnlyWhenSupported' )
123+ ? '&:hover'
124+ : '@media (hover: hover) and (pointer: fine) { &:hover }' ,
125+ ] ,
120126 'focus' ,
121127 'focus-visible' ,
122128 'active' ,
123129 'enabled' ,
124130 'disabled' ,
125- ] . map ( ( variant ) => ( Array . isArray ( variant ) ? variant : [ variant , `:${ variant } ` ] ) )
131+ ] . map ( ( variant ) => ( Array . isArray ( variant ) ? variant : [ variant , `& :${ variant } ` ] ) )
126132
127133 for ( let [ variantName , state ] of pseudoVariants ) {
128134 addVariant ( variantName , ( ctx ) => {
129135 let result = typeof state === 'function' ? state ( ctx ) : state
130136
131- return `& ${ result } `
137+ return result
132138 } )
133139 }
134140
135141 for ( let [ variantName , state ] of pseudoVariants ) {
136142 addVariant ( `group-${ variantName } ` , ( ctx ) => {
137143 let result = typeof state === 'function' ? state ( ctx ) : state
138144
139- return ` :merge(.group)${ result } &`
145+ return result . replace ( / & ( \S + ) / , ' :merge(.group)$1 &' )
140146 } )
141147 }
142148
143149 for ( let [ variantName , state ] of pseudoVariants ) {
144150 addVariant ( `peer-${ variantName } ` , ( ctx ) => {
145151 let result = typeof state === 'function' ? state ( ctx ) : state
146152
147- return ` :merge(.peer)${ result } ~ &`
153+ return result . replace ( / & ( \S + ) / , ' :merge(.peer)$1 ~ &' )
148154 } )
149155 }
150156 } ,
0 commit comments