/* Only finite state transitions. No animated hover, skeleton or polling loop. */
.vi2 [data-transition="review-passed"] { animation:vi2-review var(--motion-fast) var(--ease-enter) both; }
.vi2 [data-transition="generated"], .vi2 [data-transition="uploaded"] { animation:vi2-arrive var(--motion-state) var(--ease-enter) both; }
.vi2 [data-transition="toast-in"] { animation:vi2-arrive var(--motion-fast) var(--ease-enter) both; }
.vi2 [data-transition="toast-out"] { animation:vi2-leave var(--motion-fast) var(--ease-exit) both; }
@keyframes vi2-review { from { opacity:.5; transform:scale(.98); } to { opacity:1; transform:scale(1); } }
@keyframes vi2-arrive { from { opacity:0; transform:translateY(4px); } to { opacity:1; transform:translateY(0); } }
@keyframes vi2-leave { from { opacity:1; transform:translateY(0); } to { opacity:0; transform:translateY(4px); } }
@media (prefers-reduced-motion:reduce) { .vi2 [data-transition] { animation:none!important; transform:none!important; } }
