Agregar botón al componente de tema TOC

Espero que puedas agregar la función de directorio oculto.

Plugins personalizados

Esto se hace con referencia a tu plugin, principalmente agregando un botón más y luego usando JavaScript para la renderización dinámica.

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

CSS / JavaScript

css

// Estilos relacionados con el índice que se muestran en el editor

// Define los estilos para mostrar el índice en la vista previa del editor
.edit-title .d-editor-preview [data-theme-toc="false"],
body.toc-for-replies-enabled .d-editor-preview [data-theme-toc="false"] {
  // Establece el color de fondo en el tercer color del tema
  background: var(--tertiary);
  // Establece el color del texto en el segundo color del tema
  color: var(--secondary);
  // Establece el elemento como posición pegajosa, para que permanezca en la parte superior de la ventana gráfica al desplazarse
  position: sticky;
  // Establece z-index en 1 para asegurar que este elemento se muestre por encima de otros elementos
  z-index: 1;
  // Establece la distancia del elemento desde la parte superior de la ventana gráfica en 0
  top: 0;
  // Establece la altura del elemento en 30 píxeles
  height: 30px;
  // Establece el modo de visualización del elemento como flexbox, para facilitar la alineación del contenido
  display: flex;
  // Alinea verticalmente los elementos dentro de flexbox
  align-items: center;
  // Centra horizontalmente los elementos dentro de flexbox
  justify-content: center;
  
  // Usa el pseudo-elemento :before para insertar contenido antes del elemento
  
  &:before {
    // Establece el contenido insertado en el valor de la variable $composer_toc_text
    // content: "#{$composer_toc_text}";
    content: "Este post no mostrará el índice";
  }
}

JavaScript

    // Define una función para establecer el estilo de un elemento
    function setStyle(selector, styles) {
        // Busca el elemento con el selector especificado
        const element = document.querySelector(selector);
        // Si se encuentra el elemento, aplica los estilos
        if (element) {
            Object.assign(element.style, styles);
        }
    }

    // Define una función para verificar si el contenido de la página contiene una marca TOC específica
    function checkForTOCMarkup() {
        // Comprueba si el contenido del cuerpo de la página incluye una cadena específica
        if (document.body.innerHTML.includes('<div data-theme-toc="false">')) {
            // Oculta el elemento de la línea de tiempo
            setStyle('.with-timeline', { display: 'none' });
            // Modifica el estilo de la columna del contenedor de posts a 100%
            setStyle('.container.posts', { gridTemplateColumns: '100%' });
            // Establece el ancho del cuerpo del tema al 100%
            setStyle('.topic-body', { width: '100%' });
            // Establece el ancho máximo y el relleno izquierdo del mapa del tema
            setStyle('.topic-map', { maxWidth: '100%', paddingLeft: '0px' });
            // Oculta el elemento del avatar del tema
            setStyle('.topic-avatar', { display: 'none' });
            // Establece el ancho máximo y el relleno izquierdo del elemento de espacio
            setStyle('.gap', { maxWidth: '100%', paddingLeft: '0px' });
            // Establece el ancho máximo y el relleno izquierdo de los botones del pie de página del tema
            setStyle('#topic-footer-buttons', { maxWidth: '100%', paddingLeft: '0px' });

        } else {
            // ¡Recuerda no usar el código predeterminado antes de la modificación, ya que afectará al lado móvil, deja que el sistema lo maneje automáticamente!
            // setStyle('.topic-body', { width: 'calc(var(--topic-body-width) + var(--topic-body-width-padding)*2)' }); // Restaura al ancho predeterminado
            
            setStyle('.with-timeline', { display: '' }); // Restaura el estilo predeterminado
            setStyle('.container.posts', { gridTemplateColumns: '' }); // Restaura el estilo de columna predeterminado
            setStyle('.topic-body', { width: '' }); // Restaura el ancho predeterminado
            setStyle('.topic-map', { maxWidth: '', paddingLeft: '' }); // Restaura el estilo predeterminado
            setStyle('.topic-avatar', { display: '' }); // Restaura la visualización predeterminada
            setStyle('.gap', { maxWidth: '', paddingLeft: '' }); // Restaura el estilo predeterminado
            setStyle('#topic-footer-buttons', { maxWidth: '', paddingLeft: '' }); // Restaura el estilo predeterminado
        }
        
    }

    // Crea una instancia de observador para monitorear los cambios en el DOM
    const observer = new MutationObserver(checkForTOCMarkup);
    // Configura las opciones del observador para monitorear cambios en los nodos hijos y todos los nodos descendientes
    const config = { childList: true, subtree: true };

    // Comienza a observar los cambios en el documento
    observer.observe(document.body, config);

    // Ejecuta una verificación inmediatamente cuando la página se carga
    checkForTOCMarkup();
1 me gusta

si te refieres a ocultar la tabla de contenido, ya puedes hacerlo haciendo clic en el botón de la línea de tiempo en la parte inferior derecha.

Luego obtendrás la línea de tiempo habitual con un botón de “Contenido” que te permitirá volver a habilitar la tabla de contenido.

2 Me gusta

No, es para ocultar toda la barra lateral y hacer que el área de contenido sea lo suficientemente grande, porque su complemento tendrá una mejor compatibilidad si lo hace sobre esta base, y puede agregarlo como desee.

2 Me gusta

@Lilly ¿puedes sugerir qué podría estar pasando por alto, ya que no parece que encuentre ese botón de Timeline en mis sitios, es decir,

2 Me gusta

Creo que es porque el tema no tiene respuestas.
No puedo ver ese botón en Customizing your site with existing theme components. Pero es visible en Understanding stats for 'topic views', 'posts read', and 'reading time', que tiene una respuesta.

3 Me gusta

¡Gracias @Moin, eso era! Añadí una respuesta de prueba a ese tema y ahora el botón del selector de línea de tiempo / TOC aparece.

3 Me gusta

¿por qué no tengo ese botón?

¿Tu tema tiene una respuesta?

2 Me gusta

¡ajaja, tienes razón!
increíble

pero creo que esto es un error, porque sin este botón no tenemos acceso a las notificaciones ni a las opciones del tema (y al modo de lectura)

2 Me gusta

Además, no es intuitivo. Le dije a mi colega, que es nuevo en Discourse, que fijara un tema. Dijo que no había ningún botón. Así que fui a su lado para mostrarle y, bueno, no había ningún botón, solo una tabla de contenido (TOC). Estuve desplazándome hacia arriba y hacia abajo y la llave inglesa apareció brevemente y luego desapareció. Así que volví a desplazarme al azar hasta que llegué a la primera respuesta y nos dimos cuenta de cómo funcionaba. No era nada obvio. Especialmente en temas más largos (que son exactamente aquellos que tienen TOC) puede ser un desafío.

1 me gusta