tags
kibo-ui-registry/tagsFreeComponent
Tags are a way to apply multiple labels to an item.
Live preview
live · rendered by the registry
Rendered by Kibo UI Registry on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://www.kibo-ui.com/r/tags.jsonSource
1"use client";23import { XIcon } from "lucide-react";4import {5 type ComponentProps,6 createContext,7 type MouseEventHandler,8 type ReactNode,9 useContext,10 useEffect,11 useRef,12 useState,13} from "react";14import { Badge } from "@/components/ui/badge";15import { Button } from "@/components/ui/button";16import {17 Command,18 CommandEmpty,19 CommandGroup,20 CommandInput,21 CommandItem,22 CommandList,23} from "@/components/ui/command";24import {25 Popover,26 PopoverContent,27 PopoverTrigger,28} from "@/components/ui/popover";29import { cn } from "@/lib/utils";3031type TagsContextType = {32 value?: string;33 setValue?: (value: string) => void;34 open: boolean;35 onOpenChange: (open: boolean) => void;36 width?: number;37 setWidth?: (width: number) => void;38};3940const TagsContext = createContext<TagsContextType>({41 value: undefined,42 setValue: undefined,43 open: false,44 onOpenChange: () => {},45 width: undefined,46 setWidth: undefined,47});4849const useTagsContext = () => {50 const context = useContext(TagsContext);5152 if (!context) {53 throw new Error("useTagsContext must be used within a TagsProvider");54 }5556 return context;57};5859export type TagsProps = {60 value?: string;61 setValue?: (value: string) => void;62 open?: boolean;63 onOpenChange?: (open: boolean) => void;64 children?: ReactNode;65 className?: string;66};6768export const Tags = ({69 value,70 setValue,71 open: controlledOpen,72 onOpenChange: controlledOnOpenChange,73 children,74 className,75}: TagsProps) => {76 const [uncontrolledOpen, setUncontrolledOpen] = useState(false);77 const [width, setWidth] = useState<number>();78 const ref = useRef<HTMLDivElement>(null);7980 const open = controlledOpen ?? uncontrolledOpen;81 const onOpenChange = controlledOnOpenChange ?? setUncontrolledOpen;8283 useEffect(() => {84 if (!ref.current) {85 return;86 }8788 const resizeObserver = new ResizeObserver((entries) => {89 setWidth(entries[0].contentRect.width);90 });9192 resizeObserver.observe(ref.current);9394 return () => {95 resizeObserver.disconnect();96 };97 }, []);9899 return (100 <TagsContext.Provider101 value={{ value, setValue, open, onOpenChange, width, setWidth }}102 >103 <Popover onOpenChange={onOpenChange} open={open}>104 <div className={cn("relative w-full", className)} ref={ref}>105 {children}106 </div>107 </Popover>108 </TagsContext.Provider>109 );110};111112export type TagsTriggerProps = ComponentProps<typeof Button>;113114export const TagsTrigger = ({115 className,116// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from Kibo UI Registry
All 41 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| announcementannouncement | Kibo UI Registry | Components | Free | no deps | |
| avatar-stackavatar-stack | Kibo UI Registry | Components | Free | no deps | |
| bannerbanner | Kibo UI Registry | Components | Free | 2 deps | |
| calendarcalendar | Kibo UI Registry | Components | Free | 3 deps | |
| choiceboxchoicebox | Kibo UI Registry | Components | Free | 2 deps | |
| code-blockcode-block | Kibo UI Registry | Components | Free | 5 deps · 2 files | |
| color-pickercolor-picker | Kibo UI Registry | Components | Free | 3 deps | |
| comboboxcombobox | Kibo UI Registry | Components | Free | 2 deps |
