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
classNamestringClases adicionales
...propsButtonHTMLAttributesTodas 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