Identidade compartilhada · contratos universais

Foundations

Tokens e princípios mantêm significado, tipografia, espaço, forma, movimento, layout e acessibilidade coerentes — sem temas locais.

Cor

Camada 1 — primitivos são escalas cruas e fixas (a verdade física).Camada 2 — papéis semânticos dão significado e trocam entre claro/escuro.No produto, use sempre o papel — nunca o primitivo, nunca o hex.

Clique em qualquer amostra para copiar o var(--token). Alterne o tema no topo para ver os papéis trocarem ao vivo.

Papéis semânticos — superfícies e conteúdo

Identidade, ação e interação

A identidade institucional do Baluarte é acromática.

O logo usa contraste neutro; azul comunica interação e foco.

Vermelho pertence somente a erro, perigo e ação destrutiva.

A identidade cromática é compartilhada por toda a família e não possui variações por produto.

Um azul, um contrato: --accent é o papel canônico para interação, seleção e foco. --focus permanece apenas como alias de transição; marcas que definiam os dois seguem a matriz de adoção antes de remover o legado.

Status semânticos

Primitivos — neutros quentes

Os neutros do Baluarte são levemente quentes e fazem parte da assinatura comum. Nenhum produto substitui esses papéis por uma paleta paralela.

Primitivos — espectro funcional

Categóricos (tags, gráficos, features)

Faça Use papéis: color: var(--text), background: var(--surface). O tema escuro funciona sozinho.
Não faça color: #2c2c2b ou var(--b-neutral-800) direto no produto — quebra o tema e a manutenção.

Tipografia

Fonte oficial: Noto Sans (variável), com fallbacks Noto para árabe, japonês, coreano e chinês — o suporte multilíngue é parte da identidade. Ícones são Phosphor, carregados localmente em Regular, Bold e Fill.

A escala operacional continua densa entre 11–24px, mas os papéis editoriais agora chegam a 64px. O crescimento não adiciona tinta indefinidamente: displays estabilizam em peso 500, títulos usam 550 e o peso light 370 fica reservado à leitura contínua.

A referência OpenAI foi medida em seis páginas e dois viewports: 64/500, 48/500 e 30/500 formam o padrão editorial; no mobile, os degraus convergem sem inverter. O Baluarte destila essa proporcionalidade com Noto Sans local, sem copiar fonte, identidade ou CSS externo.

.b-display-2xl · 32–64/500Consistência é gentilezalandmark editorial
.b-display-xl · 32–48/500Consistência é gentilezahero institucional
.b-display-lg · 28–40/500Consistência é gentilezahero de produto
.b-display · 28–32/500Consistência é gentilezatítulo de página
.b-headline · 28/500Consistência é gentilezadestaque interno
.b-title-lg · 24/550Consistência é gentilezaseções grandes
.b-title · 20/550Consistência é gentilezatítulos de card/modal
.b-title-sm · 18/550Consistência é gentilezasubtítulos
.b-subtitle · 16/500Consistência é gentilezacabeçalhos menores
.b-body-lg · 15/455Consistência é gentileza com quem usa e com quem mantém.leitura confortável
.b-body · 14/455Consistência é gentileza com quem usa e com quem mantém.corpo padrão do sistema
.b-body-light · 14/370Consistência é gentileza com quem usa e com quem mantém.leitura contínua
.b-body-sm · 13/455Consistência é gentileza com quem usa e com quem mantém.densidade máxima
.b-label · 13/500Rótulo de controlebotões, campos
.b-caption · 12/400Legenda, metadado, timestampapoio
.b-overline · 11/600Categoria · Seçãoagrupadores
Proporcionalidade óptica. Entre 28 e 64px, o peso fica em 500; a hierarquia vem de tamanho, leading e tracking. Em 320/390px, papéis podem empatar para proteger reflow, mas nunca inverter.
PT-BR · displayUma ambição que acompanha o produtotracking −0,02em
árabe · displayتصميم واضح يخدم الجميعleading 1,20 · tracking normal
japonês · displayすべての人に明快な設計leading 1,20 · tracking normal

Tipografia de brand

A marca não herda a escala de títulos nem a escala de corpo. Nome e descritor formam um conjunto próprio, com peso 500 constante e diferença produzida por tamanho, cor e line-height — nunca por densidade adicional.

