Framework de Componentes Acessíveis (Angular 19+)

Esta biblioteca oferece uma coleção de componentes web acessíveis desenvolvidos com Angular, com o objetivo de tornar a web mais inclusiva e utilizável para todas as pessoas.

Seguindo as diretrizes da WCAG 2.1 e 2.2, todos os componentes foram projetados para garantir:

  • ✅ Navegação total por teclado
  • ✅ Compatibilidade com leitores de tela
  • ✅ Contraste visual adequado e foco visível
  • ✅ Uso correto de semântica HTML e atributos aria

O uso desses componentes reduz a complexidade técnica e promove o cumprimento da Lei Brasileira de Inclusão (LBI), incentivando a responsabilidade digital e a inclusão real no desenvolvimento web.

🧩 Componentes disponíveis:

  • <accessible-button> – Botão acessível com foco visível e navegação por teclado. Estilização personalizável.
  • <accessible-input> – Campo de entrada com rótulo visível para leitores de tela e validação com ARIA.
  • <lib-modal> – Modal com foco preso, leitura assistiva e fechamento via tecla Esc.
  • <accessible-table> – Tabela semântica com cabeçalhos, legenda e leitura por leitores de tela.
  • <accessible-select> – Seleção personalizada com suporte a teclado, leitores de tela e rótulo descritivo.
  • <accessible-alert-list> – Lista de alertas com região ARIA live e leitura instantanea ao notificar por leitores de tela.
  • <accessible-collapse> – Painel colapsável acessível com expansão via teclado.
  • <accessible-dropdown> – Menu dropdown acessível com foco gerenciado e leitura por tecnologias assistivas.
  • <lib-responsive-image> – Imagem responsiva com alt e aria-describedby para contexto adicional.

🖱️ Componente de Botão Acessível

O componente <accessible-button> é um botão acessível com suporte completo à navegação por teclado, foco visível e leitura correta por tecnologias assistivas. Ideal para ações com acessibilidade garantida.

🔧 Parâmetros:

ParâmetroTipoDescrição
labelstringTexto visível exibido no botão
ariaLabelstringDescrição alternativa para leitores de tela
classNamestringDefine a estilização do botão

🎯 Evento:

  • (onClick): emitido quando o botão é clicado.

📦 Exemplo de uso:

    <accessible-button
      className="btn-azul"
      label="Clique Aqui"
      ariaLabel="Botão de Clique"
      (onClick)="handleButtonClick()">
    </accessible-button>
  

🛡️ Acessibilidade garantida:

  • Navegação total via teclado (tab, enter, espaço)
  • Compatível com leitores de tela
  • Foco visível para melhor usabilidade
  • Semântica de botão respeitada

🎨 Personalização de Cor no <accessible-button>

O componente <accessible-button> permite alterar dinamicamente sua cor por meio de classes personalizadas. Isso garante flexibilidade visual sem comprometer a acessibilidade.

As classes/cores disponiveís são: btn-verde, btn-roxo, btn-azul, btn-vermelho, btn-laranja, btn-cinza.


✅ Objetivo

Permitir que o botão tenha estilização customizada, mantendo conformidade com as diretrizes de acessibilidade (WCAG 2.1 – contraste mínimo 4.5:1).


🧩 Como Usar

1. Passe a classe desejada via atributo className no seu html:

<accessible-button
  label="Salvar"
  ariaLabel="Botão de Salvar"
  className="btn-vermelho"
  (onClick)="salvar()">
</accessible-button>

✅ Todas essas cores possuem contraste ≥ 4.5:1 com o texto branco, garantindo acessibilidade.

♿ Por que isso é importante?

Manter o contraste adequado entre o texto e o fundo melhora a legibilidade para:

  • Pessoas com baixa visão
  • Usuários em ambientes com muito brilho
  • Pessoas com daltonismo

📏 Baseado nas diretrizes:

WCAG 2.1 – Critério 1.4.3: Contraste Mínimo
Contraste mínimo recomendado: 4.5:1 para texto normal.

Com essa abordagem, você garante personalização visual + acessibilidade de verdade! ✅

⌨️ Componente de Input Acessível

O componente <accessible-input> é um campo de entrada de texto com suporte completo a acessibilidade: foco visível, rótulo interpretável por leitores de tela (aria-label), contraste adequado e mensagens de erro.

🔧 Parâmetros:

ParâmetroTipoDescrição
labelstringTexto descritivo exibido ou lido pelo leitor de tela
typestringTipo do input
aria-requiredbooleanIndica que o campo é obrigatório
ariaLabelstringTexto alternativo lido por tecnologias assistivas
idstringIdentificador único do campo
placeholderstringTexto exibido como dica no campo
[(modelValue)]anyLigação bidirecional com a propriedade no componente

📦 Exemplo de uso:

    <accessible-input
      [(modelValue)]="user.name"
      type ="name"
      id="nome"
      label="Nome completo"
      ariaLabel="Nome completo"
      placeholder="Digite seu nome"
      aria-required="true">
    </accessible-input>
    <span *ngIf="user.name === ''" id="erro" class="erro">Campo obrigatório</span>
  
Campo obrigatório

🛡️ Acessibilidade garantida:

  • Compatível com leitores de tela
  • Associação correta entre label e input
  • Foco visível e suporte a navegação por teclado

📊 Componente de Tabela Acessível

O componente <accessible-table> apresenta dados tabulares de forma acessível, utilizando marcação semântica adequada, legenda descritiva e suporte a tecnologias assistivas como leitores de tela.

🔧 Parâmetros:

ParâmetroTipoDescrição
captionstringTexto descritivo que serve como legenda da tabela
headersstring[]Lista com os rótulos dos cabeçalhos de coluna
dataany[][]Matriz com os dados da tabela (linhas e colunas)

