I have tried the solutions here and the other duplicate here, but those questions are 4 years old and the solutions do not work on newer versions of Firefox. Also, the bug linked in the latter has status: VERIFIED FIXED.
I have tried using only the transition prefix matching the placeholder prefix along with the transition fallback with no luck. ex:
&::-moz-placeholder {
    -moz-transition: $transition;
    transition: $transition;
}
What's below works on chrome but not Firefox or Edge. The opacity changes fine but there is no transition. Am I missing something to support both Firefox and Edge placeholder transitions?
@mixin transition($transition...) {
    -webkit-transition: $transition;
    -moz-transition: $transition;
    -o-transition: $transition;
    transition: $transition;
}
@mixin placeholderOpacity($opacity) {
    &:-moz-placeholder {opacity: $opacity}
    &:-ms-input-placeholder  {opacity: $opacity}
    &::-webkit-input-placeholder {opacity: $opacity}
    &::-moz-placeholder {opacity: $opacity}
    &::placeholder  {opacity: $opacity}
}
@mixin placeholderTransition($transition) {
    &:-moz-placeholder {@include transition($transition);}
    &:-ms-input-placeholder  {@include transition($transition);}
    &::-webkit-input-placeholder {@include transition($transition);}
    &::-moz-placeholder {@include transition($transition);}
    &::placeholder  {@include transition($transition);}
}
input {
    @include placeholderOpacity(0);
    @include placeholderTransition(opacity 500ms ease-in-out);
}
input:focus {
    @include placeholderOpacity(1);
}
 
     
    