Pular para o conteúdo
Skillpedia
Sites e telas (frontend)280 mil · #57

frontend-a11y

Ajuda seu agente a tornar interfaces web acessíveis para todos. Ele garante que sites e apps funcionem bem com leitores de tela e navegação por teclado.

O que ela faz

Ajuda a tornar sites e aplicativos mais fáceis de usar para todos, especialmente pessoas com deficiência. Garante que botões, formulários e outros elementos funcionem corretamente com leitores de tela e navegação pelo teclado.

Quando usar

  • ✓Ao criar formulários em sites.
  • ✓Ao adicionar botões ou menus interativos.
  • ✓Quando receber avisos sobre acessibilidade no código.

Exemplo do que pedir para a IA

“Como faço para que meu formulário de login seja acessível para pessoas com deficiência visual?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/frontend-a11y/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/frontend-a11y/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

O agente insere códigos específicos (como 'htmlFor', 'aria-label') que ajudam leitores de tela a entender e interagir com os elementos da página. Ele também sugere usar as tags HTML corretas para cada função.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add affaan-m/ECC --skill frontend-a11y

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/frontend-a11y/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Padrões de Acessibilidade para Frontend

Padrões práticos de acessibilidade para React e Next.js. Abrange os problemas mais frequentemente sinalizados em revisões de código: rótulos de formulário ausentes, uso incorreto de ARIA, elementos interativos não semânticos e navegação por teclado quebrada.

Quando Ativar

  • Ao construir ou revisar componentes de formulário (<input>, <select>, <textarea>)
  • Ao criar elementos interativos (modais, dropdowns, tooltips, abas)
  • Ao usar <div> ou <span> com onClick
  • Ao adicionar atributos aria-* a qualquer elemento
  • Ao implementar navegação por teclado ou gerenciamento de foco
  • Ao receber feedback de acessibilidade de ferramentas de revisão de código (CodeRabbit, ESLint a11y)
  • Ao construir componentes que devem dar suporte a leitores de tela

Acessibilidade de Formulários

A falta de pareamento htmlFor / id e mensagens de erro desconectadas são os problemas mais comuns sinalizados em revisões de código.

Conexão de Rótulo

// BAD: label has no connection to input — screen readers cannot associate them
<label>Email</label>
<input type="email" />

// GOOD: htmlFor matches input id
<label htmlFor="email">Email</label>
<input id="email" type="email" />

Campos Obrigatórios

// BAD: visual-only asterisk conveys nothing to screen readers
<label htmlFor="email">Email *</label>
<input id="email" type="email" />

// GOOD: required enables native browser validation; aria-required signals it to screen readers
<label htmlFor="email">
  Email <span aria-hidden="true">*</span>
</label>
<input id="email" type="email" required aria-required="true" />

Mensagens de Erro

// BAD: error text exists visually but is not linked to the input
<input id="email" type="email" />
<span className="error">Invalid email address</span>

// GOOD: aria-describedby connects input to its error message
// aria-invalid signals the invalid state to screen readers
<input
  id="email"
  type="email"
  aria-describedby="email-error"
  aria-invalid={!!error}
/>
{error && (
  <span id="email-error" role="alert">
    {error}
  </span>
)}

Formulário Acessível Completo

interface LoginFormProps {
  onSubmit: (email: string, password: string) => void;
}

export function LoginForm({ onSubmit }: LoginFormProps) {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [errors, setErrors] = useState<{ email?: string; password?: string }>({});

  const handleSubmit = (e: React.FormEvent) => {
    e.preventDefault();
    const newErrors: typeof errors = {};
    if (!email) newErrors.email = 'Email is required';
    if (!password) newErrors.password = 'Password is required';
    if (Object.keys(newErrors).length) {
      setErrors(newErrors);
      return;
    }
    onSubmit(email, password);
  };

  return (
    <form onSubmit={handleSubmit} noValidate>
      <div>
        <label htmlFor="email">
          Email <span aria-hidden="true">*</span>
        </label>
        <input
          id="email"
          type="email"
          value={email}
          onChange={e => setEmail(e.target.value)}
          aria-required="true"
          aria-describedby={errors.email ? 'email-error' : undefined}
          aria-invalid={!!errors.email}
          autoComplete="email"
        />
        {errors.email && (
          <span id="email-error" role="alert">
            {errors.email}
          </span>
        )}
      </div>

      <div>
        <label htmlFor="password">
          Password <span aria-hidden="true">*</span>
        </label>
        <input
          id="password"
          type="password"
          value={password}
          onChange={e => setPassword(e.target.value)}
          aria-required="true"
          aria-describedby={errors.password ? 'password-error' : undefined}
          aria-invalid={!!errors.password}
          autoComplete="current-password"
        />
        {errors.password && (
          <span id="password-error" role="alert">
            {errors.password}
          </span>
        )}
      </div>

      <button type="submit">Log in</button>
    </form>
  );
}

HTML Semântico

Use o elemento que corresponde à intenção. Leitores de tela e usuários de teclado dependem de semânticas nativas.

// BAD: div has no role, no keyboard support, no accessible name
<div onClick={handleClick}>Submit</div>

// GOOD: button is focusable, activates on Enter/Space, announces as "button"
<button type="button" onClick={handleClick}>Submit</button>
// RUIM: navegação não semântica
<div onClick={() => navigate('/home')}>Home</div>


…
Perguntas frequentes

O que são 'leitores de tela'?

São programas que leem o conteúdo da tela em voz alta, ajudando pessoas com deficiência visual a usar computadores e celulares.

Por que usar 'aria-label' ou 'htmlFor'?

Esses códigos conectam rótulos a campos de formulário ou botões, garantindo que os leitores de tela informem o propósito correto do elemento.

Quando devo usar 'div' com 'onClick'?

Geralmente, não se deve. É melhor usar a tag <button> que já vem com funcionalidades de acessibilidade embutidas, como ser clicável pelo teclado.

Detalhes

Descrição original do autor

Accessibility patterns for React and Next.js — semantic HTML, ARIA attributes, form labeling, keyboard navigation, focus management, and screen reader support. Use when building or reviewing forms, modals, dropdowns, tooltips, or tabs, fixing a11y lint or code-review findings, or wiring up keyboard navigation and focus management.

repo: affaan-m/ECC

Popularidade

Estrelas no GitHub
280 mil
Posição no ranking
#57
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas