# Spinner

<div class="not-content sl-bejamas-component-preview flex justify-center px-4 md:px-10 py-12 border border-border rounded-t-lg min-h-72 items-center">
<Item variant="muted" class="w-full max-w-xs"> <ItemMedia> <Spinner /> </ItemMedia> <ItemContent> <ItemTitle class="line-clamp-1">{"Submitting Contact Form..."}</ItemTitle> </ItemContent> </Item>
</div>

```astro
---
---

<Item variant="muted" class="w-full max-w-xs">
  <ItemMedia>
    <Spinner />
  </ItemMedia>
  <ItemContent>
    <ItemTitle class="line-clamp-1">Submitting Contact Form...</ItemTitle>
  </ItemContent>
</Item>
```

## Installation

<DocsTabs syncKey="pkg">
  <DocsTabItem label="bun">
  ```bash
  bunx bejamas add spinner
  ```
  </DocsTabItem>
  <DocsTabItem label="npm">
  ```bash
  npx bejamas add spinner
  ```
  </DocsTabItem>
  <DocsTabItem label="pnpm">
  ```bash
  pnpm dlx bejamas add spinner
  ```
  </DocsTabItem>
  <DocsTabItem label="yarn">
  ```bash
  yarn dlx bejamas add spinner
  ```
  </DocsTabItem>
</DocsTabs>

## Usage

```astro nocollapse
---
---

<Spinner />
```

## Customization

You can replace the default spinner icon with any other icon by editing the `Spinner` component.

```astro showLineNumbers title="components/ui/spinner/Spinner.astro" nocollapse nopreview
---
const { class: className = "", ...props } = Astro.props;
---

<LoaderIcon
  data-slot="spinner"
  role="status"
  aria-label="Loading"
  class={cn("cn-spinner", "size-4 animate-spin", className)}
  {...props}
/>
```

## Examples

### Size

Use the `size-*` utility class to change the size of the spinner.

<div class="not-content sl-bejamas-component-preview flex justify-center px-4 md:px-10 py-12 border border-border rounded-t-lg min-h-72 items-center">
<div class="flex items-center gap-6"> <Spinner class="size-3" /> <Spinner class="size-4" /> <Spinner class="size-6" /> <Spinner class="size-8" /> </div>
</div>

```astro
---
---

<div class="flex items-center gap-6">
  <Spinner class="size-3" />
  <Spinner class="size-4" />
  <Spinner class="size-6" />
  <Spinner class="size-8" />
</div>
```

### Button

Add a spinner to a button to indicate a loading state. Remember to use the `data-icon` attribute for proper spacing.

<div class="not-content sl-bejamas-component-preview flex justify-center px-4 md:px-10 py-12 border border-border rounded-t-lg min-h-72 items-center">
<div class="flex flex-col items-center gap-4"> <Button disabled size="sm"> <Spinner data-icon />{" Loading... "}</Button> <Button variant="outline" disabled size="sm"> <Spinner data-icon />{" Please wait "}</Button> <Button variant="secondary" disabled size="sm"> <Spinner data-icon />{" Processing "}</Button> </div>
</div>

```astro
---
---

<div class="flex flex-col items-center gap-4">
  <Button disabled size="sm">
    <Spinner data-icon />
    Loading...
  </Button>
  <Button variant="outline" disabled size="sm">
    <Spinner data-icon />
    Please wait
  </Button>
  <Button variant="secondary" disabled size="sm">
    <Spinner data-icon />
    Processing
  </Button>
</div>
```

### Badge

Add a spinner to a badge to indicate a loading state.

<div class="not-content sl-bejamas-component-preview flex justify-center px-4 md:px-10 py-12 border border-border rounded-t-lg min-h-72 items-center">
<div class="flex items-center gap-4 [--radius:1.2rem]"> <Badge> <Spinner data-icon />{" Syncing "}</Badge> <Badge variant="secondary"> <Spinner data-icon />{" Updating "}</Badge> <Badge variant="outline"> <Spinner data-icon />{" Processing "}</Badge> </div>
</div>

```astro
---
---

<div class="flex items-center gap-4 [--radius:1.2rem]">
  <Badge>
    <Spinner data-icon />
    Syncing
  </Badge>
  <Badge variant="secondary">
    <Spinner data-icon />
    Updating
  </Badge>
  <Badge variant="outline">
    <Spinner data-icon />
    Processing
  </Badge>
</div>
```

### Input Group

<div class="not-content sl-bejamas-component-preview flex justify-center px-4 md:px-10 py-12 border border-border rounded-t-lg min-h-72 items-center">
<div class="flex w-full max-w-md flex-col gap-4"> <InputGroup> <InputGroupInput placeholder="Send a message..." disabled /> <InputGroupAddon align="inline-end"> <Spinner /> </InputGroupAddon> </InputGroup> <InputGroup> <InputGroupTextarea placeholder="Send a message..." disabled /> <InputGroupAddon align="block-end"> <Spinner />{" Validating... "}<InputGroupButton class="ml-auto" variant="default"> <ArrowUpIcon /> <span class="sr-only">{"Send"}</span> </InputGroupButton> </InputGroupAddon> </InputGroup> </div>
</div>

```astro
---
---

<div class="flex w-full max-w-md flex-col gap-4">
  <InputGroup>
    <InputGroupInput placeholder="Send a message..." disabled />
    <InputGroupAddon align="inline-end">
      <Spinner />
    </InputGroupAddon>
  </InputGroup>
  <InputGroup>
    <InputGroupTextarea placeholder="Send a message..." disabled />
    <InputGroupAddon align="block-end">
      <Spinner /> Validating...
      <InputGroupButton class="ml-auto" variant="default">
        <ArrowUpIcon />
        <span class="sr-only">Send</span>
      </InputGroupButton>
    </InputGroupAddon>
  </InputGroup>
</div>
```