Diagnóstico da IA (GPT 5.6 Sol Ultra) no Codex (se útil):
Encontrei: as Reações do Discourse vazam um estado global de “sem seleção de texto”.
- O touchstart da reação adiciona discourse-reactions-no-select ao em
plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:222. - Essa classe aplica user-select: none e desabilita o callout de toque longo do WebKit para todo o documento em
plugins/discourse-reactions/assets/stylesheets/common/discourse-reactions.scss:1. - Se uma rolagem vertical começar sobre o botão de reação,
plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:249invalida o gesto sem remover a classe. plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:257então retorna antecipadamente, deixando a classe por tempo indeterminado.- Também não há limpeza para touchcancel ou destruição do componente.
A única remoção está em plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:690. Isso explica a solução alternativa relatada (The popup menu for quoting text is unresponsive on Android): abrir e dispensar o pop-up de reações chama collapseAllPanels(), restaurando a seleção.
A própria barra de ferramentas de citação é a jusante — ela escuta selectionchange e exige uma seleção real do navegador em frontend/discourse/app/components/post-text-selection.gjs:58. Com user-select: none global, o Android nunca cria essa seleção.
O histórico confirma essa família de bugs: uma correção de rolagem de 2023 (FIX: prevents triggering a reaction while scrolling (#224) · discourse/discourse-reactions@d1970cf · GitHub) introduziu o retorno antecipado de toque inválido, e uma correção parcial de 2024 (FIX: couldn't select text after dismissing a reaction (#296) · discourse/discourse-reactions@c6710ef · GitHub) moveu a limpeza para o fechamento do painel, mas deixou os caminhos de rolagem/cancelamento sem cobertura.
A correção deve limpar a classe em todos os ciclos de toque concluídos, rejeitados, cancelados ou destruídos, com testes de regressão para touchstart → touchmove → touchend e touchcancel.