Skip to content

Commit 6b1eb19

Browse files
Split ::backdrop into separate defaults group (#8567)
* Split `::backdrop` into separate defaults group * Update tests * Update changelog
1 parent 7aa2d4d commit 6b1eb19

16 files changed

+650
-352
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010
### Fixed
1111

1212
- Fix candidate extractor regression ([#8558](https://github.com/tailwindlabs/tailwindcss/pull/8558))
13+
- Split `::backdrop`` into separate defaults group ([#8567](https://github.com/tailwindlabs/tailwindcss/pull/8567))
1314

1415
## [3.1.0] - 2022-06-08
1516

src/lib/resolveDefaultsAtRules.js

+53-36
Original file line numberDiff line numberDiff line change
@@ -91,56 +91,73 @@ export default function resolveDefaultsAtRules({ tailwindConfig }) {
9191
rule.remove()
9292
})
9393

94-
for (let universal of universals) {
95-
/** @type {Map<string, Set<string>>} */
96-
let selectorGroups = new Map()
94+
if (flagEnabled(tailwindConfig, 'optimizeUniversalDefaults')) {
95+
for (let universal of universals) {
96+
/** @type {Map<string, Set<string>>} */
97+
let selectorGroups = new Map()
98+
99+
let rules = variableNodeMap.get(universal.params) ?? []
100+
101+
for (let rule of rules) {
102+
for (let selector of extractElementSelector(rule.selector)) {
103+
// If selector contains a vendor prefix after a pseudo element or class,
104+
// we consider them separately because merging the declarations into
105+
// a single rule will cause browsers that do not understand the
106+
// vendor prefix to throw out the whole rule
107+
let selectorGroupName =
108+
selector.includes(':-') || selector.includes('::-') ? selector : '__DEFAULT__'
109+
110+
let selectors = selectorGroups.get(selectorGroupName) ?? new Set()
111+
selectorGroups.set(selectorGroupName, selectors)
112+
113+
selectors.add(selector)
114+
}
115+
}
97116

98-
let rules = variableNodeMap.get(universal.params) ?? []
117+
if (flagEnabled(tailwindConfig, 'optimizeUniversalDefaults')) {
118+
if (selectorGroups.size === 0) {
119+
universal.remove()
120+
continue
121+
}
99122

100-
for (let rule of rules) {
101-
for (let selector of extractElementSelector(rule.selector)) {
102-
// If selector contains a vendor prefix after a pseudo element or class,
103-
// we consider them separately because merging the declarations into
104-
// a single rule will cause browsers that do not understand the
105-
// vendor prefix to throw out the whole rule
106-
let selectorGroupName =
107-
selector.includes(':-') || selector.includes('::-') ? selector : '__DEFAULT__'
123+
for (let [, selectors] of selectorGroups) {
124+
let universalRule = postcss.rule({
125+
source: universal.source,
126+
})
108127

109-
let selectors = selectorGroups.get(selectorGroupName) ?? new Set()
110-
selectorGroups.set(selectorGroupName, selectors)
128+
universalRule.selectors = [...selectors]
111129

112-
selectors.add(selector)
130+
universalRule.append(universal.nodes.map((node) => node.clone()))
131+
universal.before(universalRule)
132+
}
113133
}
114-
}
115134

116-
if (flagEnabled(tailwindConfig, 'optimizeUniversalDefaults')) {
117-
if (selectorGroups.size === 0) {
118-
universal.remove()
119-
continue
120-
}
121-
122-
for (let [, selectors] of selectorGroups) {
123-
let universalRule = postcss.rule({
124-
source: universal.source,
125-
})
135+
universal.remove()
136+
}
137+
} else if (universals.size) {
138+
let universalRule = postcss.rule({
139+
selectors: ['*', '::before', '::after'],
140+
})
126141

127-
universalRule.selectors = [...selectors]
142+
for (let universal of universals) {
143+
universalRule.append(universal.nodes)
128144

129-
universalRule.append(universal.nodes.map((node) => node.clone()))
145+
if (!universalRule.parent) {
130146
universal.before(universalRule)
131147
}
132-
} else {
133-
let universalRule = postcss.rule({
134-
source: universal.source,
135-
})
136148

137-
universalRule.selectors = ['*', '::before', '::after', '::backdrop']
149+
if (!universalRule.source) {
150+
universalRule.source = universal.source
151+
}
138152

139-
universalRule.append(universal.nodes)
140-
universal.before(universalRule)
153+
universal.remove()
141154
}
142155

143-
universal.remove()
156+
let backdropRule = universalRule.clone({
157+
selectors: ['::backdrop'],
158+
})
159+
160+
universalRule.after(backdropRule)
144161
}
145162
}
146163
}

tests/__snapshots__/source-maps.test.js.snap

+46
Original file line numberDiff line numberDiff line change
@@ -309,5 +309,51 @@ Array [
309309
"2:4-18 -> 407:2-27",
310310
"2:4 -> 408:2",
311311
"2:18 -> 409:0",
312+
"2:4 -> 411:0",
313+
"2:4-18 -> 412:2-26",
314+
"2:4-18 -> 413:2-26",
315+
"2:4-18 -> 414:2-21",
316+
"2:4-18 -> 415:2-21",
317+
"2:4-18 -> 416:2-16",
318+
"2:4-18 -> 417:2-16",
319+
"2:4-18 -> 418:2-16",
320+
"2:4-18 -> 419:2-17",
321+
"2:4-18 -> 420:2-17",
322+
"2:4-18 -> 421:2-15",
323+
"2:4-18 -> 422:2-15",
324+
"2:4-18 -> 423:2-20",
325+
"2:4-18 -> 424:2-40",
326+
"2:4-18 -> 425:2-17",
327+
"2:4-18 -> 426:2-22",
328+
"2:4-18 -> 427:2-24",
329+
"2:4-18 -> 428:2-25",
330+
"2:4-18 -> 429:2-26",
331+
"2:4-18 -> 430:2-20",
332+
"2:4-18 -> 431:2-29",
333+
"2:4-18 -> 432:2-30",
334+
"2:4-18 -> 433:2-40",
335+
"2:4-18 -> 434:2-36",
336+
"2:4-18 -> 435:2-29",
337+
"2:4-18 -> 436:2-24",
338+
"2:4-18 -> 437:2-32",
339+
"2:4-18 -> 438:2-14",
340+
"2:4-18 -> 439:2-20",
341+
"2:4-18 -> 440:2-18",
342+
"2:4-18 -> 441:2-19",
343+
"2:4-18 -> 442:2-20",
344+
"2:4-18 -> 443:2-16",
345+
"2:4-18 -> 444:2-18",
346+
"2:4-18 -> 445:2-15",
347+
"2:4-18 -> 446:2-21",
348+
"2:4-18 -> 447:2-23",
349+
"2:4-18 -> 448:2-29",
350+
"2:4-18 -> 449:2-27",
351+
"2:4-18 -> 450:2-28",
352+
"2:4-18 -> 451:2-29",
353+
"2:4-18 -> 452:2-25",
354+
"2:4-18 -> 453:2-26",
355+
"2:4-18 -> 454:2-27",
356+
"2:4 -> 455:2",
357+
"2:18 -> 456:0",
312358
]
313359
`;

tests/basic-usage.test.css

+46-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,51 @@
11
*,
22
::before,
3-
::after,
3+
::after {
4+
--tw-border-spacing-x: 0;
5+
--tw-border-spacing-y: 0;
6+
--tw-translate-x: 0;
7+
--tw-translate-y: 0;
8+
--tw-rotate: 0;
9+
--tw-skew-x: 0;
10+
--tw-skew-y: 0;
11+
--tw-scale-x: 1;
12+
--tw-scale-y: 1;
13+
--tw-pan-x: ;
14+
--tw-pan-y: ;
15+
--tw-pinch-zoom: ;
16+
--tw-scroll-snap-strictness: proximity;
17+
--tw-ordinal: ;
18+
--tw-slashed-zero: ;
19+
--tw-numeric-figure: ;
20+
--tw-numeric-spacing: ;
21+
--tw-numeric-fraction: ;
22+
--tw-ring-inset: ;
23+
--tw-ring-offset-width: 0px;
24+
--tw-ring-offset-color: #fff;
25+
--tw-ring-color: rgb(59 130 246 / 0.5);
26+
--tw-ring-offset-shadow: 0 0 #0000;
27+
--tw-ring-shadow: 0 0 #0000;
28+
--tw-shadow: 0 0 #0000;
29+
--tw-shadow-colored: 0 0 #0000;
30+
--tw-blur: ;
31+
--tw-brightness: ;
32+
--tw-contrast: ;
33+
--tw-grayscale: ;
34+
--tw-hue-rotate: ;
35+
--tw-invert: ;
36+
--tw-saturate: ;
37+
--tw-sepia: ;
38+
--tw-drop-shadow: ;
39+
--tw-backdrop-blur: ;
40+
--tw-backdrop-brightness: ;
41+
--tw-backdrop-contrast: ;
42+
--tw-backdrop-grayscale: ;
43+
--tw-backdrop-hue-rotate: ;
44+
--tw-backdrop-invert: ;
45+
--tw-backdrop-opacity: ;
46+
--tw-backdrop-saturate: ;
47+
--tw-backdrop-sepia: ;
48+
}
449
::backdrop {
550
--tw-border-spacing-x: 0;
651
--tw-border-spacing-y: 0;

tests/basic-usage.test.js

+2-51
Original file line numberDiff line numberDiff line change
@@ -149,56 +149,7 @@ test('default ring color can be a function', () => {
149149

150150
return run(input, config).then((result) => {
151151
expect(result.css).toMatchFormattedCss(css`
152-
*,
153-
::before,
154-
::after,
155-
::backdrop {
156-
--tw-border-spacing-x: 0;
157-
--tw-border-spacing-y: 0;
158-
--tw-translate-x: 0;
159-
--tw-translate-y: 0;
160-
--tw-rotate: 0;
161-
--tw-skew-x: 0;
162-
--tw-skew-y: 0;
163-
--tw-scale-x: 1;
164-
--tw-scale-y: 1;
165-
--tw-pan-x: ;
166-
--tw-pan-y: ;
167-
--tw-pinch-zoom: ;
168-
--tw-scroll-snap-strictness: proximity;
169-
--tw-ordinal: ;
170-
--tw-slashed-zero: ;
171-
--tw-numeric-figure: ;
172-
--tw-numeric-spacing: ;
173-
--tw-numeric-fraction: ;
174-
--tw-ring-inset: ;
175-
--tw-ring-offset-width: 0px;
176-
--tw-ring-offset-color: #fff;
177-
--tw-ring-color: rgba(var(--red), 0.5);
178-
--tw-ring-offset-shadow: 0 0 #0000;
179-
--tw-ring-shadow: 0 0 #0000;
180-
--tw-shadow: 0 0 #0000;
181-
--tw-shadow-colored: 0 0 #0000;
182-
--tw-blur: ;
183-
--tw-brightness: ;
184-
--tw-contrast: ;
185-
--tw-grayscale: ;
186-
--tw-hue-rotate: ;
187-
--tw-invert: ;
188-
--tw-saturate: ;
189-
--tw-sepia: ;
190-
--tw-drop-shadow: ;
191-
--tw-backdrop-blur: ;
192-
--tw-backdrop-brightness: ;
193-
--tw-backdrop-contrast: ;
194-
--tw-backdrop-grayscale: ;
195-
--tw-backdrop-hue-rotate: ;
196-
--tw-backdrop-invert: ;
197-
--tw-backdrop-opacity: ;
198-
--tw-backdrop-saturate: ;
199-
--tw-backdrop-sepia: ;
200-
}
201-
152+
${defaults({ defaultRingColor: 'rgba(var(--red), 0.5)' })}
202153
.ring {
203154
--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width)
204155
var(--tw-ring-offset-color);
@@ -210,7 +161,7 @@ test('default ring color can be a function', () => {
210161
})
211162
})
212163

213-
it('fasly config values still work', () => {
164+
it('falsy config values still work', () => {
214165
let config = {
215166
content: [{ raw: html`<div class="inset-0"></div>` }],
216167
theme: {

tests/collapse-adjacent-rules.test.css

+46-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,52 @@
99
}
1010
*,
1111
::before,
12-
::after,
12+
::after {
13+
--tw-border-spacing-x: 0;
14+
--tw-border-spacing-y: 0;
15+
--tw-translate-x: 0;
16+
--tw-translate-y: 0;
17+
--tw-rotate: 0;
18+
--tw-skew-x: 0;
19+
--tw-skew-y: 0;
20+
--tw-scale-x: 1;
21+
--tw-scale-y: 1;
22+
--tw-pan-x: ;
23+
--tw-pan-y: ;
24+
--tw-pinch-zoom: ;
25+
--tw-scroll-snap-strictness: proximity;
26+
--tw-ordinal: ;
27+
--tw-slashed-zero: ;
28+
--tw-numeric-figure: ;
29+
--tw-numeric-spacing: ;
30+
--tw-numeric-fraction: ;
31+
--tw-ring-inset: ;
32+
--tw-ring-offset-width: 0px;
33+
--tw-ring-offset-color: #fff;
34+
--tw-ring-color: rgb(59 130 246 / 0.5);
35+
--tw-ring-offset-shadow: 0 0 #0000;
36+
--tw-ring-shadow: 0 0 #0000;
37+
--tw-shadow: 0 0 #0000;
38+
--tw-shadow-colored: 0 0 #0000;
39+
--tw-blur: ;
40+
--tw-brightness: ;
41+
--tw-contrast: ;
42+
--tw-grayscale: ;
43+
--tw-hue-rotate: ;
44+
--tw-invert: ;
45+
--tw-saturate: ;
46+
--tw-sepia: ;
47+
--tw-drop-shadow: ;
48+
--tw-backdrop-blur: ;
49+
--tw-backdrop-brightness: ;
50+
--tw-backdrop-contrast: ;
51+
--tw-backdrop-grayscale: ;
52+
--tw-backdrop-hue-rotate: ;
53+
--tw-backdrop-invert: ;
54+
--tw-backdrop-opacity: ;
55+
--tw-backdrop-saturate: ;
56+
--tw-backdrop-sepia: ;
57+
}
1358
::backdrop {
1459
--tw-border-spacing-x: 0;
1560
--tw-border-spacing-y: 0;

tests/import-syntax.test.css

+46-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,52 @@ h1 {
33
}
44
*,
55
::before,
6-
::after,
6+
::after {
7+
--tw-border-spacing-x: 0;
8+
--tw-border-spacing-y: 0;
9+
--tw-translate-x: 0;
10+
--tw-translate-y: 0;
11+
--tw-rotate: 0;
12+
--tw-skew-x: 0;
13+
--tw-skew-y: 0;
14+
--tw-scale-x: 1;
15+
--tw-scale-y: 1;
16+
--tw-pan-x: ;
17+
--tw-pan-y: ;
18+
--tw-pinch-zoom: ;
19+
--tw-scroll-snap-strictness: proximity;
20+
--tw-ordinal: ;
21+
--tw-slashed-zero: ;
22+
--tw-numeric-figure: ;
23+
--tw-numeric-spacing: ;
24+
--tw-numeric-fraction: ;
25+
--tw-ring-inset: ;
26+
--tw-ring-offset-width: 0px;
27+
--tw-ring-offset-color: #fff;
28+
--tw-ring-color: rgb(59 130 246 / 0.5);
29+
--tw-ring-offset-shadow: 0 0 #0000;
30+
--tw-ring-shadow: 0 0 #0000;
31+
--tw-shadow: 0 0 #0000;
32+
--tw-shadow-colored: 0 0 #0000;
33+
--tw-blur: ;
34+
--tw-brightness: ;
35+
--tw-contrast: ;
36+
--tw-grayscale: ;
37+
--tw-hue-rotate: ;
38+
--tw-invert: ;
39+
--tw-saturate: ;
40+
--tw-sepia: ;
41+
--tw-drop-shadow: ;
42+
--tw-backdrop-blur: ;
43+
--tw-backdrop-brightness: ;
44+
--tw-backdrop-contrast: ;
45+
--tw-backdrop-grayscale: ;
46+
--tw-backdrop-hue-rotate: ;
47+
--tw-backdrop-invert: ;
48+
--tw-backdrop-opacity: ;
49+
--tw-backdrop-saturate: ;
50+
--tw-backdrop-sepia: ;
51+
}
752
::backdrop {
853
--tw-border-spacing-x: 0;
954
--tw-border-spacing-y: 0;

0 commit comments

Comments
 (0)