MeDo

Gerador de Selos com IA.

Descreva seus estados e o MeDo gera o conjunto inteiro de selos — pills de status semânticas, chips de tag removíveis, contadores numéricos com overflow 99+ e indicadores de ponto que ficam sobre um avatar sem serem cortados.

Selo
Selo

O selo é o menor componente com a maior chance de quebrar o layout

Selos vivem dentro de outras coisas: células de tabela, linhas de lista, itens de navegação, títulos. Isso faz da altura intrínseca deles uma dependência de layout, não uma escolha de estilo. Um selo cujo line-height é um pixel mais alto que o texto ao lado vai silenciosamente esticar cada linha de uma tabela, e o bug é reportado como "a tabela está estranha" em vez de como um problema de selo. Travar o selo em uma altura e um line-height fixos, em vez de deixar o padding e as métricas da fonte decidirem, é o que o mantém seguro para uso em qualquer lugar. Gerar o conjunto de uma vez significa que cada tom e cada tamanho compartilham essa escala de altura por construção.

6 modelos

Modelos de Selo que você pode gerar

Cada modelo é um prompt real, não uma captura de tela. Copie para qualquer editor de IA, ou rode no MeDo e receba código 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.

Teste no 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.

Teste no 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.

Teste no 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.

Teste no 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.

Teste no 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.

Teste no MeDo

Como personalizar seu Selo

Nomeie os tons por significado, não por cor

Peça success, warning e error em vez de verde, âmbar e vermelho. Nomes semânticos permitem reajustar a paleta para modo escuro ou um rebranding sem renomear cada uso, e deixam óbvio quando um selo está sendo usado de forma decorativa em vez de para sinalizar estado.

Sempre combine a cor com um rótulo

Um ponto vermelho sozinho não diz nada a um usuário com daltonismo, e não diz absolutamente nada a um usuário de leitor de tela. Especifique que todo selo de status renderiza texto e, se você realmente precisar de um ponto puro, peça um rótulo visualmente oculto ao lado para que o estado continue sendo anunciado.

Defina a regra de overflow para contadores

Diga o que acontece acima do seu limite — normalmente limitar a "99+" — e dê ao selo um min-width para que uma contagem de um dígito continue sendo um círculo em vez de um oval estreito. Sem min-width, o selo muda de forma visivelmente quando a contagem passa de 9 para 10.

Separe selos estáticos de chips interativos

Um selo de status é texto e não deve receber foco. Uma tag removível é um controle e precisa de um button real para a ação de dispensa, um anel de foco e um nome acessível como "Remover design". Diga ao MeDo qual você quer, ou você vai receber uma div que parece clicável mas não é alcançável pelo teclado.

Quem usa o componente Selo

Dashboard de SaaS

Uma coluna de status em uma tabela mostrando Ativo, Pendente e Falhou como pills tingidas na mesma escala de altura, de modo que mudar uma linha de Ativo para Falhou altera cor e rótulo sem deslocar a linha.

Loja de e-commerce

Um ícone de carrinho no cabeçalho com um selo de contagem ancorado no canto superior direito, limitado a "99+", além de pills de "Novo" e "Últimas unidades" nos cartões de produto que reutilizam o mesmo sistema de tons.

Ferramenta de gestão de projetos

Chips de tag removíveis em um cartão de tarefa para rótulos e responsáveis, cada um com um botão de dispensa alcançável pelo teclado, ao lado de um selo de prioridade estático que é deliberadamente não interativo.

Site de documentação

Selos inline de versão e estabilidade ao lado de títulos de API — "Beta", "Descontinuado", "v2.1" — com line-height fixo para que não estiquem o título que anotam.

Padrões de Selo para diferentes sites

O mesmo componente selo, ajustado ao tipo de site em que ele entra.

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.

Estilos e variações de Selo

Escolha a variação que combina com o resto da página e gere-a.

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.

Selo em React, Next.js, Vue e Svelte

React, Next.js, Vue 3, SvelteKit, Astro ou HTML puro — o mesmo selo, seis formas de integrar.

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

Como adicionar o seu Selo a um projeto

Quatro passos, de escolher um modelo de selo até subir para produção.

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.

Perguntas comuns sobre Selo

Como eu gero um componente de selo com IA?

Descreva os tons e modos que você precisa em um único prompt, como "cinco tons semânticos de status mais um selo de contagem numérica e um chip de tag removível em dois tamanhos". O MeDo gera o conjunto inteiro compartilhando escala de altura, raio e padding, em vez de uma única pill escrita à mão.

Qual é a diferença entre um badge e uma tag ou chip?

Um badge é saída somente leitura: reporta estado ou uma contagem e não deve receber foco. Uma tag ou chip é entrada sobre a qual o usuário pode agir, normalmente removendo-a, então precisa de um button real, um estilo de foco e um nome acessível. Tratar os dois como um só componente é a razão pela qual tantas interfaces entregam tags que um usuário de teclado não consegue dispensar.

Um selo pode transmitir status apenas pela cor?

Não. A WCAG 1.4.1 exige que a cor não seja o único meio de transmitir informação, então um selo vermelho sem rótulo falha para usuários com daltonismo e para leitores de tela. Renderize um rótulo de texto, ou um ícone mais um rótulo visualmente oculto, ao lado do tom. O MeDo inclui o rótulo por padrão quando você descreve os tons semanticamente.

Como eu mostro uma contagem de notificações acima de 99?

Limite o valor exibido e renderize "99+" quando a contagem passar do seu limite, mantendo o número real no nome acessível se isso importar. Combine o limite com um min-width igual à altura do selo para que contagens de um dígito continuem circulares em vez de estreitas.

Um selo de contagem deve anunciar mudanças para leitores de tela?

Sim, quando a contagem é atualizada sem uma navegação de página. Envolva-o em uma região aria-live="polite" para que o novo valor seja anunciado sem interromper o usuário, e mantenha o texto enxuto — "3 não lidas" soa melhor que um número solto. Evite aria-live="assertive" aqui, já que uma contagem de notificações raramente justifica cortar o que está sendo lido.

Como eu posiciono um selo de ponto em um avatar sem cortá-lo?

Dê ao wrapper do avatar position: relative e nenhum overflow: hidden, e então posicione o ponto de forma absoluta com um pequeno deslocamento negativo para que ele avance sobre a borda do círculo. Adicione um anel de 2px na cor da superfície da página para que o ponto continue legível sobre uma foto carregada. Se o wrapper corta seus filhos, mova o arredondamento para um elemento interno.