Ejercicio: terminar de estilar la página de detalle
El problema: funciona pero no se ve profesional
Ahora mismo tu página de detalle funciona perfectamente a nivel técnico:
- ✅ Hace fetch de los datos
- ✅ Muestra el contenido
- ✅ Renderiza el Markdown correctamente
- ✅ Tiene estados de loading y error
Pero hay un problema: se ve un poco… básica.
El contenido de markdown se renderiza con los estilos por defecto del navegador, y eso hace que:
- La tipografía parece aburrida
- Las listas son genéricas
- No hay jerarquía visual clara
- Falta ese “cariño” que hace que un proyecto se vea profesional
Este es un punto muy típico en proyectos reales: “La funcionalidad ya está, pero el diseño aún no transmite el nivel de calidad que queremos.”
El concepto de “estilos de prosa”
Cuando renderizas contenido rico (markdown, texto largo, artículos), necesitas una capa de estilos específica para ese tipo de contenido.
A esto se le llama estilos de prosa (prose styles).
¿Por qué necesitamos esto?
Porque el contenido generado por markdown tiene:
- Múltiples niveles de títulos (
h1,h2,h3) - Párrafos largos
- Listas con viñetas
- Posibles enlaces
- Código inline
Y todos estos elementos necesitan:
- Jerarquía visual clara
- Espaciado consistente
- Tipografía legible
- Ancho de línea adecuado
Añadiendo los estilos de prosa en index.css
Vamos a añadir un bloque de estilos al final de nuestro index.css para manejar todo el contenido de prosa.
El código base
Al final de tu index.css, añade:
/* Estilos de prosa para contenido de detalle */
.prose {
max-width: 70ch;
line-height: 1.7;
font-size: 1rem;
color: #111827;
}
.prose h1,
.prose h2,
.prose h3 {
font-weight: 700;
margin-bottom: 0.75rem;
margin-top: 1.5rem;
color: #111827;
}
.prose h2 {
font-size: 1.5rem;
}
.prose h3 {
font-size: 1.25rem;
}
.prose p {
margin-bottom: 1rem;
}
.prose ul,
.prose ol {
margin-left: 1.25rem;
margin-bottom: 1rem;
}
.prose ul {
list-style: disc;
}
.prose ol {
list-style: decimal;
}
.prose li {
margin-bottom: 0.5rem;
}
.prose a {
color: #0066cc;
text-decoration: underline;
}
.prose a:hover {
color: #0052a3;
}
.prose code {
background: #f3f4f6;
padding: 0.125rem 0.25rem;
border-radius: 4px;
font-size: 0.875em;
font-family: 'Courier New', monospace;
}
¿Por qué al final de index.css?
Lo ponemos al final para que estos estilos sobreescriban los estilos más genéricos que puedas tener en el archivo.
CSS funciona en cascada, por lo que el orden importa.
Aplicando los estilos en el componente
Ahora conecta estos estilos con tu componente de detalle.
En el contenedor donde renderizas el contenido markdown, añade la clase prose:
export function JobDetail() {
const { id } = useParams()
const [job, setJob] = useState(null)
// ... lógica de fetch
return (
<div className={styles.container}>
{/* Header, breadcrumb, etc. */}
<article className="prose">
{/* Aquí va el contenido en markdown ya procesado a HTML */}
<div dangerouslySetInnerHTML={{ __html: htmlContent }} />
</article>
</div>
)
}
Puntos clave
- La clase
prosese aplica en el contenedor del contenido generado por markdown - De este modo, todo lo que salga del markdown (
p,h2,h3,ul, etc.) hereda los estilos - No necesitas tocar el HTML generado: los estilos se aplican automáticamente
Pequeños detalles que marcan la diferencia
Ahora que tienes la base, es momento de afinar. Aquí hay una checklist de cosas que debes revisar:
1. Espaciado vertical
Comprueba que:
- ✅ Hay suficiente espacio entre párrafos
- ✅ Los títulos tienen más margen arriba que abajo
- ✅ El contenido respira y no está apretado
.prose h2 {
margin-top: 2rem; /* Más espacio arriba */
margin-bottom: 0.75rem; /* Menos espacio abajo */
}
2. Ancho de línea
Las líneas demasiado largas son difíciles de leer.
.prose {
max-width: 70ch; /* 70 caracteres es el estándar */
}
¿Por qué ch?
La unidad ch representa el ancho del carácter “0”. Es perfecta para medir longitud de línea porque se adapta al tamaño de fuente.
3. Listas con estilo
Si quieres listas con iconos en lugar de viñetas:
.prose ul.check {
list-style: none;
padding-left: 0;
}
.prose ul.check li {
position: relative;
padding-left: 1.5rem;
}
.prose ul.check li::before {
content: '✓';
position: absolute;
left: 0;
color: #16a34a;
font-weight: bold;
}
Y en tu markdown o HTML generado, añade la clase check a las listas especiales:
<ul class="check">
<li>Experiencia con React</li>
<li>Conocimiento de TypeScript</li>
</ul>
4. Contraste y legibilidad
Asegúrate de que:
- El color del texto tiene buen contraste con el fondo
- El tamaño de fuente es cómodo de leer (1rem o 16px mínimo)
- El line-height es generoso (1.6-1.8 para texto largo)
.prose {
color: #111827; /* Casi negro, buen contraste */
line-height: 1.7; /* Espaciado cómodo */
font-size: 1rem; /* 16px, tamaño legible */
}
Comparando con el diseño de referencia
Ahora viene la parte importante: comparar tu implementación con el diseño original.
Método de comparación
-
Abre dos ventanas lado a lado:
- En una, el diseño de referencia (el que se ve en el vídeo)
- En otra, tu aplicación
-
Detecta diferencias:
- ¿Los títulos tienen el mismo tamaño?
- ¿Las listas tienen el mismo estilo de viñeta?
- ¿El texto tiene el mismo espaciado?
- ¿Los colores son iguales?
-
Itera hasta que coincidan:
- Ajusta un detalle
- Recarga
- Compara de nuevo
- Repite
Diferencias típicas que encontrarás
- Títulos más pequeños de lo que deberían: Ajusta
font-size - Texto muy pegado al borde: Añade
paddingal contenedor - Listas con viñetas diferentes: Cambia
list-style - Colores no exactos: Usa un color picker para copiar los colores exactos
- Espaciado inconsistente: Revisa
marginypadding
El ejercicio
Tu objetivo es que la página de detalle quede exactamente igual que la del diseño de referencia.
No “más o menos”. No “parecido”. Exactamente igual.
Requisitos
-
Usar la clase
.prosepara estilizar el contenido de detalle -
Ajustar estos elementos:
- Tipografía (tamaño y peso de títulos y párrafos)
- Espaciados (márgenes y padding)
- Listas (estilo de viñetas)
- Ancho máximo del texto
- Colores
-
Comprobar la versión final comparándola pixel por pixel con el diseño de referencia
Checklist de QA
Antes de dar por terminado el ejercicio, verifica:
- Los títulos H2 y H3 tienen el tamaño correcto
- Los párrafos tienen suficiente espaciado entre ellos
- Las listas se ven igual que en el diseño
- El ancho de línea es cómodo de leer (no más de 70-80 caracteres)
- Los colores coinciden con el diseño
- El espaciado general respeta el del diseño original
- Los enlaces se distinguen del texto normal
- El hover de los enlaces funciona correctamente
Bonus tracks
Si terminas el ejercicio principal, aquí hay algunos retos adicionales:
Bonus 1: Hover mejorado en enlaces
Añade un efecto sutil al pasar el ratón sobre los enlaces:
.prose a {
color: #0066cc;
text-decoration: underline;
transition: color 0.2s ease;
}
.prose a:hover {
color: #0052a3;
text-decoration: none;
}
Bonus 2: Responsive typography
Adapta la tipografía para pantallas pequeñas:
@media (max-width: 640px) {
.prose {
font-size: 0.9375rem; /* 15px en móviles */
}
.prose h2 {
font-size: 1.25rem;
}
.prose h3 {
font-size: 1.125rem;
}
}
Bonus 3: Dark mode
Si tu app tiene modo oscuro, añade estilos para la prosa:
@media (prefers-color-scheme: dark) {
.prose {
color: #e5e7eb;
}
.prose h1,
.prose h2,
.prose h3 {
color: #f9fafb;
}
.prose a {
color: #60a5fa;
}
.prose a:hover {
color: #93c5fd;
}
.prose code {
background: #374151;
color: #e5e7eb;
}
}
Recursos útiles
Si quieres inspiración o referencias:
- Tailwind Typography: El plugin oficial de Tailwind para prosa
- Medium: Fíjate en cómo estilizan sus artículos
- GitHub: Su markdown es un buen ejemplo de legibilidad
Resumen
En esta clase hemos aprendido:
- Por qué necesitamos estilos de prosa: Para que el contenido rico se vea profesional
- Cómo aplicar estilos globales: Usando una clase
.proseenindex.css - Qué elementos ajustar: Tipografía, espaciado, listas, colores
- La importancia del detalle: Comparar pixel por pixel con el diseño original
- Cómo iterar hasta conseguir el resultado perfecto: Método de dos ventanas
La diferencia entre un proyecto amateur y uno profesional está muchas veces en estos detalles aparentemente pequeños:
- El espaciado perfecto
- La tipografía cuidada
- Los colores exactos
- La atención al detalle
Ya teníamos la funcionalidad y el markdown. Ahora tenemos una página que se ve profesional.
Es momento de practicar: abre tu editor, compara con el diseño, y ajusta hasta que quede perfecto. No te conformes con “casi”. Busca la excelencia en los detalles.