TOCテーマコンポーネントにボタンを追加

隠しディレクトリ機能を追加していただけると幸いです。

カスタムプラグイン

これはあなたのプラグインを参考に、主にボタンを一つ追加し、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"] {
  // 背景色をテーマの3番目の色に設定
  background: var(--tertiary);
  // テキスト色をテーマの2番目の色に設定
  color: var(--secondary);
  // 要素をスティッキー配置にし、スクロール時にビューポートの上部に固定
  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

    // 要素のスタイルを設定する関数を定義
    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();
「いいね!」 1

目次を非表示にしたいのであれば、右下にあるタイムラインボタンをクリックすることで既に可能です。

これにより、目次を再度有効にできる「Contents」ボタンが付いた通常のタイムラインが表示されます。

「いいね!」 2

いいえ、サイドバー全体を非表示にしてコンテンツ領域を十分に大きくするためです。このベースで行うと、プラグインの互換性が向上するため、必要に応じて追加できます。

「いいね!」 2

@Lilly、サイトでそのタイムラインボタンが見つからないのですが、何か見落としている点があれば教えていただけますか?例えば、

「いいね!」 2

返信がないことが原因だと思います。
Customizing your site with existing theme components. ではそのボタンが見えませんが、返信がある Understanding stats for 'topic views', 'posts read', and 'reading time' では表示されています。

「いいね!」 3

@Moinさん、ありがとうございます。それが原因でした!トピックにテスト返信を追加したところ、タイムライン/目次切り替えボタンが表示されるようになりました!

「いいね!」 3

なぜそのボタンが表示されないのですか?

トピックに返信はありますか?

「いいね!」 2

ああ、あなたは正しい!
信じられない
しかし、これはバグだと思います。なぜなら、このボタンがないと、通知やトピックオプション(およびリーダーモード)にアクセスできなくなるからです。

「いいね!」 2

また、直感的ではありません。Discourseを使い始めたばかりの同僚にトピックをピン留めするように指示しました。彼はボタンがないと言いました。そこで、彼に歩み寄って見せたのですが、やはりボタンはなく、目次しかありませんでした。上下にスクロールしていると、レンチが短時間表示されては消えました。そのため、再びランダムにスクロールしていると、最初の返信にたどり着き、その仕組みを理解しました。まったく明白ではありませんでした。特に長いトピック(まさに目次が必要なトピック)では課題となる可能性があります。

「いいね!」 1