MeDo

Générateur de Boutons IA.

Décrivez votre marque et MeDo génère tout le système de boutons — variantes primaire, secondaire, ghost et destructive, trois tailles, plus les états hover, focus, chargement et désactivé. Un prompt, un ensemble cohérent.

Bouton
Bouton

Les boutons représentent environ un quart de tout système de design

Aucun composant n'est utilisé plus souvent. Chaque soumission de formulaire, chaque CTA, chaque boîte de confirmation passe par un bouton — c'est précisément pourquoi l'incohérence y est si visible. Dix boutons légèrement différents dans un produit donnent une impression de négligence bien avant que quiconque puisse l'expliquer. Générer l'ensemble d'un coup, à partir d'une seule description, garantit que les variantes partagent la même échelle d'espacement, le même rayon et le même traitement du focus par construction, et non par discipline.

6 modèles

Modèles de Bouton que vous pouvez générer

Chaque modèle est un vrai prompt, pas une capture d'écran. Copiez-le dans n'importe quel éditeur IA, ou exécutez-le dans MeDo pour récupérer du code 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.

Tester dans 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.

Tester dans 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.

Tester dans 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.

Tester dans 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.

Tester dans 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.

Tester dans MeDo

Comment personnaliser votre Bouton

Définissez les variantes, pas seulement les couleurs

Demandez des variantes par rôle — primary, secondary, ghost, destructive — plutôt que par couleur. Une nomenclature par rôle survit à un changement de marque : si votre couleur change, « primary » signifie toujours la même chose et un seul token doit bouger.

Spécifiez explicitement l'état de chargement

Précisez que le spinner doit remplacer le libellé tout en préservant la largeur du bouton. Sinon les boutons rétrécissent en pleine soumission et la mise en page saute — l'un des défauts de finition les plus courants des UI générées.

Demandez focus-visible, pas focus

Un anneau sur :focus se déclenche aussi au clic de souris et ressemble à un bug. Demandez :focus-visible pour que l'anneau n'apparaisse qu'au clavier et pour les technologies d'assistance, ce que vérifient réellement les audits d'accessibilité.

Fixez la sémantique de désactivation

Décidez si les boutons désactivés utilisent l'attribut disabled ou aria-disabled. L'attribut bloque tous les événements, y compris le focus ; aria-disabled garde le bouton focalisable pour que les lecteurs d'écran puissent annoncer pourquoi il est indisponible. Dites lequel vous voulez.

Qui utilise le composant Bouton

Produit SaaS

Un bouton primaire pour le CTA d'essai, secondaire pour « Réserver une démo », ghost pour les liens tertiaires dans les cartes et destructive pour la suppression de compte — tous avec le même rayon et le même anneau de focus, pour que l'interface se lise comme un seul produit.

Boutique e-commerce

Un bouton « Ajouter au panier » très contrasté avec état de chargement pendant la vérification du stock, plus une variante secondaire plus discrète « Enregistrer pour plus tard » qui ne lui dispute pas l'attention.

Tableau de bord ou outil d'admin

Les barres d'outils denses ont besoin de petits boutons icône seule avec des libellés accessibles, à côté de boutons d'action de taille standard. Une échelle de sm à lg garde la barre compacte sans inventer de styles ponctuels.

Page de destination marketing

Un unique bouton primaire surdimensionné au-dessus de la ligne de flottaison, répété en bas de page, avec une variante ghost pour le lien secondaire « Voir comment ça marche » qui fait défiler plutôt que convertir.

Modèles de Bouton pour différents sites web

Le même composant bouton, adapté au type de site sur lequel il est publié.

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.

Styles et variantes de Bouton

Choisissez la variante qui correspond au reste de la page, puis générez-la.

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.

Bouton en React, Next.js, Vue et Svelte

React, Next.js, Vue 3, SvelteKit, Astro ou HTML simple — le même bouton, six façons de l'intégrer.

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}
    />
  )
})

Comment ajouter votre Bouton à un projet

Quatre étapes, du choix d'un modèle de bouton à sa mise en production.

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.

Questions fréquentes à propos de Bouton

Comment générer un composant bouton avec l'IA ?

Décrivez les variantes, tailles et états nécessaires dans un seul prompt — par exemple « variantes primaire, secondaire et ghost en trois tailles avec états hover, disabled et loading » — et MeDo génère le composant complet avec toutes les combinaisons câblées. Vous obtenez un fichier couvrant tout l'ensemble plutôt qu'un bouton figé.

Quelles variantes de bouton un système de design doit-il avoir ?

La plupart des produits en ont besoin de quatre : primary pour l'action la plus importante d'un écran, secondary pour les actions de soutien, ghost ou tertiaire pour les actions à faible emphase dans une UI dense, et destructive pour tout ce qui est irréversible. Ajouter davantage de variantes signale généralement un problème de hiérarchie plutôt qu'un style manquant.

L'IA peut-elle générer des boutons accessibles ?

Oui. MeDo rend de véritables éléments button avec un attribut type explicite, des anneaux focus-visible, des noms accessibles pour les boutons icône seule et des états désactivés correctement annoncés par les lecteurs d'écran. Mentionnez l'accessibilité dans votre prompt et il ajoutera aussi aria-busy pendant le chargement.

Comment ajouter un état de chargement à un bouton ?

Demandez une prop loading qui remplace le libellé par un spinner en gardant la largeur du bouton fixe, désactive l'interaction et définit aria-busy pour que les technologies d'assistance annoncent l'état en attente. Figer la largeur est la partie qu'on oublie — sans cela la page se recompose à chaque clic.

Un bouton doit-il être un bouton ou un lien ?

S'il navigue, ce doit être un anchor ; s'il exécute une action, un button. Indiquez à MeDo le comportement voulu et il rendra le bon élément, avec une échappatoire de type asChild quand vous avez besoin du style de bouton sur un lien de routage.

Puis-je générer des boutons conformes à ma marque existante ?

Oui. Donnez à MeDo votre couleur de marque, votre rayon d'angle, votre police et toute échelle d'espacement existante dans le prompt, et les variantes générées les utiliseront de façon cohérente. Vous pouvez aussi coller un bouton existant de votre code et demander à MeDo de l'étendre en un ensemble complet de variantes.