Components
Loading preview...
import {
Tags,
TagsTrigger,
TagsContent,
TagsInput,
TagsItem,
TagsList,
TagsEmpty,
TagsGroup,
TagsValue,
} from '@/components/ui/tags';
import { useState } from 'react';
import { CheckIcon } from 'lucide-react';
const tags = [
{ id: "react", label: "React" },
{ id: "typescript", label: "TypeScript" },
{ id: "javascript", label: "JavaScript" },
{ id: "nextjs", label: "Next.js" },
{ id: "vuejs", label: "Vue.js" },
{ id: "angular", label: "Angular" },
{ id: "svelte", label: "Svelte" },
{ id: "nodejs", label: "Node.js" },
{ id: "python", label: "Python" },
{ id: "ruby", label: "Ruby" },
{ id: "java", label: "Java" },
{ id: "csharp", label: "C#" },
{ id: "php", label: "PHP" },
{ id: "go", label: "Go" },
];
const Demo = () => {
const [selected, setSelected] = useState<string[]>([]);
const handleRemove = (value: string) => {
if (!selected.includes(value)) {
return;
}
console.log(`removed: ${value}`);
setSelected((prev) => prev.filter((v) => v !== value));
}
const handleSelect = (value: string) => {
if (selected.includes(value)) {
handleRemove(value);
return;
}
console.log(`selected: ${value}`);
setSelected((prev) => [...prev, value]);
}
return (
<Tags className="max-w-[300px]">
<TagsTrigger>
{selected.map((tag) => (
<TagsValue key={tag} onRemove={() => handleRemove(tag)}>
{tags.find((t) => t.id === tag)?.label}
</TagsValue>
))}
</TagsTrigger>
<TagsContent>
<TagsInput placeholder="Search tag..." />
<TagsList>
<TagsEmpty />
<TagsGroup>
{tags.map((tag) => (
<TagsItem key={tag.id} value={tag.id} onSelect={handleSelect}>
{tag.label}
{selected.includes(tag.id) && (
<CheckIcon size={14} className="text-muted-foreground" />
)}
</TagsItem>
))}
</TagsGroup>
</TagsList>
</TagsContent>
</Tags>
);
}
export default { Demo }