Skip to content

Conversation

philipp-spiess
Copy link
Member

This PR changes the transition utility to include five new properties:

  • display
  • visibility
  • content-visibility
  • overlay
  • pointer-eventes

On its own, this change does nothing since these properties will apply their change immediately. However, in combination with transition-discrete this will ensure that you can now transition these types without requiering transition-all or arbitrary transition properties.

Test plan

  • Ensured this works in the Vite playground with native <dialog> components
Screen.Recording.2025-04-28.at.18.01.21.mov

Notice how:

  • the backdrop stays open until the transition is over (that's because of overlay in the property list)
  • the dialog is displayed until the transition is over

@philipp-spiess philipp-spiess requested a review from a team as a code owner April 28, 2025 16:05
Co-authored-by: Adam Wathan <[email protected]>
@philipp-spiess philipp-spiess merged commit a636933 into main Apr 30, 2025
@philipp-spiess philipp-spiess deleted the feat/transition-discrete-types branch April 30, 2025 12:31
thecrypticace pushed a commit to tailwindlabs/tailwindcss.com that referenced this pull request Aug 25, 2025
thecrypticace added a commit that referenced this pull request Aug 25, 2025
We introduced an accidental breaking change a few months ago in 4.1.5
with #17812.

We added `visibility` to the property list in `transition` which
unfortunately only applies its change instantly when going from
invisible -> visible.

I've checked `display`, `content-visibility`, and `pointer-events` and
they apply their change instantly (as best I can tell) when
transitioning by default. And `overlay` only "applies" for discrete
transitions so it can stay as well.

The spec has this to say about [animating
`visibility`](https://www.w3.org/TR/web-animations-1/#animating-visibility):
> For the visibility property, visible is interpolated as a discrete
step where values of p between 0 and 1 map to visible and other values
of p map to the closer endpoint; if neither value is visible then
discrete animation is used.

This means that for visible (t=0) -> hidden (t=1) the timeline looks
like this:
- t=0.0: visible
- t=0.5: visible
- t=0.999…8: visible
- t=1.0: invisible

This means that for invisible (t=0) -> visible (t=1) the timeline looks
like this:
- t=0.0: invisible
- t=0.000…1: visible
- t=0.5: visible
- t=1.0: visible

So the value *is* instantly applied if the element is initially
invisible but when going the other direction this is not the case. This
happens whether or not the transition type is discrete.

While the spec calls out [`display` as working
similarly](https://drafts.csswg.org/css-display-4/#display-animation) in
practice this is only the case when `transition-behavior` is explicitly
set to `allow-discrete` otherwise the change is instant for both
directions.

Fixes #18793
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