Добавляет скроллбар, автоскролл (СКМ) и убирает "длинные" ссылки в блоке "Мои подписки"
Скрипт предназначен для кардинального улучшения юзабилити (usability) блока "Мои подписки" на сайте boosty.to. Оригинальный блок представляет собой длинный, не прокручиваемый список, что крайне неудобно для пользователей с большим количеством подписок.
Данный скрипт решает эту проблему путем:
max-height).Код четко структурирован по категориям, выполняющим изолированные задачи:
Внедрение стилей (GM_addStyle):
max-height: 90vh и overflow-y: auto !important) применяется к целевому блоку ([class*="ScrollableComponent"]), превращая его в прокручиваемую область.pointer-events: none !important устанавливается на саму "длинную" ссылку (<a>).pointer-events: auto !important устанавливается на дочерние элементы (аватар, имя, скидка).width: 12px) и стилизует его для лучшей видимости, что отражено в комментариях к коду.Поиск элемента и запуск (MutationObserver):
MutationObserver для отслеживания добавления новых узлов в document.body.MutationObserver обнаруживает появление целевого блока (jsTargetSelector), он вызывает функцию findAndInitBlock, которая, в свою очередь, запускает initPan для "оживления" блока.findAndInitBlock() один раз при старте на случай, если блок уже присутствует в DOM.Инициализация блока (initPan):
addEventListener('wheel', ...): Перехватывает прокрутку колесом мыши. Он использует e.stopPropagation(), чтобы предотвратить прокрутку основной страницы, пока прокручивается сам блок. Прокрутка "отпускается" на основную страницу, только если блок достигает своего верхнего или нижнего предела.addEventListener('mousedown', ...): Активирует автоскролл. Содержит ключевую проверку:
if (e.button !== 1): Реагирует только на среднюю кнопку мыши (СКМ).if (e.target !== e.currentTarget): Это "умный" фильтр. Он проверяет, был ли клик совершен по самому контейнеру (фон, currentTarget) или по его дочернему элементу (аватар, имя, target). Если клик был по контенту, функция завершается (return), позволяя браузеру выполнить действие по умолчанию (открыть ссылку в новой вкладке). Автоскролл запускается только при клике на фон.Управление автоскроллом (scrollLoop, startAutoScroll, stopAutoScroll):
scrollLoop использует requestAnimationFrame для обеспечения максимально плавной анимации прокрутки.anchorY), нормализуется относительно высоты элемента (elemHeight) и возводится в степень (acceleration = 2.0). Это создает естественную квадратичную кривую ускорения.startAutoScroll и stopAutoScroll управляют флагом isAutoScrolling, добавляют и удаляют глобальные слушатели mousemove (для обновления скорости) и mousedown (для остановки по любому клику), а также переключают CSS-класс mb-autoscroll-active на body для изменения курсора.boosty.to.MutationObserver гарантирует, что скрипт сработает, даже если блок "Мои подписки" загружается динамически после основной страницы.[class*="..."]) защищает скрипт от поломки при обновлениях сайта, когда меняются хэши в именах классов.pointer-events: Реализовано элегантное решение "сэндвича" (none на родителе, auto на потомках), которое позволяет одновременно иметь кликабельный фон для автоскролла и кликабельный контент для ссылок.e.target !== e.currentTarget является ключевой для юзабилити. Она не "ломает" нативное поведение браузера (открытие ссылок по СКМ), а дополняет его новой функцией.Math.pow) обеспечивает более качественный и отзывчивый "опыт" (UX) автоскролла по сравнению с линейным.Данный скрипт не генерирует текстовых или файловых данных. Его результатом является визуальное и функциональное изменение интерфейса сайта boosty.to.