{"version":3,"file":"select-root.cjs","sources":["../../../components/select/select-root.tsx"],"sourcesContent":["'use client';\n\nimport {\n  Combobox as ComboboxPrimitive,\n  Select as SelectPrimitive\n} from '@base-ui/react';\nimport {\n  createContext,\n  ReactNode,\n  useCallback,\n  useContext,\n  useMemo,\n  useState\n} from 'react';\nimport { useFieldContext } from '../field';\nimport { ItemType } from './types';\n\ninterface CommonProps {\n  autocomplete?: boolean;\n  autocompleteMode?: 'auto' | 'manual';\n  searchValue?: string;\n  onSearch?: (value: string) => void;\n  defaultSearchValue?: string;\n}\n\ninterface SelectContextValue extends CommonProps {\n  value?: string | string[];\n  registerItem: (item: ItemType) => void;\n  unregisterItem: (value: string) => void;\n  multiple: boolean;\n  items: Record<string, ItemType>;\n  hasItems?: boolean;\n}\n\ninterface UseSelectContext extends SelectContextValue {\n  shouldFilter?: boolean;\n}\n\n/*\nRoot context to manage the Select control\n@remarks Only for internal usage.\n*/\nconst SelectContext = createContext<SelectContextValue | undefined>(undefined);\n\nexport const useSelectContext = (): UseSelectContext => {\n  const context = useContext(SelectContext);\n  if (!context) {\n    throw new Error('useSelectContext must be used within a SelectProvider');\n  }\n  const shouldFilter = !!(\n    context?.autocomplete &&\n    context?.autocompleteMode === 'auto' &&\n    context?.searchValue?.length\n  );\n  return {\n    ...context,\n    shouldFilter\n  };\n};\n\nexport interface BaseSelectProps extends CommonProps {\n  children?: ReactNode;\n  open?: boolean;\n  defaultOpen?: boolean;\n  onOpenChange?: (open: boolean) => void;\n  disabled?: boolean;\n  required?: boolean;\n  name?: string;\n  items?: string[];\n}\n\nexport interface SingleSelectProps extends BaseSelectProps {\n  multiple?: false;\n  value?: string;\n  onValueChange?: (value: string) => void;\n  defaultValue?: string;\n}\n\nexport interface MultipleSelectProps extends BaseSelectProps {\n  multiple: true;\n  value?: string[];\n  onValueChange?: (value: string[]) => void;\n  defaultValue?: string[];\n}\n\nexport type SelectRootProps = SingleSelectProps | MultipleSelectProps;\n\nexport const SelectRoot = (props: SelectRootProps) => {\n  const {\n    children,\n    value: providedValue,\n    onValueChange,\n    defaultValue,\n    autocomplete,\n    autocompleteMode = 'auto',\n    searchValue: providedSearchValue,\n    onSearch,\n    defaultSearchValue = '',\n    open: providedOpen,\n    defaultOpen = false,\n    onOpenChange,\n    multiple = false,\n    disabled,\n    required,\n    name,\n    items: itemsProp,\n    ...rest\n  } = props;\n\n  const fieldContext = useFieldContext();\n  const resolvedRequired = required ?? fieldContext?.required;\n\n  const [internalValue, setInternalValue] = useState<\n    string | string[] | undefined\n  >(defaultValue);\n  const [internalSearchValue, setInternalSearchValue] =\n    useState(defaultSearchValue);\n  const [registeredItems, setRegisteredItems] = useState<\n    SelectContextValue['items']\n  >({});\n\n  const computedValue = providedValue ?? internalValue;\n  const searchValue = providedSearchValue ?? internalSearchValue;\n\n  const handleValueChange = useCallback(\n    (value: any, _eventDetails?: any) => {\n      setInternalValue(value);\n      if (multiple) {\n        (onValueChange as MultipleSelectProps['onValueChange'])?.(\n          value as string[]\n        );\n      } else {\n        (onValueChange as SingleSelectProps['onValueChange'])?.(\n          value as string\n        );\n      }\n    },\n    [multiple, onValueChange]\n  );\n\n  const handleSearchValueChange = useCallback(\n    (value: string, _eventDetails?: any) => {\n      setInternalSearchValue(value);\n      onSearch?.(value);\n    },\n    [onSearch]\n  );\n\n  const handleOpenChange = useCallback(\n    (open: boolean, _eventDetails?: any) => {\n      onOpenChange?.(open);\n    },\n    [onOpenChange]\n  );\n\n  const registerItem = useCallback<SelectContextValue['registerItem']>(item => {\n    setRegisteredItems(prev => ({ ...prev, [item.value]: item }));\n  }, []);\n\n  const unregisterItem = useCallback<SelectContextValue['unregisterItem']>(\n    value => {\n      setRegisteredItems(prev => {\n        const { [value]: _, ...rest } = prev;\n        return rest;\n      });\n    },\n    []\n  );\n\n  const contextValue = useMemo(\n    () => ({\n      value: computedValue,\n      registerItem,\n      unregisterItem,\n      autocomplete,\n      autocompleteMode,\n      searchValue,\n      multiple,\n      items: registeredItems,\n      hasItems: !!itemsProp\n    }),\n    [\n      computedValue,\n      registerItem,\n      unregisterItem,\n      autocomplete,\n      autocompleteMode,\n      searchValue,\n      multiple,\n      registeredItems,\n      itemsProp\n    ]\n  );\n\n  const commonProps = {\n    value: providedValue as any,\n    defaultValue: defaultValue as any,\n    onValueChange: handleValueChange,\n    open: providedOpen,\n    defaultOpen,\n    onOpenChange: handleOpenChange,\n    multiple: multiple as any,\n    disabled,\n    modal: true as const,\n    ...rest,\n    required: resolvedRequired,\n    name\n  };\n\n  if (autocomplete) {\n    return (\n      <SelectContext value={contextValue}>\n        <ComboboxPrimitive.Root\n          {...commonProps}\n          onInputValueChange={handleSearchValueChange}\n          filter={itemsProp ? undefined : null}\n          items={itemsProp}\n          loopFocus={false}\n          // @ts-ignore @base-ui/react@1.3.0 ComboboxRootProps types `autoHighlight` as `boolean | undefined`, but the runtime accepts `always | input-change`. Remove when upstream types are corrected.\n          autoHighlight='always'\n        >\n          {children}\n        </ComboboxPrimitive.Root>\n      </SelectContext>\n    );\n  }\n\n  return (\n    <SelectContext.Provider value={contextValue}>\n      <SelectPrimitive.Root {...commonProps}>{children}</SelectPrimitive.Root>\n    </SelectContext.Provider>\n  );\n};\n\nSelectRoot.displayName = 'Select';\n"],"names":[],"mappings":";;;;;;;;;AAsCA;;;AAGE;AACF;AAEO;AACL;;AAEE;;AAEF;;AAGE;;AAGA;;;AAGJ;AA6Ba;;AAsBX;AACA;;;;AAWA;AACA;;;;AAMO;;;AAIA;;AAIL;;;AAOE;AACF;;AAME;AACF;AAIF;;;AAIA;;AAGM;AACA;AACF;;AAKJ;AAEI;;;;;;;AAOA;;AAED;;;;;;;;;;AAWA;AAGH;AACE;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;;AAKA;;AASM;;;AAaV;AAEA;;;"}