Pular para o conteúdo

Case de sistema visual

Um sistema enxuto para manter decisões coerentes.

Este case documenta como o portfólio saiu de estilos repetidos para foundations, primitivos e regras compartilhadas. O objetivo não é simular uma biblioteca corporativa, mas demonstrar decisão, adoção e governança.

Voltar aos projetos

Problema de sistema

Consistência visual não bastava sem reuso e hierarquia.

O portfólio compartilhava cores, tipografia e aparência, mas repetia markup de botões, headings, tags e shells de seção. Radius de 2rem, sombras e reveals apareciam em contextos diferentes com o mesmo peso, reduzindo contraste editorial e aumentando o risco de drift.

Decisões tomadas

  1. 01Separar foundation, primitivo e composição para não transformar toda seção em card.
  2. 02Criar escalas funcionais de radius e controles em vez de um único valor para tudo.
  3. 03Aplicar motion como assinatura pontual e respeitar reduced motion também no JavaScript.
  4. 04Extrair componentes somente quando há dois ou mais usos reais.

Onde o sistema já opera

  1. 01SectionShell e SectionHeading organizam a régua editorial da Home e das evidências.
  2. 02ActionLink e Tag reduzem variações de CTA e metadados entre Home, About e cases.
  3. 03ProjectMediaGrid usa figure, figcaption e enquadramento próprio para evidência.
  4. 04Tokens light/dark, radius e sombra são consumidos pelo Tailwind sem duplicar tema.

Regra de evolução

  1. 01O código runtime é a fonte numérica; a documentação explica intenção e uso.
  2. 02Um token novo precisa representar função recorrente, não exceção visual isolada.
  3. 03Um componente novo precisa cobrir estados, foco, touch e reduced motion.
  4. 04Toda mudança relevante passa por lint, build, QA responsivo e comparação de performance.

Cores

Tokens CSS semânticos cobrem tema claro/escuro, superfícies, texto, bordas e contraste.

Tipografia

Carbona como família única, com pesos e escala curta para reduzir variação e custo de fonte.

Componentes

Padrões e seções do site compartilham raio, sombra, borda e espaçamento — inventário abaixo.

Movimento

Easings e durações tipados; reveal por seção e transição de tema sem competir com o conteúdo.

Tokens de cor

Paleta completa conectada ao tema.

Todos os tokens semânticos de `src/index.css`. Alterar o tema no header atualiza os swatches.

page

--color-bg

panel

--color-panel

surface

--color-surface

elevated

--color-surface-elevated

card

--color-card

placeholder

--color-placeholder

primary

--color-primary

primary-soft

--color-primary-soft

text-primary

--color-text-primary

muted

--color-text-muted

subtle

--color-text-subtle

border

--color-border

inverse

--color-inverse

Tipografia

Escala curta, leitura direta.

Carbona para UI e display. Pesos e escala criam contraste; tracking alto fica restrito a labels curtos.

Hero display

Product Design

Section title

Design system

Project card title

Design System

Card title

Tipografia

Body

Clareza, consistência e evolução visual para orientar novas páginas.

Card body

Tokens CSS controlam tema claro, tema escuro, superfície, bordas, texto e contraste.

Eyebrow

Tipografia

Card label

Processo

Navigation / Control

Projetos

Radius e elevação

Raio e sombra que amarram cards e seções.

Valores canônicos em CSS variables — usados via utilitários Tailwind `shadow-card` e `shadow-section`.

radius

Radius card

--radius-card

Cards usam 1.25rem; mídia, controles e features têm tokens próprios.

shadow-card

Shadow card

--shadow-card

Elevação leve para blocos repetidos na grade.

shadow-section

Shadow section

--shadow-section

Sombra mais profunda em hover e destaques de seção.

Motion

Ritmo tipado, sem competir com o conteúdo.

Tokens de easing e duração em `index.css`, consumidos por Framer Motion e CSS de tema.

Ease smooth

--motion-ease-smooth

Curva principal de página e theme transition.

Ease card

--motion-ease-card

Entrada de cards e reveals em seções.

Duration base

--motion-duration-base

