Chip

Etiqueta curta com cor funcional. Sinaliza estado, categoria ou filtro.

Abrir no Storybook ↗

Quando usar

Status de compromisso (pago, a vencer, vencido, agendado), filtro ativo, categoria de gasto, delta comparativo.

Quando não usar

  • Para ação — usar Button emphasis=tertiary.
  • Para texto decorativo — chip sem função de estado é ruído.

Anatomia

O chip tem no máximo dois elementos visíveis: ícone opcional à esquerda e label obrigatório. O fundo tint é gerado a partir da cor funcional do tone.

Partes do componente:

  • label — string curta, 1–3 palavras, uppercase, tracking loose.
  • tone — success · info · alert · error. Define cor e tint.
  • icon (opcional) — glifo 16 px à esquerda, stroke 1.5 px, mesma cor do label.
  • tint — fundo derivado automaticamente do tone via token --color-functional-{tone}-tint.

Variantes

Quatro tones, cada um mapeado a um significado funcional específico. Tone não é escolha estética — é escolha semântica.

ToneUsoExemplo de label
successConfirmação, conquista, pago."Pago", "+R$ 230"
infoAgendado, em curso, neutro."Agendado", "Em análise"
alertAtenção, vence em breve."Vence em 3 dias"
errorVencido, falha, risco."Vencido há 15 dias"
Pago+R$ 230

success

AgendadoEm análise

info

Vence em 3 dias

alert

Vencido há 15 dias

error

Estados

Cada tone é um estado semântico. Não há hover, focus ou disabled — o chip é decoração informativa, não elemento interativo. Se o chip precisar ser focável (filtro aplicado que pode ser removido), torna-se um Button emphasis=tertiary com ícone de fechar.

Tokens aplicáveis

TokenPapel
--color-functional-success-tintFundo tone success
--color-functional-successTexto e ícone tone success
--color-functional-info-tintFundo tone info
--color-functional-infoTexto e ícone tone info
--color-functional-alert-tintFundo tone alert
--color-functional-alertTexto e ícone tone alert
--color-functional-error-tintFundo tone error
--color-functional-errorTexto e ícone tone error
--type-family-sansFamília tipográfica do label
--type-size-xsTamanho do label (12 px)
--type-weight-mediumPeso do label
--type-tracking-looseTracking do label uppercase
--radius-smRaio do chip (8 px)
--space-4Padding vertical
--space-8Padding horizontal
--icon-size-smTamanho do ícone opcional (16 px)
--space-4Gap entre ícone e label

Conteúdo

  • Muito curto. 1 a 3 palavras — o chip não é parágrafo.
  • Sem emoji no chip visual do app. Emoji aparece apenas no fallback de canais textuais (WhatsApp, SMS) quando o chip colapsa em prefixo.
  • Maiúsculas caps, tracking loose — já especificado nos tokens. Não é decisão de escrita; é decisão visual do token.
  • O label descreve o estado, não o sentimento. "Vencido" não "Ops!".

Acessibilidade

  • aria-label composto por tone + label: "status: pago — condomínio de maio". A cor não é o único canal de significado.
  • Chip é não-focável (informativo). tabIndex=-1 ou ausência de role interativo.
  • Contraste: cor funcional sobre tint correspondente passa WCAG AA em xs caps.
  • Fallback de canal: voz lê o tone explicitamente ("pago —"); SMS usa prefixo em caixa alta sem cor.

Do / Don't

Vence em 3 diasVencido há 15 dias

Fazer

Tone consistente com o significado: alert para atenção, error para risco real.

Vence em 3 diasVencido há 15 dias

Não fazer

success em compromisso vencido. Tone success para "não crítico" vira ruído — o significado some.

Vence em 3 dias

Fazer

Label concreto: "Vence em 3 dias". O dado está no label.

Atenção

Não fazer

Label vago: "Atenção". Não informa nada além do que a cor já disse.

Componentes relacionados

  • Commitment Card — usa Chip como marcador de status.
  • Button — quando a etiqueta precisa ser interativa (filtro que pode ser removido).

Uso

Importa o <Chip> do @peppe/design-system e passa label + tone. A prop icon é opcional — recebe SVG 16×16 alinhado a --icon-size-sm, cor herda do tone via currentColor.

import { Chip } from "@peppe/design-system";

// Chip sem ícone
<Chip label="Pago" tone="success" />

// Chip com ícone (4 tones) — passa SVG nu; o componente envelopa
// em <span className="peppe-chip__icon"> automaticamente.
<Chip
  label="Vence em 3 dias"
  tone="alert"
  icon={
    <svg
      viewBox="0 0 16 16"
      fill="none"
      stroke="currentColor"
      strokeWidth="1.5"
      strokeLinecap="round"
      strokeLinejoin="round"
      aria-hidden="true"
    >
      <path d="M8 2 L14 13 H2 Z" />
      <line x1="8" y1="6" x2="8" y2="9" />
      <line x1="8" y1="11" x2="8" y2="11" />
    </svg>
  }
/>

// Tones: success | info | alert | error
<Chip label="Agendado" tone="info" />
<Chip label="Vencido há 15 dias" tone="error" />

O CSS de componente viaja co-localizado com <Chip> em @peppe/design-system — não há mais componente-chip.css de página (deletado em Epic #517 S8).