MeDo

Générateur de Badge IA.

Décrivez vos états et MeDo génère l'ensemble complet de badges — pastilles de statut sémantiques, tags supprimables, compteurs numériques avec débordement 99+ et indicateurs en point qui se posent sur un avatar sans être rognés.

Badge
Badge

Le badge est le plus petit composant avec le plus fort risque de casser la mise en page

Les badges vivent à l'intérieur d'autres éléments : cellules de tableau, lignes de liste, éléments de navigation, titres. Leur hauteur intrinsèque devient donc une dépendance de mise en page plutôt qu'un choix de style. Un badge dont la line-height dépasse d'un pixel le texte voisin étirera silencieusement chaque ligne d'un tableau, et le bug sera signalé comme « le tableau s'affiche mal » et non comme un problème de badge. Verrouiller le badge sur une hauteur et une line-height fixes, au lieu de laisser le padding et les métriques de police décider, est ce qui le rend intégrable sans risque. Générer l'ensemble d'un coup garantit par construction que chaque ton et chaque taille partagent cette échelle de hauteur.

6 modèles

Modèles de Badge 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.

BasicStatus Pill

Five-Tone Status Pill

The one you need first. Generating all five tones together is what keeps them on a single height scale, which is what makes the badge safe to drop into a table cell.

Create a status badge with five semantic tones — neutral grey, info blue, success green, warning amber, error red — each pairing a tinted background with a darker text color at 4.5:1 or better. Give it two sizes: sm at 18px tall with 11px text, md at 22px tall with 12px text, both at a 999px radius with 8px horizontal padding, a fixed line-height and inline-flex with align-items center, so a badge dropped into a table cell cannot change the row height. Always render a text label — the tone is redundant encoding, never the only signal. Render it as a span with no tabindex and no role, because a status badge is read-only output and adding a focus stop for it clutters keyboard navigation through a table.

Tester dans MeDo
NumericCount Badge

Notification Count With 99+ Clamping

A number, a min-width so single digits stay circular, and an announcement when it changes. Without the min-width the badge visibly changes shape as the count crosses from 9 to 10.

Create a numeric count badge that clamps displayed values above 99 to "99+" while keeping the true count in the accessible name. Set min-width equal to the badge height so a single digit renders as a circle rather than a narrow oval, use tabular-nums so the width does not jitter between values, and hide the badge entirely at zero rather than rendering an empty circle. Wrap the count in an element with role="status" and aria-live="polite" so an update is announced without interrupting, and phrase the accessible text as "3 unread messages" rather than a bare numeral. Do not use aria-live="assertive" — a count change almost never justifies cutting off whatever is being read.

Tester dans MeDo
AnchoredDot Indicator

Dot on an Icon or Avatar

An 8px circle overhanging the corner of a bell or an avatar. The failure is always the same: the wrapper has overflow: hidden for its rounding and clips the dot in half.

Create a dot indicator that anchors to the top-right of an icon or avatar: an 8px circle positioned absolutely with a small negative offset so it overhangs the edge, plus a 2px ring in the page surface color so it stays legible over a photo or a busy icon. Give the wrapper position: relative and explicitly no overflow: hidden — if the wrapper needs rounding, move the border-radius to an inner element so the dot is not clipped. Because a bare dot conveys nothing to a screen reader or a colorblind user, pair it with a visually hidden label naming the state or count. Mark the dot itself aria-hidden="true" so the label is announced once.

Tester dans MeDo
InteractiveRemovable Tag

Tag Chip With a Dismiss Button

The only variant that is a control rather than output. A dismiss glyph inside a div is why so many UIs ship tags a keyboard user cannot remove.

Create a removable tag chip: a label plus a dismiss control that is a real button element, not a span with a click handler, with aria-label naming the specific tag such as "Remove design" rather than a generic "Remove". Give the button a 16px glyph inside a 24px hit area, a visible focus ring, and Backspace or Delete as an alternative to Enter when it has focus. After removal, move focus to the next remaining chip, or to the group container when the last one is removed, so focus never lands on a detached node. Announce the removal through a polite live region. Keep the chip on the same height scale as the status badge so a row mixing both stays aligned.

Tester dans MeDo
With iconIcon + Label

