Usage
import { Chip } from '@kivora/react';
<Chip>React</Chip>
Examples
Basic 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
variant
'default' | 'success' | 'warning' | 'error' | 'info'
default:"default"
Visual style variant
Toggle state - changes background and text color when true
Render as a non-interactive span (no button behavior)
Click handler (only works when readOnly is false)
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