{"version":3,"file":"Select.cjs","sources":["../../../src/components/Select/Select.tsx"],"sourcesContent":["import { useEffect, useMemo } from 'react';\nimport { useId, usePrevious, useUncontrolled } from '@raikou/hooks';\nimport {\n  BoxProps,\n  ElementProps,\n  Factory,\n  factory,\n  StylesApiProps,\n  useProps,\n  useResolvedStylesApi,\n} from '../../core';\nimport { __CloseButtonProps } from '../CloseButton';\nimport {\n  Combobox,\n  ComboboxItem,\n  ComboboxLikeProps,\n  ComboboxLikeRenderOptionInput,\n  ComboboxLikeStylesNames,\n  getOptionsLockup,\n  getParsedComboboxData,\n  OptionsDropdown,\n  useCombobox,\n} from '../Combobox';\nimport { __BaseInputProps, __InputStylesNames, InputVariant } from '../Input';\nimport { InputBase } from '../InputBase';\nimport { ScrollAreaProps } from '../ScrollArea';\n\nexport type SelectStylesNames = __InputStylesNames | ComboboxLikeStylesNames;\n\nexport interface SelectProps\n  extends BoxProps,\n    __BaseInputProps,\n    ComboboxLikeProps,\n    StylesApiProps<SelectFactory>,\n    ElementProps<'input', 'onChange' | 'size' | 'value' | 'defaultValue'> {\n  /** Controlled component value */\n  value?: string | null;\n\n  /** Uncontrolled component default value */\n  defaultValue?: string | null;\n\n  /** Called when value changes */\n  onChange?: (value: string | null, option: ComboboxItem) => void;\n\n  /** Called when the clear button is clicked */\n  onClear?: () => void;\n\n  /** Determines whether the select should be searchable, `false` by default */\n  searchable?: boolean;\n\n  /** Determines whether check icon should be displayed near the selected option label, `true` by default */\n  withCheckIcon?: boolean;\n\n  /** Position of the check icon relative to the option label, `'left'` by default */\n  checkIconPosition?: 'left' | 'right';\n\n  /** Message displayed when no option matches the current search query while the `searchable` prop is set or there is no data */\n  nothingFoundMessage?: React.ReactNode;\n\n  /** Controlled search value */\n  searchValue?: string;\n\n  /** Default search value */\n  defaultSearchValue?: string;\n\n  /** Called when search changes */\n  onSearchChange?: (value: string) => void;\n\n  /** Determines whether it should be possible to deselect value by clicking on the selected option, `true` by default */\n  allowDeselect?: boolean;\n\n  /** Determines whether the clear button should be displayed in the right section when the component has value, `false` by default */\n  clearable?: boolean;\n\n  /** Props passed down to the clear button */\n  clearButtonProps?: __CloseButtonProps & ElementProps<'button'>;\n\n  /** Props passed down to the hidden input */\n  hiddenInputProps?: Omit<React.ComponentPropsWithoutRef<'input'>, 'value'>;\n\n  /** A function to render content of the option, replaces the default content of the option */\n  renderOption?: (item: ComboboxLikeRenderOptionInput<ComboboxItem>) => React.ReactNode;\n\n  /** Props passed down to the underlying `ScrollArea` component in the dropdown */\n  scrollAreaProps?: ScrollAreaProps;\n}\n\nexport type SelectFactory = Factory<{\n  props: SelectProps;\n  ref: HTMLInputElement;\n  stylesNames: SelectStylesNames;\n  variant: InputVariant;\n}>;\n\nconst defaultProps: Partial<SelectProps> = {\n  searchable: false,\n  withCheckIcon: true,\n  allowDeselect: true,\n  checkIconPosition: 'left',\n};\n\nexport const Select = factory<SelectFactory>((_props, ref) => {\n  const props = useProps('Select', defaultProps, _props);\n  const {\n    classNames,\n    styles,\n    unstyled,\n    vars,\n    dropdownOpened,\n    defaultDropdownOpened,\n    onDropdownClose,\n    onDropdownOpen,\n    onFocus,\n    onBlur,\n    onClick,\n    onChange,\n    data,\n    value,\n    defaultValue,\n    selectFirstOptionOnChange,\n    onOptionSubmit,\n    comboboxProps,\n    readOnly,\n    disabled,\n    filter,\n    limit,\n    withScrollArea,\n    maxDropdownHeight,\n    size,\n    searchable,\n    rightSection,\n    checkIconPosition,\n    withCheckIcon,\n    nothingFoundMessage,\n    name,\n    form,\n    searchValue,\n    defaultSearchValue,\n    onSearchChange,\n    allowDeselect,\n    error,\n    rightSectionPointerEvents,\n    id,\n    clearable,\n    clearButtonProps,\n    hiddenInputProps,\n    renderOption,\n    onClear,\n    autoComplete,\n    scrollAreaProps,\n    ...others\n  } = props;\n\n  const parsedData = useMemo(() => getParsedComboboxData(data), [data]);\n  const optionsLockup = useMemo(() => getOptionsLockup(parsedData), [parsedData]);\n  const _id = useId(id);\n\n  const [_value, setValue, controlled] = useUncontrolled({\n    value,\n    defaultValue,\n    finalValue: null,\n    onChange,\n  });\n\n  const selectedOption = typeof _value === 'string' ? optionsLockup[_value] : undefined;\n  const previousSelectedOption = usePrevious(selectedOption);\n\n  const [search, setSearch] = useUncontrolled({\n    value: searchValue,\n    defaultValue: defaultSearchValue,\n    finalValue: selectedOption ? selectedOption.label : '',\n    onChange: onSearchChange,\n  });\n\n  const combobox = useCombobox({\n    opened: dropdownOpened,\n    defaultOpened: defaultDropdownOpened,\n    onDropdownOpen: () => {\n      onDropdownOpen?.();\n      combobox.updateSelectedOptionIndex('active', { scrollIntoView: true });\n    },\n    onDropdownClose: () => {\n      onDropdownClose?.();\n      combobox.resetSelectedOption();\n    },\n  });\n\n  const { resolvedClassNames, resolvedStyles } = useResolvedStylesApi<SelectFactory>({\n    props,\n    styles,\n    classNames,\n  });\n\n  useEffect(() => {\n    if (selectFirstOptionOnChange) {\n      combobox.selectFirstOption();\n    }\n  }, [selectFirstOptionOnChange, _value]);\n\n  useEffect(() => {\n    if (value === null) {\n      setSearch('');\n    }\n\n    if (\n      typeof value === 'string' &&\n      selectedOption &&\n      (previousSelectedOption?.value !== selectedOption.value ||\n        previousSelectedOption?.label !== selectedOption.label)\n    ) {\n      setSearch(selectedOption.label);\n    }\n  }, [value, selectedOption]);\n\n  const clearButton = clearable && !!_value && !disabled && !readOnly && (\n    <Combobox.ClearButton\n      size={size as string}\n      {...clearButtonProps}\n      onClear={() => {\n        setValue(null, null);\n        setSearch('');\n        onClear?.();\n      }}\n    />\n  );\n\n  return (\n    <>\n      <Combobox\n        store={combobox}\n        __staticSelector=\"Select\"\n        classNames={resolvedClassNames}\n        styles={resolvedStyles}\n        unstyled={unstyled}\n        readOnly={readOnly}\n        onOptionSubmit={(val) => {\n          onOptionSubmit?.(val);\n          const optionLockup = allowDeselect\n            ? optionsLockup[val].value === _value\n              ? null\n              : optionsLockup[val]\n            : optionsLockup[val];\n\n          const nextValue = optionLockup ? optionLockup.value : null;\n\n          nextValue !== _value && setValue(nextValue, optionLockup);\n          !controlled && setSearch(typeof nextValue === 'string' ? optionLockup?.label || '' : '');\n          combobox.closeDropdown();\n        }}\n        size={size}\n        {...comboboxProps}\n      >\n        <Combobox.Target targetType={searchable ? 'input' : 'button'} autoComplete={autoComplete}>\n          <InputBase\n            id={_id}\n            ref={ref}\n            rightSection={\n              rightSection ||\n              clearButton || <Combobox.Chevron size={size} error={error} unstyled={unstyled} />\n            }\n            rightSectionPointerEvents={rightSectionPointerEvents || (clearButton ? 'all' : 'none')}\n            {...others}\n            size={size}\n            __staticSelector=\"Select\"\n            disabled={disabled}\n            readOnly={readOnly || !searchable}\n            value={search}\n            onChange={(event) => {\n              setSearch(event.currentTarget.value);\n              combobox.openDropdown();\n              selectFirstOptionOnChange && combobox.selectFirstOption();\n            }}\n            onFocus={(event) => {\n              searchable && combobox.openDropdown();\n              onFocus?.(event);\n            }}\n            onBlur={(event) => {\n              searchable && combobox.closeDropdown();\n              setSearch(_value != null ? optionsLockup[_value]?.label || '' : '');\n              onBlur?.(event);\n            }}\n            onClick={(event) => {\n              searchable ? combobox.openDropdown() : combobox.toggleDropdown();\n              onClick?.(event);\n            }}\n            classNames={resolvedClassNames}\n            styles={resolvedStyles}\n            unstyled={unstyled}\n            pointer={!searchable}\n            error={error}\n          />\n        </Combobox.Target>\n        <OptionsDropdown\n          data={parsedData}\n          hidden={readOnly || disabled}\n          filter={filter}\n          search={search}\n          limit={limit}\n          hiddenWhenEmpty={!nothingFoundMessage}\n          withScrollArea={withScrollArea}\n          maxDropdownHeight={maxDropdownHeight}\n          filterOptions={searchable && selectedOption?.label !== search}\n          value={_value}\n          checkIconPosition={checkIconPosition}\n          withCheckIcon={withCheckIcon}\n          nothingFoundMessage={nothingFoundMessage}\n          unstyled={unstyled}\n          labelId={others.label ? `${_id}-label` : undefined}\n          aria-label={others.label ? undefined : others['aria-label']}\n          renderOption={renderOption}\n          scrollAreaProps={scrollAreaProps}\n        />\n      </Combobox>\n      <Combobox.HiddenInput\n        value={_value}\n        name={name}\n        form={form}\n        disabled={disabled}\n        {...hiddenInputProps}\n      />\n    </>\n  );\n});\n\nSelect.displayName = '@raikou/core/Select';\n"],"names":["factory","useProps","useMemo","getParsedComboboxData","getOptionsLockup","useId","useUncontrolled","usePrevious","useCombobox","useResolvedStylesApi","useEffect","jsx","Combobox","jsxs","Fragment","InputBase","OptionsDropdown"],"mappings":"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"}