Diagnóstico de IA (GPT 5.6 Sol Ultra) en Codex (si es útil):
Lo encontré: Discourse Reactions filtra un estado global de «sin selección de texto».
- El evento touchstart de la reacción añade discourse-reactions-no-select a en
plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:222. - Esa clase aplica user-select: none y deshabilita el menú contextual de toque prolongado de WebKit para todo el documento en
plugins/discourse-reactions/assets/stylesheets/common/discourse-reactions.scss:1. - Si un desplazamiento vertical comienza sobre el botón de reacción,
plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:249invalida el gesto sin eliminar la clase. plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:257luego retorna prematuramente, dejando la clase abandonada indefinidamente.- Tampoco hay limpieza en touchcancel ni al destruir el componente.
La única eliminación está en plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:690. Eso explica la solución alternativa reportada (The popup menu for quoting text is unresponsive on Android): abrir y cerrar la ventana emergente de reacciones llama a collapseAllPanels(), restaurando la selección.
La barra de herramientas de citas es aguas abajo: escucha selectionchange y requiere una selección real del navegador en frontend/discourse/app/components/post-text-selection.gjs:58. Con user-select: none global, Android nunca crea esa selección.
El historial confirma esta familia de errores: una corrección de desplazamiento de 2023 (FIX: prevents triggering a reaction while scrolling (#224) · discourse/discourse-reactions@d1970cf · GitHub) introdujo el retorno prematuro de toque inválido, y una corrección parcial de 2024 (FIX: couldn't select text after dismissing a reaction (#296) · discourse/discourse-reactions@c6710ef · GitHub) movió la limpieza al colapso del panel pero dejó sin cubrir las rutas de desplazamiento/cancelación.
La corrección debería limpiar la clase en cada ciclo de vida de toque completado, rechazado, cancelado o destruido, con pruebas de regresión para touchstart → touchmove → touchend y touchcancel.