520ms — motion de UI e seções.

Duration theme

--motion-duration-theme

760ms — troca light/dark.

MotionConfig respeita a preferência do usuário; TypeCyclePhrase e scroll também oferecem comportamento estático.

Tema

Light e dark pelo mesmo token set.

O atributo `data-theme` no `<html>` troca o bloco de variáveis. Use o toggle do header para ver esta página em ambos os modos.

01

Light (referência)

Fundos claros, primary escuro, bordas discretas — base de craft do portfolio.

02

Dark

Mesmos nomes de token; valores invertidos de superfície e texto sem classes duplicadas.

03

Sem cor de cliente

O primary do portfolio não replica nenhuma marca de clientes. DS de produto fica no case.

Padrões de UI

Padrões já usados na interface.

Botão primário

Botão primário

Ação principal via ActionLink: fundo primary, texto inverse e foco visível.

Botão secundário

Botão secundário

CTA de apoio com borda, fundo surface e hierarquia menor que a ação principal.

Botão terciário

Botão terciário

Controle auxiliar com área mínima de toque e estado hover discreto.

Toggle de idioma

Toggle de idioma

Controle segmentado do header com aria-pressed e target de 44 px no mobile.

Ícones

Ícones

Lucide React com stroke leve, usados em CTAs, cards, contato e navegação mobile.

Inventário

Componentes reais deste site.

Lista alinhada a `rules/Design_System.md`, incluindo os primitivos extraídos quando passaram a ter usos recorrentes.

ComponentePathStatusNotas
SectionShellui/SectionShell.tsxAtivoContainer, padding responsivo e ritmo de seção
SectionHeadingui/SectionHeading.tsxAtivoEyebrow, título e corpo no grid editorial
ActionLinkui/ActionLink.tsxAtivoAções primary, secondary e text com foco visível
Tagui/Tag.tsxAtivoMetadados curtos e categorias
SiteHeaderlayout/SiteHeader.tsxAtivoMenu Escape, locale, theme e alvos 44 px
BackToTopui/BackToTop.tsxAtivoAparece após scroll; reduced motion
Herosections/Hero.tsxAtivoTypeCyclePhrase + CTA tipográfico
Worksections/Work.tsxAtivoLink único por card e srcset quando existe
Impactsections/Impact.tsxAtivoFaixa feature com dados hierarquizados
Testimonialssections/Testimonials.tsxAtivoCarrossel com índice e região nomeada
Contactsections/Contact.tsxAtivoCopy-to-clipboard; capabilities no footer
ProjectMediaGridsections/ProjectMediaGrid.tsxAtivofigure/figcaption e object-contain
WordsPullUpanimations/WordsPullUp.tsxAtivoHeading semântico com fallback estático
ScrollLinkedAudioaudio/ScrollLinkedAudio.tsxAtivoMP3 sob demanda em /audio/

Grid e espaçamento

Regras para manter a página na mesma régua.

01

Régua de página

Seções usam padding lateral consistente e conteúdo centralizado em max-w-[1664px]. Exceções full-bleed devem ser intencionais e isoladas.

02

Grid principal

Layouts editoriais usam 12 colunas no desktop. Conteúdo de leitura deve ocupar 7 ou 8 colunas; labels e descrições laterais ficam entre 3 e 5 colunas.

03

Breakpoints médios

Cards não devem ficar estreitos demais entre tablet e notebook. Nesses pontos, preferir duas colunas equilibradas antes de abrir composições assimétricas.

04

Motion e overflow

Containers com animação podem usar overflow-hidden, mas sombras, stacks e elementos em movimento precisam de altura suficiente para não parecerem cortados.

Uso prático

Regras para novas seções e páginas.

  • Usar bg-page para seções e bg-surface/bg-card para blocos de conteúdo.
  • Manter borda em border-border e shadow-card para elementos repetidos.
  • Reservar bg-primary para ações, indicadores e pontos de ênfase.
  • Evitar textos longos em caps; usar tracking alto apenas em labels curtos.
  • Novos tokens só em `src/index.css` + aliases Tailwind — nunca hex soltos em seções.