Malevich

Elements / Display/

Tag

Pill-shaped metadata label, optionally dismissible.

Tag

Inline metadata pill with optional dismiss button. Similar to Badge but pill-shaped and dismissible. CSS-only — dismiss handling is the consumer's responsibility.

When to use

For status indicators (Active / Archived / Draft) use Badge. For form-control labels, use Label.

Variants

Variant Class Use for
Default .tag Neutral metadata
Accent .tag.-accent Highlighted (selected, featured)
Danger .tag.-danger Error or critical tags
Success .tag.-success Positive state tag
Muted .tag.-muted De-emphasized
Small .tag.-s Compact size

Anatomy

<!-- Static -->
<span class="tag">Documentation</span>
<span class="tag -accent">Featured</span>

<!-- Dismissible -->
<span class="tag">
  React
  <button type="button" class="tag__dismiss" aria-label="Remove React">×</button>
</span>

<!-- In a group -->
<div style="display:flex; gap:0.5rem; flex-wrap:wrap;">
  <span class="tag -muted">JavaScript</span>
  <span class="tag -muted">CSS</span>
  <span class="tag -muted">HTML</span>
</div>

Click the dismiss <button> to handle removal:

document.addEventListener("click", (e) => {
  const dismiss = e.target.closest(".tag__dismiss");
  if (dismiss) dismiss.closest(".tag")?.remove();
});

The component does not ship this handler — removal policy varies (remove from server, mark as removed locally, undo affordance).

Tokens used

Accessibility

Do

Don't