¡Novedades!

Taller intensivo sobre el plugin oficial de tipografía para Tailwind CSS

Leer más.

typography

El plugin de Typography es una herramienta esencial para diseñadores y desarrolladores web que buscan optimizar la legibilidad y la estética de sus sitios. Este plugin permite a los usuarios personalizar tipografías, ajustar el espaciado, el tamaño de fuente y la alineación del texto, asegurando que el contenido no solo sea atractivo, sino también fácil de leer. Al integrar técnicas avanzadas de tipografía, los usuarios pueden mejorar la experiencia del usuario y la accesibilidad, destacando elementos clave y mejorando la jerarquía visual en las interfaces digitales.

Instalación

La instalación es muy sencilla, puedes ver la sección de configuración de flowtitude, en donde ya esta incluido. De todas formas vamos a refrescar, por si eliminaste la configuración del plugin.

Ya sea que uses Yabe SIUL o Winden la configuración es identica.

...
import typography from 'https://esm.sh/@tailwindcss/typography'
...

Primero que nada al principio del archivo de configuración añade la linea junto con las importaciones del resto de plugins, el orden no importa.

 plugins: [
        ...
        typography,
        ....
    ],

De la misma forma al final de la configuración en la sección de plugins añade typografy, tal como se ve en el codigo, sin importar tampoco el orden.

Con esto ya está añadido nuestro plugin y ya podemos hacer uso de ello

Cómo funciona y aspectos básicos

Este enfoque resulta especialmente útil cuando necesitas formatear de manera automatizada un bloque de texto que contiene múltiples tipos de contenido, generalmente dinámico, como el contenido de un custom post type (CPT) o un bloque de texto enriquecido. Simplemente añadiendo la clase prose al elemento contenedor de tu texto lograrás obtener ajustes equilibrados. Estos ajustes no se limitan solo a los tamaños tipográficos, sino que también incluyen márgenes, interlineado y otros aspectos, todos adaptados para mantener los requisitos de legibilidad deseados. Por ejemplo:

<div class="prose">
  <h1>Título Principal</h1>
  <p>Este es un párrafo de ejemplo para demostrar la tipografía en acción.</p>
</div>

Una vez añadida la clase ya empezamos a obtener los primeros efectos de sus uso, antes que nada voy a añadir un código por si necesitas desencolar los estilos de gutenberg en la parte de frontend de tu sitio web, ya que se pueden estar aplicando tambien.

function ft_disable_frontend_gutenberg_styles() {
  wp_dequeue_style( 'wp-block-library' ); 
}

add_action( 'wp_enqueue_scripts', 'ft_disable_frontend_gutenberg_styles', 100 );

Este snippet lo puedes colorcar o bien en el archivo functions.php de tu tema hijo, o bien con un gestor de snippets.

En caso de que una parte del contenido quieras que no utilize los estilos propios del plugin de tipografia puedes utilizar la clase no-prose y todos los elementos hijos de donde apliques la clase dejaran de aplicarse.

Ancho del contenido

La primera consecuencia al aplicar la case prose al contendor es que veremos reducido su ancho, ya que por defecto siguiendo las buenas practicas de legibilidad limita su ancho a 65 ch (65 caracteres por linea). Para librarnos de esta limitación de ancho podemos poner cualuqier clase del tipo max-w-[valor] o bien max-w-none, si queremos eliminar su uso y que tome como anchura el valor de su elemento contenedor. Siguiendo con el ejemplo anterior quedaría de la siguiente forma:

<div class="prose max-w-none">
  <h1>Título Principal</h1>
  <p>Este es un párrafo de ejemplo para demostrar la tipografía en acción.</p>
</div>

El plugin ajusta los siguientes aspectos.

  • Encabezados (h1, h2, h3, etc.): Ajusta el tamaño, peso y margen para diferenciar la jerarquía de la información.
  • Párrafos (p): Establece el tamaño del texto, el espaciado entre líneas y los márgenes inferiores para separar los bloques de texto.
  • Enlaces (a): Define estilos para enlaces, incluyendo colores y efectos hover para mejorar la visibilidad y la interactividad.
  • Listas (ul, ol): Ajusta el espaciado antes, después y dentro de listas ordenadas y desordenadas para mejorar la claridad.
  • Citas (blockquote): Aplica estilos de indentación, tipo de fuente y color para destacar citas del texto principal.

Personalizando tu contenido

El  plugin es altamente configurable aunque el resultado obtenido al añadir las clases básicas es optimo, podemos configurar de forma sencilla mediante el uso de clases de utilidad, el color, el tamaño de fuente y a nivel específico cada uno de los elementos de tu contenido.

Añadiendo color

Aunque básicamente pueda parecer que estamos personalizando el color de los enlaces, cuando estamos usando el primer grupo de colores que se puede ver en la tabla inferior, tambien se personalizan los colores de los bordes, el cuerpo de texto y algunos elementos de las tablas.

Asi pues los colores pertenecientes al primer grupo son todos aquellos que generan una escala de grises y que podemos ver a continuación:

Clase Color
prose-gray (por defecto) Gray
prose-slate Slate
prose-zinc Zinc
prose-neutral Neutral
prose-stone Stone
ClaseColor
prose-gray (por defecto) Gray
prose-slateSlate
prose-zincZinc
prose-neutralNeutral
prose-stoneStone

Los colores descritos en la tabla anterior como podemos ver en el código siguiente no solo afectan a los enlaces, si no que a más elementos como bordes, color del texto, fondos de tablas y tambien a la clase prose-invert utilizada para definir el modo oscuro.

zinc: {
    css: {
      '--tw-prose-body': colors.zinc[700],
      '--tw-prose-headings': colors.zinc[900],
      '--tw-prose-lead': colors.zinc[600],
      '--tw-prose-links': colors.zinc[900],
      '--tw-prose-bold': colors.zinc[900],
      '--tw-prose-counters': colors.zinc[500],
      '--tw-prose-bullets': colors.zinc[300],
      '--tw-prose-hr': colors.zinc[200],
      '--tw-prose-quotes': colors.zinc[900],
      '--tw-prose-quote-borders': colors.zinc[200],
      '--tw-prose-captions': colors.zinc[500],
      '--tw-prose-kbd': colors.zinc[900],
      '--tw-prose-kbd-shadows': hexToRgb(colors.zinc[900]),
      '--tw-prose-code': colors.zinc[900],
      '--tw-prose-pre-code': colors.zinc[200],
      '--tw-prose-pre-bg': colors.zinc[800],
      '--tw-prose-th-borders': colors.zinc[300],
      '--tw-prose-td-borders': colors.zinc[200],
      '--tw-prose-invert-body': colors.zinc[300],
      '--tw-prose-invert-headings': colors.white,
      '--tw-prose-invert-lead': colors.zinc[400],
      '--tw-prose-invert-links': colors.white,
      '--tw-prose-invert-bold': colors.white,
      '--tw-prose-invert-counters': colors.zinc[400],
      '--tw-prose-invert-bullets': colors.zinc[600],
      '--tw-prose-invert-hr': colors.zinc[700],
      '--tw-prose-invert-quotes': colors.zinc[100],
      '--tw-prose-invert-quote-borders': colors.zinc[700],
      '--tw-prose-invert-captions': colors.zinc[400],
      '--tw-prose-invert-kbd': colors.white,
      '--tw-prose-invert-kbd-shadows': hexToRgb(colors.white),
      '--tw-prose-invert-code': colors.white,
      '--tw-prose-invert-pre-code': colors.zinc[300],
      '--tw-prose-invert-pre-bg': 'rgb(0 0 0 / 50%)',
      '--tw-prose-invert-th-borders': colors.zinc[600],
      '--tw-prose-invert-td-borders': colors.zinc[700],
    },
  },

Si necesitamos añadir solo el color para los enlaces disponemos de las siguientes clases:

ClaseColor
prose-redRed
prose-orangeOrange
prose-amberamber
prose-yellowYellow
prose-limeLime
prose-greenGreen
prose-emeraldEmerald
prose-tealTeal
prose-cyanCyan
prose-skySky
prose-blueBlue
prose-indigoIndigo
prose-violetViolet
prose-purplePurple
prose-fuchsiaFuchsia
prose-pinkPink
prose-roseRose

Esta lista de colores que es la paleta estandard de Tailwind se conserva solo con propositos de compativilidad con versiones anteriores, el color del enlace queda definido tanto en el estado normal como en el hover

Modificando el tamaño de letra

