Skip to content
Extensões

Guia Completo: Modal / Dialog

Índice

  1. Introdução
  2. Modal de Alerta
  3. Modal Padrão
  4. Modal de Confirmação
  5. Tamanhos
  6. Variantes de Alerta
  7. JavaScript API
  8. Helpers Rápidos
  9. Eventos
  10. Acessibilidade
  11. 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

Modais centralizados com ícone, ideal para alertas e notificações.

Estrutura Básica

html
<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

html
<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 tradicional com header, body e footer separados.

html
<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 otimizado para confirmações com dois botões lado a lado.

html
<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:

html
<!-- 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

ClasseLargura MáximaUso Recomendado
.modal-sm400pxAlertas simples
.modal-md500pxUso geral (padrão)
.modal-lg700pxFormulários grandes
.modal-xl900pxConteúdo extenso
.modal-fullscreen100%Aplicações, editores

Variantes de Alerta

Quatro tipos semânticos de alerta:

1. Padrão / Info (Azul)

html
<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)

html
<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)

html
<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)

html
<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

TipoBackground ÍconeCor ÍconeÍcone PadrãoUso
Info#EEF3FF#3F68FBinfoInformações gerais
Success#E8F5EE#47B881check_circleConfirmações positivas
Warning#FEF3E2#F59E0BwarningAvisos e atenções
Error#FEE2E2#DC2626errorErros e problemas

JavaScript API

Inicialização Manual

javascript
// 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

javascript
{
  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

javascript
// 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

Cria e exibe um modal de alerta rapidamente:

javascript
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!');
  }
});

Cria e exibe um modal de confirmação:

javascript
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

javascript
// 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

javascript
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

html
<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>
TeclaAção
TabNavega entre elementos focáveis
Shift + TabNavega para trás
EscapeFecha o modal
EnterAtiva 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):

ElementoContrasteStatus
Título13.2:1✅ AAA
Texto6.8:1✅ AA
Ícones7.1:1✅ AA
Botões4.5:1+✅ AA

Boas Práticas

✅ Faça

  1. 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' });
  2. 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?'
    }
  3. 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>
  4. 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
  5. 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

  1. Não empilhe muitos modais

    javascript
    // ❌ Evite abrir modal sobre modal
    window.modalAlert({...});
    window.modalAlert({...}); // Segundo modal
  2. Nã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>
  3. 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!
  4. 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

  1. 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
  2. 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
  3. 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

html
<!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)

Design System interno do GALES