@vkontakte/vkui 6.5.2 → 6.5.4

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.
Files changed (70) hide show
  1. package/dist/cjs/components/CustomSelect/CustomSelect.d.ts +12 -2
  2. package/dist/cjs/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  3. package/dist/cjs/components/CustomSelect/CustomSelect.js +68 -43
  4. package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
  5. package/dist/cjs/components/CustomSelect/CustomSelectInput.d.ts +1 -3
  6. package/dist/cjs/components/CustomSelect/CustomSelectInput.d.ts.map +1 -1
  7. package/dist/cjs/components/CustomSelect/CustomSelectInput.js +24 -19
  8. package/dist/cjs/components/CustomSelect/CustomSelectInput.js.map +1 -1
  9. package/dist/cjs/components/ImageBase/ImageBase.js +4 -1
  10. package/dist/cjs/components/ImageBase/ImageBase.js.map +1 -1
  11. package/dist/components/CustomSelect/CustomSelect.d.ts +12 -2
  12. package/dist/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  13. package/dist/components/CustomSelect/CustomSelect.js +60 -35
  14. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  15. package/dist/components/CustomSelect/CustomSelectInput.d.ts +1 -3
  16. package/dist/components/CustomSelect/CustomSelectInput.d.ts.map +1 -1
  17. package/dist/components/CustomSelect/CustomSelectInput.js +24 -19
  18. package/dist/components/CustomSelect/CustomSelectInput.js.map +1 -1
  19. package/dist/components/ImageBase/ImageBase.js +4 -1
  20. package/dist/components/ImageBase/ImageBase.js.map +1 -1
  21. package/dist/components.css +2 -2
  22. package/dist/components.css.map +1 -1
  23. package/dist/components.js.tmp +100 -148
  24. package/dist/cssm/components/CustomSelect/CustomSelect.d.ts +12 -2
  25. package/dist/cssm/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  26. package/dist/cssm/components/CustomSelect/CustomSelect.js +57 -34
  27. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  28. package/dist/cssm/components/CustomSelect/CustomSelectInput.d.ts +1 -3
  29. package/dist/cssm/components/CustomSelect/CustomSelectInput.d.ts.map +1 -1
  30. package/dist/cssm/components/CustomSelect/CustomSelectInput.js +21 -16
  31. package/dist/cssm/components/CustomSelect/CustomSelectInput.js.map +1 -1
  32. package/dist/cssm/components/CustomSelect/CustomSelectInput.module.css +40 -74
  33. package/dist/cssm/components/ImageBase/ImageBase.js +4 -1
  34. package/dist/cssm/components/ImageBase/ImageBase.js.map +1 -1
  35. package/dist/cssm/components/ImageBase/ImageBase.module.css +13 -2
  36. package/dist/vkui.css +2 -2
  37. package/dist/vkui.css.map +1 -1
  38. package/dist/vkui.js.tmp +100 -148
  39. package/package.json +1 -1
  40. package/src/components/CustomSelect/CustomSelect.tsx +98 -47
  41. package/src/components/CustomSelect/CustomSelectInput.module.css +35 -55
  42. package/src/components/CustomSelect/CustomSelectInput.tsx +35 -24
  43. package/src/components/ImageBase/ImageBase.module.css +13 -2
  44. package/src/components/ImageBase/ImageBase.tsx +1 -1
  45. package/dist/cjs/components/CustomSelect/helpers.d.ts +0 -8
  46. package/dist/cjs/components/CustomSelect/helpers.d.ts.map +0 -1
  47. package/dist/cjs/components/CustomSelect/helpers.js +0 -76
  48. package/dist/cjs/components/CustomSelect/helpers.js.map +0 -1
  49. package/dist/cjs/components/CustomSelect/types.d.ts +0 -12
  50. package/dist/cjs/components/CustomSelect/types.d.ts.map +0 -1
  51. package/dist/cjs/components/CustomSelect/types.js +0 -6
  52. package/dist/cjs/components/CustomSelect/types.js.map +0 -1
  53. package/dist/components/CustomSelect/helpers.d.ts +0 -8
  54. package/dist/components/CustomSelect/helpers.d.ts.map +0 -1
  55. package/dist/components/CustomSelect/helpers.js +0 -48
  56. package/dist/components/CustomSelect/helpers.js.map +0 -1
  57. package/dist/components/CustomSelect/types.d.ts +0 -12
  58. package/dist/components/CustomSelect/types.d.ts.map +0 -1
  59. package/dist/components/CustomSelect/types.js +0 -3
  60. package/dist/components/CustomSelect/types.js.map +0 -1
  61. package/dist/cssm/components/CustomSelect/helpers.d.ts +0 -8
  62. package/dist/cssm/components/CustomSelect/helpers.d.ts.map +0 -1
  63. package/dist/cssm/components/CustomSelect/helpers.js +0 -44
  64. package/dist/cssm/components/CustomSelect/helpers.js.map +0 -1
  65. package/dist/cssm/components/CustomSelect/types.d.ts +0 -12
  66. package/dist/cssm/components/CustomSelect/types.d.ts.map +0 -1
  67. package/dist/cssm/components/CustomSelect/types.js +0 -3
  68. package/dist/cssm/components/CustomSelect/types.js.map +0 -1
  69. package/src/components/CustomSelect/helpers.tsx +0 -61
  70. package/src/components/CustomSelect/types.ts +0 -15
@@ -3,30 +3,66 @@ import * as React from 'react';
3
3
  import { classNames, debounce } from '@vkontakte/vkjs';
4
4
  import { useAdaptivity } from '../../hooks/useAdaptivity';
5
5
  import { useExternRef } from '../../hooks/useExternRef';
6
+ import { useFocusWithin } from '../../hooks/useFocusWithin';
6
7
  import { useDOM } from '../../lib/dom';
7
8
  import { defaultFilterFn } from '../../lib/select';
