MeDo

Generador de Botones con IA.

Describe tu marca y MeDo genera todo el sistema de botones — variantes primaria, secundaria, ghost y destructiva, tres tamaños, más estados hover, foco, carga y deshabilitado. Un prompt, un conjunto coherente.

Botón
Botón

Los botones representan cerca de una cuarta parte de cualquier sistema de diseño

Ningún componente se usa más. Cada envío de formulario, cada CTA, cada diálogo de confirmación pasa por un botón — y por eso la inconsistencia aquí se nota tanto. Diez botones ligeramente distintos en un producto se perciben como descuido mucho antes de que alguien pueda explicar por qué. Generar todo el conjunto de una vez, a partir de una sola descripción, hace que las variantes compartan escala de espaciado, radio y tratamiento de foco por construcción y no por disciplina.

6 plantillas

Plantillas de Botón que puedes generar

Cada plantilla es un prompt real, no una captura de pantalla. Cópialo en cualquier editor de IA o ejecútalo en MeDo y obtén código React + Tailwind.

BasicVariant Set

Four Roles, Three Sizes

The set you generate first and edit for a year. Roles rather than colors, so a rebrand moves one token instead of forty class strings.

Create a reusable button component with four role-based variants: primary as a solid brand fill with white text, secondary as a white surface with a grey border, ghost as transparent with a tinted background on hover, and destructive as a solid red. Support sm at 32px tall, md at 40px and lg at 48px, plus a fullWidth prop. Wire hover, active, focus-visible, disabled and loading states for every variant, keeping the focus ring on focus-visible only so mouse clicks do not draw it. Render a real button element with an explicit type attribute, and drive all four variants from one shared spacing and radius scale rather than per-variant values.

Prueba en MeDo
IconsIcon + Label

Leading and Trailing Icon Slots

Two slots, one gap token. Most icon bugs are spacing bugs — an icon glued to its label, or optically misaligned because the SVG box is taller than the cap height.

Extend a button component with optional leading and trailing icon slots. Size the icon to 16px at sm and md and 18px at lg, set a consistent 8px gap between icon and label, and add aria-hidden="true" to the icon so screen readers announce the label only. Flip the slot order automatically under a right-to-left direction. Use inline-flex with items-center so the icon aligns to the label cap height rather than the line box, and give the SVG shrink-0 so a long wrapping label cannot squash it. Accept any React node so a spinner or an avatar can occupy the same slot.

Prueba en MeDo
LoadingAsync Submit

Loading Button With a Locked Width

A submit button that shrinks when the spinner replaces the label makes the whole form jump. Reserve the width and the click feels instant instead of broken.

Create a submit button with a loading prop. While loading, replace the label with a centered spinner but keep the button at its resting width by rendering the label at zero opacity underneath the spinner rather than removing it from the DOM. Set aria-busy="true" and aria-disabled="true", block repeat submissions, and keep the button focusable so a screen reader can still read the pending state. Respect prefers-reduced-motion by swapping the rotating spinner for a static pulsing dot. Add an optional loadingText prop that announces progress through a polite live region instead of changing the visible label.

Prueba en MeDo
ToolbarIcon Only

Square Icon Button With a Tooltip

Dense toolbars need it, and it fails accessibility more often than any other button. No visible text means the accessible name has to come from somewhere explicit.

Create an icon-only button for a dense toolbar: a square target at 32px, 36px and 40px with the icon centered and no label. Require an ariaLabel prop and render it as aria-label on the button, since there is no visible text to name the control. Expand the hit area to at least 44px with a negative-margin pseudo-element so touch targets meet the minimum without widening the toolbar. Pair it with a tooltip that appears on hover and on keyboard focus, referenced with aria-describedby so the tooltip supplements the label rather than replacing it. Include a pressed state driven by aria-pressed for toggle uses.

Prueba en MeDo
GroupSplit Action

Split Button With a Menu Half

