mirror of
https://github.com/tailwindlabs/tailwindcss.git
synced 2026-01-18 16:17:36 +00:00
50 lines
1.3 KiB
JavaScript
50 lines
1.3 KiB
JavaScript
import _ from 'lodash'
|
|
import postcss from 'postcss'
|
|
import selectorParser from 'postcss-selector-parser'
|
|
import { useMemo } from './useMemo'
|
|
|
|
const classNameParser = selectorParser((selectors) => {
|
|
return selectors.first.filter(({ type }) => type === 'class').pop().value
|
|
})
|
|
|
|
const getClassNameFromSelector = useMemo(
|
|
(selector) => classNameParser.transformSync(selector),
|
|
(selector) => selector
|
|
)
|
|
|
|
export default function generateVariantFunction(generator, options = {}) {
|
|
return {
|
|
options,
|
|
handler: (container, config) => {
|
|
const cloned = postcss.root({ nodes: container.clone().nodes })
|
|
|
|
container.before(
|
|
_.defaultTo(
|
|
generator({
|
|
container: cloned,
|
|
separator: config.separator,
|
|
modifySelectors: (modifierFunction) => {
|
|
cloned.each((rule) => {
|
|
if (rule.type !== 'rule') {
|
|
return
|
|
}
|
|
|
|
rule.selectors = rule.selectors.map((selector) => {
|
|
return modifierFunction({
|
|
get className() {
|
|
return getClassNameFromSelector(selector)
|
|
},
|
|
selector,
|
|
})
|
|
})
|
|
})
|
|
return cloned
|
|
},
|
|
}),
|
|
cloned
|
|
).nodes
|
|
)
|
|
},
|
|
}
|
|
}
|