С моими базовыми навыками программирования и некоторыми подсказками от ChatGPT, я, думаю, добился успеха.
Создал пользовательский компонент и добавил следующее в вкладку CSS:
@media (max-width: 767px) {
#topic-progress-wrapper.sticky-bottom {
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 1000;
}
}
а это — во вкладку JS:
import { apiInitializer } from "discourse/lib/api";
export default apiInitializer((api) => {
api.onPageChange(() => {
const observer = new MutationObserver(() => {
const wrapper = document.getElementById("topic-progress-wrapper");
const tocButton = wrapper?.querySelector(".d-toc-mini button");
if (wrapper) {
if (tocButton) {
wrapper.classList.add("sticky-bottom");
} else {
wrapper.classList.remove("sticky-bottom");
}
}
});
observer.observe(document.body, {
childList: true,
subtree: true,
});
});
});
Это, кажется, работает отлично даже без ответа.
Опять же, я не эксперт, я просто умею хорошо задавать вопросы, и после небольшого диалога с ChatGPT, задавая правильные вопросы и ставя задачи, всё, похоже, работает.
Если кто-то из экспертов по JavaScript и CSS захочет улучшить это решение, пожалуйста, поделитесь.
Итак, если вы хотите:
- Текст «Оглавление» рядом с иконкой
- Раскрытые заголовки
- Закреплённую кнопку, не зависящую от наличия ответов, то полный код CSS выглядит так:
/* раскрывает все заголовки в боковой панели оглавления */
#d-toc li.d-toc-item > ul {
max-height: 500em !important;
overflow: visible !important;
opacity: 1 !important;
}
@media screen and (max-width: 767px) {
/* делает обёртку, включая кнопку оглавления, закреплённой внизу */
#topic-progress-wrapper.sticky-bottom {
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 1000;
}
/* добавляет «оглавление» к кнопке после иконки */
.d-toc-mini button::after {
content: "Оглавление";
margin-left: 5px;
font-size: 14px;
vertical-align: middle;
}
}
JavaScript-код остаётся без изменений.