IndiaCN UI

Chip

Small interactive elements for displaying tags, filters, or selections.

Introduction

Chips are compact elements used to represent inputs, attributes, or actions. They support icons, avatars, dismissible behavior, and multiple visual styles.

Installation

import { Chip } from '@/components/ui/chip';

Usage

<Chip>Label</Chip>

Examples

Default

Label
ChipDefault
import { Chip } from '@/components/ui/chip';

export default function Component() {
  return <Chip>Label</Chip>;
}

Variants

Filled
Outlined
Tonal
ChipVariants
import { Chip } from '@/components/ui/chip';

export default function Component() {
  return (
    <div className="flex flex-wrap gap-2">
      <Chip variant="filled">Filled</Chip>
      <Chip variant="outlined">Outlined</Chip>
      <Chip variant="tonal">Tonal</Chip>
    </div>
  );
}

Themes

Primary
Secondary
Success
Danger
Warning
Info
Neutral
ChipThemes
import { Chip } from '@/components/ui/chip';

export default function Component() {
  return (
    <div className="flex flex-wrap gap-2">
      <Chip theme="primary">Primary</Chip>
      <Chip theme="secondary">Secondary</Chip>
      <Chip theme="success">Success</Chip>
      <Chip theme="danger">Danger</Chip>
      <Chip theme="warning">Warning</Chip>
    </div>
  );
}

Sizes

Small
Medium
Large
ChipSizes
import { Chip } from '@/components/ui/chip';

export default function Component() {
  return (
    <div className="flex flex-wrap items-center gap-2">
      <Chip size="sm">Small</Chip>
      <Chip size="md">Medium</Chip>
      <Chip size="lg">Large</Chip>
    </div>
  );
}

With Icon

Use the icon prop to add a leading icon.

Favourite
Approved
User
ChipWithIcon
import { Check, Star, User } from 'lucide-react';
import { Chip } from '@/components/ui/chip';

export default function Component() {
  return (
    <div className="flex flex-wrap gap-2">
      <Chip icon={<Star />}>Favourite</Chip>
      <Chip icon={<Check />} theme="success">Approved</Chip>
      <Chip icon={<User />} theme="secondary">User</Chip>
    </div>
  );
}

Dismissible

Pass an onDismiss callback to show a close button.

Dismissible
Approved
ChipDismissible
import { Check } from 'lucide-react';
import { Chip } from '@/components/ui/chip';

export default function Component() {
  return (
    <div className="flex flex-wrap gap-2">
      <Chip onDismiss={() => {}}>Dismissible</Chip>
      <Chip onDismiss={() => {}} theme="danger">Remove</Chip>
      <Chip onDismiss={() => {}} theme="success" icon={<Check />}>Approved</Chip>
    </div>
  );
}

Disabled

Disabled
Disabled Filled
ChipDisabled
import { Chip } from '@/components/ui/chip';

export default function Component() {
  return (
    <div className="flex flex-wrap gap-2">
      <Chip disabled>Disabled</Chip>
      <Chip disabled variant="filled">Disabled Filled</Chip>
    </div>
  );
}

Selectable

Chips can be toggled into a selected state for use in filter or choice scenarios.

React
Vue
Angular
Svelte
ChipSelectable
'use client';

import { Check, Star, User } from 'lucide-react';
import { useState } from 'react';

import { Chip } from '@/components/ui/chip';

/** No-op callback for demo purposes. */
const noop = () => {};

export function ChipDefault() {
  return <Chip>Label</Chip>;
}

export function ChipVariants() {
  return (
    <div className='flex flex-wrap gap-2'>
      <Chip variant='filled'>Filled</Chip>
      <Chip variant='outlined'>Outlined</Chip>
      <Chip variant='tonal'>Tonal</Chip>
    </div>
  );
}

export function ChipThemes() {
  return (
    <div className='flex flex-wrap gap-2'>
      <Chip theme='primary' variant='filled'>
        Primary
      </Chip>
      <Chip theme='secondary' variant='filled'>
        Secondary
      </Chip>
      <Chip theme='success' variant='filled'>
        Success
      </Chip>
      <Chip theme='danger' variant='filled'>
        Danger
      </Chip>
      <Chip theme='warning' variant='filled'>
        Warning
      </Chip>
      <Chip theme='info' variant='filled'>
        Info
      </Chip>
      <Chip theme='neutral' variant='filled'>
        Neutral
      </Chip>
    </div>
  );
}

export function ChipSizes() {
  return (
    <div className='flex flex-wrap items-center gap-2'>
      <Chip size='sm'>Small</Chip>
      <Chip size='md'>Medium</Chip>
      <Chip size='lg'>Large</Chip>
    </div>
  );
}

export function ChipWithIcon() {
  return (
    <div className='flex flex-wrap gap-2'>
      <Chip icon={<Star />}>Favourite</Chip>
      <Chip icon={<Check />}>Approved</Chip>
      <Chip icon={<User />}>User</Chip>
    </div>
  );
}

export function ChipDismissible() {
  return (
    <div className='flex flex-wrap gap-2'>
      <Chip onDismiss={noop}>Dismissible</Chip>
      <Chip onDismiss={noop} icon={<Check />}>
        Approved
      </Chip>
    </div>
  );
}

export function ChipDisabled() {
  return (
    <div className='flex flex-wrap gap-2'>
      <Chip disabled>Disabled</Chip>
      <Chip disabled variant='filled'>
        Disabled Filled
      </Chip>
    </div>
  );
}

export function ChipSelectable() {
  const [selected, setSelected] = useState<string[]>([]);

  const toggle = (label: string) => {
    setSelected(prev => (prev.includes(label) ? prev.filter(l => l !== label) : [...prev, label]));
  };

  return (
    <div className='flex flex-wrap gap-2'>
      {['React', 'Vue', 'Angular', 'Svelte'].map(label => (
        <Chip key={label} selected={selected.includes(label)} onClick={toggle.bind(null, label)}>
          {label}
        </Chip>
      ))}
    </div>
  );
}

API Reference

Chip

PropTypeDefaultDescription
variantfilled | outlined | tonaloutlinedVisual style (neutral border by default, matching UX4G)
sizesm | md | lgmdChip size
iconReactNodeLeading icon
avatarReactNodeAvatar element
onDismiss() => voidDismiss callback, shows close button
selectedbooleanSelected state
disabledbooleanDisabled state

On this page