11 KiB
11 KiB
🎨 SISTEMA GLOBAL DE STATUS - PraFrota
Sistema unificado de estilos para status em toda aplicação Angular, baseado no padrão encontrado em account-payable-items.component.scss.
📋 Índice
- Visão Geral
- Instalação e Configuração
- Status Disponíveis
- Exemplos de Uso
- Customizações
- Migração
- Melhores Práticas
🎯 Visão Geral
O Sistema Global de Status padroniza a exibição de status em toda aplicação PraFrota, garantindo:
- ✅ Consistência Visual: Mesma aparência em todos os componentes
- ✅ Manutenibilidade: Centralização dos estilos
- ✅ Escalabilidade: Fácil adição de novos status
- ✅ Responsividade: Adaptação automática para mobile
- ✅ Dark Mode: Suporte completo a temas escuros
- ✅ Acessibilidade: Cores e contrastes adequados
🚀 Instalação e Configuração
1. Arquivo Principal
O sistema está localizado em:
projects/idt_app/src/assets/styles/_status.scss
2. Importação Global
Já está importado automaticamente no app.scss:
@import "_status";
3. Uso Imediato
Não requer configuração adicional. Funciona globalmente em toda aplicação.
📊 Status Disponíveis
💰 Status Financeiros
| Classe | Label | Cor | Uso |
|---|---|---|---|
status-pending |
Pendente | Amarelo | Pagamentos pendentes |
status-paid |
Pago | Azul | Pagamentos realizados |
status-approved |
Aprovado | Azul | Itens aprovados |
status-approved-customer |
Aprovado Cliente | Azul | Aprovação do cliente |
status-cancelled |
Cancelado | Vermelho | Itens cancelados |
status-refused |
Recusado | Vermelho | Itens recusados |
🔄 Status Gerais
| Classe | Label | Cor | Uso |
|---|---|---|---|
status-active |
Ativo | Azul | Registros ativos |
status-inactive |
Inativo | Cinza | Registros inativos |
status-suspended |
Suspenso | Amarelo | Temporariamente suspenso |
status-archived |
Arquivado | Cinza | Registros arquivados |
⚙️ Status de Processamento
| Classe | Label | Cor | Uso |
|---|---|---|---|
status-processing |
Processando | Azul claro | Em processamento (com animação) |
status-completed |
Concluído | Azul | Processamento concluído |
status-failed |
Falhou | Vermelho | Processamento falhou |
status-unknown |
Desconhecido | Cinza | Status não identificado |
🎨 Exemplos de Uso
Uso Básico
<!-- Status simples -->
<span class="status-badge status-pending">Pendente</span>
<span class="status-badge status-paid">Pago</span>
<span class="status-badge status-cancelled">Cancelado</span>
Com Ícones
<!-- Status com ícones -->
<span class="status-badge status-processing">
<i class="fas fa-spinner"></i>
Processando
</span>
<span class="status-badge status-completed">
<i class="fas fa-check"></i>
Concluído
</span>
Variações de Tamanho
<!-- Tamanhos diferentes -->
<span class="status-badge status-sm status-pending">Pequeno</span>
<span class="status-badge status-pending">Normal</span>
<span class="status-badge status-lg status-pending">Grande</span>
Em Tabelas (Data Table)
// No componente TypeScript
{
field: "status",
header: "Status",
allowHtml: true,
label: (status: string) => {
const statusConfig: { [key: string]: { label: string, class: string } } = {
'Pending': { label: 'Pendente', class: 'status-pending' },
'Paid': { label: 'Pago', class: 'status-paid' },
'Approved': { label: 'Aprovado', class: 'status-approved' },
'Cancelled': { label: 'Cancelado', class: 'status-cancelled' }
};
const config = statusConfig[status] || { label: status, class: 'status-unknown' };
return `<span class="status-badge ${config.class}">${config.label}</span>`;
}
}
Lista de Status
<!-- Múltiplos status -->
<div class="status-list">
<span class="status-badge status-active">Ativo</span>
<span class="status-badge status-approved">Aprovado</span>
<span class="status-badge status-paid">Pago</span>
</div>
Com Agrupamento
<!-- Status agrupados -->
<div class="status-group">
<span class="status-label">Financeiro:</span>
<span class="status-badge status-pending">Pendente</span>
</div>
<div class="status-group">
<span class="status-label">Operacional:</span>
<span class="status-badge status-active">Ativo</span>
</div>
🎨 Badges Informativos
Badges de Resumo
<!-- Para headers e resumos -->
<div class="items-summary">
<span class="badge badge-info">
<i class="fas fa-list"></i>
Total: 150
</span>
<span class="badge badge-secondary">
<i class="fas fa-check"></i>
Pagos: 120
</span>
<span class="badge badge-warning">
<i class="fas fa-clock"></i>
Pendentes: 30
</span>
</div>
Variações de Badge
<span class="badge badge-primary">Primário</span>
<span class="badge badge-success">Sucesso</span>
<span class="badge badge-warning">Atenção</span>
<span class="badge badge-danger">Perigo</span>
<span class="badge badge-info">Informação</span>
🎭 Estados Visuais Globais
Estado Vazio
<div class="empty-state">
<i class="fas fa-inbox fa-3x"></i>
<h4>Nenhum item encontrado</h4>
<p>Não há registros para exibir no momento.</p>
<button class="btn btn-primary">
<i class="fas fa-plus"></i>
Adicionar Novo
</button>
</div>
Estado de Erro
<div class="error-state">
<i class="fas fa-exclamation-triangle fa-3x"></i>
<h4>Erro ao carregar dados</h4>
<p>Ocorreu um problema ao buscar as informações.</p>
<button class="btn btn-primary">
<i class="fas fa-refresh"></i>
Tentar Novamente
</button>
</div>
Estado de Carregamento
<div class="loading-state">
<div class="spinner"></div>
<h4>Carregando...</h4>
<p>Aguarde enquanto buscamos os dados.</p>
</div>
🌙 Dark Mode
O sistema possui suporte automático ao Dark Mode através de:
1. Media Query (Automático)
@media (prefers-color-scheme: dark) {
// Estilos automáticos
}
2. Classe Manual
:host-context([data-theme="dark"]) {
// Estilos manuais
}
3. Classe Global
.dark-theme {
// Estilos para tema escuro
}
📱 Responsividade
Mobile First
@media (max-width: 768px) {
.status-badge {
font-size: 0.6875rem;
padding: 0.1875rem 0.375rem;
}
}
Adaptações Automáticas
- Tamanhos de fonte reduzidos
- Padding ajustado
- Espaçamentos otimizados
🔧 Customizações
Adicionando Novos Status
// Em _status.scss
.status-badge {
&.status-meu-novo-status {
background-color: #e3f2fd;
color: #1976d2;
border-color: #90caf9;
&:hover {
background-color: #90caf9;
transform: translateY(-1px);
}
}
}
Variações Personalizadas
// Status com animação personalizada
.status-badge {
&.status-pulsing {
animation: pulse 2s infinite;
}
}
@keyframes pulse {
0% { opacity: 1; }
50% { opacity: 0.5; }
100% { opacity: 1; }
}
🔄 Migração
De Estilos Locais para Global
Antes (Local)
// component.scss
.status-badge {
&.status-pending {
background-color: #fff3cd;
color: #856404;
}
}
Depois (Global)
// Remover estilos locais
// Usar classes globais diretamente
<!-- HTML permanece igual -->
<span class="status-badge status-pending">Pendente</span>
Checklist de Migração
- Identificar estilos de status locais
- Verificar se status existe no sistema global
- Remover estilos locais duplicados
- Testar funcionamento
- Adicionar comentário sobre uso global
✅ Melhores Práticas
1. Nomenclatura Consistente
// ✅ Correto
const statusConfig = {
'Pending': { label: 'Pendente', class: 'status-pending' },
'Paid': { label: 'Pago', class: 'status-paid' }
};
// ❌ Evitar
const statusConfig = {
'pending': { label: 'Pendente', class: 'custom-pending' }
};
2. Fallback para Status Desconhecidos
// ✅ Sempre incluir fallback
const config = statusConfig[status] || {
label: status,
class: 'status-unknown'
};
3. Uso de allowHtml em Tabelas
// ✅ Necessário para HTML em tabelas
{
field: "status",
allowHtml: true, // Obrigatório para badges
label: (status) => `<span class="status-badge status-${status}">${status}</span>`
}
4. Acessibilidade
<!-- ✅ Com aria-label para screen readers -->
<span class="status-badge status-pending" aria-label="Status: Pendente">
Pendente
</span>
<!-- ✅ Com role para elementos interativos -->
<span class="status-badge status-active" role="status">
Ativo
</span>
5. Performance
<!-- ✅ Evitar muitos status na mesma tela -->
<div class="status-list">
<!-- Máximo 5-10 badges por container -->
</div>
<!-- ✅ Usar lazy loading para listas grandes -->
<virtual-scroller>
<div *ngFor="let item of items">
<span class="status-badge">{{item.status}}</span>
</div>
</virtual-scroller>
🧪 Testes
Teste Visual
// Verificar se todos os status são exibidos corretamente
const allStatus = [
'status-pending', 'status-paid', 'status-cancelled',
'status-active', 'status-inactive', 'status-processing'
];
allStatus.forEach(status => {
// Verificar se classe existe e tem estilos corretos
});
Teste de Responsividade
// Verificar adaptação mobile
@media (max-width: 768px) {
// Testar tamanhos e espaçamentos
}
📚 Referências
- Arquivo Principal:
projects/idt_app/src/assets/styles/_status.scss - Importação:
projects/idt_app/src/assets/styles/app.scss - Exemplo de Uso:
projects/idt_app/src/app/domain/fines/fines.component.ts - Migração:
projects/idt_app/src/app/domain/finances/account-payable/components/account-payable-items/
🔄 Changelog
v1.0.0 - Sistema Inicial
- ✅ Criação do arquivo
_status.scss - ✅ Importação no
app.scss - ✅ Status financeiros básicos
- ✅ Status gerais
- ✅ Estados visuais (empty, error, loading)
- ✅ Suporte a Dark Mode
- ✅ Responsividade mobile
- ✅ Migração de
account-payable-items - ✅ Documentação completa
Próximas Versões
- 🔄 Animações avançadas
- 🔄 Mais variações de status
- 🔄 Integração com Angular Material
- 🔄 Testes automatizados
Desenvolvido para PraFrota | Sistema de Gestão de Frota | Angular 19.2.x