Hero e movimento - cena 3D em tempo real com os blocos da marca (kit feito no Blender, 3d/blocos.py): marca, tela, integrações e dados; segue a rolagem, tem vida em repouso, reage ao cursor e, parada no topo, passa sozinha pelos estados com legenda - três níveis de aparelho (full, lite, static); sem WebGL fica o pôster - título novo: "Sites e sistemas sob medida para o jeito que a sua empresa trabalha." - faixa de clientes com o ramo, linha do primeiro passo, hero alinhado às seções - rótulos digitados, entrada dos blocos, cortina de blocos entre páginas e capa compartilhada entre a lista de cases e o case Ofertas - atendimento no WhatsApp com IA e nota fiscal para a reforma tributária (páginas de serviço, cartões da home, formulário e aviso com data de validade) - página /ia atualizada, com fontes - peças 3D em loop nos cartões e topos de página (3d/pecas.py) Design - hover por papel (bloco nos botões, barra nos links), rótulos sem caixa alta - um destino por rótulo: "Falar sobre meu projeto" leva ao formulário, "Chamar no WhatsApp" abre o WhatsApp - logo montado em blocos, 404 redesenhado, grades sem célula vazia - ícones do PWA e manifesto novos Specs em specs/, contexto de design em DESIGN.md e PRODUCT.md.
16 KiB
Melhorias de design depois da avaliação
Autor: Evandro · Data: 2026-11-10 · Porte: grande · Status: concluída
1. Objetivo
Aplicar as melhorias que a crítica do Impeccable (29/40, Consistência 2) e o crítico cego do jury (6,4) apontaram, para o conceito de blocos valer no site inteiro e os botões responderem como o resto. Aprovado pelo usuário em 2026-11-10 ("incluir as melhorias propostas").
Leitura (frontend-orchestrator): refino · Persuade · web · 3d, premium → impeccable, design-rules, threejs-shaders e threejs-animation na cena; fecha com audit, diagnóstico rápido e jury.
2. Escopo
- Dentro: hover dos alvos principais; blocos nos topos das páginas internas; um destino só para "Falar sobre meu projeto"; botão do WhatsApp e aviso de cookies no celular; rótulo único para a página
/ia; grades com sobra; menos rótulos em caixa alta; cena com vida em repouso e reação ao cursor; logo em blocos no cabeçalho;rel="noopener"nos links externos. - Fora (não fazer): números de resultado nos cases (dependem de dados do usuário, P1); mudar ofertas ou textos de venda; biblioteca de animação; novo conceito visual.
3. Critérios de aceite
- CA1 (hover): todo botão verde, botão de contorno, link de texto, item da vitrine e botão de tocar vídeo muda de forma visível sob o ponteiro e no foco, com um tratamento por papel; com movimento reduzido a troca é instantânea →
noHoverChange0 e nenhum alvo primário emcolorOnlynoshoot.mjsdo jury. - CA2 (blocos nas páginas internas):
/cases,/curriculo,/privacidadee as duas páginas de serviço sem capa mostram uma peça de blocos à direita do topo de 1024 px em diante, decorativa, sem estouro → inspeção em 1440×900 epnpm test:e2e -- routes. - CA3 (um destino): todo controle chamado "Falar sobre meu projeto" leva ao formulário; todo controle que abre o WhatsApp se chama "Chamar no WhatsApp" →
grepdos rótulos epnpm test:e2e -- contact keyboard. - CA4 (celular): com o aviso de cookies aberto o botão flutuante não aparece; o aviso tem até 72 px de altura em 390 px; o link da política tem alvo de 24 px ou mais →
pnpm test -- GoogleAnalytics FloatingWhatsAppe inspeção em 390×844. - CA5 (rótulo): menu, trilha, rodapé e rótulo da página
/iadizem "Revisão de app com IA" →pnpm test -- Header Footer app/ia. - CA6 (grades): nenhuma grade de cartões termina com célula vazia em 1440 px em
/casese/servicos; os cartões de/iae do currículo não esticam com buraco interno → inspeção. - CA7 (rótulos):
.ds-eyebrowsem caixa alta; o rótulo do hero cabe em até 2 linhas em 390 px; as páginas internas com trilha não repetem rótulo sobre o título → inspeção epnpm test. - CA8 (cena viva): em repouso cada estado tem um movimento próprio e, no nível
full, os blocos reagem ao cursor; o desenho continua sob demanda e para sem atividade →pnpm test -- BlocosScene lib/blocose captura com GPU. - CA9 (logo): o símbolo do cabeçalho responde ao ponteiro e ao foco com os quadrados verdes encaixando; em repouso o logo é igual ao atual (diferença média de pixel abaixo de 2 em 255) → medição do agente e inspeção.
- CA10:
pnpm lint && pnpm typecheck && pnpm test && pnpm build && pnpm test:e2everdes; novo jury com crítico novo, nota por categoria igual ou maior que a anterior.
4. Contexto verificado
app/components/button-styles.ts:primaryButtonsó clareia no hover (hover:bg-[#d9ff40]); contornos só mudam a borda; links de texto só mudam a cor.app/components/Hero.tsx:110-116: o botão verde do hero abre o WhatsApp;Header.tsx:86-91: o do cabeçalho leva ao formulário.lib/site-navigation.ts:10: item{ href: "/ia", label: "IA" }.app/globals.css(.ds-eyebrow, .ds-kicker): 12 px,text-transform: uppercase,letter-spacing: 0.08em;Section.tsx:47-58põe um sobre cada título.app/components/FloatingWhatsApp.tsx:61-66eGoogleAnalytics.tsx:224-236: botão flutuante e aviso de cookies, ambos fixos na base no celular.app/components/cinematic/BlocosScene.tsxelib/blocos.ts: cena de blocos, parada em repouso fora do balanço da marca.app/components/Logo.tsx: o logo é um.webpúnico (/brand/wordmark-<tema>.webp), sem partes animáveis; o símbolo existe em SVG (public/brand/mark-dark.svg,mark-light.svg).3d/blocos.pye3d/pecas.py: geram o pôster da marca e três loops; os estadostela,integracoesedadossó têm prévia em3d/out/.
5. Desenho
- Hover, um tratamento por papel, no verbo "encaixar" (entra pela esquerda, 280 ms,
--ease-out, sótransformeopacity):- botão verde: um bloco cor de papel cobre o botão da esquerda para a direita; o texto continua escuro;
- botão de contorno: o mesmo bloco, translúcido no fundo escuro e escuro no fundo claro (o texto inverte);
- link de texto e item do menu: uma barra de 2 px cresce da esquerda sob o texto; o sublinhado fixo dos links de texto continua;
- item da vitrine: barra verde entra pela esquerda; tocar vídeo: o círculo cresce e fica verde.
- Um destino: "Falar sobre meu projeto" vai ao formulário em todo lugar. No hero entra um link discreto "Chamar no WhatsApp". Nas páginas de serviço, o botão que abre o WhatsApp com o assunto do serviço passa a se chamar "Chamar no WhatsApp".
- Peças das páginas internas:
/casesusa o estadotela,/curriculoointegracoes,/privacidadeodados; atendimento usa o looppeca-whatsappe nota fiscal um loop novo,peca-fiscal. Só de 1024 px em diante. - Rótulos: sem caixa alta, 13 px,
letter-spacing0,02em; o efeito digitado continua. No celular o rótulo do hero mostra só "Engenharia de software". - Cena:
marcacom os quatro quadrados verdes pulando em sequência;telacom o botão verde pulsando;integracoescom um pulso verde correndo do centro para os nós;dadoscom as barras respirando. Cursor: os blocos perto dele avançam para a frente. - Logo: símbolo em SVG ao lado do texto recortado do
.webpatual; se a montagem não bater com o original dentro da tolerância, fica o.webpcom um tratamento de hover no logo inteiro. - Descartado: esconder o botão flutuante do WhatsApp de vez no celular (é o atalho de contato mais usado).
Arquivos por frente (um dono cada): botões e celular em button-styles.ts, globals.css, Hero.tsx, Header.tsx, FloatingWhatsApp.tsx, GoogleAnalytics.tsx, vitrine e CasePlayer.tsx; páginas internas em app/cases, app/servicos, app/curriculo, app/privacidade, app/ia, lib/site-navigation.ts, lib/site-content.ts, Footer.tsx; Blender em 3d/ e public/3d/; cena em BlocosScene.tsx e lib/blocos.ts; logo em Logo.tsx e public/brand/.
6. Restrições, riscos, suposições
- Restrições: as mesmas das specs anteriores (Next 16, sem servidor extra além do
next devjá aberto, sem commit). - Riscos: o logo é a peça mais sensível da marca (por isso a tolerância e o plano B); mudar o destino do botão do hero mexe em medição de cliques e em testes de ponta a ponta.
- S1: as recomendações dos itens 3 e 5 da proposta estão aceitas como escritas.
- P1 (fora desta spec): números reais de resultado por cliente, para a página de cada case.
7. Microtasks
T1 · Dar hover, destino único e celular limpo aos botões · N3
- Serve: CA1, CA3, CA4, CA7 · Depende de: nenhuma · Arquivos: os da frente "botões e celular"
- Pronto quando: os cinco papéis têm o tratamento da seção 5; o hero leva ao formulário e tem "Chamar no WhatsApp"; aviso de cookies e botão flutuante cumprem o CA4; rótulos sem caixa alta.
- Verificar:
pnpm test -- Hero Header FloatingWhatsApp GoogleAnalytics Sectionee2e/contact.spec.ts,e2e/keyboard.spec.tscontra a porta 3000. - feito
T2 · Levar blocos, grades e rótulo único às páginas internas · N3 [P]
- Serve: CA2, CA3, CA5, CA6, CA7 · Depende de: nomes de arquivo do T3 · Arquivos: os da frente "páginas internas"
- Verificar:
pnpm test -- cases servicos curriculo privacidade app/ia Footer site-content. - feito
T3 · Renderizar os três estados e a peça da nota fiscal · N3 [P]
- Serve: CA2 · Arquivos:
3d/blocos.py,3d/pecas.py,public/3d/estado-*.webp,public/3d/peca-fiscal.* - Verificar:
blender -b --python 3d/blocos.py→OK;blender -b --python 3d/pecas.py→OK pecas=4. - feito
T4 · Dar vida à cena em repouso e reação ao cursor · N3 [P]
- Serve: CA8 · Arquivos:
BlocosScene.tsx,lib/blocos.tse testes - Verificar:
pnpm test -- BlocosScene lib/blocos; captura com GPU dos quatro estados em dois instantes. - feito
T5 · Montar o logo do cabeçalho com o símbolo em blocos · N3 [P]
- Serve: CA9 · Arquivos:
Logo.tsx, teste, arquivos novos empublic/brand/ - Verificar:
pnpm test -- Logo Header Footer; diferença média de pixel contra o logo atual abaixo de 2 em 255 em 180 e 240 px. - feito
CP1 · após T1–T5 · N0
- Verificar: CA10 (suíte, build, e2e sobre
pnpm start -p 3001, jury com crítico novo) e inspeção com GPU em 1440×900 e 390×844.
8. Registro
2026-11-10 — spec escrita a partir das nove melhorias propostas; o item 8 (resultado nos cases) ficou fora por depender de dados do usuário.
2026-11-10 — T3: estado-tela.webp (77 KB), estado-integracoes.webp (49 KB) e estado-dados.webp (70 KB), 1200×900 com alfa; peca-fiscal (webm 46 KB, mp4 54 KB, pôster 8 KB): nota de 11×16 blocos com as linhas como vãos e um selo verde de 7×7 com o "V" vazado. O pôster da marca não mudou de enquadramento. blocos.json com o mesmo md5.
2026-11-10 — T2: PagePiece.tsx novo, só de 1024 px em diante. /cases com o quinto cartão na linha toda; /servicos em 3 + 2; /ia e currículo com cartões alinhados pelo topo. Rótulo único IA_PAGE_LABEL ("Revisão de app com IA") no menu, na trilha, no rodapé e nos dados estruturados. Nenhuma página interna tinha "Falar sobre meu projeto" indo ao formulário além do currículo: os botões que abrem o WhatsApp viraram "Chamar no WhatsApp". No topo do case ficou só "Case de cliente" ou "Projeto de laboratório".
2026-11-10 — T5: logo montado de SVG (símbolo) mais wordmark-text-<tema>.webp (o original com o símbolo apagado, em 1600×330). Diferença média contra o logo anterior: 0,82 e 0,89 (escuro, 180 e 240 px), 0,34 e 0,39 (claro); caixa do link igual. As medidas do símbolo vieram do .webp, porque as do mark-*.svg não batem com ele.
2026-11-10 — T1: classes cv-fill, cv-outline-dark, cv-outline-light (bloco que entra pela esquerda) e cv-bar (barra de 2 px) em globals.css, só sob @media (hover: hover) e no foco. O botão do hero leva a /#contact-form; entrou o link "Chamar no WhatsApp", que é o que o botão flutuante observa. Fora da home, o botão do cabeçalho continua abrindo o WhatsApp, agora com o nome "Chamar no WhatsApp". Aviso de cookies com 67,7 px em 390 px e texto de 13 px abaixo de 640 px; o botão flutuante some com o aviso aberto. O espaço no fim da página já existia no rodapé. O limite de Tabs do caminho linear foi de 40 para 41 (o link novo do hero).
2026-11-10 — o contato sem JavaScript (Contact.tsx, <noscript>) também passou a dizer "Chamar no WhatsApp".
2026-11-10 — T4: papeis() em lib/blocos.ts tira do blocos.json os quatro quadrados da marca, o botão da tela, as seis linhas das integrações e as cinco barras dos dados. A vida em repouso e o cursor ficam no vertex shader; o peso vai a zero na troca de estado e na entrada; o relógio só anda quando há quadro. As barras respiram 15% (os 6% da proposta quase não se viam). O cursor empurra os blocos no eixo da própria peça, não na linha da câmera. Tempo de quadro medido com GPU: até 0,39 ms, um quadro a cada 33 ms.
2026-11-10 — segunda passada do Impeccable (~/tmp/avaliacao/impeccable-2.md): crítica 30/40, com Consistência de 2 para 3 e nenhuma heurística abaixo de 3; auditoria 15/20, sem mudança. O LCP com GPU ficou no título, em 356 ms.
2026-11-10 — problemas que as mudanças criaram, apontados na segunda passada e corrigidos: (1) o bloco cor de papel sumia nos botões verdes sobre cartão branco: em seção clara o bloco é escuro e o texto inverte; (2) sem caixa alta, o rótulo da vitrine mostrava "loja virtual · Em Produção": projectKicker() em lib/project-showcase.ts escreve "Loja virtual · em produção"; (3) rodapé, "Em movimento" e "Role para mergulhar" ainda estavam em caixa alta; (4) a imagem de reserva do 404 era pré-carregada em todas as páginas: ganhou loading="lazy".
2026-11-10 — também da segunda passada: token --whatsapp (e --whatsapp-hover) no lugar das 9 cores soltas, e o botão de envio do formulário com o mesmo bloco dos outros.
2026-11-10 — o next dev parou de servir o CSS novo depois dos builds de produção feitos ao lado dele; foi reiniciado (pid novo) e voltou a servir.
2026-11-10 — ficam abertos, por serem decisão de produto ou anteriores a este trabalho: o botão do cabeçalho muda de nome e de destino entre a home e as outras páginas; o hero começa em x=68 e o resto em x=100; rótulos que repetem o título em três seções; o botão flutuante ainda cobre fim de linha no meio da rolagem; "Quatro pontos de partida" na home e "Cinco jeitos de começar" em /servicos.
2026-11-10 — suíte e2e sobre o build com as correções: 60 de 60.
2026-11-10 — pedido do usuário durante a execução: nos cartões da home, os dois balões soltos não se leem como conversa de WhatsApp, e a mídia da revisão (o trecho do relatório pequeno numa caixa escura) não sugere revisão. Mudanças: peca-whatsapp vira um celular de blocos com a conversa dentro, com um selo "WhatsApp" em HTML por cima; a revisão ganha a peça peca-revisao (uma lupa atravessa uma janela e assenta os blocos fora do lugar), com o trecho do relatório maior ao lado. O cartão da revisão deixa de ser exceção: três dos quatro cartões usam peça em loop.
2026-11-10 — peças entregues: peca-whatsapp refeita (celular de 9x16 blocos, três balões alternando os lados, pontos de "digitando") e peca-revisao nova (janela de 13 blocos de largura, lupa lima, três blocos que assentam, selo de conferido); pecas.py termina em OK pecas=5. No cartão: selo "WhatsApp" em HTML no canto de cima à esquerda; trecho do relatório ao lado da janela a partir de 29rem de quadro, embaixo do vídeo no celular e oculto entre 1024 e 1279 px (cartões lado a lado com quadro estreito). O vídeo dos cartões passou de object-cover a object-contain, porque no quadro 21:9 o celular e a janela eram cortados; o fundo do vídeo é o mesmo do quadro.
2026-11-10 — medido em dez larguras de 360 a 1920 px: o trecho nunca cobre a janela (folga mínima de 17 px, em 1280), o selo nunca cobre o celular (folga mínima de 7 px, em 360), os títulos dos cartões 3 e 4 ficam alinhados em duas colunas, sem rolagem horizontal.
2026-11-10 — verificação depois dessas mudanças: Biome sem erro, typecheck sem erro, 153 suítes e 1654 testes, build sem erro.
2026-11-10 — CP1: Biome, typecheck, 153 suítes e 1654 testes, build; e2e 60 de 60 sobre pnpm start -p 3001 (servidor encerrado depois). Jury, rodada 2, com crítico novo (~/tmp/.jury/127.0.0.1-3001/scorecard.md): geral 7,0 contra 6,4; Design 6 → 7, Usabilidade 7 → 7, Criatividade 6 → 7, Conteúdo 7 → 7; nenhuma categoria caiu (CA10). Audit: 4 FAIL e 17 WARN contra 4 e 32; os 4 FAIL são os mesmos (texto de h2 que a ferramenta conta duas vezes e um link só de mouse sem nome).
2026-11-10 — depois da captura do jury: os botões do aviso de cookies ganharam o bloco no hover (eram só troca de cor em todas as páginas) e o link de e-mail de /privacidade ganhou alvo de 24 px. Conferido com os testes unitários e com keyboard, contact e navigation do e2e contra o next dev (28 de 28); não houve novo build de produção nem novo jury depois disso.
2026-11-10 — ficam abertos, da lista do crítico: o espaço depois de f e t no texto do celular (visto só na captura headless, não reproduzido em aparelho), o triângulo padrão dos <details> nas páginas de case e de serviço, espaço morto em cartões de /servicos, as requisições abortadas do vídeo da vitrine, e os dois itens que dependem do dono: resultado medido nos cases e a conta dos "5 anos de experiência" contra o currículo que começa em junho de 2022.