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.
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 |
Clase | Color |
---|---|
prose-gray (por defecto) | Gray |
prose-slate | Slate |
prose-zinc | Zinc |
prose-neutral | Neutral |
prose-stone | Stone |
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:
Clase | Color |
---|---|
prose-red | Red |
prose-orange | Orange |
prose-amber | amber |
prose-yellow | Yellow |
prose-lime | Lime |
prose-green | Green |
prose-emerald | Emerald |
prose-teal | Teal |
prose-cyan | Cyan |
prose-sky | Sky |
prose-blue | Blue |
prose-indigo | Indigo |
prose-violet | Violet |
prose-purple | Purple |
prose-fuchsia | Fuchsia |
prose-pink | Pink |
prose-rose | Rose |
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.
Clase | Tamaño fuente cuerpo |
---|---|
prose-sm | 0.875rem (14px) |
prose-base (por defecto) | 1rem (16px) |
prose-lg | 1.125rem (18px) |
prose-xl | 1.25rem (20px) |
prose-2xl | 1.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.
Modificadores | Target |
---|---|
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; } }