Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use oklab instead of oklch for color-mix(…) and gradients #15201

Merged
merged 3 commits into from
Nov 27, 2024

Conversation

adamwathan
Copy link
Member

@adamwathan adamwathan commented Nov 26, 2024

Fixes #15184, #14955

There's a strange bug in Safari < 18 where mixing a color with transparent or with a gray tone, the resulting color looks as if it's been interpolated through a red-ish color.

Here's the same blue to transparent gradient in Safari 17 using OKLAB and OKLCH for comparison:

image

In other browsers, both of these examples look identical.

This bug also shows up when using an opacity modifier right now because we use in oklch in our color-mix(…) calls:

image

This PR updates all of the affected places in Tailwind to use in oklab instead of in oklch which then renders everything as expected in all browsers.

The big unfortunate change here is changing the default behavior of gradient utilities like bg-linear-to-r to use in oklab instead of in oklch. This means you get muddier gradients by default when creating a gradient between two regular colors (no transparent or gray), like how they looked in v3:

image

This feels worth it though to avoid people getting bitten by this Safari bug without realizing it, and people can always opt in to using OKLCH with classes like bg-linear-to-r/oklch. The nice thing about making this opt-in is that no one will opt-in to this when using transparent or gray because it won't make things look any different/better, and the only places where it does make things look better do work as expected in Safari anyways.

@adamwathan adamwathan requested a review from a team as a code owner November 26, 2024 22:05
@adamwathan adamwathan merged commit 961e8da into next Nov 27, 2024
1 check passed
@adamwathan adamwathan deleted the fix/mix-in-oklab branch November 27, 2024 11:18
adamwathan pushed a commit that referenced this pull request Nov 27, 2024
After the changes in #15201, our Windows CI started to fail. The problem
is that lightningcss now needs to convert `oklch` colors into the
`oklab` space to inline some `color-mix()` functions.

The problem, though, is that this calculation seems to have rounding
differences between macOS, Linux, and Windows. Since we still want to
_define the default color space in `oklch`_ and _use lightningcss as a
post-processor in our unit tests so we have a better coverage of the
output_, this PR attempts to fix the issue by adding a custom vitest
serializer. It will find usages of the `oklab()` function with arguments
that have lots of decimal places (at least 6 decimal places). What it
then does is simply cut off any excess decimal places to truncate the
output to 5 places. E.g.:

```diff
- oklab(62.7955% .224863 .125846 / .75);
+ oklab(62.7955% .22486 .12584 / .75);
```

## Test Plan

I updated the CI workflow file to make all three builds run in CI and
observed that they are now all green again.

<img width="609" alt="Screenshot 2024-11-27 at 14 54 52"
src="https://github.com/user-attachments/assets/73fe6da5-30e3-4fd4-83ea-115b1f1602a6">
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants