Adicionar botão ao componente de tema TOC

Espero que você possa adicionar a função de diretório oculto.

Plugins personalizados

Isso é feito com referência ao seu plugin, principalmente adicionando mais um botão e, em seguida, usando JavaScript para renderização dinâmica.

discourse-----------------------hide-toc (1).zip (3,3 KB)

CSS / JavaScript

css

// Estilos relacionados ao índice exibido no editor

// Define os estilos para exibir o índice na visualização do editor
.edit-title .d-editor-preview [data-theme-toc="false"],
body.toc-for-replies-enabled .d-editor-preview [data-theme-toc="false"] {
  // Define a cor de fundo como a terceira cor do tema
  background: var(--tertiary);
  // Define a cor do texto como a segunda cor do tema
  color: var(--secondary);
  // Define o elemento como posição fixa, para que permaneça no topo da janela de visualização durante a rolagem
  position: sticky;
  // Define z-index como 1 para garantir que este elemento seja exibido acima de outros elementos
  z-index: 1;
  // Define a distância do elemento do topo da janela de visualização como 0
  top: 0;
  // Define a altura do elemento como 30 pixels
  height: 30px;
  // Define o modo de exibição do elemento como flexbox para facilitar o alinhamento do conteúdo
  display: flex;
  // Centraliza verticalmente os itens no flexbox
  align-items: center;
  // Centraliza horizontalmente os itens no flexbox
  justify-content: center;
  
  // Usa o pseudo-elemento :before para inserir conteúdo antes do elemento
  &:before {
    // Define o conteúdo inserido como o valor da variável $composer_toc_text
    // content: "#{$composer_toc_text}";
    content: "Este post não exibirá o índice";
  }
}

JavaScript

    // Define uma função para definir o estilo de um elemento
    function setStyle(selector, styles) {
        // Encontra o elemento pelo seletor especificado
        const element = document.querySelector(selector);
        // Se o elemento for encontrado, aplica os estilos
        if (element) {
            Object.assign(element.style, styles);
        }
    }

    // Define uma função para verificar se o conteúdo da página contém uma marcação específica do TOC
    function checkForTOCMarkup() {
        // Verifica se o conteúdo do corpo da página inclui uma string específica
        if (document.body.innerHTML.includes('<div data-theme-toc="false">')) {
            // Oculta o elemento da linha do tempo
            setStyle('.with-timeline', { display: 'none' });
            // Modifica o estilo da coluna do contêiner de posts para 100%
            setStyle('.container.posts', { gridTemplateColumns: '100%' });
            // Define a largura do corpo do tópico para 100%
            setStyle('.topic-body', { width: '100%' });
            // Define a largura máxima e o preenchimento esquerdo do mapa do tópico
            setStyle('.topic-map', { maxWidth: '100%', paddingLeft: '0px' });
            // Oculta o elemento do avatar do tópico
            setStyle('.topic-avatar', { display: 'none' });
            // Define a largura máxima e o preenchimento esquerdo do elemento de espaço
            setStyle('.gap', { maxWidth: '100%', paddingLeft: '0px' });
            // Define a largura máxima e o preenchimento esquerdo dos botões do rodapé do tópico
            setStyle('#topic-footer-buttons', { maxWidth: '100%', paddingLeft: '0px' });

        } else {
            // Lembre-se de não usar o código padrão antes da modificação, pois afetará o lado móvel, deixe o sistema lidar automaticamente
            // setStyle('.topic-body', { width: 'calc(var(--topic-body-width) + var(--topic-body-width-padding)*2)' }); // Restaura a largura padrão
            
            setStyle('.with-timeline', { display: '' }); // Restaura o estilo padrão
            setStyle('.container.posts', { gridTemplateColumns: '' }); // Restaura o estilo de coluna padrão
            setStyle('.topic-body', { width: '' }); // Restaura a largura padrão
            setStyle('.topic-map', { maxWidth: '', paddingLeft: '' }); // Restaura o estilo padrão
            setStyle('.topic-avatar', { display: '' }); // Restaura a exibição padrão
            setStyle('.gap', { maxWidth: '', paddingLeft: '' }); // Restaura o estilo padrão
            setStyle('#topic-footer-buttons', { maxWidth: '', paddingLeft: '' }); // Restaura o estilo padrão
        }
        
    }

    // Cria uma instância do observador para monitorar as mudanças no DOM
    const observer = new MutationObserver(checkForTOCMarkup);
    // Configura as opções do observador para monitorar mudanças nos nós filhos e em todos os nós descendentes
    const config = { childList: true, subtree: true };

    // Começa a observar as mudanças no documento
    observer.observe(document.body, config);

    // Executa uma verificação imediatamente quando a página é carregada
    checkForTOCMarkup();

1 curtida

se você quer dizer ocultar o TOC, você já pode fazer isso clicando no botão da linha do tempo no canto inferior direito.

Então você obterá a linha do tempo usual com um botão “Contents” que permitirá reativar a tabela de conteúdos.

2 curtidas

Não, é para ocultar toda a barra lateral e tornar a área de conteúdo grande o suficiente, pois seu plugin terá melhor compatibilidade se você fizer isso com base nisso, e você pode adicionar o que desejar.

2 curtidas

@Lilly você pode sugerir o que posso estar perdendo, pois não consigo encontrar esse botão \u003ckbd\u003eTimeline\u003c/kbd\u003e nos meus sites, ou seja,

2 curtidas

Acho que é porque o tópico não tem respostas.
Não consigo ver esse botão em Customizing your site with existing theme components. Mas ele está visível em Understanding stats for 'topic views', 'posts read', and 'reading time', que tem uma resposta.

3 curtidas

Obrigado @Moin, era isso! Adicionei uma resposta de teste a esse Tópico e agora o botão alternador Linha do Tempo / TOC realmente aparece!

3 curtidas

por que eu não tenho esse botão?

Seu tópico tem uma resposta?

2 curtidas

ahha, você tem razão!
incrível

mas acho que isso é um bug, porque sem este botão não temos acesso às notificações e às opções do tópico (e ao modo de leitura)

2 curtidas

Além disso, não é intuitivo. Eu disse ao meu colega, que é novo no Discourse, para fixar um tópico. Ele disse que não havia botão. Então fui até ele para mostrar e, bem, não havia botão, apenas um TOC. Eu estava rolando para cima e para baixo e a chave inglesa apareceu brevemente e depois desapareceu. Então, novamente, eu estava rolando aleatoriamente até atingir a primeira resposta e percebemos como funcionava. Não era nada óbvio. Especialmente em tópicos mais longos (que são exatamente aqueles para ter TOC) pode ser um desafio.

1 curtida