@@ -22,6 +22,8 @@ import isValidArbitraryValue from '../util/isValidArbitraryValue'
22
22
import { generateRules } from './generateRules'
23
23
import { hasContentChanged } from './cacheInvalidation.js'
24
24
25
+ let MATCH_VARIANT = Symbol ( )
26
+
25
27
function prefix ( context , selector ) {
26
28
let prefix = context . tailwindConfig . prefix
27
29
return typeof prefix === 'function' ? prefix ( selector ) : prefix + selector
@@ -219,13 +221,18 @@ function buildPluginApi(tailwindConfig, context, { variantList, variantMap, offs
219
221
return context . tailwindConfig . prefix + identifier
220
222
}
221
223
222
- return {
224
+ let api = {
223
225
addVariant ( variantName , variantFunctions , options = { } ) {
224
226
variantFunctions = [ ] . concat ( variantFunctions ) . map ( ( variantFunction ) => {
225
227
if ( typeof variantFunction !== 'string' ) {
226
228
// Safelist public API functions
227
- return ( { modifySelectors, container, separator } ) => {
228
- let result = variantFunction ( { modifySelectors, container, separator } )
229
+ return ( { args, modifySelectors, container, separator, wrap, format } ) => {
230
+ let result = variantFunction (
231
+ Object . assign (
232
+ { modifySelectors, container, separator } ,
233
+ variantFunction [ MATCH_VARIANT ] && { args, wrap, format }
234
+ )
235
+ )
229
236
230
237
if ( typeof result === 'string' && ! isValidVariantFormatString ( result ) ) {
231
238
throw new Error (
@@ -462,7 +469,35 @@ function buildPluginApi(tailwindConfig, context, { variantList, variantMap, offs
462
469
context . candidateRuleMap . get ( prefixedIdentifier ) . push ( withOffsets )
463
470
}
464
471
} ,
472
+ matchVariant : function ( variants , options ) {
473
+ for ( let variant in variants ) {
474
+ for ( let [ k , v ] of Object . entries ( options ?. values ?? { } ) ) {
475
+ api . addVariant ( `${ variant } -${ k } ` , variants [ variant ] ( v ) )
476
+ }
477
+
478
+ api . addVariant (
479
+ variant ,
480
+ Object . assign (
481
+ ( { args, wrap } ) => {
482
+ let formatString = variants [ variant ] ( args )
483
+ if ( ! formatString ) return null
484
+
485
+ if ( ! formatString . startsWith ( '@' ) ) {
486
+ return formatString
487
+ }
488
+
489
+ let [ , name , params ] = / @ ( .* ?) ( .+ | [ ( { ] .* ) / g. exec ( formatString )
490
+ return wrap ( postcss . atRule ( { name, params : params . trim ( ) } ) )
491
+ } ,
492
+ { [ MATCH_VARIANT ] : true }
493
+ ) ,
494
+ options
495
+ )
496
+ }
497
+ } ,
465
498
}
499
+
500
+ return api
466
501
}
467
502
468
503
let fileModifiedMapCache = new WeakMap ( )
0 commit comments