10. Acessibilidade (a11y)
A acessibilidade é um aspecto fundamental do nosso processo de desenvolvimento, garantindo que nossos produtos sejam utilizáveis por pessoas com diversas habilidades e necessidades. Esta seção fornece diretrizes detalhadas para implementar e gerenciar a acessibilidade em nossos projetos, tanto para o frontend em Next.js quanto para as partes que ainda utilizam Laravel Blade.
10.1. Diretrizes de acessibilidade web (WCAG)
Nosso objetivo é atingir o nível AA das Diretrizes de Acessibilidade para Conteúdo Web (WCAG) 2.1. Aqui estão os principais pontos a serem considerados:
10.1.1. Perceptível
-
Alternativas em texto:
- Forneça texto alternativo para todas as imagens.
// Next.js <Image src="/logo.png" alt="Logo da empresa" width={300} height={100} /> // Laravel Blade <img src="{{ asset('images/logo.png') }}" alt="Logo da empresa"> -
Mídia baseada em tempo:
- Forneça legendas para todos os conteúdos de áudio pré-gravados.
- Forneça audiodescrição ou mídia alternativa para vídeo pré-gravado.
-
Adaptável:
- Crie layouts que funcionem em diferentes orientações e tamanhos de tela.
- Use marcação semântica apropriada.
// Next.js <main> <h1>Título Principal</h1> <section> <h2>Seção 1</h2> <p>Conteúdo da seção 1</p> </section> </main> // Laravel Blade <main> <h1>{{ __('main_title') }}</h1> <section> <h2>{{ __('section1_title') }}</h2> <p>{{ __('section1_content') }}</p> </section> </main> -
Distinguível:
- Use uma relação de contraste de pelo menos 4.5:1 para texto normal e 3:1 para texto grande.
- Não use apenas cor para transmitir informações.
/* Exemplo de cores acessíveis */ .text-primary { color: #2060a0; /* Azul escuro com bom contraste em fundo branco */ } .bg-secondary { background-color: #f0f0f0; /* Cinza claro para fundos */ }
10.1.2. Operável
-
Acessível por teclado:
-
Todas as funcionalidades devem ser acionadas via teclado, a menos que a funcionalidade não possibilite o controle apenas por teclado.
-
Com o correto uso semântico do HTML a maioria dos elementos de interação como
<button>e<a>devem por padrão estarem acessíveis via teclado. No entanto, é importante testar a navegação e interação com o site apenas utilizando o teclado, pois alguns elementos podem não estar acessíveis. -
Algumas vezes com as manipulaçãoes fazemos com que o estado de acessibilidade seja alterado para casos específicos, manipulando o tabindex, por exemplo, tabindex="0" para tornar um elemento acessível por teclado e tabindex="0" para tornar inacessível.
// Next.js <button onKeyDown={handleKeyDown} onClick={handleClick}> Ação </button> // Laravel Blade <button onclick="handleClick()" onkeydown="if(event.key==='Enter')handleClick()" > {{ __('action_button') }} </button> -
-
Tempo suficiente:
- Forneça aos usuários tempo suficiente para ler e usar o conteúdo, como por exemplo em toasts.
-
Ordem do foco:
- A interação por elementos focáveis na tela sempre deverá ser sequencial e lógica de acordo com o conteúdo apresentado. Geralmente de cima para baixo e da esquerda para a direita. A ordem do foco deve ser lógica e previsível.
-
Foco visível:
- Ao se interagir por teclado, qualquer pessoa deve conseguir identificar qual é a sua localização espacial na tela através de um foco (visível) identificador de sua localização.
-
Navegável:
- Forneça aos usuários tempo suficiente para ler e usar o conteúdo. Como por exemplo 5 segundos para toasts pequenos. Em casos de toasts maiores, como um modal, o tempo pode ser maior, mas sempre deve ser possível fechar o modal.
// Next.js import Link from 'next/link' <nav aria-label="Navegação principal"> <Link href="/" aria-current={isHomePage ? 'page' : undefined}> Início </Link> {/* Outros links de navegação */} </nav> // Laravel Blade <nav aria-label="Navegação principal"> <a href="{{ route('home') }}" @if(Route::currentRouteName() == 'home') aria-current="page" @endif> {{ __('nav.home') }} </a> {{-- Outros links de navegação --}} </nav> -
Página com título:
- Todas as telas devem ter um título principal (
<h1>) e que descreva claramente a sua finalidade.
- Todas as telas devem ter um título principal (
-
Finalidade do link (em contexto):
-
A finalidade de um link deve ser determinada a partir do texto do próprio link ou a partir do contexto no entorno deste link.
-
Hint: o critério também é aplicável em botões ou ícones clicáveis.
-
-
Idioma da página:
- Declarar adequadamente o idioma da tela faz com que leitores de telas utilizem uma entonação correta para citar conteúdos. Sempre os declare.
-
Identificação do erro:
- Sempre que uma mensagem de erro for exibida, ela deve identificar claramente qual é o elemento que gerou o erro de forma visual e audível (exemplo: mudança de cor no elemento + um ícone de alerta + uma mensagem em texto).
-
Prevenção de Erros:
- Implemente verificações e confirmações para ações importantes.
- Para mais informações é possível consultar o guia oficial da W3C:
- Também existe uma versão brasileira com cards explicativos:
10.1.3. Compreensível
-
Legível:
- Use linguagem clara e simples.
- Identifique o idioma da página e das partes em idiomas diferentes.
// Next.js <html lang={locale}> {/* Conteúdo da página */} </html> // Laravel Blade <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> {{-- Conteúdo da página --}} </html> -
Previsível:
- Faça com que as páginas apareçam e operem de maneira previsível.
-
Assistência de entrada:
- Ajude os usuários a evitar e corrigir erros.
// Next.js <form onSubmit={handleSubmit}> <label htmlFor="email">Email:</label> <input type="email" id="email" required aria-describedby="email-error" /> <span id="email-error" aria-live="polite"> {emailError} </span> </form> // Laravel Blade <form method="POST" action="{{ route('submit') }}"> @csrf <label for="email">{{ __('Email') }}:</label> <input type="email" id="email" name="email" required aria-describedby="email-error" > @error('email') <span id="email-error" aria-live="polite">{{ $message }}</span> @enderror </form>
10.1.4. Robusto
-
Compatível:
- Maximize a compatibilidade com user agents atuais e futuros, incluindo tecnologias assistivas.
// Next.js <div role="alert" aria-live="assertive"> {errorMessage} </div> // Laravel Blade <div role="alert" aria-live="assertive"> {{ $errorMessage }} </div>
10.2. Testes de acessibilidade
Implementar testes regulares de acessibilidade é crucial para manter um alto padrão de acessibilidade.
-
Testes automatizados:
- Use ferramentas como axe-core para testes automatizados.
// Exemplo de teste com Jest e axe-core import { axe } from 'jest-axe' test('renders accessible home page', async () => { const { container } = render(<HomePage />) const results = await axe(container) expect(results).toHaveNoViolations() }) -
Testes manuais:
- Realize testes de navegação por teclado.
- Teste com leitores de tela como NVDA ou VoiceOver.
-
Testes de usuário:
- Conduza testes com usuários que dependem de tecnologias assistivas.
10.3. Tecnologias assistivas
Garanta que nossos produtos funcionem bem com várias tecnologias assistivas:
-
Leitores de tela:
- Use ARIA (Accessible Rich Internet Applications) quando necessário.
<button aria-pressed={isActive} onClick={toggleActive}> {isActive ? 'Ativo' : 'Inativo'} </button> -
Navegação por teclado:
- Implemente ordem de foco lógica.
- Use
tabindexapropriadamente.
<div tabIndex="0" role="button" onKeyDown={handleKeyDown} onClick={handleClick}> Elemento interativo </div> -
Ampliadores de tela:
- Garanta que o layout seja responsivo e funcione bem em diferentes níveis de zoom.
10.4. Design inclusivo
Adote princípios de design inclusivo em todo o processo de desenvolvimento:
-
Flexibilidade:
- Permita personalização de tamanho de texto e contraste.
body { font-size: 16px; } @media (prefers-color-scheme: dark) { body { background-color: #333; color: #fff; } } -
Simplicidade:
- Mantenha interfaces simples e intuitivas.
-
Consistência:
- Mantenha padrões consistentes em toda a aplicação.
-
Feedback claro:
- Forneça feedback claro para todas as ações do usuário.
function SubmitButton({ isLoading, children }) { return ( <button disabled={isLoading}> {isLoading ? 'Enviando...' : children} </button> ) }
Diretrizes adicionais:
-
Treinamento:
- Forneça treinamento regular sobre acessibilidade para toda a equipe de desenvolvimento.
-
Documentação:
- Mantenha uma documentação atualizada das práticas de acessibilidade.
-
Revisão de código:
- Inclua verificações de acessibilidade nas revisões de código.
-
Ferramentas de desenvolvimento:
- Use extensões de navegador como WAVE ou axe para verificações rápidas durante o desenvolvimento.
Responsabilidades do líder de acessibilidade:
- Manter e atualizar as diretrizes de acessibilidade.
- Revisar e aprovar a implementação de recursos de acessibilidade.
- Conduzir auditorias regulares de acessibilidade em todos os projetos.
- Treinar a equipe em práticas de acessibilidade.
- Manter-se atualizado sobre as últimas tendências e requisitos de acessibilidade.
- Servir como ponto de contato para questões de acessibilidade.
- Colaborar com designers para garantir que os designs sejam acessíveis desde o início.
Processo de garantia de acessibilidade:
- Planejamento: Incluir requisitos de acessibilidade em todas as especificações de recursos.
- Desenvolvimento: Implementar recursos com acessibilidade em mente desde o início.
- Testes: Realizar testes de acessibilidade automatizados e manuais para cada nova funcionalidade.
- Revisão: O líder de acessibilidade revisa e aprova a implementação antes do merge.
- Monitoramento contínuo: Usar ferramentas de monitoramento de acessibilidade em produção.