From 205590b36ceb893ec7a52d3699a7f3c2c0a64fb6 Mon Sep 17 00:00:00 2001 From: Robin Malfait Date: Mon, 9 May 2022 17:05:00 +0200 Subject: [PATCH] WIP --- src/lib/generateRules.js | 9 +++++++++ src/lib/setupContextUtils.js | 24 +++++++++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/lib/generateRules.js b/src/lib/generateRules.js index a14f7163a076..363e3e1c9f1a 100644 --- a/src/lib/generateRules.js +++ b/src/lib/generateRules.js @@ -127,6 +127,14 @@ function applyVariant(variant, matches, context) { return matches } + let args + + // Find partial arbitrary variants + if (variant.endsWith(']') && !variant.startsWith('[]')) { + args = variant.slice(variant.lastIndexOf('[') + 1, -1) + variant = variant.slice(0, variant.indexOf(args) - 1 /* - */ - 1 /* [ */) + } + // Register arbitrary variants if (isArbitraryValue(variant) && !context.variantMap.has(variant)) { let selector = normalize(variant.slice(1, -1)) @@ -200,6 +208,7 @@ function applyVariant(variant, matches, context) { format(selectorFormat) { collectedFormats.push(selectorFormat) }, + args, }) if (typeof ruleWithVariant === 'string') { diff --git a/src/lib/setupContextUtils.js b/src/lib/setupContextUtils.js index 573341a6c488..b8625b44942c 100644 --- a/src/lib/setupContextUtils.js +++ b/src/lib/setupContextUtils.js @@ -22,6 +22,8 @@ import isValidArbitraryValue from '../util/isValidArbitraryValue' import { generateRules } from './generateRules' import { hasContentChanged } from './cacheInvalidation.js' +let MATCH_VARIANT = Symbol() + function prefix(context, selector) { let prefix = context.tailwindConfig.prefix return typeof prefix === 'function' ? prefix(selector) : prefix + selector @@ -215,13 +217,18 @@ function buildPluginApi(tailwindConfig, context, { variantList, variantMap, offs return context.tailwindConfig.prefix + identifier } - return { + let api = { addVariant(variantName, variantFunctions, options = {}) { variantFunctions = [].concat(variantFunctions).map((variantFunction) => { if (typeof variantFunction !== 'string') { // Safelist public API functions - return ({ modifySelectors, container, separator }) => { - return variantFunction({ modifySelectors, container, separator }) + return ({ args, modifySelectors, container, separator }) => { + return variantFunction( + Object.assign( + { modifySelectors, container, separator }, + variantFunction[MATCH_VARIANT] && { args } + ) + ) } } @@ -444,7 +451,18 @@ function buildPluginApi(tailwindConfig, context, { variantList, variantMap, offs context.candidateRuleMap.get(prefixedIdentifier).push(withOffsets) } }, + matchVariant: function (variants, options) { + for (let variant in variants) { + api.addVariant( + variant, + Object.assign(({ args }) => variants[variant](args), { [MATCH_VARIANT]: true }), + options + ) + } + }, } + + return api } let fileModifiedMapCache = new WeakMap()