One default action plus a menu of alternates — Save and Save as, Deploy and Deploy to staging. Two buttons that must look like one and stay independently reachable.

Create a split button: a primary action on the left and a narrow chevron trigger on the right, joined into one visual unit with a 1px divider, the outer corners rounded and the inner corners square. Render them as two separate button elements so each keeps its own accessible name, giving the chevron a label such as "More save options". Wire the chevron to a menu with aria-haspopup="menu" and aria-expanded, opening on click and on ArrowDown, closing on Escape with focus returned to the trigger. Keep the focus ring visible on each half by drawing it outside the shared border rather than inside it.

Prueba en MeDo
PolymorphicLink as Button

Anchor With Button Styling

A styled div with an onClick is not a button and a button that navigates is not a link. One asChild prop keeps the styling while the correct element still ships.

Create a polymorphic button that accepts an asChild prop and forwards its variant, size and state classes onto a child element, so a Next.js Link or a plain anchor can carry button styling without nesting an interactive element inside a button. Forward the ref, merge className rather than overwriting it, and skip the type attribute when the rendered element is not a button. When the target is an anchor, omit the disabled attribute — which anchors ignore — and instead drop href and set aria-disabled with pointer-events none. Add an external variant that appends rel="noopener noreferrer" and a visually hidden "opens in a new tab" note.

Prueba en MeDo

Cómo personalizar tu Botón

Define las variantes, no solo los colores

Pide variantes por función — primary, secondary, ghost, destructive — en lugar de por color. Los nombres basados en función sobreviven a un rebranding: si cambia tu color de marca, "primary" sigue significando lo mismo y solo hay que mover un token.

Especifica el estado de carga de forma explícita

Indica que el spinner debe reemplazar la etiqueta preservando el ancho del botón. De lo contrario los botones se encogen a mitad del envío y el layout salta — uno de los fallos de acabado más comunes en la UI generada.

Pide focus-visible, no focus

Un anillo en :focus también se dispara con clics de ratón y parece un error. Solicita :focus-visible para que el anillo aparezca solo para usuarios de teclado y tecnología asistiva, que es lo que revisan las auditorías de accesibilidad.

Concreta la semántica de deshabilitado

Decide si los botones deshabilitados deben usar el atributo disabled o aria-disabled. El atributo bloquea todos los eventos, incluido el foco; aria-disabled mantiene el botón enfocable para que los lectores de pantalla puedan anunciar por qué no está disponible. Di cuál quieres.

Quién usa el componente Botón

Producto SaaS

Un botón primario para el CTA de prueba, secundario para "Reservar una demo", ghost para enlaces terciarios dentro de tarjetas y destructivo para eliminar la cuenta — todos con el mismo radio y anillo de foco para que la interfaz se lea como un solo producto.

Tienda de comercio electrónico

Un botón "Añadir al carrito" de alto contraste con estado de carga durante la comprobación de inventario, más una variante secundaria más discreta de "Guardar para después" que no compite por la atención.

Panel o herramienta de administración

Las barras densas necesitan botones pequeños solo de icono con etiquetas accesibles junto a botones de acción de tamaño estándar. Una escala de sm a lg mantiene la barra compacta sin inventar estilos puntuales.

Landing page de marketing

Un único botón primario sobredimensionado en la parte superior, repetido al final de la página, con una variante ghost para el enlace secundario "Ver cómo funciona" que desplaza en lugar de convertir.

Patrones de Botón para distintos sitios web

El mismo componente botón, adaptado al tipo de sitio donde se publica.

01 / 06

SaaS Product Buttons

One primary per screen is the rule that keeps a product feeling directed. Everything else drops to secondary or ghost, and destructive stays reserved for irreversible actions so a red button always means the same thing. The moment two primaries appear in one view, users start reading the layout instead of acting on it.

Estilos y variantes de Botón

Elige la variante que encaje con el resto de la página y genérala.

01 / 06

