Design System · proposta final · v2.0

O Design System
da Razac, no ponto ideal.

Não é a réplica do que existe — é o de-para de cada componente, de hoje para o ideal. Tabelas, variações e boas práticas numa biblioteca única, com identidade própria e pronta pro dev consumir. As cores do produto seguem as atuais; a V2 traz as novas cores da Razac.

1
biblioteca única
kit do Portal 2.0
6+
de-para mapeados
hoje → ideal
100%
tokenizado
zero hex solto
O princípio: de-para
Botão
Hoje

shadcn cru — tokens quebrados (texto sem contraste), cantos retos, sem variação cancel.

Ideal

Pill, 6 variações (+ cancel vermelho), 3 tamanhos, foco visível, ícone esq/dir. Bate com o portal.

Tabela
Hoje

Markup solto, cada tela remontava do zero — densidade, zebra e ordenação inconsistentes.

Ideal

Um <P2Table/> tipado, 3 variações, denso, seleção, ordenação, footer. Mesma tabela em toda tela.

Fundamentos

Cor

Os tokens do produto seguem os atuais (a V2 troca por aqui). O namespacedsé a marca da ferramenta de DS — não aparece no produto.

Produto
primary
#4F46E5
primary-50
#EEF2FF
primary-700
#4338CA
ink
#1E293B
ink-muted
#64748B
bg-subtle
#F8FAFC
border
#E2E8F0
bg-sidebar
#0F172A
Canal DI
canal-verde
#16A34A
canal-amarelo
#EAB308
canal-vermelho
#B91C1C
canal-cinza
#94A3B8
Semântica
success
#16A34A
warning
#EA580C
danger
#B91C1C
info
#1E40AF
DS · marca
ds-600 · brand
#7C3AED
ds-400
#A78BFA
ds-accent
#22D3EE
ds-ink
#0B0B14
Fundamentos

Tipografia

Inter — pesos 400/500/600/700/800. Escala enxuta, anti-scroll.

Display30 / 800
Título da página24 / 800
Seção15 / 700
Corpo14 / 400
Apoio13 / 400
Legenda · UPPER12 / 700
Fundamentos

Espaço & Grid

Grade de 4. Tudo encaixa em múltiplos — gutters, paddings, gaps.

4
8
12
16
24
32
48
64
Fundamentos

Elevação & Raio

shadow-card
rounded-card
Cards e tabelas
shadow-cardHover
rounded-card
Hover / foco
shadow-modal
rounded-2xl
Drawers e modais
Fundamentos

Movimento

Discreto e funcional. Entradas 200–240ms, easing suave. Nunca enfeite que atrapalha leitura.

fadeIn
200ms · ease-out
opacidade
slideUp
240ms · ease-out
translateY 8→0
Componente

Botões

Botão
Hoje

shadcn cru — tokens quebrados (texto sem contraste), cantos retos, sem variação cancel.

Ideal

Pill, 6 variações (+ cancel vermelho), 3 tamanhos, foco visível, ícone esq/dir. Bate com o portal.

variant="primary"
PropTipoDefaultDescrição
variant'primary' | 'secondary' | 'outline' | 'ghost' | 'danger' | 'cancel''primary'Estilo. cancel = texto vermelho do portal.
size'sm' | 'md' | 'lg''md'Altura 32 / 36 / 44.
icon / iconRightLucideIconÍcone à esquerda / direita.
fullbooleanfalseOcupa 100% da largura.
tsx
import { P2Button } from '@/components/portal2/kit'

<P2Button variant="primary" size="md" icon={Save}>
  Salvar
</P2Button>
<P2Button variant="cancel">Cancelar</P2Button>
Componente

Tabelas

Tabela
Hoje

Markup solto, cada tela remontava do zero — densidade, zebra e ordenação inconsistentes.

Ideal

Um <P2Table/> tipado, 3 variações, denso, seleção, ordenação, footer. Mesma tabela em toda tela.

