Tailwind v4 para utilidades, shadcn/ui para componentes. Por qué este combo es el default para SaaS en 2026 y cómo encajarlo bien.
En 2026 el debate "¿librería de componentes o utilidades?" ya no tiene sentido. La respuesta es Tailwind v4 para utilidades + shadcn/ui para componentes. No es un trade-off: son dos piezas que encajan.
Esta guía explica por qué este combo se ha convertido en el default y cómo encajarlo bien en un SaaS Next.js.
Tailwind v4 (2025) trajo cambios fuertes:
tailwind.config.js salvo edge cases)@theme para definir tu paleta directamente en CSSEjemplo de globals.css:
@import 'tailwindcss';
@theme {
--color-brand: #d62828;
--font-display: 'Inter', sans-serif;
--radius-card: 0.75rem;
}Y en cualquier sitio:
<button className="bg-brand rounded-card text-white">Click</button>Sin configurar, sin importar nada extra.
shadcn/ui es un sistema raro y genial. No es una librería que instalas (npm install). Es componentes que copias a tu repo.
bunx shadcn@latest add button
bunx shadcn@latest add dialogEl comando crea el archivo src/shared/components/ui/button.tsx en tu repo. A partir de ahí, es
tuyo: lo modificas, lo extiendes, lo borras. No hay update que rompa porque no hay paquete que
versione.
Ventajas:
Desventaja: si un componente se actualiza, tienes que decidir manualmente si quieres mergear los cambios.
Mi flujo típico en un nuevo proyecto:
bunx shadcn@latest initPara componentes específicos del dominio (un BlogPostCard, un ProjectKanbanColumn), los hago yo con Tailwind directamente. Para todo lo "plataforma" (botones, inputs, modales), shadcn/ui.
Si necesitas variaciones del Button, no creas BotónPrimario, BotónSecundario, BotónPeligro copiando código. Extiendes:
import { Button } from '@/shared/components/ui/button';
export function DangerButton(props: React.ComponentProps<typeof Button>) {
return <Button variant="destructive" {...props} />;
}O añades una variante al button.tsx con cva. Mantienes una sola fuente.
Tailwind v4 + shadcn/ui traen dark mode integrado. Con next-themes:
import { ThemeProvider } from 'next-themes';
<ThemeProvider attribute="class" defaultTheme="system">
{children}
</ThemeProvider>;Y todos los componentes shadcn ya respetan dark: automáticamente. No tienes que escribir CSS
extra.
1. Mezclar shadcn con MUI / Chakra: si tienes ya un Material UI a medias, no añadas shadcn encima. Decide uno y migra. Tener dos sistemas duplica todo.
2. Sobre-personalizar button.tsx: si haces 800 líneas de variantes, la idea de "código a mi
gusto" se vuelve "código que da miedo tocar". Mantén pequeño.
3. No usar variables CSS para tokens: si tu marca usa #D62828 en 47 sitios hardcoded, el día
que cambia el rebrand lloras. Defínelo en @theme.
4. Olvidar el plugin de Tailwind para Prettier: sin él, las clases largas se vuelven un
infierno. prettier-plugin-tailwindcss ordena las clases automáticamente.
Para el 90% de SaaS indie, shadcn/ui cubre la base.
Tailwind v4 + shadcn/ui es la combinación con mejor ratio velocidad / control / mantenimiento para SaaS en 2026. Setup en una tarde, control sobre el código, sistema de diseño coherente.
Si tu boilerplate todavía usa Bootstrap o MUI, mira shadcn. La diferencia en DX desde el día 1 es notable.
Suscríbete para más tutoriales y tips sobre crear productos con IA
El 25 abr 2026 MinIO archivó su community edition. Migramos producción de Click2Eat y yamltools.dev a Garage self-host (S3-compatible, AGPLv3). Cuatro escollos no documentados, el patrón S3 API compartido + CDN dedicado por producto, y checklist de migración completo.