Ação de desfazer: Contrato de acessibilidade
Define uma funcionalidade de desfazer que seja perceptível sem roubar o foco, operável por teclado e tecnologia assistiva, e verdadeira sobre a ação reversível e seu prazo de validade.
Status do pacote: contexto de referência pronto para revisão humana. O contrato e os cenários de teste estão completos, mas não se afirma que uma implementação adotante os tenha aprovado.
Decisão
Aplicar a mudança imediatamente, então expor uma mensagem de status de desfazer de ação única por uma janela configurável. Preservar o foco, anunciar texto de status conciso e fornecer um caminho de recuperação sem tempo limitado quando a perda for grave.
Escopo
- Foco, ativação por teclado, anúncios em região ao vivo, expiração, ações repetidas e recuperação.
- Desfazer para uma ação do usuário concluída com uma identidade de operação durável.
- Comportamento visual e para tecnologia assistiva da mensagem de status.
Fora deste bloco
- Substituir confirmação para ações irreversíveis e de alto impacto.
- Uma arquitetura geral de histórico de comandos ou reversão colaborativa.
Contrato
- Concluir a ação não move o foco do teclado para a mensagem de status.
- Um anúncio educado de status nomeia o resultado e a ação de Desfazer disponível uma vez; contagens regressivas não são anunciadas.
- Desfazer é um botão nativo na ordem de tabulação e tem um nome acessível que identifica a ação quando há ambiguidade.
- A ativação é idempotente e mira o ID exato da operação, não simplesmente o registro correspondente mais recente.
- A expiração remove ou desabilita a ação de forma consistente; a tecnologia assistiva recebe uma única atualização concisa de expiração/resultado.
- Ações repetidas permanecem individualmente atribuíveis ou são deliberadamente agrupadas com uma regra documentada.
Orientações para implementação
- Use um ID de operação persistente retornado pela mutação e envie-o com o desfazer.
- Mantenha a região ao vivo montada para que os anúncios sejam confiáveis; atualize seu texto em vez de recriar o nó.
- Pause a expiração visual quando a política do produto exigir, ou forneça uma rota de recuperação por atividade/histórico para mudanças consequentes.
- Teste apenas com teclado, leitores de tela comuns, movimento reduzido e alto zoom.
Tratamento de falhas e salvaguardas
- Se o desfazer conflitar com uma edição posterior, não sobrescreva o estado posterior; retorne um conflito explicativo e rota de recuperação.
- Se a solicitação de desfazer expirar, mantenha o status incerto até a busca da operação resolvê-lo.
- Se a ação já estiver desfeita, retorne o mesmo estado final bem-sucedido.
Verificação e operações
- Acompanhe tentativas de desfazer, sucesso, expiração, conflitos e ativações duplicadas.
- Verifique a posição do foco e a saída da região ao vivo em testes automatizados de acessibilidade mais revisão manual com tecnologia assistiva.
- Reavalie a janela de tempo usando necessidades observadas de conclusão e recuperação, não um valor universal codificado.
Os exemplos com aparência executável neste pacote são fixtures e contratos de aceitação. Execute
python tools/validate.py a partir da raiz da coleção para verificar a estrutura e metadados do pacote; então
implemente e execute os cenários no repositório alvo.
Suposições para adoção
- Nomes e valores numéricos em
example.yamlsão um perfil de adoção, não padrões universais. - A equipe adotante deve mapear atores, classes de dados, vocabulário de erros e propriedade para seu sistema.