Skip to content

Commit 8eca436

Browse files
authored
Reduce specificity of * variant (#14056)
This PR reduces the specificity of the * variant so that classes directly on the child elements take precedence over the styles applied by the parent. Previously a utility like `*:flex` would generate this CSS: ```css .\*\:flex > * { display: flex; } ``` This selector has a specificity of `0,1,0`, which is the same as the specificity for a bare utility class like `flex`, `block`, or `grid`. Because variants always appear later in the CSS file than bare utilities, this means that given this HTML, the `grid` class on the child element would have no effect: ```html <div class="*:flex"> <div>...</div> <div class="grid">...</div> <div>...</div> </div> ``` After this PR, the `*:flex` utility generates this CSS instead: ```css :where(.\*\:flex > *) { display: flex; } ``` This selector has a specificity of `0,0,0`, so even though it appears later in the CSS, a bare utility with a specificity of `0,1,0` will still take precedence. This is something we wanted to do when we first introduced the `*` variant in the v3 series, but couldn't because having such a low specificity meant that styles in Preflight would take precedence over utilities like `*:flex`, which is not would anyone would want. We can make this change for v4 because now all of Preflight is wrapped in a dedicated `@layer`, and rules from later layers always take precedence over rules from earlier layers even if the rule in the later layer has a lower specificity. --------- Co-authored-by: Adam Wathan <[email protected]>
1 parent f4bb9a8 commit 8eca436

File tree

3 files changed

+6
-2
lines changed

3 files changed

+6
-2
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2424
- Add `@variant` at-rule for defining custom variants in CSS ([#13992](https://github.com/tailwindlabs/tailwindcss/pull/13992), [#14008](https://github.com/tailwindlabs/tailwindcss/pull/14008))
2525
- Add `@utility` at-rule for defining custom utilities in CSS ([#14044](https://github.com/tailwindlabs/tailwindcss/pull/14044))
2626

27+
### Changed
28+
29+
- Reduce the specificity of the `*` variant so those styles can be overridden by child elements ([#14056](https://github.com/tailwindlabs/tailwindcss/pull/14056))
30+
2731
## [4.0.0-alpha.17] - 2024-07-04
2832

2933
### Added

packages/tailwindcss/src/variants.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ test('force', () => {
1414

1515
test('*', () => {
1616
expect(run(['*:flex'])).toMatchInlineSnapshot(`
17-
".\\*\\:flex > * {
17+
":where(.\\*\\:flex > *) {
1818
display: flex;
1919
}"
2020
`)

packages/tailwindcss/src/variants.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ export function createVariants(theme: Theme): Variants {
201201
}
202202

203203
variants.static('force', () => {}, { compounds: false })
204-
staticVariant('*', ['& > *'], { compounds: false })
204+
staticVariant('*', [':where(& > *)'], { compounds: false })
205205

206206
variants.compound('not', (ruleNode, variant) => {
207207
if (variant.modifier) return null

0 commit comments

Comments
 (0)