Skip to content

Commit

Permalink
Fix conflics, refactor variant generator
Browse files Browse the repository at this point in the history
  • Loading branch information
adamwathan committed Mar 13, 2018
2 parents 79b09dc + b7cb213 commit cc968d1
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 19 deletions.
27 changes: 25 additions & 2 deletions __tests__/variantsAtRule.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,27 @@ test('it can generate hover variants', () => {
})
})

test('it can generate active variants', () => {
const input = `
@variants active {
.banana { color: yellow; }
.chocolate { color: brown; }
}
`

const output = `
.banana { color: yellow; }
.chocolate { color: brown; }
.active\\:banana:active { color: yellow; }
.active\\:chocolate:active { color: brown; }
`

return run(input).then(result => {
expect(result.css).toMatchCss(output)
expect(result.warnings().length).toBe(0)
})
})

test('it can generate focus variants', () => {
const input = `
@variants focus {
Expand Down Expand Up @@ -69,9 +90,9 @@ test('it can generate group-hover variants', () => {
})
})

test('it can generate all variants', () => {
test('it can generate hover, active and focus variants', () => {
const input = `
@variants hover, focus, group-hover {
@variants hover, active, group-hover, focus {
.banana { color: yellow; }
.chocolate { color: brown; }
}
Expand All @@ -86,6 +107,8 @@ test('it can generate all variants', () => {
.hover\\:chocolate:hover { color: brown; }
.focus\\:banana:focus { color: yellow; }
.focus\\:chocolate:focus { color: brown; }
.active\\:banana:active { color: yellow; }
.active\\:chocolate:active { color: brown; }
`

return run(input).then(result => {
Expand Down
3 changes: 2 additions & 1 deletion defaultConfig.stub.js
Original file line number Diff line number Diff line change
Expand Up @@ -824,7 +824,8 @@ module.exports = {
| Here is where you control which modules are generated and what variants are
| generated for each of those modules.
|
| Currently supported variants: 'responsive', 'hover', 'focus', 'group-hover'
| Currently supported variants: 'responsive', 'hover', 'active', focus',
| 'group-hover'
|
| To disable a module completely, use `false` instead of an array.
|
Expand Down
32 changes: 16 additions & 16 deletions src/lib/substituteVariantsAtRules.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,35 +2,35 @@ import _ from 'lodash'
import postcss from 'postcss'
import buildClassVariant from '../util/buildClassVariant'

const variantGenerators = {
hover: (container, config) => {
const cloned = container.clone()

cloned.walkRules(rule => {
rule.selector = `${buildClassVariant(rule.selector, 'hover', config.options.separator)}:hover`
})
function buildPseudoClassVariant(selector, pseudoClass, separator) {
return `${buildClassVariant(selector, pseudoClass, separator)}:${pseudoClass}`
}

container.before(cloned.nodes)
},
focus: (container, config) => {
function generatePseudoClassVariant(pseudoClass) {
return (container, config) => {
const cloned = container.clone()

cloned.walkRules(rule => {
rule.selector = `${buildClassVariant(rule.selector, 'focus', config.options.separator)}:focus`
rule.selector = buildPseudoClassVariant(rule.selector, pseudoClass, config.options.separator)
})

container.before(cloned.nodes)
},
'group-hover': (container, config) => {
}
}

const variantGenerators = {
'group-hover': (container, { options: { separator } }) => {
const cloned = container.clone()

cloned.walkRules(rule => {
// prettier-ignore
rule.selector = `.group:hover ${buildClassVariant(rule.selector, 'group-hover', config.options.separator)}`
rule.selector = `.group:hover ${buildClassVariant(rule.selector, 'group-hover', separator)}`
})

container.before(cloned.nodes)
},
hover: generatePseudoClassVariant('hover'),
focus: generatePseudoClassVariant('focus'),
active: generatePseudoClassVariant('active'),
}

export default function(config) {
Expand All @@ -48,7 +48,7 @@ export default function(config) {

atRule.before(atRule.clone().nodes)

_.forEach(['group-hover', 'hover', 'focus'], variant => {
_.forEach(['group-hover', 'hover', 'focus', 'active'], variant => {
if (variants.includes(variant)) {
variantGenerators[variant](atRule, unwrappedConfig)
}
Expand Down

0 comments on commit cc968d1

Please sign in to comment.