Prose (Tailwind Typography)
prose es la clase mágica del plugin @tailwindcss/typography. Convierte cualquier bloque de HTML "tonto" (el que sale de un markdown, un editor WYSIWYG o un campo CMS) en tipografía legible y bien jerarquizada sin tocar una sola etiqueta.
Qué es y cuándo usarlo
prose es un componente del plugin oficial @tailwindcss/typography. Aplica un conjunto de estilos a los descendientes de un contenedor: h1–h6, p, ul, ol, blockquote, code, pre, img, table, hr, etc.
Úsalo cuando:
- Renderizas markdown convertido a HTML (posts de blog, documentación, notas).
- Pintas contenido procedente de un CMS (WordPress
the_content(), ACF wysiwyg, Notion, MDX). - No controlas la estructura del HTML, solo el contenedor.
No lo uses cuando:
- Estás diseñando UI (botones, cards, navs, formularios). Para eso, usa los tokens y clases utilitarias de FDS directamente.
- Necesitas un control fino del spacing entre elementos:
proseimpone su propio ritmo vertical.
Regla de oro
prose es para contenido, no para interfaz. Si te ves añadiendo not-prose a la mitad de los hijos, probablemente no necesitabas prose en ese contenedor.
Activación en FDS
FDS ya carga el plugin en src/styles/tailwind.css:
@import 'tailwindcss';
@plugin '@tailwindcss/typography';
No tienes que instalar nada extra: la clase prose y todos sus modificadores están disponibles en cualquier proyecto que importe FDS.
Uso básico
<article class="prose">
<h1>Título del post</h1>
<p>Un párrafo introductorio que da contexto al lector.</p>
<h2>Sección</h2>
<p>Cuerpo de texto con un <a href="#">enlace</a> y <strong>énfasis</strong>.</p>
<ul>
<li>Primer punto</li>
<li>Segundo punto</li>
</ul>
<blockquote>Una cita destacada.</blockquote>
<pre><code>console.log('hola')</code></pre>
</article>
Sin más clases, ese HTML se renderiza con jerarquía, espaciado vertical, listas con bullets, código monoespaciado, blockquote indentado y enlaces con color.
Tamaños
Cinco variantes de escala. Se aplican junto a prose en el contenedor:
| Clase | Uso típico |
|---|---|
prose-sm | Sidebars, notas al pie, tooltips largos |
prose-base | Tamaño por defecto (no hace falta declararlo) |
prose-lg | Posts de blog, documentación |
prose-xl | Long-form editorial, ensayos |
prose-2xl | Lecturas tipo Medium, "modo focus" |
<article class="prose prose-lg">…</article>
Cada variante recalibra font-size, line-height y los márgenes verticales de todos los elementos hijos para mantener el ritmo.
Color
El plugin define paletas de color completas. Cambias el "tono" de toda la prosa con un modificador:
<article class="prose prose-slate">…</article>
<article class="prose prose-gray">…</article>
<article class="prose prose-zinc">…</article>
<article class="prose prose-neutral">…</article>
<article class="prose prose-stone">…</article>
Cada paleta ajusta el color de cuerpo, headings, enlaces, código, bordes y blockquote de forma coherente.
Dark mode
<article class="prose dark:prose-invert">…</article>
prose-invert invierte la paleta para fondos oscuros. Combinado con la variante dark de Tailwind se activa automáticamente cuando aplica.
Element overrides
Lo más potente: cualquier elemento se puede sobrescribir desde el contenedor con prose-{elemento}:{utilidad}.
<article class="prose
prose-headings:font-display
prose-headings:tracking-tight
prose-h1:text-5xl
prose-a:text-primary-600
prose-a:no-underline
hover:prose-a:underline
prose-blockquote:border-primary-500
prose-code:text-primary-700
prose-code:before:content-none
prose-code:after:content-none
prose-img:rounded-2xl
prose-img:shadow-lg">
…
</article>
Modificadores soportados (lista no exhaustiva): prose-headings, prose-h1 … prose-h4, prose-p, prose-a, prose-strong, prose-em, prose-blockquote, prose-code, prose-pre, prose-ul, prose-ol, prose-li, prose-img, prose-figure, prose-figcaption, prose-hr, prose-table, prose-th, prose-td, prose-lead.
Receta FDS recomendada
Para un post estándar dentro de un proyecto FDS:
<article class="prose prose-lg prose-slate
dark:prose-invert
max-w-none
prose-headings:font-display
prose-headings:tracking-tight
prose-a:text-primary-600
prose-a:font-medium
prose-a:no-underline
hover:prose-a:underline
prose-blockquote:border-l-primary-500
prose-blockquote:not-italic
prose-img:rounded-xl">
{{ contenido }}
</article>
Notas:
max-w-nonedesactiva elmax-width: 65chqueproseaplica por defecto. Úsalo cuando ya controlas el ancho desde el padre.prose-headings:font-displayengancha la--font-displayde FDS.text-primary-600reusa la paleta OKLCH de FDS, así si el cliente cambia la primary, los enlaces siguen.
Excluir partes con not-prose
A veces dentro de un bloque de prose hay un widget, un embed o un componente UI que no debe heredar los estilos:
<article class="prose">
<h1>Mi post</h1>
<p>Texto normal.</p>
<div class="not-prose">
<!-- Aquí prose no aplica: ideal para callouts, embeds, demos -->
<button class="btn">Suscribirse</button>
</div>
<p>Sigue el texto.</p>
</article>
Pitfalls comunes
- Aplicar
prosea un layout de UI.prosemetemax-width,margin-topen headings y otras decisiones que pelean con cualquier grid de aplicación. Resérvalo a contenedores de contenido. - Olvidar
max-w-none. Si tu artículo ya está dentro de unmax-w-3xl, el65chpor defecto deproselo encoge aún más. - Pelear con
prose-code. Por defecto añade comillas (``) alrededor del código inline. Quítalas conprose-code:before:content-none prose-code:after:content-none. - Mezclar dos sistemas tipográficos. Si la página ya usa la escala fluida de FDS para los headings, no apliques
proseencima: elige uno. - Esperar que
proseafecte a clases utilitarias.prosesolo estiliza elementos HTML "desnudos" (sin clases). Un<h2 class="text-xl">mantienetext-xlyproseno lo toca.
Referencia rápida
| Necesidad | Solución |
|---|---|
| Escala más grande | prose-lg, prose-xl, prose-2xl |
| Dark mode | dark:prose-invert |
| Cambiar color de enlaces | prose-a:text-primary-600 |
| Headings con font display | prose-headings:font-display |
Sin comillas en code inline | prose-code:before:content-none prose-code:after:content-none |
| Imágenes con radio | prose-img:rounded-xl |
| Excluir un bloque | class="not-prose" |
| Quitar el ancho máximo | max-w-none |
Más info
Documentación oficial del plugin: tailwindcss-typography en GitHub.