Claude Code Plugins

Community-maintained marketplace

Feedback

accessibility-checker

@LionGab/NossaMaternidade-2
1
0

Valida acessibilidade WCAG AAA para o projeto Nossa Maternidade. Verifica touch targets minimo 44pt, contraste 7:1, accessibilityLabel em todos elementos interativos. Use ao criar componentes de UI, revisar telas, ou validar acessibilidade.

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name accessibility-checker
description Valida acessibilidade WCAG AAA para o projeto Nossa Maternidade. Verifica touch targets minimo 44pt, contraste 7:1, accessibilityLabel em todos elementos interativos. Use ao criar componentes de UI, revisar telas, ou validar acessibilidade.
allowed-tools Read, Grep, Glob

Accessibility Checker (WCAG AAA)

Proposito

Garantir que o app Nossa Maternidade seja acessivel para todas as maes, incluindo aquelas com deficiencias visuais ou motoras.

Padroes WCAG AAA

1. Touch Targets - Minimo 44pt (iOS) / 48dp (Android)

// ❌ ERRADO - muito pequeno
<TouchableOpacity style={{ width: 30, height: 30 }}>

// ✅ CORRETO - tamanho minimo
import { Tokens } from '@/theme/tokens';
<TouchableOpacity
  style={{
    minWidth: Tokens.touchTargets.min,  // 44
    minHeight: Tokens.touchTargets.min, // 44
  }}
>

Token disponivel: Tokens.touchTargets.min = 44

2. Contraste de Cores - 7:1 (Nivel AAA)

Tipo de Texto Contraste Minimo
Texto normal 7:1 (AAA)
Texto grande (18pt+) 4.5:1 (AAA)
Icones/graficos 3:1

Cores do tema ja sao WCAG AAA compliant:

  • text.primary sobre background.canvas = 15.8:1 ✅
  • text.secondary sobre background.card = 8.6:1 ✅
  • text.tertiary sobre fundos = 8.6:1 ✅

3. Accessibility Labels - OBRIGATORIO em Interativos

// ❌ ERRADO - sem label
<TouchableOpacity onPress={handleLike}>
  <HeartIcon />
</TouchableOpacity>

// ✅ CORRETO - com labels
<TouchableOpacity
  onPress={handleLike}
  accessibilityLabel="Curtir publicacao"
  accessibilityRole="button"
  accessibilityHint="Toque duas vezes para curtir"
>
  <HeartIcon />
</TouchableOpacity>

4. Accessibility Roles

// Roles comuns:
accessibilityRole = 'button'; // Botoes
accessibilityRole = 'link'; // Links
accessibilityRole = 'image'; // Imagens
accessibilityRole = 'text'; // Texto simples
accessibilityRole = 'header'; // Titulos de secao
accessibilityRole = 'search'; // Campo de busca
accessibilityRole = 'tab'; // Abas
accessibilityRole = 'checkbox'; // Checkboxes
accessibilityRole = 'switch'; // Toggles

5. Accessibility State

<TouchableOpacity
  accessibilityState={{
    selected: isSelected,
    disabled: isDisabled,
    checked: isChecked,
    expanded: isExpanded,
  }}
>

6. Imagens Decorativas vs Informativas

// Decorativa - esconder do screen reader
<Image
  source={decorativeImage}
  accessibilityElementsHidden={true}
  importantForAccessibility="no-hide-descendants"
/>

// Informativa - descrever
<Image
  source={chartImage}
  accessibilityLabel="Grafico mostrando aumento de 20% no bem-estar"
/>

Checklist de Acessibilidade

Touch Targets

  • Todos os botoes tem minimo 44x44pt
  • Areas de toque nao sobrepoem
  • Espacamento adequado entre elementos clicaveis

Labels e Roles

  • Todos elementos interativos tem accessibilityLabel
  • accessibilityRole definido corretamente
  • accessibilityHint para acoes complexas

Contraste

  • Texto sobre fundos tem contraste 7:1+
  • Icones tem contraste 3:1+
  • Funciona em light e dark mode

Navegacao

  • Ordem logica de foco (tab order)
  • Headings marcados com accessibilityRole="header"
  • Conteudo agrupado logicamente

Estados

  • Estados disabled comunicados
  • Estados selected/checked comunicados
  • Feedback de erro acessivel

Patterns a Detectar com Grep

# TouchableOpacity sem accessibilityLabel
grep -r "TouchableOpacity" --include="*.tsx" | grep -v "accessibilityLabel"

# Pressable sem accessibilityLabel
grep -r "Pressable" --include="*.tsx" | grep -v "accessibilityLabel"

# Button sem accessibilityLabel
grep -r "<Button" --include="*.tsx" | grep -v "accessibilityLabel"

# width/height menores que 44
grep -rE "(width|height):\s*[1-3][0-9]" --include="*.tsx"

Ferramentas de Teste

iOS

  • VoiceOver: Settings > Accessibility > VoiceOver
  • Accessibility Inspector (Xcode)

Android

  • TalkBack: Settings > Accessibility > TalkBack
  • Accessibility Scanner app

Comandos do Projeto

# Rodar lint de acessibilidade
npm run lint -- --rule react-native-a11y/has-accessibility-props:error

Tokens de Acessibilidade

import { Tokens } from '@/theme/tokens';

// Touch targets
Tokens.touchTargets.min; // 44 (minimo WCAG)
Tokens.touchTargets.medium; // 44
Tokens.touchTargets.large; // 56
Tokens.touchTargets.xl; // 64

// Emoji sizes (garantir legibilidade)
Tokens.emojiSizes.lg; // 44 (WCAG compliant)

Severidade de Violacoes

Violacao Severidade Impacto
Sem accessibilityLabel Alta Usuario nao sabe o que e
Touch target < 44pt Alta Dificil de tocar
Contraste < 4.5:1 Alta Texto ilegivel
Sem accessibilityRole Media Contexto perdido
Imagem sem alt Media Conteudo perdido
Ordem de foco errada Baixa Navegacao confusa