8
9
  import { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';
9
10
  import { warnOnce } from '../../lib/warnOnce';
10
11
  import { CustomSelectDropdown } from '../CustomSelectDropdown/CustomSelectDropdown';
12
+ import { CustomSelectOption } from '../CustomSelectOption/CustomSelectOption';
11
13
  import { DropdownIcon } from '../DropdownIcon/DropdownIcon';
12
14
  import { Footnote } from '../Typography/Footnote/Footnote';
15
+ import { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';
13
16
  import { CustomSelectClearButton } from './CustomSelectClearButton';
14
17
  import { CustomSelectInput } from './CustomSelectInput';
15
- import { calculateInputValueFromOptions, defaultRenderOptionFn, findIndexAfter, findIndexBefore, findSelectedIndex } from './helpers';
16
18
  import styles from './CustomSelect.module.css';
17
19
  const sizeYClassNames = {
18
20
  none: styles['CustomSelect--sizeY-none'],
19
21
  ['compact']: styles['CustomSelect--sizeY-compact']
20
22
  };
23
+ const findIndexAfter = (options = [], startIndex = -1)=>{
24
+ if (startIndex >= options.length - 1) {
25
+ return -1;
26
+ }
27
+ return options.findIndex((option, i)=>i > startIndex && !option.disabled);
28
+ };
29
+ const findIndexBefore = (options = [], endIndex = options.length)=>{
30
+ let result = -1;
31
+ if (endIndex <= 0) {
32
+ return result;
33
+ }
34
+ for(let i = endIndex - 1; i >= 0; i--){
35
+ let option = options[i];
36
+ if (!option.disabled) {
37
+ result = i;
38
+ break;
39
+ }
40
+ }
41
+ return result;
42
+ };
21
43
  const warn = warnOnce('CustomSelect');
22
44
  const checkOptionsValueType = (options)=>{
23
45
  if (new Set(options.map((item)=>typeof item.value)).size > 1) {
24
46
  warn('Некоторые значения ваших опций имеют разные типы. onChange всегда возвращает строковый тип.', 'error');
25
47
  }
26
48
  };
49
+ function defaultRenderOptionFn({ option, ...props }) {
50
+ return /*#__PURE__*/ _jsx(CustomSelectOption, {
51
+ ...props
52
+ });
53
+ }
27
54
  const handleOptionDown = (e)=>{
28
55
  e.preventDefault();
29
56
  };
57
+ function findSelectedIndex(options = [], value, withClear) {
58
+ if (withClear && value === '') {
59
+ return -1;
60
+ }
61
+ return options.findIndex((item)=>{
62
+ value = typeof item.value === 'number' ? Number(value) : value;
63
+ return item.value === value;
64
+ }) ?? -1;
65
+ }
30
66
  const filter = (options, inputValue, filterFn)=>{
31
67
  return typeof filterFn === 'function' ? options.filter((option)=>filterFn(inputValue, option)) : options;
32
68
  };
@@ -46,8 +82,8 @@ const filter = (options, inputValue, filterFn)=>{
46
82
  const optionsWrapperRef = React.useRef(null);
47
83
  const [focusedOptionIndex, setFocusedOptionIndex] = React.useState(-1);
48
84
  const [isControlledOutside, setIsControlledOutside] = React.useState(props.value !== undefined);
85
+ const [inputValue, setInputValue] = React.useState('');
49
86
  const [nativeSelectValue, setNativeSelectValue] = React.useState(()=>props.value ?? defaultValue ?? (allowClearButton ? '' : undefined));
50
- const [inputValue, setInputValue] = React.useState(()=>calculateInputValueFromOptions(optionsProp, nativeSelectValue));
51
87
  const [popperPlacement, setPopperPlacement] = React.useState(popupDirection);
52
88
  const [options, setOptions] = React.useState(optionsProp);
53
89
  const [selectedOptionIndex, setSelectedOptionIndex] = React.useState(findSelectedIndex(optionsProp, props.value ?? defaultValue, allowClearButton));
@@ -158,6 +194,7 @@ const filter = (options, inputValue, filterFn)=>{
158
194
  * Сброс происходит в одном из эффекте `updateOptionsAndSelectedOptionIndex()`.
159
195
  */ const close = React.useCallback(()=>{
160
196
  resetKeyboardInput();
197
+ setInputValue('');
161
198
  setOpened(false);
162
199
  resetFocusedOption();
163
200
  onClose?.();
@@ -168,8 +205,8 @@ const filter = (options, inputValue, filterFn)=>{
168
205
  ]);
169
206
  const selectOption = React.useCallback((index)=>{
170
207
  const item = options[index];
171
- close();
172
208
  setNativeSelectValue(item?.value);
209
+ close();
173
210
  const shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync = isControlledOutside && props.value !== nativeSelectValue && nativeSelectValue === item?.value;
174
211
  if (shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync) {
175
212
  const event = new Event('change', {
@@ -211,12 +248,9 @@ const filter = (options, inputValue, filterFn)=>{
211
248
  bubbles: true
212
249
  });
213
250
  selectElRef.current?.dispatchEvent(event);
214
- setInputValue(calculateInputValueFromOptions(optionsProp, nativeSelectValue));
215
251
  }, [
216
252
  close,
217
- selectElRef,
218
- optionsProp,
219
- nativeSelectValue
253
+ selectElRef
220
254
  ]);
221
255
  const onFocus = React.useCallback(()=>{
222
256
  const event = new Event('focusin', {
@@ -255,37 +289,20 @@ const filter = (options, inputValue, filterFn)=>{
255
289
  focusedOptionIndex,
256
290
  options
257
291
  ]);
258
- React.useEffect(function filterOptions() {
292
+ React.useEffect(function updateOptionsAndSelectedOptionIndex() {
293
+ const value = props.value ?? nativeSelectValue ?? defaultValue;
259
294
  const options = searchable && inputValue !== undefined ? filter(optionsProp, inputValue, filterFn) : optionsProp;
260
295
  setOptions(options);
296
+ setSelectedOptionIndex(findSelectedIndex(options, value, allowClearButton));
261
297
  }, [
262
298
  filterFn,
263
299
  inputValue,
300
+ nativeSelectValue,
264
301
  optionsProp,
265
- searchable
266
- ]);
267
- const selectValue = props.value ?? nativeSelectValue ?? defaultValue;
268
- React.useEffect(function updateSelectedOptionIndexOnValueChange() {
269
- setSelectedOptionIndex(findSelectedIndex(options, selectValue, allowClearButton));
270
- }, [
271
- selectValue,
272
- allowClearButton,
273
- options
274
- ]);
275
- const prevSelectValueRef = React.useRef(selectValue);
276
- React.useEffect(function updateInputValueOnSelectValueChange() {
277
- if (prevSelectValueRef.current === selectValue) {
278
- return;
279
- }
280
- setInputValue(calculateInputValueFromOptions(optionsProp, selectValue));
281
- }, [
282
- selectValue,
283
- optionsProp
284
- ]);
285
- React.useEffect(function updatePrevSelectValue() {
286
- prevSelectValueRef.current = selectValue;
287
- }, [
288
- selectValue
302
+ defaultValue,
303
+ props.value,
304
+ searchable,
305
+ allowClearButton
289
306
  ]);
290
307
  const onNativeSelectChange = (e)=>{
291
308
  const newSelectedOptionIndex = findSelectedIndex(options, e.currentTarget.value, allowClearButton);
@@ -548,12 +565,14 @@ const filter = (options, inputValue, filterFn)=>{
548
565
  const selectInputAriaProps = {
549
566
  'role': 'combobox',
550
567
  'aria-controls': popupAriaId,
568
+ 'aria-owns': popupAriaId,
551
569
  'aria-expanded': opened,
552
570
  ['aria-activedescendant']: ariaActiveDescendantId && opened ? `${popupAriaId}-${ariaActiveDescendantId}` : undefined,
553
571
  'aria-labelledby': ariaLabelledBy,
554
572
  'aria-haspopup': 'listbox',
555
573
  'aria-autocomplete': 'none'
556
574
  };
575
+ const focusWithin = useFocusWithin(handleRootRef);
557
576
  return /*#__PURE__*/ _jsxs("div", {
558
577
  className: classNames(styles['CustomSelect'], sizeY !== 'regular' && sizeYClassNames[sizeY], className),
559
578
  style: style,
@@ -561,6 +580,10 @@ const filter = (options, inputValue, filterFn)=>{
561
580
  onClick: passClickAndFocusToInputOnClick,
562
581
  onMouseDown: preventInputBlurWhenClickInsideFocusedSelectArea,
563
582
  children: [
583
+ focusWithin && selected && !opened && /*#__PURE__*/ _jsx(VisuallyHidden, {
584
+ "aria-live": "polite",
585
+ children: selected.label
586
+ }),
564
587
  /*#__PURE__*/ _jsx(CustomSelectInput, {
565
588
  autoComplete: "off",
566
589
  autoCapitalize: "none",
@@ -572,7 +595,7 @@ const filter = (options, inputValue, filterFn)=>{
572
595
  onFocus: onFocus,
573
596
  onBlur: onBlur,
574
597
  className: openedClassNames,
575
- searchable: searchable,
598
+ readOnly: !searchable,
576
599
  fetching: fetching,
577
600
  value: inputValue,
578
601
  onKeyUp: handleKeyUp,
@@ -582,7 +605,7 @@ const filter = (options, inputValue, filterFn)=>{
582
605
  before: before,
583
606
  after: afterIcons,
584
607
  selectType: selectType,
585
- selectedOptionLabel: selected?.label
608
+ children: selected?.label
586
609
  }),
587
610
  /*#__PURE__*/ _jsxs("select", {
588
611
  ref: selectElRef,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/CustomSelect/CustomSelect.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, debounce } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useExternRef } from '../../hooks/useExternRef';\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 { TrackerOptionsProps } from '../CustomScrollView/useTrackerVisibility';\nimport {\n CustomSelectDropdown,\n CustomSelectDropdownProps,\n} from '../CustomSelectDropdown/CustomSelectDropdown';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport { FormFieldProps } from '../FormField/FormField';\nimport { NativeSelectProps } from '../NativeSelect/NativeSelect';\nimport { SelectType } from '../Select/Select';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport {\n CustomSelectClearButton,\n type CustomSelectClearButtonProps,\n} from './CustomSelectClearButton';\nimport { CustomSelectInput } from './CustomSelectInput';\nimport {\n calculateInputValueFromOptions,\n defaultRenderOptionFn,\n findIndexAfter,\n findIndexBefore,\n findSelectedIndex,\n} from './helpers';\nimport type { CustomSelectOptionInterface, CustomSelectRenderOption } from './types';\nimport styles from './CustomSelect.module.css';\n\nconst sizeYClassNames = {\n none: styles['CustomSelect--sizeY-none'],\n ['compact']: styles['CustomSelect--sizeY-compact'],\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 handleOptionDown: MouseEventHandler = (e: React.MouseEvent<HTMLElement>) => {\n e.preventDefault();\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\nexport type { CustomSelectClearButtonProps, CustomSelectOptionInterface, CustomSelectRenderOption };\n\nexport interface SelectProps<\n OptionInterfaceT extends CustomSelectOptionInterface = CustomSelectOptionInterface,\n> extends NativeSelectProps,\n Omit<FormFieldProps, 'maxHeight'>,\n TrackerOptionsProps,\n Pick<\n CustomSelectDropdownProps,\n 'overscrollBehavior' | 'autoHideScrollbar' | 'autoHideScrollbarDelay'\n > {\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) => void;\n options: OptionInterfaceT[];\n /**\n * Функция для кастомной фильтрации. По умолчанию поиск производится по `option.label`.\n */\n filterFn?: false | FilterFn<OptionInterfaceT>;\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 onClose?: VoidFunction;\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 * (e2e) testId кнопки очистки\n */\n clearButtonTestId?: string;\n /**\n * Отступ от выпадающего списка\n */\n dropdownOffsetDistance?: number;\n /**\n * Ширина раскрывающегося списка зависит от контента\n */\n dropdownAutoWidth?: boolean;\n forceDropdownPortal?: boolean;\n selectType?: SelectType;\n /**\n * Отключает максимальную высоту по умолчанию\n */\n noMaxHeight?: boolean;\n /**\n * (e2e) testId элемента, внутри которого отображается текст выбранной опции `CustomSelect` или плейсхолдер.\n */\n labelTextTestId?: string;\n nativeSelectTestId?: string;\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 autoHideScrollbar,\n autoHideScrollbarDelay,\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 ...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\n const [focusedOptionIndex, setFocusedOptionIndex] = React.useState<number | undefined>(-1);\n const [isControlledOutside, setIsControlledOutside] = React.useState(props.value !== undefined);\n const [nativeSelectValue, setNativeSelectValue] = React.useState(\n () => props.value ?? defaultValue ?? (allowClearButton ? '' : undefined),\n );\n\n const [inputValue, setInputValue] = React.useState(() =>\n calculateInputValueFromOptions(optionsProp, nativeSelectValue),\n );\n\n const [popperPlacement, setPopperPlacement] = React.useState<Placement>(popupDirection);\n const [options, setOptions] = React.useState(optionsProp);\n const [selectedOptionIndex, setSelectedOptionIndex] = React.useState<number | undefined>(\n findSelectedIndex(optionsProp, props.value ?? defaultValue, allowClearButton),\n );\n\n React.useEffect(() => {\n setIsControlledOutside(props.value !== undefined);\n setNativeSelectValue((nativeSelectValue) => props.value ?? nativeSelectValue);\n }, [props.value]);\n\n useIsomorphicLayoutEffect(() => {\n if (\n options.some(({ value }) => nativeSelectValue === value) ||\n (allowClearButton && nativeSelectValue === '')\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')\n ? styles['CustomSelect--pop-up']\n : styles['CustomSelect--pop-down'])) ||\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 // Это оптимизация, прежде всего, под `onMouseMove`\n setFocusedOptionIndex((focusedOptionIndex) =>\n focusedOptionIndex !== index ? index : focusedOptionIndex,\n );\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 const setScrollBoxRef = React.useCallback(\n (ref: HTMLDivElement | null) => {\n scrollBoxRef.current = ref;\n\n if (ref && selectedOptionIndex !== undefined && isValidIndex(selectedOptionIndex)) {\n {\n scrollToElement(selectedOptionIndex, true);\n }\n }\n },\n [isValidIndex, scrollToElement, selectedOptionIndex],\n );\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 /**\n * Note: сбрасывать `options` через `setOptions(optionsProp)` не нужно.\n * Сброс происходит в одном из эффекте `updateOptionsAndSelectedOptionIndex()`.\n */\n const close = React.useCallback(() => {\n resetKeyboardInput();\n\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\n close();\n setNativeSelectValue(item?.value);\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 [close, options, selectElRef, isControlledOutside, props.value, nativeSelectValue],\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\n setInputValue(calculateInputValueFromOptions(optionsProp, nativeSelectValue));\n }, [close, selectElRef, optionsProp, nativeSelectValue]);\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 React.useEffect(\n function filterOptions() {\n const options =\n searchable && inputValue !== undefined\n ? filter(optionsProp, inputValue, filterFn)\n : optionsProp;\n\n setOptions(options);\n },\n [filterFn, inputValue, optionsProp, searchable],\n );\n\n const selectValue = props.value ?? nativeSelectValue ?? defaultValue;\n React.useEffect(\n function updateSelectedOptionIndexOnValueChange() {\n setSelectedOptionIndex(findSelectedIndex(options, selectValue, allowClearButton));\n },\n [selectValue, allowClearButton, options],\n );\n\n const prevSelectValueRef = React.useRef(selectValue);\n React.useEffect(\n function updateInputValueOnSelectValueChange() {\n if (prevSelectValueRef.current === selectValue) {\n return;\n }\n setInputValue(calculateInputValueFromOptions(optionsProp, selectValue));\n },\n [selectValue, optionsProp],\n );\n React.useEffect(\n function updatePrevSelectValue() {\n prevSelectValueRef.current = selectValue;\n },\n [selectValue],\n );\n\n const onNativeSelectChange: React.ChangeEventHandler<HTMLSelectElement> = (e) => {\n const newSelectedOptionIndex = findSelectedIndex(\n options,\n e.currentTarget.value,\n allowClearButton,\n );\n\n if (selectedOptionIndex !== newSelectedOptionIndex) {\n if (!isControlledOutside) {\n setSelectedOptionIndex(newSelectedOptionIndex);\n }\n onChange?.(e);\n }\n };\n\n const onInputChange: React.ChangeEventHandler<HTMLInputElement> = React.useCallback(\n (e) => {\n onInputChangeProp && onInputChangeProp(e);\n\n const options = filter(optionsProp, e.target.value, filterFn);\n setOptions(options);\n setSelectedOptionIndex(findSelectedIndex(options, nativeSelectValue, allowClearButton));\n\n setInputValue(e.target.value);\n },\n [filterFn, nativeSelectValue, onInputChangeProp, optionsProp, allowClearButton],\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 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 prevMousePositionRef = React.useRef<{\n x: React.MouseEvent['clientX'];\n y: React.MouseEvent['clientY'];\n }>({ x: 0, y: 0 });\n const focusOptionOnMouseMove = React.useCallback(\n (e: React.MouseEvent<HTMLElement>, index: number) => {\n const isMouseChangedPosition =\n Math.abs(prevMousePositionRef.current.x - e.clientX) >= 1 ||\n Math.abs(prevMousePositionRef.current.y - e.clientY) >= 1;\n\n if (isMouseChangedPosition) {\n focusOptionByIndex(index, false);\n }\n\n prevMousePositionRef.current = { x: e.clientX, y: e.clientY };\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 })}\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['CustomSelect__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 const focusOnInputTimerRef = React.useRef<ReturnType<typeof setTimeout>>();\n const focusOnInput = React.useCallback(() => {\n clearTimeout(focusOnInputTimerRef.current);\n\n focusOnInputTimerRef.current = setTimeout(() => {\n selectInputRef.current && selectInputRef.current.focus();\n }, 0);\n }, [selectInputRef]);\n useIsomorphicLayoutEffect(function clearFocusOnInputTimer() {\n return () => {\n clearTimeout(focusOnInputTimerRef.current);\n };\n }, []);\n\n const controlledValueSet = isControlledOutside && props.value !== '';\n const uncontrolledValueSet = !isControlledOutside && nativeSelectValue !== '';\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['CustomSelect--clear-icon'] : undefined}\n onClick={function clearSelectState() {\n setNativeSelectValue('');\n setInputValue('');\n focusOnInput();\n }}\n disabled={restProps.disabled}\n data-testid={clearButtonTestId}\n />\n );\n }, [\n clearButtonShown,\n ClearButton,\n iconProp,\n restProps.disabled,\n clearButtonTestId,\n focusOnInput,\n ]);\n\n const icon = React.useMemo(() => {\n if (iconProp !== undefined) {\n return iconProp;\n }\n\n return (\n <DropdownIcon\n className={clearButtonShown ? styles['CustomSelect__dropdown-icon'] : 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 focusOnInput();\n }\n }\n },\n [document, focusOnInput, 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-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 return (\n <div\n className={classNames(\n styles['CustomSelect'],\n sizeY !== 'regular' && sizeYClassNames[sizeY],\n className,\n )}\n style={style}\n ref={handleRootRef}\n onClick={passClickAndFocusToInputOnClick}\n onMouseDown={preventInputBlurWhenClickInsideFocusedSelectArea}\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 searchable={searchable}\n fetching={fetching}\n value={inputValue}\n onKeyUp={handleKeyUp}\n onKeyDown={handleKeyDownSelect}\n onChange={onInputChange}\n onClick={onClick}\n before={before}\n after={afterIcons}\n selectType={selectType}\n selectedOptionLabel={selected?.label}\n />\n <select\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['CustomSelect__control']}\n data-testid={nativeSelectTestId}\n required={required}\n >\n {allowClearButton && <option key=\"\" value=\"\" />}\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={setScrollBoxRef}\n onPlacementChange={setPopperPlacement}\n onMouseLeave={resetFocusedOption}\n fetching={fetching}\n overscrollBehavior={overscrollBehavior}\n offsetDistance={dropdownOffsetDistance}\n autoWidth={dropdownAutoWidth}\n forcePortal={forceDropdownPortal}\n autoHideScrollbar={autoHideScrollbar}\n autoHideScrollbarDelay={autoHideScrollbarDelay}\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","useDOM","defaultFilterFn","useIsomorphicLayoutEffect","warnOnce","CustomSelectDropdown","DropdownIcon","Footnote","CustomSelectClearButton","CustomSelectInput","calculateInputValueFromOptions","defaultRenderOptionFn","findIndexAfter","findIndexBefore","findSelectedIndex","styles","sizeYClassNames","none","warn","checkOptionsValueType","options","Set","map","item","value","size","handleOptionDown","e","preventDefault","filter","inputValue","filterFn","option","CustomSelect","props","opened","setOpened","useState","before","name","className","getRef","getRootRef","popupDirection","style","onChange","children","onInputChange","onInputChangeProp","renderDropdown","onOpen","onClose","fetching","forceDropdownPortal","selectType","autoHideScrollbar","autoHideScrollbarDelay","searchable","renderOption","renderOptionProp","optionsProp","emptyText","icon","iconProp","ClearButton","allowClearButton","dropdownOffsetDistance","dropdownAutoWidth","noMaxHeight","ariaLabelledBy","clearButtonTestId","nativeSelectTestId","defaultValue","required","getSelectInputRef","overscrollBehavior","restProps","process","env","NODE_ENV","sizeY","containerRef","useRef","handleRootRef","scrollBoxRef","selectElRef","optionsWrapperRef","focusedOptionIndex","setFocusedOptionIndex","isControlledOutside","setIsControlledOutside","undefined","nativeSelectValue","setNativeSelectValue","setInputValue","popperPlacement","setPopperPlacement","setOptions","selectedOptionIndex","setSelectedOptionIndex","useEffect","some","event","Event","bubbles","current","dispatchEvent","selected","useMemo","length","openedClassNames","includes","scrollToElement","useCallback","index","center","dropdown","optionsWrapper","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","focusOptionByIndex","scrollTo","disabled","isValidIndex","setScrollBoxRef","ref","keyboardInput","setKeyboardInput","resetKeyboardInput","resetFocusedOption","onKeyboardInput","key","fullInput","close","selectOption","shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync","selectFocused","open","onBlur","onFocus","onClick","handleKeyUp","focusOption","type","nextIndex","beforeIndex","filterOptions","selectValue","updateSelectedOptionIndexOnValueChange","prevSelectValueRef","updateInputValueOnSelectValueChange","updatePrevSelectValue","onNativeSelectChange","newSelectedOptionIndex","currentTarget","target","areOptionsShown","handleKeyDownSelect","handleOptionClick","Array","prototype","indexOf","call","parentNode","prevMousePositionRef","x","y","focusOptionOnMouseMove","isMouseChangedPosition","Math","abs","clientX","clientY","popupAriaId","useId","hovered","Fragment","label","onMouseDown","onMouseMove","id","resolvedContent","defaultDropdownContent","div","selectInputRef","focusOnInputTimerRef","focusOnInput","clearTimeout","setTimeout","focus","clearFocusOnInputTimer","controlledValueSet","uncontrolledValueSet","clearButtonShown","clearButton","clearSelectState","data-testid","afterIcons","document","passClickAndFocusToInputOnClick","clickTargetIsNotAnInput","click","inputIsNotFocused","activeElement","preventInputBlurWhenClickInsideFocusedSelectArea","isInputFocused","ariaActiveDescendantOptionIndex","ariaActiveDescendantId","selectInputAriaProps","autoComplete","autoCapitalize","autoCorrect","spellCheck","onKeyUp","onKeyDown","after","selectedOptionLabel","select","aria-hidden","targetRef","placement","onPlacementChange","onMouseLeave","offsetDistance","autoWidth","forcePortal","role","aria-labelledby","tabIndex"],"mappings":";AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,EAAEC,QAAQ,QAAQ,kBAAkB;AACvD,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,YAAY,QAAQ,2BAA2B;AACxD,SAASC,MAAM,QAAQ,gBAAgB;AAEvC,SAASC,eAAe,QAAuB,mBAAmB;AAClE,SAASC,yBAAyB,QAAQ,sCAAsC;AAChF,SAASC,QAAQ,QAAQ,qBAAqB;AAE9C,SACEC,oBAAoB,QAEf,+CAA+C;AACtD,SAASC,YAAY,QAAQ,+BAA+B;AAI5D,SAASC,QAAQ,QAAQ,kCAAkC;AAC3D,SACEC,uBAAuB,QAElB,4BAA4B;AACnC,SAASC,iBAAiB,QAAQ,sBAAsB;AACxD,SACEC,8BAA8B,EAC9BC,qBAAqB,EACrBC,cAAc,EACdC,eAAe,EACfC,iBAAiB,QACZ,YAAY;AAEnB,OAAOC,YAAY,4BAA4B;AAE/C,MAAMC,kBAAkB;IACtBC,MAAMF,MAAM,CAAC,2BAA2B;IACxC,CAAC,UAAU,EAAEA,MAAM,CAAC,8BAA8B;AACpD;AAEA,MAAMG,OAAOd,SAAS;AAEtB,MAAMe,wBAAwB,CAAwCC;IACpE,IAAI,IAAIC,IAAID,QAAQE,GAAG,CAAC,CAACC,OAAS,OAAOA,KAAKC,KAAK,GAAGC,IAAI,GAAG,GAAG;QAC9DP,KACE,+FACA;IAEJ;AACF;AAEA,MAAMQ,mBAAsC,CAACC;IAC3CA,EAAEC,cAAc;AAClB;AAEA,MAAMC,SAAS,CACbT,SACAU,YACAC;IAEA,OAAO,OAAOA,aAAa,aACvBX,QAAQS,MAAM,CAAC,CAACG,SAAWD,SAASD,YAAYE,WAChDZ;AACN;AAqGA;;CAEC,GACD,OAAO,SAASa,aACdC,KAAoC;IAEpC,MAAM,CAACC,QAAQC,UAAU,GAAGxC,MAAMyC,QAAQ,CAAC;IAC3C,MAAM,EACJC,MAAM,EACNC,IAAI,EACJC,SAAS,EACTC,MAAM,EACNC,UAAU,EACVC,iBAAiB,QAAQ,EACzBC,KAAK,EACLC,QAAQ,EACRC,QAAQ,EACRC,eAAeC,iBAAiB,EAChCC,cAAc,EACdC,MAAM,EACNC,OAAO,EACPC,QAAQ,EACRC,mBAAmB,EACnBC,aAAa,SAAS,EACtBC,iBAAiB,EACjBC,sBAAsB,EACtBC,aAAa,KAAK,EAClBC,cAAcC,mBAAmBhD,qBAAqB,EACtDS,SAASwC,WAAW,EACpBC,YAAY,mBAAmB,EAC/B9B,WAAW7B,eAAe,EAC1B4D,MAAMC,QAAQ,EACdC,cAAcxD,uBAAuB,EACrCyD,mBAAmB,KAAK,EACxBC,yBAAyB,CAAC,EAC1BC,oBAAoB,KAAK,EACzBC,cAAc,KAAK,EACnB,CAAC,kBAAkB,EAAEC,cAAc,EACnCC,iBAAiB,EACjBC,kBAAkB,EAClBC,YAAY,EACZC,QAAQ,EACRC,iBAAiB,EACjBC,kBAAkB,EAClB,GAAGC,WACJ,GAAG1C;IAEJ,IAAI2C,QAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;QAC1C5D,sBAAsByC;IACxB;IAEA,MAAM,EAAEoB,QAAQ,MAAM,EAAE,GAAGjF;IAE3B,MAAMkF,eAAerF,MAAMsF,MAAM,CAAiB;IAClD,MAAMC,gBAAgBnF,aAAaiF,cAAcvC;IACjD,MAAM0C,eAAexF,MAAMsF,MAAM,CAAwB;IACzD,MAAMG,cAAcrF,aAAayC;IACjC,MAAM6C,oBAAoB1F,MAAMsF,MAAM,CAAiB;IAEvD,MAAM,CAACK,oBAAoBC,sBAAsB,GAAG5F,MAAMyC,QAAQ,CAAqB,CAAC;IACxF,MAAM,CAACoD,qBAAqBC,uBAAuB,GAAG9F,MAAMyC,QAAQ,CAACH,MAAMV,KAAK,KAAKmE;IACrF,MAAM,CAACC,mBAAmBC,qBAAqB,GAAGjG,MAAMyC,QAAQ,CAC9D,IAAMH,MAAMV,KAAK,IAAIgD,gBAAiBP,CAAAA,mBAAmB,KAAK0B,SAAQ;IAGxE,MAAM,CAAC7D,YAAYgE,cAAc,GAAGlG,MAAMyC,QAAQ,CAAC,IACjD3B,+BAA+BkD,aAAagC;IAG9C,MAAM,CAACG,iBAAiBC,mBAAmB,GAAGpG,MAAMyC,QAAQ,CAAYM;IACxE,MAAM,CAACvB,SAAS6E,WAAW,GAAGrG,MAAMyC,QAAQ,CAACuB;IAC7C,MAAM,CAACsC,qBAAqBC,uBAAuB,GAAGvG,MAAMyC,QAAQ,CAClEvB,kBAAkB8C,aAAa1B,MAAMV,KAAK,IAAIgD,cAAcP;IAG9DrE,MAAMwG,SAAS,CAAC;QACdV,uBAAuBxD,MAAMV,KAAK,KAAKmE;QACvCE,qBAAqB,CAACD,oBAAsB1D,MAAMV,KAAK,IAAIoE;IAC7D,GAAG;QAAC1D,MAAMV,KAAK;KAAC;IAEhBrB,0BAA0B;QACxB,IACEiB,QAAQiF,IAAI,CAAC,CAAC,EAAE7E,KAAK,EAAE,GAAKoE,sBAAsBpE,UACjDyC,oBAAoB2B,sBAAsB,IAC3C;YACA,MAAMU,QAAQ,IAAIC,MAAM,UAAU;gBAAEC,SAAS;YAAK;YAElDnB,YAAYoB,OAAO,EAAEC,cAAcJ;QACrC;IACF,GAAG;QAACV;KAAkB;IAEtB,MAAMe,WAAW/G,MAAMgH,OAAO,CAAC;QAC7B,IAAI,CAACxF,QAAQyF,MAAM,EAAE;YACnB,OAAO;QACT;QAEA,OAAOX,wBAAwBP,YAAYvE,OAAO,CAAC8E,oBAAoB,GAAGP;IAC5E,GAAG;QAACvE;QAAS8E;KAAoB;IAEjC,MAAMY,mBAAmBlH,MAAMgH,OAAO,CACpC,IACE,AAACzE,UACC+B,2BAA2B,KAC1B6B,CAAAA,gBAAgBgB,QAAQ,CAAC,SACtBhG,MAAM,CAAC,uBAAuB,GAC9BA,MAAM,CAAC,yBAAyB,AAAD,KACrC4E,WACF;QAACzB;QAAwB/B;QAAQ4D;KAAgB;IAGnD,MAAMiB,kBAAkBpH,MAAMqH,WAAW,CAAC,CAACC,OAAeC,SAAS,KAAK;QACtE,MAAMC,WAAWhC,aAAaqB,OAAO;QACrC,MAAMY,iBAAiB/B,kBAAkBmB,OAAO;QAChD,MAAMlF,OACJ6F,YAAYC,iBAAkBA,eAAevE,QAAQ,CAACoE,MAAM,GAAmB;QAEjF,IAAI,CAAC3F,QAAQ,CAAC6F,UAAU;YACtB;QACF;QAEA,MAAME,iBAAiBF,SAASG,YAAY;QAC5C,MAAMC,YAAYJ,SAASI,SAAS;QACpC,MAAMC,UAAUlG,KAAKmG,SAAS;QAC9B,MAAMC,aAAapG,KAAKgG,YAAY;QAEpC,IAAIJ,QAAQ;YACVC,SAASI,SAAS,GAAGC,UAAUH,iBAAiB,IAAIK,aAAa;QACnE,OAAO,IAAIF,UAAUE,aAAaL,iBAAiBE,WAAW;YAC5DJ,SAASI,SAAS,GAAGC,UAAUH,iBAAiBK;QAClD,OAAO,IAAIF,UAAUD,WAAW;YAC9BJ,SAASI,SAAS,GAAGC;QACvB;IACF,GAAG,EAAE;IAEL,MAAMG,qBAAqBhI,MAAMqH,WAAW,CAC1C,CAACC,OAA2BW,WAAW,IAAI;QACzC,IAAIX,UAAUvB,aAAauB,QAAQ,KAAKA,QAAQ,AAAC9F,CAAAA,QAAQyF,MAAM,IAAI,CAAA,IAAK,GAAG;YACzE;QACF;QAEA,MAAM7E,SAASZ,OAAO,CAAC8F,MAAM;QAE7B,IAAIlF,QAAQ8F,UAAU;YACpB;QACF;QAEA,IAAID,UAAU;YACZb,gBAAgBE;QAClB;QAEA,mDAAmD;QACnD1B,sBAAsB,CAACD,qBACrBA,uBAAuB2B,QAAQA,QAAQ3B;IAE3C,GACA;QAACnE;QAAS4F;KAAgB;IAG5B,MAAMe,eAAenI,MAAMqH,WAAW,CACpC,CAACC;QACC,OAAOA,SAAS,KAAKA,QAAS9F,CAAAA,QAAQyF,MAAM,IAAI,CAAA;IAClD,GACA;QAACzF,QAAQyF,MAAM;KAAC;IAGlB,MAAMmB,kBAAkBpI,MAAMqH,WAAW,CACvC,CAACgB;QACC7C,aAAaqB,OAAO,GAAGwB;QAEvB,IAAIA,OAAO/B,wBAAwBP,aAAaoC,aAAa7B,sBAAsB;YACjF;gBACEc,gBAAgBd,qBAAqB;YACvC;QACF;IACF,GACA;QAAC6B;QAAcf;QAAiBd;KAAoB;IAGtD,MAAM,CAACgC,eAAeC,iBAAiB,GAAGvI,MAAMyC,QAAQ,CAAC;IACzD,MAAM+F,qBAAqBxI,MAAMqH,WAAW,CAAC;QAC3CkB,iBAAiB;IACnB,GAAG,EAAE;IAEL,MAAME,qBAAqBzI,MAAMqH,WAAW,CAAC;QAC3CzB,sBAAsB,CAAC;IACzB,GAAG,EAAE;IAEL,MAAM8C,kBAAkB1I,MAAMqH,WAAW,CACvC,CAACsB;QACC,IAAI,CAACpG,QAAQ;YACXC,UAAU;QACZ;QACAiG;QACA,MAAMG,YAAYN,gBAAgBK;QAElCJ,iBAAiBK;IACnB,GACA;QAACN;QAAe/F;QAAQkG;KAAmB;IAG7C;;;GAGC,GACD,MAAMI,QAAQ7I,MAAMqH,WAAW,CAAC;QAC9BmB;QAEAhG,UAAU;QACViG;QACAlF;IACF,GAAG;QAACA;QAASiF;QAAoBC;KAAmB;IAEpD,MAAMK,eAAe9I,MAAMqH,WAAW,CACpC,CAACC;QACC,MAAM3F,OAAOH,OAAO,CAAC8F,MAAM;QAE3BuB;QACA5C,qBAAqBtE,MAAMC;QAE3B,MAAMmH,8DACJlD,uBACAvD,MAAMV,KAAK,KAAKoE,qBAChBA,sBAAsBrE,MAAMC;QAE9B,IAAImH,6DAA6D;YAC/D,MAAMrC,QAAQ,IAAIC,MAAM,UAAU;gBAAEC,SAAS;YAAK;YAClDnB,YAAYoB,OAAO,EAAEC,cAAcJ;QACrC;IACF,GACA;QAACmC;QAAOrH;QAASiE;QAAaI;QAAqBvD,MAAMV,KAAK;QAAEoE;KAAkB;IAGpF,MAAMgD,gBAAgBhJ,MAAMqH,WAAW,CAAC;QACtC,IAAI1B,uBAAuBI,aAAa,CAACoC,aAAaxC,qBAAqB;YACzE;QACF;QAEAmD,aAAanD;IACf,GAAG;QAACA;QAAoBwC;QAAcW;KAAa;IAEnD,MAAMG,OAAOjJ,MAAMqH,WAAW,CAAC;QAC7B7E,UAAU;QACVoD,sBAAsBU;QAEtB,IAAI,OAAOhD,WAAW,YAAY;YAChCA;QACF;IACF,GAAG;QAACA;QAAQgD;KAAoB;IAEhC,MAAM4C,SAASlJ,MAAMqH,WAAW,CAAC;QAC/BwB;QACA,MAAMnC,QAAQ,IAAIC,MAAM,YAAY;YAAEC,SAAS;QAAK;QACpDnB,YAAYoB,OAAO,EAAEC,cAAcJ;QAEnCR,cAAcpF,+BAA+BkD,aAAagC;IAC5D,GAAG;QAAC6C;QAAOpD;QAAazB;QAAagC;KAAkB;IAEvD,MAAMmD,UAAUnJ,MAAMqH,WAAW,CAAC;QAChC,MAAMX,QAAQ,IAAIC,MAAM,WAAW;YAAEC,SAAS;QAAK;QACnDnB,YAAYoB,OAAO,EAAEC,cAAcJ;IACrC,GAAG;QAACjB;KAAY;IAEhB,MAAM2D,UAAUpJ,MAAMqH,WAAW,CAAC;QAChC,IAAI9E,QAAQ;YACVsG;QACF,OAAO;YACLI;QACF;IACF,GAAG;QAACJ;QAAOI;QAAM1G;KAAO;IAExB,MAAM8G,cAAcrJ,MAAMgH,OAAO,CAAC,IAAM9G,SAASsI,oBAAoB,OAAO;QAACA;KAAmB;IAEhG,MAAMc,cAActJ,MAAMqH,WAAW,CACnC,CAACkC;QACC,IAAIjC,QAAQ3B;QAEZ,IAAI4D,SAAS,QAAQ;YACnB,MAAMC,YAAYxI,eAAeQ,SAAS8F;YAC1CA,QAAQkC,cAAc,CAAC,IAAIxI,eAAeQ,WAAWgI,WAAW,kDAAkD;QACpH,OAAO,IAAID,SAAS,QAAQ;YAC1B,MAAME,cAAcxI,gBAAgBO,SAAS8F;YAC7CA,QAAQmC,gBAAgB,CAAC,IAAIxI,gBAAgBO,WAAWiI,aAAa,0DAA0D;QACjI;QAEAzB,mBAAmBV;IACrB,GACA;QAACU;QAAoBrC;QAAoBnE;KAAQ;IAGnDxB,MAAMwG,SAAS,CACb,SAASkD;QACP,MAAMlI,UACJqC,cAAc3B,eAAe6D,YACzB9D,OAAO+B,aAAa9B,YAAYC,YAChC6B;QAENqC,WAAW7E;IACb,GACA;QAACW;QAAUD;QAAY8B;QAAaH;KAAW;IAGjD,MAAM8F,cAAcrH,MAAMV,KAAK,IAAIoE,qBAAqBpB;IACxD5E,MAAMwG,SAAS,CACb,SAASoD;QACPrD,uBAAuBrF,kBAAkBM,SAASmI,aAAatF;IACjE,GACA;QAACsF;QAAatF;QAAkB7C;KAAQ;IAG1C,MAAMqI,qBAAqB7J,MAAMsF,MAAM,CAACqE;IACxC3J,MAAMwG,SAAS,CACb,SAASsD;QACP,IAAID,mBAAmBhD,OAAO,KAAK8C,aAAa;YAC9C;QACF;QACAzD,cAAcpF,+BAA+BkD,aAAa2F;IAC5D,GACA;QAACA;QAAa3F;KAAY;IAE5BhE,MAAMwG,SAAS,CACb,SAASuD;QACPF,mBAAmBhD,OAAO,GAAG8C;IAC/B,GACA;QAACA;KAAY;IAGf,MAAMK,uBAAoE,CAACjI;QACzE,MAAMkI,yBAAyB/I,kBAC7BM,SACAO,EAAEmI,aAAa,CAACtI,KAAK,EACrByC;QAGF,IAAIiC,wBAAwB2D,wBAAwB;YAClD,IAAI,CAACpE,qBAAqB;gBACxBU,uBAAuB0D;YACzB;YACAhH,WAAWlB;QACb;IACF;IAEA,MAAMoB,gBAA4DnD,MAAMqH,WAAW,CACjF,CAACtF;QACCqB,qBAAqBA,kBAAkBrB;QAEvC,MAAMP,UAAUS,OAAO+B,aAAajC,EAAEoI,MAAM,CAACvI,KAAK,EAAEO;QACpDkE,WAAW7E;QACX+E,uBAAuBrF,kBAAkBM,SAASwE,mBAAmB3B;QAErE6B,cAAcnE,EAAEoI,MAAM,CAACvI,KAAK;IAC9B,GACA;QAACO;QAAU6D;QAAmB5C;QAAmBY;QAAaK;KAAiB;IAGjF,MAAM+F,kBAAkBpK,MAAMqH,WAAW,CAAC;QACxC,OAAO7B,aAAaqB,OAAO,KAAK;IAClC,GAAG,EAAE;IAEL,MAAMwD,sBAAsBrK,MAAMqH,WAAW,CAC3C,CAACX;QACC,IAAIA,MAAMiC,GAAG,CAAC1B,MAAM,KAAK,KAAKP,MAAMiC,GAAG,KAAK,KAAK;YAC/CD,gBAAgBhC,MAAMiC,GAAG;YACzB;QACF;QAEA;YAAC;YAAW;YAAa;YAAU;SAAQ,CAACxB,QAAQ,CAACT,MAAMiC,GAAG,KAC5DyB,qBACA1D,MAAM1E,cAAc;QAEtB,OAAQ0E,MAAMiC,GAAG;YACf,KAAK;gBACH,IAAIpG,QAAQ;oBACV6H,qBAAqBd,YAAY;gBACnC,OAAO;oBACLL;gBACF;gBACA;YACF,KAAK;gBACH,IAAI1G,QAAQ;oBACV6H,qBAAqBd,YAAY;gBACnC,OAAO;oBACLL;gBACF;gBACA;YACF,KAAK;gBACHJ;gBACA;YACF,KAAK;YACL,KAAK;gBAAU;oBACb,IAAI,CAACtG,QAAQ;wBACXC,UAAU;oBACZ;oBACAiG;oBAEA;gBACF;YACA,KAAK;YACL,KAAK;YACL,KAAK;gBACH,IAAIlG,QAAQ;oBACV6H,qBAAqBpB;gBACvB,OAAO;oBACLC;gBACF;gBACA;QACJ;IACF,GACA;QACEmB;QACAvB;QACAS;QACAZ;QACAO;QACA1G;QACAyG;QACAP;KACD;IAGH,MAAM6B,oBAAoBtK,MAAMqH,WAAW,CACzC,CAACtF;QACC,MAAMuF,QAAQiD,MAAMC,SAAS,CAACC,OAAO,CAACC,IAAI,CACxC3I,EAAEmI,aAAa,CAACS,UAAU,EAAEzH,UAC5BnB,EAAEmI,aAAa;QAEjB,MAAM9H,SAASZ,OAAO,CAAC8F,MAAM;QAE7B,IAAIlF,UAAU,CAACA,OAAO8F,QAAQ,EAAE;YAC9BY,aAAaxB;QACf;IACF,GACA;QAAC9F;QAASsH;KAAa;IAGzB,MAAM8B,uBAAuB5K,MAAMsF,MAAM,CAGtC;QAAEuF,GAAG;QAAGC,GAAG;IAAE;IAChB,MAAMC,yBAAyB/K,MAAMqH,WAAW,CAC9C,CAACtF,GAAkCuF;QACjC,MAAM0D,yBACJC,KAAKC,GAAG,CAACN,qBAAqB/D,OAAO,CAACgE,CAAC,GAAG9I,EAAEoJ,OAAO,KAAK,KACxDF,KAAKC,GAAG,CAACN,qBAAqB/D,OAAO,CAACiE,CAAC,GAAG/I,EAAEqJ,OAAO,KAAK;QAE1D,IAAIJ,wBAAwB;YAC1BhD,mBAAmBV,OAAO;QAC5B;QAEAsD,qBAAqB/D,OAAO,GAAG;YAAEgE,GAAG9I,EAAEoJ,OAAO;YAAEL,GAAG/I,EAAEqJ,OAAO;QAAC;IAC9D,GACA;QAACpD;KAAmB;IAGtB,MAAMqD,cAAcrL,MAAMsL,KAAK;IAC/B,MAAMxH,eAAe9D,MAAMqH,WAAW,CACpC,CAACjF,QAA0BkF;QACzB,MAAMiE,UAAUjE,UAAU3B;QAC1B,MAAMoB,WAAWO,UAAUhB;QAE3B,qBACE,KAACtG,MAAMwL,QAAQ;sBACZzH,iBAAiB;gBAChB3B;gBACAmJ;gBACArI,UAAUd,OAAOqJ,KAAK;gBACtB1E;gBACAmB,UAAU9F,OAAO8F,QAAQ;gBACzBkB,SAASkB;gBACToB,aAAa5J;gBACb,8DAA8D;gBAC9D,+DAA+D;gBAC/D,8FAA8F;gBAC9F,yIAAyI;gBACzI,sFAAsF;gBACtF,8EAA8E;gBAC9E,6IAA6I;gBAC7I6J,aAAa,CAAC5J,IAAMgJ,uBAAuBhJ,GAAGuF;gBAC9CsE,IAAI,CAAC,EAAEP,YAAY,CAAC,EAAEjJ,OAAOR,KAAK,CAAC,CAAC;YACtC;WAlBmB,CAAC,EAAE,OAAOQ,OAAOR,KAAK,CAAC,CAAC,EAAEQ,OAAOR,KAAK,CAAC,CAAC;IAqBjE,GACA;QACE+D;QACA2E;QACAS;QACAhH;QACAuC;QACA+E;KACD;IAGH,MAAMQ,kBAAkB7L,MAAMgH,OAAO,CAAC;QACpC,MAAM8E,yBACJtK,QAAQyF,MAAM,GAAG,kBACf,KAAC8E;YAAI1D,KAAK3C;sBAAoBlE,QAAQE,GAAG,CAACoC;2BAE1C,KAACnD;YAASiC,WAAWzB,MAAM,CAAC,sBAAsB;sBAAG8C;;QAGzD,IAAI,OAAOZ,mBAAmB,YAAY;YACxC,OAAOA,eAAe;gBAAEyI;YAAuB;QACjD,OAAO;YACL,OAAOA;QACT;IACF,GAAG;QAAC7H;QAAWzC;QAAS6B;QAAgBS;KAAa;IAErD,MAAMkI,iBAAiB5L,aAAa0E;IACpC,MAAMmH,uBAAuBjM,MAAMsF,MAAM;IACzC,MAAM4G,eAAelM,MAAMqH,WAAW,CAAC;QACrC8E,aAAaF,qBAAqBpF,OAAO;QAEzCoF,qBAAqBpF,OAAO,GAAGuF,WAAW;YACxCJ,eAAenF,OAAO,IAAImF,eAAenF,OAAO,CAACwF,KAAK;QACxD,GAAG;IACL,GAAG;QAACL;KAAe;IACnBzL,0BAA0B,SAAS+L;QACjC,OAAO;YACLH,aAAaF,qBAAqBpF,OAAO;QAC3C;IACF,GAAG,EAAE;IAEL,MAAM0F,qBAAqB1G,uBAAuBvD,MAAMV,KAAK,KAAK;IAClE,MAAM4K,uBAAuB,CAAC3G,uBAAuBG,sBAAsB;IAC3E,MAAMyG,mBACJpI,oBAAoB,CAAC9B,UAAWgK,CAAAA,sBAAsBC,oBAAmB;IAE3E,MAAME,cAAc1M,MAAMgH,OAAO,CAAC;QAChC,IAAI,CAACyF,kBAAkB;YACrB,OAAO;QACT;QAEA,qBACE,KAACrI;YACCxB,WAAWuB,aAAa4B,YAAY5E,MAAM,CAAC,2BAA2B,GAAG4E;YACzEqD,SAAS,SAASuD;gBAChB1G,qBAAqB;gBACrBC,cAAc;gBACdgG;YACF;YACAhE,UAAUlD,UAAUkD,QAAQ;YAC5B0E,eAAalI;;IAGnB,GAAG;QACD+H;QACArI;QACAD;QACAa,UAAUkD,QAAQ;QAClBxD;QACAwH;KACD;IAED,MAAMhI,OAAOlE,MAAMgH,OAAO,CAAC;QACzB,IAAI7C,aAAa4B,WAAW;YAC1B,OAAO5B;QACT;QAEA,qBACE,KAACzD;YACCkC,WAAW6J,mBAAmBtL,MAAM,CAAC,8BAA8B,GAAG4E;YACtExD,QAAQA;;IAGd,GAAG;QAACkK;QAAkBtI;QAAU5B;KAAO;IAEvC,MAAMsK,aAAa,AAAC3I,CAAAA,QAAQuI,gBAAe,mBACzC,MAACzM,MAAMwL,QAAQ;;YACZkB;YACAxI;;;IAIL,MAAM,EAAE4I,QAAQ,EAAE,GAAGzM;IACrB,MAAM0M,kCAAkC/M,MAAMqH,WAAW,CACvD,CAACtF;QACC,yGAAyG;QACzG,kGAAkG;QAClG,qHAAqH;QACrH,8EAA8E;QAC9E,8EAA8E;QAC9E,mGAAmG;QACnG,2FAA2F;QAC3F,8FAA8F;QAE9F,IAAI,CAACiK,eAAenF,OAAO,IAAI,CAACiG,UAAU;YACxC;QACF;QAEA,MAAME,0BAA0BjL,EAAEoI,MAAM,KAAK6B,eAAenF,OAAO;QACnE,IAAImG,yBAAyB;YAC3BhB,eAAenF,OAAO,CAACoG,KAAK;YAE5B,MAAMC,oBAAoBJ,SAASK,aAAa,KAAKnB,eAAenF,OAAO;YAC3E,IAAIqG,mBAAmB;gBACrBhB;YACF;QACF;IACF,GACA;QAACY;QAAUZ;QAAcF;KAAe;IAG1C,MAAMoB,mDAAmD,CACvDrL;QAEA,gFAAgF;QAChF,8EAA8E;QAC9E,sFAAsF;QACtF,MAAMsL,iBAAiBP,YAAYA,SAASK,aAAa,KAAKnB,eAAenF,OAAO;QACpF,IAAIwG,gBAAgB;YAClBtL,EAAEC,cAAc;QAClB;IACF;IAEA,MAAMsL,kCACJ3H,uBAAuB,CAAC,IAAIA,qBAAqBI;IACnD,MAAMwH,yBACJD,oCAAoCvH,YAChCvE,OAAO,CAAC8L,gCAAgC,IAAI9L,OAAO,CAAC8L,gCAAgC,CAAC1L,KAAK,GAC1F;IAEN,MAAM4L,uBAA0D;QAC9D,QAAQ;QACR,iBAAiBnC;QACjB,iBAAiB9I;QACjB,CAAC,wBAAwB,EACvBgL,0BAA0BhL,SAAS,CAAC,EAAE8I,YAAY,CAAC,EAAEkC,uBAAuB,CAAC,GAAGxH;QAClF,mBAAmBtB;QACnB,iBAAiB;QACjB,qBAAqB;IACvB;IAEA,qBACE,MAACsH;QACCnJ,WAAW3C,WACTkB,MAAM,CAAC,eAAe,EACtBiE,UAAU,aAAahE,eAAe,CAACgE,MAAM,EAC7CxC;QAEFI,OAAOA;QACPqF,KAAK9C;QACL6D,SAAS2D;QACTrB,aAAa0B;;0BAEb,KAACvM;gBACC4M,cAAa;gBACbC,gBAAe;gBACfC,aAAY;gBACZC,YAAW;gBACV,GAAG5I,SAAS;gBACZ,GAAGwI,oBAAoB;gBACxB3K,QAAQmJ;gBACR7C,SAASA;gBACTD,QAAQA;gBACRtG,WAAWsE;gBACXrD,YAAYA;gBACZL,UAAUA;gBACV5B,OAAOM;gBACP2L,SAASxE;gBACTyE,WAAWzD;gBACXpH,UAAUE;gBACViG,SAASA;gBACT1G,QAAQA;gBACRqL,OAAOlB;gBACPnJ,YAAYA;gBACZsK,qBAAqBjH,UAAU0E;;0BAEjC,MAACwC;gBACC5F,KAAK5C;gBACL9C,MAAMA;gBACNM,UAAU+G;gBACVd,QAAQ5G,MAAM4G,MAAM;gBACpBC,SAAS7G,MAAM6G,OAAO;gBACtBC,SAAS9G,MAAM8G,OAAO;gBACtBxH,OAAOoE;gBACPkI,aAAW;gBACXtL,WAAWzB,MAAM,CAAC,wBAAwB;gBAC1CyL,eAAajI;gBACbE,UAAUA;;oBAETR,kCAAoB,KAACjC;wBAAcR,OAAM;uBAAT;oBAChCoC,YAAYtC,GAAG,CAAC,CAACC,qBAChB,KAACS;4BAA6BR,OAAOD,KAAKC,KAAK;2BAAlC,CAAC,EAAED,KAAKC,KAAK,CAAC,CAAC;;;YAG/BW,wBACC,KAAC9B;gBACC0N,WAAW9I;gBACX+I,WAAWjI;gBACXX,cAAc4C;gBACdiG,mBAAmBjI;gBACnBkI,cAAc7F;gBACdjF,UAAUA;gBACVuB,oBAAoBA;gBACpBwJ,gBAAgBjK;gBAChBkK,WAAWjK;gBACXkK,aAAahL;gBACbE,mBAAmBA;gBACnBC,wBAAwBA;gBACxBY,aAAaA;gBACbkK,MAAK;gBACL9C,IAAIP;gBACJsD,mBAAiBlK;gBACjBmK,UAAU,CAAC;0BAEV/C;;;;AAKX"}
1
+ {"version":3,"sources":["../../../../src/components/CustomSelect/CustomSelect.tsx"],"sourcesContent":["import * 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 { 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 { TrackerOptionsProps } from '../CustomScrollView/useTrackerVisibility';\nimport {\n CustomSelectDropdown,\n CustomSelectDropdownProps,\n} from '../CustomSelectDropdown/CustomSelectDropdown';\nimport {\n CustomSelectOption,\n type CustomSelectOptionProps,\n} from '../CustomSelectOption/CustomSelectOption';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport { FormFieldProps } from '../FormField/FormField';\nimport { NativeSelectProps } from '../NativeSelect/NativeSelect';\nimport { 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 { CustomSelectInput } from './CustomSelectInput';\nimport styles from './CustomSelect.module.css';\n\nconst sizeYClassNames = {\n none: styles['CustomSelect--sizeY-none'],\n ['compact']: styles['CustomSelect--sizeY-compact'],\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\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 withClear: boolean,\n) {\n if (withClear && value === '') {\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\ntype SelectValue = React.SelectHTMLAttributes<HTMLSelectElement>['value'];\n\nexport interface CustomSelectOptionInterface {\n value: SelectValue;\n label: React.ReactElement | string;\n disabled?: boolean;\n [index: string]: any;\n}\n\nexport interface CustomSelectRenderOption<T extends CustomSelectOptionInterface>\n extends CustomSelectOptionProps {\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 TrackerOptionsProps,\n Pick<\n CustomSelectDropdownProps,\n 'overscrollBehavior' | 'autoHideScrollbar' | 'autoHideScrollbarDelay'\n > {\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) => void;\n options: OptionInterfaceT[];\n /**\n * Функция для кастомной фильтрации. По умолчанию поиск производится по `option.label`.\n */\n filterFn?: false | FilterFn<OptionInterfaceT>;\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 onClose?: VoidFunction;\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 * (e2e) testId кнопки очистки\n */\n clearButtonTestId?: string;\n /**\n * Отступ от выпадающего списка\n */\n dropdownOffsetDistance?: number;\n /**\n * Ширина раскрывающегося списка зависит от контента\n */\n dropdownAutoWidth?: boolean;\n forceDropdownPortal?: boolean;\n selectType?: SelectType;\n /**\n * Отключает максимальную высоту по умолчанию\n */\n noMaxHeight?: boolean;\n /**\n * (e2e) testId элемента, внутри которого отображается текст выбранной опции `CustomSelect` или плейсхолдер.\n */\n labelTextTestId?: string;\n nativeSelectTestId?: string;\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 autoHideScrollbar,\n autoHideScrollbarDelay,\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 ...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\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, setNativeSelectValue] = React.useState(\n () => props.value ?? defaultValue ?? (allowClearButton ? '' : undefined),\n );\n\n const [popperPlacement, setPopperPlacement] = React.useState<Placement>(popupDirection);\n const [options, setOptions] = React.useState(optionsProp);\n const [selectedOptionIndex, setSelectedOptionIndex] = React.useState<number | undefined>(\n findSelectedIndex(optionsProp, props.value ?? defaultValue, allowClearButton),\n );\n\n React.useEffect(() => {\n setIsControlledOutside(props.value !== undefined);\n setNativeSelectValue((nativeSelectValue) => props.value ?? nativeSelectValue);\n }, [props.value]);\n\n useIsomorphicLayoutEffect(() => {\n if (\n options.some(({ value }) => nativeSelectValue === value) ||\n (allowClearButton && nativeSelectValue === '')\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')\n ? styles['CustomSelect--pop-up']\n : styles['CustomSelect--pop-down'])) ||\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 // Это оптимизация, прежде всего, под `onMouseMove`\n setFocusedOptionIndex((focusedOptionIndex) =>\n focusedOptionIndex !== index ? index : focusedOptionIndex,\n );\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 const setScrollBoxRef = React.useCallback(\n (ref: HTMLDivElement | null) => {\n scrollBoxRef.current = ref;\n\n if (ref && selectedOptionIndex !== undefined && isValidIndex(selectedOptionIndex)) {\n {\n scrollToElement(selectedOptionIndex, true);\n }\n }\n },\n [isValidIndex, scrollToElement, selectedOptionIndex],\n );\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 /**\n * Note: сбрасывать `options` через `setOptions(optionsProp)` не нужно.\n * Сброс происходит в одном из эффекте `updateOptionsAndSelectedOptionIndex()`.\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\n setNativeSelectValue(item?.value);\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 [close, options, selectElRef, isControlledOutside, props.value, nativeSelectValue],\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 React.useEffect(\n function updateOptionsAndSelectedOptionIndex() {\n const value = props.value ?? nativeSelectValue ?? defaultValue;\n\n const options =\n searchable && inputValue !== undefined\n ? filter(optionsProp, inputValue, filterFn)\n : optionsProp;\n\n setOptions(options);\n setSelectedOptionIndex(findSelectedIndex(options, value, allowClearButton));\n },\n [\n filterFn,\n inputValue,\n nativeSelectValue,\n optionsProp,\n defaultValue,\n props.value,\n searchable,\n allowClearButton,\n ],\n );\n\n const onNativeSelectChange: React.ChangeEventHandler<HTMLSelectElement> = (e) => {\n const newSelectedOptionIndex = findSelectedIndex(\n options,\n e.currentTarget.value,\n allowClearButton,\n );\n\n if (selectedOptionIndex !== newSelectedOptionIndex) {\n if (!isControlledOutside) {\n setSelectedOptionIndex(newSelectedOptionIndex);\n }\n onChange?.(e);\n }\n };\n\n const onInputChange: React.ChangeEventHandler<HTMLInputElement> = React.useCallback(\n (e) => {\n onInputChangeProp && onInputChangeProp(e);\n\n const options = filter(optionsProp, e.target.value, filterFn);\n setOptions(options);\n setSelectedOptionIndex(findSelectedIndex(options, nativeSelectValue, allowClearButton));\n\n setInputValue(e.target.value);\n },\n [filterFn, nativeSelectValue, onInputChangeProp, optionsProp, allowClearButton],\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 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 prevMousePositionRef = React.useRef<{\n x: React.MouseEvent['clientX'];\n y: React.MouseEvent['clientY'];\n }>({ x: 0, y: 0 });\n const focusOptionOnMouseMove = React.useCallback(\n (e: React.MouseEvent<HTMLElement>, index: number) => {\n const isMouseChangedPosition =\n Math.abs(prevMousePositionRef.current.x - e.clientX) >= 1 ||\n Math.abs(prevMousePositionRef.current.y - e.clientY) >= 1;\n\n if (isMouseChangedPosition) {\n focusOptionByIndex(index, false);\n }\n\n prevMousePositionRef.current = { x: e.clientX, y: e.clientY };\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 })}\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['CustomSelect__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 const focusOnInputTimerRef = React.useRef<ReturnType<typeof setTimeout>>();\n const focusOnInput = React.useCallback(() => {\n clearTimeout(focusOnInputTimerRef.current);\n\n focusOnInputTimerRef.current = setTimeout(() => {\n selectInputRef.current && selectInputRef.current.focus();\n }, 0);\n }, [selectInputRef]);\n useIsomorphicLayoutEffect(function clearFocusOnInputTimer() {\n return () => {\n clearTimeout(focusOnInputTimerRef.current);\n };\n }, []);\n\n const controlledValueSet = isControlledOutside && props.value !== '';\n const uncontrolledValueSet = !isControlledOutside && nativeSelectValue !== '';\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['CustomSelect--clear-icon'] : undefined}\n onClick={function clearSelectState() {\n setNativeSelectValue('');\n setInputValue('');\n focusOnInput();\n }}\n disabled={restProps.disabled}\n data-testid={clearButtonTestId}\n />\n );\n }, [\n clearButtonShown,\n ClearButton,\n iconProp,\n restProps.disabled,\n clearButtonTestId,\n focusOnInput,\n ]);\n\n const icon = React.useMemo(() => {\n if (iconProp !== undefined) {\n return iconProp;\n }\n\n return (\n <DropdownIcon\n className={clearButtonShown ? styles['CustomSelect__dropdown-icon'] : 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 focusOnInput();\n }\n }\n },\n [document, focusOnInput, 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 return (\n <div\n className={classNames(\n styles['CustomSelect'],\n sizeY !== 'regular' && sizeYClassNames[sizeY],\n className,\n )}\n style={style}\n ref={handleRootRef}\n onClick={passClickAndFocusToInputOnClick}\n onMouseDown={preventInputBlurWhenClickInsideFocusedSelectArea}\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={handleKeyDownSelect}\n onChange={onInputChange}\n onClick={onClick}\n before={before}\n after={afterIcons}\n selectType={selectType}\n >\n {selected?.label}\n </CustomSelectInput>\n <select\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['CustomSelect__control']}\n data-testid={nativeSelectTestId}\n required={required}\n >\n {allowClearButton && <option key=\"\" value=\"\" />}\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={setScrollBoxRef}\n onPlacementChange={setPopperPlacement}\n onMouseLeave={resetFocusedOption}\n fetching={fetching}\n overscrollBehavior={overscrollBehavior}\n offsetDistance={dropdownOffsetDistance}\n autoWidth={dropdownAutoWidth}\n forcePortal={forceDropdownPortal}\n autoHideScrollbar={autoHideScrollbar}\n autoHideScrollbarDelay={autoHideScrollbarDelay}\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","useDOM","defaultFilterFn","useIsomorphicLayoutEffect","warnOnce","CustomSelectDropdown","CustomSelectOption","DropdownIcon","Footnote","VisuallyHidden","CustomSelectClearButton","CustomSelectInput","styles","sizeYClassNames","none","findIndexAfter","options","startIndex","length","findIndex","option","i","disabled","findIndexBefore","endIndex","result","warn","checkOptionsValueType","Set","map","item","value","size","defaultRenderOptionFn","props","handleOptionDown","e","preventDefault","findSelectedIndex","withClear","Number","filter","inputValue","filterFn","CustomSelect","opened","setOpened","useState","before","name","className","getRef","getRootRef","popupDirection","style","onChange","children","onInputChange","onInputChangeProp","renderDropdown","onOpen","onClose","fetching","forceDropdownPortal","selectType","autoHideScrollbar","autoHideScrollbarDelay","searchable","renderOption","renderOptionProp","optionsProp","emptyText","icon","iconProp","ClearButton","allowClearButton","dropdownOffsetDistance","dropdownAutoWidth","noMaxHeight","ariaLabelledBy","clearButtonTestId","nativeSelectTestId","defaultValue","required","getSelectInputRef","overscrollBehavior","restProps","process","env","NODE_ENV","sizeY","containerRef","useRef","handleRootRef","scrollBoxRef","selectElRef","optionsWrapperRef","focusedOptionIndex","setFocusedOptionIndex","isControlledOutside","setIsControlledOutside","undefined","setInputValue","nativeSelectValue","setNativeSelectValue","popperPlacement","setPopperPlacement","setOptions","selectedOptionIndex","setSelectedOptionIndex","useEffect","some","event","Event","bubbles","current","dispatchEvent","selected","useMemo","openedClassNames","includes","scrollToElement","useCallback","index","center","dropdown","optionsWrapper","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","focusOptionByIndex","scrollTo","isValidIndex","setScrollBoxRef","ref","keyboardInput","setKeyboardInput","resetKeyboardInput","resetFocusedOption","onKeyboardInput","key","fullInput","close","selectOption","shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync","selectFocused","open","onBlur","onFocus","onClick","handleKeyUp","focusOption","type","nextIndex","beforeIndex","updateOptionsAndSelectedOptionIndex","onNativeSelectChange","newSelectedOptionIndex","currentTarget","target","areOptionsShown","handleKeyDownSelect","handleOptionClick","Array","prototype","indexOf","call","parentNode","prevMousePositionRef","x","y","focusOptionOnMouseMove","isMouseChangedPosition","Math","abs","clientX","clientY","popupAriaId","useId","hovered","Fragment","label","onMouseDown","onMouseMove","id","resolvedContent","defaultDropdownContent","div","selectInputRef","focusOnInputTimerRef","focusOnInput","clearTimeout","setTimeout","focus","clearFocusOnInputTimer","controlledValueSet","uncontrolledValueSet","clearButtonShown","clearButton","clearSelectState","data-testid","afterIcons","document","passClickAndFocusToInputOnClick","clickTargetIsNotAnInput","click","inputIsNotFocused","activeElement","preventInputBlurWhenClickInsideFocusedSelectArea","isInputFocused","ariaActiveDescendantOptionIndex","ariaActiveDescendantId","selectInputAriaProps","focusWithin","aria-live","autoComplete","autoCapitalize","autoCorrect","spellCheck","readOnly","onKeyUp","onKeyDown","after","select","aria-hidden","targetRef","placement","onPlacementChange","onMouseLeave","offsetDistance","autoWidth","forcePortal","role","aria-labelledby","tabIndex"],"mappings":"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"}
@@ -7,12 +7,10 @@ export interface CustomSelectInputProps extends React.InputHTMLAttributes<HTMLIn
7
7
  multiline?: boolean;
8
8
  labelTextTestId?: string;
9
9
  fetching?: boolean;
10
- searchable?: boolean;
11
- selectedOptionLabel?: React.ReactElement | string;
12
10
  }
13
11
  /**
14
12
  * @since 5.10.0
15
13
  * @private
16
14
  */
17
- export declare const CustomSelectInput: ({ align, getRef, className, getRootRef, style, before, after, status, selectedOptionLabel, selectType, multiline, disabled, fetching, labelTextTestId, searchable, ...restInputProps }: CustomSelectInputProps) => React.ReactNode;
15
+ export declare const CustomSelectInput: ({ align, getRef, className, getRootRef, style, before, after, status, children, placeholder, selectType, multiline, disabled, fetching, labelTextTestId, ...restProps }: CustomSelectInputProps) => React.ReactNode;
18
16
  //# sourceMappingURL=CustomSelectInput.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CustomSelectInput.d.ts","sourceRoot":"","sources":["../../../../src/components/CustomSelect/CustomSelectInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAa,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAUnD,MAAM,WAAW,sBACf,SAAQ,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EACjD,MAAM,CAAC,gBAAgB,CAAC,EACxB,UAAU,CAAC,cAAc,CAAC,EAC1B,QAAQ,EACR,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;IACrD,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,mBAAmB,CAAC,EAAE,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC;CACnD;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,2LAiB3B,sBAAsB,KAAG,KAAK,CAAC,SAmEjC,CAAC"}
1
+ {"version":3,"file":"CustomSelectInput.d.ts","sourceRoot":"","sources":["../../../../src/components/CustomSelect/CustomSelectInput.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAa,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAWnD,MAAM,WAAW,sBACf,SAAQ,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EACjD,MAAM,CAAC,gBAAgB,CAAC,EACxB,UAAU,CAAC,cAAc,CAAC,EAC1B,QAAQ,EACR,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;IACrD,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,4KAiB3B,sBAAsB,KAAG,KAAK,CAAC,SA8EjC,CAAC"}
@@ -3,10 +3,12 @@ import * as React from 'react';
3
3
  import { classNames } from '@vkontakte/vkjs';
4
4
  import { useAdaptivity } from '../../hooks/useAdaptivity';
5
5
  import { useExternRef } from '../../hooks/useExternRef';
6
+ import { useFocusWithin } from '../../hooks/useFocusWithin';
6
7
  import { usePlatform } from '../../hooks/usePlatform';
7
8
  import { getFormFieldModeFromSelectType } from '../../lib/select';
8
9
  import { FormField } from '../FormField/FormField';
9
10
  import { SelectTypography } from '../SelectTypography/SelectTypography';
11
+ import { Text } from '../Typography/Text/Text';
10
12
  import { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';
11
13
  import styles from './CustomSelectInput.module.css';
12
14
  const sizeYClassNames = {
@@ -16,25 +18,28 @@ const sizeYClassNames = {
16
18
  /**
17
19
  * @since 5.10.0
18
20
  * @private
19
- */ export const CustomSelectInput = ({ align = 'left', getRef, className, getRootRef, style, before, after, status, selectedOptionLabel, selectType = 'default', multiline, disabled, fetching, labelTextTestId, searchable, ...restInputProps })=>{
21
+ */ export const CustomSelectInput = ({ align = 'left', getRef, className, getRootRef, style, before, after, status, children, placeholder, selectType = 'default', multiline, disabled, fetching, labelTextTestId, ...restProps })=>{
20
22
  const { sizeY = 'none' } = useAdaptivity();
23
+ const title = children || placeholder;
24
+ const showLabelOrPlaceholder = !Boolean(restProps.value);
21
25
  const handleRootRef = useExternRef(getRootRef);
22
- const platform = usePlatform();
23
- const input = /*#__PURE__*/ _jsx(SelectTypography, {
24
- selectType: selectType,
26
+ const focusWithin = useFocusWithin(handleRootRef);
27
+ const input = /*#__PURE__*/ _jsx(Text, {
25
28
  type: "text",
26
- ...restInputProps,
29
+ ...restProps,
27
30
  disabled: disabled && !fetching,
28
- readOnly: restInputProps.readOnly || !searchable || disabled && fetching,
31
+ readOnly: restProps.readOnly || disabled && fetching,
29
32
  Component: "input",
30
33
  normalize: false,
31
- className: styles['CustomSelectInput__input'],
32
- getRootRef: getRef
34
+ className: classNames(styles['CustomSelectInput__el'], (restProps.readOnly || showLabelOrPlaceholder && !focusWithin) && styles['CustomSelectInput__el--cursor-pointer']),
35
+ getRootRef: getRef,
36
+ placeholder: children ? '' : placeholder
33
37
  });
38
+ const platform = usePlatform();
34
39
  return /*#__PURE__*/ _jsx(FormField, {
35
40
  Component: "div",
36
41
  style: style,
37
- className: classNames(styles['CustomSelectInput'], align === 'right' && styles['CustomSelectInput--align-right'], align === 'center' && styles['CustomSelectInput--align-center'], !selectedOptionLabel && styles['CustomSelectInput--empty'], multiline && styles['CustomSelectInput--multiline'], sizeY !== 'regular' && sizeYClassNames[sizeY], before && styles['CustomSelectInput--hasBefore'], after && styles['CustomSelectInput--hasAfter'], className),
42
+ className: classNames(styles['CustomSelectInput'], align === 'right' && styles['CustomSelectInput--align-right'], align === 'center' && styles['CustomSelectInput--align-center'], !children && styles['CustomSelectInput--empty'], multiline && styles['CustomSelectInput--multiline'], sizeY !== 'regular' && sizeYClassNames[sizeY], before && styles['CustomSelectInput--hasBefore'], after && styles['CustomSelectInput--hasAfter'], className),
38
43
  getRootRef: handleRootRef,
39
44
  before: before,
40
45
  after: after,
@@ -44,20 +49,20 @@ const sizeYClassNames = {
44
49
  children: /*#__PURE__*/ _jsxs("div", {
45
50
  className: styles['CustomSelectInput__input-group'],
46
51
  children: [
47
- !searchable && platform === 'ios' ? /*#__PURE__*/ _jsx(VisuallyHidden, {
48
- children: input
49
- }) : input,
50
52
  /*#__PURE__*/ _jsx("div", {
51
- className: classNames(styles['CustomSelectInput__label-wrapper'], className),
53
+ className: classNames(styles['CustomSelectInput__container'], className),
52
54
  tabIndex: -1,
53
55
  "aria-hidden": true,
54
56
  "data-testid": labelTextTestId,
55
57
  children: /*#__PURE__*/ _jsx(SelectTypography, {
56
58
  selectType: selectType,
57
- className: styles['CustomSelectInput__label'],
58
- children: selectedOptionLabel || restInputProps.placeholder
59
+ className: styles['CustomSelectInput__title'],
60
+ children: showLabelOrPlaceholder && title
59
61
  })
60
- })
62
+ }),
63
+ restProps.readOnly && platform === 'ios' ? /*#__PURE__*/ _jsx(VisuallyHidden, {
64
+ children: input
65
+ }) : input
61
66
  ]
62
67
  })
63
68
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/CustomSelect/CustomSelectInput.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { getFormFieldModeFromSelectType } from '../../lib/select';\nimport { HasAlign, HasRef, HasRootRef } from '../../types';\nimport { FormField, FormFieldProps } from '../FormField/FormField';\nimport type { SelectType } from '../Select/Select';\nimport { SelectTypography } from '../SelectTypography/SelectTypography';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport styles from './CustomSelectInput.module.css';\n\nconst sizeYClassNames = {\n none: styles['CustomSelectInput--sizeY-none'],\n compact: styles['CustomSelectInput--sizeY-compact'],\n};\n\nexport interface CustomSelectInputProps\n extends React.InputHTMLAttributes<HTMLInputElement>,\n HasRef<HTMLInputElement>,\n HasRootRef<HTMLDivElement>,\n HasAlign,\n Omit<FormFieldProps, 'mode' | 'type' | 'maxHeight'> {\n selectType?: SelectType;\n multiline?: boolean;\n labelTextTestId?: string;\n fetching?: boolean;\n searchable?: boolean;\n selectedOptionLabel?: React.ReactElement | string;\n}\n\n/**\n * @since 5.10.0\n * @private\n */\nexport const CustomSelectInput = ({\n align = 'left',\n getRef,\n className,\n getRootRef,\n style,\n before,\n after,\n status,\n selectedOptionLabel,\n selectType = 'default',\n multiline,\n disabled,\n fetching,\n labelTextTestId,\n searchable,\n ...restInputProps\n}: CustomSelectInputProps): React.ReactNode => {\n const { sizeY = 'none' } = useAdaptivity();\n\n const handleRootRef = useExternRef(getRootRef);\n\n const platform = usePlatform();\n\n const input = (\n <SelectTypography\n selectType={selectType}\n type=\"text\"\n {...restInputProps}\n disabled={disabled && !fetching}\n readOnly={restInputProps.readOnly || !searchable || (disabled && fetching)}\n Component=\"input\"\n normalize={false}\n className={styles['CustomSelectInput__input']}\n getRootRef={getRef}\n />\n );\n\n return (\n <FormField\n Component=\"div\"\n style={style}\n className={classNames(\n styles['CustomSelectInput'],\n align === 'right' && styles['CustomSelectInput--align-right'],\n align === 'center' && styles['CustomSelectInput--align-center'],\n !selectedOptionLabel && styles['CustomSelectInput--empty'],\n multiline && styles['CustomSelectInput--multiline'],\n sizeY !== 'regular' && sizeYClassNames[sizeY],\n before && styles['CustomSelectInput--hasBefore'],\n after && styles['CustomSelectInput--hasAfter'],\n className,\n )}\n getRootRef={handleRootRef}\n before={before}\n after={after}\n disabled={disabled}\n mode={getFormFieldModeFromSelectType(selectType)}\n status={status}\n >\n <div className={styles['CustomSelectInput__input-group']}>\n {/* Чтобы отключить autosuggestion в iOS, тултипы которого начинают всплывать даже когда input\n * в режиме readonly, мы оборачиваем инпут в VisuallyHidden.\n * Тултипы появляются при каждом клике на input.\n * смотри: https://github.com/VKCOM/VKUI/issues/6205\n *\n * Достаточно не дать пользователю кликнуть по инпуту.\n * Делаем это только для режима read-only. Потому что проблема именно в режиме read-only.\n * Обертка вокруг инпута обрабатывает клики и передаёт фокус, так что на взаимодействии с инпутом это никак не скажется.\n **/}\n {!searchable && platform === 'ios' ? <VisuallyHidden>{input}</VisuallyHidden> : input}\n <div\n className={classNames(styles['CustomSelectInput__label-wrapper'], className)}\n tabIndex={-1}\n aria-hidden\n data-testid={labelTextTestId}\n >\n <SelectTypography selectType={selectType} className={styles['CustomSelectInput__label']}>\n {selectedOptionLabel || restInputProps.placeholder}\n </SelectTypography>\n </div>\n </div>\n </FormField>\n );\n};\n"],"names":["React","classNames","useAdaptivity","useExternRef","usePlatform","getFormFieldModeFromSelectType","FormField","SelectTypography","VisuallyHidden","styles","sizeYClassNames","none","compact","CustomSelectInput","align","getRef","className","getRootRef","style","before","after","status","selectedOptionLabel","selectType","multiline","disabled","fetching","labelTextTestId","searchable","restInputProps","sizeY","handleRootRef","platform","input","type","readOnly","Component","normalize","mode","div","tabIndex","aria-hidden","data-testid","placeholder"],"mappings":";AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,YAAY,QAAQ,2BAA2B;AACxD,SAASC,WAAW,QAAQ,0BAA0B;AACtD,SAASC,8BAA8B,QAAQ,mBAAmB;AAElE,SAASC,SAAS,QAAwB,yBAAyB;AAEnE,SAASC,gBAAgB,QAAQ,uCAAuC;AACxE,SAASC,cAAc,QAAQ,mCAAmC;AAClE,OAAOC,YAAY,iCAAiC;AAEpD,MAAMC,kBAAkB;IACtBC,MAAMF,MAAM,CAAC,gCAAgC;IAC7CG,SAASH,MAAM,CAAC,mCAAmC;AACrD;AAgBA;;;CAGC,GACD,OAAO,MAAMI,oBAAoB,CAAC,EAChCC,QAAQ,MAAM,EACdC,MAAM,EACNC,SAAS,EACTC,UAAU,EACVC,KAAK,EACLC,MAAM,EACNC,KAAK,EACLC,MAAM,EACNC,mBAAmB,EACnBC,aAAa,SAAS,EACtBC,SAAS,EACTC,QAAQ,EACRC,QAAQ,EACRC,eAAe,EACfC,UAAU,EACV,GAAGC,gBACoB;IACvB,MAAM,EAAEC,QAAQ,MAAM,EAAE,GAAG5B;IAE3B,MAAM6B,gBAAgB5B,aAAac;IAEnC,MAAMe,WAAW5B;IAEjB,MAAM6B,sBACJ,KAAC1B;QACCgB,YAAYA;QACZW,MAAK;QACJ,GAAGL,cAAc;QAClBJ,UAAUA,YAAY,CAACC;QACvBS,UAAUN,eAAeM,QAAQ,IAAI,CAACP,cAAeH,YAAYC;QACjEU,WAAU;QACVC,WAAW;QACXrB,WAAWP,MAAM,CAAC,2BAA2B;QAC7CQ,YAAYF;;IAIhB,qBACE,KAACT;QACC8B,WAAU;QACVlB,OAAOA;QACPF,WAAWf,WACTQ,MAAM,CAAC,oBAAoB,EAC3BK,UAAU,WAAWL,MAAM,CAAC,iCAAiC,EAC7DK,UAAU,YAAYL,MAAM,CAAC,kCAAkC,EAC/D,CAACa,uBAAuBb,MAAM,CAAC,2BAA2B,EAC1De,aAAaf,MAAM,CAAC,+BAA+B,EACnDqB,UAAU,aAAapB,eAAe,CAACoB,MAAM,EAC7CX,UAAUV,MAAM,CAAC,+BAA+B,EAChDW,SAASX,MAAM,CAAC,8BAA8B,EAC9CO;QAEFC,YAAYc;QACZZ,QAAQA;QACRC,OAAOA;QACPK,UAAUA;QACVa,MAAMjC,+BAA+BkB;QACrCF,QAAQA;kBAER,cAAA,MAACkB;YAAIvB,WAAWP,MAAM,CAAC,iCAAiC;;gBAUrD,CAACmB,cAAcI,aAAa,sBAAQ,KAACxB;8BAAgByB;qBAA0BA;8BAChF,KAACM;oBACCvB,WAAWf,WAAWQ,MAAM,CAAC,mCAAmC,EAAEO;oBAClEwB,UAAU,CAAC;oBACXC,aAAW;oBACXC,eAAaf;8BAEb,cAAA,KAACpB;wBAAiBgB,YAAYA;wBAAYP,WAAWP,MAAM,CAAC,2BAA2B;kCACpFa,uBAAuBO,eAAec,WAAW;;;;;;AAM9D,EAAE"}
1
+ {"version":3,"sources":["../../../../src/components/CustomSelect/CustomSelectInput.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useFocusWithin } from '../../hooks/useFocusWithin';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { getFormFieldModeFromSelectType } from '../../lib/select';\nimport { HasAlign, HasRef, HasRootRef } from '../../types';\nimport { FormField, FormFieldProps } from '../FormField/FormField';\nimport type { SelectType } from '../Select/Select';\nimport { SelectTypography } from '../SelectTypography/SelectTypography';\nimport { Text } from '../Typography/Text/Text';\nimport { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';\nimport styles from './CustomSelectInput.module.css';\n\nconst sizeYClassNames = {\n none: styles['CustomSelectInput--sizeY-none'],\n compact: styles['CustomSelectInput--sizeY-compact'],\n};\n\nexport interface CustomSelectInputProps\n extends React.InputHTMLAttributes<HTMLInputElement>,\n HasRef<HTMLInputElement>,\n HasRootRef<HTMLDivElement>,\n HasAlign,\n Omit<FormFieldProps, 'mode' | 'type' | 'maxHeight'> {\n selectType?: SelectType;\n multiline?: boolean;\n labelTextTestId?: string;\n fetching?: boolean;\n}\n\n/**\n * @since 5.10.0\n * @private\n */\nexport const CustomSelectInput = ({\n align = 'left',\n getRef,\n className,\n getRootRef,\n style,\n before,\n after,\n status,\n children,\n placeholder,\n selectType = 'default',\n multiline,\n disabled,\n fetching,\n labelTextTestId,\n ...restProps\n}: CustomSelectInputProps): React.ReactNode => {\n const { sizeY = 'none' } = useAdaptivity();\n\n const title = children || placeholder;\n const showLabelOrPlaceholder = !Boolean(restProps.value);\n\n const handleRootRef = useExternRef(getRootRef);\n const focusWithin = useFocusWithin(handleRootRef);\n\n const input = (\n <Text\n type=\"text\"\n {...restProps}\n disabled={disabled && !fetching}\n readOnly={restProps.readOnly || (disabled && fetching)}\n Component=\"input\"\n normalize={false}\n className={classNames(\n styles['CustomSelectInput__el'],\n (restProps.readOnly || (showLabelOrPlaceholder && !focusWithin)) &&\n styles['CustomSelectInput__el--cursor-pointer'],\n )}\n getRootRef={getRef}\n placeholder={children ? '' : placeholder}\n />\n );\n\n const platform = usePlatform();\n return (\n <FormField\n Component=\"div\"\n style={style}\n className={classNames(\n styles['CustomSelectInput'],\n align === 'right' && styles['CustomSelectInput--align-right'],\n align === 'center' && styles['CustomSelectInput--align-center'],\n !children && styles['CustomSelectInput--empty'],\n multiline && styles['CustomSelectInput--multiline'],\n sizeY !== 'regular' && sizeYClassNames[sizeY],\n before && styles['CustomSelectInput--hasBefore'],\n after && styles['CustomSelectInput--hasAfter'],\n className,\n )}\n getRootRef={handleRootRef}\n before={before}\n after={after}\n disabled={disabled}\n mode={getFormFieldModeFromSelectType(selectType)}\n status={status}\n >\n <div className={styles['CustomSelectInput__input-group']}>\n <div\n className={classNames(styles['CustomSelectInput__container'], className)}\n tabIndex={-1}\n aria-hidden\n data-testid={labelTextTestId}\n >\n <SelectTypography selectType={selectType} className={styles['CustomSelectInput__title']}>\n {showLabelOrPlaceholder && title}\n </SelectTypography>\n </div>\n {/* Чтобы отключить autosuggestion в iOS, тултипы которого начинают всплывать даже когда input\n * в режиме readonly, мы оборачиваем инпут в VisuallyHidden.\n * Тултипы появляются при каждом клике на input.\n * смотри: https://github.com/VKCOM/VKUI/issues/6205\n *\n * Достаточно не дать пользователю кликнуть по инпуту.\n * Делаем это только для режима read-only. Потому что проблема именно в режиме read-only.\n * Обертка вокруг инпута обрабатывает клики и передаёт фокус, так что на взаимодействии с инпутом это никак не скажется.\n **/}\n {restProps.readOnly && platform === 'ios' ? (\n <VisuallyHidden>{input}</VisuallyHidden>\n ) : (\n input\n )}\n </div>\n </FormField>\n );\n};\n"],"names":["React","classNames","useAdaptivity","useExternRef","useFocusWithin","usePlatform","getFormFieldModeFromSelectType","FormField","SelectTypography","Text","VisuallyHidden","styles","sizeYClassNames","none","compact","CustomSelectInput","align","getRef","className","getRootRef","style","before","after","status","children","placeholder","selectType","multiline","disabled","fetching","labelTextTestId","restProps","sizeY","title","showLabelOrPlaceholder","Boolean","value","handleRootRef","focusWithin","input","type","readOnly","Component","normalize","platform","mode","div","tabIndex","aria-hidden","data-testid"],"mappings":";AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,YAAY,QAAQ,2BAA2B;AACxD,SAASC,cAAc,QAAQ,6BAA6B;AAC5D,SAASC,WAAW,QAAQ,0BAA0B;AACtD,SAASC,8BAA8B,QAAQ,mBAAmB;AAElE,SAASC,SAAS,QAAwB,yBAAyB;AAEnE,SAASC,gBAAgB,QAAQ,uCAAuC;AACxE,SAASC,IAAI,QAAQ,0BAA0B;AAC/C,SAASC,cAAc,QAAQ,mCAAmC;AAClE,OAAOC,YAAY,iCAAiC;AAEpD,MAAMC,kBAAkB;IACtBC,MAAMF,MAAM,CAAC,gCAAgC;IAC7CG,SAASH,MAAM,CAAC,mCAAmC;AACrD;AAcA;;;CAGC,GACD,OAAO,MAAMI,oBAAoB,CAAC,EAChCC,QAAQ,MAAM,EACdC,MAAM,EACNC,SAAS,EACTC,UAAU,EACVC,KAAK,EACLC,MAAM,EACNC,KAAK,EACLC,MAAM,EACNC,QAAQ,EACRC,WAAW,EACXC,aAAa,SAAS,EACtBC,SAAS,EACTC,QAAQ,EACRC,QAAQ,EACRC,eAAe,EACf,GAAGC,WACoB;IACvB,MAAM,EAAEC,QAAQ,MAAM,EAAE,GAAG9B;IAE3B,MAAM+B,QAAQT,YAAYC;IAC1B,MAAMS,yBAAyB,CAACC,QAAQJ,UAAUK,KAAK;IAEvD,MAAMC,gBAAgBlC,aAAagB;IACnC,MAAMmB,cAAclC,eAAeiC;IAEnC,MAAME,sBACJ,KAAC9B;QACC+B,MAAK;QACJ,GAAGT,SAAS;QACbH,UAAUA,YAAY,CAACC;QACvBY,UAAUV,UAAUU,QAAQ,IAAKb,YAAYC;QAC7Ca,WAAU;QACVC,WAAW;QACXzB,WAAWjB,WACTU,MAAM,CAAC,wBAAwB,EAC/B,AAACoB,CAAAA,UAAUU,QAAQ,IAAKP,0BAA0B,CAACI,WAAW,KAC5D3B,MAAM,CAAC,wCAAwC;QAEnDQ,YAAYF;QACZQ,aAAaD,WAAW,KAAKC;;IAIjC,MAAMmB,WAAWvC;IACjB,qBACE,KAACE;QACCmC,WAAU;QACVtB,OAAOA;QACPF,WAAWjB,WACTU,MAAM,CAAC,oBAAoB,EAC3BK,UAAU,WAAWL,MAAM,CAAC,iCAAiC,EAC7DK,UAAU,YAAYL,MAAM,CAAC,kCAAkC,EAC/D,CAACa,YAAYb,MAAM,CAAC,2BAA2B,EAC/CgB,aAAahB,MAAM,CAAC,+BAA+B,EACnDqB,UAAU,aAAapB,eAAe,CAACoB,MAAM,EAC7CX,UAAUV,MAAM,CAAC,+BAA+B,EAChDW,SAASX,MAAM,CAAC,8BAA8B,EAC9CO;QAEFC,YAAYkB;QACZhB,QAAQA;QACRC,OAAOA;QACPM,UAAUA;QACViB,MAAMvC,+BAA+BoB;QACrCH,QAAQA;kBAER,cAAA,MAACuB;YAAI5B,WAAWP,MAAM,CAAC,iCAAiC;;8BACtD,KAACmC;oBACC5B,WAAWjB,WAAWU,MAAM,CAAC,+BAA+B,EAAEO;oBAC9D6B,UAAU,CAAC;oBACXC,aAAW;oBACXC,eAAanB;8BAEb,cAAA,KAACtB;wBAAiBkB,YAAYA;wBAAYR,WAAWP,MAAM,CAAC,2BAA2B;kCACpFuB,0BAA0BD;;;gBAY9BF,UAAUU,QAAQ,IAAIG,aAAa,sBAClC,KAAClC;8BAAgB6B;qBAEjBA;;;;AAKV,EAAE"}