diff --git a/.impeccable/critique/2026-08-02T18-07-00Z__nts-campaign-shell-municipalitynavsavedfilters-tsx.md b/.impeccable/critique/2026-08-02T18-07-00Z__nts-campaign-shell-municipalitynavsavedfilters-tsx.md new file mode 100644 index 00000000..44735057 --- /dev/null +++ b/.impeccable/critique/2026-08-02T18-07-00Z__nts-campaign-shell-municipalitynavsavedfilters-tsx.md @@ -0,0 +1,87 @@ +--- +target: MunicipalityNavSavedFilters sidebar +total_score: 27 +p0_count: 1 +p1_count: 2 +timestamp: 2026-08-02T18-07-00Z +slug: nts-campaign-shell-municipalitynavsavedfilters-tsx +--- + +Method: dual-agent (A: dc65e367-57b3-4fa5-947b-a43efdce8fba · B: cb10af92-e254-4c0e-9a39-b100b4226b65) + +# Critique — MunicipalityNavSavedFilters (sidebar Municípios) + +## Design Health Score + +| # | Heuristic | Score | Key Issue | +| --------- | ------------------------------- | --------- | ---------------------------------------------------------------- | +| 1 | Visibility of System Status | 3 | Active/expanded OK; context (route/hover) not driving disclosure | +| 2 | Match System / Real World | 3 | Clear aria; sighted UI lacks “filtros salvos” framing | +| 3 | User Control and Freedom | 4 | Toggle, persist, undo delete | +| 4 | Consistency and Standards | 3 | Familiar shadcn tree; only campaign submenu | +| 5 | Error Prevention | 2 | Instant delete (undo mitigates); dense targets | +| 6 | Recognition Rather Than Recall | 2 | Collapsed bookmarks vanish to a small chevron | +| 7 | Flexibility and Efficiency | 3 | Strong when open; no contextual auto-open | +| 8 | Aesthetic and Minimalist Design | 2 | Open list pollutes primary nav; default-open worsens | +| 9 | Error Recovery | 4 | Undo toast + Desfazer | +| 10 | Help and Documentation | 1 | No in-nav teach after first save | +| **Total** | | **27/40** | **Acceptable — significant intent mismatch** | + +## Anti-Patterns Verdict + +**LLM assessment**: Not AI slop. Failure is disclosure policy + open-list weight reading as a second nav section. + +**Deterministic scan**: 0 findings on MunicipalityNavSavedFilters.tsx + CampaignSidebar.tsx (exit 0). + +**Visual overlays**: No reliable overlay — browser visualization skipped (no local /campanha with login). + +## Overall Impression + +Craft and a11y of B18 are strong; the open, persisted submenu breaks proximity to Municípios and clarity under pressure. Biggest opportunity: contextual expand (route + hover-when-panel-visible) instead of durable open preference. + +## What's Working + +1. Correct IA ownership under Municípios +2. Delete + Desfazer + focus handoff +3. Kit reuse with deliberate touch vs fine-pointer trash visibility + +## Priority Issues + +### P0 — Disclosure model contradicts product intention + +Persisted preference, default open; no hover; no open-on-Municípios-page. Fix: ephemeral/context open. + +### P1 — Open list reads as its own nav section + +Tree rail + N×h-7 between Municípios and Territórios. Fix: contextual collapse + tighter/muted sub chrome. + +### P1 — Hover vs offcanvas history + +B18 rejected hover for collapsed rail; intention works when panel is visible. Fix: hover/focus-within only while sidebar expanded/open. + +### P2 — Sighted association is chevron-only + +No visible “Filtros salvos” framing. + +### P3 — Discoverability after deliberate collapse + +Mostly solved by contextual open. + +## Persona Red Flags + +- Alex: open list helps in Municípios, taxes full-nav scan elsewhere +- Sam: long tab path when open; hover-open must sync aria-expanded +- Coordenador em mesa: expanded on Quadro/Atividades = noise; collapsed on Municípios = missing shortcuts + +## Minor Observations + +Default-open philosophy opposite of new brief; logout clears storage; Feel-the-action pending on sidebar nav is minor. + +## Questions to Consider + +1. Drop persisted open entirely? +2. Chips under Municípios when active/hovered vs tree? +3. Cap visible sidebar cuts at ≤4 + overflow? +4. Scope hover to panel-visible only? + +Cognitive load: 6/8 checklist failures (high). diff --git a/docs/plans/sidebar-filtros-salvos-proximidade.md b/docs/plans/sidebar-filtros-salvos-proximidade.md new file mode 100644 index 00000000..eeb22df5 --- /dev/null +++ b/docs/plans/sidebar-filtros-salvos-proximidade.md @@ -0,0 +1,83 @@ +# B124 — Sidebar Municípios: filtros salvos colados (sem disclosure) + +Status: registrado +Atualizado em: 2026-08-02 +Issue: #253 +Priority: P2 +Model: composer-2.5 +Impeccable: B — encaixe em `CampaignSidebar` / `MunicipalityNavSavedFilters` (hierarquia visual + proximidade; sem rota nova) +Appetite: ~0,5 dia eng; um outcome verificável (atalhos leem como filhos de Municípios, não como seção própria) +Responsável: — + +## Intenção + +Os atalhos de filtro salvo sob **Municípios** no sidebar de `/campanha` hoje parecem um bloco afastado — hierarquia fraca e distância vertical grande. Quem está na mesa só enxerga o que está na tela: os recortes precisam aparecer **sempre** (quando existem), **logo abaixo** de Municípios, com indentação clara de filho — sem chevron, sem abrir/fechar, sem hover. + +## Persona e fluxo + +- **Persona / contexto:** coordenador/assessor na mesa; scan da sidebar sob pressão +- **Job principal:** ver e clicar um recorte salvo como continuação natural de Municípios +- **Fluxo desejado:** + 1. Há filtros salvos → lista aparece sempre, imediatamente sob Municípios + 2. Indentação horizontal marca “isto é filho de Municípios” + 3. Gap vertical mínimo entre Municípios e o primeiro atalho (hoje está longe demais) + 4. Sem filtros → nada extra (só o item Municípios) +- **Anti-goals de produto:** disclosure/collapse/hover; redesign do shell; filtros salvos em outras listas; sync multi-device + +### Esboço de fluxo (B) + +```text +[Municípios] + [filtro A] ← sempre visível se existir; indentado; colado + [filtro B] +[Territórios] +``` + +## Objetivo e aceite + +- Com filtros salvos, os links ficam **sempre visíveis** (sem toggle, sem estado open/closed, sem persistência de disclosure) +- Visualmente são **filhos** de Municípios: um pouco mais para dentro na horizontal +- Ficam **logo abaixo** do item Municípios (proximidade vertical — deixam de ler como seção própria) +- Apagar + Desfazer e o restante do bookmark (B18) continuam intactos +- Teclado/leitor: lista nomeada; item ativo com `aria-current`; sem controles de expand órfãos + +## Dados (intenção) + +- **Vou apresentar dados?** Não +- **Decisões desbloqueadas:** N/A — navegação, não métrica +- **Forma:** _adiada ao plano de implementação_ + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** `MunicipalityNavSavedFilters.tsx` (remover disclosure), `CampaignSidebar.tsx`, storage de open em `municipalitySavedFilters.ts` (chave/API de open provavelmente vira morta), e2e `campaignSavedFilters.e2e.spec.ts` +- **Precedente a olhar:** `docs/plans/filtros-salvos-municipios.md` (B18) — este item **desfaz** a decisão de chevron + open persistido +- **Risco de acoplamento:** sidebar no layout `(app)` — não puxar serializador de URL de município; manter `listQueryMatch` puro + +## Dependências + +- Nenhuma (B18 já entregue) + +## Fora de escopo + +- Salvar filtros em outras listas +- Preferências de nav no servidor +- Redesign amplo do sidebar (só proximidade + indentação deste submenu) +- Mudar teto de 12 ou ordem alfabética +- Collapse / hover / open contextual + +## Rabbit holes de produto + +- **Reintroduzir disclosure “só um pouquinho”.** Compete com “o que está na tela”. **Corte:** zero open/close neste item. +- **Lista longa (até 12) empurrando o resto da nav.** Aceito neste appetite: bookmarks são atalho de mesa. **Corte:** não inventar “mostrar só 4 + mais” sem evidência nova. + +## Questões em aberto (produto) + +- Nenhuma — gate 2026-08-02: **sem** rótulo “Filtros salvos” (ou semelhante); **sem** chevron; lista sempre visível com indentação + proximidade vertical. + +## Referências + +- GitHub Issue #253 +- Critique Impeccable 2026-08-02 — pivô de produto: drop collapse; always-on + proximity +- `docs/plans/filtros-salvos-municipios.md` (B18) +- `src/components/campaign/shell/MunicipalityNavSavedFilters.tsx` +- `src/components/campaign/shell/CampaignSidebar.tsx`