Most interfaces fail in the in-between moments — the 200ms after you click, the empty state, the way text wraps on a small screen. The work isn't in the hero shot. It's in the seams.
I keep a running list of these moments and how to handle them. This is some of it.
1. Loading states should preserve layout. Skeletons that match the final dimensions of the content keep the page from jumping. Spinners centered in space don't.
2. Empty states are content. Treat them like a small piece of writing — what's the one sentence that explains both what this is and what to do next?
3. Defaults are decisions. A field's placeholder, a toggle's initial state, a sort order — every default is a tiny opinion you're shipping. Make them on purpose.