Spinner
Indicador de carregamento indeterminado - um único glyph rotativo que cabe em qualquer lugar que texto caiba.
Visão geral
Spinner é o primitive de carregamento indeterminado: um único glyph rotativo (a geometria do Loader2 do lucide) para trabalho em andamento de duração desconhecida. Por ser apenas um glyph, ele vive em qualquer lugar que texto caiba - inline ao lado de um label, dentro de um button enquanto uma request está pendente, em um empty state.
Recorra ao Spinner quando você não consegue dizer quanto tempo a espera vai levar. Quando o percentual concluído é conhecido, use Progress; quando você está reservando layout para a forma do conteúdo em carregamento, use Skeleton. Mantenha-o pequeno e local - um spinner de página inteira geralmente é um layout de Skeleton no lugar.
Preview
'use client';import { Spinner } from '@gremorie/rx-feedback';export function SpinnerPreview() { return ( <div className="flex items-center gap-6"> <Spinner size="sm" /> <Spinner /> <Spinner size="lg" /> </div> );}Anatomia
Spinner único glyph Loader2 rotativo (role="status", aria-live="polite", aria-label="Loading")Instalação
# React
npm i @gremorie/rx-feedback
# Angular
npm i @gremorie/ng-feedback
npx gremorie@latest add ng-spinnerA edição Angular é entregue como o item de registry ng-spinner. A edição React
instala a partir do pacote npm @gremorie/rx-feedback; um item de registry
standalone ainda não foi publicado.
Uso
import { Spinner } from "@gremorie/rx-feedback";
export function LoadingRow() {
return (
<p className="flex items-center gap-2 text-sm text-muted-foreground">
<Spinner size="sm" />
Loading conversations...
</p>
);
}npx gremorie@latest add ng-spinnerimport { Component } from '@angular/core';
import { Spinner } from '@gremorie/ng-feedback';
@Component({
selector: 'app-loading-row',
standalone: true,
imports: [Spinner],
template: `
<p class="flex items-center gap-2 text-sm text-muted-foreground">
<gr-spinner size="sm" />
Loading conversations...
</p>
`,
})
export class LoadingRowComponent {}API
<Spinner>
React renderiza o Loader2Icon do lucide com animate-spin; Angular (<gr-spinner>) renderiza um SVG inline com a mesma geometria. A superfície pública é idêntica em ambas as edições.
| Prop | Type | Default | Description |
|---|---|---|---|
size | "sm" | "default" | "lg" | "default" | Tamanho do glyph: 12 / 16 / 24 px. |
className | string | - | Classes extras, ex. uma cor de texto. No Angular isso mapeia para o class do host. |
...props | React.ComponentProps<"svg"> | - | Atributos padrão de SVG (edição React). role, aria-live, e aria-label já estão definidos para você. |
Composição
- O glyph traça
currentColor, então ele se tinge com a cor de texto ao redor - definatext-muted-foreground(ou qualquer token de texto) no Spinner ou em seu pai e o glyph acompanha. - Inline com texto: combine
size="sm"com um label curto ("Loading conversations...") dentro de uma flex row. O glyph se alinha como um ícone à esquerda. - Dentro de um button: coloque um Spinner antes do label enquanto uma request está em andamento; desabilite o button ao mesmo tempo para que o estado pendente seja lido como um único sinal.
- Empty states: centralize um Spinner
size="lg"enquanto a primeira página de dados carrega, depois troque pelo conteúdo real ou por um bloco de empty state.
Variações
Inline com texto
Loading conversations...
'use client';import { Spinner } from '@gremorie/rx-feedback';export function SpinnerInlinePreview() { return ( <p className="flex items-center gap-2 text-sm text-muted-foreground"> <Spinner size="sm" /> Loading conversations... </p> );}A forma mais comum: um pequeno glyph ao lado de um label de status curto. O label carrega o significado; o glyph carrega o movimento.
Acessibilidade
- Anunciado de imediato: o componente define
role="status",aria-live="polite", earia-label="Loading", então leitores de tela anunciam o estado pendente sem fiação extra. - Um anúncio por região: quando vários elementos carregam juntos, prefira um Spinner (ou uma região
aria-busy) em vez de muitos, para que a tecnologia assistiva receba um único status em vez de tagarelice repetida. - Movimento reduzido: a rotação usa o
animate-spindo Tailwind, que respeitaprefers-reduced-motionvia o override global do projeto. - Contraste de cor: o glyph herda
currentColor; mantenha a cor de texto ao redor em contraste AA e o Spinner acompanha.