npm install @csstools/postcss-gamut-mapping --save-dev
PostCSS Gamut Mapping lets you use wide gamut colors with gamut mapping for specific displays following the CSS Color 4 Specification.
When out of gamut colors are naively clipped the result can be radically different.
A saturated and bright color will be much darker after clipping.
To correctly adjust colors for a narrow gamut display, the colors must be mapped.
This is done by lowering the chroma in oklch until the color is in gamut.
Using the @media (color-gamut) media feature makes it possible to only use the wide gamut colors on displays that support them.
p { background-color: oklch(80% 0.05 0.39 / 0.5); color: oklch(20% 0.234 0.39 / 0.5); border-color: color(display-p3 0 1 0); } /* becomes */ p { background-color: oklch(80% 0.05 0.39 / 0.5); color: rgba(48, 0, 20, 0.5); border-color: rgb(0, 247, 79); } @media (color-gamut: rec2020) { p { color: oklch(20% 0.234 0.39 / 0.5); } } @media (color-gamut: p3) { p { border-color: color(display-p3 0 1 0); } }
Usage
Add PostCSS Gamut Mapping to your project:
npm install postcss @csstools/postcss-gamut-mapping --save-dev
Use it as a PostCSS plugin:
const postcss = require('postcss'); const postcssGamutMapping = require('@csstools/postcss-gamut-mapping'); postcss([ postcssGamutMapping(/* pluginOptions */) ]).process(YOUR_CSS /*, processOptions */);
PostCSS Gamut Mapping runs in all Node environments, with special instructions for: