@vkontakte/vkui 7.3.5 → 7.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
3
3
  import * as React from "react";
4
4
  import { classNames } from "@vkontakte/vkjs";
5
5
  import { useExternRef } from "../../hooks/useExternRef.js";
6
- import { useGlobalOnClickOutside } from "../../hooks/useGlobalOnClickOutside.js";
6
+ import { useGlobalOnEventOutside } from "../../hooks/useGlobalOnClickOutside.js";
7
7
  import { Keys } from "../../lib/accessibility.js";
8
8
  import { defaultFilterFn } from "../../lib/select.js";
9
9
  import { ChipsInputBase } from "../ChipsInputBase/ChipsInputBase.js";
@@ -73,7 +73,6 @@ getRef, value: valueProp, defaultValue, inputValue: inputValueProp, defaultInput
73
73
  // Связано с ChipsInputProps
74
74
  const rootRef = useExternRef(getRootRef);
75
75
  const inputRef = useExternRef(getRef, inputRefHook);
76
- const forbidCloseByOutsideClick = React.useRef(false);
77
76
  // Связано с CustomSelectDropdownProps
78
77
  const [dropdownVerticalPlacement, setDropdownVerticalPlacement] = React.useState(placementProp);
79
78
  const onDropdownPlacementChange = React.useCallback((placement)=>{
@@ -216,14 +215,11 @@ getRef, value: valueProp, defaultValue, inputValue: inputValueProp, defaultInput
216
215
  setFocusedOptionIndex
217
216
  ]);
218
217
  const handleClickOutside = React.useCallback(()=>{
219
- if (!forbidCloseByOutsideClick.current) {
220
- setOpened(false);
221
- }
222
- forbidCloseByOutsideClick.current = false;
218
+ setOpened(false);
223
219
  }, [
224
220
  setOpened
225
221
  ]);