Badge With a Leading Status Icon

A 12px glyph before the label for states that need to be identifiable in peripheral vision — a spinner for running, a check for passed, an octagon for failed in a CI list.

Create a badge variant with a 12px leading icon before the label, one distinct glyph per state so severity survives in grayscale: a check for passed, a spinning arc for running, an octagon for failed, a clock for queued. Mark the icon aria-hidden="true" since the label already carries the meaning. Keep the icon optically aligned to the text baseline rather than centered on the line box, and hold the overall badge height identical to the icon-less variant so a mixed column in a table does not develop two row heights. For the running state, drive the spin with a CSS animation and replace it with a static arc under prefers-reduced-motion rather than removing the icon.

Tester dans MeDo
SubtleOutline Badge

Bordered Badge for Dense Tables

A 1px border with a transparent fill, for screens where a column of tinted pills turns the table into a heat map. Also the variant that survives a dark theme without retinting.

Create an outlined badge variant: a 1px border in the tone color, a transparent background, and label text in the same tone at a darkened step so it holds 4.5:1 against both light and dark surfaces. Match the filled variant on height, radius, padding and line-height exactly, so the two can be swapped per column without any row reflowing — account for the 1px border inside the box by using box-sizing: border-box rather than reducing the padding. Provide a variant prop with filled and outline values on one component rather than a second component. Verify the border remains visible against a hovered table row background, which is the case that usually makes outline badges disappear.

Tester dans MeDo

Comment personnaliser votre Badge

Nommez les tons par leur sens, pas par leur couleur

Demandez success, warning et error plutôt que vert, ambre et rouge. Les noms sémantiques permettent de réaccorder la palette pour le mode sombre ou une refonte de marque sans renommer chaque usage, et rendent évident le moment où un badge sert de décoration au lieu de signaler un état.

Associez toujours la couleur à un libellé

Un point rouge seul ne dit rien à un utilisateur daltonien, et absolument rien à un utilisateur de lecteur d'écran. Précisez que chaque badge de statut affiche du texte, et si vous avez réellement besoin d'un point nu, demandez un libellé visuellement masqué à côté pour que l'état soit tout de même annoncé.

Énoncez la règle de débordement des compteurs

Dites ce qui se passe au-delà de votre seuil — généralement plafonner à "99+" — et donnez au badge une min-width pour qu'un compteur à un chiffre reste un cercle et non un ovale étroit. Sans min-width, le badge change visiblement de forme au passage de 9 à 10.

Distinguez les badges statiques des chips interactifs

Un badge de statut est du texte et ne doit pas être focalisable. Un tag supprimable est un contrôle : il lui faut un vrai bouton pour la suppression, un anneau de focus et un nom accessible comme « Supprimer design ». Dites à MeDo lequel vous voulez, sinon vous obtiendrez une div qui a l'air cliquable mais reste inaccessible au clavier.

Qui utilise le composant Badge

Tableau de bord SaaS

Une colonne de statut dans un tableau affichant Actif, En attente et Échoué sous forme de pastilles teintées sur une même échelle de hauteur, si bien que passer une ligne d'Actif à Échoué change la couleur et le libellé sans décaler la ligne.

Boutique e-commerce

Une icône panier dans l'en-tête avec un badge compteur ancré à son coin supérieur droit, plafonné à "99+", plus des pastilles « Nouveau » et « Stock faible » sur les fiches produit qui réutilisent le même système de tons.

Outil de gestion de projet

Des tags supprimables sur une carte de tâche pour les étiquettes et les assignés, chacun avec un bouton de suppression accessible au clavier, à côté d'un badge de priorité statique délibérément non interactif.

Site de documentation

Des badges de version et de stabilité en ligne à côté des titres d'API — « Beta », « Déprécié », « v2.1 » — avec une line-height fixe pour ne pas étirer le titre qu'ils annotent.

Modèles de Badge pour différents sites web

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

01 / 06

SaaS Dashboards

A status column of Active, Pending and Failed pills, where the only thing that matters is that switching a row from one tone to another does not shift the row. Consider the outline variant once the table has more than about ten rows — a full column of tinted fills reads as a heat map.

Styles et variantes de Badge

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

01 / 06

Filled Status Pill

