0005 — O topo da imobiliária não mostra título no mobile¶
| Status | CORRIGIDO |
| Branch | fix/0005-topo-da-imobiliaria-sem-titulo |
| Aberto em | 2026-08-06 |
| Severidade | ALTA |
| Apps afetados | web (api sem impacto; e2e ganha regressão) |
Status:
RASCUNHO→DIAGNOSTICADO→EM CORREÇÃO→CORRIGIDO
1. Sintoma¶
Na visualização de uma imobiliária, no mobile a barra do topo mostra só botões: não há ícone, não há título, não há subtítulo. O nome da imobiliária — a única coisa que diz qual registro está aberto — não aparece. O terceiro botão ainda vaza pela borda direita.
No desktop a tela está correta.
Não é impressão: medido no dev-remote, a largura do bloco de título é 0px em 390px.
2. Reprodução¶
- Abrir
/app/agenciese tocar em qualquer imobiliária, num viewport de 390px. -
Observar a barra do topo.
-
Ambiente: dev-remote, build da spec 0021 (
6fcfbb0). - Superfície: mobile apenas. No desktop o título mede 204px e a tela está certa.
- Dados/pré-condições: nenhuma; qualquer papel com acesso a imobiliárias.
3. Esperado × Atual¶
- Esperado: ícone, título e subtítulo à esquerda, ações à direita — como em Inquilinos, Imóveis, Perfis e Contratos.
- Atual: três botões com rótulo ocupando 382px de uma barra de 390px. Sobram 8px para ícone, título e subtítulo, e o bloco colapsa para 0px.
| Botão | Largura | |
|---|---|---|
| 1 | Convidar operador | 188px |
| 2 | Editar | 74px |
| 3 | Remover | 120px |
| total | 382px |
4. Causa raiz¶
Omissão da spec 0020, por critério de migração mal escolhido.
Aquela spec moveu a decisão de forma da ação para o PageHeader (primaryAction / secondaryAction), e a tabela de migração listou as páginas que usavam o ternário isMobile ? <IconButton/> : <Button/>. Esta página nunca teve o ternário: ela passa três <Button> crus dentro de actions={<Box>…</Box>}. Não casou com o critério, e por isso não entrou na lista.
Duas regras da 0020 ficam violadas ao mesmo tempo:
- RN5 — quem decide a forma da ação é o
PageHeader, não a página. Aqui a página decide, e decide igual para os dois viewports. - RN7 — no máximo duas ações no topo. Aqui são três, e o efeito de estourar a barra é exatamente o que a regra existia para impedir.
Onde está: apps/web/src/pages/agencies/show.tsx, no actions={…} do PageHeader.
De passagem, o mesmo bloco tem <Box sx={{ color: "secondary" }}> — string de paleta na propriedade CSS, que o MUI descarta. É o defeito que a spec 0019 corrigiu nos chips e que já reapareceu no HeaderBar do Centro de Operações (spec 0020) e nas telas de admin (fix da 0020).
Por que só aqui. A varredura confirmou: das seis páginas com actions={…} num PageHeader, cinco usam para barra de filtro ou ações por linha. Esta é a única com botões de topo crus.
5. Correção¶
apps/api¶
Sem impacto.
apps/web¶
- Onde:
pages/agencies/show.tsx. - O quê:
primaryAction= Convidar operador (a ação desejada da tela).secondaryAction= Editar.- Remover sai do topo e vai para o fim da página, junto do que ela destrói. Ação destrutiva e rara não divide espaço com as frequentes, e longe do polegar é onde ela deve estar — some o risco de exclusão por toque errado.
- Sai o
color: "secondary"inválido junto com oBox. data-testid: os três existentes são preservados —agency-invite-button,agency-edit-buttoneagency-delete-button. O último muda de lugar na tela, não de nome.- Responsividade & PWA: a correção é do mobile e não altera o desktop, que já estava certo. Sem impacto no service worker além do rebuild.
apps/e2e¶
- Teste de regressão: o cenário que falha hoje — em 390px, o título do topo tem largura > 0 e o número de ações no topo é ≤ 2. Entra em
page-header.spec.ts, junto dos cenários da spec 0020, e percorre as telas de detalhe, não só esta: o defeito foi de cobertura, e cobrir só a tela que apareceu repete o erro.
6. Risco / impacto colateral¶
- Não toca dinheiro nem regra de negócio: é posição de botão.
- "Remover" muda de lugar. Quem já usa a tela vai procurá-lo no topo. É o custo aceito para caber em 390px, e a spec 0020 já estabeleceu o teto de duas ações.
- O
agency-delete-buttoncontinua existindo com o mesmo testid; a suíte que o aciona não quebra por seletor.
7. Critérios de aceite¶
- [x] CA1. Seguindo os passos da seção 2, o topo mostra ícone, título e subtítulo em 390px.
- [x] CA2. O bloco de título mede largura > 0 em 390px.
- [x] CA3. O topo tem no máximo duas ações (RN7 da spec 0020).
- [x] CA4. No mobile as duas ações são botões evidentes — preenchida a principal, contornada a secundária (RN4 da spec 0020).
- [x] CA5. "Remover" continua acessível, com o testid
agency-delete-button. - [x] CA6. Nenhum
color: "secondary"como string de paleta sobra no arquivo. - [x] CA7. O e2e afere título e teto de ações em todas as telas de detalhe, não só nesta.
- [x] CA8.
tsclimpo, sem apontamento novo.
8. Plano¶
- [x] Reproduzir medindo a largura do título em 390px (linha de base: 0px)
- [x]
apps/web—primaryAction/secondaryActione "Remover" para o fim da página - [x]
apps/e2e— regressão cobrindo todas as telas de detalhe - [x]
tscemake test - [x]
/devremote-rebuild+ medição nos dois viewports
9. Decisões em aberto¶
Nenhuma. O usuário decidiu: Convidar + Editar no topo, Remover no fim da página.
10. Registro¶
Antes × depois, medido em 390px¶
| Antes | Depois | |
|---|---|---|
| Largura do bloco de título | 0px | 204px |
| Ações no topo | 3 (382px de rótulos) | 2, como ícones |
| Ícone e subtítulo | ausentes | presentes |
| "Remover" | no topo, vazando pela borda | fim da página, mesmo testid |
| Rolagem horizontal | 0 | 0 |
O desktop não mudou: título em 204px antes e depois.
O que divergiu do plano¶
Nada. A correção saiu como escrita: duas ações tipadas no topo, a destrutiva no fim da página. É o primeiro registro desta sessão em que a implementação não descobriu nada que a análise não tivesse previsto — provavelmente porque a causa raiz era conhecida antes de começar, por ser omissão de uma entrega própria e recente.
O que este defeito ensina sobre o critério de migração¶
A spec 0020 migrou "as páginas que usam o ternário isMobile ?". O critério descreve como o código estava escrito, não o que a tela faz. Quem escreveu diferente ficou de fora, e nenhuma verificação pegou porque a CA da 0020 conferia presença de primaryAction nas páginas migradas — não a ausência de botões crus nas demais.
É o mesmo erro de método que deixou sete telas de fora naquela spec (varrer nome de arquivo em vez de rota). Duas vezes seguidas o critério de busca casou com a convenção e não com a realidade.
Por isso a regressão cobre todas as telas de detalhe, e afere o efeito — largura do título > 40px e no máximo duas ações — em vez de conferir se a página usa a prop certa. Aferir efeito é o que sobrevive à próxima forma de escrever errado.
Verificação¶
tsc: limpo.page-header.spec.ts: 12/12 em chromium, com o cenário novo cobrindo Inquilinos, Imóveis e Imobiliárias.- Medido no dev-remote após rebuild: os números da tabela acima, nos dois viewports.
make test: não impactado — nenhum arquivo da API tocado.- Suíte e2e completa: a executar antes do merge.