Skip to content

Button ​

Botón con múltiples variantes y tamaños. Es el componente de acción principal de la interfaz.


Import ​

jsx
import { Button } from '@imansi/ui';

Uso básico ​

jsx
<Button>Guardar cambios</Button>

Variantes ​

jsx
<Button variant="primary">Primario</Button>
<Button variant="secondary">Secundario</Button>
<Button variant="outline">Outline</Button>
<Button variant="ghost">Ghost</Button>
<Button variant="link">Link</Button>
<Button variant="destructive">Eliminar</Button>
VarianteUso
primaryAcción principal (por defecto)
secondaryAcción secundaria con fondo sutil
outlineAcción con borde, sin fondo
ghostAcción invisible hasta el hover
linkParece un link de texto
destructiveAcción peligrosa (eliminar, cancelar)

Tamaños ​

jsx
<Button size="sm">Pequeño</Button>
<Button size="md">Mediano</Button>
<Button size="lg">Grande</Button>
<Button size="icon">🔔</Button>
TamañoAlturaUso
sm32pxInterfaces densas, tablas
md40pxPor defecto
lg48pxCTAs, formularios destacados
icon40×40Botón solo con ícono

Con íconos ​

jsx
import { Plus, ArrowRight, Trash2 } from 'lucide-react';

<Button>
  <Plus className="h-4 w-4" />
  Agregar usuario
</Button>

<Button variant="outline">
  Siguiente
  <ArrowRight className="h-4 w-4" />
</Button>

<Button variant="destructive" size="icon">
  <Trash2 className="h-4 w-4" />
</Button>

Estados ​

Deshabilitado ​

jsx
<Button disabled>Procesando...</Button>

Cargando ​

jsx
import { Loader2 } from 'lucide-react';

<Button disabled>
  <Loader2 className="h-4 w-4 animate-spin" />
  Guardando...
</Button>

Ancho completo ​

jsx
<Button className="w-full">Iniciar sesión</Button>

Props ​

PropTipoDefaultDescripción
variant'primary' | 'secondary' | 'outline' | 'ghost' | 'link' | 'destructive''primary'Estilo visual
size'sm' | 'md' | 'lg' | 'icon''md'Tamaño del botón
asChildbooleanfalseDelega el render al hijo (útil para <Link>)
disabledbooleanfalseDeshabilita el botón
classNamestring—Clases adicionales
...propsButtonHTMLAttributes—Todas las props nativas de <button>

Con React Router ​

Usá asChild para renderizar un <Link> como botón:

jsx
import { Link } from 'react-router-dom';

<Button asChild>
  <Link to="/dashboard">Ir al dashboard</Link>
</Button>

Accesibilidad ​

  • Navegable con Tab y activable con Enter / Space
  • disabled previene la interacción pero mantiene el foco
  • Focus visible con ring de --color-ring
  • Compatible con aria-label cuando no hay texto visible
jsx
<Button size="icon" aria-label="Eliminar usuario">
  <Trash2 className="h-4 w-4" />
</Button>

Hecho con ❤️ en Argentina