Kara Bharat

Multi Select Combobox

Forms 21

About

Customizable & Type-Safe Multi-Select Combo Box

Built with React and Tailwind. Copy the prompt and paste it into Claude Code, Cursor or Lovable: your agent adds Multi Select Combobox to your project and fits it to your theme.

Code

How Multi Select Combobox is used: the demo's code. The component's own source comes with a free account.

Usage.tsx

"use client";

import React from "react";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
import { MultiSelectCombobox } from "@/components/ui/multi-select-combobox";
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
import { 
  Tooltip, 
  TooltipContent, 
  TooltipProvider, 
  TooltipTrigger 
} from "@/components/ui/tooltip";

// Sample data
const users = [
  { value: "1", label: "John Doe", avatar: "/avatars/john.jpg" },
  { value: "2", label: "Jane Smith", avatar: "/avatars/jane.jpg" },
  { value: "3", label: "Bob Johnson", avatar: "/avatars/bob.jpg" },
];

const technologies = [
  { value: "react", label: "React", icon: "⚛️", description: "UI Library" },
  { value: "vue", label: "Vue", icon: "💚", description: "Progressive Framework" },
  { value: "angular", label: "Angular", icon: "🅰️", description: "Full Framework" },
];

const priorities = [
  { value: "low", label: "Low Priority" },
  { value: "medium", label: "Medium Priority" },
  { value: "high", label: "High Priority" },
];

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

  const renderUser = (option: typeof users[0]) => (
    <div className="flex items-center gap-2">
      <Avatar className="h-6 w-6">
        <AvatarImage src={option.avatar} />
        <AvatarFallback>{option.label[0]}</AvatarFallback>
      </Avatar>
      {option.label}
    </div>
  );

  const renderSelected = (value: string[]) => (
    <div className="flex -space-x-2">
      {value.map((id) => {
        const user = users.find((u) => u.value === id)!;
        return (
          <Avatar key={id} className="h-6 w-6 border-2 border-background">
            <AvatarImage src={user.avatar} />
            <AvatarFallback>{user.label[0]}</AvatarFallback>
          </Avatar>
        );
      })}
    </div>
  );

  return (
    <Card className="border-input w-[400px]">
      <CardHeader>
        <CardTitle>User Select</CardTitle>
      </CardHeader>
      <CardContent>
        <MultiSelectCombobox
          label="Users"
          options={users}
          value={selected}
          onChange={setSelected}
          renderItem={renderUser}
          renderSelectedItem={renderSelected}
        />
      </CardContent>
    </Card>
  );
}

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

  const renderTech = (option: typeof technologies[0]) => (
    <div className="flex items-center gap-2">
      <span className="text-xl">{option.icon}</span>
      <div className="flex flex-col">
        <span>{option.label}</span>
        <span className="text-xs text-muted-foreground">{option.description}</span>
      </div>
    </div>
  );

  const renderSelected = (value: string[]) => (
    <TooltipProvider>
      <Tooltip>
        <TooltipTrigger>
          <div className="flex gap-1">
            {value.map((id) => {
              const tech = technologies.find((t) => t.value === id)!;
              return <span key={id}>{tech.icon}</span>;
            })}
          </div>
        </TooltipTrigger>
        <TooltipContent>
          {value.map((id) => {
            const tech = technologies.find((t) => t.value === id)!;
            return <div key={id}>{tech.label}</div>;
          })}
        </TooltipContent>
      </Tooltip>
    </TooltipProvider>
  );

  return (
    <Card className="border-input w-[400px]">
      <CardHeader>
        <CardTitle>Technology Select</CardTitle>
      </CardHeader>
      <CardContent>
        <MultiSelectCombobox
          label="Technologies"
          options={technologies}
          value={selected}
          onChange={setSelected}
          renderItem={renderTech}
          renderSelectedItem={renderSelected}
        />
      </CardContent>
    </Card>
  );
}

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

  const renderSelected = (value: string[]) => {
    if (value.length === 0) return "";
    if (value.length === 1) {
      return priorities.find(p => p.value === value[0])?.label;
    }
    return `${value.length} priorities selected`;
  };

  return (
    <Card className="border-input w-[400px]">
      <CardHeader>
        <CardTitle>Priority Select</CardTitle>
      </CardHeader>
      <CardContent>
        <MultiSelectCombobox
          label="Priority"
          options={priorities}
          value={selected}
          onChange={setSelected}
          renderItem={(option) => option.label}
          renderSelectedItem={renderSelected}
        />
      </CardContent>
    </Card>
  );
}

export { UserSelectDemo, TechnologySelectDemo, PrioritySelectDemo }; 

Dependencies

More in Forms

View all
  • Premium Auth

    Premium Auth

    500
  • Login 1

    Login 1

    52
  • Book A Demo 3

    Book A Demo 3

    83
  • Authentication Card

    Authentication Card

    47
  • Book A Demo 1

    Book A Demo 1

    69
  • Contact Card

    Contact Card

    1K
  • Login Card

    Login Card

    32
  • Login 2

    Login 2

    7