--b-brand-name-size · 18/500/22Baluartenome institucional
--b-brand-descriptor-size · 14/500/20Material Designdescritor da marca
brand lockupBaluarteMaterial Designum peso, duas escalas
Escala e densidade são eixos independentes. O lockup usa tokens exclusivos: 18px e 14px, ambos em peso 500. A hierarquia vem da escala e da cor sem misturar a marca com títulos de produto.
Sem meios-pixels. O legado tinha 14.5/13.5/12.5px — no Baluarte, snap para 14/13/12. Diferença imperceptível; grade preservada.

Espaçamento

Ritmo destilado do uso real: base-2 até 12px (a faixa densa que domina o produto) e base-4/8 acima.

Layout e espaçamento usam os tokens da escala.

Valores ópticos como 7, 9, 13, 17 ou 25px só podem surgir como resultado geométrico de borda + padding nos contratos de perímetro auditados; não são novos tokens de spacing.

--b-space-12px
--b-space-24px
--b-space-36px
--b-space-48px
--b-space-510px
--b-space-612px
--b-space-716px
--b-space-820px
--b-space-924px
--b-space-1032px
--b-space-1140px
--b-space-1248px
--b-space-1364px
Ritmo do menu lateral: itens consecutivos mantêm gap 0; a caixa de título de 24px mantém 10px até a primeira superfície por --b-nav-title-content-gap; grupos irmãos recebem 20px por --b-nav-section-gap. O inset do título é 10px por --b-nav-title-inset, e sua cor usa --nav-section-title com contraste mínimo de 4,5:1.

Shape

Raio + curva + papel semântico

squircle no core

Shape não é apenas um valor de border-radius.

O Baluarte combina raio e curva em quatro categorias: rounded rectangle, squircle, pill e circle.

Squircle identifica controles e superfícies que respondem diretamente à ação.

A assinatura é ampla, mas preserva formas canônicas.

Quatro categorias oficiais

Rounded rectangle

Campos, textareas e superfícies neutras.

Squircle

Controles e superfícies interativas de alta confiança.

Pill

Chips, tags e filtros compactos.

Circle

Avatares, radios, indicadores e Icon Buttons em composições radiais governadas.

Aplicações promovidas

Navegação lateral

Frame 260px, header 54px, itens 36px, ícones 20px, inset 7px e Squircle 16px; grupos respiram 20px, título e primeiro destino mantêm 10px e os títulos usam contraste secundário acessível; no rail, todos os ícones primários persistem mesmo se o grupo estava fechado, e o controle contextual aparece no hover/foco.

Buttons

Button permanece squircle; Icon Button pode usar Circle quando o contexto radial estiver explícito.

Escreva uma mensagemComposer

Container squircle com borda reforçada e ação circular a 9px da direita/base, estável em todos os estados.

Controle contextual do rail

O controle preserva a identidade do produto e reduz ruído visual.

Em desktop com mouse, o Sidebar Simple Regular aparece somente quando o rail expandido recebe hover ou quando o controle recebe foco.

No rail colapsado, a marca do produto ocupa o mesmo centro e só é substituída pelo comando quando o próprio controle recebe hover/foco; mover o ponteiro pelos vazios do rail mantém o logo, embora clicar ou tocar nesses vazios também expanda a navegação.

Baluarte
Expandido · repousoMarca textual, sem comando visível.
Baluarte
Expandido · hover/focoSidebar Simple Regular 20px; cursor w-resize em LTR.
Colapsado · repousoLogo em canvas óptico de 32px, sem fundo: escuro no tema claro e claro no escuro.
Colapsado · hover/focoSidebar Simple Regular 20px; cursor e-resize em LTR.
Produto ainda sem logoPhosphor Fill semântico de 24px, temporário e sem fundo.
PapelDesktop fineCoarseContrato
Frame expandido260px260pxDivisor de 1px e header de 54px
Frame colapsado49px49px48px internos + divisor 1px; eixo fixo em 24px
Superfície do controle/item36 × 36px · insets 6px44 × 44px · insets 2pxSquircle 16px; Sidebar Simple Regular 20px, logo 32px e fallback Fill 24px no mesmo eixo 24px
Comandoph ph-sidebar-simple · 20pxigualO nome acessível e o cursor comunicam abrir/recolher; RTL inverte apenas o cursor
Marca textual18px/500/22 + 14px/500/20igualEscala própria de brand, separada de títulos e corpo
Identidade provisória: sem logo oficial, escolha um Phosphor Fill de 24px que represente inequivocamente o domínio — nunca um símbolo genérico. O fallback usa a cor de conteúdo do tema, permanece sem fundo e recebe nome acessível pelo botão. O runtime também o revela quando o asset falha e restaura o logo após uma carga válida.

