Capítulo 59 de 108
Indicador de loading indeterminado: um ícone SVG (LoaderIcon do lucide-react) com animação de rotação via classe Tailwind animate-spin. É o componente mais simples do catálogo e serve como bloco de composição dentro de outros componentes.
data-icon="inline-start" | "inline-end": atributo usado quando o Spinner é colocado dentro de Button ou Badge, para posicioná-lo antes/depois do texto.size-*: classes Tailwind (size-3, size-4, size-6, size-8) controlam o tamanho do spinner — não há prop size dedicada.components/ui/spinner.tsx, não passar props.import { LoaderIcon } from "lucide-react"
import { cn } from "@/lib/utils"
function Spinner({ className, ...props }: React.ComponentProps<"svg">) {
return (
<LoaderIcon
role="status"
aria-label="Loading"
className={cn("size-4 animate-spin", className)}
{...props}
/>
)
}
export { Spinner }
<Button disabled size="sm">
<Spinner data-icon="inline-start" />
Loading...
</Button>
<InputGroup>
<InputGroupInput placeholder="Send a message..." disabled />
<InputGroupAddon align="inline-end">
<Spinner />
</InputGroupAddon>
</InputGroup>
InputGroupAddon para indicar processamento de um campo de texto.disabled no botão durante loading: o spinner sinaliza visualmente, mas não bloqueia interação sozinho.Progress quando não há valor numérico conhecido: Spinner é para estado indeterminado; Progress exige value.animate-spin — customizar é editar o arquivo, não configurar props.data-icon="inline-start|inline-end" é o padrão de posicionamento usado em Button, Badge e InputGroup.Empty para telas de carregamento de página inteira.data-icon para exibir spinner dentro de um badge.EmptyMedia pode conter um Spinner como estado de carregamento de página.