Pular para o conteúdo principal

Acessibilidade

O Fluid foi projetado com acessibilidade em mente. Seguimos as melhores práticas para garantir que aplicativos construídos com nossa biblioteca sejam utilizáveis por todos, incluindo pessoas com deficiências.

Princípios de Acessibilidade​

A acessibilidade no Fluid é guiada pelos seguintes princípios:

  1. Perceptível: A informação e os componentes da interface devem ser apresentáveis aos usuários de maneiras que eles possam perceber.
  2. Operável: Os componentes da interface e a navegação devem ser operáveis.
  3. Compreensível: A informação e a operação da interface devem ser compreensíveis.
  4. Robusto: O conteúdo deve ser robusto o suficiente para ser interpretado por uma ampla variedade de agentes de usuário, incluindo tecnologias assistivas.

Recursos de Acessibilidade Nativos​

O Fluid utiliza os recursos de acessibilidade nativos fornecidos pelo React Native:

iOS (VoiceOver)​

VoiceOver é o leitor de tela integrado do iOS que permite que usuários cegos ou com deficiência visual naveguem pelo aplicativo.

Android (TalkBack)​

TalkBack é o leitor de tela do Google para dispositivos Android, permitindo feedback audível para usuários com deficiência visual.

Propriedades de Acessibilidade Suportadas​

Todos os componentes do Fluid suportam as seguintes propriedades de acessibilidade:

accessible​

Indica se o elemento deve ser considerado um elemento de acessibilidade.

<Button 
label="Enviar"
accessible={true}
onPress={() => {}}
/>

accessibilityLabel​

Uma string descritiva que é lida pelo leitor de tela quando o usuário interage com o elemento.

<Button 
label="Enviar"
accessibilityLabel="Botão para enviar o formulário"
onPress={() => {}}
/>

accessibilityHint​

Uma dica para ajudar usuários a entender o que acontecerá quando eles interagirem com o elemento.

<Button 
label="Enviar"
accessibilityHint="Toque duas vezes para enviar o formulário"
onPress={() => {}}
/>

accessibilityRole​

Define o papel do elemento para tecnologias assistivas. Os papéis disponíveis incluem:

  • button
  • link
  • header
  • search
  • image
  • text
  • none
  • ... e outros
<TouchableOpacity 
accessibilityRole="button"
onPress={() => {}}
>
<Text>Exemplo</Text>
</TouchableOpacity>

accessibilityState​

Descreve o estado atual do componente para tecnologias assistivas, como:

  • disabled: indica se o componente está desabilitado
  • selected: indica se o componente está selecionado
  • checked: indica se o componente está marcado (para checkboxes)
  • busy: indica se o componente está ocupado
  • expanded: indica se o componente está expandido
<Button 
label="Enviar"
accessibilityState={{ disabled: isDisabled, busy: isLoading }}
onPress={() => {}}
/>

Implementação em Componentes Fluid​

Botões​

Todos os botões no Fluid são automaticamente configurados com:

  • accessibilityRole="button"
  • accessible={true}
  • accessibilityLabel derivado do prop label
<Button 
label="Enviar"
// Já configurado automaticamente para acessibilidade
onPress={() => {}}
/>

Campos de Entrada​

Os campos de entrada são configurados com:

  • accessibilityRole="none" (para o container)
  • Rótulos associados corretamente
  • Estados acessíveis (erro, desabilitado)
<TextInput
label="Email"
error={emailError}
// Estados de acessibilidade são gerenciados automaticamente
/>

Ícones​

Ícones que são interativos têm:

  • accessibilityRole="button"
  • Necessitam de um accessibilityLabel explícito
<Icon 
name="star"
accessibilityLabel="Adicionar aos favoritos"
onPress={() => {}}
/>

Para aplicativos web, suportamos navegação por teclado:

  • tabIndex para controlar a ordem de foco
  • Feedback visual para o estado de foco em todos os elementos interativos
  • Suporte a teclas de atalho onde apropriado

Testes de Acessibilidade​

É importante testar seu aplicativo com recursos de acessibilidade ativados:

Teste Manual​

  1. Ative VoiceOver (iOS) ou TalkBack (Android)
  2. Navegue pelo seu aplicativo usando gestos de acessibilidade
  3. Verifique se todos os elementos são anunciados corretamente
  4. Verifique se a ordem de navegação faz sentido

Ferramentas de Teste Automatizado​

Ao usar Detox ou outras ferramentas de teste, você pode testar acessibilidade automaticamente:

it('should have correct accessibility labels', async () => {
await expect(element(by.label('Botão para enviar o formulário'))).toBeVisible();
});

Melhores Práticas​

Contraste de Cores​

