Combobox
Busca + seleção em lista filtrável (autocomplete).
Seleção e datascomposição
Carregando demonstração…
Código da demo
"use client";
import * as React from "react";
import { Button } from "@/components/ui/button";
import {
Command,
CommandEmpty,
CommandGroup,
CommandInput,
CommandItem,
CommandList,
} from "@/components/ui/command";
import {
Popover,
PopoverContent,
PopoverTrigger,
} from "@/components/ui/popover";
import { CheckIcon, ChevronsUpDownIcon } from "lucide-react";
import { cn } from "@/lib/utils";
const frameworks = [
{ value: "next", label: "Next.js" },
{ value: "svelte", label: "SvelteKit" },
{ value: "nuxt", label: "Nuxt" },
{ value: "remix", label: "Remix" },
];
export function Demo() {
const [open, setOpen] = React.useState(false);
const [value, setValue] = React.useState("");
return (
<Popover open={open} onOpenChange={setOpen}>
<PopoverTrigger asChild>
<Button
variant="outline"
role="combobox"
aria-expanded={open}
className="w-[220px] justify-between"
>
{value
? frameworks.find((f) => f.value === value)?.label
: "Selecione..."}
<ChevronsUpDownIcon className="opacity-50" />
</Button>
</PopoverTrigger>
<PopoverContent className="w-[220px] p-0">
<Command>
<CommandInput placeholder="Buscar..." />
<CommandList>
<CommandEmpty>Nenhum resultado.</CommandEmpty>
<CommandGroup>
{frameworks.map((f) => (
<CommandItem
key={f.value}
value={f.value}
onSelect={(current) => {
setValue(current === value ? "" : current);
setOpen(false);
}}
>
<CheckIcon
className={cn(
"mr-2 size-4",
value === f.value ? "opacity-100" : "opacity-0",
)}
/>
{f.label}
</CommandItem>
))}
</CommandGroup>
</CommandList>
</Command>
</PopoverContent>
</Popover>
);
}- Acessibilidade
- Combina popover e command; teclado setas/Enter/Esc.
- Importar
import { Popover } from "@financeequity/ui/combobox"Neste repositório:
import { Popover } from "@/components/ui/popover" import { Command } from "@/components/ui/command"- Dependências
- cmdk, radix-ui