Fix @apply of user utilities when negative and non-negative versions both exist (#9027)

* Fix application of rules with multiple matches of differing selectors

`-foo-1` and `foo-1` are both matches for the class `-foo-1` but `@apply` only wants the first one. It would remove the second one and cause an error because it’s an entirely separate match that had it’s only rule removed.

* Update changelog
This commit is contained in:
Jordan Pittman 2022-08-04 14:24:17 -04:00 committed by GitHub
parent 2bfd3e7423
commit 20456efae4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 43 additions and 0 deletions

View File

@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Dont prefix classes within reused arbitrary variants ([#8992](https://github.com/tailwindlabs/tailwindcss/pull/8992))
- Fix usage of alpha values inside single-named colors that are functions ([#9008](https://github.com/tailwindlabs/tailwindcss/pull/9008))
- Fix `@apply` of user utilities when negative and non-negative versions both exist ([#9027](https://github.com/tailwindlabs/tailwindcss/pull/9027))
### Changed

View File

@ -499,6 +499,12 @@ function processApply(root, context, localCache) {
})
}
// It could be that the node we were inserted was removed because the class didn't match
// If that was the *only* rule in the parent, then we have nothing add so we skip it
if (!root.nodes[0]) {
continue
}
// Insert it
siblings.push([
// Ensure that when we are sorting, that we take the layer order into account

View File

@ -1548,3 +1548,39 @@ it('apply + user CSS + selector variants (like group) + important selector (2)',
}
`)
})
it('can apply user utilities that start with a dash', async () => {
let config = {
content: [{ raw: html`<div class="foo-1 -foo-1 new-class"></div>` }],
plugins: [],
}
let input = css`
@tailwind utilities;
@layer utilities {
.foo-1 {
margin: 10px;
}
.-foo-1 {
margin: -15px;
}
.new-class {
@apply -foo-1;
}
}
`
let result = await run(input, config)
expect(result.css).toMatchFormattedCss(css`
.foo-1 {
margin: 10px;
}
.-foo-1 {
margin: -15px;
}
.new-class {
margin: -15px;
}
`)
})