De la misma forma que con los colores, podemos definir el tamaño de la letra según se puede ver en la tabla inferior, hay que tener en cuenta que dad la versatilidad de Tailwind CSS podemos conbinar estas clases con modificadores pra ajustar los tamaños de forma responsiva o bien con los tamaños de contenedor.

ClaseTamaño fuente cuerpo
prose-sm 0.875rem (14px)
prose-base (por defecto) 1rem (16px)
prose-lg1.125rem (18px)
prose-xl1.25rem (20px)
prose-2xl1.5rem (24px)

Personalizando de una forma más precisa

Una vez llegados a este punto quizás necesitas aun una mayor personalización, esto es posible mediante el uso de los modificadores expuestos en la tabla inferior. Estos funcionan como cualquier modificador de tailwind.

ModificadoresTarget
prose-headings:{utility}h1, h2, h3, h4, th
prose-lead:{utility}[class~="lead"]
prose-h1:{utility}h1
prose-h2:{utility}h2
prose-h3:{utility}h3
prose-h4:{utility}h4
prose-p:{utility}p
prose-a:{utility}a
prose-blockquote:{utility}blockquote
prose-figure:{utility}figure
prose-figcaption:{utility}figcaption
prose-strong:{utility}strong
prose-em:{utility}em
prose-code:{utility}code
prose-pre:{utility}pre
prose-ol:{utility}ol
prose-ul:{utility}ul
prose-li:{utility}li
prose-table:{utility}table
prose-thead:{utility}thead
prose-tr:{utility}tr
prose-th:{utility}th
prose-td:{utility}td
prose-img:{utility}img
prose-video:{utility}video
prose-hr:{utility}hr

SI tienes planteado una estrategia de personalizar el comportamiento del plugin quizás te convenga definirlo en el archivo main.css o base.css con la directiva @apply para que puedas reutilizarlo en varios sitios tal como podemos ver en el ejemplo siguiente:

.prose-custom {
	@apply max-w-none prose; 
	@apply prose-headings:font-serif prose-headings:text-emerald-700; 
	@apply prose-strong:text-gray-600 prose-em:text-gray-600 prose-p:text-gray-600; 
	@apply prose-a:text-emerald-700 hover:prose-a:text-emerald-900; 
	@apply prose-li:text-gray-600 prose-ul:list-inside prose-ol:list-inside prose-li:marker:text-emerald-700; 
	@apply prose-img:w-full prose-img:border prose-img:p-1 prose-th:bg-emerald-700; 
	@apply prose-th:text-white prose-th:font-sans prose-th:p-2 prose-table:border prose-td:p-2;  
	@apply prose-blockquote:pl-4 prose-blockquote:py-2 prose-blockquote:text-gray-500 prose-blockquote:border-emerald-500 prose-blockquote:font-light;
}

Ten en cuenta que he divido en multiples @apply solo con fines de que quede mas claro.

Personalizando el plugin a través del archivo de configuración

Por último vamos a ver como podemos configurar y extender el plugin a través del archivo de configuración de Tailwind CSS

Personalización básica

Para empezar a personalizar, necesitas extender la configuración del plugin de tipografía en el archivo tailwind.config.js. Aquí hay un ejemplo básico de cómo hacerlo:

  theme: {
    extend: {
      typography: (theme) => ({
        DEFAULT: {
          css: {
            color: theme('colors.gray.700'),
            a: {
              color: theme('colors.blue.500'),
              '&:hover': {
                color: theme('colors.blue.700'),
              },
            },
            h1: {
              fontWeight: '700',
              letterSpacing: theme('letterSpacing.tight'),
              color: theme('colors.gray.900'),
            },
            h2: {
              fontWeight: '600',
              letterSpacing: theme('letterSpacing.tight'),
              color: theme('colors.gray.900'),
            },
            h3: {
              fontWeight: '500',
              color: theme('colors.gray.900'),
            },
            blockquote: {
              fontStyle: 'italic',
              color: theme('colors.gray.600'),
              borderLeftColor: theme('colors.gray.200'),
            },
            'ul > li::before': {
              backgroundColor: theme('colors.gray.400'),
            },
            // Más personalizaciones...
          },
        },
      }),
    },
  },

