A tu propio ritmo

Explora nuestra extensa colección de cursos diseñados para ayudarte a dominar varios temas y habilidades. Ya seas un principiante o un aprendiz avanzado, aquí hay algo para todos.

Bootcamp

Aprende en vivo

Únete a nosotros en nuestros talleres gratuitos, webinars y otros eventos para aprender más sobre nuestros programas y comenzar tu camino para convertirte en desarrollador.

Próximos eventos en vivo

Catálogo de contenidos

Para los geeks autodidactas, este es nuestro extenso catálogo de contenido con todos los materiales y tutoriales que hemos desarrollado hasta el día de hoy.

Tiene sentido comenzar a aprender leyendo y viendo videos sobre los fundamentos y cómo funcionan las cosas.

Buscar en lecciones


← Regresar a lecciones

Construyendo UIs Accesibles con Shadcn UI en React

¿Por Qué Elegir Shadcn UI?
Ejemplos de Componentes Esenciales

Shadcn UI proporciona una forma única de construir interfaces React. En lugar de instalar un paquete de biblioteca de componentes típico, copias código de componentes accesibles y bellamente diseñados directamente en tu proyecto. Esto te da control total sobre el estilo y el comportamiento.

Aquí hay un ejemplo simple usando el componente Button de Shadcn UI:

Loading...

¿Por Qué Elegir Shadcn UI?

Shadcn UI se destaca porque combina:

  • Accesibilidad: Construido usando primitivas de Radix UI, asegurando que los componentes sean accesibles desde el principio.
  • Estilo: Usa Tailwind CSS para un estilo de primera utilidad (utility-first), haciendo la personalización intuitiva.
  • Control: Eres dueño del código. Los componentes se copian a tu base de código (por ejemplo, mediante un comando CLI como npx shadcn-ui@latest add button), no se instalan como una dependencia. Esto significa que no hay conflictos de versiones y total libertad para modificar.

Diferencias Clave con Bibliotecas Tradicionales:

CaracterísticaBibliotecas TradicionalesShadcn UI
InstalaciónDependencia de PaqueteCopiar y pegar código en proyecto
ActualizacionesGestionar versionesActualizar código manualmente (si es necesario)
PersonalizaciónA menudo LimitadaAcceso completo al código
PropiedadDependencia externaEres dueño del código del componente

Ejemplos de Componentes Esenciales

Shadcn UI ofrece una variedad de componentes. Los añades a tu proyecto según sea necesario usando su herramienta CLI.

Cards (Tarjetas)

Usa Cards para estructurar secciones de contenido:

1import { 2 Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle 3} from "@/components/ui/card"; // Asumiendo ruta por defecto 4import { Button } from "@/components/ui/button"; 5 6function ProfileCard() { 7 return ( 8 <Card className="w-[350px]"> 9 <CardHeader> 10 <CardTitle>Perfil de Usuario</CardTitle> 11 <CardDescription>Ver y gestionar tu información.</CardDescription> 12 </CardHeader> 13 <CardContent> 14 <p>Los detalles sobre el usuario van aquí.</p> 15 </CardContent> 16 <CardFooter className="flex justify-end space-x-2"> 17 <Button variant="outline">Cancelar</Button> 18 <Button>Guardar Cambios</Button> 19 </CardFooter> 20 </Card> 21 ); 22}

Dialogs (Diálogos Modales)

Crea diálogos modales accesibles para acciones o información:

1import { 2 Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger 3} from "@/components/ui/dialog"; // Asumiendo ruta por defecto 4import { Button } from "@/components/ui/button"; 5 6function DeleteConfirmation() { 7 return ( 8 <Dialog> 9 <DialogTrigger asChild> 10 <Button variant="destructive">Eliminar Cuenta</Button> 11 </DialogTrigger> 12 <DialogContent> 13 <DialogHeader> 14 <DialogTitle>¿Estás absolutamente seguro?</DialogTitle> 15 <DialogDescription> 16 Esta acción no se puede deshacer. Esto eliminará permanentemente la cuenta. 17 </DialogDescription> 18 </DialogHeader> 19 <DialogFooter> 20 <Button variant="outline">Cancelar</Button> 21 <Button variant="destructive">Confirmar Eliminación</Button> 22 </DialogFooter> 23 </DialogContent> 24 </Dialog> 25 ); 26}

Integración de Formularios

Los componentes de Shadcn UI se integran sin problemas con bibliotecas de formularios como React Hook Form, a menudo usando Zod para la validación.

