|
| 1 | +# Análise UI/UX — WebIngressos |
| 2 | + |
| 3 | +Data da análise: 2026-07-31 |
| 4 | +Escopo: landing page pública e candidatura ao Programa Piloto. |
| 5 | + |
| 6 | +## Resumo executivo |
| 7 | + |
| 8 | +A landing já tinha uma base consistente: Next.js 16, React 19, Tailwind 4, HTML semântico básico, skip link, foco visível, formulário com React Hook Form + Zod, feedback via Sonner e ilustrações SVG leves. |
| 9 | + |
| 10 | +O foco desta rodada foi conversão da candidatura, sem trocar a identidade visual nem adicionar dependências de runtime. A proposta continua usando evergreen/mint e o motivo de ingresso/perfuração como assinatura própria; cinco assets locais foram adicionados de forma pontual como apoio visual. |
| 11 | + |
| 12 | +### Pontos principais corrigidos |
| 13 | + |
| 14 | +1. **Menu mobile sem ciclo de foco previsível** — o primeiro item agora recebe foco ao abrir e `Escape` fecha o menu e devolve foco ao botão. |
| 15 | +2. **Erros do formulário pouco anunciados** — mensagens individuais agora usam `role="alert"`; o envio e falhas de rede são anunciados por região viva. |
| 16 | +3. **Formulário sem agrupamento semântico** — contato e dados do evento agora são `fieldset`s com `legend` acessível. |
| 17 | +4. **Proposta de valor pouco contextualizada acima da dobra** — o hero informa imediatamente que se trata do programa piloto e explicita o prazo de retorno já descrito no FAQ. |
| 18 | +5. **Texto de eyebrow em brand-500** — pequenos textos de contexto foram movidos para brand-700, que tem contraste adequado em superfícies claras. |
| 19 | + |
| 20 | +## Evidências técnicas |
| 21 | + |
| 22 | +### Acessibilidade |
| 23 | + |
| 24 | +- O layout mantém `lang="pt-BR"`, skip link, landmarks principais, labels associados e controles com targets de toque adequados. |
| 25 | +- O foco global usa anel de 3px com offset de 3px; componentes que já possuem foco customizado continuam preservando seus estilos. |
| 26 | +- O `FormControl` mantém `aria-describedby` e `aria-invalid`; `FormMessage` anuncia erros com `role="alert"`. |
| 27 | +- A navegação mobile mantém `aria-expanded`, `aria-controls` e labels distintos para navegação principal e móvel. |
| 28 | +- O movimento reduzido continua coberto por `prefers-reduced-motion`. |
| 29 | + |
| 30 | +### Contraste calculado |
| 31 | + |
| 32 | +Os valores abaixo foram calculados diretamente a partir dos tokens CSS atuais; não são resultados estimados de uma ferramenta visual. |
| 33 | + |
| 34 | +| Combinação | Contraste | Referência WCAG AA | |
| 35 | +| ------------------------ | --------: | -----------------------------: | |
| 36 | +| brand-500 sobre branco | 3,38:1 | insuficiente para texto normal | |
| 37 | +| brand-700 sobre branco | 7,30:1 | aprovado | |
| 38 | +| ink-500 sobre ink-50 | 5,52:1 | aprovado | |
| 39 | +| destructive sobre branco | 5,06:1 | aprovado | |
| 40 | + |
| 41 | +Por isso, brand-500 permanece reservado para detalhes e elementos decorativos, enquanto textos pequenos de contexto usam brand-700. |
| 42 | + |
| 43 | +### Conversão e UX |
| 44 | + |
| 45 | +- O CTA primário continua levando ao formulário do piloto. |
| 46 | +- O hero agora explicita o público e o caráter de candidatura sem compromisso. |
| 47 | +- O formulário informa que a candidatura não garante vaga e que o retorno ocorre em até 48 horas úteis, conteúdo já presente no FAQ. |
| 48 | +- Em validação inválida, o foco é movido para o primeiro campo com erro. |
| 49 | +- Em falha de rede/API, a pessoa recebe feedback visual persistente e anúncio para tecnologia assistiva, além do toast existente. |
| 50 | + |
| 51 | +### Performance |
| 52 | + |
| 53 | +- Os cinco PNGs selecionados foram convertidos para WebP, redimensionados e adicionados em `public/assets/landing`; o conjunto servido soma 95.928 bytes. |
| 54 | +- O ingresso principal usa carregamento prioritário no hero; as imagens abaixo da dobra usam lazy loading e dimensões explícitas. |
| 55 | +- Os PNGs originais chegaram a ser arquivados para curadoria, mas o acervo `docs/uiux-assets` foi removido do repositório (ver Atualização). |
| 56 | +- O dashboard decorativo continua sendo SVG/CSS e permanece marcado como ilustrativo. |
| 57 | +- Não há métrica Lighthouse registrada nesta rodada; qualquer pontuação futura deve ser medida em ambiente de produção ou preview equivalente. |
| 58 | + |
| 59 | +### Assets adicionados |
| 60 | + |
| 61 | +- `ticket-event.webp`: assinatura visual do hero. |
| 62 | +- `mobile-ticket.webp`, `qr-code-ticket.webp` e `checkmark-ticket.webp`: sequência operacional de venda, check-in e confirmação. |
| 63 | +- `concert-ticket.webp`: apoio visual da seção de público universitário. |
| 64 | + |
| 65 | +Os arquivos têm licença de produção ainda não confirmada; a publicação comercial depende da validação da licença oficial do Envato. |
| 66 | + |
| 67 | +## Atualização (2026-07-31) — Auditoria de design |
| 68 | + |
| 69 | +Uma auditoria contra o `DESIGN.md` reprovou os cinco `.webp` adicionados nesta rodada: |
| 70 | +eram renders 3D glossy multicolor (azul/laranja/verde), violando a regra de ilustração |
| 71 | +"traço fino, uma cor, nunca preenchido/multicolor/fotográfico", introduzindo azul e |
| 72 | +laranja fora da paleta verde-única (o pior caso no hero, acima da dobra) e mantendo a |
| 73 | +licença Envato pendente. |
| 74 | + |
| 75 | +Ações aplicadas: |
| 76 | + |
| 77 | +- Os cinco `.webp` foram removidos de `public/assets/landing/` (diretório eliminado), |
| 78 | + encerrando o risco de licença na aplicação servida. |
| 79 | +- **Hero**: o ingresso 3D flutuante foi removido; o `DashboardPreview` passa a ser o |
| 80 | + foco visual único. |
| 81 | +- **Fluxo operacional**: deixou de ser uma terceira faixa `brand-900` (que competia com |
| 82 | + a band de fechamento) e virou seção clara com cards brancos e ícones de traço verde |
| 83 | + (`lucide`), preservando a numeração de sequência 01/02/03. |
| 84 | +- **Público**: o render 3D foi trocado pela ilustração de traço `TicketLine` em verde; o |
| 85 | + painel de apoio deixou de ser verde (`bg-brand-50`) e passou a neutro (`bg-ink-100`), |
| 86 | + para não criar uma terceira faixa verde entre a band do piloto e o CTA final. |
| 87 | + |
| 88 | +Em seguida, todo o acervo de referência `docs/uiux-assets` (~413 MB de pacotes Envato não referenciados pelo app) foi removido do repositório, encerrando de vez a exposição à licença pendente. |
| 89 | + |
| 90 | +### Performance e dependências |
| 91 | + |
| 92 | +Diferente da primeira rodada (que foi feita sem dependências de runtime), esta etapa de |
| 93 | +performance **adicionou duas dependências de runtime deliberadamente**, com necessidade |
| 94 | +demonstrada: |
| 95 | + |
| 96 | +- `@vercel/speed-insights` e `@vercel/analytics`, montados em `src/app/layout.tsx`. Como |
| 97 | + não há Google Chrome nesta máquina para rodar Lighthouse, o Speed Insights é o caminho |
| 98 | + para obter Core Web Vitals de campo reais após o deploy. |
| 99 | +- O formulário do piloto (abaixo da dobra) passou a ser carregado por `next/dynamic` com |
| 100 | + `ssr: false` + `IntersectionObserver`, tirando a stack de validação (`zod` + |
| 101 | + `react-hook-form` + `radix`) do first-load: **~338 KB → 222 KB gzip** no first-load da |
| 102 | + home (medido no build). |
| 103 | + |
| 104 | +## Validação executada |
| 105 | + |
| 106 | +- `pnpm format:check`: passou. |
| 107 | +- `pnpm lint`: passou sem erros; existe um warning preexistente em `.remember/tmp/last-ndc.ts`. |
| 108 | +- `pnpm typecheck`: passou. |
| 109 | +- `pnpm build`: passou; rotas estáticas e `/api/subscribe` foram compiladas. |
| 110 | +- `curl http://localhost:3000/`: respondeu `200` com headers de segurança e HTML contendo o novo contexto do piloto, formulário e menu. |
| 111 | +- Contraste dos tokens principais: calculado e registrado acima. |
| 112 | + |
| 113 | +## Limitações e próximos passos |
| 114 | + |
| 115 | +- Ainda é necessário executar Lighthouse em uma URL servida e testar manualmente com teclado/leitor de tela em navegador real; a tentativa automatizada de abrir o navegador local expirou antes de permitir essa inspeção. |
| 116 | +- O acervo `docs/uiux-assets` foi removido do repositório; não há mais arquivos de licença pendente versionados. |
| 117 | +- Não foram alterados contratos da API, banco de dados ou implantação. |
0 commit comments