Solid Button

A filled surface with white or near-white text, carrying the highest visual weight on the page. Check the contrast against the fill rather than the page background, and remember that a lightened hover state can quietly drop a passing 4.5:1 pairing below the line.

Botón en React, Next.js, Vue y Svelte

React, Next.js, Vue 3, SvelteKit, Astro o HTML puro: el mismo botón, seis formas de integrarlo.

01 / 06

React Button

Derive the class string from variant and size lookups instead of chained ternaries, and forward the ref so tooltips and popovers can anchor to the element. Spread the remaining props last so a caller can still pass type or aria attributes through.

src/components/Button.tsx

export const Button = forwardRef(function Button(
  { variant = 'primary', size = 'md', loading, ...props },
  ref
) {
  return (
    <button
      ref={ref}
      type="button"
      aria-busy={loading}
      className={cn(base, variants[variant], sizes[size])}
      {...props}
    />
  )
})

Cómo añadir tu Botón a un proyecto

Cuatro pasos, desde elegir una plantilla de botón hasta llevarlo a producción.

01~30s

Pick a Button Template

Scan the six templates and start from the closest surface — the full variant set for a design system, the async submit for a form, the icon-only for a toolbar.

02~10s

Copy the Prompt

Take the prompt into MeDo, Lovable, Bolt, v0 or Cursor. Swap in your brand color, radius and font before you run it, since those three values are what every variant inherits.

03~1min

Generate and Refine

You get React + Tailwind back with a live preview. Follow up in plain English — "add an xs size", "make the disabled state use aria-disabled" — rather than hand-editing the class lookups.

04~2min

Replace Your Ad-Hoc Buttons

Import one Button and delete the one-off styles it supersedes. The value is in the variants sharing a spacing scale and focus ring by construction, which only holds if nothing else on the page is styling its own button.

Preguntas frecuentes sobre Botón

¿Cómo genero un componente de botón con IA?

Describe las variantes, tamaños y estados que necesitas en un solo prompt — por ejemplo "variantes primaria, secundaria y ghost en tres tamaños con estados hover, disabled y loading" — y MeDo genera el componente completo con todas las combinaciones conectadas. Obtienes un archivo que cubre todo el conjunto en lugar de un botón fijo.

¿Qué variantes de botón debe tener un sistema de diseño?

La mayoría de productos necesitan cuatro: primary para la acción más importante de la pantalla, secondary para acciones de apoyo, ghost o terciaria para acciones de baja jerarquía en interfaces densas y destructive para lo irreversible. Añadir más variantes suele indicar un problema de jerarquía, no un estilo que falte.

¿Puede la IA generar botones accesibles?

Sí. MeDo renderiza elementos button reales con atributo type explícito, anillos focus-visible, nombres accesibles para botones solo de icono y estados deshabilitados que los lectores de pantalla anuncian correctamente. Menciona la accesibilidad en tu prompt y también añadirá aria-busy durante la carga.

¿Cómo añado un estado de carga a un botón?

Pide una prop loading que cambie la etiqueta por un spinner manteniendo fijo el ancho del botón, desactive la interacción y establezca aria-busy para que la tecnología asistiva anuncie el estado pendiente. Fijar el ancho es la parte que se olvida — sin ella la página se recompone en cada clic.

¿Un botón debe ser un botón o un enlace?

Si navega, debe ser un anchor; si ejecuta una acción, debe ser un botón. Dile a MeDo qué comportamiento quieres y renderizará el elemento correcto, con una salida de escape tipo asChild cuando necesites el estilo de botón sobre un enlace de enrutado.

¿Puedo generar botones que encajen con mi marca actual?

Sí. Indica en el prompt tu color de marca, radio de esquinas, tipografía y cualquier escala de espaciado existente, y las variantes generadas los usarán de forma coherente. También puedes pegar un botón de tu código y pedir a MeDo que lo amplíe a un conjunto completo de variantes.