Guia Completo: Modal / Dialog
Índice
- Introdução
- Modal de Alerta
- Modal Padrão
- Modal de Confirmação
- Tamanhos
- Variantes de Alerta
- JavaScript API
- Helpers Rápidos
- Eventos
- Acessibilidade
- Boas Práticas
Introdução
O componente Modal fornece janelas de diálogo para alertas, confirmações e formulários, com backdrop e animações suaves.
Características Principais
- ✅ 4 tipos de alerta (info, success, warning, error)
- ✅ Layout padrão e layout de alerta centralizado
- ✅ 1 ou 2 botões configuráveis
- ✅ Backdrop com blur
- ✅ Animações suaves
- ✅ Trap de foco automático
- ✅ Fecha com ESC
- ✅ Helpers JavaScript (alert, confirm)
- ✅ API completa
- ✅ Totalmente responsivo
- ✅ WCAG 2.1 AA compliant
Modal de Alerta
Modais centralizados com ícone, ideal para alertas e notificações.
Estrutura Básica
<div class="modal-backdrop">
<div class="modal modal-alert modal-alert-info">
<!-- Botão fechar -->
<button class="modal-close" aria-label="Fechar">
<i class="material-icons">close</i>
</button>
<!-- Header com ícone -->
<div class="modal-header">
<div class="modal-alert-icon">
<i class="material-icons">info</i>
</div>
<h2 class="modal-title">Título Exemplo!</h2>
</div>
<!-- Body -->
<div class="modal-body">
<p class="modal-alert-text">
Sua Guia de Trânsito Animal foi registrada como rascunho.
Para que o documento tenha validade, é necessário realizar
o pagamento do boleto gerado.
</p>
</div>
<!-- Footer -->
<div class="modal-footer">
<button class="btn btn-primary" data-modal-close>
Botão
</button>
</div>
</div>
</div>Com Dois Botões
<div class="modal-footer">
<button class="btn btn-outline" data-modal-close>
Botão
</button>
<button class="btn btn-primary">
Botão
</button>
</div>Modal Padrão
Modal tradicional com header, body e footer separados.
<div class="modal-backdrop">
<div class="modal">
<!-- Header -->
<div class="modal-header">
<div class="modal-header-content">
<h2 class="modal-title">Título do Modal</h2>
<p class="modal-subtitle">Subtítulo opcional</p>
</div>
<button class="modal-close" aria-label="Fechar">
<i class="material-icons">close</i>
</button>
</div>
<!-- Body -->
<div class="modal-body">
<p>Conteúdo do modal aqui.</p>
</div>
<!-- Footer -->
<div class="modal-footer">
<button class="btn btn-outline" data-modal-close>
Cancelar
</button>
<button class="btn btn-primary">
Confirmar
</button>
</div>
</div>
</div>Modal de Confirmação
Modal otimizado para confirmações com dois botões lado a lado.
<div class="modal-backdrop">
<div class="modal modal-confirm modal-alert modal-alert-warning">
<button class="modal-close" aria-label="Fechar">
<i class="material-icons">close</i>
</button>
<div class="modal-header">
<div class="modal-alert-icon">
<i class="material-icons">warning</i>
</div>
<h2 class="modal-title">Confirmar Ação</h2>
</div>
<div class="modal-body">
<p class="modal-alert-text">
Tem certeza que deseja realizar esta ação?
Esta operação não pode ser desfeita.
</p>
</div>
<div class="modal-footer">
<button class="btn btn-outline" data-modal-close>
Cancelar
</button>
<button class="btn btn-primary">
Confirmar
</button>
</div>
</div>
</div>Tamanhos
Cinco tamanhos disponíveis:
<!-- Pequeno -->
<div class="modal modal-sm">...</div>
<!-- Médio (Padrão) -->
<div class="modal modal-md">...</div>
<!-- Grande -->
<div class="modal modal-lg">...</div>
<!-- Extra Grande -->
<div class="modal modal-xl">...</div>
<!-- Tela Cheia -->
<div class="modal modal-fullscreen">...</div>Tabela de Tamanhos
| Classe | Largura Máxima | Uso Recomendado |
|---|---|---|
.modal-sm | 400px | Alertas simples |
.modal-md | 500px | Uso geral (padrão) |
.modal-lg | 700px | Formulários grandes |
.modal-xl | 900px | Conteúdo extenso |
.modal-fullscreen | 100% | Aplicações, editores |
Variantes de Alerta
Quatro tipos semânticos de alerta:
1. Padrão / Info (Azul)
<div class="modal modal-alert modal-alert-info">
<div class="modal-header">
<div class="modal-alert-icon">
<i class="material-icons">info</i>
</div>
<h2 class="modal-title">Informação</h2>
</div>
<!-- ... -->
</div>2. Sucesso (Verde)
<div class="modal modal-alert modal-alert-success">
<div class="modal-header">
<div class="modal-alert-icon">
<i class="material-icons">check_circle</i>
</div>
<h2 class="modal-title">Sucesso!</h2>
</div>
<!-- ... -->
</div>3. Atenção / Warning (Amarelo)
<div class="modal modal-alert modal-alert-warning">
<div class="modal-header">
<div class="modal-alert-icon">
<i class="material-icons">warning</i>
</div>
<h2 class="modal-title">Atenção!</h2>
</div>
<!-- ... -->
</div>4. Erro / Danger (Vermelho)
<div class="modal modal-alert modal-alert-error">
<div class="modal-header">
<div class="modal-alert-icon">
<i class="material-icons">error</i>
</div>
<h2 class="modal-title">Erro!</h2>
</div>
<!-- ... -->
</div>Tabela de Cores
| Tipo | Background Ícone | Cor Ícone | Ícone Padrão | Uso |
|---|---|---|---|---|
| Info | #EEF3FF | #3F68FB | info | Informações gerais |
| Success | #E8F5EE | #47B881 | check_circle | Confirmações positivas |
| Warning | #FEF3E2 | #F59E0B | warning | Avisos e atenções |
| Error | #FEE2E2 | #DC2626 | error | Erros e problemas |
JavaScript API
Inicialização Manual
// Criar modal
const modal = window.createModal('#meuModal', {
backdrop: true,
keyboard: true,
focus: true,
closeOnBackdropClick: true,
onShow: (modal) => {
console.log('Modal será exibido');
},
onShown: (modal) => {
console.log('Modal foi exibido');
},
onHide: (modal) => {
console.log('Modal será escondido');
},
onHidden: (modal) => {
console.log('Modal foi escondido');
}
});Opções de Configuração
{
backdrop: true, // Exibir backdrop
keyboard: true, // Fechar com ESC
focus: true, // Focar no modal ao abrir
show: false, // Abrir automaticamente
closeOnBackdropClick: true, // Fechar ao clicar no backdrop
onShow: null, // Callback antes de mostrar
onHide: null, // Callback antes de esconder
onShown: null, // Callback após mostrar
onHidden: null // Callback após esconder
}Métodos
// Obter instância
const modal = window.getModal('#meuModal');
// Mostrar
modal.show();
// Esconder
modal.hide();
// Toggle
modal.toggle();
// Definir loading
modal.setLoading(true);
modal.setLoading(false);
// Atualizar conteúdo
modal.setTitle('Novo Título');
modal.setContent('<p>Novo conteúdo</p>');
modal.setFooter('<button class="btn btn-primary">OK</button>');
// Destruir
modal.destroy();Helpers Rápidos
Modal Alert
Cria e exibe um modal de alerta rapidamente:
window.modalAlert({
type: 'success', // info, success, warning, error
title: 'Sucesso!',
message: 'Operação realizada com sucesso.',
confirmText: 'OK',
icon: 'check_circle', // Opcional (usa padrão do tipo)
onConfirm: () => {
console.log('Confirmado!');
}
});Modal Confirm
Cria e exibe um modal de confirmação:
window.modalConfirm({
type: 'warning',
title: 'Confirmar Exclusão',
message: 'Tem certeza que deseja excluir este item? Esta ação não pode ser desfeita.',
confirmText: 'Sim, excluir',
cancelText: 'Cancelar',
icon: 'delete',
onConfirm: () => {
console.log('Confirmado!');
// Executar ação
},
onCancel: () => {
console.log('Cancelado');
}
});Exemplos Práticos
// Alert de sucesso
window.modalAlert({
type: 'success',
title: 'Cadastro Realizado!',
message: 'O usuário foi cadastrado com sucesso no sistema.',
confirmText: 'Entendi'
});
// Confirmação de exclusão
window.modalConfirm({
type: 'error',
title: 'Excluir Registro?',
message: 'Esta ação é irreversível. Todos os dados serão permanentemente removidos.',
confirmText: 'Sim, excluir',
cancelText: 'Não, manter',
onConfirm: () => {
// Lógica de exclusão
fetch('/api/delete/123', { method: 'DELETE' })
.then(() => {
window.modalAlert({
type: 'success',
title: 'Excluído!',
message: 'O registro foi excluído com sucesso.'
});
});
}
});
// Info simples
window.modalAlert({
type: 'info',
title: 'Atenção',
message: 'O sistema estará em manutenção amanhã das 2h às 6h.'
});Eventos
Listeners de Eventos
const modalElement = document.querySelector('#meuModal');
// Antes de mostrar
modalElement.addEventListener('modal:show', (e) => {
console.log('Modal será exibido', e.detail.modal);
});
// Após mostrar (após animação)
modalElement.addEventListener('modal:shown', (e) => {
console.log('Modal foi exibido', e.detail.modal);
});
// Antes de esconder
modalElement.addEventListener('modal:hide', (e) => {
console.log('Modal será escondido', e.detail.modal);
});
// Após esconder (após animação)
modalElement.addEventListener('modal:hidden', (e) => {
console.log('Modal foi escondido', e.detail.modal);
});
// Inicialização
modalElement.addEventListener('modal:init', (e) => {
console.log('Modal inicializado', e.detail.modal);
});
// Destruição
modalElement.addEventListener('modal:destroy', (e) => {
console.log('Modal destruído', e.detail.modal);
});Acessibilidade
ARIA Attributes
<div class="modal" role="dialog" aria-labelledby="modal-title" aria-modal="true">
<div class="modal-header">
<h2 id="modal-title" class="modal-title">Título do Modal</h2>
<button class="modal-close" aria-label="Fechar modal">
<i class="material-icons" aria-hidden="true">close</i>
</button>
</div>
<!-- ... -->
</div>Navegação por Teclado
| Tecla | Ação |
|---|---|
| Tab | Navega entre elementos focáveis |
| Shift + Tab | Navega para trás |
| Escape | Fecha o modal |
| Enter | Ativa botão focado |
Focus Trap
O modal automaticamente:
- ✅ Salva o elemento focado antes de abrir
- ✅ Move o foco para dentro do modal
- ✅ Mantém o foco dentro do modal (trap)
- ✅ Restaura o foco ao fechar
Contraste de Cores
Todos os elementos seguem WCAG AA (4.5:1):
| Elemento | Contraste | Status |
|---|---|---|
| Título | 13.2:1 | ✅ AAA |
| Texto | 6.8:1 | ✅ AA |
| Ícones | 7.1:1 | ✅ AA |
| Botões | 4.5:1+ | ✅ AA |
Boas Práticas
✅ Faça
Use o tipo correto de alerta
javascript// ✅ Sucesso para confirmações positivas window.modalAlert({ type: 'success', title: 'Salvo!' }); // ✅ Warning para confirmações importantes window.modalConfirm({ type: 'warning', title: 'Confirmar?' }); // ✅ Error para erros críticos window.modalAlert({ type: 'error', title: 'Erro ao salvar' });Textos claros e objetivos
javascript// ✅ Bom: Claro e direto { title: 'Excluir Usuário?', message: 'Esta ação não pode ser desfeita.' } // ❌ Ruim: Vago { title: 'Atenção', message: 'Você tem certeza?' }Botões com ações claras
html<!-- ✅ Bom: Ação explícita --> <button>Sim, excluir permanentemente</button> <button>Não, manter usuário</button> <!-- ❌ Ruim: Vago --> <button>OK</button> <button>Cancelar</button>Limite o uso de modais
- Use para ações importantes que requerem atenção
- Evite para informações que podem ser inline
- Prefira tooltips para ajuda contextual
Adicione aria-labels
html<button class="modal-close" aria-label="Fechar modal"> <i class="material-icons" aria-hidden="true">close</i> </button>
❌ Não Faça
Não empilhe muitos modais
javascript// ❌ Evite abrir modal sobre modal window.modalAlert({...}); window.modalAlert({...}); // Segundo modalNão use para conteúdo extenso
html<!-- ❌ Modal não é página --> <div class="modal"> <div class="modal-body"> <!-- 10 parágrafos de texto... --> </div> </div>Não force o usuário a ler
javascript// ❌ Não remova a opção de fechar closeOnBackdropClick: false, keyboard: false // Usuário não consegue sair!Não abuse de modais de alerta
javascript// ❌ Muitos alerts irritam o usuário window.modalAlert({ message: 'Campo salvo' }); window.modalAlert({ message: 'Linha adicionada' }); window.modalAlert({ message: 'Dados atualizados' }); // ✅ Use toast para feedbacks rápidos window.showToast({ message: 'Salvo com sucesso' });
Diretrizes de UX
Hierarquia de Informação
- Título: Claro e descritivo (max 60 caracteres)
- Mensagem: Explicação concisa (2-3 linhas)
- Botões: Ação primária à direita
Timing
- Abra modais em resposta a ações do usuário
- Evite modais automáticos ao carregar página
- Não abra múltiplos modais em sequência
Feedback Visual
- Use loading state durante operações
- Feche o modal após sucesso
- Mostre erro dentro do modal, não em novo modal
Exemplo Completo
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Modal - Exemplo</title>
<link rel="stylesheet" href="/css/design-system/design-system.css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head>
<body>
<!-- Botão que abre modal -->
<button class="btn btn-primary" onclick="abrirModal()">
Abrir Modal
</button>
<!-- JavaScript -->
<script src="/css/design-system/components/modal.js"></script>
<script>
function abrirModal() {
window.modalConfirm({
type: 'warning',
title: 'Excluir Registro',
message: 'Tem certeza que deseja excluir este registro? Esta ação não pode ser desfeita.',
confirmText: 'Sim, excluir',
cancelText: 'Cancelar',
onConfirm: () => {
// Simula operação
const loading = window.modalAlert({
type: 'info',
title: 'Excluindo...',
message: 'Por favor aguarde.'
});
loading.setLoading(true);
setTimeout(() => {
loading.hide();
window.modalAlert({
type: 'success',
title: 'Excluído!',
message: 'O registro foi excluído com sucesso.',
confirmText: 'OK'
});
}, 2000);
}
});
}
</script>
</body>
</html>Conclusão
O componente Modal do SIDASP Design System oferece:
- ✅ Modais de alerta com 4 variantes semânticas
- ✅ Layout tradicional e centralizado
- ✅ Helpers JavaScript para uso rápido
- ✅ API completa e flexível
- ✅ Animações suaves
- ✅ Acessibilidade WCAG 2.1 AA
- ✅ Responsividade total
Para mais informações sobre outros componentes, consulte os guias específicos.
Versão: 1.0.0 Última atualização: 2025-10-31 Compatibilidade: Navegadores modernos (Chrome, Firefox, Safari, Edge)