Cobertura expandida sem ruptura

  • Core: nav item, menu item, card interativo, account, entity item, radio row, picker, paginação e ação do toast.
  • Padrões: file tile/card, ferramentas independentes, fontes/links e composer.
  • Portal: destination cards, previews do catálogo, ações de copiar/limpar e swatches copiáveis.
  • Protegidos: inputs e superfícies neutras continuam rounded; chips e progresso continuam pill; avatares, radios, indicadores e Icon Buttons contextuais aprovados continuam circle.
Evidência real: o portal registra navegador, versão, suporte CSS, fallback simulado, forced colors e todos os interativos — inclusive sem raio — em reports/squircle-audit-v1.5.md.

Escala de fallback

Quando corner-shape: squircle não estiver disponível, o mesmo papel mantém seu raio arredondado. A geometria muda por capacidade do navegador, nunca durante hover ou seleção.

4px
8px
12px
16px
24px
pill
circle

Convergência de raios legados

A migração escolhe primeiro a categoria semântica e depois o degrau oficial. Não crie um novo token para preservar 6px, 10px ou outro valor intermediário.

LegadoDestino v1.5Critério
0–5px--b-radius-xs · 4pxdetalhe mínimo
6–9px--b-radius-md · 8pxcontrole compacto
10–13px--b-radius-xl · 12pxnavegação e superfície pequena
14–19px--b-radius-2xl · 16pxcontrole e card interativo
20–31px--b-radius-3xl · 24pxcomposer e superfície ampla
cápsula / 999px--b-radius-pillchip, tag ou progresso
50% com lados iguais--b-radius-circlepapel circular permitido
FaçaUse os tokens semânticos de shape e mantenha a curva estável entre estados.
Não façaNão transforme chips em squircle, avatares em rounded rectangle nem anime a forma no hover.

Elevação

Cinco níveis compartilhados cobrem cards, menus, painéis flutuantes e modais sem um salto excessivo entre painel e overlay.

elevation-1

cards, inputs

elevation-2

menus, hover elevado

elevation-3

toasts, painéis

elevation-4

painéis flutuantes

elevation-5

modais, drawers

Gaussian para superfícies sticky

O shell usa vidro funcional moderado: fundo semitransparente, blur de 20px e saturação 1,12. Ele substitui a linha horizontal do header, mas nunca o divisor estrutural entre navegação e conteúdo.

TokenValorUso
--b-effect-gaussian-blur20pxheaders sticky e superfícies de vidro governadas
--b-effect-gaussian-saturation1,12preserva legibilidade sem efeito vítreo excessivo

Motion

O sistema é rápido e discreto: micro-interações em 120ms dominam. Easing padrão é o uso dominante do sistema — cubic-bezier(.4, 0, .2, 1).

TokenValorUso
--b-motion-instant70msfeedback imediato (press)
--b-motion-fast120mshover, foco, toggles — o padrão do sistema
--b-motion-base160mstransições comuns de estado
--b-motion-gentle220msmenus, painéis, tooltips
--b-motion-slow300msmodais, canvas, layout
shell colapsável160/60ms · 220/200+140mslayout/texto no fechamento · layout/texto+delay na abertura
--b-ease-standardeasepadrão do sistema (51× no CSS real)
--b-ease-emphasizedcubic-bezier(.4, 0, .2, 1)movimentos maiores/expressivos
--b-ease-deceleratecubic-bezier(0, 0, .2, 1)elementos entrando
--b-ease-acceleratecubic-bezier(.4, 0, 1, 1)elementos saindo
Respeite prefers-reduced-motion: animações decorativas devem ser desligadas quando o usuário pedir menos movimento.

Iconografia

Phosphor 2.1 · práticas de símbolos inspiradas no Apple HIG

core v1.5

Phosphor é a única família de ícones de sistema. Regular, Bold e Fill são fontes locais derivadas do mesmo desenho; não há CDN, ligatura textual nem fallback de outra família. A caixa pertence ao Baluarte e o desenho pertence ao peso Phosphor correspondente.

