An action button with a built-in idle → loading → success/error state machine — stable width, live-region announcements, auto-reset.
npx shadcn@latest add @zyeon/stateful-buttonZyeon UI limits how often it can be asked, and Stateful Button hasn't had its turn. Its source will show here once it has.