> ## Documentation Index
> Fetch the complete documentation index at: https://araf.badr.co.id/llms.txt
> Use this file to discover all available pages before exploring further.

# Badge

> A compact label for communicating status, categories, counts, or metadata — available in 8 semantic variants and 3 sizes.

## Overview

<div style={{display:"flex",gap:"8px",flexWrap:"wrap",padding:"28px 24px",background:"#f9fafb",borderRadius:"12px",border:"1px solid #e5e7eb",alignItems:"center"}}>
  <span style={{background:"#111827",color:"#fff",padding:"2px 10px",borderRadius:"16px",fontSize:"12px",fontWeight:500,fontFamily:"Inter,sans-serif"}}>Default</span>
  <span style={{background:"#f4f4f5",color:"#27272a",border:"1px solid #e4e4e7",padding:"2px 10px",borderRadius:"16px",fontSize:"12px",fontWeight:500,fontFamily:"Inter,sans-serif"}}>Secondary</span>
  <span style={{border:"1px solid #d4d4d8",color:"#27272a",padding:"2px 10px",borderRadius:"16px",fontSize:"12px",fontWeight:500,fontFamily:"Inter,sans-serif"}}>Outline</span>
  <span style={{background:"#fef2f2",color:"#b42318",border:"1px solid #fecdca",padding:"2px 10px",borderRadius:"16px",fontSize:"12px",fontWeight:500,fontFamily:"Inter,sans-serif"}}>Destructive</span>
  <span style={{background:"#ecfdf3",color:"#027a48",border:"1px solid #abefc6",padding:"2px 10px",borderRadius:"16px",fontSize:"12px",fontWeight:500,fontFamily:"Inter,sans-serif"}}>Success</span>
  <span style={{background:"#fffaeb",color:"#b54708",border:"1px solid #fec84b",padding:"2px 10px",borderRadius:"16px",fontSize:"12px",fontWeight:500,fontFamily:"Inter,sans-serif"}}>Warning</span>
  <span style={{background:"#fef3f2",color:"#b42318",border:"1px solid #fecdca",padding:"2px 10px",borderRadius:"16px",fontSize:"12px",fontWeight:500,fontFamily:"Inter,sans-serif"}}>Error</span>
  <span style={{background:"#eff8ff",color:"#1570ef",border:"1px solid #b2ddff",padding:"2px 10px",borderRadius:"16px",fontSize:"12px",fontWeight:500,fontFamily:"Inter,sans-serif"}}>Info</span>
</div>

**Badge** is a compact, non-interactive label. Use it to communicate status, categories, roles, or counts at a glance. Badges can include a leading icon or a colored status dot.

***

## Installation

<CodeGroup>
  ```bash npm theme={null}
  npm install @araf-ds/core
  ```

  ```bash yarn theme={null}
  yarn add @araf-ds/core
  ```

  ```bash pnpm theme={null}
  pnpm add @araf-ds/core
  ```
</CodeGroup>

***

## Usage

```tsx theme={null}
import { Badge } from "@araf-ds/core"

export default function Example() {
  return <Badge variant="success">Active</Badge>
}
```

***

## Variants

Badge has **8 semantic color variants** to communicate different meanings.

### Default & Secondary

<div style={{display:"flex",gap:"12px",padding:"24px",background:"#f9fafb",borderRadius:"12px",border:"1px solid #e5e7eb",alignItems:"center",flexWrap:"wrap"}}>
  <span style={{background:"#111827",color:"#fff",padding:"2px 10px",borderRadius:"16px",fontSize:"12px",fontWeight:500,fontFamily:"Inter,sans-serif"}}>Default</span>
  <span style={{background:"#f4f4f5",color:"#27272a",border:"1px solid #e4e4e7",padding:"2px 10px",borderRadius:"16px",fontSize:"12px",fontWeight:500,fontFamily:"Inter,sans-serif"}}>Secondary</span>
  <span style={{border:"1px solid #d4d4d8",color:"#27272a",padding:"2px 10px",borderRadius:"16px",fontSize:"12px",fontWeight:500,fontFamily:"Inter,sans-serif"}}>Outline</span>
</div>

Use Default for emphasis labels, Secondary for neutral tags, Outline for minimal de-emphasized labels.

```tsx theme={null}
<Badge variant="default">Default</Badge>
<Badge variant="secondary">Secondary</Badge>
<Badge variant="outline">Outline</Badge>
```

### Status Variants

<div style={{display:"flex",gap:"12px",padding:"24px",background:"#f9fafb",borderRadius:"12px",border:"1px solid #e5e7eb",alignItems:"center",flexWrap:"wrap"}}>
  <span style={{background:"#ecfdf3",color:"#027a48",border:"1px solid #abefc6",padding:"2px 10px",borderRadius:"16px",fontSize:"12px",fontWeight:500,fontFamily:"Inter,sans-serif"}}>Success</span>
  <span style={{background:"#fffaeb",color:"#b54708",border:"1px solid #fec84b",padding:"2px 10px",borderRadius:"16px",fontSize:"12px",fontWeight:500,fontFamily:"Inter,sans-serif"}}>Warning</span>
  <span style={{background:"#fef3f2",color:"#b42318",border:"1px solid #fecdca",padding:"2px 10px",borderRadius:"16px",fontSize:"12px",fontWeight:500,fontFamily:"Inter,sans-serif"}}>Error</span>
  <span style={{background:"#eff8ff",color:"#1570ef",border:"1px solid #b2ddff",padding:"2px 10px",borderRadius:"16px",fontSize:"12px",fontWeight:500,fontFamily:"Inter,sans-serif"}}>Info</span>
  <span style={{background:"#fef2f2",color:"#b42318",border:"1px solid #fecdca",padding:"2px 10px",borderRadius:"16px",fontSize:"12px",fontWeight:500,fontFamily:"Inter,sans-serif"}}>Destructive</span>
