transition-behavior, and display: none that animates

Animating an element out and then hiding it had needed a transitionend listener, because display is not animatable.

.popover {
  display: none;
  opacity: 0;
  transition: opacity 200ms, display 200ms allow-discrete;
  transition-behavior: allow-discrete;
}

.popover.is-open {
  display: block;
  opacity: 1;
}

allow-discrete makes a discrete property flip at the end of the transition on the way out and at the start on the way in, which is exactly the behaviour the listener was implementing by hand. The subtlety is that entering also needs @starting-style, or the element appears at its final opacity — the two features are halves of one thing and neither is much use alone.