shadcn.io is an independent project built on shadcn/ui
Two busy controls. The textarea is disabled, says Generating content..., and has a spinner in a bordered row under the text. The file field is disabled, says Uploading file..., and has a spinner at the end.
Put the spinner under a textarea and beside a one-line field. If the text arrives in pieces, write each piece in yourself. A page-level wait is a Spinner on its own. In Vue, Ark UI does not fill the textarea for you.
Installation
Anatomy

Usage
<div class="flex w-full max-w-sm flex-col gap-4">
<InputGroup class="bg-background" data-disabled="true">
<InputGroupTextarea
aria-label="Content"
class="min-h-[100px]"
:disabled="true"
placeholder="Generating content..."
/>
<InputGroupAddon align="block-end" class="border-t"><Spinner /></InputGroupAddon>
</InputGroup>
<InputGroup class="bg-background" data-disabled="true">
<InputGroupInput
aria-label="File"
:disabled="true"
placeholder="Uploading file..."
type="text"
/>
<InputGroupAddon align="inline-end"><Spinner /></InputGroupAddon>
</InputGroup>
</div>FAQ
How does the spinner sit under the textarea?
In an InputGroupAddon with align="block-end" and border-t, after the textarea.
How are the controls disabled?
disabled on InputGroupTextarea and InputGroupInput. data-disabled="true" on InputGroup dims the addons.
API Reference
Input Group
Sets data-disabled, aria-label="Content", disabled, placeholder="Generating content...", align="block-end" and aria-label="File". The rest is on the Input Group page.
Spinner
No extra props in this demo. The rest is on the Spinner page.




