Model Async UI with Explicit States
A predictable UI usually starts with a predictable state model.
Most async challenge flows become easier when you think in terms of `idle`, `loading`, `success`, and `error`.
If those states are not explicit, the interface often sends mixed signals: a spinner stays visible after failure, a button remains disabled forever, or stale data looks valid.