Catálogo compartilhado · maturidade explícita
Componentes
Encontre cada componente pelo uso e pelo exemplo. Contratos estáveis permanecem separados das extensões em validação.
Visão geral visual
Escolha pelo que o componente faz
Cada grupo começa por uma amostra reconhecível. A matriz exaustiva continua disponível como evidência, sem interromper a consulta dos componentes.
Grupo 01
Ações e comandos
Inicie ações, agrupe comandos relacionados e preserve hierarquia sem recorrer ao vermelho como identidade.
Visão do grupo
Comandos essenciais
Ações textuais, grupos compactos e toolbars compartilham ritmo, foco e iconografia.
<button class="b-button-link" type="button">Ação em linha</button>
Button
estávelSeis variantes, fiéis ao produto: filled (ação neutra — o primário real, quase-preto no claro e invertido no escuro), accent (CTA azul, como o "compartilhar" real) e danger — o vermelho é só perigo/erro/destruição, nunca identidade institucional nem ação genérica. Todas usam o papel squircle; somente chips continuam pill.
.b-btn--block; grids não podem esticá-los silenciosamente.<button class="b-btn b-btn--filled"> <span class="b-icon ph ph-plus" data-icon="add" aria-hidden="true"></span> <!-- ícone: elemento próprio --> <span class="b-row-label">Criar item</span> <!-- label: text-box no CSS --> </button>
Icon Button
coreIcon Button é um comando sem label visível. A classificação possui cinco eixos independentes: densidade, ênfase, comportamento, shape e contexto. Squircle continua sendo o padrão; Circle é uma variante contextual governada.
Densidade
| Papel | Alvo | Ícone | Uso permitido |
|---|---|---|---|
compact | 32 × 32 | 16 | Toolbar ou grupo denso no desktop; nunca isolado em contexto touch. |
default | 40 × 40 | 20 | Ação padrão em header, card, dialog, composer ou área produtiva. |
touch | 44 × 44 | 24 | Ação isolada ou prioritária em contexto coarse/mobile. |
navigation-perimeter | 36 × 36 fine · 44 × 44 coarse | 20 Regular | Exclusivo de .sidebar-collapse-toggle; usa Sidebar Simple e logo sem fundo em 32px e fallback Fill em 24px no repouso colapsado. |
Shape
| Shape | Classe | Critério |
|---|---|---|
| Squircle | .b-icon-btn | Padrão para ações standalone, shell, cards e toolbars. |
| Circle | .b-icon-btn--circle | Action oficial do composer ou filho direto de .b-icon-btn-context--radial. |
Ênfase
Comportamento
- Ação momentânea: executa uma operação e não usa
aria-pressed. - Toggle: preserva o mesmo tamanho e usa
aria-pressed; Fill pode comunicar seleção. - Tooltip: complementa descoberta, mas
aria-labelcontinua obrigatório. - Compound control: células de theme switch e segmented pertencem ao grupo; não são variantes de Icon Button.
- Circle: é permitido por contexto, nunca como atalho de ênfase. O composer conversacional é a aplicação promovida de referência.
<button class="b-icon-btn b-icon-btn--compact" aria-label="Desfazer" type="button"> <span class="b-icon ph ph-arrow-counter-clockwise" data-icon="undo" aria-hidden="true"></span> </button>
Chip
estávelFiltros selecionáveis (aria-pressed) e tags de contexto passivas.
<button class="b-chip" aria-pressed="true"> <span class="b-icon b-icon--sm ph ph-check" data-icon="check" aria-hidden="true"></span> <span class="b-row-label">Ativos</span> </button>
Grupo 02
Entradas e seleção
Colete texto, escolhas e arquivos com rótulos, foco e estados previsíveis.
Visão do grupo
Controles de entrada
Busca, seleção, faixa e upload usam o mesmo contrato de altura, foco e resposta.
<label class="b-search-field"> <span class="b-icon b-icon--sm ph ph-magnifying-glass" aria-hidden="true" data-icon="search"></span> <input type="search" aria-label="Buscar" /> </label>
Text field
estávelLabel sempre visível, hint opcional, erro com aria-invalid.
Foco fiel ao produto: a borda "acende" em azul (--accent)
— troca de border-color em 120ms, sem anel/glow.
<div class="b-field"> <label class="b-field__label" for="nome">Nome do projeto</label> <input class="b-input" id="nome" placeholder="Ex.: Atendimento comercial" /> <span class="b-field__hint">Visível para toda a equipe.</span> </div>
Switch · Checkbox · Radio
estávelSeletores por ícone, checkbox e switch compartilham o mesmo accent, foco e área de interação.
<label class="b-check">
<span class="b-switch">
<input type="checkbox" checked />
<span class="b-switch__track"></span>
<span class="b-switch__thumb"></span>
</span>
Notificações
</label>
Picker
candidatoSeletor de imagem, emoji ou ícone derivado do Mark Selector preservado.
O frame converge para 378px e painel de 320px para manter dez células exatas de 36 × 36px por linha, com Squircle 16px; ícones e emojis usam a mesma caixa de 20px da navegação lateral.
As tabs usam 14px/400/21px e indicador compartilhado de 2px com movimento lateral.
Em larguras menores, a grade preserva dez colunas e rola dentro do componente.
Seleção, teclado, upload por clique/drop e insets simétricos permanecem.
Clique ou solte uma imagem acima.
<div class="b-picker">
<div class="b-picker__cats" role="tablist">…</div>
<div class="b-picker__panel" role="tabpanel">
<div class="b-picker__grid" role="listbox">
<button class="b-picker__cell" role="option"
aria-selected="false" tabindex="0" type="button">…</button>
</div>
</div>
<input data-picker-value name="representation" type="hidden"/>
<span data-picker-status class="sr-only" aria-live="polite"></span>
</div>Tabs
estávelTabs usam a mesma tipografia 14px/400/21px dos itens do sidebar.
Os ícones junto ao título permanecem em 16px.
Hover altera somente .b-tab__inner; o indicador governado de 2px se desloca lateralmente entre as tabs e compartilha espessura e movimento com o Picker.
<div class="b-tabs" role="tablist" aria-label="Conteúdo">
<button class="b-tab" id="tab-volume" role="tab" aria-selected="true"
aria-controls="panel-volume" tabindex="0"><span class="b-tab__inner">Volume</span></button>
<button class="b-tab" id="tab-files" role="tab" aria-selected="false"
aria-controls="panel-files" tabindex="-1">Arquivos</button>
</div>
<div id="panel-volume" role="tabpanel" aria-labelledby="tab-volume">…</div>
Grupo 04
Conteúdo e dados
Apresente entidades, arquivos e informação estruturada para leitura e comparação.
Core incrementado · v1.5
Conteúdo e dados
const family = "Baluarte";<article class="b-kpi-card"><span>Conversas</span><strong>1.284</strong></article>
Conta do usuário
candidatoExtensão para o rodapé de uma navegação.
No rail composto, fica fora do corpo rolável, dentro do footer fixo de 60px com separador superior.
Avatar, nome e descrição permanecem legíveis no estado aberto; nome e plano usam line-height 16/15px e gap 2px, um meio-termo entre a versão original e a compactação anterior.
No estado compacto, o botão preserva nome acessível e reduz a superfície para 36 × 36px fine — ou 44 × 44px em coarse —, igual aos itens acima.
Avatar mede 20px, permanece no eixo 24px durante toda a transição e usa `--accent` + `--on-accent` com contraste textual mínimo 4,5:1.
Nome e plano fecham em 60ms e retornam em 200ms após 140ms, sem reaparecer antes da expansão da superfície.
A cor usa papel semântico do sistema, nunca valor cru; a superfície mantém Squircle em hover, active e expanded.
<button class="b-account">
<span class="b-account__avatar">L</span>
<span class="b-account__info">
<span class="b-account__name">Luiz Torres</span>
<span class="b-account__desc">Plano Pro</span>
</span>
</button>
Entity item
coreLinha compacta de entidade com representação visual, nome com ellipsis, ação contextual e estado de atividade.
Hover, foco, active e aria-current preservam o mesmo Squircle 16px.
Como filho direto de `.b-nav`, adota a geometria do rail: 36px, padding 7px, mark 20px, gap 8px e início do label em 35px; no colapso, nome, ação contextual e spinner são ocultados sem deslocar o mark.
`aria-current="false"` permanece neutro, disabled não mostra ação auxiliar e o botão mantém nome acessível independente do label visual.
A cor `--text` permanece igual em default e hover; o estado muda pela superfície.
Loading não bloqueante combina `aria-busy="true"`, nome acessível com “carregando” e spinner visível somente no rail aberto; o item permanece habilitado e conserva hover, foco e ativação.
<button class="b-entity-item" aria-current="true"> <span class="b-entity-item__mark">🤖</span> <span class="b-entity-item__name">Campanha de inverno</span> <span class="b-entity-item__more b-icon ph ph-dots-three" data-icon="more_horiz" aria-hidden="true"></span> </button>
Card
estávelCards neutros permanecem rounded rectangle. Somente .b-card--interactive recebe squircle e estados hover, active e disabled.
Outlined
Borda sutil, o padrão para agrupar conteúdo.
Elevated
Sombra nível 1 para destaque leve.
<article class="b-card"><h3>Título</h3><p>Conteúdo do card.</p></article>
List
estável<ul class="b-list"><li class="b-list__item"><span class="b-list__content">Item</span></li></ul>
Table
estável| Item | Volume | Satisfação | Status |
|---|---|---|---|
| Relatório mensal Automático | 1.284 | 94% | ativo |
| Catálogo premium | 867 | 91% | ativo |
| Nova operação | 203 | 88% | revisão |
<div class="table-scroll"><table class="b-table"><thead><tr><th>Nome</th></tr></thead><tbody><tr><td>Item</td></tr></tbody></table></div>
Badge · Avatar
estável<span class="b-badge b-badge--success">ativo</span> <span class="b-avatar" aria-label="Luiz Torres">LT</span>
Media card
coreCard de mídia para bibliotecas e catálogos — mídia quadrada, hover por elevação sem escurecer a borda, ícone específico do formato e rodapé em bloco alinhado às laterais e à base.
Largura real: grid minmax(220px, 1fr) · gap 16 — use .b-media-grid; o card nunca estreita abaixo de 220px e a mídia é sempre quadrada (1:1).
<button class="b-media-card b-media-card--ppt" type="button"><span class="b-media-card__media"><span class="b-icon ph ph-file-ppt" data-icon="file_ppt" aria-hidden="true"></span></span><span class="b-media-card__body"><strong>Arquivo</strong></span></button>
Grupo 05
Feedback e overlays
Comunique resultado, progresso, interrupção e atenção no momento certo.
Core incrementado · v1.5
Feedback e estado
Publicado usa ponto azul pulsante para disponibilidade pública.
Live usa ponto verde estático para uma sessão efetivamente em andamento.
Texto permanece obrigatório; cor nunca atua sozinha.
<span class="b-status-indicator b-status-indicator--published">Publicado</span> <span class="b-status-indicator b-status-indicator--live">Live</span>
Dialog
estávelScrim + superfície elevada (nível 4).
Foco preso no diálogo; Esc fecha.
Header, body e footer compartilham perímetro horizontal de 24px; o último botão fica a 25px da direita e da base, incluindo a borda, sem aumentar a altura do diálogo.
Excluir item?
Esta ação não pode ser desfeita. O item Relatório mensal será removido permanentemente.
<div class="b-dialog" role="dialog" aria-modal="true" aria-labelledby="dialog-title"><h2 id="dialog-title">Confirmar ação</h2></div>
Alert · Toast
estável<div class="b-alert b-alert--success" role="status">Configuração salva.</div> <div class="b-toast" role="status">Link copiado.</div>
Tooltip
coreComponente core para rótulos breves e atalhos. Usa a superfície do tema, contraste validado e conteúdo não essencial; em toque, o rótulo precisa existir por outro canal acessível.
<span class="b-tooltip">Nova conversa<span class="b-tooltip__command">⇧⌘O</span></span>
Contrato candidato: o atalho aparece como texto secundário ao lado do rótulo. Conteúdo essencial nunca depende de tooltip, e o padrão precisa de alternativa para toque.
Progress · Skeleton
estável<div class="b-progress" aria-label="64% concluído"><div class="b-progress__bar"></div></div> <span class="b-spinner" aria-label="Carregando"></span>
Empty state
estável<div class="b-empty"><span class="b-icon b-icon--xl ph ph-folder" aria-hidden="true" data-icon="folder"></span><strong>Nenhum item</strong></div>
Grupo 06
Anatomia e qualidade
Aplique estados, medidas e alinhamento como contratos verificáveis.
Contrato de comportamento
Matriz de estados por aplicabilidade
“Completo” não significa aplicar todos os estados a tudo. Significa que cada família declara quais estados são obrigatórios, opcionais ou não aplicáveis.
| Família | Default | Hover | Focus | Active | Disabled | Selected | Loading | Error |
|---|---|---|---|---|---|---|---|---|
| Ações | ● | ● | ● | ● | ● | — | quando assíncrona | via feedback |
| Seleção | ● | ● | ● | ● | ● | ● | — | — |
| Campos | ● | opcional | ● | — | ● | — | quando assíncrono | ● |
| Navegação | ● | ● | ● | ● | quando controle | aria-current | — | — |
| Cards interativos | ● | ● | ● | ● | ● | quando seleção | quando assíncrono | via feedback |
| Feedback | visível | quando ação | quando ação | quando ação | — | — | próprio estado | próprio estado |
aria-busy="true" e disabled; Entity Item pode declarar loading não bloqueante e preservar hover/ativação; disabled nunca responde a hover/active; cor nunca é o único sinal de selected, loading ou error.Anatomia · Espaçamento
estávelMedidas expostas: roxo = padding do container, azul = conteúdo, laranja = gap.
O eixo vertical aparece ao lado do horizontal.
Inset interno pertence ao componente; margem externa pertence à composição e não precisa repetir o mesmo valor.
Todos os valores vêm da escala --b-space-*.
Botão (h40 · pad-inline 16 · gap 6)
Campo (h40 · pad-inline 12)
Item de menu (pad 8 · gap 8 · radius 24)
Modos de controle do núcleo
| Modo | Altura | Uso | Regra |
|---|---|---|---|
| Compacto | 32px | Desktop especializado | Somente com contexto e alternativa de toque |
| Padrão | 40px | Controles gerais | Default do núcleo |
| Touch | 44px | Mobile e baixa precisão | Alvo mínimo recomendado |
| Específico | documentado | Padrões compostos | Vive como extensão governada, não como implementação privada |