Frontend Guidelines
Objetivo
Evoluir a app moderna em app/frontend/ com consistência funcional e estrutural, alinhando-a com os módulos de risco e com as referências v3.0 e v3.1 quando necessário.
Stack
- React + Vite + TypeScript + Tailwind CSS
Estrutura de ficheiros em docs/ARCHITECTURE.md.
Regras principais
1. O frontend ativo vive em app/frontend/
Nova implementação deve ser feita aí.
Não desenvolver funcionalidades principais dentro de:
reference/chichorro-3.0-jt/reference/chichorro-3.1-rs/reference/chichorro-2.0-rf/
salvo tarefa explícita de análise ou comparação.
2. Organização por páginas funcionais
As páginas principais devem refletir os domínios do sistema:
- CTI
- DPI
- ESCI
- POI
- RI
Isto deve continuar a ser a base da navegação e da estrutura mental da app.
3. Organização por domínio
Quando um domínio tiver lógica de UI própria, manter o padrão:
FactorSection.tsxdefinitions.ts
Exemplos atuais:
DpiFactorSection.tsx+dpiDefinitions.tsEsciFactorSection.tsx+esciDefinitions.tsPoiFactorSection.tsx+poiDefinitions.ts
Se CTI e RI precisarem do mesmo padrão, seguir esta convenção.
4. Layout, autenticação e sessão
AppLayout.tsxconcentra o layout global da aplicaçãoLoginPage.tsxtrata a entrada do utilizadorRequireAuth.tsxprotege zonas autenticadasAuthPendingScreen.tsxtrata estados intermédios de autenticaçãosession.tsdeve concentrar gestão de sessãolegacyLogin.tsdeve ser encarado como compatibilidade transitória até eventual substituição
5. Placeholder
PlaceholderPage.tsx deve ser usado apenas como transição. Não deixar funcionalidades reais escondidas indefinidamente em placeholders.
6. Integração com backend
A comunicação com backend deve ser centralizada em src/lib/ ou numa futura pasta services/. Evitar:
- fetch solto em vários componentes
- duplicação de transformação de payloads
- parsing repetido
7. UI reutilizável
Button.tsx,Card.tsxeField.tsxdevem ser a base dos elementos comunsModuleGlobalValueCard.tsxdeve ser reutilizado quando fizer sentido apresentar valores agregados por módulo- evitar recriar variantes paralelas sem necessidade real
8. Resultados calculados e estado desatualizado
Quando um input de um fator/módulo já calculado é alterado ou apagado:
- o resultado local antigo deve permanecer visível, mas em cinza translúcido
- deve aparecer aviso âmbar:
Um ou mais valores foram alterados ou apagados. Por favor, volte a calcular. - o resultado atual deve ser removido do storage usado por cálculos dependentes
- o último valor global válido deve ser guardado como desatualizado para o
ModuleGlobalValueCard - o cartão global deve mostrar o valor antigo em cinza translúcido e a nota
Valor desatualizado - ao recalcular com sucesso, o estado desatualizado deve ser limpo
Implementação atual:
resultsStore.ts:getStaleModuleResults,setStaleModuleResult,clearStaleModuleResultModuleGlobalValueCard.tsx: renderiza valor atual ou último valor desatualizado- POI/DPI/ESCI: limpar fator com
clearModuleFactorResult(module, factorKey, { recomputeModule: false })em alteração de input - CTI: limpar
module-results.ctie preservar o último valor válido emmodule-results-stale
Não fazer
- não copiar HTML/CSS antigo diretamente da referência 3.1 como base do frontend moderno
- não mover lógica técnica de risco para o frontend
- não criar novas páginas fora do padrão modular existente
- não duplicar definitions e fatores em vários sítios
- não perpetuar dependência de
legacyLogin.tssem necessidade
Modos de trabalho
active_build
Editar apenas app/frontend/
v3_0_legacy_compare
Usar reference/chichorro-3.0-jt/ apenas como comparação histórica ou funcional
v3_1_matchup
Ler reference/chichorro-3.1-rs/ como referência funcional, mas implementar em app/frontend/
v4_0_research
Não alterar o frontend ativo sem decisão explícita