`transition` mixin