Диагностика ИИ (GPT 5.6 Sol Ultra) в Codex (если полезно):
Нашёл: Discourse Reactions утекает глобальное состояние «без выделения текста».
- Событие touchstart реакции добавляет discourse-reactions-no-select к в
plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:222. - Этот класс применяет user-select: none и отключает длинное нажатие WebKit для всего документа в
plugins/discourse-reactions/assets/stylesheets/common/discourse-reactions.scss:1. - Если вертикальная прокрутка начинается над кнопкой реакции,
plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:249инвалидирует жест, не удаляя класс. plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:257затем возвращает управление досрочно, оставляя класс навсегда.- Также отсутствует очистка при touchcancel или уничтожении компонента.
Единственное удаление находится в plugins/discourse-reactions/assets/javascripts/discourse/components/discourse-reactions-actions.gjs:690. Это объясняет описанный обходной путь (The popup menu for quoting text is unresponsive on Android): открытие и закрытие всплывающего окна реакций вызывает collapseAllPanels(), восстанавливая выделение.
Самая панель цитирования находится ниже по потоку — она слушает selectionchange и требует реального выделения браузера в frontend/discourse/app/components/post-text-selection.gjs:58. При глобальном user-select: none Android никогда не создаёт это выделение.
История подтверждает эту семью багов: исправление прокрутки 2023 года (FIX: prevents triggering a reaction while scrolling (#224) · discourse/discourse-reactions@d1970cf · GitHub) ввело досрочный возврат при невалидном касании, а частичное исправление 2024 года (FIX: couldn't select text after dismissing a reaction (#296) · discourse/discourse-reactions@c6710ef · GitHub) перенесло очистку в сворачивание панели, но оставило пути прокрутки/отмены неохваченными.
Исправление должно очищать класс при каждом завершённом, отклонённом, отменённом или уничтоженном касании, с регрессионными тестами для touchstart → touchmove → touchend и touchcancel.