"use client"; import { Combobox as ComboboxPrimitive } from "@base-ui/react/combobox"; import { ChevronsUpDownIcon, XIcon } from "lucide-react"; import * as React from "react"; import { cn } from "~/lib/utils"; import { Input } from "~/components/ui/input"; import { ScrollArea } from "~/components/ui/scroll-area"; const ComboboxContext = React.createContext<{ chipsRef: React.RefObject | null; multiple: boolean; }>({ chipsRef: null, multiple: false, }); function Combobox( props: ComboboxPrimitive.Root.Props, ) { const chipsRef = React.useRef(null); const value = React.useMemo(() => ({ chipsRef, multiple: !!props.multiple }), [props.multiple]); return ( ); } function ComboboxChipsInput({ className, size, ...props }: Omit & { size?: "sm" | "default" | "lg" | number; ref?: React.Ref; }) { const sizeValue = (size ?? "default") as "sm" | "default" | "lg" | number; return ( ); } function ComboboxInput({ className, inputClassName, showTrigger = true, showClear = false, startAddon, size, unstyled = false, ...props }: Omit & { inputClassName?: string; showTrigger?: boolean; showClear?: boolean; startAddon?: React.ReactNode; size?: "sm" | "default" | "lg" | number; unstyled?: boolean; ref?: React.Ref; }) { const sizeValue = (size ?? "default") as "sm" | "default" | "lg" | number; return (
{startAddon && ( )} } {...props} /> {showTrigger && ( )} {showClear && ( )}
); } function ComboboxTrigger({ className, children, ...props }: ComboboxPrimitive.Trigger.Props) { return ( {children} ); } function ComboboxPopup({ className, children, side = "bottom", sideOffset = 4, alignOffset, align = "start", anchor: anchorProp, ...props }: ComboboxPrimitive.Popup.Props & { align?: ComboboxPrimitive.Positioner.Props["align"]; sideOffset?: ComboboxPrimitive.Positioner.Props["sideOffset"]; alignOffset?: ComboboxPrimitive.Positioner.Props["alignOffset"]; side?: ComboboxPrimitive.Positioner.Props["side"]; anchor?: ComboboxPrimitive.Positioner.Props["anchor"]; }) { const { chipsRef } = React.use(ComboboxContext); const anchor = anchorProp ?? chipsRef; return ( {children} ); } function ComboboxItem({ className, contentClassName, children, hideIndicator: _hideIndicator = false, ...props }: ComboboxPrimitive.Item.Props & { contentClassName?: string; hideIndicator?: boolean; }) { return (
{children}
); } function ComboboxSeparator({ className, ...props }: ComboboxPrimitive.Separator.Props) { return ( ); } function ComboboxGroup({ className, ...props }: ComboboxPrimitive.Group.Props) { return ( ); } function ComboboxGroupLabel({ className, ...props }: ComboboxPrimitive.GroupLabel.Props) { return ( ); } function ComboboxEmpty({ className, ...props }: ComboboxPrimitive.Empty.Props) { return ( ); } function ComboboxRow({ className, ...props }: ComboboxPrimitive.Row.Props) { return ; } function ComboboxValue({ ...props }: ComboboxPrimitive.Value.Props) { return ; } function ComboboxList({ className, ...props }: ComboboxPrimitive.List.Props) { return ( ); } /** * A variant of `ComboboxList` without `ScrollArea`, for use when * an external virtualizer (e.g. LegendList) owns the scroll container. */ function ComboboxListVirtualized({ className, ...props }: ComboboxPrimitive.List.Props) { return ( ); } function ComboboxClear({ className, ...props }: ComboboxPrimitive.Clear.Props) { return ; } function ComboboxStatus({ className, ...props }: ComboboxPrimitive.Status.Props) { return ( ); } function ComboboxCollection(props: ComboboxPrimitive.Collection.Props) { return ; } function ComboboxChips({ className, children, startAddon, ...props }: ComboboxPrimitive.Chips.Props & { startAddon?: React.ReactNode; }) { const { chipsRef } = React.use(ComboboxContext); return ( | null} {...props} > {startAddon && ( )} {children} ); } function ComboboxChip({ children, ...props }: ComboboxPrimitive.Chip.Props) { return ( {children} ); } function ComboboxChipRemove(props: ComboboxPrimitive.ChipRemove.Props) { return ( ); } const useComboboxFilter = ComboboxPrimitive.useFilter; export { Combobox, ComboboxChipsInput, ComboboxInput, ComboboxTrigger, ComboboxPopup, ComboboxItem, ComboboxSeparator, ComboboxGroup, ComboboxGroupLabel, ComboboxEmpty, ComboboxValue, ComboboxList, ComboboxListVirtualized, ComboboxClear, ComboboxStatus, ComboboxRow, ComboboxCollection, ComboboxChips, ComboboxChip, useComboboxFilter, };