Skip to content

Commit 0573c07

Browse files
authored
Loosen :is() wrapping rules in applyImportantSelector for more readable output. (#13900)
1 parent 9c29e47 commit 0573c07

File tree

2 files changed

+16
-18
lines changed

2 files changed

+16
-18
lines changed

src/util/applyImportantSelector.js

+5-6
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@ export function applyImportantSelector(selector, important) {
55
let sel = parser().astSync(selector)
66

77
sel.each((sel) => {
8-
// Wrap with :is if it's not already wrapped
9-
let isWrapped =
10-
sel.nodes[0].type === 'pseudo' &&
11-
sel.nodes[0].value === ':is' &&
12-
sel.nodes.every((node) => node.type !== 'combinator')
8+
// For nesting, we only need to wrap a selector with :is() if it has a top-level combinator,
9+
// e.g. `.dark .text-white`, to be independent of DOM order. Any other selector, including
10+
// combinators inside of pseudos like `:where()`, are ok to nest.
11+
let shouldWrap = sel.nodes.some((node) => node.type === 'combinator')
1312

14-
if (!isWrapped) {
13+
if (shouldWrap) {
1514
sel.nodes = [
1615
parser.pseudo({
1716
value: ':is',

tests/util/apply-important-selector.test.js

+11-12
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,23 @@ import { applyImportantSelector } from '../../src/util/applyImportantSelector'
22

33
it.each`
44
before | after
5-
${'.foo'} | ${'#app :is(.foo)'}
5+
${'.foo'} | ${'#app .foo'}
66
${'.foo .bar'} | ${'#app :is(.foo .bar)'}
7-
${'.foo:hover'} | ${'#app :is(.foo:hover)'}
7+
${'.foo:hover'} | ${'#app .foo:hover'}
88
${'.foo .bar:hover'} | ${'#app :is(.foo .bar:hover)'}
9-
${'.foo::before'} | ${'#app :is(.foo)::before'}
10-
${'.foo::before'} | ${'#app :is(.foo)::before'}
11-
${'.foo::file-selector-button'} | ${'#app :is(.foo)::file-selector-button'}
12-
${'.foo::-webkit-progress-bar'} | ${'#app :is(.foo)::-webkit-progress-bar'}
13-
${'.foo:hover::before'} | ${'#app :is(.foo:hover)::before'}
9+
${'.foo::before'} | ${'#app .foo::before'}
10+
${'.foo::file-selector-button'} | ${'#app .foo::file-selector-button'}
11+
${'.foo::-webkit-progress-bar'} | ${'#app .foo::-webkit-progress-bar'}
12+
${'.foo:hover::before'} | ${'#app .foo:hover::before'}
1413
${':is(:where(.dark) :is(:where([dir="rtl"]) .foo::before))'} | ${'#app :is(:where(.dark) :is(:where([dir="rtl"]) .foo))::before'}
1514
${':is(:where(.dark) .foo) .bar'} | ${'#app :is(:is(:where(.dark) .foo) .bar)'}
1615
${':is(.foo) :is(.bar)'} | ${'#app :is(:is(.foo) :is(.bar))'}
1716
${':is(.foo)::before'} | ${'#app :is(.foo)::before'}
18-
${'.foo:before'} | ${'#app :is(.foo):before'}
19-
${'.foo::some-uknown-pseudo'} | ${'#app :is(.foo)::some-uknown-pseudo'}
20-
${'.foo::some-uknown-pseudo:hover'} | ${'#app :is(.foo)::some-uknown-pseudo:hover'}
21-
${'.foo:focus::some-uknown-pseudo:hover'} | ${'#app :is(.foo:focus)::some-uknown-pseudo:hover'}
22-
${'.foo:hover::some-uknown-pseudo:focus'} | ${'#app :is(.foo:hover)::some-uknown-pseudo:focus'}
17+
${'.foo:before'} | ${'#app .foo:before'}
18+
${'.foo::some-uknown-pseudo'} | ${'#app .foo::some-uknown-pseudo'}
19+
${'.foo::some-uknown-pseudo:hover'} | ${'#app .foo::some-uknown-pseudo:hover'}
20+
${'.foo:focus::some-uknown-pseudo:hover'} | ${'#app .foo:focus::some-uknown-pseudo:hover'}
21+
${'.foo:hover::some-uknown-pseudo:focus'} | ${'#app .foo:hover::some-uknown-pseudo:focus'}
2322
`('should generate "$after" from "$before"', ({ before, after }) => {
2423
expect(applyImportantSelector(before, '#app')).toEqual(after)
2524
})

0 commit comments

Comments
 (0)