226
- useGlobalOnClickOutside(handleClickOutside, opened ? rootRef : null, opened ? dropdownScrollBoxRef : null);
222
+ useGlobalOnEventOutside('mousedown', handleClickOutside, opened ? rootRef : null, opened ? dropdownScrollBoxRef : null);
227
223
  const onDropdownIconClick = React.useCallback((e)=>{
228
224
  if (opened) {
229
225
  e.preventDefault();
@@ -273,7 +269,6 @@ getRef, value: valueProp, defaultValue, inputValue: inputValueProp, defaultInput
273
269
  if (!event.defaultPrevented) {
274
270
  closeAfterSelect && setOpened(false);
275
271
  addOption(option);
276
- forbidCloseByOutsideClick.current = true;
277
272
  clearInput();
278
273
  }
279
274
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/ChipsSelect/ChipsSelect.tsx"],"sourcesContent":["'use client';\n\nimport { type MouseEventHandler } from 'react';\nimport * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useGlobalOnClickOutside } from '../../hooks/useGlobalOnClickOutside';\nimport { Keys } from '../../lib/accessibility';\nimport type { Placement } from '../../lib/floating';\nimport { defaultFilterFn } from '../../lib/select';\nimport { ChipsInputBase } from '../ChipsInputBase/ChipsInputBase';\nimport {\n getNewOptionDataDefault,\n getOptionLabelDefault,\n getOptionValueDefault,\n renderChipDefault,\n} from '../ChipsInputBase/constants';\nimport type { ChipOption, ChipsInputBaseProps } from '../ChipsInputBase/types';\nimport {\n CustomSelectDropdown,\n type CustomSelectDropdownProps,\n} from '../CustomSelectDropdown/CustomSelectDropdown';\nimport {\n CustomSelectOption,\n type CustomSelectOptionProps,\n} from '../CustomSelectOption/CustomSelectOption';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport type { FormFieldProps } from '../FormField/FormField';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport {\n DEFAULT_EMPTY_TEXT,\n DEFAULT_SELECTED_BEHAVIOR,\n FOCUS_ACTION_NEXT,\n FOCUS_ACTION_PREV,\n isCreateNewOptionPreset,\n isEmptyOptionPreset,\n isNotServicePreset,\n renderOptionDefault,\n} from './constants';\nimport type { FocusActionType, OptionPreset } from './types';\nimport { useChipsSelect, type UseChipsSelectProps } from './useChipsSelect';\nimport styles from './ChipsSelect.module.css';\n\nconst findIndexAfter = <O extends ChipOption>(\n options: Array<OptionPreset<O>> = [],\n startIndex = -1,\n) => {\n if (startIndex >= options.length - 1) {\n return -1;\n }\n return options.findIndex(\n (option, i) => i > startIndex && (!isNotServicePreset(option) || !option.disabled),\n );\n};\n\nconst findIndexBefore = <O extends ChipOption>(\n options: Array<OptionPreset<O>> = [],\n endIndex: number = options.length,\n) => {\n let result = -1;\n if (endIndex <= 0) {\n return result;\n }\n for (let i = endIndex - 1; i >= 0; i--) {\n let option = options[i];\n\n if (!isNotServicePreset(option) || !option.disabled) {\n result = i;\n break;\n }\n }\n return result;\n};\n\nexport interface ChipsSelectProps<O extends ChipOption>\n extends ChipsInputBaseProps<O>,\n UseChipsSelectProps<O>,\n Pick<FormFieldProps, 'status' | 'mode' | 'before'>,\n Pick<CustomSelectDropdownProps, 'overscrollBehavior'> {\n /**\n * Расположение выпадающего списка.\n */\n placement?: 'top' | 'bottom';\n /**\n * Отрисовка Spinner вместо списка опций в выпадающем списке.\n */\n fetching?: boolean;\n /**\n * Закрытие выпадающего списка после выбора элемента.\n */\n closeAfterSelect?: boolean;\n /**\n * Ширина раскрывающегося списка зависит от контента.\n */\n dropdownAutoWidth?: boolean;\n /**\n * Принудительно использовать портал.\n */\n forceDropdownPortal?: boolean;\n /**\n * Передает атрибут `data-testid` для дропдауна.\n */\n dropdownTestId?: string;\n /**\n * Иконка раскрывающегося списка.\n */\n icon?: React.ReactNode;\n /**\n * Добавляет значение в список на событие `onBlur` (использовать вместе с `creatable`).\n */\n addOnBlur?: boolean;\n /**\n * Отключает максимальную высоту по умолчанию.\n */\n noMaxHeight?: boolean;\n /**\n * Функция для отрисовки кастомной опции в выпадающем списке.\n */\n renderOption?: (props: CustomSelectOptionProps, option: O) => React.ReactNode;\n /**\n * Рендер-проп для кастомного рендера содержимого дропдауна.\n * В `defaultDropdownContent` содержится список опций.\n */\n renderDropdown?: ({\n defaultDropdownContent,\n }: {\n defaultDropdownContent: React.ReactNode;\n }) => React.ReactNode;\n /**\n * Событие срабатывающее перед `onChange`.\n */\n onChangeStart?: (event: React.MouseEvent | React.KeyboardEvent, option: O) => void;\n\n /**\n * Отступ от выпадающего списка.\n */\n dropdownOffsetDistance?: number;\n\n /**\n * Если `true`, то справа будет отображаться кнопка для очистки значения.\n */\n allowClearButton?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ChipsSelect\n */\nexport const ChipsSelect = <Option extends ChipOption>({\n // FormFieldProps\n id: labelledbyId,\n getRootRef,\n className,\n status = 'default',\n icon: dropdownIconProp,\n onChangeStart,\n\n // CustomSelectDropdownProps\n options: optionsProp,\n placement: placementProp = 'bottom',\n closeAfterSelect = true,\n selectedBehavior = DEFAULT_SELECTED_BEHAVIOR,\n emptyText = DEFAULT_EMPTY_TEXT,\n creatable = false,\n fetching = false,\n dropdownAutoWidth,\n forceDropdownPortal,\n noMaxHeight = false,\n filterFn = defaultFilterFn,\n sortFn = false,\n dropdownTestId,\n onClose,\n onOpen,\n overscrollBehavior,\n renderDropdown,\n\n // ChipsInputProps\n getRef,\n value: valueProp,\n defaultValue,\n inputValue: inputValueProp,\n defaultInputValue,\n disabled,\n readOnly,\n getOptionValue = getOptionValueDefault,\n getOptionLabel = getOptionLabelDefault,\n getNewOptionData = getNewOptionDataDefault,\n renderChip = renderChipDefault,\n renderOption = renderOptionDefault,\n onChange,\n onFocus: onFocusProp,\n onInputChange: onInputChangeProp,\n onBlur: onBlurProp,\n onKeyDown: onKeyDownProp,\n dropdownOffsetDistance = 0,\n allowClearButton,\n clearButtonTestId,\n delimiter,\n ...restProps\n}: ChipsSelectProps<Option>): React.ReactNode => {\n const {\n // Связано с ChipsInputProps\n // option\n value,\n addOptionFromInput,\n addOption,\n removeOption,\n clearOptions,\n // input\n inputRef: inputRefHook,\n inputValue,\n clearInput,\n onInputChange,\n\n // Связано с CustomSelectDropdownProps\n options,\n opened,\n setOpened,\n focusedOption,\n focusedOptionIndex,\n setFocusedOption,\n setFocusedOptionIndex,\n } = useChipsSelect({\n // option\n value: valueProp,\n defaultValue,\n onChange,\n getOptionValue,\n getOptionLabel,\n getNewOptionData,\n\n // input\n inputValue: inputValueProp,\n defaultInputValue,\n onInputChange: onInputChangeProp,\n\n // dropdown\n options: optionsProp,\n emptyText,\n creatable,\n filterFn,\n sortFn,\n selectedBehavior,\n onClose,\n onOpen,\n\n // other\n disabled,\n delimiter,\n });\n\n // Связано с ChipsInputProps\n const rootRef = useExternRef(getRootRef);\n const inputRef = useExternRef(getRef, inputRefHook);\n const forbidCloseByOutsideClick = React.useRef(false);\n\n // Связано с CustomSelectDropdownProps\n const [dropdownVerticalPlacement, setDropdownVerticalPlacement] = React.useState<\n 'top' | 'bottom'\n >(placementProp);\n\n const onDropdownPlacementChange = React.useCallback((placement: Placement) => {\n if (placement.startsWith('top')) {\n setDropdownVerticalPlacement('top');\n } else if (placement.startsWith('bottom')) {\n setDropdownVerticalPlacement('bottom');\n }\n }, []);\n\n const dropdownId = React.useId();\n const dropdownCurrentItemId =\n focusedOptionIndex !== null ? `${dropdownId}-${focusedOptionIndex}` : undefined;\n const dropdownScrollBoxRef = React.useRef<HTMLDivElement>(null);\n\n const handleFocus = (event: React.FocusEvent<HTMLInputElement>) => {\n if (onFocusProp) {\n onFocusProp(event);\n }\n\n if (!readOnly) {\n setOpened(true);\n setFocusedOptionIndex(null);\n }\n };\n\n const handleBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n if (onBlurProp) {\n onBlurProp(event);\n }\n\n // Не добавляем значение, если его нужно выбрать строго из списка\n if (!readOnly && !event.defaultPrevented && !creatable) {\n event.preventDefault();\n }\n };\n\n const chipsSelectOptions = React.useRef<HTMLElement[]>([]).current;\n\n const scrollToElement = (index: number, center = false) => {\n const dropdown = dropdownScrollBoxRef.current;\n const item = chipsSelectOptions[index];\n\n /* istanbul ignore if: невозможный кейс (в SSR вызова этой функции не будет) */\n if (!item || !dropdown) {\n return;\n }\n\n const dropdownHeight = dropdown.offsetHeight;\n const scrollTop = dropdown.scrollTop;\n const itemTop = item.offsetTop;\n const itemHeight = item.offsetHeight;\n\n /* istanbul ignore next: нет представления как воспроизвести */\n if (center) {\n dropdown.scrollTop = itemTop - dropdownHeight / 2 + itemHeight / 2;\n } else if (itemTop + itemHeight > dropdownHeight + scrollTop) {\n dropdown.scrollTop = itemTop - dropdownHeight + itemHeight;\n } else if (itemTop < scrollTop) {\n dropdown.scrollTop = itemTop;\n }\n };\n\n const focusOptionByIndex = (index: number, oldIndex: number | null) => {\n if (index === oldIndex) {\n /* istanbul ignore next: нет представления как воспроизвести */\n return;\n }\n\n const option = options[index];\n\n if (isNotServicePreset(option) && option.disabled) {\n return;\n }\n\n scrollToElement(index);\n setFocusedOptionIndex(index);\n };\n\n const focusOption = (nextIndex: number | null, type: FocusActionType) => {\n let index = nextIndex === null ? -1 : nextIndex;\n\n if (type === FOCUS_ACTION_NEXT) {\n const nextIndex = findIndexAfter(options, index);\n index = nextIndex === -1 ? findIndexAfter(options) : nextIndex; // Следующий за index или первый валидный до index\n } else if (type === FOCUS_ACTION_PREV) {\n const beforeIndex = findIndexBefore(options, index);\n index = beforeIndex === -1 ? findIndexBefore(options) : beforeIndex; // Предшествующий index или последний валидный после index\n }\n\n focusOptionByIndex(index, focusedOptionIndex);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (onKeyDownProp) {\n onKeyDownProp(event);\n }\n\n if (event.defaultPrevented || readOnly) {\n return;\n }\n\n switch (event.key) {\n case Keys.ARROW_UP:\n case Keys.ARROW_DOWN:\n event.preventDefault();\n\n if (!opened) {\n setOpened(true);\n focusOption(null, FOCUS_ACTION_NEXT);\n } else {\n focusOption(\n focusedOptionIndex,\n event.key === Keys.ARROW_UP ? FOCUS_ACTION_PREV : FOCUS_ACTION_NEXT,\n );\n }\n break;\n case Keys.ENTER: {\n if (!opened) {\n break;\n }\n if (focusedOptionIndex != null) {\n const foundOption = options[focusedOptionIndex];\n if (foundOption && isNotServicePreset(foundOption)) {\n event.preventDefault();\n\n if (onChangeStart) {\n onChangeStart(event, foundOption);\n }\n\n addOption(foundOption);\n setFocusedOptionIndex(null);\n clearInput();\n if (closeAfterSelect) {\n setOpened(false);\n }\n\n break;\n }\n }\n\n if (!creatable) {\n event.preventDefault();\n }\n break;\n }\n case Keys.ESCAPE:\n case Keys.TAB:\n if (opened) {\n setOpened(false);\n }\n }\n };\n\n React.useEffect(() => {\n if (focusedOptionIndex === null) {\n setFocusedOption(null);\n } else {\n const foundFocusedOptionIndex = options[focusedOptionIndex];\n\n if (foundFocusedOptionIndex && isNotServicePreset(foundFocusedOptionIndex)) {\n setFocusedOption(foundFocusedOptionIndex);\n }\n }\n }, [options, focusedOptionIndex, setFocusedOption]);\n\n const onDropdownMouseLeave = React.useCallback(() => {\n setFocusedOptionIndex(null);\n }, [setFocusedOptionIndex]);\n\n const handleClickOutside = React.useCallback(() => {\n if (!forbidCloseByOutsideClick.current) {\n setOpened(false);\n }\n forbidCloseByOutsideClick.current = false;\n }, [setOpened]);\n\n useGlobalOnClickOutside(\n handleClickOutside,\n opened ? rootRef : null,\n opened ? dropdownScrollBoxRef : null,\n );\n\n const onDropdownIconClick: MouseEventHandler<SVGSVGElement> = React.useCallback(\n (e) => {\n if (opened) {\n e.preventDefault();\n setOpened(false);\n }\n },\n [opened, setOpened],\n );\n\n const dropdownContent = React.useMemo(() => {\n const defaultDropdownContent = options.map((option, index) => {\n const dropdownItemId = `${dropdownId}-${index}`;\n\n if (isEmptyOptionPreset(option)) {\n return (\n <Footnote key=\"empty-text\" className={styles.empty}>\n {option.placeholder}\n </Footnote>\n );\n }\n if (isCreateNewOptionPreset(option)) {\n return (\n <CustomSelectOption\n key=\"create-new-option\"\n id={dropdownItemId}\n hovered={focusedOptionIndex === index}\n onMouseDown={() => addOptionFromInput(inputValue)}\n onMouseEnter={() => setFocusedOptionIndex(index)}\n >\n {option.actionText}\n </CustomSelectOption>\n );\n }\n return (\n <React.Fragment key={`${typeof option.value}-${option.value}`}>\n {renderOption(\n {\n id: dropdownItemId,\n disabled: option.disabled,\n hovered: focusedOption\n ? getOptionValue(option) === getOptionValue(focusedOption)\n : false,\n children: option.label,\n selected: !!value.find(\n (selectedOption: Option) =>\n getOptionValue(selectedOption) === getOptionValue(option),\n ),\n getRootRef(node) {\n if (node) {\n chipsSelectOptions[index] = node;\n }\n },\n onMouseDown(event: React.MouseEvent<HTMLDivElement>) {\n if (option.disabled) {\n return;\n }\n if (onChangeStart) {\n onChangeStart(event, option);\n }\n\n if (!event.defaultPrevented) {\n closeAfterSelect && setOpened(false);\n addOption(option);\n forbidCloseByOutsideClick.current = true;\n clearInput();\n }\n },\n onMouseEnter() {\n setFocusedOptionIndex(index);\n },\n },\n option,\n )}\n </React.Fragment>\n );\n });\n\n if (renderDropdown) {\n return renderDropdown({\n defaultDropdownContent,\n });\n }\n return defaultDropdownContent;\n }, [\n addOption,\n addOptionFromInput,\n chipsSelectOptions,\n clearInput,\n closeAfterSelect,\n dropdownId,\n focusedOption,\n focusedOptionIndex,\n getOptionValue,\n inputValue,\n onChangeStart,\n options,\n renderDropdown,\n renderOption,\n setFocusedOptionIndex,\n setOpened,\n value,\n ]);\n\n const openedClassNames = React.useMemo(\n () =>\n (opened &&\n dropdownOffsetDistance === 0 &&\n (dropdownVerticalPlacement.includes('top') ? styles.popUp : styles.popDown)) ||\n undefined,\n [dropdownOffsetDistance, opened, dropdownVerticalPlacement],\n );\n\n const clearButtonShown = allowClearButton && (!!value.length || !!inputValue.length);\n\n return (\n <>\n <ChipsInputBase\n {...restProps}\n disabled={disabled}\n readOnly={readOnly}\n clearButtonShown={clearButtonShown}\n clearButtonTestId={clearButtonTestId}\n // FormFieldProps\n id={labelledbyId}\n getRootRef={rootRef}\n className={classNames(styles.host, openedClassNames, className)}\n status={status}\n after={\n dropdownIconProp || (\n <DropdownIcon\n opened={opened}\n onClick={onDropdownIconClick}\n className={classNames(\n styles.dropdownIcon,\n clearButtonShown && styles.dropdownIconWithOffset,\n )}\n />\n )\n }\n // option\n value={value}\n onAddChipOption={addOptionFromInput}\n onRemoveChipOption={removeOption}\n renderChip={renderChip}\n onClear={clearOptions}\n // input\n getRef={inputRef}\n inputValue={inputValue}\n onInputChange={onInputChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n // a11y\n role=\"combobox\"\n aria-expanded={opened}\n aria-autocomplete=\"list\"\n aria-controls={opened ? dropdownId : undefined}\n aria-activedescendant={opened ? dropdownCurrentItemId : undefined}\n aria-haspopup=\"listbox\"\n />\n {opened && (\n <CustomSelectDropdown\n data-testid={dropdownTestId}\n targetRef={rootRef}\n placement={dropdownVerticalPlacement}\n scrollBoxRef={dropdownScrollBoxRef}\n onPlacementChange={onDropdownPlacementChange}\n onMouseLeave={onDropdownMouseLeave}\n fetching={fetching}\n autoWidth={dropdownAutoWidth}\n forcePortal={forceDropdownPortal}\n noMaxHeight={noMaxHeight}\n offsetDistance={dropdownOffsetDistance}\n overscrollBehavior={overscrollBehavior}\n // a11y\n id={dropdownId}\n role=\"listbox\"\n aria-labelledby={labelledbyId}\n >\n {dropdownContent}\n </CustomSelectDropdown>\n )}\n </>\n );\n};\n"],"names":["React","classNames","useExternRef","useGlobalOnClickOutside","Keys","defaultFilterFn","ChipsInputBase","getNewOptionDataDefault","getOptionLabelDefault","getOptionValueDefault","renderChipDefault","CustomSelectDropdown","CustomSelectOption","DropdownIcon","Footnote","DEFAULT_EMPTY_TEXT","DEFAULT_SELECTED_BEHAVIOR","FOCUS_ACTION_NEXT","FOCUS_ACTION_PREV","isCreateNewOptionPreset","isEmptyOptionPreset","isNotServicePreset","renderOptionDefault","useChipsSelect","styles","findIndexAfter","options","startIndex","length","findIndex","option","i","disabled","findIndexBefore","endIndex","result","ChipsSelect","id","labelledbyId","getRootRef","className","status","icon","dropdownIconProp","onChangeStart","optionsProp","placement","placementProp","closeAfterSelect","selectedBehavior","emptyText","creatable","fetching","dropdownAutoWidth","forceDropdownPortal","noMaxHeight","filterFn","sortFn","dropdownTestId","onClose","onOpen","overscrollBehavior","renderDropdown","getRef","value","valueProp","defaultValue","inputValue","inputValueProp","defaultInputValue","readOnly","getOptionValue","getOptionLabel","getNewOptionData","renderChip","renderOption","onChange","onFocus","onFocusProp","onInputChange","onInputChangeProp","onBlur","onBlurProp","onKeyDown","onKeyDownProp","dropdownOffsetDistance","allowClearButton","clearButtonTestId","delimiter","restProps","addOptionFromInput","addOption","removeOption","clearOptions","inputRef","inputRefHook","clearInput","opened","setOpened","focusedOption","focusedOptionIndex","setFocusedOption","setFocusedOptionIndex","rootRef","forbidCloseByOutsideClick","useRef","dropdownVerticalPlacement","setDropdownVerticalPlacement","useState","onDropdownPlacementChange","useCallback","startsWith","dropdownId","useId","dropdownCurrentItemId","undefined","dropdownScrollBoxRef","handleFocus","event","handleBlur","defaultPrevented","preventDefault","chipsSelectOptions","current","scrollToElement","index","center","dropdown","item","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","focusOptionByIndex","oldIndex","focusOption","nextIndex","type","beforeIndex","handleKeyDown","key","ARROW_UP","ARROW_DOWN","ENTER","foundOption","ESCAPE","TAB","useEffect","foundFocusedOptionIndex","onDropdownMouseLeave","handleClickOutside","onDropdownIconClick","e","dropdownContent","useMemo","defaultDropdownContent","map","dropdownItemId","empty","placeholder","hovered","onMouseDown","onMouseEnter","actionText","Fragment","children","label","selected","find","selectedOption","node","openedClassNames","includes","popUp","popDown","clearButtonShown","host","after","onClick","dropdownIcon","dropdownIconWithOffset","onAddChipOption","onRemoveChipOption","onClear","role","aria-expanded","aria-autocomplete","aria-controls","aria-activedescendant","aria-haspopup","data-testid","targetRef","scrollBoxRef","onPlacementChange","onMouseLeave","autoWidth","forcePortal","offsetDistance","aria-labelledby"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/ChipsSelect/ChipsSelect.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { type MouseEventHandler } from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useGlobalOnEventOutside } from '../../hooks/useGlobalOnClickOutside';\nimport { Keys } from '../../lib/accessibility';\nimport type { Placement } from '../../lib/floating';\nimport { defaultFilterFn } from '../../lib/select';\nimport { ChipsInputBase } from '../ChipsInputBase/ChipsInputBase';\nimport {\n getNewOptionDataDefault,\n getOptionLabelDefault,\n getOptionValueDefault,\n renderChipDefault,\n} from '../ChipsInputBase/constants';\nimport type { ChipOption, ChipsInputBaseProps } from '../ChipsInputBase/types';\nimport {\n CustomSelectDropdown,\n type CustomSelectDropdownProps,\n} from '../CustomSelectDropdown/CustomSelectDropdown';\nimport {\n CustomSelectOption,\n type CustomSelectOptionProps,\n} from '../CustomSelectOption/CustomSelectOption';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport type { FormFieldProps } from '../FormField/FormField';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport {\n DEFAULT_EMPTY_TEXT,\n DEFAULT_SELECTED_BEHAVIOR,\n FOCUS_ACTION_NEXT,\n FOCUS_ACTION_PREV,\n isCreateNewOptionPreset,\n isEmptyOptionPreset,\n isNotServicePreset,\n renderOptionDefault,\n} from './constants';\nimport type { FocusActionType, OptionPreset } from './types';\nimport { useChipsSelect, type UseChipsSelectProps } from './useChipsSelect';\nimport styles from './ChipsSelect.module.css';\n\nconst findIndexAfter = <O extends ChipOption>(\n options: Array<OptionPreset<O>> = [],\n startIndex = -1,\n) => {\n if (startIndex >= options.length - 1) {\n return -1;\n }\n return options.findIndex(\n (option, i) => i > startIndex && (!isNotServicePreset(option) || !option.disabled),\n );\n};\n\nconst findIndexBefore = <O extends ChipOption>(\n options: Array<OptionPreset<O>> = [],\n endIndex: number = options.length,\n) => {\n let result = -1;\n if (endIndex <= 0) {\n return result;\n }\n for (let i = endIndex - 1; i >= 0; i--) {\n let option = options[i];\n\n if (!isNotServicePreset(option) || !option.disabled) {\n result = i;\n break;\n }\n }\n return result;\n};\n\nexport interface ChipsSelectProps<O extends ChipOption>\n extends ChipsInputBaseProps<O>,\n UseChipsSelectProps<O>,\n Pick<FormFieldProps, 'status' | 'mode' | 'before'>,\n Pick<CustomSelectDropdownProps, 'overscrollBehavior'> {\n /**\n * Расположение выпадающего списка.\n */\n placement?: 'top' | 'bottom';\n /**\n * Отрисовка Spinner вместо списка опций в выпадающем списке.\n */\n fetching?: boolean;\n /**\n * Закрытие выпадающего списка после выбора элемента.\n */\n closeAfterSelect?: boolean;\n /**\n * Ширина раскрывающегося списка зависит от контента.\n */\n dropdownAutoWidth?: boolean;\n /**\n * Принудительно использовать портал.\n */\n forceDropdownPortal?: boolean;\n /**\n * Передает атрибут `data-testid` для дропдауна.\n */\n dropdownTestId?: string;\n /**\n * Иконка раскрывающегося списка.\n */\n icon?: React.ReactNode;\n /**\n * Добавляет значение в список на событие `onBlur` (использовать вместе с `creatable`).\n */\n addOnBlur?: boolean;\n /**\n * Отключает максимальную высоту по умолчанию.\n */\n noMaxHeight?: boolean;\n /**\n * Функция для отрисовки кастомной опции в выпадающем списке.\n */\n renderOption?: (props: CustomSelectOptionProps, option: O) => React.ReactNode;\n /**\n * Рендер-проп для кастомного рендера содержимого дропдауна.\n * В `defaultDropdownContent` содержится список опций.\n */\n renderDropdown?: ({\n defaultDropdownContent,\n }: {\n defaultDropdownContent: React.ReactNode;\n }) => React.ReactNode;\n /**\n * Событие срабатывающее перед `onChange`.\n */\n onChangeStart?: (event: React.MouseEvent | React.KeyboardEvent, option: O) => void;\n\n /**\n * Отступ от выпадающего списка.\n */\n dropdownOffsetDistance?: number;\n\n /**\n * Если `true`, то справа будет отображаться кнопка для очистки значения.\n */\n allowClearButton?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ChipsSelect\n */\nexport const ChipsSelect = <Option extends ChipOption>({\n // FormFieldProps\n id: labelledbyId,\n getRootRef,\n className,\n status = 'default',\n icon: dropdownIconProp,\n onChangeStart,\n\n // CustomSelectDropdownProps\n options: optionsProp,\n placement: placementProp = 'bottom',\n closeAfterSelect = true,\n selectedBehavior = DEFAULT_SELECTED_BEHAVIOR,\n emptyText = DEFAULT_EMPTY_TEXT,\n creatable = false,\n fetching = false,\n dropdownAutoWidth,\n forceDropdownPortal,\n noMaxHeight = false,\n filterFn = defaultFilterFn,\n sortFn = false,\n dropdownTestId,\n onClose,\n onOpen,\n overscrollBehavior,\n renderDropdown,\n\n // ChipsInputProps\n getRef,\n value: valueProp,\n defaultValue,\n inputValue: inputValueProp,\n defaultInputValue,\n disabled,\n readOnly,\n getOptionValue = getOptionValueDefault,\n getOptionLabel = getOptionLabelDefault,\n getNewOptionData = getNewOptionDataDefault,\n renderChip = renderChipDefault,\n renderOption = renderOptionDefault,\n onChange,\n onFocus: onFocusProp,\n onInputChange: onInputChangeProp,\n onBlur: onBlurProp,\n onKeyDown: onKeyDownProp,\n dropdownOffsetDistance = 0,\n allowClearButton,\n clearButtonTestId,\n delimiter,\n ...restProps\n}: ChipsSelectProps<Option>): React.ReactNode => {\n const {\n // Связано с ChipsInputProps\n // option\n value,\n addOptionFromInput,\n addOption,\n removeOption,\n clearOptions,\n // input\n inputRef: inputRefHook,\n inputValue,\n clearInput,\n onInputChange,\n\n // Связано с CustomSelectDropdownProps\n options,\n opened,\n setOpened,\n focusedOption,\n focusedOptionIndex,\n setFocusedOption,\n setFocusedOptionIndex,\n } = useChipsSelect({\n // option\n value: valueProp,\n defaultValue,\n onChange,\n getOptionValue,\n getOptionLabel,\n getNewOptionData,\n\n // input\n inputValue: inputValueProp,\n defaultInputValue,\n onInputChange: onInputChangeProp,\n\n // dropdown\n options: optionsProp,\n emptyText,\n creatable,\n filterFn,\n sortFn,\n selectedBehavior,\n onClose,\n onOpen,\n\n // other\n disabled,\n delimiter,\n });\n\n // Связано с ChipsInputProps\n const rootRef = useExternRef(getRootRef);\n const inputRef = useExternRef(getRef, inputRefHook);\n\n // Связано с CustomSelectDropdownProps\n const [dropdownVerticalPlacement, setDropdownVerticalPlacement] = React.useState<\n 'top' | 'bottom'\n >(placementProp);\n\n const onDropdownPlacementChange = React.useCallback((placement: Placement) => {\n if (placement.startsWith('top')) {\n setDropdownVerticalPlacement('top');\n } else if (placement.startsWith('bottom')) {\n setDropdownVerticalPlacement('bottom');\n }\n }, []);\n\n const dropdownId = React.useId();\n const dropdownCurrentItemId =\n focusedOptionIndex !== null ? `${dropdownId}-${focusedOptionIndex}` : undefined;\n const dropdownScrollBoxRef = React.useRef<HTMLDivElement>(null);\n\n const handleFocus = (event: React.FocusEvent<HTMLInputElement>) => {\n if (onFocusProp) {\n onFocusProp(event);\n }\n\n if (!readOnly) {\n setOpened(true);\n setFocusedOptionIndex(null);\n }\n };\n\n const handleBlur = (event: React.FocusEvent<HTMLInputElement>) => {\n if (onBlurProp) {\n onBlurProp(event);\n }\n\n // Не добавляем значение, если его нужно выбрать строго из списка\n if (!readOnly && !event.defaultPrevented && !creatable) {\n event.preventDefault();\n }\n };\n\n const chipsSelectOptions = React.useRef<HTMLElement[]>([]).current;\n\n const scrollToElement = (index: number, center = false) => {\n const dropdown = dropdownScrollBoxRef.current;\n const item = chipsSelectOptions[index];\n\n /* istanbul ignore if: невозможный кейс (в SSR вызова этой функции не будет) */\n if (!item || !dropdown) {\n return;\n }\n\n const dropdownHeight = dropdown.offsetHeight;\n const scrollTop = dropdown.scrollTop;\n const itemTop = item.offsetTop;\n const itemHeight = item.offsetHeight;\n\n /* istanbul ignore next: нет представления как воспроизвести */\n if (center) {\n dropdown.scrollTop = itemTop - dropdownHeight / 2 + itemHeight / 2;\n } else if (itemTop + itemHeight > dropdownHeight + scrollTop) {\n dropdown.scrollTop = itemTop - dropdownHeight + itemHeight;\n } else if (itemTop < scrollTop) {\n dropdown.scrollTop = itemTop;\n }\n };\n\n const focusOptionByIndex = (index: number, oldIndex: number | null) => {\n if (index === oldIndex) {\n /* istanbul ignore next: нет представления как воспроизвести */\n return;\n }\n\n const option = options[index];\n\n if (isNotServicePreset(option) && option.disabled) {\n return;\n }\n\n scrollToElement(index);\n setFocusedOptionIndex(index);\n };\n\n const focusOption = (nextIndex: number | null, type: FocusActionType) => {\n let index = nextIndex === null ? -1 : nextIndex;\n\n if (type === FOCUS_ACTION_NEXT) {\n const nextIndex = findIndexAfter(options, index);\n index = nextIndex === -1 ? findIndexAfter(options) : nextIndex; // Следующий за index или первый валидный до index\n } else if (type === FOCUS_ACTION_PREV) {\n const beforeIndex = findIndexBefore(options, index);\n index = beforeIndex === -1 ? findIndexBefore(options) : beforeIndex; // Предшествующий index или последний валидный после index\n }\n\n focusOptionByIndex(index, focusedOptionIndex);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n if (onKeyDownProp) {\n onKeyDownProp(event);\n }\n\n if (event.defaultPrevented || readOnly) {\n return;\n }\n\n switch (event.key) {\n case Keys.ARROW_UP:\n case Keys.ARROW_DOWN:\n event.preventDefault();\n\n if (!opened) {\n setOpened(true);\n focusOption(null, FOCUS_ACTION_NEXT);\n } else {\n focusOption(\n focusedOptionIndex,\n event.key === Keys.ARROW_UP ? FOCUS_ACTION_PREV : FOCUS_ACTION_NEXT,\n );\n }\n break;\n case Keys.ENTER: {\n if (!opened) {\n break;\n }\n if (focusedOptionIndex != null) {\n const foundOption = options[focusedOptionIndex];\n if (foundOption && isNotServicePreset(foundOption)) {\n event.preventDefault();\n\n if (onChangeStart) {\n onChangeStart(event, foundOption);\n }\n\n addOption(foundOption);\n setFocusedOptionIndex(null);\n clearInput();\n if (closeAfterSelect) {\n setOpened(false);\n }\n\n break;\n }\n }\n\n if (!creatable) {\n event.preventDefault();\n }\n break;\n }\n case Keys.ESCAPE:\n case Keys.TAB:\n if (opened) {\n setOpened(false);\n }\n }\n };\n\n React.useEffect(() => {\n if (focusedOptionIndex === null) {\n setFocusedOption(null);\n } else {\n const foundFocusedOptionIndex = options[focusedOptionIndex];\n\n if (foundFocusedOptionIndex && isNotServicePreset(foundFocusedOptionIndex)) {\n setFocusedOption(foundFocusedOptionIndex);\n }\n }\n }, [options, focusedOptionIndex, setFocusedOption]);\n\n const onDropdownMouseLeave = React.useCallback(() => {\n setFocusedOptionIndex(null);\n }, [setFocusedOptionIndex]);\n\n const handleClickOutside = React.useCallback(() => {\n setOpened(false);\n }, [setOpened]);\n\n useGlobalOnEventOutside(\n 'mousedown', // см. https://github.com/VKCOM/VKUI/pull/8582\n handleClickOutside,\n opened ? rootRef : null,\n opened ? dropdownScrollBoxRef : null,\n );\n\n const onDropdownIconClick: MouseEventHandler<SVGSVGElement> = React.useCallback(\n (e) => {\n if (opened) {\n e.preventDefault();\n setOpened(false);\n }\n },\n [opened, setOpened],\n );\n\n const dropdownContent = React.useMemo(() => {\n const defaultDropdownContent = options.map((option, index) => {\n const dropdownItemId = `${dropdownId}-${index}`;\n\n if (isEmptyOptionPreset(option)) {\n return (\n <Footnote key=\"empty-text\" className={styles.empty}>\n {option.placeholder}\n </Footnote>\n );\n }\n if (isCreateNewOptionPreset(option)) {\n return (\n <CustomSelectOption\n key=\"create-new-option\"\n id={dropdownItemId}\n hovered={focusedOptionIndex === index}\n onMouseDown={() => addOptionFromInput(inputValue)}\n onMouseEnter={() => setFocusedOptionIndex(index)}\n >\n {option.actionText}\n </CustomSelectOption>\n );\n }\n return (\n <React.Fragment key={`${typeof option.value}-${option.value}`}>\n {renderOption(\n {\n id: dropdownItemId,\n disabled: option.disabled,\n hovered: focusedOption\n ? getOptionValue(option) === getOptionValue(focusedOption)\n : false,\n children: option.label,\n selected: !!value.find(\n (selectedOption: Option) =>\n getOptionValue(selectedOption) === getOptionValue(option),\n ),\n getRootRef(node) {\n if (node) {\n chipsSelectOptions[index] = node;\n }\n },\n onMouseDown(event: React.MouseEvent<HTMLDivElement>) {\n if (option.disabled) {\n return;\n }\n if (onChangeStart) {\n onChangeStart(event, option);\n }\n\n if (!event.defaultPrevented) {\n closeAfterSelect && setOpened(false);\n addOption(option);\n clearInput();\n }\n },\n onMouseEnter() {\n setFocusedOptionIndex(index);\n },\n },\n option,\n )}\n </React.Fragment>\n );\n });\n\n if (renderDropdown) {\n return renderDropdown({\n defaultDropdownContent,\n });\n }\n return defaultDropdownContent;\n }, [\n addOption,\n addOptionFromInput,\n chipsSelectOptions,\n clearInput,\n closeAfterSelect,\n dropdownId,\n focusedOption,\n focusedOptionIndex,\n getOptionValue,\n inputValue,\n onChangeStart,\n options,\n renderDropdown,\n renderOption,\n setFocusedOptionIndex,\n setOpened,\n value,\n ]);\n\n const openedClassNames = React.useMemo(\n () =>\n (opened &&\n dropdownOffsetDistance === 0 &&\n (dropdownVerticalPlacement.includes('top') ? styles.popUp : styles.popDown)) ||\n undefined,\n [dropdownOffsetDistance, opened, dropdownVerticalPlacement],\n );\n\n const clearButtonShown = allowClearButton && (!!value.length || !!inputValue.length);\n\n return (\n <>\n <ChipsInputBase\n {...restProps}\n disabled={disabled}\n readOnly={readOnly}\n clearButtonShown={clearButtonShown}\n clearButtonTestId={clearButtonTestId}\n // FormFieldProps\n id={labelledbyId}\n getRootRef={rootRef}\n className={classNames(styles.host, openedClassNames, className)}\n status={status}\n after={\n dropdownIconProp || (\n <DropdownIcon\n opened={opened}\n onClick={onDropdownIconClick}\n className={classNames(\n styles.dropdownIcon,\n clearButtonShown && styles.dropdownIconWithOffset,\n )}\n />\n )\n }\n // option\n value={value}\n onAddChipOption={addOptionFromInput}\n onRemoveChipOption={removeOption}\n renderChip={renderChip}\n onClear={clearOptions}\n // input\n getRef={inputRef}\n inputValue={inputValue}\n onInputChange={onInputChange}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n // a11y\n role=\"combobox\"\n aria-expanded={opened}\n aria-autocomplete=\"list\"\n aria-controls={opened ? dropdownId : undefined}\n aria-activedescendant={opened ? dropdownCurrentItemId : undefined}\n aria-haspopup=\"listbox\"\n />\n {opened && (\n <CustomSelectDropdown\n data-testid={dropdownTestId}\n targetRef={rootRef}\n placement={dropdownVerticalPlacement}\n scrollBoxRef={dropdownScrollBoxRef}\n onPlacementChange={onDropdownPlacementChange}\n onMouseLeave={onDropdownMouseLeave}\n fetching={fetching}\n autoWidth={dropdownAutoWidth}\n forcePortal={forceDropdownPortal}\n noMaxHeight={noMaxHeight}\n offsetDistance={dropdownOffsetDistance}\n overscrollBehavior={overscrollBehavior}\n // a11y\n id={dropdownId}\n role=\"listbox\"\n aria-labelledby={labelledbyId}\n >\n {dropdownContent}\n </CustomSelectDropdown>\n )}\n </>\n );\n};\n"],"names":["React","classNames","useExternRef","useGlobalOnEventOutside","Keys","defaultFilterFn","ChipsInputBase","getNewOptionDataDefault","getOptionLabelDefault","getOptionValueDefault","renderChipDefault","CustomSelectDropdown","CustomSelectOption","DropdownIcon","Footnote","DEFAULT_EMPTY_TEXT","DEFAULT_SELECTED_BEHAVIOR","FOCUS_ACTION_NEXT","FOCUS_ACTION_PREV","isCreateNewOptionPreset","isEmptyOptionPreset","isNotServicePreset","renderOptionDefault","useChipsSelect","styles","findIndexAfter","options","startIndex","length","findIndex","option","i","disabled","findIndexBefore","endIndex","result","ChipsSelect","id","labelledbyId","getRootRef","className","status","icon","dropdownIconProp","onChangeStart","optionsProp","placement","placementProp","closeAfterSelect","selectedBehavior","emptyText","creatable","fetching","dropdownAutoWidth","forceDropdownPortal","noMaxHeight","filterFn","sortFn","dropdownTestId","onClose","onOpen","overscrollBehavior","renderDropdown","getRef","value","valueProp","defaultValue","inputValue","inputValueProp","defaultInputValue","readOnly","getOptionValue","getOptionLabel","getNewOptionData","renderChip","renderOption","onChange","onFocus","onFocusProp","onInputChange","onInputChangeProp","onBlur","onBlurProp","onKeyDown","onKeyDownProp","dropdownOffsetDistance","allowClearButton","clearButtonTestId","delimiter","restProps","addOptionFromInput","addOption","removeOption","clearOptions","inputRef","inputRefHook","clearInput","opened","setOpened","focusedOption","focusedOptionIndex","setFocusedOption","setFocusedOptionIndex","rootRef","dropdownVerticalPlacement","setDropdownVerticalPlacement","useState","onDropdownPlacementChange","useCallback","startsWith","dropdownId","useId","dropdownCurrentItemId","undefined","dropdownScrollBoxRef","useRef","handleFocus","event","handleBlur","defaultPrevented","preventDefault","chipsSelectOptions","current","scrollToElement","index","center","dropdown","item","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","focusOptionByIndex","oldIndex","focusOption","nextIndex","type","beforeIndex","handleKeyDown","key","ARROW_UP","ARROW_DOWN","ENTER","foundOption","ESCAPE","TAB","useEffect","foundFocusedOptionIndex","onDropdownMouseLeave","handleClickOutside","onDropdownIconClick","e","dropdownContent","useMemo","defaultDropdownContent","map","dropdownItemId","empty","placeholder","hovered","onMouseDown","onMouseEnter","actionText","Fragment","children","label","selected","find","selectedOption","node","openedClassNames","includes","popUp","popDown","clearButtonShown","host","after","onClick","dropdownIcon","dropdownIconWithOffset","onAddChipOption","onRemoveChipOption","onClear","role","aria-expanded","aria-autocomplete","aria-controls","aria-activedescendant","aria-haspopup","data-testid","targetRef","scrollBoxRef","onPlacementChange","onMouseLeave","autoWidth","forcePortal","offsetDistance","aria-labelledby"],"mappings":"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"}
@@ -85,7 +85,7 @@ const filter = (options, inputValue, filterFn)=>{
85
85
  * @see https://vkcom.github.io/VKUI/#/CustomSelect
86
86
  */ export function CustomSelect(props) {
87
87
  const [opened, setOpened] = React.useState(false);
88
- const { before, name, className, getRef, getRootRef, popupDirection = 'bottom', style, onChange, children, 'onInputChange': onInputChangeProp, renderDropdown, onOpen, onClose, fetching, forceDropdownPortal, selectType = 'default', searchable = false, 'renderOption': renderOptionProp = defaultRenderOptionFn, 'options': optionsProp, emptyText = 'Ничего не найдено', filterFn = defaultFilterFn, 'icon': iconProp, ClearButton = CustomSelectClearButton, allowClearButton = false, dropdownOffsetDistance = 0, dropdownAutoWidth = false, noMaxHeight = false, 'aria-labelledby': ariaLabelledBy, clearButtonTestId, nativeSelectTestId, defaultValue, required, getSelectInputRef, overscrollBehavior, onInputKeyDown, ...restProps } = props;
88
+ const { before, name, className, getRef, getRootRef, popupDirection = 'bottom', style, onChange, children, 'onInputChange': onInputChangeProp, renderDropdown, onOpen, onClose, fetching, forceDropdownPortal, selectType = 'default', searchable = false, 'renderOption': renderOptionProp = defaultRenderOptionFn, 'options': optionsProp, emptyText = 'Ничего не найдено', filterFn = defaultFilterFn, 'icon': iconProp, ClearButton = CustomSelectClearButton, allowClearButton = false, dropdownOffsetDistance = 0, dropdownAutoWidth = false, noMaxHeight = false, 'aria-labelledby': ariaLabelledBy, clearButtonTestId, nativeSelectTestId, defaultValue, required, getSelectInputRef, overscrollBehavior, onInputKeyDown, readOnly, ...restProps } = props;
89
89
  if (process.env.NODE_ENV === 'development') {
90
90
  checkOptionsValueType(optionsProp);
91
91
  }
@@ -564,7 +564,7 @@ const filter = (options, inputValue, filterFn)=>{
564
564
  iconProp,
565
565
  opened
566
566
  ]);
567
- const afterIcons = (icon || clearButtonShown) && /*#__PURE__*/ _jsxs(React.Fragment, {
567
+ const afterIcons = !readOnly && (icon || clearButtonShown) && /*#__PURE__*/ _jsxs(React.Fragment, {
568
568
  children: [
569
569
  clearButton,
570
570
  icon
@@ -659,13 +659,13 @@ const filter = (options, inputValue, filterFn)=>{
659
659
  onFocus: onFocus,
660
660
  onBlur: onBlur,
661
661
  className: openedClassNames,
662
- readOnly: !searchable,
662
+ readOnly: readOnly || !searchable,
663
663
  fetching: fetching,
664
664
  value: inputValue,
665
665
  onKeyUp: handleKeyUp,
666
- onKeyDown: _onInputKeyDown,
666
+ onKeyDown: !readOnly ? _onInputKeyDown : undefined,
667
667
  onChange: onInputChange,
668
- onClick: onClick,
668
+ onClick: !readOnly ? onClick : undefined,
669
669
  before: before,
670
670
  after: afterIcons,
671
671
  selectType: selectType,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/CustomSelect/CustomSelect.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames, debounce } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useFocusWithin } from '../../hooks/useFocusWithin';\nimport { useStateWithPrev } from '../../hooks/useStateWithPrev';\nimport { callMultiple } from '../../lib/callMultiple';\nimport { useDOM } from '../../lib/dom';\nimport type { Placement } from '../../lib/floating';\nimport { defaultFilterFn, type FilterFn } from '../../lib/select';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { warnOnce } from '../../lib/warnOnce';\nimport {\n CustomSelectDropdown,\n type CustomSelectDropdownProps,\n} from '../CustomSelectDropdown/CustomSelectDropdown';\nimport {\n CustomSelectOption,\n type CustomSelectOptionProps,\n} from '../CustomSelectOption/CustomSelectOption';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport type { FormFieldProps } from '../FormField/FormField';\nimport {\n NOT_SELECTED,\n remapFromNativeValueToSelectValue,\n remapFromSelectValueToNativeValue,\n} from '../NativeSelect/NativeSelect';\nimport type {\n NativeSelectProps,\n NativeSelectValue,\n SelectValue,\n} from '../NativeSelect/NativeSelect';\nimport type { SelectType } from '../Select/Select';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport {\n CustomSelectClearButton,\n type CustomSelectClearButtonProps,\n} from './CustomSelectClearButton';\nimport {\n CustomSelectInput,\n type CustomSelectInputProps,\n} from './CustomSelectInput/CustomSelectInput';\nimport styles from './CustomSelect.module.css';\n\nconst sizeYClassNames = {\n none: styles.sizeYNone,\n compact: styles.sizeYCompact,\n};\n\nconst findIndexAfter = (options: CustomSelectOptionInterface[] = [], startIndex = -1) => {\n if (startIndex >= options.length - 1) {\n return -1;\n }\n return options.findIndex((option, i) => i > startIndex && !option.disabled);\n};\n\nconst findIndexBefore = (\n options: CustomSelectOptionInterface[] = [],\n endIndex: number = options.length,\n) => {\n let result = -1;\n if (endIndex <= 0) {\n return result;\n }\n for (let i = endIndex - 1; i >= 0; i--) {\n let option = options[i];\n\n if (!option.disabled) {\n result = i;\n break;\n }\n }\n return result;\n};\n\nconst warn = warnOnce('CustomSelect');\n\nconst checkOptionsValueType = <T extends CustomSelectOptionInterface>(options: T[]) => {\n if (new Set(options.map((item) => typeof item.value)).size > 1) {\n warn(\n 'Некоторые значения ваших опций имеют разные типы. onChange всегда возвращает строковый тип.',\n 'error',\n );\n }\n};\n\nconst checkMixControlledAndUncontrolledState = (\n oldIsControlled: boolean,\n newIsControlled: boolean,\n) => {\n if (!oldIsControlled && newIsControlled) {\n warn(\n `Похоже, что компонент был переведен из состояния Uncontrolled в Controlled. Пожалуйста, не делайте так. Если вам нужно отобразить невыбранное состояние компонента, используйте value=null вместо undefined`,\n 'error',\n );\n }\n if (oldIsControlled && !newIsControlled) {\n warn(\n `Похоже, что компонент был переведен из состояния Controlled в Uncontrolled. Пожалуйста, не делайте так. Если вам нужно отобразить невыбранное состояние компонента, используйте value=null вместо undefined`,\n 'error',\n );\n }\n};\n\nfunction defaultRenderOptionFn<T extends CustomSelectOptionInterface>({\n option,\n ...props\n}: CustomSelectRenderOption<T>): React.ReactNode {\n return <CustomSelectOption {...props} />;\n}\n\nconst handleOptionDown: MouseEventHandler = (e: React.MouseEvent<HTMLElement>) => {\n e.preventDefault();\n};\n\nfunction findSelectedIndex<T extends CustomSelectOptionInterface>(\n options: T[] = [],\n value: SelectValue,\n) {\n if (value === NOT_SELECTED.CUSTOM) {\n return -1;\n }\n return (\n options.findIndex((item) => {\n value = typeof item.value === 'number' ? Number(value) : value;\n return item.value === value;\n }) ?? -1\n );\n}\n\nconst filter = <T extends CustomSelectOptionInterface>(\n options: SelectProps<T>['options'],\n inputValue: string,\n filterFn: SelectProps<T>['filterFn'],\n) => {\n return typeof filterFn === 'function'\n ? options.filter((option) => filterFn(inputValue, option))\n : options;\n};\n\n/* eslint-disable jsdoc/require-jsdoc */\ntype MousePosition = {\n x: React.MouseEvent['clientX'];\n y: React.MouseEvent['clientY'];\n};\n/* eslint-enable jsdoc/require-jsdoc */\n\nfunction isMousePositionChanged(event: React.MouseEvent, prevPosition: MousePosition) {\n return (\n Math.abs(prevPosition.x - event.clientX) >= 1 || Math.abs(prevPosition.y - event.clientY) >= 1\n );\n}\n\nexport interface CustomSelectOptionInterface {\n /**\n * Значение.\n */\n value: Exclude<SelectValue, null>;\n /**\n * Отображаемый текст.\n */\n label: React.ReactElement | string;\n /**\n * Блокировка взаимодействия с компонентом.\n */\n disabled?: boolean;\n [index: string]: any;\n}\n\nexport interface CustomSelectRenderOption<T extends CustomSelectOptionInterface>\n extends CustomSelectOptionProps {\n /**\n * Данные об опции.\n */\n option: T;\n}\n\nexport type { CustomSelectClearButtonProps };\n\nexport interface SelectProps<\n OptionInterfaceT extends CustomSelectOptionInterface = CustomSelectOptionInterface,\n> extends NativeSelectProps,\n Omit<FormFieldProps, 'maxHeight'>,\n Pick<CustomSelectDropdownProps, 'overscrollBehavior'>,\n Pick<CustomSelectInputProps, 'minLength' | 'maxLength' | 'pattern' | 'readOnly'> {\n /**\n * Ref на внутрений компонент input.\n */\n getSelectInputRef?: React.Ref<HTMLInputElement>;\n /**\n * Если `true`, то при нажатии на `CustomSelect` в нём появится текстовое поле для поиска по `options`. По умолчанию поиск\n * производится по `option.label`.\n */\n searchable?: boolean;\n /**\n * Текст, который будет отображен, если приходит пустой `options`.\n */\n emptyText?: string;\n /**\n * Событие изменения текстового поля.\n */\n onInputChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n /**\n * Список опций в списке.\n */\n options: OptionInterfaceT[];\n /**\n * Функция для кастомной фильтрации. По умолчанию поиск производится по `option.label`.\n */\n filterFn?: false | FilterFn<OptionInterfaceT>;\n /**\n * Направление раскрытия выпадающего списка.\n */\n popupDirection?: 'top' | 'bottom';\n /**\n * Рендер-проп для кастомного рендера опции.\n * В объекте аргумента приходят [свойства опции](https://vkcom.github.io/VKUI/#/CustomSelectOption?id=props).\n *\n * > ⚠️ Важно: cвойство опции `disabled` должно выставляться только через проп `options`.\n * > Запрещается выставлять `disabled` проп опциям в обход `options`, иначе `CustomSelect` не будет знать об актуальном состоянии\n * опции.\n */\n renderOption?: (props: CustomSelectRenderOption<OptionInterfaceT>) => React.ReactNode;\n /**\n * Рендер-проп для кастомного рендера содержимого дропдауна.\n * В `defaultDropdownContent` содержится список опций в виде скроллящегося блока.\n */\n renderDropdown?: ({\n defaultDropdownContent,\n }: {\n defaultDropdownContent: React.ReactNode;\n }) => React.ReactNode;\n /**\n * Если `true`, то в дропдауне вместо списка опций рисуется спиннер. При переданных `renderDropdown` и `fetching: true`\n * \"победит\" `renderDropdown`.\n */\n fetching?: boolean;\n /**\n * Обработчик закрытия выпадающего списка.\n */\n onClose?: VoidFunction;\n /**\n * Обработчик открытия выпадающего списка.\n */\n onOpen?: VoidFunction;\n /**\n * Иконка раскрывающегося списка.\n */\n icon?: React.ReactNode;\n /**\n * Кастомная кнопка для очистки значения.\n * Должна принимать обязательное свойство `onClick`.\n */\n ClearButton?: React.ComponentType<CustomSelectClearButtonProps>;\n /**\n * Если `true`, то справа будет отображаться кнопка для очистки значения.\n */\n allowClearButton?: boolean;\n /**\n * Передает атрибут `data-testid` для кнопки очистки.\n */\n clearButtonTestId?: string;\n /**\n * Отступ от выпадающего списка.\n */\n dropdownOffsetDistance?: number;\n /**\n * Ширина раскрывающегося списка зависит от контента.\n */\n dropdownAutoWidth?: boolean;\n /**\n * Использовать Portal для рендеринга выпадающего списка.\n */\n forceDropdownPortal?: boolean;\n /**\n * Тип отображения компонента.\n */\n selectType?: SelectType;\n /**\n * Отключает максимальную высоту по умолчанию.\n */\n noMaxHeight?: boolean;\n /**\n * Передает атрибут `data-testid` для элемента, внутри которого отображается текст выбранной опции `CustomSelect` или плейсхолдер.\n */\n labelTextTestId?: string;\n /**\n * Передает атрибут `data-testid` для нативного элемента `select`.\n */\n nativeSelectTestId?: string;\n /**\n * Обработчик события `keyDown` в поле ввода.\n */\n onInputKeyDown?: (e: React.KeyboardEvent, isOpen: boolean) => void;\n}\n\ntype MouseEventHandler = (event: React.MouseEvent<HTMLElement>) => void;\n\n/**\n * @see https://vkcom.github.io/VKUI/#/CustomSelect\n */\nexport function CustomSelect<OptionInterfaceT extends CustomSelectOptionInterface>(\n props: SelectProps<OptionInterfaceT>,\n): React.ReactNode {\n const [opened, setOpened] = React.useState(false);\n const {\n before,\n name,\n className,\n getRef,\n getRootRef,\n popupDirection = 'bottom',\n style,\n onChange,\n children,\n 'onInputChange': onInputChangeProp,\n renderDropdown,\n onOpen,\n onClose,\n fetching,\n forceDropdownPortal,\n selectType = 'default',\n searchable = false,\n 'renderOption': renderOptionProp = defaultRenderOptionFn,\n 'options': optionsProp,\n emptyText = 'Ничего не найдено',\n filterFn = defaultFilterFn,\n 'icon': iconProp,\n ClearButton = CustomSelectClearButton,\n allowClearButton = false,\n dropdownOffsetDistance = 0,\n dropdownAutoWidth = false,\n noMaxHeight = false,\n 'aria-labelledby': ariaLabelledBy,\n clearButtonTestId,\n nativeSelectTestId,\n defaultValue,\n required,\n getSelectInputRef,\n overscrollBehavior,\n onInputKeyDown,\n ...restProps\n } = props;\n\n if (process.env.NODE_ENV === 'development') {\n checkOptionsValueType(optionsProp);\n }\n\n const { sizeY = 'none' } = useAdaptivity();\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const handleRootRef = useExternRef(containerRef, getRootRef);\n const scrollBoxRef = React.useRef<HTMLDivElement | null>(null);\n const selectElRef = useExternRef(getRef);\n const optionsWrapperRef = React.useRef<HTMLDivElement>(null);\n const scrollPerformedRef = React.useRef(false);\n\n const [focusedOptionIndex, setFocusedOptionIndex] = React.useState<number | undefined>(-1);\n const [isControlledOutside, setIsControlledOutside] = React.useState(props.value !== undefined);\n const [inputValue, setInputValue] = React.useState('');\n const [[nativeSelectValue, prevNativeSelectValue], setNativeSelectValue] =\n useStateWithPrev<NativeSelectValue>(() => {\n if (props.value !== undefined) {\n return remapFromSelectValueToNativeValue(props.value);\n }\n if (defaultValue !== undefined) {\n return remapFromSelectValueToNativeValue(defaultValue);\n }\n return NOT_SELECTED.NATIVE;\n });\n\n const [popperPlacement, setPopperPlacement] = React.useState<Placement>(popupDirection);\n\n const options = React.useMemo(() => {\n return filter(optionsProp, inputValue, filterFn);\n }, [filterFn, inputValue, optionsProp]);\n\n const [selectedOptionIndex, setSelectedOptionIndex] = React.useState<number | undefined>(\n findSelectedIndex(options, props.value ?? defaultValue ?? null),\n );\n\n React.useEffect(\n function updateOptionsIndexes() {\n const value =\n props.value !== undefined\n ? props.value\n : remapFromNativeValueToSelectValue(nativeSelectValue);\n\n const selectedIndex = findSelectedIndex(options, value);\n setSelectedOptionIndex(selectedIndex);\n setFocusedOptionIndex(selectedIndex);\n },\n [props.value, nativeSelectValue, options, filterFn],\n );\n\n React.useEffect(\n function syncIsControlledState() {\n setIsControlledOutside((oldIsControlled) => {\n const newIsControlled = props.value !== undefined;\n checkMixControlledAndUncontrolledState(oldIsControlled, newIsControlled);\n return newIsControlled;\n });\n },\n [props.value],\n );\n\n React.useEffect(\n function syncNativeSelectValueWithPropValue() {\n if (props.value !== undefined) {\n setNativeSelectValue(remapFromSelectValueToNativeValue(props.value));\n }\n },\n [props.value, setNativeSelectValue],\n );\n\n useIsomorphicLayoutEffect(() => {\n if (\n options.some(({ value }) => nativeSelectValue === value) ||\n (allowClearButton && nativeSelectValue === NOT_SELECTED.NATIVE)\n ) {\n const event = new Event('change', { bubbles: true });\n\n selectElRef.current?.dispatchEvent(event);\n }\n }, [nativeSelectValue]);\n\n const selected = React.useMemo(() => {\n if (!options.length) {\n return null;\n }\n\n return selectedOptionIndex !== undefined ? options[selectedOptionIndex] : undefined;\n }, [options, selectedOptionIndex]);\n\n const openedClassNames = React.useMemo(\n () =>\n (opened &&\n dropdownOffsetDistance === 0 &&\n (popperPlacement.includes('top') ? styles.popUp : styles.popDown)) ||\n undefined,\n [dropdownOffsetDistance, opened, popperPlacement],\n );\n\n const scrollToElement = React.useCallback((index: number, center = false) => {\n const dropdown = scrollBoxRef.current;\n const optionsWrapper = optionsWrapperRef.current;\n const item =\n dropdown && optionsWrapper ? (optionsWrapper.children[index] as HTMLElement) : null;\n\n if (!item || !dropdown) {\n return;\n }\n\n const dropdownHeight = dropdown.offsetHeight;\n const scrollTop = dropdown.scrollTop;\n const itemTop = item.offsetTop;\n const itemHeight = item.offsetHeight;\n\n if (center) {\n dropdown.scrollTop = itemTop - dropdownHeight / 2 + itemHeight / 2;\n } else if (itemTop + itemHeight > dropdownHeight + scrollTop) {\n dropdown.scrollTop = itemTop - dropdownHeight + itemHeight;\n } else if (itemTop < scrollTop) {\n dropdown.scrollTop = itemTop;\n }\n }, []);\n\n const focusOptionByIndex = React.useCallback(\n (index: number | undefined, scrollTo = true) => {\n if (index === undefined || index < 0 || index > (options.length ?? 0) - 1) {\n return;\n }\n\n const option = options[index];\n\n if (option?.disabled) {\n return;\n }\n\n if (scrollTo) {\n scrollToElement(index);\n }\n\n setFocusedOptionIndex(index);\n },\n [options, scrollToElement],\n );\n\n const isValidIndex = React.useCallback(\n (index: number) => {\n return index >= 0 && index < (options.length ?? 0);\n },\n [options.length],\n );\n\n useIsomorphicLayoutEffect(() => {\n if (!opened) {\n scrollPerformedRef.current = false;\n return;\n }\n\n if (scrollPerformedRef.current) {\n return;\n }\n\n const isIndexValid = selectedOptionIndex !== undefined && isValidIndex(selectedOptionIndex);\n\n if (scrollBoxRef.current && isIndexValid) {\n scrollPerformedRef.current = true;\n scrollToElement(selectedOptionIndex, true);\n }\n }, [opened, selectedOptionIndex, scrollToElement, isValidIndex]);\n\n const [keyboardInput, setKeyboardInput] = React.useState('');\n const resetKeyboardInput = React.useCallback(() => {\n setKeyboardInput('');\n }, []);\n\n const resetFocusedOption = React.useCallback(() => {\n setFocusedOptionIndex(-1);\n }, []);\n\n const onKeyboardInput = React.useCallback(\n (key: string) => {\n if (!opened) {\n setOpened(true);\n }\n resetFocusedOption();\n const fullInput = keyboardInput + key;\n\n setKeyboardInput(fullInput);\n },\n [keyboardInput, opened, resetFocusedOption],\n );\n\n const close = React.useCallback(() => {\n resetKeyboardInput();\n\n setInputValue('');\n setOpened(false);\n resetFocusedOption();\n onClose?.();\n }, [onClose, resetKeyboardInput, resetFocusedOption]);\n\n const selectOption = React.useCallback(\n (index: number) => {\n const item = options[index];\n setNativeSelectValue(item?.value ?? NOT_SELECTED.NATIVE);\n close();\n\n const shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync =\n isControlledOutside &&\n props.value !== nativeSelectValue &&\n nativeSelectValue === item?.value;\n\n if (shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync) {\n const event = new Event('change', { bubbles: true });\n selectElRef.current?.dispatchEvent(event);\n }\n },\n [\n close,\n options,\n selectElRef,\n isControlledOutside,\n props.value,\n nativeSelectValue,\n setNativeSelectValue,\n ],\n );\n\n const selectFocused = React.useCallback(() => {\n if (focusedOptionIndex === undefined || !isValidIndex(focusedOptionIndex)) {\n return;\n }\n\n selectOption(focusedOptionIndex);\n }, [focusedOptionIndex, isValidIndex, selectOption]);\n\n const open = React.useCallback(() => {\n setOpened(true);\n setFocusedOptionIndex(selectedOptionIndex);\n\n if (typeof onOpen === 'function') {\n onOpen();\n }\n }, [onOpen, selectedOptionIndex]);\n\n const onBlur = React.useCallback(() => {\n close();\n const event = new Event('focusout', { bubbles: true });\n selectElRef.current?.dispatchEvent(event);\n }, [close, selectElRef]);\n\n const onFocus = React.useCallback(() => {\n const event = new Event('focusin', { bubbles: true });\n selectElRef.current?.dispatchEvent(event);\n }, [selectElRef]);\n\n const onClick = React.useCallback(() => {\n if (opened) {\n close();\n } else {\n open();\n }\n }, [close, open, opened]);\n\n const handleKeyUp = React.useMemo(() => debounce(resetKeyboardInput, 1000), [resetKeyboardInput]);\n\n const focusOption = React.useCallback(\n (type: 'next' | 'prev') => {\n let index = focusedOptionIndex;\n\n if (type === 'next') {\n const nextIndex = findIndexAfter(options, index);\n index = nextIndex === -1 ? findIndexAfter(options) : nextIndex; // Следующий за index или первый валидный до index\n } else if (type === 'prev') {\n const beforeIndex = findIndexBefore(options, index);\n index = beforeIndex === -1 ? findIndexBefore(options) : beforeIndex; // Предшествующий index или последний валидный после index\n }\n\n focusOptionByIndex(index);\n },\n [focusOptionByIndex, focusedOptionIndex, options],\n );\n\n const onNativeSelectChange: React.ChangeEventHandler<HTMLSelectElement> = (e) => {\n // для ситуаций, когда в опциях value это string а value/defaultValue это number\n // и наоборот, приводим значение nativeSelectValue из стейта к строке.\n // ведь nativeSelect всегда возвращает string в onChange, а пользователь\n // может использовать number для опций\n //\n // native select всегда возвращает string в качестве value в onChange\n // Когда селект контролируемый, то пользователь, в onChange может сохранить в свой стейт строку (например '3'), хотя\n // в качестве value опции может использовать число (3),\n // тогда строчное значение value ('3') из стейта пользователя\n // будет передано в CustomSelect, и после синхронизации nativeSelectValue (3) и props.value ('3') и после клика на уже выбранную опцию (3),\n // когда nativeSelectValue обновится на значение опции (число 3),\n // сравнение nativeSelectValue (3) и prevNativeSelectValue ('3') может не сработать лишь из-за того, что они в разных типах.\n const convertedNativeSelectValue =\n typeof nativeSelectValue === 'number' &&\n (typeof props.value === 'string' || typeof prevNativeSelectValue === 'string')\n ? String(nativeSelectValue)\n : nativeSelectValue;\n\n const isCalledWithSameControlledOptionValue =\n isControlledOutside &&\n props.value === remapFromNativeValueToSelectValue(convertedNativeSelectValue);\n\n const isNativeValueChanged =\n convertedNativeSelectValue !== prevNativeSelectValue && prevNativeSelectValue !== undefined;\n\n const isTriggeredByClearButton = allowClearButton && nativeSelectValue === NOT_SELECTED.NATIVE;\n\n const shouldCallOnChange =\n !isCalledWithSameControlledOptionValue && (isNativeValueChanged || isTriggeredByClearButton);\n\n if (!shouldCallOnChange) {\n return;\n }\n\n const remappedNativeValue = remapFromNativeValueToSelectValue(e.currentTarget.value);\n\n if (e.target.value === NOT_SELECTED.NATIVE) {\n e.target.value = '';\n }\n if (e.currentTarget.value === NOT_SELECTED.NATIVE) {\n e.currentTarget.value = '';\n }\n\n onChange?.(e, remappedNativeValue);\n };\n\n const onInputChange: React.ChangeEventHandler<HTMLInputElement> = React.useCallback(\n (e) => {\n onInputChangeProp && onInputChangeProp(e);\n setInputValue(e.target.value);\n },\n [onInputChangeProp],\n );\n\n const areOptionsShown = React.useCallback(() => {\n return scrollBoxRef.current !== null;\n }, []);\n\n const handleKeyDownSelect = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key.length === 1 && event.key !== ' ') {\n onKeyboardInput(event.key);\n return;\n }\n\n ['ArrowUp', 'ArrowDown', 'Escape', 'Enter'].includes(event.key) &&\n areOptionsShown() &&\n event.preventDefault();\n\n switch (event.key) {\n case 'ArrowUp':\n if (opened) {\n areOptionsShown() && focusOption('prev');\n } else {\n open();\n }\n break;\n case 'ArrowDown':\n if (opened) {\n areOptionsShown() && focusOption('next');\n } else {\n open();\n }\n break;\n case 'Escape':\n close();\n break;\n case 'Backspace':\n case 'Delete': {\n if (!opened) {\n setOpened(true);\n }\n resetFocusedOption();\n\n break;\n }\n case 'Enter':\n case 'Spacebar':\n case ' ':\n if (opened) {\n areOptionsShown() && selectFocused();\n } else {\n open();\n }\n break;\n }\n },\n [\n areOptionsShown,\n close,\n focusOption,\n onKeyboardInput,\n open,\n opened,\n selectFocused,\n resetFocusedOption,\n ],\n );\n\n const handleInputKeydown = React.useCallback(\n (event: React.KeyboardEvent) => {\n onInputKeyDown?.(event, opened);\n },\n [opened, onInputKeyDown],\n );\n const _onInputKeyDown = callMultiple(handleKeyDownSelect, handleInputKeydown);\n\n const handleOptionClick = React.useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n const index = Array.prototype.indexOf.call(\n e.currentTarget.parentNode?.children,\n e.currentTarget,\n );\n const option = options[index];\n\n if (option && !option.disabled) {\n selectOption(index);\n }\n },\n [options, selectOption],\n );\n\n const lastMousePositionRef = React.useRef<MousePosition>({ x: 0, y: 0 });\n const focusOptionOnMouseMove = React.useCallback(\n (e: React.MouseEvent<HTMLElement>, index: number) => {\n if (isMousePositionChanged(e, lastMousePositionRef.current)) {\n focusOptionByIndex(index, false);\n }\n },\n [focusOptionByIndex],\n );\n\n const popupAriaId = React.useId();\n const renderOption = React.useCallback(\n (option: OptionInterfaceT, index: number) => {\n const hovered = index === focusedOptionIndex;\n const selected = index === selectedOptionIndex;\n\n return (\n <React.Fragment key={`${typeof option.value}-${option.value}`}>\n {renderOptionProp({\n option,\n hovered,\n children: option.label,\n selected,\n disabled: option.disabled,\n onClick: handleOptionClick,\n onMouseDown: handleOptionDown,\n // Используем `onMouseMove` вместо `onMouseEnter/onMouseOver`.\n // Потому что если при навигации с клавиатуры курсор наведён на\n // список, то при первом автоматическом скролле списка вызывается событие MouseOver/MouseEnter\n // обработчик которого фокусирует опцию под курсором, хотя при навигация с клавиатуры пользователь мог уйти дальше по списку, это путает.\n // Причём координаты события меняются на пару пикселей по сравнению с прошлым вызовом,\n // а значит нельзя на них опираться, чтобы запретить обработку такого события.\n // C mousemove такой проблемы нет, что позволяет реализовать поведение при наведении с клавиатуры и при наведении мышью идентично `<select>`.\n onMouseMove: (e) => focusOptionOnMouseMove(e, index),\n id: `${popupAriaId}-${option.value}`,\n ...option,\n })}\n </React.Fragment>\n );\n },\n [\n focusedOptionIndex,\n handleOptionClick,\n focusOptionOnMouseMove,\n renderOptionProp,\n selectedOptionIndex,\n popupAriaId,\n ],\n );\n\n const resolvedContent = React.useMemo(() => {\n const defaultDropdownContent =\n options.length > 0 ? (\n <div ref={optionsWrapperRef}>{options.map(renderOption)}</div>\n ) : (\n <Footnote className={styles.empty}>{emptyText}</Footnote>\n );\n\n if (typeof renderDropdown === 'function') {\n return renderDropdown({ defaultDropdownContent });\n } else {\n return defaultDropdownContent;\n }\n }, [emptyText, options, renderDropdown, renderOption]);\n\n const selectInputRef = useExternRef(getSelectInputRef);\n\n const controlledValueSet = isControlledOutside && props.value !== NOT_SELECTED.CUSTOM;\n const uncontrolledValueSet = !isControlledOutside && nativeSelectValue !== NOT_SELECTED.NATIVE;\n const clearButtonShown =\n allowClearButton && !opened && (controlledValueSet || uncontrolledValueSet);\n\n const clearButton = React.useMemo(() => {\n if (!clearButtonShown) {\n return null;\n }\n\n return (\n <ClearButton\n className={iconProp === undefined ? styles.clearIcon : undefined}\n onClick={function clearSelectState() {\n setNativeSelectValue(NOT_SELECTED.NATIVE);\n setInputValue('');\n selectInputRef.current && selectInputRef.current.focus();\n }}\n disabled={restProps.disabled}\n data-testid={clearButtonTestId}\n />\n );\n }, [\n clearButtonShown,\n ClearButton,\n iconProp,\n restProps.disabled,\n clearButtonTestId,\n setNativeSelectValue,\n selectInputRef,\n ]);\n\n const icon = React.useMemo(() => {\n if (iconProp !== undefined) {\n return iconProp;\n }\n\n return (\n <DropdownIcon\n className={clearButtonShown ? styles.dropdownIcon : undefined}\n opened={opened}\n />\n );\n }, [clearButtonShown, iconProp, opened]);\n\n const afterIcons = (icon || clearButtonShown) && (\n <React.Fragment>\n {clearButton}\n {icon}\n </React.Fragment>\n );\n\n const { document } = useDOM();\n const passClickAndFocusToInputOnClick = React.useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n // Раньше внешней оберткой CustomSelect был <label>, что позволяло по клику в любую область CustomSelect,\n // даже где нету интерактивного элемента, фокусировать <input> и передавать на него событие клика.\n // Так как мы больше не оборачиваем CustomSelect в <label>, то для обертки CustomSelect мы симулируем работу <label>.\n // передаем фокус и клик по <input>, если пользователь кликнул в зоне обертки.\n // В <label> мы не больше не оборачиваем, потому что это заставляет скринридер\n // дважды произносить текст выбранной опции при фокусе, если CustomSelect связан с внешним <label>.\n // Воспроизводится в некоторых версиях Chrome, при навигации по странице с помощью стрелок.\n // Договорились со специалистом по доступности убрать <label>-обёртки из Select и CustomSelect\n\n if (!selectInputRef.current || !document) {\n return;\n }\n\n const clickTargetIsNotAnInput = e.target !== selectInputRef.current;\n if (clickTargetIsNotAnInput) {\n selectInputRef.current.click();\n\n const inputIsNotFocused = document.activeElement !== selectInputRef.current;\n if (inputIsNotFocused) {\n selectInputRef.current.focus();\n }\n }\n },\n [document, selectInputRef],\n );\n\n const preventInputBlurWhenClickInsideFocusedSelectArea = (\n e: React.MouseEvent<HTMLDivElement>,\n ) => {\n // Так как инпут больше не оборачивается пустым лэйблом, то клик внутри обертки,\n // но вне инпута (например по иконке дропдауна), будет убирать фокус с инпута.\n // Чтобы в такой ситуации отключить blur инпута мы превентим mousedown событие обёртки\n const isInputFocused = document && document.activeElement === selectInputRef.current;\n if (isInputFocused) {\n e.preventDefault();\n }\n };\n\n const ariaActiveDescendantOptionIndex: undefined | number =\n focusedOptionIndex !== -1 ? focusedOptionIndex : undefined;\n const ariaActiveDescendantId =\n ariaActiveDescendantOptionIndex !== undefined\n ? options[ariaActiveDescendantOptionIndex] && options[ariaActiveDescendantOptionIndex].value\n : null;\n\n const selectInputAriaProps: React.HTMLAttributes<HTMLElement> = {\n 'role': 'combobox',\n 'aria-controls': popupAriaId,\n 'aria-owns': popupAriaId,\n 'aria-expanded': opened,\n 'aria-activedescendant':\n ariaActiveDescendantId && opened ? `${popupAriaId}-${ariaActiveDescendantId}` : undefined,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-haspopup': 'listbox',\n 'aria-autocomplete': 'none',\n };\n\n const focusWithin = useFocusWithin(handleRootRef);\n\n const resetOptionFocusOnMouseLeave = React.useCallback(\n (event: React.MouseEvent) => {\n // В Хроме eсли мышка пользователя находится над инпутом селекта,\n // и он с клавиатуры открывает опции, причём одна из опций\n // уже выбрана, то видно, как выбранная опция получает фокус,\n // но потом сразу же его теряет.\n // Связано это с тем, что в этот момент вызывается onMouseLeave, на который у нас\n // завязан сброс состония фокуса у опции. По хорошему фокус должен оставаться.\n // Нам не интересен вызов onMouseLeave если мышка при этом не двигалась.\n if (isMousePositionChanged(event, lastMousePositionRef.current)) {\n resetFocusedOption();\n }\n },\n [resetFocusedOption],\n );\n\n return (\n <div\n className={classNames(styles.host, sizeY !== 'regular' && sizeYClassNames[sizeY], className)}\n style={style}\n ref={handleRootRef}\n onClick={passClickAndFocusToInputOnClick}\n onMouseDown={preventInputBlurWhenClickInsideFocusedSelectArea}\n onMouseMove={function updateLastMousePosition(e) {\n lastMousePositionRef.current = { x: e.clientX, y: e.clientY };\n }}\n >\n {focusWithin && selected && !opened && (\n <VisuallyHidden aria-live=\"polite\">{selected.label}</VisuallyHidden>\n )}\n <CustomSelectInput\n autoComplete=\"off\"\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n {...restProps}\n {...selectInputAriaProps}\n getRef={selectInputRef}\n onFocus={onFocus}\n onBlur={onBlur}\n className={openedClassNames}\n readOnly={!searchable}\n fetching={fetching}\n value={inputValue}\n onKeyUp={handleKeyUp}\n onKeyDown={_onInputKeyDown}\n onChange={onInputChange}\n onClick={onClick}\n before={before}\n after={afterIcons}\n selectType={selectType}\n >\n {selected?.label}\n </CustomSelectInput>\n <select\n tabIndex={-1}\n ref={selectElRef}\n name={name}\n onChange={onNativeSelectChange}\n onBlur={props.onBlur}\n onFocus={props.onFocus}\n onClick={props.onClick}\n value={nativeSelectValue}\n aria-hidden\n className={styles.control}\n data-testid={nativeSelectTestId}\n required={required}\n >\n {(allowClearButton || nativeSelectValue === NOT_SELECTED.NATIVE) && (\n <option key={NOT_SELECTED.NATIVE} value={NOT_SELECTED.NATIVE} />\n )}\n {optionsProp.map((item) => (\n <option key={`${item.value}`} value={item.value} />\n ))}\n </select>\n {opened && (\n <CustomSelectDropdown\n targetRef={containerRef}\n placement={popperPlacement}\n scrollBoxRef={scrollBoxRef}\n onPlacementChange={setPopperPlacement}\n onMouseLeave={resetOptionFocusOnMouseLeave}\n fetching={fetching}\n overscrollBehavior={overscrollBehavior}\n offsetDistance={dropdownOffsetDistance}\n autoWidth={dropdownAutoWidth}\n forcePortal={forceDropdownPortal}\n noMaxHeight={noMaxHeight}\n role=\"listbox\"\n id={popupAriaId}\n aria-labelledby={ariaLabelledBy}\n tabIndex={-1}\n >\n {resolvedContent}\n </CustomSelectDropdown>\n )}\n </div>\n );\n}\n"],"names":["React","classNames","debounce","useAdaptivity","useExternRef","useFocusWithin","useStateWithPrev","callMultiple","useDOM","defaultFilterFn","useIsomorphicLayoutEffect","warnOnce","CustomSelectDropdown","CustomSelectOption","DropdownIcon","NOT_SELECTED","remapFromNativeValueToSelectValue","remapFromSelectValueToNativeValue","Footnote","VisuallyHidden","CustomSelectClearButton","CustomSelectInput","styles","sizeYClassNames","none","sizeYNone","compact","sizeYCompact","findIndexAfter","options","startIndex","length","findIndex","option","i","disabled","findIndexBefore","endIndex","result","warn","checkOptionsValueType","Set","map","item","value","size","checkMixControlledAndUncontrolledState","oldIsControlled","newIsControlled","defaultRenderOptionFn","props","handleOptionDown","e","preventDefault","findSelectedIndex","CUSTOM","Number","filter","inputValue","filterFn","isMousePositionChanged","event","prevPosition","Math","abs","x","clientX","y","clientY","CustomSelect","opened","setOpened","useState","before","name","className","getRef","getRootRef","popupDirection","style","onChange","children","onInputChangeProp","renderDropdown","onOpen","onClose","fetching","forceDropdownPortal","selectType","searchable","renderOptionProp","optionsProp","emptyText","iconProp","ClearButton","allowClearButton","dropdownOffsetDistance","dropdownAutoWidth","noMaxHeight","ariaLabelledBy","clearButtonTestId","nativeSelectTestId","defaultValue","required","getSelectInputRef","overscrollBehavior","onInputKeyDown","restProps","process","env","NODE_ENV","sizeY","containerRef","useRef","handleRootRef","scrollBoxRef","selectElRef","optionsWrapperRef","scrollPerformedRef","focusedOptionIndex","setFocusedOptionIndex","isControlledOutside","setIsControlledOutside","undefined","setInputValue","nativeSelectValue","prevNativeSelectValue","setNativeSelectValue","NATIVE","popperPlacement","setPopperPlacement","useMemo","selectedOptionIndex","setSelectedOptionIndex","useEffect","updateOptionsIndexes","selectedIndex","syncIsControlledState","syncNativeSelectValueWithPropValue","some","Event","bubbles","current","dispatchEvent","selected","openedClassNames","includes","popUp","popDown","scrollToElement","useCallback","index","center","dropdown","optionsWrapper","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","focusOptionByIndex","scrollTo","isValidIndex","isIndexValid","keyboardInput","setKeyboardInput","resetKeyboardInput","resetFocusedOption","onKeyboardInput","key","fullInput","close","selectOption","shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync","selectFocused","open","onBlur","onFocus","onClick","handleKeyUp","focusOption","type","nextIndex","beforeIndex","onNativeSelectChange","convertedNativeSelectValue","String","isCalledWithSameControlledOptionValue","isNativeValueChanged","isTriggeredByClearButton","shouldCallOnChange","remappedNativeValue","currentTarget","target","onInputChange","areOptionsShown","handleKeyDownSelect","handleInputKeydown","_onInputKeyDown","handleOptionClick","Array","prototype","indexOf","call","parentNode","lastMousePositionRef","focusOptionOnMouseMove","popupAriaId","useId","renderOption","hovered","Fragment","label","onMouseDown","onMouseMove","id","resolvedContent","defaultDropdownContent","div","ref","empty","selectInputRef","controlledValueSet","uncontrolledValueSet","clearButtonShown","clearButton","clearIcon","clearSelectState","focus","data-testid","icon","dropdownIcon","afterIcons","document","passClickAndFocusToInputOnClick","clickTargetIsNotAnInput","click","inputIsNotFocused","activeElement","preventInputBlurWhenClickInsideFocusedSelectArea","isInputFocused","ariaActiveDescendantOptionIndex","ariaActiveDescendantId","selectInputAriaProps","focusWithin","resetOptionFocusOnMouseLeave","host","updateLastMousePosition","aria-live","autoComplete","autoCapitalize","autoCorrect","spellCheck","readOnly","onKeyUp","onKeyDown","after","select","tabIndex","aria-hidden","control","targetRef","placement","onPlacementChange","onMouseLeave","offsetDistance","autoWidth","forcePortal","role","aria-labelledby"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/CustomSelect/CustomSelect.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames, debounce } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useFocusWithin } from '../../hooks/useFocusWithin';\nimport { useStateWithPrev } from '../../hooks/useStateWithPrev';\nimport { callMultiple } from '../../lib/callMultiple';\nimport { useDOM } from '../../lib/dom';\nimport type { Placement } from '../../lib/floating';\nimport { defaultFilterFn, type FilterFn } from '../../lib/select';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { warnOnce } from '../../lib/warnOnce';\nimport {\n CustomSelectDropdown,\n type CustomSelectDropdownProps,\n} from '../CustomSelectDropdown/CustomSelectDropdown';\nimport {\n CustomSelectOption,\n type CustomSelectOptionProps,\n} from '../CustomSelectOption/CustomSelectOption';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport type { FormFieldProps } from '../FormField/FormField';\nimport {\n NOT_SELECTED,\n remapFromNativeValueToSelectValue,\n remapFromSelectValueToNativeValue,\n} from '../NativeSelect/NativeSelect';\nimport type {\n NativeSelectProps,\n NativeSelectValue,\n SelectValue,\n} from '../NativeSelect/NativeSelect';\nimport type { SelectType } from '../Select/Select';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport {\n CustomSelectClearButton,\n type CustomSelectClearButtonProps,\n} from './CustomSelectClearButton';\nimport {\n CustomSelectInput,\n type CustomSelectInputProps,\n} from './CustomSelectInput/CustomSelectInput';\nimport styles from './CustomSelect.module.css';\n\nconst sizeYClassNames = {\n none: styles.sizeYNone,\n compact: styles.sizeYCompact,\n};\n\nconst findIndexAfter = (options: CustomSelectOptionInterface[] = [], startIndex = -1) => {\n if (startIndex >= options.length - 1) {\n return -1;\n }\n return options.findIndex((option, i) => i > startIndex && !option.disabled);\n};\n\nconst findIndexBefore = (\n options: CustomSelectOptionInterface[] = [],\n endIndex: number = options.length,\n) => {\n let result = -1;\n if (endIndex <= 0) {\n return result;\n }\n for (let i = endIndex - 1; i >= 0; i--) {\n let option = options[i];\n\n if (!option.disabled) {\n result = i;\n break;\n }\n }\n return result;\n};\n\nconst warn = warnOnce('CustomSelect');\n\nconst checkOptionsValueType = <T extends CustomSelectOptionInterface>(options: T[]) => {\n if (new Set(options.map((item) => typeof item.value)).size > 1) {\n warn(\n 'Некоторые значения ваших опций имеют разные типы. onChange всегда возвращает строковый тип.',\n 'error',\n );\n }\n};\n\nconst checkMixControlledAndUncontrolledState = (\n oldIsControlled: boolean,\n newIsControlled: boolean,\n) => {\n if (!oldIsControlled && newIsControlled) {\n warn(\n `Похоже, что компонент был переведен из состояния Uncontrolled в Controlled. Пожалуйста, не делайте так. Если вам нужно отобразить невыбранное состояние компонента, используйте value=null вместо undefined`,\n 'error',\n );\n }\n if (oldIsControlled && !newIsControlled) {\n warn(\n `Похоже, что компонент был переведен из состояния Controlled в Uncontrolled. Пожалуйста, не делайте так. Если вам нужно отобразить невыбранное состояние компонента, используйте value=null вместо undefined`,\n 'error',\n );\n }\n};\n\nfunction defaultRenderOptionFn<T extends CustomSelectOptionInterface>({\n option,\n ...props\n}: CustomSelectRenderOption<T>): React.ReactNode {\n return <CustomSelectOption {...props} />;\n}\n\nconst handleOptionDown: MouseEventHandler = (e: React.MouseEvent<HTMLElement>) => {\n e.preventDefault();\n};\n\nfunction findSelectedIndex<T extends CustomSelectOptionInterface>(\n options: T[] = [],\n value: SelectValue,\n) {\n if (value === NOT_SELECTED.CUSTOM) {\n return -1;\n }\n return (\n options.findIndex((item) => {\n value = typeof item.value === 'number' ? Number(value) : value;\n return item.value === value;\n }) ?? -1\n );\n}\n\nconst filter = <T extends CustomSelectOptionInterface>(\n options: SelectProps<T>['options'],\n inputValue: string,\n filterFn: SelectProps<T>['filterFn'],\n) => {\n return typeof filterFn === 'function'\n ? options.filter((option) => filterFn(inputValue, option))\n : options;\n};\n\n/* eslint-disable jsdoc/require-jsdoc */\ntype MousePosition = {\n x: React.MouseEvent['clientX'];\n y: React.MouseEvent['clientY'];\n};\n/* eslint-enable jsdoc/require-jsdoc */\n\nfunction isMousePositionChanged(event: React.MouseEvent, prevPosition: MousePosition) {\n return (\n Math.abs(prevPosition.x - event.clientX) >= 1 || Math.abs(prevPosition.y - event.clientY) >= 1\n );\n}\n\nexport interface CustomSelectOptionInterface {\n /**\n * Значение.\n */\n value: Exclude<SelectValue, null>;\n /**\n * Отображаемый текст.\n */\n label: React.ReactElement | string;\n /**\n * Блокировка взаимодействия с компонентом.\n */\n disabled?: boolean;\n [index: string]: any;\n}\n\nexport interface CustomSelectRenderOption<T extends CustomSelectOptionInterface>\n extends CustomSelectOptionProps {\n /**\n * Данные об опции.\n */\n option: T;\n}\n\nexport type { CustomSelectClearButtonProps };\n\nexport interface SelectProps<\n OptionInterfaceT extends CustomSelectOptionInterface = CustomSelectOptionInterface,\n> extends NativeSelectProps,\n Omit<FormFieldProps, 'maxHeight'>,\n Pick<CustomSelectDropdownProps, 'overscrollBehavior'>,\n Pick<CustomSelectInputProps, 'minLength' | 'maxLength' | 'pattern' | 'readOnly'> {\n /**\n * Ref на внутрений компонент input.\n */\n getSelectInputRef?: React.Ref<HTMLInputElement>;\n /**\n * Если `true`, то при нажатии на `CustomSelect` в нём появится текстовое поле для поиска по `options`. По умолчанию поиск\n * производится по `option.label`.\n */\n searchable?: boolean;\n /**\n * Текст, который будет отображен, если приходит пустой `options`.\n */\n emptyText?: string;\n /**\n * Событие изменения текстового поля.\n */\n onInputChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;\n /**\n * Список опций в списке.\n */\n options: OptionInterfaceT[];\n /**\n * Функция для кастомной фильтрации. По умолчанию поиск производится по `option.label`.\n */\n filterFn?: false | FilterFn<OptionInterfaceT>;\n /**\n * Направление раскрытия выпадающего списка.\n */\n popupDirection?: 'top' | 'bottom';\n /**\n * Рендер-проп для кастомного рендера опции.\n * В объекте аргумента приходят [свойства опции](https://vkcom.github.io/VKUI/#/CustomSelectOption?id=props).\n *\n * > ⚠️ Важно: cвойство опции `disabled` должно выставляться только через проп `options`.\n * > Запрещается выставлять `disabled` проп опциям в обход `options`, иначе `CustomSelect` не будет знать об актуальном состоянии\n * опции.\n */\n renderOption?: (props: CustomSelectRenderOption<OptionInterfaceT>) => React.ReactNode;\n /**\n * Рендер-проп для кастомного рендера содержимого дропдауна.\n * В `defaultDropdownContent` содержится список опций в виде скроллящегося блока.\n */\n renderDropdown?: ({\n defaultDropdownContent,\n }: {\n defaultDropdownContent: React.ReactNode;\n }) => React.ReactNode;\n /**\n * Если `true`, то в дропдауне вместо списка опций рисуется спиннер. При переданных `renderDropdown` и `fetching: true`\n * \"победит\" `renderDropdown`.\n */\n fetching?: boolean;\n /**\n * Обработчик закрытия выпадающего списка.\n */\n onClose?: VoidFunction;\n /**\n * Обработчик открытия выпадающего списка.\n */\n onOpen?: VoidFunction;\n /**\n * Иконка раскрывающегося списка.\n */\n icon?: React.ReactNode;\n /**\n * Кастомная кнопка для очистки значения.\n * Должна принимать обязательное свойство `onClick`.\n */\n ClearButton?: React.ComponentType<CustomSelectClearButtonProps>;\n /**\n * Если `true`, то справа будет отображаться кнопка для очистки значения.\n */\n allowClearButton?: boolean;\n /**\n * Передает атрибут `data-testid` для кнопки очистки.\n */\n clearButtonTestId?: string;\n /**\n * Отступ от выпадающего списка.\n */\n dropdownOffsetDistance?: number;\n /**\n * Ширина раскрывающегося списка зависит от контента.\n */\n dropdownAutoWidth?: boolean;\n /**\n * Использовать Portal для рендеринга выпадающего списка.\n */\n forceDropdownPortal?: boolean;\n /**\n * Тип отображения компонента.\n */\n selectType?: SelectType;\n /**\n * Отключает максимальную высоту по умолчанию.\n */\n noMaxHeight?: boolean;\n /**\n * Передает атрибут `data-testid` для элемента, внутри которого отображается текст выбранной опции `CustomSelect` или плейсхолдер.\n */\n labelTextTestId?: string;\n /**\n * Передает атрибут `data-testid` для нативного элемента `select`.\n */\n nativeSelectTestId?: string;\n /**\n * Обработчик события `keyDown` в поле ввода.\n */\n onInputKeyDown?: (e: React.KeyboardEvent, isOpen: boolean) => void;\n}\n\ntype MouseEventHandler = (event: React.MouseEvent<HTMLElement>) => void;\n\n/**\n * @see https://vkcom.github.io/VKUI/#/CustomSelect\n */\nexport function CustomSelect<OptionInterfaceT extends CustomSelectOptionInterface>(\n props: SelectProps<OptionInterfaceT>,\n): React.ReactNode {\n const [opened, setOpened] = React.useState(false);\n const {\n before,\n name,\n className,\n getRef,\n getRootRef,\n popupDirection = 'bottom',\n style,\n onChange,\n children,\n 'onInputChange': onInputChangeProp,\n renderDropdown,\n onOpen,\n onClose,\n fetching,\n forceDropdownPortal,\n selectType = 'default',\n searchable = false,\n 'renderOption': renderOptionProp = defaultRenderOptionFn,\n 'options': optionsProp,\n emptyText = 'Ничего не найдено',\n filterFn = defaultFilterFn,\n 'icon': iconProp,\n ClearButton = CustomSelectClearButton,\n allowClearButton = false,\n dropdownOffsetDistance = 0,\n dropdownAutoWidth = false,\n noMaxHeight = false,\n 'aria-labelledby': ariaLabelledBy,\n clearButtonTestId,\n nativeSelectTestId,\n defaultValue,\n required,\n getSelectInputRef,\n overscrollBehavior,\n onInputKeyDown,\n readOnly,\n ...restProps\n } = props;\n\n if (process.env.NODE_ENV === 'development') {\n checkOptionsValueType(optionsProp);\n }\n\n const { sizeY = 'none' } = useAdaptivity();\n\n const containerRef = React.useRef<HTMLDivElement>(null);\n const handleRootRef = useExternRef(containerRef, getRootRef);\n const scrollBoxRef = React.useRef<HTMLDivElement | null>(null);\n const selectElRef = useExternRef(getRef);\n const optionsWrapperRef = React.useRef<HTMLDivElement>(null);\n const scrollPerformedRef = React.useRef(false);\n\n const [focusedOptionIndex, setFocusedOptionIndex] = React.useState<number | undefined>(-1);\n const [isControlledOutside, setIsControlledOutside] = React.useState(props.value !== undefined);\n const [inputValue, setInputValue] = React.useState('');\n const [[nativeSelectValue, prevNativeSelectValue], setNativeSelectValue] =\n useStateWithPrev<NativeSelectValue>(() => {\n if (props.value !== undefined) {\n return remapFromSelectValueToNativeValue(props.value);\n }\n if (defaultValue !== undefined) {\n return remapFromSelectValueToNativeValue(defaultValue);\n }\n return NOT_SELECTED.NATIVE;\n });\n\n const [popperPlacement, setPopperPlacement] = React.useState<Placement>(popupDirection);\n\n const options = React.useMemo(() => {\n return filter(optionsProp, inputValue, filterFn);\n }, [filterFn, inputValue, optionsProp]);\n\n const [selectedOptionIndex, setSelectedOptionIndex] = React.useState<number | undefined>(\n findSelectedIndex(options, props.value ?? defaultValue ?? null),\n );\n\n React.useEffect(\n function updateOptionsIndexes() {\n const value =\n props.value !== undefined\n ? props.value\n : remapFromNativeValueToSelectValue(nativeSelectValue);\n\n const selectedIndex = findSelectedIndex(options, value);\n setSelectedOptionIndex(selectedIndex);\n setFocusedOptionIndex(selectedIndex);\n },\n [props.value, nativeSelectValue, options, filterFn],\n );\n\n React.useEffect(\n function syncIsControlledState() {\n setIsControlledOutside((oldIsControlled) => {\n const newIsControlled = props.value !== undefined;\n checkMixControlledAndUncontrolledState(oldIsControlled, newIsControlled);\n return newIsControlled;\n });\n },\n [props.value],\n );\n\n React.useEffect(\n function syncNativeSelectValueWithPropValue() {\n if (props.value !== undefined) {\n setNativeSelectValue(remapFromSelectValueToNativeValue(props.value));\n }\n },\n [props.value, setNativeSelectValue],\n );\n\n useIsomorphicLayoutEffect(() => {\n if (\n options.some(({ value }) => nativeSelectValue === value) ||\n (allowClearButton && nativeSelectValue === NOT_SELECTED.NATIVE)\n ) {\n const event = new Event('change', { bubbles: true });\n\n selectElRef.current?.dispatchEvent(event);\n }\n }, [nativeSelectValue]);\n\n const selected = React.useMemo(() => {\n if (!options.length) {\n return null;\n }\n\n return selectedOptionIndex !== undefined ? options[selectedOptionIndex] : undefined;\n }, [options, selectedOptionIndex]);\n\n const openedClassNames = React.useMemo(\n () =>\n (opened &&\n dropdownOffsetDistance === 0 &&\n (popperPlacement.includes('top') ? styles.popUp : styles.popDown)) ||\n undefined,\n [dropdownOffsetDistance, opened, popperPlacement],\n );\n\n const scrollToElement = React.useCallback((index: number, center = false) => {\n const dropdown = scrollBoxRef.current;\n const optionsWrapper = optionsWrapperRef.current;\n const item =\n dropdown && optionsWrapper ? (optionsWrapper.children[index] as HTMLElement) : null;\n\n if (!item || !dropdown) {\n return;\n }\n\n const dropdownHeight = dropdown.offsetHeight;\n const scrollTop = dropdown.scrollTop;\n const itemTop = item.offsetTop;\n const itemHeight = item.offsetHeight;\n\n if (center) {\n dropdown.scrollTop = itemTop - dropdownHeight / 2 + itemHeight / 2;\n } else if (itemTop + itemHeight > dropdownHeight + scrollTop) {\n dropdown.scrollTop = itemTop - dropdownHeight + itemHeight;\n } else if (itemTop < scrollTop) {\n dropdown.scrollTop = itemTop;\n }\n }, []);\n\n const focusOptionByIndex = React.useCallback(\n (index: number | undefined, scrollTo = true) => {\n if (index === undefined || index < 0 || index > (options.length ?? 0) - 1) {\n return;\n }\n\n const option = options[index];\n\n if (option?.disabled) {\n return;\n }\n\n if (scrollTo) {\n scrollToElement(index);\n }\n\n setFocusedOptionIndex(index);\n },\n [options, scrollToElement],\n );\n\n const isValidIndex = React.useCallback(\n (index: number) => {\n return index >= 0 && index < (options.length ?? 0);\n },\n [options.length],\n );\n\n useIsomorphicLayoutEffect(() => {\n if (!opened) {\n scrollPerformedRef.current = false;\n return;\n }\n\n if (scrollPerformedRef.current) {\n return;\n }\n\n const isIndexValid = selectedOptionIndex !== undefined && isValidIndex(selectedOptionIndex);\n\n if (scrollBoxRef.current && isIndexValid) {\n scrollPerformedRef.current = true;\n scrollToElement(selectedOptionIndex, true);\n }\n }, [opened, selectedOptionIndex, scrollToElement, isValidIndex]);\n\n const [keyboardInput, setKeyboardInput] = React.useState('');\n const resetKeyboardInput = React.useCallback(() => {\n setKeyboardInput('');\n }, []);\n\n const resetFocusedOption = React.useCallback(() => {\n setFocusedOptionIndex(-1);\n }, []);\n\n const onKeyboardInput = React.useCallback(\n (key: string) => {\n if (!opened) {\n setOpened(true);\n }\n resetFocusedOption();\n const fullInput = keyboardInput + key;\n\n setKeyboardInput(fullInput);\n },\n [keyboardInput, opened, resetFocusedOption],\n );\n\n const close = React.useCallback(() => {\n resetKeyboardInput();\n\n setInputValue('');\n setOpened(false);\n resetFocusedOption();\n onClose?.();\n }, [onClose, resetKeyboardInput, resetFocusedOption]);\n\n const selectOption = React.useCallback(\n (index: number) => {\n const item = options[index];\n setNativeSelectValue(item?.value ?? NOT_SELECTED.NATIVE);\n close();\n\n const shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync =\n isControlledOutside &&\n props.value !== nativeSelectValue &&\n nativeSelectValue === item?.value;\n\n if (shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync) {\n const event = new Event('change', { bubbles: true });\n selectElRef.current?.dispatchEvent(event);\n }\n },\n [\n close,\n options,\n selectElRef,\n isControlledOutside,\n props.value,\n nativeSelectValue,\n setNativeSelectValue,\n ],\n );\n\n const selectFocused = React.useCallback(() => {\n if (focusedOptionIndex === undefined || !isValidIndex(focusedOptionIndex)) {\n return;\n }\n\n selectOption(focusedOptionIndex);\n }, [focusedOptionIndex, isValidIndex, selectOption]);\n\n const open = React.useCallback(() => {\n setOpened(true);\n setFocusedOptionIndex(selectedOptionIndex);\n\n if (typeof onOpen === 'function') {\n onOpen();\n }\n }, [onOpen, selectedOptionIndex]);\n\n const onBlur = React.useCallback(() => {\n close();\n const event = new Event('focusout', { bubbles: true });\n selectElRef.current?.dispatchEvent(event);\n }, [close, selectElRef]);\n\n const onFocus = React.useCallback(() => {\n const event = new Event('focusin', { bubbles: true });\n selectElRef.current?.dispatchEvent(event);\n }, [selectElRef]);\n\n const onClick = React.useCallback(() => {\n if (opened) {\n close();\n } else {\n open();\n }\n }, [close, open, opened]);\n\n const handleKeyUp = React.useMemo(() => debounce(resetKeyboardInput, 1000), [resetKeyboardInput]);\n\n const focusOption = React.useCallback(\n (type: 'next' | 'prev') => {\n let index = focusedOptionIndex;\n\n if (type === 'next') {\n const nextIndex = findIndexAfter(options, index);\n index = nextIndex === -1 ? findIndexAfter(options) : nextIndex; // Следующий за index или первый валидный до index\n } else if (type === 'prev') {\n const beforeIndex = findIndexBefore(options, index);\n index = beforeIndex === -1 ? findIndexBefore(options) : beforeIndex; // Предшествующий index или последний валидный после index\n }\n\n focusOptionByIndex(index);\n },\n [focusOptionByIndex, focusedOptionIndex, options],\n );\n\n const onNativeSelectChange: React.ChangeEventHandler<HTMLSelectElement> = (e) => {\n // для ситуаций, когда в опциях value это string а value/defaultValue это number\n // и наоборот, приводим значение nativeSelectValue из стейта к строке.\n // ведь nativeSelect всегда возвращает string в onChange, а пользователь\n // может использовать number для опций\n //\n // native select всегда возвращает string в качестве value в onChange\n // Когда селект контролируемый, то пользователь, в onChange может сохранить в свой стейт строку (например '3'), хотя\n // в качестве value опции может использовать число (3),\n // тогда строчное значение value ('3') из стейта пользователя\n // будет передано в CustomSelect, и после синхронизации nativeSelectValue (3) и props.value ('3') и после клика на уже выбранную опцию (3),\n // когда nativeSelectValue обновится на значение опции (число 3),\n // сравнение nativeSelectValue (3) и prevNativeSelectValue ('3') может не сработать лишь из-за того, что они в разных типах.\n const convertedNativeSelectValue =\n typeof nativeSelectValue === 'number' &&\n (typeof props.value === 'string' || typeof prevNativeSelectValue === 'string')\n ? String(nativeSelectValue)\n : nativeSelectValue;\n\n const isCalledWithSameControlledOptionValue =\n isControlledOutside &&\n props.value === remapFromNativeValueToSelectValue(convertedNativeSelectValue);\n\n const isNativeValueChanged =\n convertedNativeSelectValue !== prevNativeSelectValue && prevNativeSelectValue !== undefined;\n\n const isTriggeredByClearButton = allowClearButton && nativeSelectValue === NOT_SELECTED.NATIVE;\n\n const shouldCallOnChange =\n !isCalledWithSameControlledOptionValue && (isNativeValueChanged || isTriggeredByClearButton);\n\n if (!shouldCallOnChange) {\n return;\n }\n\n const remappedNativeValue = remapFromNativeValueToSelectValue(e.currentTarget.value);\n\n if (e.target.value === NOT_SELECTED.NATIVE) {\n e.target.value = '';\n }\n if (e.currentTarget.value === NOT_SELECTED.NATIVE) {\n e.currentTarget.value = '';\n }\n\n onChange?.(e, remappedNativeValue);\n };\n\n const onInputChange: React.ChangeEventHandler<HTMLInputElement> = React.useCallback(\n (e) => {\n onInputChangeProp && onInputChangeProp(e);\n setInputValue(e.target.value);\n },\n [onInputChangeProp],\n );\n\n const areOptionsShown = React.useCallback(() => {\n return scrollBoxRef.current !== null;\n }, []);\n\n const handleKeyDownSelect = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (event.key.length === 1 && event.key !== ' ') {\n onKeyboardInput(event.key);\n return;\n }\n\n ['ArrowUp', 'ArrowDown', 'Escape', 'Enter'].includes(event.key) &&\n areOptionsShown() &&\n event.preventDefault();\n\n switch (event.key) {\n case 'ArrowUp':\n if (opened) {\n areOptionsShown() && focusOption('prev');\n } else {\n open();\n }\n break;\n case 'ArrowDown':\n if (opened) {\n areOptionsShown() && focusOption('next');\n } else {\n open();\n }\n break;\n case 'Escape':\n close();\n break;\n case 'Backspace':\n case 'Delete': {\n if (!opened) {\n setOpened(true);\n }\n resetFocusedOption();\n\n break;\n }\n case 'Enter':\n case 'Spacebar':\n case ' ':\n if (opened) {\n areOptionsShown() && selectFocused();\n } else {\n open();\n }\n break;\n }\n },\n [\n areOptionsShown,\n close,\n focusOption,\n onKeyboardInput,\n open,\n opened,\n selectFocused,\n resetFocusedOption,\n ],\n );\n\n const handleInputKeydown = React.useCallback(\n (event: React.KeyboardEvent) => {\n onInputKeyDown?.(event, opened);\n },\n [opened, onInputKeyDown],\n );\n const _onInputKeyDown = callMultiple(handleKeyDownSelect, handleInputKeydown);\n\n const handleOptionClick = React.useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n const index = Array.prototype.indexOf.call(\n e.currentTarget.parentNode?.children,\n e.currentTarget,\n );\n const option = options[index];\n\n if (option && !option.disabled) {\n selectOption(index);\n }\n },\n [options, selectOption],\n );\n\n const lastMousePositionRef = React.useRef<MousePosition>({ x: 0, y: 0 });\n const focusOptionOnMouseMove = React.useCallback(\n (e: React.MouseEvent<HTMLElement>, index: number) => {\n if (isMousePositionChanged(e, lastMousePositionRef.current)) {\n focusOptionByIndex(index, false);\n }\n },\n [focusOptionByIndex],\n );\n\n const popupAriaId = React.useId();\n const renderOption = React.useCallback(\n (option: OptionInterfaceT, index: number) => {\n const hovered = index === focusedOptionIndex;\n const selected = index === selectedOptionIndex;\n\n return (\n <React.Fragment key={`${typeof option.value}-${option.value}`}>\n {renderOptionProp({\n option,\n hovered,\n children: option.label,\n selected,\n disabled: option.disabled,\n onClick: handleOptionClick,\n onMouseDown: handleOptionDown,\n // Используем `onMouseMove` вместо `onMouseEnter/onMouseOver`.\n // Потому что если при навигации с клавиатуры курсор наведён на\n // список, то при первом автоматическом скролле списка вызывается событие MouseOver/MouseEnter\n // обработчик которого фокусирует опцию под курсором, хотя при навигация с клавиатуры пользователь мог уйти дальше по списку, это путает.\n // Причём координаты события меняются на пару пикселей по сравнению с прошлым вызовом,\n // а значит нельзя на них опираться, чтобы запретить обработку такого события.\n // C mousemove такой проблемы нет, что позволяет реализовать поведение при наведении с клавиатуры и при наведении мышью идентично `<select>`.\n onMouseMove: (e) => focusOptionOnMouseMove(e, index),\n id: `${popupAriaId}-${option.value}`,\n ...option,\n })}\n </React.Fragment>\n );\n },\n [\n focusedOptionIndex,\n handleOptionClick,\n focusOptionOnMouseMove,\n renderOptionProp,\n selectedOptionIndex,\n popupAriaId,\n ],\n );\n\n const resolvedContent = React.useMemo(() => {\n const defaultDropdownContent =\n options.length > 0 ? (\n <div ref={optionsWrapperRef}>{options.map(renderOption)}</div>\n ) : (\n <Footnote className={styles.empty}>{emptyText}</Footnote>\n );\n\n if (typeof renderDropdown === 'function') {\n return renderDropdown({ defaultDropdownContent });\n } else {\n return defaultDropdownContent;\n }\n }, [emptyText, options, renderDropdown, renderOption]);\n\n const selectInputRef = useExternRef(getSelectInputRef);\n\n const controlledValueSet = isControlledOutside && props.value !== NOT_SELECTED.CUSTOM;\n const uncontrolledValueSet = !isControlledOutside && nativeSelectValue !== NOT_SELECTED.NATIVE;\n const clearButtonShown =\n allowClearButton && !opened && (controlledValueSet || uncontrolledValueSet);\n\n const clearButton = React.useMemo(() => {\n if (!clearButtonShown) {\n return null;\n }\n\n return (\n <ClearButton\n className={iconProp === undefined ? styles.clearIcon : undefined}\n onClick={function clearSelectState() {\n setNativeSelectValue(NOT_SELECTED.NATIVE);\n setInputValue('');\n selectInputRef.current && selectInputRef.current.focus();\n }}\n disabled={restProps.disabled}\n data-testid={clearButtonTestId}\n />\n );\n }, [\n clearButtonShown,\n ClearButton,\n iconProp,\n restProps.disabled,\n clearButtonTestId,\n setNativeSelectValue,\n selectInputRef,\n ]);\n\n const icon = React.useMemo(() => {\n if (iconProp !== undefined) {\n return iconProp;\n }\n\n return (\n <DropdownIcon\n className={clearButtonShown ? styles.dropdownIcon : undefined}\n opened={opened}\n />\n );\n }, [clearButtonShown, iconProp, opened]);\n\n const afterIcons = !readOnly && (icon || clearButtonShown) && (\n <React.Fragment>\n {clearButton}\n {icon}\n </React.Fragment>\n );\n\n const { document } = useDOM();\n const passClickAndFocusToInputOnClick = React.useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n // Раньше внешней оберткой CustomSelect был <label>, что позволяло по клику в любую область CustomSelect,\n // даже где нету интерактивного элемента, фокусировать <input> и передавать на него событие клика.\n // Так как мы больше не оборачиваем CustomSelect в <label>, то для обертки CustomSelect мы симулируем работу <label>.\n // передаем фокус и клик по <input>, если пользователь кликнул в зоне обертки.\n // В <label> мы не больше не оборачиваем, потому что это заставляет скринридер\n // дважды произносить текст выбранной опции при фокусе, если CustomSelect связан с внешним <label>.\n // Воспроизводится в некоторых версиях Chrome, при навигации по странице с помощью стрелок.\n // Договорились со специалистом по доступности убрать <label>-обёртки из Select и CustomSelect\n\n if (!selectInputRef.current || !document) {\n return;\n }\n\n const clickTargetIsNotAnInput = e.target !== selectInputRef.current;\n if (clickTargetIsNotAnInput) {\n selectInputRef.current.click();\n\n const inputIsNotFocused = document.activeElement !== selectInputRef.current;\n if (inputIsNotFocused) {\n selectInputRef.current.focus();\n }\n }\n },\n [document, selectInputRef],\n );\n\n const preventInputBlurWhenClickInsideFocusedSelectArea = (\n e: React.MouseEvent<HTMLDivElement>,\n ) => {\n // Так как инпут больше не оборачивается пустым лэйблом, то клик внутри обертки,\n // но вне инпута (например по иконке дропдауна), будет убирать фокус с инпута.\n // Чтобы в такой ситуации отключить blur инпута мы превентим mousedown событие обёртки\n const isInputFocused = document && document.activeElement === selectInputRef.current;\n if (isInputFocused) {\n e.preventDefault();\n }\n };\n\n const ariaActiveDescendantOptionIndex: undefined | number =\n focusedOptionIndex !== -1 ? focusedOptionIndex : undefined;\n const ariaActiveDescendantId =\n ariaActiveDescendantOptionIndex !== undefined\n ? options[ariaActiveDescendantOptionIndex] && options[ariaActiveDescendantOptionIndex].value\n : null;\n\n const selectInputAriaProps: React.HTMLAttributes<HTMLElement> = {\n 'role': 'combobox',\n 'aria-controls': popupAriaId,\n 'aria-owns': popupAriaId,\n 'aria-expanded': opened,\n 'aria-activedescendant':\n ariaActiveDescendantId && opened ? `${popupAriaId}-${ariaActiveDescendantId}` : undefined,\n 'aria-labelledby': ariaLabelledBy,\n 'aria-haspopup': 'listbox',\n 'aria-autocomplete': 'none',\n };\n\n const focusWithin = useFocusWithin(handleRootRef);\n\n const resetOptionFocusOnMouseLeave = React.useCallback(\n (event: React.MouseEvent) => {\n // В Хроме eсли мышка пользователя находится над инпутом селекта,\n // и он с клавиатуры открывает опции, причём одна из опций\n // уже выбрана, то видно, как выбранная опция получает фокус,\n // но потом сразу же его теряет.\n // Связано это с тем, что в этот момент вызывается onMouseLeave, на который у нас\n // завязан сброс состония фокуса у опции. По хорошему фокус должен оставаться.\n // Нам не интересен вызов onMouseLeave если мышка при этом не двигалась.\n if (isMousePositionChanged(event, lastMousePositionRef.current)) {\n resetFocusedOption();\n }\n },\n [resetFocusedOption],\n );\n\n return (\n <div\n className={classNames(styles.host, sizeY !== 'regular' && sizeYClassNames[sizeY], className)}\n style={style}\n ref={handleRootRef}\n onClick={passClickAndFocusToInputOnClick}\n onMouseDown={preventInputBlurWhenClickInsideFocusedSelectArea}\n onMouseMove={function updateLastMousePosition(e) {\n lastMousePositionRef.current = { x: e.clientX, y: e.clientY };\n }}\n >\n {focusWithin && selected && !opened && (\n <VisuallyHidden aria-live=\"polite\">{selected.label}</VisuallyHidden>\n )}\n <CustomSelectInput\n autoComplete=\"off\"\n autoCapitalize=\"none\"\n autoCorrect=\"off\"\n spellCheck=\"false\"\n {...restProps}\n {...selectInputAriaProps}\n getRef={selectInputRef}\n onFocus={onFocus}\n onBlur={onBlur}\n className={openedClassNames}\n readOnly={readOnly || !searchable}\n fetching={fetching}\n value={inputValue}\n onKeyUp={handleKeyUp}\n onKeyDown={!readOnly ? _onInputKeyDown : undefined}\n onChange={onInputChange}\n onClick={!readOnly ? onClick : undefined}\n before={before}\n after={afterIcons}\n selectType={selectType}\n >\n {selected?.label}\n </CustomSelectInput>\n <select\n tabIndex={-1}\n ref={selectElRef}\n name={name}\n onChange={onNativeSelectChange}\n onBlur={props.onBlur}\n onFocus={props.onFocus}\n onClick={props.onClick}\n value={nativeSelectValue}\n aria-hidden\n className={styles.control}\n data-testid={nativeSelectTestId}\n required={required}\n >\n {(allowClearButton || nativeSelectValue === NOT_SELECTED.NATIVE) && (\n <option key={NOT_SELECTED.NATIVE} value={NOT_SELECTED.NATIVE} />\n )}\n {optionsProp.map((item) => (\n <option key={`${item.value}`} value={item.value} />\n ))}\n </select>\n {opened && (\n <CustomSelectDropdown\n targetRef={containerRef}\n placement={popperPlacement}\n scrollBoxRef={scrollBoxRef}\n onPlacementChange={setPopperPlacement}\n onMouseLeave={resetOptionFocusOnMouseLeave}\n fetching={fetching}\n overscrollBehavior={overscrollBehavior}\n offsetDistance={dropdownOffsetDistance}\n autoWidth={dropdownAutoWidth}\n forcePortal={forceDropdownPortal}\n noMaxHeight={noMaxHeight}\n role=\"listbox\"\n id={popupAriaId}\n aria-labelledby={ariaLabelledBy}\n tabIndex={-1}\n >\n {resolvedContent}\n </CustomSelectDropdown>\n )}\n </div>\n );\n}\n"],"names":["React","classNames","debounce","useAdaptivity","useExternRef","useFocusWithin","useStateWithPrev","callMultiple","useDOM","defaultFilterFn","useIsomorphicLayoutEffect","warnOnce","CustomSelectDropdown","CustomSelectOption","DropdownIcon","NOT_SELECTED","remapFromNativeValueToSelectValue","remapFromSelectValueToNativeValue","Footnote","VisuallyHidden","CustomSelectClearButton","CustomSelectInput","styles","sizeYClassNames","none","sizeYNone","compact","sizeYCompact","findIndexAfter","options","startIndex","length","findIndex","option","i","disabled","findIndexBefore","endIndex","result","warn","checkOptionsValueType","Set","map","item","value","size","checkMixControlledAndUncontrolledState","oldIsControlled","newIsControlled","defaultRenderOptionFn","props","handleOptionDown","e","preventDefault","findSelectedIndex","CUSTOM","Number","filter","inputValue","filterFn","isMousePositionChanged","event","prevPosition","Math","abs","x","clientX","y","clientY","CustomSelect","opened","setOpened","useState","before","name","className","getRef","getRootRef","popupDirection","style","onChange","children","onInputChangeProp","renderDropdown","onOpen","onClose","fetching","forceDropdownPortal","selectType","searchable","renderOptionProp","optionsProp","emptyText","iconProp","ClearButton","allowClearButton","dropdownOffsetDistance","dropdownAutoWidth","noMaxHeight","ariaLabelledBy","clearButtonTestId","nativeSelectTestId","defaultValue","required","getSelectInputRef","overscrollBehavior","onInputKeyDown","readOnly","restProps","process","env","NODE_ENV","sizeY","containerRef","useRef","handleRootRef","scrollBoxRef","selectElRef","optionsWrapperRef","scrollPerformedRef","focusedOptionIndex","setFocusedOptionIndex","isControlledOutside","setIsControlledOutside","undefined","setInputValue","nativeSelectValue","prevNativeSelectValue","setNativeSelectValue","NATIVE","popperPlacement","setPopperPlacement","useMemo","selectedOptionIndex","setSelectedOptionIndex","useEffect","updateOptionsIndexes","selectedIndex","syncIsControlledState","syncNativeSelectValueWithPropValue","some","Event","bubbles","current","dispatchEvent","selected","openedClassNames","includes","popUp","popDown","scrollToElement","useCallback","index","center","dropdown","optionsWrapper","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","focusOptionByIndex","scrollTo","isValidIndex","isIndexValid","keyboardInput","setKeyboardInput","resetKeyboardInput","resetFocusedOption","onKeyboardInput","key","fullInput","close","selectOption","shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync","selectFocused","open","onBlur","onFocus","onClick","handleKeyUp","focusOption","type","nextIndex","beforeIndex","onNativeSelectChange","convertedNativeSelectValue","String","isCalledWithSameControlledOptionValue","isNativeValueChanged","isTriggeredByClearButton","shouldCallOnChange","remappedNativeValue","currentTarget","target","onInputChange","areOptionsShown","handleKeyDownSelect","handleInputKeydown","_onInputKeyDown","handleOptionClick","Array","prototype","indexOf","call","parentNode","lastMousePositionRef","focusOptionOnMouseMove","popupAriaId","useId","renderOption","hovered","Fragment","label","onMouseDown","onMouseMove","id","resolvedContent","defaultDropdownContent","div","ref","empty","selectInputRef","controlledValueSet","uncontrolledValueSet","clearButtonShown","clearButton","clearIcon","clearSelectState","focus","data-testid","icon","dropdownIcon","afterIcons","document","passClickAndFocusToInputOnClick","clickTargetIsNotAnInput","click","inputIsNotFocused","activeElement","preventInputBlurWhenClickInsideFocusedSelectArea","isInputFocused","ariaActiveDescendantOptionIndex","ariaActiveDescendantId","selectInputAriaProps","focusWithin","resetOptionFocusOnMouseLeave","host","updateLastMousePosition","aria-live","autoComplete","autoCapitalize","autoCorrect","spellCheck","onKeyUp","onKeyDown","after","select","tabIndex","aria-hidden","control","targetRef","placement","onPlacementChange","onMouseLeave","offsetDistance","autoWidth","forcePortal","role","aria-labelledby"],"mappings":"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"}
@@ -1,10 +1,6 @@
1
1
  import { isElement, useDOM } from "../lib/dom.js";
2
2
  import { useIsomorphicLayoutEffect } from "../lib/useIsomorphicLayoutEffect.js";
3
- /**
4
- * Завязывается на document.
5
- *
6
- * @private
7
- */ export const useGlobalOnClickOutside = (callback, ...refs)=>{
3
+ export const useGlobalOnEventOutside = (event, callback, ...refs)=>{
8
4
  const { document } = useDOM();
9
5
  useIsomorphicLayoutEffect(()=>{
10
6
  const someRefNotNull = refs.some((ref)=>ref && ref.current !== null);
@@ -18,12 +14,12 @@ import { useIsomorphicLayoutEffect } from "../lib/useIsomorphicLayoutEffect.js";
18
14
  callback(event);
19
15
  }
20
16
  };
21
- document.addEventListener('click', handleClick, {
17
+ document.addEventListener(event, handleClick, {
22
18
  passive: true,
23
19
  capture: true
24
20
  });
25
21
  return ()=>{
26
- document.removeEventListener('click', handleClick, true);
22
+ document.removeEventListener(event, handleClick, true);
27
23
  };
28
24
  }, [
29
25
  document,
@@ -31,5 +27,12 @@ import { useIsomorphicLayoutEffect } from "../lib/useIsomorphicLayoutEffect.js";
31
27
  ...refs
32
28
  ]);
33
29
  };
30
+ /**
31
+ * Завязывается на document.
32
+ *
33
+ * @private
34
+ */ export const useGlobalOnClickOutside = (callback, ...refs)=>{
35
+ useGlobalOnEventOutside('click', callback, ...refs);
36
+ };
34
37
 
35
38
  //# sourceMappingURL=useGlobalOnClickOutside.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/hooks/useGlobalOnClickOutside.ts"],"sourcesContent":["import type * as React from 'react';\nimport { isElement, useDOM } from '../lib/dom';\nimport { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';\n\n/**\n * Завязывается на document.\n *\n * @private\n */\nexport const useGlobalOnClickOutside = <\n T extends React.RefObject<ElementType | null> | undefined | null,\n ElementType extends Element = Element,\n>(\n callback: (event: MouseEvent) => void,\n ...refs: T[]\n): void => {\n const { document } = useDOM();\n useIsomorphicLayoutEffect(() => {\n const someRefNotNull = refs.some((ref) => ref && ref.current !== null);\n if (!document || !someRefNotNull) {\n return;\n }\n const handleClick = (event: MouseEvent) => {\n const targetEl = event.target;\n const someRefHasTargetEl =\n isElement(targetEl) &&\n refs.some((ref) => ref && ref.current && ref.current.contains(targetEl));\n if (!someRefHasTargetEl) {\n callback(event);\n }\n };\n document.addEventListener('click', handleClick, {\n passive: true,\n capture: true,\n });\n return () => {\n document.removeEventListener('click', handleClick, true);\n };\n }, [document, callback, ...refs]);\n};\n"],"names":["isElement","useDOM","useIsomorphicLayoutEffect","useGlobalOnClickOutside","callback","refs","document","someRefNotNull","some","ref","current","handleClick","event","targetEl","target","someRefHasTargetEl","contains","addEventListener","passive","capture","removeEventListener"],"mappings":"AACA,SAASA,SAAS,EAAEC,MAAM,QAAQ,gBAAa;AAC/C,SAASC,yBAAyB,QAAQ,sCAAmC;AAE7E;;;;CAIC,GACD,OAAO,MAAMC,0BAA0B,CAIrCC,UACA,GAAGC;IAEH,MAAM,EAAEC,QAAQ,EAAE,GAAGL;IACrBC,0BAA0B;QACxB,MAAMK,iBAAiBF,KAAKG,IAAI,CAAC,CAACC,MAAQA,OAAOA,IAAIC,OAAO,KAAK;QACjE,IAAI,CAACJ,YAAY,CAACC,gBAAgB;YAChC;QACF;QACA,MAAMI,cAAc,CAACC;YACnB,MAAMC,WAAWD,MAAME,MAAM;YAC7B,MAAMC,qBACJf,UAAUa,aACVR,KAAKG,IAAI,CAAC,CAACC,MAAQA,OAAOA,IAAIC,OAAO,IAAID,IAAIC,OAAO,CAACM,QAAQ,CAACH;YAChE,IAAI,CAACE,oBAAoB;gBACvBX,SAASQ;YACX;QACF;QACAN,SAASW,gBAAgB,CAAC,SAASN,aAAa;YAC9CO,SAAS;YACTC,SAAS;QACX;QACA,OAAO;YACLb,SAASc,mBAAmB,CAAC,SAAST,aAAa;QACrD;IACF,GAAG;QAACL;QAAUF;WAAaC;KAAK;AAClC,EAAE"}
1
+ {"version":3,"sources":["../../../src/hooks/useGlobalOnClickOutside.ts"],"sourcesContent":["import type * as React from 'react';\nimport { isElement, useDOM } from '../lib/dom';\nimport { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';\n\nexport const useGlobalOnEventOutside = <\n T extends React.RefObject<ElementType | null> | undefined | null,\n ElementType extends Element = Element,\n>(\n event: Extract<keyof DocumentEventMap, 'click' | 'mousedown'>,\n callback: (event: MouseEvent) => void,\n ...refs: T[]\n): void => {\n const { document } = useDOM();\n useIsomorphicLayoutEffect(() => {\n const someRefNotNull = refs.some((ref) => ref && ref.current !== null);\n if (!document || !someRefNotNull) {\n return;\n }\n const handleClick = (event: MouseEvent) => {\n const targetEl = event.target;\n const someRefHasTargetEl =\n isElement(targetEl) &&\n refs.some((ref) => ref && ref.current && ref.current.contains(targetEl));\n if (!someRefHasTargetEl) {\n callback(event);\n }\n };\n document.addEventListener(event, handleClick, {\n passive: true,\n capture: true,\n });\n return () => {\n document.removeEventListener(event, handleClick, true);\n };\n }, [document, callback, ...refs]);\n};\n\n/**\n * Завязывается на document.\n *\n * @private\n */\nexport const useGlobalOnClickOutside = <\n T extends React.RefObject<ElementType | null> | undefined | null,\n ElementType extends Element = Element,\n>(\n callback: (event: MouseEvent) => void,\n ...refs: T[]\n): void => {\n useGlobalOnEventOutside('click', callback, ...refs);\n};\n"],"names":["isElement","useDOM","useIsomorphicLayoutEffect","useGlobalOnEventOutside","event","callback","refs","document","someRefNotNull","some","ref","current","handleClick","targetEl","target","someRefHasTargetEl","contains","addEventListener","passive","capture","removeEventListener","useGlobalOnClickOutside"],"mappings":"AACA,SAASA,SAAS,EAAEC,MAAM,QAAQ,gBAAa;AAC/C,SAASC,yBAAyB,QAAQ,sCAAmC;AAE7E,OAAO,MAAMC,0BAA0B,CAIrCC,OACAC,UACA,GAAGC;IAEH,MAAM,EAAEC,QAAQ,EAAE,GAAGN;IACrBC,0BAA0B;QACxB,MAAMM,iBAAiBF,KAAKG,IAAI,CAAC,CAACC,MAAQA,OAAOA,IAAIC,OAAO,KAAK;QACjE,IAAI,CAACJ,YAAY,CAACC,gBAAgB;YAChC;QACF;QACA,MAAMI,cAAc,CAACR;YACnB,MAAMS,WAAWT,MAAMU,MAAM;YAC7B,MAAMC,qBACJf,UAAUa,aACVP,KAAKG,IAAI,CAAC,CAACC,MAAQA,OAAOA,IAAIC,OAAO,IAAID,IAAIC,OAAO,CAACK,QAAQ,CAACH;YAChE,IAAI,CAACE,oBAAoB;gBACvBV,SAASD;YACX;QACF;QACAG,SAASU,gBAAgB,CAACb,OAAOQ,aAAa;YAC5CM,SAAS;YACTC,SAAS;QACX;QACA,OAAO;YACLZ,SAASa,mBAAmB,CAAChB,OAAOQ,aAAa;QACnD;IACF,GAAG;QAACL;QAAUF;WAAaC;KAAK;AAClC,EAAE;AAEF;;;;CAIC,GACD,OAAO,MAAMe,0BAA0B,CAIrChB,UACA,GAAGC;IAEHH,wBAAwB,SAASE,aAAaC;AAChD,EAAE"}
@@ -1,4 +1,4 @@
1
- import { TZDateMini } from "@date-fns/tz";
1
+ import { TZDateMini } from "@vkontakte/vkui-date-fns-tz";
2
2
  import { lightFormat } from "date-fns";
3
3
  export function parse(input, format, referenceDate = new Date()) {
4
4
  const match2 = /^\d\d/; // 00 - 99