Saltar al contenido

Button

Beta

La acción principal de una interfaz. Cuatro estilos, cuatro tamaños, dos radios y cuatro modos de icono.

Playground

Configurá el botón y copiá el snippet — el código se genera desde el mismo estado que renderiza el preview.

Variant
Size
Radius
Icono
Label
<Button>Inscribirme</Button>

Jerarquía de estilos

Cada sección de una página tiene un solo Fill (la acción principal). El resto acompaña: Stroke para secundarias fuertes, Tonal para secundarias suaves, Text para terciarias y links.

Tamaños

El alto no es un número mágico: es padding del cuerpo + contenido, como en Figma. El label lleva su propio padding horizontal, y el icono ocupa un contenedor del alto interno.

SizeAltoPadding cuerpoLabelGlifoTipografía
sm32424 / px 816text-sm
md40628 / px 1020text-md
lg48832 / px 1224text-md
xl641240 / px 1624text-lg

Radius

El radio lo decide el contexto de la página, no el gusto: Full para superficies de marketing y vida estudiantil, Semi para lo institucional (radius token por tamaño: 6–12 px). Nunca mezcles radios dentro de una misma sección.

Iconos

Cuatro modos, como en el component set de Figma:

  • inside (default) — el glifo directo, en el color del label.
  • pill — el glifo sobre un círculo de fondo (siempre redondo, incluso con radius semi). En Fill el círculo es claro y el glifo trackea el color de fondo del botón; en el resto el círculo es Primary/9 con glifo claro.
  • outside — un círculo flotante del alto total del botón, separado 4 px del cuerpo, que replica el estilo del cuerpo (con semi se vuelve cuadrado redondeado). En Text no hay cuerpo: usa los círculos del pill.
  • iconOnly — solo el glifo; en Text queda desnudo, sin caja.

iconLeft y iconRight aceptan cualquier icono y pueden combinarse.

Cuándo usarlo

  • — para acciones: enviar, inscribirse, confirmar, abrir un flujo.
  • pill y outside para CTAs de marketing donde el botón es protagonista; inside para UI de producto.
  • — icon-only para acciones de utilidad reconocibles (buscar, cerrar), siempre con aria-label.
  • No — para navegar a otra página dentro del contenido: eso es un link (variant="text" existe justamente para esa zona gris).
  • No — más de un Fill por sección; si todo es principal, nada lo es.

Accesibilidad

  • El focus ring (Primary/8, 2px) viene incluido — en modo outside envuelve cada pieza (cuerpo y círculos), como en Figma. No lo quites ni lo tapes.
  • Todo el conjunto (círculos flotantes incluidos) es un solo botón: un target de click, un stop de tab.
  • disabled baja la opacidad a 0.38 y bloquea el pointer; si la acción puede volver a habilitarse, explicá cómo cerca del botón.
  • En icon-only el aria-label es obligatorio.

Props

PropTipoDefaultDescripción
variant"fill" | "stroke" | "tonal" | "text""fill"Jerarquía visual del botón.
size"sm" | "md" | "lg" | "xl""md"Altura 32 / 40 / 48 / 64 px, con tipografía y padding acordes.
radius"full" | "semi""full"Full = pill; Semi usa el radius token del tamaño (6–12 px).
iconMode"inside" | "pill" | "outside""inside"Cómo se presentan iconLeft/iconRight: directo, con círculo de fondo, o flotante fuera del cuerpo.
iconLeftReactNodeIcono antes del label.
iconRightReactNodeIcono después del label.
iconOnlyReactNodeSolo icono; requiere aria-label. Oculta el label e ignora iconMode.
disabledbooleanfalseOpacidad 0.38 + pointer-events bloqueados.