Skip to content

Commit 816a0f2

Browse files
Add prefers-contrast media query variants (#8410)
* Add prefers-contrast variants * add tests for prefers contrast * dark mode should have precedence over prefers contrast variants * update changelog Co-authored-by: Luke Warlow <[email protected]>
1 parent 83b4811 commit 816a0f2

6 files changed

+97
-0
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
4747
- Add `mix-blend-plus-lighter` utility ([#8288](https://github.com/tailwindlabs/tailwindcss/pull/8288))
4848
- Add arbitrary variants ([#8299](https://github.com/tailwindlabs/tailwindcss/pull/8299))
4949
- Add `matchVariant` API ([#8310](https://github.com/tailwindlabs/tailwindcss/pull/8310))
50+
- Add `prefers-contrast` media query variants ([#8410](https://github.com/tailwindlabs/tailwindcss/pull/8410))
5051

5152
## [3.0.24] - 2022-04-12
5253

src/corePlugins.js

+5
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,11 @@ export let variantPlugins = {
215215
addVariant('portrait', '@media (orientation: portrait)')
216216
addVariant('landscape', '@media (orientation: landscape)')
217217
},
218+
219+
prefersContrastVariants: ({ addVariant }) => {
220+
addVariant('contrast-more', '@media (prefers-contrast: more)')
221+
addVariant('contrast-less', '@media (prefers-contrast: less)')
222+
},
218223
}
219224

220225
let cssTransformValue = [

src/lib/setupContextUtils.js

+1
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,7 @@ function resolvePlugins(context, root) {
606606
let afterVariants = [
607607
variantPlugins['directionVariants'],
608608
variantPlugins['reducedMotionVariants'],
609+
variantPlugins['prefersContrastVariants'],
609610
variantPlugins['darkVariants'],
610611
variantPlugins['printVariant'],
611612
variantPlugins['screenVariants'],

tests/prefers-contrast.test.js

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import { run, html, css, defaults } from './util/run'
2+
3+
it('should be possible to use contrast-more and contrast-less variants', () => {
4+
let config = {
5+
content: [
6+
{ raw: html`<div class="contrast-more:bg-pink-500 contrast-less:bg-black bg-white"></div>` },
7+
],
8+
corePlugins: { preflight: false },
9+
}
10+
11+
let input = css`
12+
@tailwind base;
13+
@tailwind components;
14+
@tailwind utilities;
15+
`
16+
17+
return run(input, config).then((result) => {
18+
expect(result.css).toMatchFormattedCss(css`
19+
${defaults}
20+
21+
.bg-white {
22+
--tw-bg-opacity: 1;
23+
background-color: rgb(255 255 255 / var(--tw-bg-opacity));
24+
}
25+
26+
@media (prefers-contrast: more) {
27+
.contrast-more\:bg-pink-500 {
28+
--tw-bg-opacity: 1;
29+
background-color: rgb(236 72 153 / var(--tw-bg-opacity));
30+
}
31+
}
32+
33+
@media (prefers-contrast: less) {
34+
.contrast-less\:bg-black {
35+
--tw-bg-opacity: 1;
36+
background-color: rgb(0 0 0 / var(--tw-bg-opacity));
37+
}
38+
}
39+
`)
40+
})
41+
})
42+
43+
it('dark mode should appear after the contrast variants', () => {
44+
let config = {
45+
content: [{ raw: html`<div class="contrast-more:bg-black dark:bg-white"></div>` }],
46+
corePlugins: { preflight: false },
47+
}
48+
49+
let input = css`
50+
@tailwind base;
51+
@tailwind components;
52+
@tailwind utilities;
53+
`
54+
55+
return run(input, config).then((result) => {
56+
expect(result.css).toMatchFormattedCss(css`
57+
${defaults}
58+
59+
@media (prefers-contrast: more) {
60+
.contrast-more\:bg-black {
61+
--tw-bg-opacity: 1;
62+
background-color: rgb(0 0 0 / var(--tw-bg-opacity));
63+
}
64+
}
65+
66+
@media (prefers-color-scheme: dark) {
67+
.dark\:bg-white {
68+
--tw-bg-opacity: 1;
69+
background-color: rgb(255 255 255 / var(--tw-bg-opacity));
70+
}
71+
}
72+
`)
73+
})
74+
})

tests/variants.test.css

+12
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,18 @@
759759
var(--tw-shadow);
760760
}
761761
}
762+
@media (prefers-contrast: more) {
763+
.contrast-more\:bg-yellow-300 {
764+
--tw-bg-opacity: 1;
765+
background-color: rgb(253 224 71 / var(--tw-bg-opacity));
766+
}
767+
}
768+
@media (prefers-contrast: less) {
769+
.contrast-less\:bg-yellow-300 {
770+
--tw-bg-opacity: 1;
771+
background-color: rgb(253 224 71 / var(--tw-bg-opacity));
772+
}
773+
}
762774
.dark .dark\:shadow-md {
763775
--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
764776
--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);

tests/variants.test.html

+4
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,10 @@
143143
<div class="portrait:bg-yellow-300"></div>
144144
<div class="landscape:bg-yellow-300"></div>
145145

146+
<!-- Prefers contrast variants -->
147+
<div class="contrast-more:bg-yellow-300"></div>
148+
<div class="contrast-less:bg-yellow-300"></div>
149+
146150
<!-- Stacked variants -->
147151
<div class="open:hover:bg-red-200"></div>
148152
<div class="file:hover:bg-blue-600"></div>

0 commit comments

Comments
 (0)