guias·8 min de lectura

shadcn/ui: Guia Completa del Ecosistema

Guia practica de shadcn/ui para Next.js. Instalacion, componentes esenciales, personalizacion de temas y patrones para construir UI profesional con Tailwind CSS.

shadcn/ui: Guia Completa del Ecosistema

shadcn/ui fue la libreria de UI #1 en 2025 segun JavaScript Rising Stars. Y no es casualidad: en vez de instalar un paquete que no puedes modificar, copias los componentes directamente a tu proyecto. Son tuyos, los cambias como quieras.

Por debajo usa Radix UI para la logica de accesibilidad y Tailwind CSS para los estilos. Tu solo ves componentes limpios, accesibles y listos para personalizar.

Instalacion

bash
npx shadcn@latest init

Te hace unas preguntas sobre tu proyecto (TypeScript, alias de imports, directorio de componentes) y configura todo. Despues, agregas componentes uno por uno:

bash
npx shadcn@latest add button
npx shadcn@latest add input
npx shadcn@latest add dialog

Cada comando crea un archivo en components/ui/ que puedes abrir y modificar. No hay magia, no hay build step extra.

Componentes esenciales

Estos son los que vas a usar en practicamente cualquier proyecto:

Button

typescript
import { Button } from "@/components/ui/button";
 
// Variantes incluidas
<Button>Default</Button>
<Button variant="destructive">Eliminar</Button>
<Button variant="outline">Cancelar</Button>
<Button variant="ghost">Opcion sutil</Button>
<Button size="sm">Pequeno</Button>
<Button disabled>Deshabilitado</Button>

Input + Label

typescript
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
 
<div className="space-y-2">
  <Label htmlFor="email">Email</Label>
  <Input id="email" type="email" placeholder="tu@ejemplo.com" />
</div>

Dialog (modal)

typescript
import {
  Dialog, DialogContent, DialogDescription,
  DialogHeader, DialogTitle, DialogTrigger,
} from "@/components/ui/dialog";
 
<Dialog>
  <DialogTrigger asChild>
    <Button>Abrir modal</Button>
  </DialogTrigger>
  <DialogContent>
    <DialogHeader>
      <DialogTitle>Confirmar accion</DialogTitle>
      <DialogDescription>
        Esta accion no se puede deshacer.
      </DialogDescription>
    </DialogHeader>
    {/* Tu contenido aqui */}
  </DialogContent>
</Dialog>

Todos los componentes de shadcn/ui son accesibles por default: manejo de focus, navegacion con teclado, atributos ARIA correctos. Radix UI se encarga de eso.

Personalizar el tema

shadcn/ui usa CSS variables para los colores. Las encuentras en tu globals.css:

css
:root {
  --background: 0 0% 100%;
  --foreground: 222.2 84% 4.9%;
  --primary: 222.2 47.4% 11.2%;
  --primary-foreground: 210 40% 98%;
  --destructive: 0 84.2% 60.2%;
  /* ... mas variables */
}
 
.dark {
  --background: 222.2 84% 4.9%;
  --foreground: 210 40% 98%;
  /* ... */
}

Para cambiar el color primario de toda tu app, solo modificas una variable. Todos los componentes que usan bg-primary o text-primary se actualizan automaticamente.

Si quieres un tema custom rapido, ui.shadcn.com/themes tiene un generador visual donde eliges colores y copias el CSS.

Formularios con React Hook Form

shadcn/ui incluye componentes de formulario que se integran con React Hook Form:

bash
npx shadcn@latest add form
typescript
"use client";
 
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { z } from "zod";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import {
  Form, FormControl, FormField,
  FormItem, FormLabel, FormMessage,
} from "@/components/ui/form";
 
const schema = z.object({
  nombre: z.string().min(2, "Minimo 2 caracteres"),
  email: z.string().email("Email invalido"),
});
 
export default function ContactForm() {
  const form = useForm<z.infer<typeof schema>>({
    resolver: zodResolver(schema),
  });
 
  return (
    <Form {...form}>
      <form onSubmit={form.handleSubmit((data) => console.log(data))}>
        <FormField
          control={form.control}
          name="nombre"
          render={({ field }) => (
            <FormItem>
              <FormLabel>Nombre</FormLabel>
              <FormControl>
                <Input {...field} />
              </FormControl>
              <FormMessage />
            </FormItem>
          )}
        />
        <FormField
          control={form.control}
          name="email"
          render={({ field }) => (
            <FormItem>
              <FormLabel>Email</FormLabel>
              <FormControl>
                <Input {...field} />
              </FormControl>
              <FormMessage />
            </FormItem>
          )}
        />
        <Button type="submit">Enviar</Button>
      </form>
    </Form>
  );
}

Si quieres mas sobre formularios con Zod, tenemos la guia de validacion con React Hook Form y Zod y la guia de formularios dinamicos.

Componentes utiles que no son obvios

Algunos componentes de shadcn/ui que la gente no descubre hasta despues:

ComponentePara queComando
CommandPaleta de comandos tipo Cmd+Knpx shadcn@latest add command
SonnerToasts/notificaciones elegantesnpx shadcn@latest add sonner
SkeletonLoading states tipo pulsenpx shadcn@latest add skeleton
SheetPanel lateral (mobile nav, filtros)npx shadcn@latest add sheet
TabsNavegacion por pestanasnpx shadcn@latest add tabs
DataTableTabla con sort, filter, paginacionGuia en ui.shadcn.com/docs/components/data-table

Siguiente paso

shadcn/ui te resuelve la UI. Para el tema oscuro y los estilos globales de tu proyecto, Tailwind CSS es tu aliado. Y si necesitas streaming para que tus componentes no bloqueen la carga, la guia de Streaming y Suspense en Next.js cubre los patrones clave.

#shadcn-ui#tailwind#nextjs#ui#componentes#react

Preguntas frecuentes

Que es shadcn/ui?

No es una libreria de componentes tradicional. Es una coleccion de componentes que copias directamente a tu proyecto. Los archivos viven en tu codigo, puedes modificarlos como quieras, y no tienes una dependencia externa que actualizar.

shadcn/ui o Material UI para Next.js?

shadcn/ui si usas Tailwind CSS y quieres control total sobre los componentes. Material UI si necesitas un design system completo con theming avanzado y no te importa el bundle size extra. Para proyectos nuevos con Next.js, shadcn/ui es la opcion mas popular en 2026.

Puedo personalizar los estilos de shadcn/ui?

Si, completamente. Los componentes viven en tu proyecto como archivos normales. Puedes modificar colores, spacing, bordes, animaciones -- lo que necesites. No hay CSS encapsulado ni clases propietarias que pelear.

shadcn/ui funciona con Tailwind CSS 4?

Si. shadcn/ui usa CSS variables para los colores y Tailwind utility classes para el layout. Es compatible con Tailwind v3 y v4.