Skip to main content

Usage

import { Chip } from '@kivora/react';

<Chip>React</Chip>

Examples

Basic Chip

<Chip>JavaScript</Chip>

Interactive Toggle

function ChipExample() {
  const [selected, setSelected] = useState(false);

  return (
    <Chip 
      checked={selected} 
      onClick={() => setSelected(!selected)}
    >
      Featured
    </Chip>
  );
}

Multiple Selection

function FilterChips() {
  const [filters, setFilters] = useState({
    react: false,
    vue: false,
    angular: false,
  });

  return (
    <div className="flex gap-2">
      <Chip 
        checked={filters.react}
        onClick={() => setFilters({ ...filters, react: !filters.react })}
      >
        React
      </Chip>
      <Chip 
        checked={filters.vue}
        onClick={() => setFilters({ ...filters, vue: !filters.vue })}
      >
        Vue
      </Chip>
      <Chip 
        checked={filters.angular}
        onClick={() => setFilters({ ...filters, angular: !filters.angular })}
      >
        Angular
      </Chip>
    </div>
  );
}

Variants

<Chip variant="default" checked={false}>Default</Chip>
<Chip variant="default" checked={true}>Checked</Chip>

Sizes

<Chip size="sm">Small</Chip>

Read-Only

<Chip readOnly>Non-interactive</Chip>
Renders as a <span> instead of <button> with no hover/focus effects.

With Icons

<Chip checked={true}>
  <Icon name="check" size={14} />
  Verified
</Chip>

Filter Example

function ProductFilters() {
  const [filters, setFilters] = useState({
    inStock: false,
    onSale: false,
    featured: false,
  });

  const toggleFilter = (key: string) => {
    setFilters({ ...filters, [key]: !filters[key] });
  };

  return (
    <div className="space-y-2">
      <h3>Filters</h3>
      <div className="flex flex-wrap gap-2">
        <Chip 
          checked={filters.inStock}
          onClick={() => toggleFilter('inStock')}
          variant="success"
        >
          In Stock
        </Chip>
        <Chip 
          checked={filters.onSale}
          onClick={() => toggleFilter('onSale')}
          variant="warning"
        >
          On Sale
        </Chip>
        <Chip 
          checked={filters.featured}
          onClick={() => toggleFilter('featured')}
          variant="info"
        >
          Featured
        </Chip>
      </div>
    </div>
  );
}

Props

children
React.ReactNode
required
Chip content
variant
'default' | 'success' | 'warning' | 'error' | 'info'
default:"default"
Visual style variant
size
'sm' | 'md'
default:"md"
Chip size
checked
boolean
default:false
Toggle state - changes background and text color when true
readOnly
boolean
default:false
Render as a non-interactive span (no button behavior)
onClick
() => void
Click handler (only works when readOnly is false)
className
string
Additional CSS classes

Accessibility

  • Interactive chips use semantic <button> element
  • Implements aria-pressed for toggle state
  • Keyboard accessible with proper focus styles
  • Read-only chips render as <span> for non-interactive display
  • Focus ring for keyboard navigation

Comparison with Badge and Tag

  • Chip: Interactive toggleable items, can be clicked to toggle selection
  • Tag: Dismissible labels with remove button
  • Badge: Static status indicators, non-interactive

Build docs developers (and LLMs) love