Instalación
nuvo-ui copia los componentes directamente en tu proyecto. Sin dependencia npm que no controlas — el código es tuyo desde el primer día.
Inicio rápido
# 1. Inicializar (crea nuvo-ui.json con tu config)
pnpm dlx nuvo-ui init
# 2. Agregar los componentes que necesitas
pnpm dlx nuvo-ui add button data-table sidebar chart
# 3. Listo — el código está en components/ui/Variables CSS requeridas
Todos los tokens de color derivan de estas variables. Pégalas en tu globals.css.
@layer base {
:root {
--background: 0 0% 100%;
--foreground: 222.2 84% 4.9%;
--primary: 221.2 83.2% 53.3%;
--primary-foreground: 210 40% 98%;
--muted: 210 40% 96.1%;
--muted-foreground: 215.4 16.3% 46.9%;
--border: 214.3 31.8% 91.4%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 210 40% 98%;
--ring: 221.2 83.2% 53.3%;
--radius: 0.5rem;
}
.dark {
--background: 222.2 84% 4.9%;
--foreground: 210 40% 98%;
--primary: 217.2 91.2% 59.8%;
--primary-foreground: 222.2 47.4% 11.2%;
--muted: 217.2 32.6% 17.5%;
--muted-foreground: 215 20.2% 65.1%;
--border: 217.2 32.6% 17.5%;
--destructive: 0 62.8% 30.6%;
--destructive-foreground: 210 40% 98%;
}
}Configuración de Tailwind
Agrega los tokens y el path de los componentes a tu tailwind.config.
// tailwind.config.ts
export default {
content: [
"./src/**/*.{ts,tsx}",
"./components/**/*.{ts,tsx}", // donde el CLI copia los archivos
],
theme: {
extend: {
colors: {
border: "hsl(var(--border))",
background: "hsl(var(--background))",
foreground: "hsl(var(--foreground))",
primary: {
DEFAULT: "hsl(var(--primary))",
foreground: "hsl(var(--primary-foreground))",
},
muted: {
DEFAULT: "hsl(var(--muted))",
foreground: "hsl(var(--muted-foreground))",
},
destructive: {
DEFAULT: "hsl(var(--destructive))",
foreground: "hsl(var(--destructive-foreground))",
},
ring: "hsl(var(--ring))",
},
},
},
plugins: [require("tailwindcss-animate")],
}Componentes disponibles
37 componentes, agrupados por categoría.
button6 variantes, 4 tamaños, asChild
checkboxAccesible, con label, descripción e indeterminate
date-pickerSelector de fecha con calendario custom, sin dependencias
dynamic-filterFiltros configurables por JSON (7 tipos de campo)
file-uploadDrag & drop con preview y validación de tamaño
inputLabel, helper text, validación inline
radioRadioGroup + Radio con label y descripción
selectGrupos, placeholder, MultiSelect con checkboxes
switchToggle accesible con label y descripción
textareaLabel, helper text, variantes error/success