Guia de Desenvolvimento: Padrões de UI e Design System
A consistência visual é vital em um ecossistema médico. Um botão de "Emergência" deve ser idêntico em todas as aplicações, independentemente do desenvolvedor ou do time responsável.
1. Design System Centralizado (shared/ui)
Todos os componentes visuais puros devem residir em packages/shared/ui. Eles devem ser agnósticos a negócio (não conhecem o Redux ou regras médicas).
- Princípio: Componentes atômicos (Botão, Input, Modal, Tipografia).
- Estilização: Utilizamos CSS-in-JS ou módulos CSS (conforme padrão do projeto), garantindo que o tema seja injetável.
2. Componentes de Domínio (domains/[domain]/ui)
Estes são componentes "inteligentes" que conhecem o contexto clínico. Eles compõem elementos do shared/ui com lógica de negócio.
- Exemplo: O componente
PrescriptionFormvive no domínio demedical-record. Ele usaInputeButtondoshared/ui, mas sabe como validar um CID e salvar na API.
3. Padrão de Composição: "Fragments"
Para evitar componentes gigantes, dividimos a UI em "Fragmentos":
ui/components: Peças pequenas e reutilizáveis dentro do domínio.ui/fragments: Organismos maiores (ex: Sidebar de histórico, Player de vídeo).ui/Page.tsx: O layout final que orquestra os fragmentos.
4. Tratamento de Estados de Carregamento (Loading)
Nunca deixe o usuário com uma tela em branco ou congelada.
- Skeletons: Utilize esqueletos de carregamento para layouts que demoram a baixar dados da API.
- Spinners: Reservados para ações rápidas (clique em botão).
- Empty States: Sempre informe quando uma lista estiver vazia (ex: "Nenhum paciente agendado para hoje").
tsx
// Exemplo de Composição Inteligente
const MedicalRecordPage = () => {
const { data, loading } = useMedicalRecord();
if (loading) return <RecordSkeleton />;
if (!data) return <EmptyState message="Prontuário não localizado" />;
return (
<Container>
<PatientHeader data={data.patient} />
<RecordTimeline history={data.history} />
</Container>
);
};Checklist de UI
- [ ] Meu componente é agnóstico a negócio se estiver em
shared/ui? - [ ] O componente trata estados de erro e loading de forma elegante?
- [ ] Utilizei os tokens de design (cores, espaçamentos) do sistema?
- [ ] O componente é acessível (ARIA tags, contraste)?