2021-04-02 14:34:50 -04:00

296 lines
9.0 KiB
JavaScript

const postcss = require('postcss')
const buildMediaQuery = require('../../lib/util/buildMediaQuery').default
const prefixSelector = require('../../lib/util/prefixSelector').default
const {
updateLastClasses,
updateAllClasses,
transformAllSelectors,
transformAllClasses,
transformLastClasses,
} = require('../pluginUtils')
module.exports = {
pseudoClassVariants: function ({ config, addVariant }) {
let pseudoVariants = [
['first', 'first-child'],
['last', 'last-child'],
['odd', 'nth-child(odd)'],
['even', 'nth-child(even)'],
'visited',
'checked',
'focus-within',
'hover',
'focus',
'focus-visible',
'active',
'disabled',
]
for (let variant of pseudoVariants) {
let [variantName, state] = Array.isArray(variant) ? variant : [variant, variant]
addVariant(
variantName,
transformAllClasses((className, { withPseudo }) => {
return withPseudo(`${variantName}${config('separator')}${className}`, state)
})
)
}
for (let variant of pseudoVariants) {
let [variantName, state] = Array.isArray(variant) ? variant : [variant, variant]
let groupVariantName = `group-${variantName}`
addVariant(
groupVariantName,
transformAllSelectors((selector) => {
let variantSelector = updateAllClasses(selector, (className) => {
return `${groupVariantName}${config('separator')}${className}`
})
if (variantSelector === selector) {
return null
}
let groupSelector = prefixSelector(
config('prefix'),
`.group${config('separator')}${state}`
)
return `${groupSelector} ${variantSelector}`
})
)
}
},
directionVariants: function ({ config, addVariant }) {
addVariant(
'ltr',
transformAllSelectors(
(selector) =>
`[dir="ltr"] ${updateAllClasses(
selector,
(className) => `ltr${config('separator')}${className}`
)}`
)
)
addVariant(
'rtl',
transformAllSelectors(
(selector) =>
`[dir="rtl"] ${updateAllClasses(
selector,
(className) => `rtl${config('separator')}${className}`
)}`
)
)
},
reducedMotionVariants: function ({ config, addVariant }) {
addVariant(
'motion-safe',
transformLastClasses(
(className) => {
return `motion-safe${config('separator')}${className}`
},
() => postcss.atRule({ name: 'media', params: '(prefers-reduced-motion: no-preference)' })
)
)
addVariant(
'motion-reduce',
transformLastClasses(
(className) => {
return `motion-reduce${config('separator')}${className}`
},
() => postcss.atRule({ name: 'media', params: '(prefers-reduced-motion: reduce)' })
)
)
},
darkVariants: function ({ config, addVariant }) {
if (config('darkMode') === 'class') {
addVariant(
'dark',
transformAllSelectors((selector) => {
let variantSelector = updateLastClasses(selector, (className) => {
return `dark${config('separator')}${className}`
})
if (variantSelector === selector) {
return null
}
let darkSelector = prefixSelector(config('prefix'), `.dark`)
return `${darkSelector} ${variantSelector}`
})
)
} else if (config('darkMode') === 'media') {
addVariant(
'dark',
transformLastClasses(
(className) => {
return `dark${config('separator')}${className}`
},
() => postcss.atRule({ name: 'media', params: '(prefers-color-scheme: dark)' })
)
)
}
},
screenVariants: function ({ config, theme, addVariant }) {
for (let screen in theme('screens')) {
let size = theme('screens')[screen]
let query = buildMediaQuery(size)
addVariant(
screen,
transformLastClasses(
(className) => {
return `${screen}${config('separator')}${className}`
},
() => postcss.atRule({ name: 'media', params: query })
)
)
}
},
// Base
preflight: require('./preflight'),
// Components
container: require('./container'),
// Utilitiles
accessibility: require('./accessibility'),
pointerEvents: require('./pointerEvents'),
visibility: require('./visibility'),
position: require('./position'),
inset: require('./inset'),
zIndex: require('./zIndex'),
order: require('./order'),
gridColumn: require('./gridColumn'),
gridColumnEnd: require('./gridColumnEnd'),
gridColumnStart: require('./gridColumnStart'),
gridRow: require('./gridRow'),
gridRowEnd: require('./gridRowEnd'),
gridRowStart: require('./gridRowStart'),
float: require('./float'),
clear: require('./clear'),
margin: require('./margin'),
boxSizing: require('./boxSizing'),
display: require('./display'),
height: require('./height'),
maxHeight: require('./maxHeight'),
minHeight: require('./minHeight'),
width: require('./width'),
minWidth: require('./minWidth'),
maxWidth: require('./maxWidth'),
flex: require('./flex'),
flexShrink: require('./flexShrink'),
flexGrow: require('./flexGrow'),
tableLayout: require('./tableLayout'),
borderCollapse: require('./borderCollapse'),
transform: require('./transform'),
transformOrigin: require('./transformOrigin'),
translate: require('./translate'),
rotate: require('./rotate'),
skew: require('./skew'),
scale: require('./scale'),
animation: require('./animation'),
cursor: require('./cursor'),
userSelect: require('./userSelect'),
resize: require('./resize'),
listStylePosition: require('./listStylePosition'),
listStyleType: require('./listStyleType'),
appearance: require('./appearance'),
gridAutoColumns: require('./gridAutoColumns'),
gridAutoFlow: require('./gridAutoFlow'),
gridAutoRows: require('./gridAutoRows'),
gridTemplateColumns: require('./gridTemplateColumns'),
gridTemplateRows: require('./gridTemplateRows'),
flexDirection: require('./flexDirection'),
flexWrap: require('./flexWrap'),
placeContent: require('./placeContent'),
placeItems: require('./placeItems'),
alignContent: require('./alignContent'),
alignItems: require('./alignItems'),
justifyContent: require('./justifyContent'),
justifyItems: require('./justifyItems'),
gap: require('./gap'),
space: require('./space'),
divideWidth: require('./divideWidth'),
divideStyle: require('./divideStyle'),
divideColor: require('./divideColor'),
divideOpacity: require('./divideOpacity'),
placeSelf: require('./placeSelf'),
alignSelf: require('./alignSelf'),
justifySelf: require('./justifySelf'),
overflow: require('./overflow'),
overscrollBehavior: require('./overscrollBehavior'),
textOverflow: require('./textOverflow'),
whitespace: require('./whitespace'),
wordBreak: require('./wordBreak'),
borderRadius: require('./borderRadius'),
borderWidth: require('./borderWidth'),
borderStyle: require('./borderStyle'),
borderColor: require('./borderColor'),
borderOpacity: require('./borderOpacity'),
backgroundColor: require('./backgroundColor'),
backgroundOpacity: require('./backgroundOpacity'),
backgroundImage: require('./backgroundImage'),
gradientColorStops: require('./gradientColorStops'),
backgroundSize: require('./backgroundSize'),
backgroundAttachment: require('./backgroundAttachment'),
backgroundClip: require('./backgroundClip'),
backgroundPosition: require('./backgroundPosition'),
backgroundRepeat: require('./backgroundRepeat'),
fill: require('./fill'),
stroke: require('./stroke'),
strokeWidth: require('./strokeWidth'),
objectFit: require('./objectFit'),
objectPosition: require('./objectPosition'),
padding: require('./padding'),
textAlign: require('./textAlign'),
verticalAlign: require('./verticalAlign'),
fontFamily: require('./fontFamily'),
fontSize: require('./fontSize'),
fontWeight: require('./fontWeight'),
textTransform: require('./textTransform'),
fontStyle: require('./fontStyle'),
fontVariantNumeric: require('./fontVariantNumeric'),
lineHeight: require('./lineHeight'),
letterSpacing: require('./letterSpacing'),
textColor: require('./textColor'),
textOpacity: require('./textOpacity'),
textDecoration: require('./textDecoration'),
fontSmoothing: require('./fontSmoothing'),
placeholderColor: require('./placeholderColor'),
placeholderOpacity: require('./placeholderOpacity'),
opacity: require('./opacity'),
boxShadow: require('./boxShadow'),
outline: require('./outline'),
ringWidth: require('./ringWidth'),
ringColor: require('./ringColor'),
ringOpacity: require('./ringOpacity'),
ringOffsetWidth: require('./ringOffsetWidth'),
ringOffsetColor: require('./ringOffsetColor'),
transitionProperty: require('./transitionProperty'),
transitionDelay: require('./transitionDelay'),
transitionDuration: require('./transitionDuration'),
transitionTimingFunction: require('./transitionTimingFunction'),
}