{"name":"combobox","type":"registry:ui","files":[{"path":"combobox.tsx","type":"registry:ui","content":"\"use client\"\n\nimport * as React from \"react\"\nimport { Combobox as ComboboxPrimitive } from \"@base-ui-components/react/combobox\"\nimport { ChevronsUpDown as ChevronsUpDownIcon, X as XIcon } from \"honestui/icons\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Input } from \"@/components/ui/input\"\nimport { ScrollArea } from \"@/components/ui/scroll-area\"\n\nconst ComboboxContext = React.createContext<{\n  chipsRef: React.RefObject<HTMLDivElement | null> | null\n  multiple: boolean\n}>({\n  chipsRef: null,\n  multiple: false,\n})\n\nfunction Combobox<\n  ItemValue,\n  Multiple extends boolean | undefined = false,\n>(props: ComboboxPrimitive.Root.Props<ItemValue, Multiple>) {\n  const chipsRef = React.useRef<HTMLDivElement | null>(null)\n  return (\n    <ComboboxContext.Provider value={{ chipsRef, multiple: !!props.multiple }}>\n      <ComboboxPrimitive.Root {...props} />\n    </ComboboxContext.Provider>\n  )\n}\n\nfunction ComboboxInput({\n  className,\n  showTrigger = true,\n  showClear = false,\n  size,\n  ...props\n}: Omit<ComboboxPrimitive.Input.Props, \"size\"> & {\n  showTrigger?: boolean\n  showClear?: boolean\n  size?: \"sm\" | \"default\" | \"lg\" | number\n}) {\n  const { multiple } = React.useContext(ComboboxContext)\n  const sizeValue = (size ?? \"default\") as \"sm\" | \"default\" | \"lg\" | number\n\n  // multiple mode\n  if (multiple) {\n    return (\n      <ComboboxPrimitive.Input\n        data-slot=\"combobox-input\"\n        className={cn(\n          \"min-w-12 flex-1 text-base/5 outline-none sm:text-sm [[data-slot=combobox-chip]+&]:ps-0.5\",\n          sizeValue === \"sm\" ? \"ps-1.5\" : \"ps-2\",\n          className\n        )}\n        data-size={typeof sizeValue === \"string\" ? sizeValue : undefined}\n        size={typeof sizeValue === \"number\" ? sizeValue : undefined}\n        {...props}\n      />\n    )\n  }\n  // single mode\n  return (\n    <div className=\"relative w-full has-disabled:opacity-64\">\n      <ComboboxPrimitive.Input\n        data-slot=\"combobox-input\"\n        className={cn(\n          sizeValue === \"sm\"\n            ? \"has-[+[data-slot=combobox-trigger],+[data-slot=combobox-clear]]:*:data-[slot=combobox-input]:pe-6.5\"\n            : \"has-[+[data-slot=combobox-trigger],+[data-slot=combobox-clear]]:*:data-[slot=combobox-input]:pe-7\",\n          className\n        )}\n        render={<Input size={sizeValue} className=\"has-disabled:opacity-100\" />}\n        {...props}\n      />\n      {showTrigger && (\n        <ComboboxTrigger\n          className={cn(\n            \"absolute top-1/2 inline-flex size-7 shrink-0 -translate-y-1/2 cursor-pointer items-center justify-center rounded-md border border-transparent opacity-72 transition-opacity outline-none hover:opacity-100 has-[+[data-slot=combobox-clear]]:hidden pointer-coarse:after:absolute pointer-coarse:after:min-h-11 pointer-coarse:after:min-w-11 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n            sizeValue === \"sm\" ? \"end-0\" : \"end-0.5\"\n          )}\n        >\n          <ChevronsUpDownIcon />\n        </ComboboxTrigger>\n      )}\n      {showClear && (\n        <ComboboxClear\n          className={cn(\n            \"absolute top-1/2 inline-flex size-7 shrink-0 -translate-y-1/2 cursor-pointer items-center justify-center rounded-md border border-transparent opacity-72 transition-opacity outline-none hover:opacity-100 has-[+[data-slot=combobox-clear]]:hidden pointer-coarse:after:absolute pointer-coarse:after:min-h-11 pointer-coarse:after:min-w-11 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n            sizeValue === \"sm\" ? \"end-0\" : \"end-0.5\"\n          )}\n        >\n          <XIcon />\n        </ComboboxClear>\n      )}\n    </div>\n  )\n}\n\nfunction ComboboxTrigger({\n  className,\n  ...props\n}: ComboboxPrimitive.Trigger.Props) {\n  return (\n    <ComboboxPrimitive.Trigger\n      data-slot=\"combobox-trigger\"\n      className={className}\n      {...props}\n    />\n  )\n}\n\nfunction ComboboxPopup({\n  className,\n  children,\n  sideOffset = 4,\n  ...props\n}: ComboboxPrimitive.Popup.Props & {\n  sideOffset?: number\n}) {\n  const { chipsRef } = React.useContext(ComboboxContext)\n\n  return (\n    <ComboboxPrimitive.Portal>\n      <ComboboxPrimitive.Positioner\n        data-slot=\"combobox-positioner\"\n        className=\"z-[var(--hui-z-index-portal)] select-none\"\n        sideOffset={sideOffset}\n        anchor={chipsRef}\n      >\n        <span className=\"relative flex max-h-full\">\n          <ComboboxPrimitive.Popup\n            data-slot=\"combobox-popup\"\n            className={cn(\n              \"box-border flex max-h-[min(var(--available-height),320px)] min-w-(--anchor-width) max-w-(--available-width) origin-(--transform-origin) flex-col overflow-auto rounded-[var(--hui-radius-2)] border-[0.5px] border-[var(--hui-color-border-base-primary)] bg-[var(--hui-color-background-base-primary)] shadow-[var(--hui-shadow-soft)] [font-size:var(--hui-font-size-small)] [letter-spacing:var(--hui-letter-spacing-small)] [line-height:var(--hui-line-height-small)] motion-safe:[transition:opacity_var(--hui-duration-fast)_var(--hui-ease-out),transform_var(--hui-duration-fast)_var(--hui-ease-out)] data-ending-style:scale-[0.97] data-ending-style:opacity-0 data-starting-style:scale-[0.97] data-starting-style:opacity-0 [&:has([data-slot=combobox-list]:empty)]:border-0\",\n              className\n            )}\n            {...props}\n          >\n            {children}\n          </ComboboxPrimitive.Popup>\n        </span>\n      </ComboboxPrimitive.Positioner>\n    </ComboboxPrimitive.Portal>\n  )\n}\n\nfunction ComboboxItem({\n  className,\n  children,\n  ...props\n}: ComboboxPrimitive.Item.Props) {\n  return (\n    <ComboboxPrimitive.Item\n      data-slot=\"combobox-item\"\n      className={cn(\n        \"relative flex items-center gap-[var(--hui-space-3)] whitespace-normal break-words rounded-[var(--hui-radius-2)] p-[var(--hui-space-3)] text-[var(--hui-color-foreground-base-primary)] outline-none in-data-[side=none]:min-w-[calc(var(--anchor-width)+1.25rem)] data-disabled:pointer-events-none data-disabled:opacity-50 data-highlighted:cursor-pointer data-highlighted:bg-[var(--hui-color-background-base-primary-hover)] [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-[var(--hui-space-5)]\",\n        className\n      )}\n      {...props}\n    >\n      <ComboboxPrimitive.ItemIndicator className=\"flex shrink-0 items-center justify-center [&_svg]:size-[var(--hui-space-5)]\">\n        <svg\n          xmlns=\"http://www.w3.org/1500/svg\"\n          width=\"24\"\n          height=\"24\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          stroke=\"currentColor\"\n          strokeWidth=\"2\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n        >\n          <path d=\"M5.252 12.7 10.2 18.63 18.748 5.37\" />\n        </svg>\n      </ComboboxPrimitive.ItemIndicator>\n      <div className=\"min-w-0\">{children}</div>\n    </ComboboxPrimitive.Item>\n  )\n}\n\nfunction ComboboxSeparator({\n  className,\n  ...props\n}: ComboboxPrimitive.Separator.Props) {\n  return (\n    <ComboboxPrimitive.Separator\n      className={cn(\n        \"mx-[calc(var(--hui-space-3)*-1)] my-[var(--hui-space-2)] h-px bg-[var(--hui-color-border-base-primary)] last:hidden\",\n        className\n      )}\n      data-slot=\"combobox-separator\"\n      {...props}\n    />\n  )\n}\n\nfunction ComboboxGroup({ className, ...props }: ComboboxPrimitive.Group.Props) {\n  return (\n    <ComboboxPrimitive.Group\n      data-slot=\"combobox-group\"\n      className={className}\n      {...props}\n    />\n  )\n}\n\nfunction ComboboxGroupLabel({\n  className,\n  ...props\n}: ComboboxPrimitive.GroupLabel.Props) {\n  return (\n    <ComboboxPrimitive.GroupLabel\n      className={cn(\n        \"px-[var(--hui-space-3)] py-[var(--hui-space-2)] [font-size:var(--hui-font-size-mini)] [font-weight:var(--hui-font-weight-medium)]\",\n        className\n      )}\n      data-slot=\"combobox-group-label\"\n      {...props}\n    />\n  )\n}\n\nfunction ComboboxEmpty({ className, ...props }: ComboboxPrimitive.Empty.Props) {\n  return (\n    <ComboboxPrimitive.Empty\n      className={cn(\n        \"text-center text-sm text-muted-foreground not-empty:p-2\",\n        className\n      )}\n      data-slot=\"combobox-empty\"\n      {...props}\n    />\n  )\n}\n\nfunction ComboboxRow({ className, ...props }: ComboboxPrimitive.Row.Props) {\n  return (\n    <ComboboxPrimitive.Row\n      data-slot=\"combobox-row\"\n      className={className}\n      {...props}\n    />\n  )\n}\n\nfunction ComboboxValue({ ...props }: ComboboxPrimitive.Value.Props) {\n  return <ComboboxPrimitive.Value data-slot=\"combobox-value\" {...props} />\n}\n\nfunction ComboboxList({ className, ...props }: ComboboxPrimitive.List.Props) {\n  return (\n    <ScrollArea className=\"flex-1\">\n      <ComboboxPrimitive.List\n        data-slot=\"combobox-list\"\n        className={cn(\n          \"p-[var(--hui-space-2)] empty:p-0 in-data-has-overflow-y:pe-3\",\n          className\n        )}\n        {...props}\n      />\n    </ScrollArea>\n  )\n}\n\nfunction ComboboxClear({ className, ...props }: ComboboxPrimitive.Clear.Props) {\n  return (\n    <ComboboxPrimitive.Clear\n      data-slot=\"combobox-clear\"\n      className={className}\n      {...props}\n    />\n  )\n}\n\nfunction ComboboxStatus({\n  className,\n  ...props\n}: ComboboxPrimitive.Status.Props) {\n  return (\n    <ComboboxPrimitive.Status\n      data-slot=\"combobox-status\"\n      className={cn(\n        \"px-3 py-2 text-xs font-medium text-muted-foreground empty:m-0 empty:p-0\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction ComboboxCollection(props: ComboboxPrimitive.Collection.Props) {\n  return (\n    <ComboboxPrimitive.Collection data-slot=\"combobox-collection\" {...props} />\n  )\n}\n\nfunction ComboboxChips({ className, ...props }: ComboboxPrimitive.Chips.Props) {\n  const { chipsRef } = React.useContext(ComboboxContext)\n\n  return (\n    <ComboboxPrimitive.Chips\n      ref={chipsRef}\n      data-slot=\"combobox-chips\"\n      className={cn(\n        \"relative inline-flex min-h-8 w-full flex-wrap gap-1 rounded-lg border border-input bg-background bg-clip-padding p-[calc(--spacing(1)-1px)] text-base/5 shadow-xs ring-ring/24 transition-shadow outline-none *:min-h-6 before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-lg)-1px)] not-has-disabled:not-focus-within:not-aria-invalid:before:shadow-[0_1px_--theme(--color-black/4%)] focus-within:border-ring focus-within:ring-[3px] has-disabled:pointer-events-none has-disabled:opacity-64 has-aria-invalid:border-destructive/36 focus-within:has-aria-invalid:border-destructive/64 focus-within:has-aria-invalid:ring-destructive/16 has-data-[size=lg]:min-h-9 has-data-[size=lg]:*:min-h-7 has-data-[size=sm]:min-h-7 has-data-[size=sm]:*:min-h-5 sm:text-sm dark:not-in-data-[slot=group]:bg-clip-border dark:not-has-disabled:bg-input/32 dark:not-has-disabled:not-focus-within:not-aria-invalid:before:shadow-[0_-1px_--theme(--color-white/8%)] dark:has-aria-invalid:ring-destructive/24 [&:has(:disabled,:focus-within,[aria-invalid])]:shadow-none\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\n\nfunction ComboboxChip({ children, ...props }: ComboboxPrimitive.Chip.Props) {\n  return (\n    <ComboboxPrimitive.Chip\n      data-slot=\"combobox-chip\"\n      className=\"flex items-center rounded-md bg-accent ps-2 text-xs font-medium text-accent-foreground outline-none\"\n      {...props}\n    >\n      {children}\n      <ComboboxChipRemove />\n    </ComboboxPrimitive.Chip>\n  )\n}\n\nfunction ComboboxChipRemove(props: ComboboxPrimitive.ChipRemove.Props) {\n  return (\n    <ComboboxPrimitive.ChipRemove\n      data-slot=\"combobox-chip-remove\"\n      className=\"h-full shrink-0 cursor-pointer px-1.5 opacity-72 hover:opacity-100 [&_svg:not([class*='size-'])]:size-3.5\"\n      aria-label=\"Remove\"\n      {...props}\n    >\n      <XIcon />\n    </ComboboxPrimitive.ChipRemove>\n  )\n}\n\nexport {\n  Combobox,\n  ComboboxInput,\n  ComboboxTrigger,\n  ComboboxPopup,\n  ComboboxItem,\n  ComboboxSeparator,\n  ComboboxGroup,\n  ComboboxGroupLabel,\n  ComboboxEmpty,\n  ComboboxValue,\n  ComboboxList,\n  ComboboxClear,\n  ComboboxStatus,\n  ComboboxRow,\n  ComboboxCollection,\n  ComboboxChips,\n  ComboboxChip,\n}\n","target":"components/ui/combobox.tsx"}],"dependencies":["@base-ui-components/react","honestui"],"registryDependencies":["https://www.honestui.com/r/input.json","https://www.honestui.com/r/scroll-area.json"]}