Skip to content

Commit

Permalink
Only add ! to selector class matching template candidate (#7664)
Browse files Browse the repository at this point in the history
* Only add `!` to selector class matching template candidate

Fixes #7226.

Before this PR, if you had a class like:

```css
.one .two {
  background: black
}
```

...and then used `!one` in your template, the generated CSS would be this:

```css
.\!one .\!two {
  background: black !important
}
```

This would cause the styles to not be applied unless you also added `!` to the beginning of other classes in the template that are part of this selector.

This PR makes sure that other classes in the selector aren't mistakenly prefixed with `!`, so that you can add `!` to only one of the classes in your template and get the expected result.

* Update CHANGELOG
  • Loading branch information
adamwathan committed Feb 25, 2022
1 parent bd16763 commit f7a9d37
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 3 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Split box shadows on top-level commas only ([#7479](https://github.com/tailwindlabs/tailwindcss/pull/7479))
- Use local user CSS cache for `@apply` ([#7524](https://github.com/tailwindlabs/tailwindcss/pull/7524))
- Invalidate context when main CSS changes ([#7626](https://github.com/tailwindlabs/tailwindcss/pull/7626))
- Only add `!` to selector class matching template candidate when using important modifier with mutli-class selectors ([#7664](https://github.com/tailwindlabs/tailwindcss/pull/7664))

### Changed

Expand Down
9 changes: 6 additions & 3 deletions src/lib/generateRules.js
Expand Up @@ -88,7 +88,7 @@ function applyPrefix(matches, context) {
return matches
}

function applyImportant(matches) {
function applyImportant(matches, classCandidate) {
if (matches.length === 0) {
return matches
}
Expand All @@ -98,7 +98,10 @@ function applyImportant(matches) {
let container = postcss.root({ nodes: [rule.clone()] })
container.walkRules((r) => {
r.selector = updateAllClasses(r.selector, (className) => {
return `!${className}`
if (className === classCandidate) {
return `!${className}`
}
return className
})
r.walkDecls((d) => (d.important = true))
})
Expand Down Expand Up @@ -514,7 +517,7 @@ function* resolveMatches(candidate, context) {
matches = applyPrefix(matches, context)

if (important) {
matches = applyImportant(matches, context)
matches = applyImportant(matches, classCandidate)
}

for (let variant of variants) {
Expand Down
19 changes: 19 additions & 0 deletions tests/important-modifier.test.js
Expand Up @@ -17,6 +17,22 @@ test('important modifier', () => {
},
],
corePlugins: { preflight: false },
plugins: [
function ({ theme, matchUtilities }) {
matchUtilities(
{
'custom-parent': (value) => {
return {
'.custom-child': {
margin: value,
},
}
},
},
{ values: theme('spacing') }
)
},
],
}

let input = css`
Expand Down Expand Up @@ -57,6 +73,9 @@ test('important modifier', () => {
.\!font-bold {
font-weight: 700 !important;
}
.\!custom-parent-5 .custom-child {
margin: 1.25rem !important;
}
.hover\:\!text-center:hover {
text-align: center !important;
}
Expand Down

0 comments on commit f7a9d37

Please sign in to comment.