</div>

```tsx theme={null}
<Badge variant="success">Active</Badge>
<Badge variant="warning">Pending</Badge>
<Badge variant="error">Failed</Badge>
<Badge variant="info">In Review</Badge>
<Badge variant="destructive">Suspended</Badge>
```

<CardGroup cols={2}>
  <Card title="When to use">
    * Status of table rows (active, pending, error)
    * User role or permission labels
    * Notification counts
    * Category tags
  </Card>

  <Card title="When not to use">
    * Actionable elements — use Button instead
    * Long text — badges are for short labels (1–3 words)
    * Decorative purposes without meaning
  </Card>
</CardGroup>

### With Dot Indicator

A colored dot replaces or precedes the label for compact status display.

<div style={{display:"flex",gap:"12px",padding:"24px",background:"#f9fafb",borderRadius:"12px",border:"1px solid #e5e7eb",alignItems:"center"}}>
  <span style={{background:"#ecfdf3",color:"#027a48",border:"1px solid #abefc6",padding:"2px 10px 2px 6px",borderRadius:"16px",fontSize:"12px",fontWeight:500,fontFamily:"Inter,sans-serif",display:"inline-flex",alignItems:"center",gap:"6px"}}>
    <span style={{width:"6px",height:"6px",borderRadius:"50%",background:"#16a34a",flexShrink:0,display:"inline-block"}} />Online
  </span>

  <span style={{background:"#fffaeb",color:"#b54708",border:"1px solid #fec84b",padding:"2px 10px 2px 6px",borderRadius:"16px",fontSize:"12px",fontWeight:500,fontFamily:"Inter,sans-serif",display:"inline-flex",alignItems:"center",gap:"6px"}}>
    <span style={{width:"6px",height:"6px",borderRadius:"50%",background:"#eab308",flexShrink:0,display:"inline-block"}} />Away
  </span>

  <span style={{background:"#fef3f2",color:"#b42318",border:"1px solid #fecdca",padding:"2px 10px 2px 6px",borderRadius:"16px",fontSize:"12px",fontWeight:500,fontFamily:"Inter,sans-serif",display:"inline-flex",alignItems:"center",gap:"6px"}}>
    <span style={{width:"6px",height:"6px",borderRadius:"50%",background:"#ef4444",flexShrink:0,display:"inline-block"}} />Offline
  </span>
</div>

```tsx theme={null}
<Badge variant="success" dot>Online</Badge>
<Badge variant="warning" dot>Away</Badge>
<Badge variant="error" dot>Offline</Badge>
```

***

## Sizes

<div style={{display:"flex",gap:"12px",padding:"24px",background:"#f9fafb",borderRadius:"12px",border:"1px solid #e5e7eb",alignItems:"center"}}>
  <span style={{background:"#ecfdf3",color:"#027a48",border:"1px solid #abefc6",padding:"1px 8px",borderRadius:"16px",fontSize:"11px",fontWeight:500,fontFamily:"Inter,sans-serif"}}>Small</span>
  <span style={{background:"#ecfdf3",color:"#027a48",border:"1px solid #abefc6",padding:"2px 10px",borderRadius:"16px",fontSize:"12px",fontWeight:500,fontFamily:"Inter,sans-serif"}}>Medium</span>
  <span style={{background:"#ecfdf3",color:"#027a48",border:"1px solid #abefc6",padding:"3px 12px",borderRadius:"16px",fontSize:"14px",fontWeight:500,fontFamily:"Inter,sans-serif"}}>Large</span>
</div>

| Size   | Prop | Use case                    |
| ------ | ---- | --------------------------- |
| Small  | `sm` | Dense tables, compact UI    |
| Medium | `md` | Default — most contexts     |
| Large  | `lg` | Prominent labels, marketing |

```tsx theme={null}
<Badge size="sm" variant="success">Active</Badge>
<Badge size="md" variant="success">Active</Badge>
<Badge size="lg" variant="success">Active</Badge>
```

***

## API Reference

<ParamField path="variant" type="string" default="default">
  Semantic color variant. Values: `default` · `secondary` · `outline` · `destructive` · `success` · `warning` · `error` · `info`
</ParamField>

<ParamField path="size" type="string" default="md">
  Badge size. Values: `sm` · `md` · `lg`
</ParamField>

<ParamField path="dot" type="boolean" default="false">
  Shows a colored status dot to the left of the label text.
</ParamField>

<ParamField path="icon" type="ReactNode">
  Optional leading icon element rendered before the label.
</ParamField>

<ParamField path="children" type="ReactNode">
  Badge label text content.
</ParamField>

<ParamField path="className" type="string">
  Additional Tailwind classes for custom overrides.
</ParamField>

***

## Accessibility

* Badges are purely visual — use `aria-label` on the parent element to provide context for screen readers when the badge alone does not convey meaning
* Avoid using color alone to convey status — always pair with a label or icon
* Do not use badges as interactive elements; use Button for clickable actions

***

## Do's & Don'ts

<CardGroup cols={2}>
  <Card title="Do" icon="check" iconType="solid" color="#16A34A">
    * Use the correct semantic variant for the meaning (success → green, error → red)
    * Keep badge text short — 1 to 3 words maximum
    * Use dot badges when space is very limited
    * Pair with icons for additional clarity in critical states
  </Card>

  <Card title="Don't" icon="xmark" iconType="solid" color="#DC2626">
    * Don't use more than 2 different badge variants in the same table column
    * Don't make badges clickable — they are display-only
    * Don't use custom colors outside the design system variants
    * Don't place badges on top of images or complex backgrounds without sufficient contrast
  </Card>
</CardGroup>
