shadcn.io is an independent project built on shadcn/ui
The link variant, disabled, with a spinner and the word Loading. People can see the click already happened, and they cannot press it again.
Use it for Load more or Refresh while the request is in flight. Put the old label back when it finishes, and say what failed if it fails. A Spinner alone does not say which action is waiting. In React, Ark UI does not know when your request ends.
Installation
Anatomy

Usage
<Button disabled variant="link">
<Spinner data-icon="inline-start" />
Loading
</Button>FAQ
Does this demo use isLoading?
No. The link variant is disabled, with a Spinner (data-icon="inline-start") and the word Loading. variant="link" stays primary text with no fill.
How is isLoading different?
isLoading replaces the label with a centered spinner, holds the width, sets aria-busy, and disables the button. This demo keeps the word next to the spinner, which is the better fit when the action should stay readable.
Why disable a link Button?
So it can't be pressed again while the request runs. The fade is the same disabled treatment as the other variants. An underline doesn't change that.
Can I keep my own label?
Yes. Replace Loading with the action, such as Saving. The spinner is a sibling, not a replacement, in this demo.
API Reference
Button
Sets disabled and variant="link". The rest is on the Button page.
Spinner
Sets data-icon="inline-start". The rest is on the Spinner page.




