Icon Box
Em andamentoÍcone dentro de um quadrado ou círculo de fundo suave, para ilustrar um item de lista ou de grade — em quatro tamanhos, quatro tratamentos e quatro arredondamentos. Decorativo por padrão; com label, uma imagem nomeada.
- Função
- Conteúdo
- Também chamado de
- ícone com fundo, caixa de ícone, selo de ícone
- Mora em
- app/components/atoms/IconBox.tsx
- Última mudança
- 2026-09-29
Prévia
A peça ao vivo, vinda da ficha, na largura escolhida. Em larguras fixas, ela roda num quadro do tamanho de uma tela de verdade.
Na largura da página: 0px
Variantes na ficha
Lidas da ficha no build, na ordem do palco. Cada uma abre sozinha, sem o styleguide em volta — é o endereço que o palco carrega.
Quando usar
No começo de itens de uma grade de benefícios ou de uma lista de passos, para dar ritmo visual.
Faça
- Passe o componente do ícone (
icon={Award}), não o elemento. - Deixe o texto ao lado dizer o que o ícone ilustra: sem
label, ele é decorativo. - Passe
labelquando o ícone for a informação, sem texto ao lado — a modalidade só por ícone (E64). - Use
interativodentro de um cartão ou link comgroup: a caixa acende junto no hover. - Mantenha o mesmo tamanho e tratamento em todos os itens de uma grade.
Evite
- Usar o IconBox como botão: não tem foco nem alvo.
- Um ícone que carrega informação sozinho sem
label: ele ficaaria-hidden, e a informação some para quem ouve.
Quando não usar. Para uma pessoa, use o Avatar. Para um botão com ícone, o Button com aria-label. Para ícone sozinho no texto, o próprio ícone do lucide-react.
Anatomia
As partes, na ordem em que o olho — e o teclado — passam.
- Caixa — Quadrado de 32 a 80px, arredondado pelo `rounded` (círculo por padrão).
- Ícone — O átomo `Icone` (E66), no degrau da caixa: 16, 24, 32 e 32px — o `xl` usava 40, fora da escala. Traço do degrau (2; 1,75 no 32px), 1,5 no `outline`.
Estados
Os estados que a peça tem no código, e o que muda em cada um.
| Estado | O que muda |
|---|---|
| Primário | primary (padrão): fundo --primary-subtle (sólido, E64) e ícone vermelho — 4,32:1. |
| Secundário | secondary: fundo --secondary-subtle e ícone verde — 4,28:1. |
| Interativo | Com interativo, o group-hover do pai enche a caixa na cor cheia e deixa o ícone claro (E64). |
| Contorno | outline: sem fundo, borda --border, ícone cinza de traço fino. |
| Fantasma | ghost: sem fundo, ícone --ink. |
Comportamento
| Situação | O que acontece |
|---|---|
| Qualquer variante | Sem foco. Só reage ao hover com interativo, pelo group do pai. |
Relacionados
Como usar no código
A importação e o menor uso, lidos do arquivo. O … marca as props obrigatórias.
import { IconBox } from '@/app/components/atoms/IconBox';
<IconBox icon={…}>…</IconBox>Propriedades
Lidas do código da peça no build — não escritas à mão.
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|---|---|---|---|---|
size | 'sm' | 'md' | 'lg' | 'xl' | 'md' | não | Variante do cva. |
variant | 'primary' | 'secondary' | 'outline' | 'ghost' | 'primary' | não | Variante do cva. |
rounded | 'md' | 'lg' | 'xl' | 'full' | 'full' | não | Variante do cva. |
interativo | boolean | false | não | Reage ao group-hover do pai (E64): o cartão ou link inteiro é o alvo, e a caixa acende junto — enche na cor e o ícone fica claro. |
icon | LucideIcon | — | sim | — |
label | string | — | não | Quando o ícone é a informação, sem texto ao lado (E64) — a modalidade só por ícone, por exemplo. Com ele, a caixa vira role="img" com este nome; sem ele, é decoração, como sempre foi. |
Aceita também: React.HTMLAttributes<HTMLDivElement>.
Medidas
| Parte | Valor | Classe |
|---|---|---|
| `sm` | 32px, ícone de 16px | w-8 h-8 |
| `md` | 48px, ícone de 24px | w-12 h-12 |
| `lg` | 64px, ícone de 32px | w-16 h-16 |
| `xl` | 80px, ícone de 32px (E66) | w-20 h-20 |
Tokens de cor
Os tokens semânticos que o código da peça usa, com o valor de hoje em app/globals.css.
| Token | Valor | Usado como |
|---|---|---|
--primary | #D42B2B | bg-primarytext-primary |
--secondary | #0B8434 | bg-secondarytext-secondary |
--border | #E5E5E5 | border-border |
--foreground | #1A1A1A | text-ink |
--muted-foreground | #595959 | text-muted-foreground |
--primary-foreground | #FFFFFF | text-primary-foreground |
--primary-subtle | #FBEAEA | bg-primary-subtle |
--secondary-foreground | #FFFFFF | text-secondary-foreground |
--secondary-subtle | #EAF4EE | bg-secondary-subtle |
Leitor de tela
O que é anunciado, e por quê.
- O ícone é
aria-hidden: semlabel, a caixa não é lida e o sentido tem de estar no texto ao lado. - Com
label, a caixa érole="img"com esse nome — conferido no teste da ficha.
O que sustenta o estado
Esta peça usa estatico. O estado dela é o de quem já foi ouvido com leitor de tela nesses padrões — e não uma passada sobre esta peça em específico.
Falta ouvir: estatico — ver docs/a11y-screen-reader-checklist.md.
Status e recursos
| Tipo | Recurso | Status |
|---|---|---|
| Código | app/components/atoms/IconBox.tsx | Disponível |
| Ficha | Storybook (abre em outra aba) | Disponível |
| Teste de acessibilidade | axe em npm run test | No gate de todo commit |
| Leitor de tela | Passada da E33 | Falta ouvir |
| Design | Figma | Desativado até a Fase 2 |
Histórico
Os últimos commits que tocaram o arquivo, lidos do git no build.
fdd10ff2026-09-29ESTADO: E109 concluida, roteiro final fechado; proximo o merge na main
O histórico completo está no GitHub (abre em outra aba).