Button
Input
Status — a dot and a word, never a background wash
Loading & empty
No courses yet
What is missing, why, and one thing to do — all three are required.
Focus is never removed, only restyled — :focus-visible so a mouse
click does not paint a ring the user did not ask for. Invalid state is driven by
aria-invalid rather than a CSS class, so what is seen and what is
announced cannot drift apart. Press is an instant opacity dim: no bounce, no lift.