📦 Exemplo de uso:

Html

    <accessible-table
      [caption]="'Lista de Usuários'"
      [headers]="headers"
      [data]="tableData">
    </accessible-table>
  

Typescript

    headers = ['Nome', 'Email', 'Status'];
    tableData = [
      ['João Silva', 'joao@email.com', 'Ativo'],
      ['Maria Souza', 'maria@email.com', 'Inativo'],
      ['Carlos Lima', 'carlos@email.com', 'Ativo']
    ];
  
Lista de Usuários
Nome Email Status
João Silva joao@email.com Ativo
Maria Souza maria@email.com Inativo
Carlos Lima carlos@email.com Ativo

🛡️ Acessibilidade garantida:

  • Leitura clara por leitores de tela com marcação de cabeçalhos
  • Legenda interpretável via <caption>
  • Navegável por teclado

✅ Componente de Seleção Acessível

O componente <accessible-select> oferece uma interface acessível para seleção de opções, garantindo foco visível, semântica apropriada e compatibilidade com leitores de tela via atributos ARIA.

🔧 Parâmetros:

ParâmetroTipoDescrição
labelstringRótulo visível e descritivo para o campo de seleção
idstringIdentificador único do campo (usado para vínculo com o label)
optionsstring[]Lista de opções disponíveis para escolha
selectedstringValor atualmente selecionado

📤 Eventos emitidos:

EventoDescrição
(selected)Emitido ao alterar a seleção no campo

📦 Exemplo de uso:

Html

    <accessible-select 
      [label]="'Status do usuário'"
      [id]="'status-select'"
      [options]="statusOptions"
      [(selected)]="selectStatus">
    </accessible-select>
  

Typescript

    statusOptions = [
      { label: 'Ativo', value: 'Ativo' },
      { label: 'Inativo', value: 'Inativo' },
      { label: 'Pendente', value: 'Pendente' }
    ];
  

Status selecionado:

🛡️ Acessibilidade garantida:

  • Compatível com leitores de tela
  • Suporte completo à navegação por teclado
  • Foco visível e consistente para acessibilidade visual
  • Atualização bidirecional do valor selecionado

🚨 Componente de Lista de Alertas Acessível

O componente <accessible-alert-list> exibe uma lista dinâmica de mensagens de alerta, utilizando ARIA live regions para leitura automática por leitores de tela, garantindo acessibilidade em notificações em tempo real.

🔧 Parâmetros:

ParâmetroTipoDescrição
messagesstring[]Lista de mensagens de alerta exibidas

📤 Eventos emitidos:

EventoDescrição
(dismiss)Emitido quando o usuário remove um alerta da lista

📦 Exemplo de uso:

Html

    <accessible-alert-list
      [messages]="alerts"
      (dismiss)="removeAlert($event)">
    </accessible-alert-list>
  

Ou

    <warning-alert-list
      [messages]="alerts"
      (dismiss)="removeAlert($event)">
    </warning-alert-list>
  

Typescript

    alerts = [
      { id: 1, text: 'Bem-vindo!', ativo: true }
    ];
  

🛡️ Acessibilidade garantida:

  • Suporte a listas dinâmicas com atualizações em tempo real
  • Notificações lidas automaticamente por leitores de tela
  • Compatível com interação via teclado e dispositivos assistivos

📂 Componente Collapse Acessível

O componente <accessible-collapse> permite esconder e revelar conteúdo de forma acessível, com suporte completo à navegação por teclado e leitura correta por tecnologias assistivas como leitores de tela.

🔧 Parâmetros:

ParâmetroTipoDescrição
titulostringTexto visível no cabeçalho do componente

📦 Exemplo de uso:

  <accessible-collapse titulo="Clique para expandir">
    <p>Este é o conteúdo colapsável. Pode conter texto, listas, imagens, etc.</p>
  </accessible-collapse>

🛡️ Acessibilidade garantida:

  • Compatível com leitores de tela
  • Controle completo por teclado
  • Uso de aria-expanded e aria-controls para indicar o estado

🖼️ Componente de Imagem Acessível

O componente <lib-accessible-image> exibe uma imagem de forma responsiva e acessível, garantindo compatibilidade com leitores de tela e boa usabilidade em dispositivos móveis.

🔧 Parâmetros:

ParâmetroTipoDescrição
srcstringCaminho da imagem
altstringTexto alternativo (acessibilidade)
maxWidthstringLargura máxima (ex: "400px", "100%")
showCaptionbooleanExibe o alt como legenda visível
roundedbooleanAplica bordas arredondadas e borda fina

📦 Exemplo de uso:

    <lib-responsive-image
      src="imgs/exemplo.png"
      alt="Descrição da imagem"
      aria-describedby="Descrição detalhada quando necessário."
      maxWidth="500px"
      [rounded]="true">
    </lib-responsive-image>
  
Exemplo imagem responsiva

🛡️ Acessibilidade garantida:

  • Leitura correta por leitores de tela
  • Carregamento otimizado
  • Responsividade garantida para diferentes tamanhos de tela

⚙️ Instalação e Uso da Biblioteca

📥 1. Como instalar

Para adicionar a biblioteca do Framework Acessível ao seu projeto Angular, execute o comando abaixo no terminal:

    
    npm install framework-acessivel
  

📦 2. Importar o módulo

Importe o módulo do componente necessário no seu AppComponent ou outro component desejado:

Importação do módulo no Angular

🧩 3. Usando os componentes

Com o módulo importado, você pode utilizar os componentes diretamente nos templates Angular. Basta configurar os inputs e outputs conforme necessário. Veja um exemplo de uso com o Botão Acessível:

Exemplo de uso do Botão Acessível