A tinted background with darker text at a 999px radius — the default, and the most legible at 11px. Keep the tint light: a saturated fill at this size makes small text harder to read exactly where the label is doing the accessibility work.

Badge en React, Next.js, Vue et Svelte

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

01 / 06

React Badge

Stateless by definition — a status badge is output, so no hooks and no client boundary. Keep the tone map outside the component so the palette can be retuned in one place instead of at each call site.

src/components/Badge.tsx

const tones = {
  neutral: 'bg-zinc-100 text-zinc-700',
  success: 'bg-emerald-100 text-emerald-800',
  error: 'bg-red-100 text-red-800',
}

export function Badge({ tone = 'neutral', size = 'md', children }) {
  return (
    <span className={`inline-flex items-center rounded-full px-2
      ${sizes[size]} ${tones[tone]}`}>
      {children}
    </span>
  )
}

Comment ajouter votre Badge à un projet

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

01~30s

Pick a Badge Variant

Decide first whether you need output or a control: a status pill and a count are read-only, a tag chip is interactive. Then pick the tone set and the two sizes you actually need.

02~10s

Copy the Prompt

Take it into MeDo, Lovable, Bolt, v0 or Cursor. Name your tones semantically — success, warning, error — not by color, so a rebrand or a dark theme does not mean renaming every usage.

03~1min

Generate and Refine

You get the whole set on one height scale with a live preview. Follow up in plain English — "add an outline variant", "clamp at 999+", "make the dot ring match a dark surface" — instead of nudging padding values.

04~2min

Drop It Into a Table and Check the Row Height

Put a badge in a real table cell and a real heading, then compare row heights against a cell without one. If anything grew, the line-height is not pinned and the fix belongs in the component, not the table.

Questions fréquentes à propos de Badge

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

Décrivez les tons et modes nécessaires dans un seul prompt, par exemple « cinq tons de statut sémantiques plus un badge compteur numérique et un tag supprimable en deux tailles ». MeDo génère l'ensemble complet partageant échelle de hauteur, rayon et padding plutôt qu'une unique pastille figée.

Quelle est la différence entre un badge et un tag ou chip ?

Un badge est une sortie en lecture seule : il rapporte un état ou un compteur et ne doit pas être focalisable. Un tag ou chip est une entrée sur laquelle l'utilisateur peut agir, généralement en la supprimant, il lui faut donc un vrai bouton, un style de focus et un nom accessible. Les traiter comme un seul composant explique pourquoi tant d'interfaces livrent des tags qu'un utilisateur au clavier ne peut pas retirer.

Un badge peut-il transmettre un statut par la couleur seule ?

Non. La WCAG 1.4.1 exige que la couleur ne soit pas le seul moyen de transmettre une information : un badge rouge sans libellé échoue pour les utilisateurs daltoniens et de lecteurs d'écran. Affichez un libellé texte, ou une icône plus un libellé visuellement masqué, à côté du ton. MeDo inclut le libellé par défaut lorsque vous décrivez les tons de façon sémantique.

Comment afficher un compteur de notifications supérieur à 99 ?

Plafonnez la valeur affichée et rendez "99+" dès que le compteur dépasse votre seuil, en conservant le nombre réel dans le nom accessible si cela compte. Associez ce plafond à une min-width égale à la hauteur du badge pour que les compteurs à un chiffre restent circulaires.

Un badge compteur doit-il annoncer ses changements aux lecteurs d'écran ?

Oui, lorsque le compteur change sans navigation de page. Enveloppez-le dans une région aria-live="polite" pour que la nouvelle valeur soit annoncée sans interrompre l'utilisateur, et gardez le texte concis — « 3 non lus » se lit mieux qu'un nombre nu. Évitez aria-live="assertive" ici, car un compteur de notifications justifie rarement de couper la lecture en cours.

Comment positionner un badge en point sur un avatar sans le rogner ?

Donnez au conteneur de l'avatar position: relative et pas d'overflow: hidden, puis positionnez le point en absolu avec un léger décalage négatif pour qu'il dépasse du cercle. Ajoutez un anneau de 2px dans la couleur de surface de la page afin que le point reste lisible sur une photo chargée. Si le conteneur rogne ses enfants, déplacez l'arrondi sur un élément interne.