variant="striped" · dense
ProcessoClienteCanalEtapa
SKT0469-SCDIAlessandra AguiarVerdeDesembaraçoUSD 48.250
CHB0086-ESDIBeatriz OliveiraAmareloRegistroUSD 12.900
RCH0002-SCDURiachuelo KnappVermelhoEm trânsitoUSD 91.430
3 de 47 processos
Boas práticas
  • Valores numéricos sempre à direita.
  • Cabeçalho em caixa-alta 12px, ink-subtle.
  • Densa por padrão em telas operacionais (anti-scroll).
  • Status via P2ChipDI / P2Tag — nunca cor solta na célula.
  • Linha clicável só quando leva a um detalhe.
PropTipoDefaultDescrição
colsP2Col<T>[]Colunas tipadas: header, cell(row), align, sortable.
variant'default'|'striped'|'bordered''default'Zebra / divisórias.
densebooleanfalseAltura de linha compacta.
selectablebooleanCheckbox por linha + estado selecionado.
onRowClick(row) => voidAbre o detalhe.
tsx
const cols: P2Col<Processo>[] = [
  { key: 'proc', header: 'Processo', cell: (r) => <b>{r.proc}</b> },
  { key: 'valor', header: 'Valor', align: 'right', sortable: true,
    cell: (r) => r.valor },
]

<P2Table cols={cols} rows={rows} variant="striped" dense selectable />
Padrão · PRJ-6239

Rateio — Alocar Contas-Projeto

Modal de rateio da nota de fornecedor por conta-projeto × processo (QIVE 1.4). Casca no novo primitivoP2Modal— fiel à referência do sistema (“Mensagens de validação”) e 100% tokenizado. Padrão atual = variação Linhas (feedback Gabriela): conta + processo trocáveis por linha, sem scroll lateral.

Modal · Alocar Contas-Projeto (vivo)

Rateio da nota por conta-projeto e processo, com validação do total e envio ao Conexos.

Critérios de design

Modelo de Linhas — o padrão atual do rateio.

  • Estrutura. Cada linha é um trio: conta-projeto + processo + valor. Os dois selects trocam na própria linha. A grade cresce só na vertical — sem scroll lateral.
  • Adicionar. "Adicionar conta projeto" na última linha; o clique já abre o seletor de conta (menos passos).
  • Sugestão (última zerada). Sobrando UMA linha em branco + valor em aberto, aparece "Usar R$ X" (o que falta pra fechar). Com UMA conta só, vira o botão "Alocar esse valor em aberto".
  • Rodapé em 2 blocos. Bloco 1 = totais (neutro, só informação). Bloco 2 = status: âmbar (pendência) · vermelho (acima do total) · VERDE (100% + sem pendência → "Pronto para enviar" e libera o Enviar).
  • Concluído. Ao enviar, fecha e marca "Enviado ao Conexos"; reabrir mostra o rateio salvo.
  • Totais de apoio. Subtotal por conta-projeto (um chip por conta) + Total por processo em chips com barra (nunca vira coluna).
  • Entrada. Abre só pelas três bolinhas (Ações) — na tela dedicada e em Documentos Tomados. Sem link/card solto.
Variações (nas três bolinhas)
  • Linhaspadrão — feedback Gabriela
  • Linhas · contas pré-carregadastodas já disponíveis; zeradas somem ao salvar
  • Matrizprocessos em coluna — proposta anterior, comparação
PropTipoDefaultDescrição
open / onCloseboolean / ()=>voidControle de abertura (via P2Modal).
layout'cards'|'matriz'|'linhas'|'linhas-todas'Corpo do modal. Padrão atual = linhas.
docRateioDocnumero, fornecedor, valorTotal, processos[].
contasDisponiveisContaProjeto[]Contas selecionáveis no dropdown.
initialContaAloc[]Alocação inicial — identificadas() zera tudo.
onSalvar / onEnviar(next) => voidSalvar (sempre) / Enviar (100% e sem zero).
tsx
import { RateioModal, identificadas } from '@/components/screens/rateio-contas-projeto/RateioModal'

