Idle → loading → success / error with blur-swap slots and morphing width.
npx shadcn@latest add @beui/button-stateful
button-stateful