Support for basic variant generator plugins

Allows you to write a plugin that registers a new variant but only
allows you to modify the selector (like what our built-in generators
do.)

Next steps are to support variants that wrap rules with at-rules
(like @supports for example), variants that can modify properties
(as opposed to just selectors), and to give variant plugin authors
control over how responsive variants interact with their own variants.
This commit is contained in:
Adam Wathan 2018-06-22 12:30:30 -04:00
parent 9eca69ad83
commit d77bc055ee
4 changed files with 59 additions and 2 deletions

View file

@ -14,6 +14,21 @@ function parseStyles(styles) {
return _.flatMap(styles, style => (style instanceof Node ? style : parseObjectStyles(style)))
}
function generateVariantFunction(generator) {
return (container, config) => {
const cloned = container.clone()
cloned.walkRules(rule => {
rule.selector = generator({
className: rule.selector.slice(1),
separator: escapeClassName(config.options.separator),
})
})
container.before(cloned.nodes)
}
}
export default function(config) {
const pluginComponents = []
const pluginUtilities = []
@ -60,6 +75,9 @@ export default function(config) {
pluginComponents.push(...styles.nodes)
},
addVariant: (name, generator) => {
pluginVariantGenerators[name] = generateVariantFunction(generator)
},
})
})