Saulo B_
Referência oficial de identidade visual, tokens, componentes e princípios de marca. Fonte única da verdade para todas as páginas do portfólio.
Marca & Posicionamento
Identidade, arquétipo, voz e princípios que precedem e orientam todas as decisões visuais.
Ver MoodboardComo medir impacto real,
se não conseguimos definir o que é real?
Posicionamento
Designer sênior T-shape que usa IA e código para transformar amplitude em método. Conecta pontas que especialistas deixam separadas: pesquisa, estratégia, prototipação funcional e comunicação com stakeholders.
Arquétipo Principal — O Criador
Materializa visões. Transforma ideias abstratas em coisas reais e funcionais. Revela raciocínio por trás das decisões. Demonstra como algo foi construído, não apenas o resultado final.
Arquétipo Secundário — O Mago
Conecta mundos incompatíveis. Faz a ponte entre linguagens do designer, engenheiro e gestor. Transita entre C-level e squad técnico sem perder coerência de narrativa.
Voz
Direta, curiosa, intelectualmente honesta. Não bajula, não usa jargão para parecer sofisticado. Tem camadas filosóficas, questiona premissas, admite incerteza quando ela existe.
Nicho
Produto digital B2B, industrial e corporativo. Ambientes onde decisões são difíceis, stakeholders são técnicos e impacto precisa ser justificado. Força em SAP Fiori, Mendix, SAP BTP.
O que Saulo B_ não é
Não entrega o que o cliente pediu sem questionar. Não aplica tendências por moda. Não confunde volume de entrega com impacto. Não bajula stakeholder — apresenta dados, inclusive os inconvenientes.
Logotipo
Wordmark, símbolo e especificações de uso. O underscore é o diferencial visual — referencia cursor de texto e cultura de linha de comando.
O underscore "_" do logotipo imita o cursor de texto piscando — comportamento que referencia a cultura de linha de comando e programação. Só deve ser aplicado no logotipo principal, nunca em títulos ou body text.
var(--blue)Tom de Voz
A voz é fixa. O tom se adapta ao contexto. Direto, questionador, nunca corporativo vazio.
Estratégico e Direto
LinkedIn · apresentações · liderança
"Três projetos descartados após discovery em 2024 representam aproximadamente 12 meses de desenvolvimento evitado. Isso não aparece no relatório de entregas — mas deveria."
Técnico e Colaborativo
Devs · squads · documentação
"O componente usa o padrão Fiori Flexible Column Layout. Antes de adaptar, preciso entender como o backend vai lidar com o estado da navegação em telas intermediárias."
Reflexivo e Provocador
Thought leadership · portfólio · conteúdo
"Todo mundo quer design centrado no usuário. Poucos querem pagar pelo discovery que torna isso possível. O problema não é metodologia: é que design ainda não aprendeu a falar o idioma que libera orçamento."
Paleta de Cores
Clique em qualquer swatch para copiar o valor hex. Tokens CSS são a fonte única da verdade — nunca usar valores hardcoded.
Tipografia
Space Grotesk em todos os contextos. Import via Fontshare. Nunca usar Inter, Roboto ou fontes de sistema.
/* Import — sempre via Fontshare */
@import url('https://api.fontshare.com/v2/css?f[]=space-grotesk@700,600,500,400&display=swap');
--font: 'Space Grotesk', sans-serif;
Espaçamento & Grid
Containers controlam padding horizontal. Sections controlam padding vertical. Nunca padding horizontal direto em section.
| Classe | Max-width | Uso |
|---|---|---|
.container-lg |
1200px | Nav, hero, sobre, cases, footer |
.container-md |
1024px | Conteúdo principal, grids duplos |
.container-sm |
840px | Leitura centralizada, hero text |
.full-bleed |
100% | Letreiro, banners edge-to-edge |
| Viewport | Media query | Padding | Token |
|---|---|---|---|
| Desktop | 1024px+ | 32px | --space-desktop |
| Tablet | max-width: 1023px | 24px | --space-tablet |
| Mobile | max-width: 767px | 16px | --space-mobile |
Ícones
Phosphor Icons via CDN. Sempre usar peso Regular (ph ph-nome). Nunca misturar bibliotecas.
/* CDN */
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/regular/style.css">
/* Uso */
<i class="ph ph-arrow-right" aria-hidden="true"></i>
Motion
Motion é funcional, não decorativo. Use para confirmar ações, guiar atenção e dar feedback. Passe o mouse sobre as caixas para sentir as curvas.
Ease Out — Ações de entrada
cubic-bezier(.25,.46,.45,.94)
Ease Spring — Interações de feedback
cubic-bezier(.34,1.56,.64,1)
Ease In-Out — Transições de estado
cubic-bezier(.4,0,.2,1)
Durações
Botões
Todo botão tem focus-visible definido. Nunca remover outline — apenas estilizar. Mínimo de 44×44px em touch targets.
| Variante | Quando usar | Nunca usar para |
|---|---|---|
| Ação principal da tela — única por contexto. | Ações secundárias. Múltiplos primários na mesma view. | |
| Ação secundária ao lado de um primary. Cancelar, voltar. | Ação principal. Contexto dark. | |
| Ação terciária. Grupos de ações equivalentes. | CTA de destaque. Contexto dark. | |
| Qualquer ação em fundo escuro. | Fundo claro. Substitui ghost/outline no dark context. | |
| Ações destrutivas irreversíveis: excluir, remover permanente. | Ações reversíveis. Confirmações sem consequência de dados. |
Chips & Tags
Cards
Formulários
Inputs, textarea, select, checkbox e radio. Todos com estados de hover, focus, disabled e inválido. Focus ring sempre via :focus, não :focus-visible — feedback visual também para mouse.
| Elemento | Classe | Quando usar |
|---|---|---|
| Container | .field | Wrapper de label + input + helper/error |
| Label | .field-label | Sempre presente, acima do input |
| Label obrigatório | .field-label-req | Adiciona asterisco vermelho |
| Helper text | .field-helper | Instrução, contexto, exemplo |
| Error text | .field-error | Substitui helper quando há erro |
| Estado inválido | .field-invalid | Aplicar no .field pai |
Modal & Tooltip
Overlays para informação contextual e diálogos focados. Modal captura foco; tooltip aparece em hover/focus. z-index controlado por tokens (--z-modal, --z-tooltip).
.tooltip-bottom
Tooltip em ícone informativo
Visualizações de Dados
Padrões para construção de gráficos e diagramas interativos em SVG. Aplicável a qualquer produto digital — as implementações existentes no portfólio servem como referência de uso, não como limite de escopo.
Dimensão A
Dimensão B
/* Cores dos níveis — aliases dos tokens azul existentes */
--viz-level-5: #0A3AAF; /* expert = --blue-deep */
--viz-level-4: #175CE5; /* dominio = --blue */
--viz-level-3: #6B9FFF; /* proficiente = --blue-light */
--viz-level-2: #A8C4FF; /* desenvolvendo= --blue-lighter */
--viz-level-1: #D8E6FF; /* iniciado = --blue-lightest */
/* Geometria fixa — nunca alterar sem rebuild do gráfico */
/* maxR: 140 innerR: 28 rings: 5 gap: 1.5deg */
/* viewBox: "-200 -200 400 400" (centrado na origem) */
/* outerR = innerR + (maxR - innerR) * (level / rings) */
/* Strokes */
--viz-ring-stroke: rgba(23,92,229,.14);
--viz-path-stroke: rgba(23,92,229,.12);
--viz-radial-stroke: rgba(23,92,229,.10);
--viz-inner-stroke: rgba(23,92,229,.22);
--viz-center-fill: rgba(23,92,229,.04);
--viz-slice-opacity: 0.9; /* hover → 1.0 + drop-shadow */
/* Gráfico — gap e espaçamento (inspirado no Carbon Charts innerPadding) */
--viz-slice-gap: 1.5deg; /* graus de separação entre fatias */
--viz-label-offset: 24px; /* labelR = maxR + 24 (164 do centro) */
--viz-wrapper-padding: 16px; /* padding do div que envolve o SVG */
--viz-chart-gap: 24px; /* gap entre hard e soft no grid */
/* Labels SVG */
/* default: font-size 11, weight 700, fill #5C6069 */
/* hover: font-size 13, weight 800, fill #175CE5 */
/* labelR = maxR + 24 (140 + 24 = 164 do centro) */
| O que | Como |
|---|---|
| Adicionar skill | Inserir objeto { label, value } no array de dados. O ângulo de cada fatia recalcula automaticamente via 360 / n. |
| Mudar nível | Alterar o valor do campo level. O outerR é calculado a partir de LEVELS[level]. |
| Mudar cor de nível | Alterar COLORS[nivel] — nunca hardcode direto no path. |
| Tooltip | Posicionado por position:fixed via mousemove. z-index deve usar --z-tooltip (1100). |
| Acessibilidade | Adicionar role="img" aria-label="Matriz de habilidades" no SVG + tabela equivalente com .visually-hidden. |
M01
M02
M03
M04
M05
M06
/* viewBox: configurável conforme densidade de nós */
/* Centro recomendado: cx=300 cy=270 (viewBox 480×470) */
/* Raio da órbita dos nós satélite: ~165px do centro */
/* Raio dos nós satélite: 30px */
/* Raio do nó central: 46px fill: #175CE5 */
/* N nós em circle — ângulos: distribuídos via 360/N */
/* 90°, 135°, 180°, 225° */
/* Nós satélite — estado padrão */
fill: rgba(23,92,229,0.08);
stroke: rgba(23,92,229,0.28); /* primeiros 2 nós */
stroke: rgba(23,92,229,0.25); /* demais */
stroke-width: 1.5;
/* Nós satélite — hover (classe .lp-active) */
fill: #175CE5 !important;
stroke: #175CE5 !important;
filter: drop-shadow(0 0 8px rgba(23,92,229,.55));
/* Labels dos nós satélite */
/* font-size: 11 font-weight: 700 fill: #175CE5 */
/* dy: +4.5 (offset vertical para centralizar no círculo)*/
/* Linhas de conexão nó → centro */
stroke: rgba(23,92,229,.20); stroke-width: 1;
#175CE5rgba(23,92,229,.08)rgba(23,92,229,.14)#5C6069 (--text-subtle)Tokens CSS Completos
Todos os tokens devem viver em layout.tokens.css. Cor, tipografia, bordas e sombras não devem estar hardcoded em nenhum arquivo HTML.
/* layout.tokens.css — v3.0 — Fonte única da verdade */
:root {
/* Cor — Primária */
--blue: #175CE5;
--blue-hover: #1450cc;
--blue-deep: #0A3AAF;
--blue-light: #6B9FFF;
--blue-lighter: #A8C4FF;
--blue-lightest: #D8E6FF;
--blue-ghost: rgba(23,92,229,.08);
--blue-border: rgba(23,92,229,.2);
--blue-ring: rgba(23,92,229,.5);
/* Cor — Neutros */
--black: #0A0B0D;
--white: #FFFFFF;
--text-default: #1A1D22;
--text-secondary: #565B66;
--text-subtle: #5C6069;
--text-disabled: #9EA3AD;
/* Cor — Superfícies */
--surface-base: #F9F9F9;
--surface-raised: #F4F4F6;
--surface-border: #E4E4E8;
/* Cor — Semântica */
--green: #1A7F4B;
--green-bg: rgba(26,127,75,.07);
--green-border: rgba(26,127,75,.2);
--amber: #B45309;
--amber-bg: rgba(180,83,9,.07);
--amber-border: rgba(180,83,9,.22);
--red: #C0392B;
--red-bg: rgba(192,57,43,.07);
--red-border: rgba(192,57,43,.2);
/* Tipografia */
--font: 'Space Grotesk', sans-serif;
/* Bordas */
--r-sm: 4px; --r-md: 8px; --r-lg: 12px;
--r-xl: 16px; --r-2xl: 24px; --r-full: 9999px;
/* Sombras */
--sh-sm: 0 1px 4px rgba(0,0,0,.06);
--sh-md: 0 4px 16px rgba(0,0,0,.08);
--sh-lg: 0 12px 40px rgba(0,0,0,.12);
/* Z-index */
--z-nav: 1000; --z-drawer: 1001;
--z-tooltip:1100; --z-modal: 2000;
/* Motion */
--ease-out: cubic-bezier(.25,.46,.45,.94);
--ease-spring: cubic-bezier(.34,1.56,.64,1);
--ease-in-out: cubic-bezier(.4,0,.2,1);
--dur-fast: 150ms; --dur-base: 250ms;
--dur-slow: 400ms; --dur-xslow: 600ms;
/* Spacing — Containers */
--container-lg: 1200px;
--container-md: 1024px;
--container-sm: 840px;
--space-desktop: 32px;
--space-tablet: 24px;
--space-mobile: 16px;
/* Spacing — Componentes */
--gap-xs: 4px; --gap-sm: 8px;
--gap-sm-plus: 12px; --gap-md: 16px;
--gap-lg: 24px; --gap-md-plus: 32px;
--gap-xl: 40px; --gap-2xl: 48px;
--gap-3xl: 64px;
}
| Token | Valor | Uso |
|---|---|---|
--z-raised | 100 | Conteúdo flutuante sem sobreposição de nav |
--z-dropdown | 200 | Dropdowns, popovers |
--z-sticky | 900 | Elementos sticky não-nav |
--z-nav | 1000 | Navegação principal (header fixo) |
--z-drawer | 1001 | Mobile nav drawer (sobre o nav) |
--z-tooltip | 1100 | Tooltips e popovers informativos |
--z-modal | 2000 | Modais e overlays |
Grid & Estrutura
/* Estrutura obrigatória — NUNCA padding horizontal em section */
<section id="nome" style="padding: 88px 0; background: var(--surface-base);">
<div class="container-lg">
<!-- conteúdo -->
</div>
</section>
| Grid | Colunas | Gap | Uso |
|---|---|---|---|
.cases-grid | 3 → 2 → 1 | 18px | Cards de case |
.grid-2col | 1fr 1fr → 1fr | 72px → 40px | Sobre, depoimentos |
.num-grid | 3 → 2 → 1 | 16px → 12px | Cards de métricas |
.ds-3col | 3 → 1 | 16px | Uso interno no DS |
Acessibilidade
Mínimo WCAG 2.1 AA. Focus rings obrigatórios. Touch targets mínimos de 44×44px. aria-hidden em ícones decorativos.
Navegação por Teclado
- Focus ring em todos os elementos interativos via :focus-visible
- Modais capturam foco ao abrir, devolvem ao fechar
- Nav drawer: Escape fecha, foco retorna ao burger
- Skill chart radar: adicionar equivalente em tabela para screen readers
Semântica e ARIA
- aria-hidden="true" em ícones decorativos (Phosphor)
- aria-label em botões icon-only (modal-close, nav-burger)
- aria-expanded no nav burger com estado correto
- role="tooltip" no skill-level-tooltip com aria-hidden
- modal-close: substituir ✕ texto por icon + aria-label
Touch & Mobile
- Touch targets mínimos 44×44px (nav-burger, modal-close)
- Nav drawer 75% largura com padding adequado
- Links do drawer: padding 14px 0, font-size 16px
- Tabelas com .table-scroll-wrap em mobile
Movimento Reduzido
- Adicionar @media (prefers-reduced-motion: reduce) para desabilitar dot grid e flip phrase
- Letreiro animado: pausar com reduced-motion
- Count-up: ok para reduced-motion (não é essencial)
Referência Rápida
Classes disponíveis para uso imediato. Distingue componentes reusáveis dos estilos internos do DS. Use esta seção como ponto de partida para prototipar com Claude.
containers.css; aqui estão inlinadas para que o DS funcione como referência completa sem dependências externas.
| Classe | Tipo | Descrição | Contexto |
|---|---|---|---|
.btn-primary | Componente | Botão CTA principal | Fundo claro |
.btn-ghost | Componente | Botão ação secundária | Fundo claro |
.btn-outline | Componente | Botão terciário / toggle | Fundo claro |
.btn-dark | Componente | Botão qualquer ação | Fundo escuro |
.btn-danger | Componente | Ação destrutiva | Qualquer |
.btn-sm | Modificador | Tamanho reduzido — combina com qualquer botão | — |
.btn-disabled | Modificador | Estado desabilitado | — |
.chip | Componente | Tag / label neutro | Fundo claro |
.chip-blue | Modificador | Tag destaque azul | Fundo claro |
.chip-dark | Modificador | Tag para contexto dark | Fundo escuro |
.chip-green | Modificador | Tag sucesso / premiação | Qualquer |
.chip-amber | Modificador | Tag aviso / NDA | Qualquer |
.card | Componente | Card base com hover spring | Fundo claro |
.card-accent | Componente | Card com barra lateral azul | Fundo claro/surface |
.eyebrow | Componente | Label de seção uppercase com linha azul | Qualquer |
.section-divider | Componente | Linha horizontal divisória | Qualquer |
.ds-status-success | Componente | Badge de status positivo | Fundo claro |
.ds-status-warning | Componente | Badge de status aviso | Fundo claro |
.ds-status-error | Componente | Badge de status erro | Fundo claro |
.field | Componente | Wrapper de campo de formulário | Qualquer |
.input / .textarea / .select | Componente | Inputs de formulário com estados | Qualquer |
.check / .radio | Componente | Checkbox e radio customizados | Qualquer |
.modal-overlay + .modal | Componente | Diálogo com overlay e foco | Qualquer |
.tooltip-wrap + .tooltip | Componente | Tooltip em hover/focus | Qualquer |
.tabs / .tab / .tab-panel | Componente | Navegação por abas | Qualquer |
.accordion / .accordion-item | Componente | Conteúdo expansível | Qualquer |
.reveal | Componente | Elemento com scroll reveal (+ IntersectionObserver) | Qualquer |
| Classe | Comportamento | Quando usar |
|---|---|---|
.container-lg | max-width 1200px · padding responsivo | Nav, hero, sobre, cases, footer |
.container-md | max-width 1024px · padding responsivo | Conteúdo principal, grids duplos |
.container-sm | max-width 840px · padding responsivo | Leitura centralizada, hero text |
.full-bleed | width 100% | Banners edge-to-edge |
.cases-grid | 3 col → 2 → 1 · gap 18px | Cards de case |
.grid-2col | 1fr 1fr → 1fr · gap 72px → 40px | Sobre, depoimentos |
.num-grid | 3 col → 2 → 1 · gap 16px | Métricas, cards de número |
.table-scroll-wrap | overflow-x: auto em mobile | Envolver tabelas largas |
.ds-* (ex: .ds-section, .ds-hero, .ds-color-swatch) são estilos de apresentação deste documento — existem para exibir o DS em si, não para uso em produtos. As classes sem prefixo .ds- listadas acima são os componentes reais do sistema.