En este ejemplo estamos aplicando a la configuración predeterminada los siguientes cambios:

  • Color de texto: Cambia el color predeterminado del texto a gray.700.
  • Estilos de enlace (a): Define el color del enlace y su color en el estado hover.
  • Encabezados (h1, h2, h3): Ajusta el peso de la fuente, el espaciado entre letras y el color para los encabezados.
  • Citas (blockquote): Cambia el estilo de las citas, incluyendo la fuente, el color del texto y el color del borde izquierdo.
  • Listas (ul > li::before): Ajusta el color de los marcadores de las listas.

Modificando una variación o creando una nueva

En el siguiente ejemplo vamos a ver como podemos crear una nueva variante, a la que denominaremos en el ejemplo primary. COmo puedes observa el mecanismo es siempre el mismo, de la misma forma funcionaría para modificar una existente.

Ten en cuenta que siempre usamos la configuración dentro de la sección de extended

theme: {
    extend: {
      typography: (theme) => ({
        // Variante personalizada
        primary: {
          css: {
            color: theme('colors.gray.800'),
            a: {
              color: theme('colors.blue.600'),
              '&:hover': {
                color: theme('colors.blue.800'),
              },
            },
            h1: {
              fontSize: '2.5rem',
              fontWeight: '700',
              color: theme('colors.red.700'),
            },
            h2: {
              fontSize: '2rem',
              fontWeight: '600',
              color: theme('colors.red.600'),
            },
            p: {
              marginTop: '1.5em',
              marginBottom: '1.5em',
              lineHeight: '1.75',
            },
            blockquote: {
              fontStyle: 'italic',
              color: theme('colors.gray.600'),
              borderLeftColor: theme('colors.gray.300'),
              borderLeftWidth: '0.25rem',
              paddingLeft: '1rem',
            },
            'ul > li::before': {
              backgroundColor: theme('colors.gray.500'),
            },
            // Más personalizaciones...
          },
        },
      }),
    },
  },

Recapitulando, la creación y modificación de variantes para el plugin de tipografia siempre funciona de forma similar y lo podemos ver de forma resumida en el siguiente frangmento de código

theme: {
    extend: {
      typography: (theme) => ({
        // Variante personalizada o a modificar
        primary: {
          css: {
          // CSS en formato JS
            color: theme('colors.gray.800'),
            a: {
              color: theme('colors.blue.600'),
              '&:hover': {
                color: theme('colors.blue.800'),
              },
            },
            h1: {
              fontSize: '2.5rem',
              fontWeight: '700',
              color: theme('colors.red.700'),
            },
            // Más personalizaciones...
          },
        },
      }),
    },
  },

No obstante si deseas hacerlo en el main.css o base.css tambien sería posible de la siguiente forma, quizas es mas sencillo de entender y hace innecesario el empleo del plugin.

.prose-custom {
  @apply prose;
  @apply text-zinc-800;

  a {
    @apply text-primary hover:text-primary-dark no-underline;
  }

  h1 {
    @apply text-secondary font-bold mt-6 mb-4;
  }

  h2 {
    @apply text-secondary font-semibold mt-5 mb-3;
  }

  h3 {
    @apply text-secondary font-medium mt-4 mb-2;
  }

  p {
    @apply mt-2 mb-4 leading-relaxed;
  }

  p + p {
    @apply mt-4;
  }

  h1 + p,
  h2 + p,
  h3 + p {
    @apply mt-3;
  }

  blockquote {
    @apply italic text-secondary border-l-4 border-secondary-dark pl-4 mt-4 mb-4;
  }

  ul > li::before {
    @apply bg-primary;
  }

  ul,
  ol {
    @apply mt-4 mb-4 pl-6;
  }

  ul > li,
  ol > li {
    @apply pl-2 mb-2;
  }

  code {
    @apply text-secondary-dark bg-zinc-100 px-2 py-1 rounded-md;
  }

  strong {
    @apply text-zinc-900 font-bold;
  }

  hr {
    @apply border-zinc-200 mt-6 mb-6;
  }

  img {
    @apply rounded-md mt-4 mb-4;
  }

  table {
    @apply w-full table-auto text-left mt-4 mb-4;
  }

  th {
    @apply border-b-2 px-3 py-2 bg-zinc-100;
  }

  td {
    @apply border-b px-3 py-2 bg-zinc-50;
  }

}