Skip to content

Commit

Permalink
Only generate variants for non-user layers (#6589)
Browse files Browse the repository at this point in the history
* only generate variants for non-user layers

If you have the following css:

```css
@tailwind utilities;
.foo {
  color: red;
}
```

And you HTML looks like this:
```html
<div class="hover:foo"></div>
```

Then the output should _not_ generate a `.hover\:foo {}` class.

* ensure that you can apply user csss (without variants)

* update changelog
  • Loading branch information
RobinMalfait committed Dec 17, 2021
1 parent 7089a80 commit 2fdbe10
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

- Don't mutate custom color palette when overriding per-plugin colors ([#6546](https://github.com/tailwindlabs/tailwindcss/pull/6546))
- Improve circular dependency detection when using `@apply` ([#6588](https://github.com/tailwindlabs/tailwindcss/pull/6588))
- Only generate variants for non-`user` layers ([#6589](https://github.com/tailwindlabs/tailwindcss/pull/6589))

## [3.0.6] - 2021-12-16

Expand Down
5 changes: 5 additions & 0 deletions src/lib/generateRules.js
Expand Up @@ -112,6 +112,11 @@ function applyVariant(variant, matches, context) {
let result = []

for (let [meta, rule] of matches) {
// Don't generate variants for user css
if (meta.layer === 'user') {
continue
}

let container = postcss.root({ nodes: [rule.clone()] })

for (let [variantSort, variantFunction] of variantFunctionTuples) {
Expand Down
58 changes: 58 additions & 0 deletions tests/apply.test.js
Expand Up @@ -654,3 +654,61 @@ it('rules with vendor prefixes are still separate when optimizing defaults rules
`)
})
})

it('should be possible to apply user css', () => {
let config = {
content: [{ raw: html`<div></div>` }],
plugins: [],
}

let input = css`
@tailwind components;
@tailwind utilities;
.foo {
color: red;
}
.bar {
@apply foo;
}
`

return run(input, config).then((result) => {
return expect(result.css).toMatchFormattedCss(css`
.foo {
color: red;
}
.bar {
color: red;
}
`)
})
})

it('should not be possible to apply user css with variants', () => {
let config = {
content: [{ raw: html`<div></div>` }],
plugins: [],
}

let input = css`
@tailwind components;
@tailwind utilities;
.foo {
color: red;
}
.bar {
@apply hover:foo;
}
`

return run(input, config).catch((err) => {
expect(err.reason).toBe(
'The `hover:foo` class does not exist. If `hover:foo` is a custom class, make sure it is defined within a `@layer` directive.'
)
})
})
24 changes: 24 additions & 0 deletions tests/variants.test.js
Expand Up @@ -421,3 +421,27 @@ test('before and after variants are a bit special, and forced to the end (2)', (
`)
})
})

it('should not generate variants of user css if it is not inside a layer', () => {
let config = {
content: [{ raw: html`<div class="hover:foo"></div>` }],
plugins: [],
}

let input = css`
@tailwind components;
@tailwind utilities;
.foo {
color: red;
}
`

return run(input, config).then((result) => {
return expect(result.css).toMatchFormattedCss(css`
.foo {
color: red;
}
`)
})
})

0 comments on commit 2fdbe10

Please sign in to comment.