Quatro caixas aprovadas

16px · compact

Chips, tabs densas e metadados.

20px · default

Botões, menus, navegação e campos.

24px · large

Headers e ações de destaque.

32px · display

Empty states e specimens.

Regular, Bold e Fill

Estado pareado

Regular comunica repouso; Fill comunica seleção. O label, aria-current ou aria-pressed continua sendo a fonte semântica.

Ênfase controlada

Regular usa o desenho-base de 16 unidades de stroke; Bold usa a fonte desenhada em 24 unidades. Nunca simule peso com CSS.

Aplicação por contexto

ContextoCaixaPesoVariante
Menu, lista ou label20pxRegularOutline
Toolbar compacta16–20pxRegularOutline
Ação isolada de destaque20–24pxBold somente com justificativaOutline
Selecionado ou favoritomesma caixa do repousomesmo papelFill
Empty state ilustrativo24–32pxRegularOutline por padrão

Práticas inspiradas nos símbolos da Apple

  • Trabalhe com texto. Ícone e label são elementos separados, centralizados pela mesma caixa; o ícone não recebe top, margem negativa ou translateY.
  • Preserve margens ópticas. A silhueta pode ocupar áreas diferentes dentro da caixa. Igualdade significa canvas, peso e alinhamento consistentes — não esticar todos os desenhos até a borda.
  • Outline é o padrão. Fill fica reservado a seleção ou maior superfície semântica; tamanho, peso e fill não mudam simultaneamente.
  • Peso acompanha hierarquia. Regular é o padrão e Bold é uma fonte desenhada, não um stroke artificial. A preferência por texto em negrito deve ser considerada nos produtos que a expõem.
  • Direção é semântica. Setas de navegação podem espelhar em RTL; relógios, mídia, marcas e objetos físicos não são espelhados automaticamente.
  • Nomeie pelo significado. O contrato usa um nome semântico estável e registra deprecações no de–para; não selecione um ícone apenas por semelhança visual.
  • Acessibilidade não depende do desenho.Ícone acompanhado de texto usa aria-hidden.Controle icon-only exige nome acessível.Cor ou Fill nunca são o único sinal de estado.
  • Alvo e glyph são diferentes. O ícone pode ter 16 ou 20px dentro de controles de 32, 40 ou 44px.

Contrato para ícone customizado

Somente crie um desenho quando o catálogo Phosphor não cobrir o conceito. Use viewBox 256, caps e joins arredondados, stroke 16 no Regular e 24 no Bold, margens compatíveis e versões Regular/Fill semanticamente equivalentes. A proposta precisa incluir nome, contexto, RTL, acessibilidade e teste a 16px.

Quatro classes de representação

Ícone de sistema

Ação ou conceito funcional; sempre Phosphor.

Marca oficial

Asset oficial do provider; nunca redesenhado como ícone.

Marca configurável

Emoji, ícone ou imagem escolhida pelo usuário em container estável e caixa óptica equivalente.

Ícone de arquivo

Representa formato ou conteúdo; não é uma ação.

FaçaUse 16/20/24/32 tanto em .b-icon quanto em .b-emoji; caixa fixa e nome acessível pertencem ao controle.
Não façaNão misture famílias, não simule stroke, não use emoji como ação universal e não corrija alinhamento por deslocamento manual.
<span class="b-icon b-icon--sm ph ph-house" data-icon="home" aria-hidden="true"></span>
<span class="b-icon ph ph-magnifying-glass" data-icon="search" aria-hidden="true"></span>
<span class="b-icon b-icon--lg b-icon--strong ph-bold ph-gear-six" data-icon="settings" aria-hidden="true"></span>
<span class="b-icon b-icon--lg b-icon--fill ph-fill ph-heart" data-icon="favorite" aria-hidden="true"></span>
<span class="b-emoji b-emoji--lg" aria-hidden="true">🤖</span>

Densidade · Modos de interação

core

O núcleo define três alvos de controle. Todos os produtos usam os mesmos modos por contexto e não criam alturas intermediárias ou escalas paralelas.

Compacto · 32px

Toolbars densas e desktop especializado, com alternativa de toque quando necessário.

Padrão · 40px

Botões, campos e controles gerais em interfaces produtivas.