Certifique-se de que as cores em seu aplicativo tenham contraste suficiente:

  • Texto regular: relação de contraste mínima de 4.5:1
  • Texto grande ou elementos de interface: relação de contraste mínima de 3:1

O Fluid fornece utilitários para verificar relações de contraste:

import { isAccessibleColor } from '@platformbuilders/fluid-react-native';

// Verifica se o contraste entre duas cores é acessível
const isAccessible = isAccessibleColor('#000000', '#FFFFFF'); // true

Tamanho de Texto​

Permita que os usuários redimensionem o texto. O Fluid suporta:

  • Respeitar as configurações de tamanho de texto do sistema
  • Unidades de texto responsivas
<Text 
allowFontScaling={true}
style={{ fontSize: theme.typography.fontSize.md }}
>
Texto escalável
</Text>

Áreas de Toque​

Certifique-se de que elementos tocáveis tenham uma área de toque adequada:

  • Mínimo de 44x44 pontos para elementos interativos
  • Espaçamento adequado entre elementos tocáveis
<TouchableOpacity 
style={{
minWidth: 44,
minHeight: 44,
margin: theme.spacing.sm // Espaçamento adequado
}}
onPress={() => {}}
>
<Text>Toque Aqui</Text>
</TouchableOpacity>

Feedback para Ações​

Forneça feedback para as ações do usuário:

  • Feedback visual
  • Feedback tátil (quando disponível)
  • Feedback auditivo (quando apropriado)

Gestos Simples​

Evite gestos complexos que seriam difíceis para pessoas com deficiências motoras:

  • Prefira toques simples em vez de gestos complexos
  • Quando necessário, ofereça alternativas para gestos complexos

Exemplos Práticos​

Formulário Acessível​

Exemplo de um formulário com considerações de acessibilidade:

import React, { useState } from 'react';
import { View } from 'react-native';
import { TextInput, Button, Text } from '@platformbuilders/fluid-react-native';

const AccessibleForm = () => {
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');

return (
<View
accessibilityRole="form"
accessibilityLabel="Formulário de login"
style={{ padding: 16 }}
>
<Text
variant="heading"
accessibilityRole="header"
style={{ marginBottom: 16 }}
>
Login
</Text>

<TextInput
label="Email"
value={email}
onChangeText={setEmail}
keyboardType="email-address"
autoCapitalize="none"
accessibilityHint="Digite seu endereço de email"
style={{ marginBottom: 12 }}
/>

<TextInput
label="Senha"
value={password}
onChangeText={setPassword}
secureTextEntry
accessibilityHint="Digite sua senha"
style={{ marginBottom: 20 }}
/>

<Button
label="Entrar"
onPress={() => {}}
accessibilityHint="Toque duas vezes para fazer login"
/>
</View>
);
};

export default AccessibleForm;

Lista Acessível​

Exemplo de lista com itens acessíveis:

import React from 'react';
import { FlatList, View } from 'react-native';
import { Text, TouchableRipple } from '@platformbuilders/fluid-react-native';

const data = [
{ id: '1', title: 'Item 1', description: 'Descrição do item 1' },
{ id: '2', title: 'Item 2', description: 'Descrição do item 2' },
{ id: '3', title: 'Item 3', description: 'Descrição do item 3' },
];

const AccessibleList = () => {
return (
<FlatList
data={data}
keyExtractor={item => item.id}
renderItem={({ item }) => (
<TouchableRipple
onPress={() => {}}
accessibilityRole="button"
accessibilityLabel={item.title}
accessibilityHint={`Toque duas vezes para abrir ${item.title}`}
>
<View style={{ padding: 16 }}>
<Text
variant="subtitle"
accessibilityRole="header"
>
{item.title}
</Text>
<Text
variant="body"
accessibilityRole="text"
>
{item.description}
</Text>
</View>
</TouchableRipple>
)}
accessibilityLabel="Lista de itens"
/>
);
};

export default AccessibleList;

Checklist de Acessibilidade​

Use esta checklist para verificar a acessibilidade do seu aplicativo:

  • Todos os elementos interativos têm accessibilityLabel descritivo
  • Estados dos componentes são comunicados corretamente (accessibilityState)
  • O contraste de cores está adequado para todos os textos e elementos da interface
  • O aplicativo pode ser navegado completamente usando VoiceOver/TalkBack
  • Áreas tocáveis têm tamanho adequado (mínimo 44x44 pontos)
  • Texto pode ser redimensionado de acordo com as preferências do usuário
  • Gestos complexos têm alternativas simples
  • Formulários e campos de entrada têm rótulos e instruções claras
  • Feedback é fornecido para as ações do usuário
  • Ordem de foco de navegação é lógica e intuitiva

Recursos e Referências​