Shimmer
Efeito de shimmer de texto animado que desliza um gradiente pelos caracteres - a pista universal de "o modelo está trabalhando".
Visão geral
Shimmer é o affordance de texto com streaming. Ele envolve uma string em um elemento motion que anima um gradiente horizontal pelos caracteres, dando à saída do modelo uma leve lavagem de "loading" sem spinners. É o mesmo primitive usado internamente por Reasoning, Plan e Suggestion quando precisam indicar streaming.
Use para texto de status efêmero - "Thinking...", "Generating response...", "Loading..." - em lugares onde um spinner pareceria desajeitado.
Preview
Buscando referencias nos docs...
'use client';import { Shimmer } from '@gremorie/rx-ai';export function ShimmerPreview() { return <Shimmer>Buscando referencias nos docs...</Shimmer>;}Anatomia
Shimmer varredura de gradiente animada sobre o texto — primitive folha (sem subcomponentes)Instalação
bash npx gremorie@latest add rx-shimmer bash pnpm dlx gremorie@latest add rx-shimmer bash yarn dlx gremorie@latest add rx-shimmer bash bunx --bun gremorie@latest add rx-shimmer Uso
import { Shimmer } from "@gremorie/rx-ai";
export function Example() {
return <Shimmer>Thinking...</Shimmer>;
}import { Component } from "@angular/core";
import { Shimmer } from "@gremorie/ng-ai";
@Component({
selector: "app-example",
standalone: true,
imports: [Shimmer],
template: `<span ngShimmer>Thinking...</span>`,
})
export class ExampleComponent {}
A versão Angular é uma diretiva (
[ngShimmer]) em vez de um componente. Aplique-a a qualquer elemento com conteúdo de texto; o spread auto-escala com a contagem de caracteres, espelhando a implementação React.
API
<Shimmer>
| Prop | Type | Default | Description |
|---|---|---|---|
children | string | - | Obrigatório. O texto para fazer shimmer. A string é obrigatória para que o spread possa escalar com a contagem de caracteres. |
as | ElementType | "p" | Sobrescreve o elemento renderizado (por exemplo, "span" para inline dentro de uma frase). |
className | string | - | Classes extras. |
duration | number | 2 | Segundos por ciclo. Menor = shimmer mais rápido. |
spread | number | 2 | Multiplicador sobre o spread do gradiente (por caractere). Menor = lavagem mais apertada. |
Memoizado com React.memo.
Composição
Shimmer é um único primitive. Coloque-o em qualquer lugar onde uma string caberia; ele herda a fonte e a cor ao redor automaticamente.
Variações
Dica de loading
O caso de 90%: uma string de status curta.
<Shimmer>Generating response...</Shimmer>Inline dentro de uma frase
Renderize como span para fazer shimmer em uma única palavra dentro de um parágrafo normal.
<p>
The assistant is <Shimmer as="span">thinking</Shimmer> about your request.
</p>Shimmer mais rápido e apertado
Para labels mais curtos onde os 2s padrão parecem lentos.
<Shimmer duration={1} spread={1}>
Reasoning
</Shimmer>Override do trigger de reasoning
Um uso comum - injetar Shimmer em ReasoningTrigger via getThinkingMessage para localizar ou rebrandar o label.
<Reasoning isStreaming>
<ReasoningTrigger
getThinkingMessage={(streaming) =>
streaming ? <Shimmer>Pensando...</Shimmer> : null
}
/>
<ReasoningContent>{thinking}</ReasoningContent>
</Reasoning>Acessibilidade
- Teclado: sem interação -
Shimmeré um elemento de texto estático. - ARIA: o conteúdo de texto é preservado no DOM (sem ofuscação), então leitores de tela o anunciam normalmente.
- Leitores de tela: mantenha o label semanticamente significativo ("Thinking", "Loading", "Generating response"). Evite strings apenas decorativas.
- Movimento reduzido: a animação usa Framer Motion. Honre
prefers-reduced-motion: reducetrocando o shimmer por um label estático no call site, ou envolvendo com uma checagem de media query.
Relacionados
- Reasoning - usa
Shimmerinternamente durante o streaming - Plan - usa
Shimmerno título e na descrição durante o streaming - Suggestion - quick-replies que frequentemente acompanham um label com shimmer