Touch · 44px

Alvo mínimo para contextos móveis ou de baixa precisão.

Aplicação em Icon Button

A densidade controla alvo e glyph em conjunto: compact 32/16, default 40/20 e touch 44/24. Ênfase e seleção nunca alteram essas medidas. Theme switch e segmented são compound controls e seguem o componente pai.

Separação importante: densidade é uma decisão contextual. Um fluxo pode usar mais de um modo, desde que a escolha siga a mesma regra de contexto, coerência e acessibilidade.

Layout adaptativo

core

O sistema não impõe uma única largura para contextos diferentes. Ele fornece limites, receitas e regras responsivas comuns; medidas específicas precisam nascer como extensão governada, nunca como CSS privado.

Limites compartilhados

--b-layout-reading720pxLeitura contínua e documentação.
--b-layout-content1120pxConteúdo de aplicação e grids.
--b-layout-wide1280pxWorkspaces e dados densos.
--b-layout-gutter16–32pxGutter fluido do viewport.

Alinhamento ao perímetro

Quando um descendente é o último elemento visual antes de um canto, sua distância às arestas adjacentes deve ser igual. O alvo é delta geométrico zero; 0,1px CSS existe apenas como tolerância numérica de subpixel, a correção nasce de padding, tamanho e layout, nunca de deslocamento manual.

ContratoArestasResultado
Composer / açõeslaterais + base9px / 9px / 9px
Toolbar / fechartopo + direita + base8px / 8px / 8px
File card / tiletopo + base + esquerda7px / 7px / 7px
Nav / item atualtopo + laterais9px / 9px
Dialog / dangerdireita + base25px / 25px
Menu / primeiro íconetopo + esquerda15px / 15px
Menu / superfícies extremastopo + laterais + base7px / 7px / 7px
Picker / uploadlaterais9px / 9px
Media Card / footerlaterais + base1px / 1px / 1px
Não confunda os contratos: alinhamento de ícone e texto trata o conteúdo dentro do controle; alinhamento ao perímetro trata o controle ou tile em relação à borda da superfície externa.

Três receitas genéricas

Focused

Uma coluna principal com largura de leitura e ações próximas ao contexto.

App shell

Navegação persistente e conteúdo flexível; a largura responde aos tokens e limites compartilhados.

Split workspace

Conteúdo e painel contextual com reflow para overlay ou stack conforme espaço disponível.

Critérios de mudança estrutural

  • Prefira container queries ou capacidade real do conteúdo a breakpoints herdados.
  • Quando duas regiões não couberem, reflow antes de comprimir leitura ou área de toque.
  • Sidebars, canvases e docks adicionais entram como extensões governadas e continuam obedecendo à assinatura da família.
  • Valide 320px, 390px, tablet, desktop, zoom 200% e conteúdo longo.

Acessibilidade

Acessibilidade no Baluarte não é auditoria posterior — está embutida nos tokens.

Contraste (WCAG AA) — verificado por cálculo

ParClaroEscuroStatus
text / bg13.98:115.30:1 AAA
text-subtle / bg6.58:16.42:1 AA
text-muted / bg3.23:16.33:1 claro: apenas texto grande/decorativo
on-action / action13.98:115.30:1 AAA
on-accent / accent4.54:14.54:1 AA
on-danger / danger (fill)6.71:16.36:1 AA
accent (foco) / bg4.54:13.88:1 ≥ 3:1 (UI)
info / info-bg7.13:15.81:1 AA
success / success-bg6.60:16.79:1 AA
danger / danger-bg6.13:16.28:1 AA
warning / warning-bg6.86:19.21:1 AA
link / bg5.79:16.97:1 AA
Regra do muted: --text-muted no tema claro é a cor histórica do sistema (#8f8f8f) e passa apenas AA-large. Para texto secundário em tamanho normal, use --text-subtle. Todo par novo deve ser validado por cálculo: ≥ 4.5:1.

Foco visível

Campos de texto seguem o padrão do sistema: a borda "acende" em azul (border-color: var(--accent), 120ms) — sem anel/glow.

Demais interativos (botões, links, toggles) usam outline: 2px solid var(--accent) no :focus-visible.

Nunca remova o indicador sem substituto equivalente (contraste da borda de foco: 4.54:1 claro / 3.88:1 escuro — ≥ 3:1 exigido).