Добавить кнопку в компонент темы оглавления

Надеюсь, вы сможете добавить функцию скрытия директорий.

Пользовательские плагины

Это решение разработано с参考 к вашему плагину, в основном добавлена одна дополнительная кнопка, а затем используется JavaScript для динамического рендеринга.

discourse-----------------------hide-toc (1).zip (3.3 KB)

CSS / JavaScript

CSS

// Стили для отображения оглавления в редакторе

// Определение стилей для отображения оглавления в предпросмотре редактора
.edit-title .d-editor-preview [data-theme-toc="false"],
body.toc-for-replies-enabled .d-editor-preview [data-theme-toc="false"] {
  // Установка цвета фона на третий цвет темы
  background: var(--tertiary);
  // Установка цвета текста на второй цвет темы
  color: var(--secondary);
  // Установка позиционирования элемента как sticky, чтобы он оставался в верхней части видимой области при прокрутке
  position: sticky;
  // Установка z-index равным 1, чтобы гарантировать отображение элемента поверх других элементов
  z-index: 1;
  // Установка расстояния элемента от верхней части видимой области равным 0
  top: 0;
  // Установка высоты элемента равной 30 пикселей
  height: 30px;
  // Установка способа отображения элемента как flexbox для удобства выравнивания содержимого
  display: flex;
  // Вертикальное центрирование элементов внутри flexbox
  align-items: center;
  // Горизонтальное центрирование элементов внутри flexbox
  justify-content: center;
  
  // Использование псевдоэлемента :before для вставки содержимого перед элементом
  &:before {
    // Установка вставляемого содержимого равным значению переменной $composer_toc_text
    // content: "#{$composer_toc_text}";
    content: "В этом посте оглавление не будет отображаться";
  }
}

JavaScript

<script>
    // Определение функции для установки стилей элемента
    function setStyle(selector, styles) {
        // Поиск элемента по указанному селектору
        const element = document.querySelector(selector);
        // Если элемент найден, применить стили
        if (element) {
            Object.assign(element.style, styles);
        }
    }

    // Определение функции для проверки наличия в содержимом страницы специфичной метки TOC
    function checkForTOCMarkup() {
        // Проверка наличия в содержимом страницы специфичной строки
        if (document.body.innerHTML.includes('<div data-theme-toc="false">')) {
            // Скрытие элемента временной шкалы
            setStyle('.with-timeline', { display: 'none' });
            // Изменение стиля столбцов контейнера постов на 100%
            setStyle('.container.posts', { gridTemplateColumns: '100%' });
            // Установка ширины тела темы на 100%
            setStyle('.topic-body', { width: '100%' });
            // Установка максимальной ширины и левого внутреннего отступа карты темы
            setStyle('.topic-map', { maxWidth: '100%', paddingLeft: '0px' });
            // Скрытие элемента аватара темы
            setStyle('.topic-avatar', { display: 'none' });
            // Установка максимальной ширины и левого внутреннего отступа элемента разрыва
            setStyle('.gap', { maxWidth: '100%', paddingLeft: '0px' });
            // Установка максимальной ширины и левого внутреннего отступа кнопок подвала темы
            setStyle('#topic-footer-buttons', { maxWidth: '100%', paddingLeft: '0px' });

        } else {
            // Помните, не используйте измененный исходный код по умолчанию, так как это повлияет на мобильные устройства; пусть система обрабатывает это автоматически
            // setStyle('.topic-body', { width: 'calc(var(--topic-body-width) + var(--topic-body-width-padding)*2)' }); // Восстановить ширину по умолчанию
            
            setStyle('.with-timeline', { display: '' }); // Восстановить стили по умолчанию
            setStyle('.container.posts', { gridTemplateColumns: '' }); // Восстановить стиль столбцов по умолчанию
            setStyle('.topic-body', { width: '' }); // Восстановить ширину по умолчанию
            setStyle('.topic-map', { maxWidth: '', paddingLeft: '' }); // Восстановить стили по умолчанию
            setStyle('.topic-avatar', { display: '' }); // Восстановить отображение по умолчанию
            setStyle('.gap', { maxWidth: '', paddingLeft: '' }); // Восстановить стили по умолчанию
            setStyle('#topic-footer-buttons', { maxWidth: '', paddingLeft: '' }); // Восстановить стили по умолчанию
        }
        
    }

    // Создание экземпляра наблюдателя для отслеживания изменений в DOM
    const observer = new MutationObserver(checkForTOCMarkup);
    // Настройка параметров наблюдателя для отслеживания изменений дочерних узлов и всех потомков
    const config = { childList: true, subtree: true };

    // Начало наблюдения за изменениями в документе
    observer.observe(document.body, config);

    // Немедленное выполнение проверки при загрузке страницы
    checkForTOCMarkup();
</script>

Если вы имеете в виду скрытие оглавления, это уже можно сделать, нажав на кнопку «Timeline» в правом нижнем углу.

После этого появится обычная временная шкала с кнопкой «Contents», с помощью которой можно снова включить оглавление.

Нет, это нужно для того, чтобы скрыть всю боковую панель и сделать область контента достаточно широкой, поскольку ваш плагин будет иметь лучшую совместимость, если вы сделаете это на этой основе, и вы сможете добавить его по своему усмотрению.

@Lilly, не могла бы ты подсказать, чего мне не хватает, так как я не могу найти кнопку Timeline на своих сайтах, например на:

Я думаю, это потому, что у темы нет ответов.
Я не вижу эту кнопку на Customizing your site with existing theme components. Но она видна на Understanding stats for 'topic views', 'posts read', and 'reading time', где есть ответ.

Спасибо @Moin, это помогло! Я добавил тестовый ответ в эту тему, и теперь кнопка переключения «Временная шкала / Оглавление» действительно появляется!

почему у меня нет этой кнопки?

Есть ли ответ на вашу тему?

Ага, вы правы!
Невероятно.

Но я думаю, что это ошибка, потому что без этой кнопки у нас нет доступа к уведомлениям и параметрам темы (и режиму чтения).

Кроме того, это не интуитивно понятно. Я попросил своего коллегу, который только начинает работать с Discourse, закрепить тему. Он сказал, что кнопки нет. Тогда я подошёл к нему, чтобы показать, и действительно — кнопки не было, только оглавление. Я листал вверх и вниз, и на мгновение появился гаечный ключ, а затем исчез. Пришлось снова случайно прокручивать страницу, пока я не дошёл до первого ответа, и только тогда мы поняли, как это работает. Это совсем не очевидно. Особенно в длинных темах (как раз в тех, где должно быть оглавление) это может стать проблемой.