<RateioModal
  open={open} onClose={() => setOpen(false)}
  layout="linhas"            // padrão atual (feedback Gabriela)
  doc={{ numero, fornecedor, valorTotal, processos }}
  contasDisponiveis={CONTAS}
  initial={identificadas(IDENTIFICADAS, processos)}
  onSalvar={setSaved}
  onEnviar={enviarAoConexos}
/>
Componentes

Biblioteca

A biblioteca final é o kit do Portal 2.0 — tudo abaixo é o componente real, vivo, do mesmo arquivo que monta as telas.

Status & Canal
VerdeAmareloVermelhoSem DI
neutralprimarysuccesswarningdangerinfo
KPI
Processos
47+5
Atrasados
6+2
Inputs & Form
Tabs · Progress · Avatar
VDTRRM
Kanban card
CHB0086-ESDI

Beatriz Oliveira

AUTOMOTIVO
G5Amarelo
Empty state

Nada encontrado

Ajuste os filtros.

Status / Canal
Hoje

Pílulas de canal recriadas com hex solto em cada tela.

Ideal

P2ChipDI + P2Tag semânticos (6 tons), sempre via token.

Inputs
Hoje

Alturas e foco variando entre telas, label desalinhada.

Ideal

P2Field + Input/Select/Search com altura 36, foco ring primary, erro e hint padronizados.

Sidebar / Shell
Hoje

Cada protótipo refazia a casca; itens fora de ordem.

Ideal

P2Shell único: sidebar dark + topbar com busca, avatar e ações.

KPI / Métrica
Hoje

Cards de número ad-hoc, sem delta padronizado.

Ideal

P2KPI com label, valor, delta colorido e hint.

Para o time de Dev

Como o dev consome

Três caminhos, do mais simples ao mais automatizado. Tudo aponta pra mesma fonte da verdade.

1 · Tokens

Tailwind config + CSS vars. O dev usa a classe, não o hex.

2 · Componentes

Importa o kit tipado. Props validadas, zero remontagem.

3 · MCP / Figma

Code Connect liga o nó do Figma ao componente real.

Token → classe
tsx
// nunca o hex; sempre o token
<div className="bg-primary text-white rounded-card" />
<span className="text-canal-vermelho" />
Componente
tsx
import { P2Table, P2Button } from '@/components/portal2/kit'

<P2Table cols={cols} rows={rows} dense selectable />
<P2Button variant="primary" icon={Save}>Salvar</P2Button>
Tokens como dados (API / JSON)
json
{
  "color": {
    "primary":      "#4F46E5",
    "canal-verde":  "#16A34A",
    "canal-vermelho":"#B91C1C"
  },
  "radius": { "card": "12px", "pill": "9999px" }
}
MCP · Figma Code Connect
ts
// liga o nó do Figma ao componente do código
figma.connect(P2Button, 'https://figma.com/…?node-id=…', {
  props: { variant: figma.enum('Variant', { Primary: 'primary' }) },
  example: (p) => <P2Button variant={p.variant} />,
})
Processo

Governança

O DS é a fonte da verdade

Toda mudança de tela/componente reflete no DS — sempre.

Token, nunca hex

Cor solta não passa em review. CI pode bloquear.

Componente novo segue 3 passos

Entrada no kit → preview → doc com de-para.

Versão por componente

history[] com data e PRJ; nada quebra silenciosamente.

Paridade com o portal real

O ideal evolui o real; não inventa divergência gratuita.

De-para é obrigatório

Todo upgrade documenta o hoje → ideal.

Próximo

Roadmap · V2

AgoraBiblioteca final + de-para + Portal 2.0 aplicadofeito
V2Trocar as cores do produto pelas novas cores da Razacpróximo
V2Code Connect publicado (Figma ↔ código)planejado
V2Tokens exportados como pacote (JSON + CSS vars)planejado
Pronto pra propor

Veja a biblioteca aplicada de ponta a ponta no Portal 2.0.