{"version":3,"sources":["../../../../src/components/molecules/ComboBoxField/ComboBoxField.tsx"],"names":["cva","useState","useMemo","escapeRegExp","jsxs","twMerge","Combobox","jsx","ComboboxInput","Input","Label","ComboboxOptions","ComboboxOption","Typography","Controller"],"mappings":"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","file":"ComboBoxField.cjs","sourcesContent":["import {\n  Combobox,\n  ComboboxInput,\n  ComboboxOption,\n  ComboboxOptions,\n} from \"@headlessui/react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { twMerge } from \"tailwind-merge\";\nimport {\n  useMemo,\n  useState,\n  type ComponentPropsWithoutRef,\n  type ReactNode,\n} from \"react\";\nimport { Typography } from \"../../atoms/Typography/Typography\";\nimport { Label } from \"../../atoms/Label/Label\";\nimport { escapeRegExp } from \"../../../utils/escapeRegex\";\nimport { Input } from \"../../atoms/Input\";\nimport { Controller, type ControllerProps } from \"react-hook-form\";\n\nconst fieldWrapperVariants = cva(null, {\n  variants: {\n    labelBehaviour: { floating: \"relative\", placeholder: \"\" },\n    size: { sm: null, md: null, lg: null },\n  },\n  defaultVariants: { labelBehaviour: \"floating\", size: \"sm\" },\n});\n\nconst labelVariants = cva(null, {\n  variants: {\n    labelBehaviour: {\n      floating:\n        \"pointer-events-none absolute transition-all text-font-secondary \\\n        left-[0.55rem] top-1/2 -translate-y-1/2 \\\n        peer-focus:top-1 peer-[&:not(:placeholder-shown)]:top-1 leading-none\",\n      placeholder: \"\",\n    },\n    size: { sm: null, md: null, lg: null },\n  },\n  compoundVariants: [\n    {\n      labelBehaviour: \"floating\",\n      size: \"sm\",\n      class: `\n        peer-placeholder-shown:text-sm\n        peer-focus:text-[0.625rem]\n        peer-[&:not(:placeholder-shown)]:text-[0.625rem]\n        peer-focus:translate-y-0.5\n        peer-[&:not(:placeholder-shown)]:translate-y-0.5\n      `,\n    },\n    {\n      labelBehaviour: \"floating\",\n      size: \"md\",\n      class: `\n        peer-placeholder-shown:text-base\n        peer-focus:text-xs\n        peer-[&:not(:placeholder-shown)]:text-xs\n        peer-focus:translate-y-1\n        peer-[&:not(:placeholder-shown)]:translate-y-1\n      `,\n    },\n    {\n      labelBehaviour: \"floating\",\n      size: \"lg\",\n      class: `\n        peer-placeholder-shown:text-lg\n        peer-focus:text-sm\n        peer-[&:not(:placeholder-shown)]:text-sm\n        peer-focus:translate-y-1\n        peer-[&:not(:placeholder-shown)]:translate-y-1\n      `,\n    },\n  ],\n  defaultVariants: { size: \"sm\", labelBehaviour: \"floating\" },\n});\n\nconst comboboxInputVariants = cva(\n  \"peer w-full px-2 border border-border box-border text-font-primary placeholder-font-secondary\",\n  {\n    variants: {\n      labelBehaviour: {\n        floating: \"peer\",\n        placeholder: null,\n      },\n      size: { sm: null, md: null, lg: null },\n    },\n    compoundVariants: [\n      {\n        labelBehaviour: \"floating\",\n        size: \"sm\",\n        class: `pt-3`,\n      },\n      {\n        labelBehaviour: \"floating\",\n        size: \"md\",\n        class: \"pt-4\",\n      },\n      {\n        labelBehaviour: \"floating\",\n        size: \"lg\",\n        class: \"pt-5\",\n      },\n    ],\n    defaultVariants: {\n      size: \"sm\",\n      labelBehaviour: \"floating\",\n    },\n  }\n);\n\nconst optionsPanelVariants = cva(\n  \"w-(--input-width) mt-1 max-h-64 overflow-auto z-50 \\\n  border border-border rounded-md bg-white shadow-lg \\\n  empty:invisible\",\n  {\n    variants: { size: { sm: \"text-sm\", md: \"text-base\", lg: \"text-lg\" } },\n    defaultVariants: { size: \"sm\" },\n  }\n);\n\nconst optionItemVariants = cva(\n  \"cursor-pointer px-2 py-2 w-full \\\n  data-[disabled]:opacity-50 data-[disabled]:cursor-not-allowed \\\n  data-[focus]:bg-neutral-100 data-[selected]:font-medium\",\n  {\n    variants: { size: { sm: \"text-sm\", md: \"text-base\", lg: \"text-lg\" } },\n    defaultVariants: { size: \"sm\" },\n  }\n);\n\ntype FieldCva = VariantProps<typeof fieldWrapperVariants>;\n\nexport type Option = {\n  label: string;\n  value: string | number;\n  image?: string;\n  leftItem?: ReactNode;\n  rightItem?: ReactNode;\n  disabled?: boolean;\n  [k: string]: string | undefined | ReactNode;\n};\n\nexport type SingleProps = {\n  multiple?: false;\n  value?: Option | null;\n  onChange: (v?: Option | null) => void;\n};\n\nexport type MultiProps = {\n  multiple: true;\n  value: Option[];\n  onChange: (v: Option[]) => void;\n};\n\nexport type ComboboxFieldProps = SingleProps & {\n  id?: string;\n  label?: string;\n  items: Option[];\n  value?: Option | null;\n  renderOption?: (\n    option: Option,\n    state: { focus: boolean; selected: boolean; disabled: boolean }\n  ) => React.ReactNode;\n  onChange: (value?: Option | null) => void;\n  customFilter?: (items: Option[], query: string) => Option[];\n  getLabel?: (option: Option) => string | React.ReactElement;\n  placeholder?: string;\n  error?: string;\n  hint?: string;\n  className?: string;\n  openOnFocus?: boolean;\n  inputProps?: Omit<\n    ComponentPropsWithoutRef<\"input\">,\n    \"id\" | \"value\" | \"onChange\" | \"placeholder\" | \"className\" | \"defaultValue\"\n  >;\n\n  virtualized?: boolean;\n  virtualThreshold?: number;\n} & Pick<FieldCva, \"labelBehaviour\" | \"size\">;\n\nexport function ComboboxField({\n  id,\n  label,\n  labelBehaviour = \"floating\",\n  size = \"sm\",\n  items,\n  value,\n  onChange,\n  customFilter,\n  placeholder = \"Search or select…\",\n  error,\n  hint,\n  renderOption,\n  getLabel = (option: Option) => option.label,\n  openOnFocus = true,\n  className,\n  inputProps,\n  virtualized = false,\n  virtualThreshold,\n}: ComboboxFieldProps) {\n  const [query, setQuery] = useState(\"\");\n\n  const filtered = useMemo(() => {\n    if (!query) return items;\n    if (customFilter) return customFilter(items, query);\n    const re = new RegExp(escapeRegExp(query), \"i\");\n    return items.filter((item) => re.test(item.label));\n  }, [items, query, customFilter]);\n\n  const isFloating = labelBehaviour === \"floating\";\n\n  const displayValue = (val: Option | Option[] | null) =>\n    Array.isArray(val) ? val.map((v) => v.label).join(\", \") : val?.label ?? \"\";\n\n  const useVirtual =\n    virtualized && (virtualThreshold ? items.length > virtualThreshold : true);\n  const virtualProp = useVirtual ? { options: filtered } : undefined;\n  return (\n    <div\n      className={twMerge(\n        fieldWrapperVariants({ labelBehaviour, size }),\n        className\n      )}\n    >\n      <Combobox<Option | null>\n        value={value ?? null}\n        onChange={onChange}\n        immediate={openOnFocus}\n        onClose={() => setQuery(\"\")}\n        by={(a, b) => a?.value === b?.value}\n        virtual={virtualProp}\n      >\n        <ComboboxInput\n          as={Input}\n          id={id}\n          invalid={!!error}\n          placeholder={isFloating ? \" \" : placeholder}\n          displayValue={displayValue}\n          onChange={(e) => setQuery(e.target.value)}\n          className={twMerge(\n            comboboxInputVariants({\n              size,\n              labelBehaviour,\n            })\n          )}\n          inputSize={size}\n          autoComplete=\"off\"\n          {...inputProps}\n        />\n\n        {label && (\n          <Label\n            htmlFor={id}\n            className={twMerge(\n              labelVariants({ size, labelBehaviour }),\n              !isFloating && \"hidden\"\n            )}\n          >\n            {label}\n          </Label>\n        )}\n\n        <ComboboxOptions\n          anchor=\"bottom\"\n          className={optionsPanelVariants({ size })}\n        >\n          {useVirtual ? (\n            ({ option }) => {\n              return (\n                <ComboboxOption\n                  key={option.value}\n                  value={option}\n                  className={optionItemVariants({ size })}\n                >\n                  {({ focus, selected, disabled }) => (\n                    <>\n                      {renderOption\n                        ? renderOption(option, { focus, selected, disabled })\n                        : getLabel(option)}\n                    </>\n                  )}\n                </ComboboxOption>\n              );\n            }\n          ) : filtered.length === 0 ? (\n            <div className=\"px-2 py-2 text-font-secondary\">No matches</div>\n          ) : (\n            filtered.map((option) => (\n              <ComboboxOption\n                key={option.value}\n                value={option}\n                className={optionItemVariants({ size })}\n              >\n                {({ focus, selected, disabled }) => (\n                  <>\n                    {renderOption\n                      ? renderOption(option, { focus, selected, disabled })\n                      : getLabel(option)}\n                  </>\n                )}\n              </ComboboxOption>\n            ))\n          )}\n        </ComboboxOptions>\n      </Combobox>\n\n      {hint && !error && (\n        <Typography className=\"text-xs absolute mt-0.5\" color=\"secondary\">\n          {hint}\n        </Typography>\n      )}\n      {error && (\n        <Typography color=\"danger\" className=\"text-xs absolute mt-0.5\">\n          {error}\n        </Typography>\n      )}\n    </div>\n  );\n}\n\nexport type FormComboBoxFieldProps = Omit<\n  ComboboxFieldProps,\n  \"onChange\" | \"value\"\n> & {\n  name: string;\n  controller?: Pick<\n    ControllerProps,\n    \"defaultValue\" | \"disabled\" | \"rules\" | \"shouldUnregister\"\n  >;\n};\n\nexport function FormComboboxField({\n  name,\n  controller,\n  inputProps,\n  items = [],\n  ...restProps\n}: FormComboBoxFieldProps) {\n  const optionMap = useMemo(() => {\n    const map = new Map<Option[\"value\"], Option>();\n    for (const option of items) {\n      map.set(option.value, option);\n    }\n    return map;\n  }, [items]);\n\n  const isOption = (candidate: unknown): candidate is Option =>\n    Boolean(\n      candidate &&\n        typeof candidate === \"object\" &&\n        \"value\" in (candidate as Option) &&\n        \"label\" in (candidate as Option)\n    );\n\n  const toOption = (val: unknown): Option | null => {\n    if (isOption(val)) return val;\n    if (\n      typeof val === \"string\" ||\n      typeof val === \"number\" ||\n      typeof val === \"bigint\"\n    ) {\n      return optionMap.get(val as Option[\"value\"]) ?? null;\n    }\n    return null;\n  };\n\n  const toPrimitive = (candidate: Option | null | undefined) =>\n    candidate == null ? \"\" : candidate.value;\n\n  return (\n    <Controller\n      {...controller}\n      name={name}\n      render={({ field: { value, onChange, onBlur } }) => {\n        const selectedOption = toOption(value);\n\n        return (\n          <ComboboxField\n            {...restProps}\n            items={items}\n            value={selectedOption}\n            onChange={(option) => onChange(toPrimitive(option))}\n            inputProps={{\n              ...(inputProps ?? {}),\n              onBlur: (event) => {\n                inputProps?.onBlur?.(event);\n                onBlur();\n              },\n            }}\n          />\n        );\n      }}\n    />\n  );\n}\n"]}