1import { zodResolver } from "@hookform/resolvers/zod"; 2import { useForm } from "react-hook-form"; 3import * as z from "zod"; 4import { Button } from "@/components/ui/button"; 5import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"; 6import { Input } from "@/components/ui/input"; 7 8// 1. Definir esquema de validación 9const formSchema = z.object({ 10 username: z.string().min(3, "El nombre de usuario debe tener al menos 3 caracteres.").max(50), 11}); 12 13function ProfileForm() { 14 // 2. Inicializar formulario 15 const form = useForm<z.infer<typeof formSchema>>({ 16 resolver: zodResolver(formSchema), 17 defaultValues: { username: "" }, 18 }); 19 20 // 3. Manejar envío 21 function onSubmit(values: z.infer<typeof formSchema>) { 22 console.log("Formulario enviado:", values); 23 // Añadir lógica de envío real aquí 24 } 25 26 // 4. Construir la UI del formulario 27 return ( 28 <Form {...form}> 29 <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-6 w-[350px]"> 30 <FormField 31 control={form.control} 32 name="username" 33 render={({ field }) => ( 34 <FormItem> 35 <FormLabel>Nombre de Usuario</FormLabel> 36 <FormControl> 37 <Input placeholder="Introduce tu nombre de usuario" {...field} /> 38 </FormControl> 39 <FormMessage /> 40 </FormItem> 41 )} 42 /> 43 <Button type="submit">Actualizar Perfil</Button> 44 </form> 45 </Form> 46 ); 47}

Personalizando Shadcn UI

Tematización con Variables CSS

Personaliza la apariencia modificando las variables CSS en tu archivo CSS global (p.ej., globals.css o index.css):

1/* Ejemplo de globals.css */ 2@tailwind base; 3@tailwind components; 4@tailwind utilities; 5 6@layer base { 7 :root { 8 --background: 0 0% 100%; /* Fondo modo claro */ 9 --foreground: 222.2 84% 4.9%; /* Texto modo claro */ 10 /* ... otras variables principales ... */ 11 --primary: 222.2 47.4% 11.2%; 12 --primary-foreground: 210 40% 98%; 13 /* ... más variables para bordes, inputs, anillos etc. ... */ 14 --radius: 0.5rem; /* Radio del borde */ 15 } 16 17 .dark { 18 --background: 222.2 84% 4.9%; /* Fondo modo oscuro */ 19 --foreground: 210 40% 98%; /* Texto modo oscuro */ 20 /* ... sobrescribir otras variables para modo oscuro ... */ 21 --primary: 210 40% 98%; 22 --primary-foreground: 222.2 47.4% 11.2%; 23 /* ... */ 24 } 25}

Modificando el Código del Componente

Como eres dueño del código del componente, puedes editar directamente los archivos (normalmente dentro de un directorio components/ui) para cambiar la estructura, estilos o comportamiento. Por ejemplo, añadiendo una variante personalizada al Button:

1// Dentro de components/ui/button.jsx (ruta de ejemplo) 2import { cva } from "class-variance-authority"; 3 4export const buttonVariants = cva( 5 "inline-flex items-center justify-center ...", // Clases base 6 { 7 variants: { 8 variant: { 9 default: "bg-primary text-primary-foreground hover:bg-primary/90", 10 destructive: "...", 11 outline: "...", 12 secondary: "...", 13 ghost: "...", 14 link: "...", 15 // Añade tu variante personalizada 16 success: "bg-green-600 text-white hover:bg-green-700", 17 }, 18 size: { 19 default: "h-10 px-4 py-2", 20 sm: "h-9 rounded-md px-3", 21 lg: "h-11 rounded-md px-8", 22 icon: "h-10 w-10", 23 }, 24 }, 25 defaultVariants: { 26 variant: "default", 27 size: "default", 28 }, 29 } 30); 31 32// ... resto del componente Button ...

Mejores Prácticas

  • Organización: Mantén los componentes de Shadcn UI (normalmente en components/ui) separados de los componentes personalizados de tu aplicación.
  • Accesibilidad: Aunque Shadcn/Radix proporcionan una base sólida, siempre prueba tu implementación en cuanto a accesibilidad (navegación por teclado, lectores de pantalla, HTML semántico).
  • Actualizaciones: Revisa periódicamente la documentación de Shadcn UI en busca de actualizaciones o mejoras en los componentes que usas. Necesitarás copiar manualmente los cambios si lo deseas.

Conclusión

Shadcn UI ofrece un enfoque pragmático para los desarrolladores de React que desean control y personalización sin construir todo desde cero. Al aprovechar Tailwind CSS y Radix UI, proporciona una base para interfaces de usuario hermosas, accesibles y mantenibles directamente dentro de la base de código de tu proyecto.

Recursos Adicionales

  • Documentación de Shadcn UI
  • Primitivas de Radix UI (Componentes accesibles subyacentes)
  • Documentación de Tailwind CSS