@vkontakte/vkui 5.4.2 → 5.4.3
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.
- package/README.md +2 -2
- package/dist/cjs/components/ChipsSelect/ChipsSelect.js +3 -20
- package/dist/cjs/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/cjs/components/CustomSelect/CustomSelect.js +16 -2
- package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cjs/components/CustomSelectOption/CustomSelectOption.d.ts +1 -1
- package/dist/cjs/components/CustomSelectOption/CustomSelectOption.js +4 -2
- package/dist/cjs/components/CustomSelectOption/CustomSelectOption.js.map +1 -1
- package/dist/cjs/components/ModalRoot/ModalRoot.js +25 -1
- package/dist/cjs/components/ModalRoot/ModalRoot.js.map +1 -1
- package/dist/cjs/components/NativeSelect/NativeSelect.js +2 -1
- package/dist/cjs/components/NativeSelect/NativeSelect.js.map +1 -1
- package/dist/cjs/components/Panel/Panel.js +4 -4
- package/dist/cjs/components/Panel/Panel.js.map +1 -1
- package/dist/cjs/components/PanelHeader/PanelHeader.js +1 -1
- package/dist/cjs/components/PanelHeader/PanelHeader.js.map +1 -1
- package/dist/cjs/components/WriteBar/WriteBar.js +14 -2
- package/dist/cjs/components/WriteBar/WriteBar.js.map +1 -1
- package/dist/cjs/hooks/useTodayDate.js +30 -7
- package/dist/cjs/hooks/useTodayDate.js.map +1 -1
- package/dist/components/ChipsSelect/ChipsSelect.js +3 -20
- package/dist/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.js +16 -2
- package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/components/CustomSelectOption/CustomSelectOption.d.ts +1 -1
- package/dist/components/CustomSelectOption/CustomSelectOption.js +4 -2
- package/dist/components/CustomSelectOption/CustomSelectOption.js.map +1 -1
- package/dist/components/ModalRoot/ModalRoot.js +25 -1
- package/dist/components/ModalRoot/ModalRoot.js.map +1 -1
- package/dist/components/NativeSelect/NativeSelect.js +2 -1
- package/dist/components/NativeSelect/NativeSelect.js.map +1 -1
- package/dist/components/Panel/Panel.js +4 -4
- package/dist/components/Panel/Panel.js.map +1 -1
- package/dist/components/PanelHeader/PanelHeader.js +1 -1
- package/dist/components/PanelHeader/PanelHeader.js.map +1 -1
- package/dist/components/WriteBar/WriteBar.js +14 -2
- package/dist/components/WriteBar/WriteBar.js.map +1 -1
- package/dist/components.css +3 -3
- package/dist/components.css.map +1 -1
- package/dist/components.js.tmp +133 -48
- package/dist/cssm/components/ChipsSelect/ChipsSelect.js +3 -17
- package/dist/cssm/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelect.js +15 -2
- package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cssm/components/CustomSelectOption/CustomSelectOption.d.ts +1 -1
- package/dist/cssm/components/CustomSelectOption/CustomSelectOption.js +2 -1
- package/dist/cssm/components/CustomSelectOption/CustomSelectOption.js.map +1 -1
- package/dist/cssm/components/ModalRoot/ModalRoot.js +22 -1
- package/dist/cssm/components/ModalRoot/ModalRoot.js.map +1 -1
- package/dist/cssm/components/NativeSelect/NativeSelect.js +2 -1
- package/dist/cssm/components/NativeSelect/NativeSelect.js.map +1 -1
- package/dist/cssm/components/Panel/Panel.js +4 -4
- package/dist/cssm/components/Panel/Panel.js.map +1 -1
- package/dist/cssm/components/PanelHeader/PanelHeader.js +1 -1
- package/dist/cssm/components/PanelHeader/PanelHeader.js.map +1 -1
- package/dist/cssm/components/PanelHeaderContent/PanelHeaderContent.module.css +1 -1
- package/dist/cssm/components/WriteBar/WriteBar.js +15 -2
- package/dist/cssm/components/WriteBar/WriteBar.js.map +1 -1
- package/dist/cssm/components/WriteBar/WriteBar.module.css +13 -7
- package/dist/cssm/components/WriteBarIcon/WriteBarIcon.module.css +9 -1
- package/dist/cssm/hooks/useTodayDate.js +31 -8
- package/dist/cssm/hooks/useTodayDate.js.map +1 -1
- package/dist/hooks/useTodayDate.js +31 -8
- package/dist/hooks/useTodayDate.js.map +1 -1
- package/dist/vkui.css +3 -3
- package/dist/vkui.css.map +1 -1
- package/dist/vkui.js.tmp +133 -48
- package/package.json +3 -5
- package/docs/assets/assets/vkui-logo-dark.svg +0 -5
- package/docs/assets/assets/vkui-logo-light.svg +0 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/CustomSelect/CustomSelect.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { SizeType } from '../../lib/adaptivity';\nimport type { PlacementWithAuto } from '../../lib/floating';\nimport { defaultFilterFn, getFormFieldModeFromSelectType } from '../../lib/select';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { debounce, getTitleFromChildren } from '../../lib/utils';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { TrackerOptionsProps } from '../CustomScrollView/useTrackerVisibility';\nimport { CustomSelectDropdown } from '../CustomSelectDropdown/CustomSelectDropdown';\nimport {\n CustomSelectOption,\n CustomSelectOptionProps,\n} from '../CustomSelectOption/CustomSelectOption';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport { FormFieldProps } from '../FormField/FormField';\nimport { Input } from '../Input/Input';\nimport { NativeSelectProps } from '../NativeSelect/NativeSelect';\nimport { SelectType } from '../Select/Select';\nimport { SelectMimicry } from '../SelectMimicry/SelectMimicry';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { CustomSelectClearButton, CustomSelectClearButtonProps } from './CustomSelectClearButton';\nimport styles from './CustomSelect.module.css';\n\nconst sizeYClassNames = {\n none: styles['CustomSelect--sizeY-none'],\n [SizeType.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 = (options: CustomSelectOptionInterface[]) => {\n if (new Set(options.map((item) => typeof item.value)).size > 1) {\n warn(\n 'Некоторые значения ваших опций имеют разные типы. onChange всегда возвращает строковый тип.',\n 'error',\n );\n }\n};\n\nfunction defaultRenderOptionFn({ option, ...props }: CustomSelectOptionProps): React.ReactNode {\n return <CustomSelectOption {...props} />;\n}\n\nconst handleOptionDown: MouseEventHandler = (e: React.MouseEvent<HTMLElement>) => {\n e.preventDefault();\n};\n\nfunction findSelectedIndex(\n options: CustomSelectOptionInterface[],\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 = (\n options: SelectProps['options'],\n inputValue: string,\n filterFn: SelectProps['filterFn'],\n) => {\n return typeof filterFn === 'function'\n ? options.filter((option) => filterFn(inputValue, option))\n : options;\n};\n\nconst defaultOptions: CustomSelectOptionInterface[] = [];\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 SelectProps extends NativeSelectProps, FormFieldProps, TrackerOptionsProps {\n /**\n * Если `true`, то при клике на селект в нём появится текстовое поле для поиска по `options`. По умолчанию поиск\n * производится по `option.label`.\n */\n searchable?: boolean;\n /**\n * Текст, который будет отображен, если приходит пустой `options`.\n */\n emptyText?: string;\n /**\n * > ⚠️ В v6 из возвращаемых типов будет удалён `CustomSelectOptionInterface[]`. Для кастомной фильтрации используйте\n * > `filterFn`.\n */\n onInputChange?: (\n e: React.ChangeEvent,\n options: CustomSelectOptionInterface[],\n ) => void | CustomSelectOptionInterface[];\n options: CustomSelectOptionInterface[];\n /**\n * Функция для кастомной фильтрации. По умолчанию поиск производится по `option.label`.\n */\n filterFn?:\n | false\n | ((\n value: string,\n option: CustomSelectOptionInterface,\n getOptionLabel?: (option: Partial<CustomSelectOptionInterface>) => string,\n ) => boolean);\n popupDirection?: 'top' | 'bottom';\n /**\n * Рендер-проп для кастомного рендера опции.\n * В объекте аргумента приходят [свойства опции](https://vkcom.github.io/VKUI/#/CustomSelectOption?id=props)\n */\n renderOption?: (props: CustomSelectOptionProps) => 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 dropdownOffsetDistance?: number;\n fixDropdownWidth?: boolean;\n forceDropdownPortal?: boolean;\n selectType?: SelectType;\n}\n\ntype MouseEventHandler = (event: React.MouseEvent<HTMLElement>) => void;\n\n/**\n * @see https://vkcom.github.io/VKUI/#/CustomSelect\n */\nexport function CustomSelect(props: SelectProps) {\n const [opened, setOpened] = React.useState(false);\n const {\n before,\n name,\n className,\n getRef,\n getRootRef,\n popupDirection,\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 = defaultOptions,\n emptyText = 'Ничего не найдено',\n filterFn = defaultFilterFn,\n icon: iconProp,\n ClearButton = CustomSelectClearButton,\n allowClearButton = false,\n dropdownOffsetDistance = 0,\n fixDropdownWidth = true,\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<HTMLLabelElement>(null);\n const handleRootRef = useExternRef(containerRef, getRootRef);\n const scrollBoxRef = React.useRef<HTMLDivElement | null>(null);\n const selectElRef = useExternRef(getRef);\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 ?? props.defaultValue ?? (allowClearButton ? '' : undefined),\n );\n const [keyboardInput, setKeyboardInput] = React.useState('');\n const [popperPlacement, setPopperPlacement] = React.useState<PlacementWithAuto | undefined>(\n undefined,\n );\n const [options, setOptions] = React.useState(optionsProp);\n const [selectedOptionIndex, setSelectedOptionIndex] = React.useState<number | undefined>(\n findSelectedIndex(optionsProp, props.value ?? props.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 classNames(\n opened &&\n dropdownOffsetDistance === 0 &&\n (popperPlacement?.includes('top')\n ? styles['CustomSelect--pop-up']\n : styles['CustomSelect--pop-down']),\n ),\n [dropdownOffsetDistance, opened, popperPlacement],\n );\n\n const resetKeyboardInput = React.useCallback(() => {\n setKeyboardInput('');\n }, []);\n\n const scrollToElement = React.useCallback((index: number, center = false) => {\n const dropdown = scrollBoxRef.current;\n const item = dropdown ? (dropdown.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 isValidIndex = React.useCallback(\n (index: number) => {\n return index >= 0 && index < (options.length ?? 0);\n },\n [options.length],\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 // Это оптимизация, прежде всего, под `onMouseOver`\n setFocusedOptionIndex((focusedOptionIndex) =>\n focusedOptionIndex !== index ? index : focusedOptionIndex,\n );\n },\n [options, scrollToElement],\n );\n\n const areOptionsShown = React.useCallback(() => {\n return scrollBoxRef.current !== null;\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 onKeyboardInput = React.useCallback(\n (key: string) => {\n const fullInput = keyboardInput + key;\n\n const optionIndex = options.findIndex((option) => {\n return getTitleFromChildren(option.label).toLowerCase().includes(fullInput);\n });\n\n if (optionIndex !== undefined && optionIndex > -1) {\n focusOptionByIndex(optionIndex);\n }\n\n setKeyboardInput(fullInput);\n },\n [focusOptionByIndex, keyboardInput, options],\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 setFocusedOptionIndex(-1);\n onClose?.();\n }, [onClose, resetKeyboardInput]);\n\n const selectFocused = React.useCallback(() => {\n if (focusedOptionIndex !== undefined && isValidIndex(focusedOptionIndex)) {\n const item = options[focusedOptionIndex];\n\n setNativeSelectValue(item?.value);\n close();\n }\n }, [close, focusedOptionIndex, isValidIndex, options]);\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('blur');\n selectElRef.current?.dispatchEvent(event);\n }, [close, selectElRef]);\n\n const resetFocusedOption = React.useCallback(() => {\n setFocusedOptionIndex(-1);\n }, []);\n\n const onFocus = React.useCallback(() => {\n const event = new Event('focus');\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 ?? props.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 props.defaultValue,\n props.value,\n searchable,\n allowClearButton,\n ],\n );\n\n /**\n * Нужен для правильного поведения обработчика onClick на select. Фильтрует клики, которые были сделаны по\n * выпадающему списку.\n */\n const onLabelClick = React.useCallback((e: React.MouseEvent<HTMLLabelElement>) => {\n if (scrollBoxRef.current?.contains(e.target as Node)) {\n e.preventDefault();\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 onInputKeyDown: React.KeyboardEventHandler<HTMLInputElement> = React.useCallback(\n (event) => {\n ['ArrowUp', 'ArrowDown', 'Escape', 'Enter'].includes(event.key) &&\n areOptionsShown() &&\n event.preventDefault();\n\n switch (event.key) {\n case 'ArrowUp':\n areOptionsShown() && focusOption('prev');\n break;\n case 'ArrowDown':\n areOptionsShown() && focusOption('next');\n break;\n case 'Escape':\n close();\n break;\n case 'Enter':\n areOptionsShown() && selectFocused();\n break;\n }\n },\n [areOptionsShown, close, focusOption, selectFocused],\n );\n\n const onInputChange: React.ChangeEventHandler<HTMLInputElement> = React.useCallback(\n (e) => {\n // TODO [>=6]: удалить `onInputChangeProp`.\n if (onInputChangeProp) {\n const options = onInputChangeProp(e, optionsProp);\n if (options) {\n if (process.env.NODE_ENV === 'development') {\n warn(\n 'Этот метод фильтрации устарел. Возвращаемое значение onInputChange будет ' +\n 'проигнорировано в v6.0.0. Для фильтрации обновляйте props.options самостоятельно или используйте свойство filterFn.',\n );\n }\n setOptions(options);\n setSelectedOptionIndex(findSelectedIndex(options, nativeSelectValue, allowClearButton));\n }\n } else {\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 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 'Enter':\n case 'Spacebar':\n case ' ':\n if (opened) {\n areOptionsShown() && selectFocused();\n } else {\n open();\n }\n break;\n }\n },\n [areOptionsShown, close, focusOption, onKeyboardInput, open, opened, selectFocused],\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 selectFocused();\n }\n },\n [options, selectFocused],\n );\n\n const handleOptionHover = React.useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n focusOptionByIndex(\n Array.prototype.indexOf.call(e.currentTarget.parentNode?.children, e.currentTarget),\n false,\n );\n },\n [focusOptionByIndex],\n );\n\n const renderOption = React.useCallback(\n (option: CustomSelectOptionInterface, index: number) => {\n const hovered = index === focusedOptionIndex;\n const selected = index === selectedOptionIndex;\n\n return (\n <React.Fragment key={`${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 // Используем `onMouseOver` вместо `onMouseEnter`.\n // При параметре `searchable`, обновляется \"ребёнок\", из-за чего `onMouseEnter` не срабатывает в следующих кейсах:\n // 1. До загрузки выпадающего списка, курсор мышки находится над произвольным элементом этого списка.\n // > Лечение: только увод курсора мыши и возвращении его обратно вызывает событие `onMouseEnter` на этот элемент.\n // 2. Если это тач-устройство.\n // > Лечение: нужно нажать на какой-нибудь произвольный элемент списка, после чего `onMouseEnter` будет работать на соседние элементы,\n // но не на тот, на который нажали в первый раз.\n // Более подробно по ссылке https://github.com/facebook/react/issues/13956#issuecomment-1082055744\n onMouseOver: handleOptionHover,\n })}\n </React.Fragment>\n );\n },\n [\n focusedOptionIndex,\n handleOptionClick,\n handleOptionHover,\n renderOptionProp,\n selectedOptionIndex,\n ],\n );\n\n const resolvedContent = React.useMemo(() => {\n const defaultDropdownContent =\n options?.length > 0 ? (\n options.map(renderOption)\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 clearButtonShown = allowClearButton && !opened && nativeSelectValue !== '';\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={() => setNativeSelectValue('')}\n />\n );\n }, [clearButtonShown, ClearButton, iconProp]);\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 return (\n <label\n className={classNames(\n styles['CustomSelect'],\n sizeY !== SizeType.REGULAR && sizeYClassNames[sizeY],\n className,\n )}\n style={style}\n ref={handleRootRef}\n onClick={onLabelClick}\n >\n {opened && searchable ? (\n <Input\n {...restProps}\n autoFocus\n onBlur={onBlur}\n className={openedClassNames}\n value={inputValue}\n onKeyDown={onInputKeyDown}\n onChange={onInputChange}\n // TODO Ожидается, что клик поймает нативный select, но его перехватывает Input. К сожалению, это приводит к конфликтам типизации.\n // TODO Нужно перестать пытаться превратить CustomSelect в select. Тогда эта проблема уйдёт.\n // @ts-expect-error: TS2322 MouseEventHandler<HTMLSelectElement> !== MouseEventHandler<HTMLInputElement>\n onClick={props.onClick}\n before={before}\n after={afterIcons}\n mode={getFormFieldModeFromSelectType(selectType)}\n />\n ) : (\n <SelectMimicry\n {...restProps}\n aria-hidden\n onClick={onClick}\n onKeyDown={handleKeyDownSelect}\n onKeyUp={handleKeyUp}\n onFocus={onFocus}\n onBlur={onBlur}\n className={openedClassNames}\n before={before}\n after={afterIcons}\n selectType={selectType}\n >\n {selected?.label}\n </SelectMimicry>\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 >\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={popupDirection}\n scrollBoxRef={setScrollBoxRef}\n onPlacementChange={setPopperPlacement}\n onMouseLeave={resetFocusedOption}\n fetching={fetching}\n offsetDistance={dropdownOffsetDistance}\n sameWidth={fixDropdownWidth}\n forcePortal={forceDropdownPortal}\n autoHideScrollbar={autoHideScrollbar}\n autoHideScrollbarDelay={autoHideScrollbarDelay}\n >\n {resolvedContent}\n </CustomSelectDropdown>\n )}\n </label>\n );\n}\n"],"names":["React","classNames","useAdaptivity","useExternRef","SizeType","defaultFilterFn","getFormFieldModeFromSelectType","useIsomorphicLayoutEffect","debounce","getTitleFromChildren","warnOnce","CustomSelectDropdown","CustomSelectOption","DropdownIcon","Input","SelectMimicry","Footnote","CustomSelectClearButton","styles","sizeYClassNames","none","COMPACT","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","defaultOptions","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","fixDropdownWidth","restProps","process","env","NODE_ENV","sizeY","containerRef","useRef","handleRootRef","scrollBoxRef","selectElRef","focusedOptionIndex","setFocusedOptionIndex","isControlledOutside","setIsControlledOutside","undefined","setInputValue","nativeSelectValue","setNativeSelectValue","defaultValue","keyboardInput","setKeyboardInput","popperPlacement","setPopperPlacement","setOptions","selectedOptionIndex","setSelectedOptionIndex","useEffect","some","event","Event","bubbles","current","dispatchEvent","selected","useMemo","openedClassNames","includes","resetKeyboardInput","useCallback","scrollToElement","index","center","dropdown","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","isValidIndex","focusOptionByIndex","scrollTo","areOptionsShown","setScrollBoxRef","ref","onKeyboardInput","key","fullInput","optionIndex","label","toLowerCase","close","selectFocused","open","onBlur","resetFocusedOption","onFocus","onClick","handleKeyUp","focusOption","type","nextIndex","beforeIndex","updateOptionsAndSelectedOptionIndex","onLabelClick","contains","target","onNativeSelectChange","newSelectedOptionIndex","currentTarget","onInputKeyDown","handleKeyDownSelect","handleOptionClick","Array","prototype","indexOf","call","parentNode","handleOptionHover","hovered","Fragment","onMouseDown","onMouseOver","resolvedContent","defaultDropdownContent","clearButtonShown","clearButton","afterIcons","REGULAR","autoFocus","onKeyDown","after","mode","aria-hidden","onKeyUp","select","targetRef","placement","onPlacementChange","onMouseLeave","offsetDistance","sameWidth","forcePortal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/CustomSelect/CustomSelect.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { SizeType } from '../../lib/adaptivity';\nimport type { PlacementWithAuto } from '../../lib/floating';\nimport { defaultFilterFn, getFormFieldModeFromSelectType } from '../../lib/select';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { debounce, getTitleFromChildren } from '../../lib/utils';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { TrackerOptionsProps } from '../CustomScrollView/useTrackerVisibility';\nimport { CustomSelectDropdown } from '../CustomSelectDropdown/CustomSelectDropdown';\nimport {\n CustomSelectOption,\n CustomSelectOptionProps,\n} from '../CustomSelectOption/CustomSelectOption';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport { FormFieldProps } from '../FormField/FormField';\nimport { Input } from '../Input/Input';\nimport { NativeSelectProps } from '../NativeSelect/NativeSelect';\nimport { SelectType } from '../Select/Select';\nimport { SelectMimicry } from '../SelectMimicry/SelectMimicry';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { CustomSelectClearButton, CustomSelectClearButtonProps } from './CustomSelectClearButton';\nimport styles from './CustomSelect.module.css';\n\nconst sizeYClassNames = {\n none: styles['CustomSelect--sizeY-none'],\n [SizeType.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 = (options: CustomSelectOptionInterface[]) => {\n if (new Set(options.map((item) => typeof item.value)).size > 1) {\n warn(\n 'Некоторые значения ваших опций имеют разные типы. onChange всегда возвращает строковый тип.',\n 'error',\n );\n }\n};\n\nfunction defaultRenderOptionFn({ option, ...props }: CustomSelectOptionProps): React.ReactNode {\n return <CustomSelectOption {...props} />;\n}\n\nconst handleOptionDown: MouseEventHandler = (e: React.MouseEvent<HTMLElement>) => {\n e.preventDefault();\n};\n\nfunction findSelectedIndex(\n options: CustomSelectOptionInterface[],\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 = (\n options: SelectProps['options'],\n inputValue: string,\n filterFn: SelectProps['filterFn'],\n) => {\n return typeof filterFn === 'function'\n ? options.filter((option) => filterFn(inputValue, option))\n : options;\n};\n\nconst defaultOptions: CustomSelectOptionInterface[] = [];\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 SelectProps extends NativeSelectProps, FormFieldProps, TrackerOptionsProps {\n /**\n * Если `true`, то при клике на селект в нём появится текстовое поле для поиска по `options`. По умолчанию поиск\n * производится по `option.label`.\n */\n searchable?: boolean;\n /**\n * Текст, который будет отображен, если приходит пустой `options`.\n */\n emptyText?: string;\n /**\n * > ⚠️ В v6 из возвращаемых типов будет удалён `CustomSelectOptionInterface[]`. Для кастомной фильтрации используйте\n * > `filterFn`.\n */\n onInputChange?: (\n e: React.ChangeEvent,\n options: CustomSelectOptionInterface[],\n ) => void | CustomSelectOptionInterface[];\n options: CustomSelectOptionInterface[];\n /**\n * Функция для кастомной фильтрации. По умолчанию поиск производится по `option.label`.\n */\n filterFn?:\n | false\n | ((\n value: string,\n option: CustomSelectOptionInterface,\n getOptionLabel?: (option: Partial<CustomSelectOptionInterface>) => string,\n ) => boolean);\n popupDirection?: 'top' | 'bottom';\n /**\n * Рендер-проп для кастомного рендера опции.\n * В объекте аргумента приходят [свойства опции](https://vkcom.github.io/VKUI/#/CustomSelectOption?id=props)\n */\n renderOption?: (props: CustomSelectOptionProps) => 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 dropdownOffsetDistance?: number;\n fixDropdownWidth?: boolean;\n forceDropdownPortal?: boolean;\n selectType?: SelectType;\n}\n\ntype MouseEventHandler = (event: React.MouseEvent<HTMLElement>) => void;\n\n/**\n * @see https://vkcom.github.io/VKUI/#/CustomSelect\n */\nexport function CustomSelect(props: SelectProps) {\n const [opened, setOpened] = React.useState(false);\n const {\n before,\n name,\n className,\n getRef,\n getRootRef,\n popupDirection,\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 = defaultOptions,\n emptyText = 'Ничего не найдено',\n filterFn = defaultFilterFn,\n icon: iconProp,\n ClearButton = CustomSelectClearButton,\n allowClearButton = false,\n dropdownOffsetDistance = 0,\n fixDropdownWidth = true,\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<HTMLLabelElement>(null);\n const handleRootRef = useExternRef(containerRef, getRootRef);\n const scrollBoxRef = React.useRef<HTMLDivElement | null>(null);\n const selectElRef = useExternRef(getRef);\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 ?? props.defaultValue ?? (allowClearButton ? '' : undefined),\n );\n const [keyboardInput, setKeyboardInput] = React.useState('');\n const [popperPlacement, setPopperPlacement] = React.useState<PlacementWithAuto | undefined>(\n undefined,\n );\n const [options, setOptions] = React.useState(optionsProp);\n const [selectedOptionIndex, setSelectedOptionIndex] = React.useState<number | undefined>(\n findSelectedIndex(optionsProp, props.value ?? props.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 classNames(\n opened &&\n dropdownOffsetDistance === 0 &&\n (popperPlacement?.includes('top')\n ? styles['CustomSelect--pop-up']\n : styles['CustomSelect--pop-down']),\n ),\n [dropdownOffsetDistance, opened, popperPlacement],\n );\n\n const resetKeyboardInput = React.useCallback(() => {\n setKeyboardInput('');\n }, []);\n\n const scrollToElement = React.useCallback((index: number, center = false) => {\n const dropdown = scrollBoxRef.current;\n const item = dropdown ? (dropdown.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 isValidIndex = React.useCallback(\n (index: number) => {\n return index >= 0 && index < (options.length ?? 0);\n },\n [options.length],\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 // Это оптимизация, прежде всего, под `onMouseOver`\n setFocusedOptionIndex((focusedOptionIndex) =>\n focusedOptionIndex !== index ? index : focusedOptionIndex,\n );\n },\n [options, scrollToElement],\n );\n\n const areOptionsShown = React.useCallback(() => {\n return scrollBoxRef.current !== null;\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 onKeyboardInput = React.useCallback(\n (key: string) => {\n const fullInput = keyboardInput + key;\n\n const optionIndex = options.findIndex((option) => {\n return getTitleFromChildren(option.label).toLowerCase().includes(fullInput);\n });\n\n if (optionIndex !== undefined && optionIndex > -1) {\n focusOptionByIndex(optionIndex);\n }\n\n setKeyboardInput(fullInput);\n },\n [focusOptionByIndex, keyboardInput, options],\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 setFocusedOptionIndex(-1);\n onClose?.();\n }, [onClose, resetKeyboardInput]);\n\n const selectFocused = React.useCallback(() => {\n if (focusedOptionIndex !== undefined && isValidIndex(focusedOptionIndex)) {\n const item = options[focusedOptionIndex];\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 }, [\n close,\n focusedOptionIndex,\n isValidIndex,\n options,\n selectElRef,\n isControlledOutside,\n props.value,\n nativeSelectValue,\n ]);\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('blur');\n selectElRef.current?.dispatchEvent(event);\n }, [close, selectElRef]);\n\n const resetFocusedOption = React.useCallback(() => {\n setFocusedOptionIndex(-1);\n }, []);\n\n const onFocus = React.useCallback(() => {\n const event = new Event('focus');\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 ?? props.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 props.defaultValue,\n props.value,\n searchable,\n allowClearButton,\n ],\n );\n\n /**\n * Нужен для правильного поведения обработчика onClick на select. Фильтрует клики, которые были сделаны по\n * выпадающему списку.\n */\n const onLabelClick = React.useCallback((e: React.MouseEvent<HTMLLabelElement>) => {\n if (scrollBoxRef.current?.contains(e.target as Node)) {\n e.preventDefault();\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 onInputKeyDown: React.KeyboardEventHandler<HTMLInputElement> = React.useCallback(\n (event) => {\n ['ArrowUp', 'ArrowDown', 'Escape', 'Enter'].includes(event.key) &&\n areOptionsShown() &&\n event.preventDefault();\n\n switch (event.key) {\n case 'ArrowUp':\n areOptionsShown() && focusOption('prev');\n break;\n case 'ArrowDown':\n areOptionsShown() && focusOption('next');\n break;\n case 'Escape':\n close();\n break;\n case 'Enter':\n areOptionsShown() && selectFocused();\n break;\n }\n },\n [areOptionsShown, close, focusOption, selectFocused],\n );\n\n const onInputChange: React.ChangeEventHandler<HTMLInputElement> = React.useCallback(\n (e) => {\n // TODO [>=6]: удалить `onInputChangeProp`.\n if (onInputChangeProp) {\n const options = onInputChangeProp(e, optionsProp);\n if (options) {\n if (process.env.NODE_ENV === 'development') {\n warn(\n 'Этот метод фильтрации устарел. Возвращаемое значение onInputChange будет ' +\n 'проигнорировано в v6.0.0. Для фильтрации обновляйте props.options самостоятельно или используйте свойство filterFn.',\n );\n }\n setOptions(options);\n setSelectedOptionIndex(findSelectedIndex(options, nativeSelectValue, allowClearButton));\n }\n } else {\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 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 'Enter':\n case 'Spacebar':\n case ' ':\n if (opened) {\n areOptionsShown() && selectFocused();\n } else {\n open();\n }\n break;\n }\n },\n [areOptionsShown, close, focusOption, onKeyboardInput, open, opened, selectFocused],\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 selectFocused();\n }\n },\n [options, selectFocused],\n );\n\n const handleOptionHover = React.useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n focusOptionByIndex(\n Array.prototype.indexOf.call(e.currentTarget.parentNode?.children, e.currentTarget),\n false,\n );\n },\n [focusOptionByIndex],\n );\n\n const renderOption = React.useCallback(\n (option: CustomSelectOptionInterface, index: number) => {\n const hovered = index === focusedOptionIndex;\n const selected = index === selectedOptionIndex;\n\n return (\n <React.Fragment key={`${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 // Используем `onMouseOver` вместо `onMouseEnter`.\n // При параметре `searchable`, обновляется \"ребёнок\", из-за чего `onMouseEnter` не срабатывает в следующих кейсах:\n // 1. До загрузки выпадающего списка, курсор мышки находится над произвольным элементом этого списка.\n // > Лечение: только увод курсора мыши и возвращении его обратно вызывает событие `onMouseEnter` на этот элемент.\n // 2. Если это тач-устройство.\n // > Лечение: нужно нажать на какой-нибудь произвольный элемент списка, после чего `onMouseEnter` будет работать на соседние элементы,\n // но не на тот, на который нажали в первый раз.\n // Более подробно по ссылке https://github.com/facebook/react/issues/13956#issuecomment-1082055744\n onMouseOver: handleOptionHover,\n })}\n </React.Fragment>\n );\n },\n [\n focusedOptionIndex,\n handleOptionClick,\n handleOptionHover,\n renderOptionProp,\n selectedOptionIndex,\n ],\n );\n\n const resolvedContent = React.useMemo(() => {\n const defaultDropdownContent =\n options?.length > 0 ? (\n options.map(renderOption)\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 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={() => setNativeSelectValue('')}\n />\n );\n }, [clearButtonShown, ClearButton, iconProp]);\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 return (\n <label\n className={classNames(\n styles['CustomSelect'],\n sizeY !== SizeType.REGULAR && sizeYClassNames[sizeY],\n className,\n )}\n style={style}\n ref={handleRootRef}\n onClick={onLabelClick}\n >\n {opened && searchable ? (\n <Input\n {...restProps}\n autoFocus\n onBlur={onBlur}\n className={openedClassNames}\n value={inputValue}\n onKeyDown={onInputKeyDown}\n onChange={onInputChange}\n // TODO Ожидается, что клик поймает нативный select, но его перехватывает Input. К сожалению, это приводит к конфликтам типизации.\n // TODO Нужно перестать пытаться превратить CustomSelect в select. Тогда эта проблема уйдёт.\n // @ts-expect-error: TS2322 MouseEventHandler<HTMLSelectElement> !== MouseEventHandler<HTMLInputElement>\n onClick={props.onClick}\n before={before}\n after={afterIcons}\n mode={getFormFieldModeFromSelectType(selectType)}\n />\n ) : (\n <SelectMimicry\n {...restProps}\n aria-hidden\n onClick={onClick}\n onKeyDown={handleKeyDownSelect}\n onKeyUp={handleKeyUp}\n onFocus={onFocus}\n onBlur={onBlur}\n className={openedClassNames}\n before={before}\n after={afterIcons}\n selectType={selectType}\n >\n {selected?.label}\n </SelectMimicry>\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 >\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={popupDirection}\n scrollBoxRef={setScrollBoxRef}\n onPlacementChange={setPopperPlacement}\n onMouseLeave={resetFocusedOption}\n fetching={fetching}\n offsetDistance={dropdownOffsetDistance}\n sameWidth={fixDropdownWidth}\n forcePortal={forceDropdownPortal}\n autoHideScrollbar={autoHideScrollbar}\n autoHideScrollbarDelay={autoHideScrollbarDelay}\n >\n {resolvedContent}\n </CustomSelectDropdown>\n )}\n </label>\n );\n}\n"],"names":["React","classNames","useAdaptivity","useExternRef","SizeType","defaultFilterFn","getFormFieldModeFromSelectType","useIsomorphicLayoutEffect","debounce","getTitleFromChildren","warnOnce","CustomSelectDropdown","CustomSelectOption","DropdownIcon","Input","SelectMimicry","Footnote","CustomSelectClearButton","styles","sizeYClassNames","none","COMPACT","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","defaultOptions","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","fixDropdownWidth","restProps","process","env","NODE_ENV","sizeY","containerRef","useRef","handleRootRef","scrollBoxRef","selectElRef","focusedOptionIndex","setFocusedOptionIndex","isControlledOutside","setIsControlledOutside","undefined","setInputValue","nativeSelectValue","setNativeSelectValue","defaultValue","keyboardInput","setKeyboardInput","popperPlacement","setPopperPlacement","setOptions","selectedOptionIndex","setSelectedOptionIndex","useEffect","some","event","Event","bubbles","current","dispatchEvent","selected","useMemo","openedClassNames","includes","resetKeyboardInput","useCallback","scrollToElement","index","center","dropdown","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","isValidIndex","focusOptionByIndex","scrollTo","areOptionsShown","setScrollBoxRef","ref","onKeyboardInput","key","fullInput","optionIndex","label","toLowerCase","close","selectFocused","shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync","open","onBlur","resetFocusedOption","onFocus","onClick","handleKeyUp","focusOption","type","nextIndex","beforeIndex","updateOptionsAndSelectedOptionIndex","onLabelClick","contains","target","onNativeSelectChange","newSelectedOptionIndex","currentTarget","onInputKeyDown","handleKeyDownSelect","handleOptionClick","Array","prototype","indexOf","call","parentNode","handleOptionHover","hovered","Fragment","onMouseDown","onMouseOver","resolvedContent","defaultDropdownContent","controlledValueSet","uncontrolledValueSet","clearButtonShown","clearButton","afterIcons","REGULAR","autoFocus","onKeyDown","after","mode","aria-hidden","onKeyUp","select","targetRef","placement","onPlacementChange","onMouseLeave","offsetDistance","sameWidth","forcePortal"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,YAAY,QAAQ,2BAA2B;AACxD,SAASC,QAAQ,QAAQ,uBAAuB;AAEhD,SAASC,eAAe,EAAEC,8BAA8B,QAAQ,mBAAmB;AACnF,SAASC,yBAAyB,QAAQ,sCAAsC;AAChF,SAASC,QAAQ,EAAEC,oBAAoB,QAAQ,kBAAkB;AACjE,SAASC,QAAQ,QAAQ,qBAAqB;AAE9C,SAASC,oBAAoB,QAAQ,+CAA+C;AACpF,SACEC,kBAAkB,QAEb,2CAA2C;AAClD,SAASC,YAAY,QAAQ,+BAA+B;AAE5D,SAASC,KAAK,QAAQ,iBAAiB;AAGvC,SAASC,aAAa,QAAQ,iCAAiC;AAC/D,SAASC,QAAQ,QAAQ,kCAAkC;AAC3D,SAASC,uBAAuB,QAAsC,4BAA4B;AAClG,OAAOC,YAAY,4BAA4B;AAE/C,MAAMC,kBAAkB;IACtBC,MAAMF,MAAM,CAAC,2BAA2B;IACxC,CAACd,SAASiB,OAAO,CAAC,EAAEH,MAAM,CAAC,8BAA8B;AAC3D;AAEA,MAAMI,iBAAiB,CAACC,UAAyC,EAAE,EAAEC,aAAa,CAAC,CAAC,GAAK;IACvF,IAAIA,cAAcD,QAAQE,MAAM,GAAG,GAAG;QACpC,OAAO,CAAC;IACV,CAAC;IACD,OAAOF,QAAQG,SAAS,CAAC,CAACC,QAAQC,IAAMA,IAAIJ,cAAc,CAACG,OAAOE,QAAQ;AAC5E;AAEA,MAAMC,kBAAkB,CACtBP,UAAyC,EAAE,EAC3CQ,WAAmBR,QAAQE,MAAM,GAC9B;IACH,IAAIO,SAAS,CAAC;IACd,IAAID,YAAY,GAAG;QACjB,OAAOC;IACT,CAAC;IACD,IAAK,IAAIJ,IAAIG,WAAW,GAAGH,KAAK,GAAGA,IAAK;QACtC,IAAID,SAASJ,OAAO,CAACK,EAAE;QAEvB,IAAI,CAACD,OAAOE,QAAQ,EAAE;YACpBG,SAASJ;YACT,KAAM;QACR,CAAC;IACH;IACA,OAAOI;AACT;AAEA,MAAMC,OAAOvB,SAAS;AAEtB,MAAMwB,wBAAwB,CAACX,UAA2C;IACxE,IAAI,IAAIY,IAAIZ,QAAQa,GAAG,CAAC,CAACC,OAAS,OAAOA,KAAKC,KAAK,GAAGC,IAAI,GAAG,GAAG;QAC9DN,KACE,+FACA;IAEJ,CAAC;AACH;AAEA,SAASO,sBAAsB,EAAEb,OAAM,EAAE,GAAGc,OAAgC,EAAmB;IAC7F,qBAAO,oBAAC7B,oBAAuB6B;AACjC;AAEA,MAAMC,mBAAsC,CAACC,IAAqC;IAChFA,EAAEC,cAAc;AAClB;AAEA,SAASC,kBACPtB,OAAsC,EACtCe,KAAkB,EAClBQ,SAAkB,EAClB;IACA,IAAIA,aAAaR,UAAU,IAAI;QAC7B,OAAO,CAAC;IACV,CAAC;IACD,OACEf,QAAQG,SAAS,CAAC,CAACW,OAAS;QAC1BC,QAAQ,OAAOD,KAAKC,KAAK,KAAK,WAAWS,OAAOT,SAASA,KAAK;QAC9D,OAAOD,KAAKC,KAAK,KAAKA;IACxB,MAAM,CAAC;AAEX;AAEA,MAAMU,SAAS,CACbzB,SACA0B,YACAC,WACG;IACH,OAAO,OAAOA,aAAa,aACvB3B,QAAQyB,MAAM,CAAC,CAACrB,SAAWuB,SAASD,YAAYtB,WAChDJ,OAAO;AACb;AAEA,MAAM4B,iBAAgD,EAAE;AAmFxD;;CAEC,GACD,OAAO,SAASC,aAAaX,KAAkB,EAAE;IAC/C,MAAM,CAACY,QAAQC,UAAU,GAAGtD,MAAMuD,QAAQ,CAAC,KAAK;IAChD,MAAM,EACJC,OAAM,EACNC,KAAI,EACJC,UAAS,EACTC,OAAM,EACNC,WAAU,EACVC,eAAc,EACdC,MAAK,EACLC,SAAQ,EACRC,SAAQ,EACRC,eAAeC,kBAAiB,EAChCC,eAAc,EACdC,OAAM,EACNC,QAAO,EACPC,SAAQ,EACRC,oBAAmB,EACnBC,YAAa,UAAS,EACtBC,kBAAiB,EACjBC,uBAAsB,EACtBC,YAAa,KAAK,CAAA,EAClBC,cAAcC,mBAAmBrC,qBAAqB,CAAA,EACtDjB,SAASuD,cAAc3B,cAAc,CAAA,EACrC4B,WAAY,oBAAmB,EAC/B7B,UAAW7C,gBAAe,EAC1B2E,MAAMC,SAAQ,EACdC,aAAcjE,wBAAuB,EACrCkE,kBAAmB,KAAK,CAAA,EACxBC,wBAAyB,EAAC,EAC1BC,kBAAmB,IAAI,CAAA,EACvB,GAAGC,WACJ,GAAG7C;IAEJ,IAAI8C,QAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;QAC1CvD,sBAAsB4C;IACxB,CAAC;IAED,MAAM,EAAEY,OAAQ,OAAM,EAAE,GAAGxF;IAE3B,MAAMyF,eAAe3F,MAAM4F,MAAM,CAAmB,IAAI;IACxD,MAAMC,gBAAgB1F,aAAawF,cAAc/B;IACjD,MAAMkC,eAAe9F,MAAM4F,MAAM,CAAwB,IAAI;IAC7D,MAAMG,cAAc5F,aAAawD;IAEjC,MAAM,CAACqC,oBAAoBC,sBAAsB,GAAGjG,MAAMuD,QAAQ,CAAqB,CAAC;IACxF,MAAM,CAAC2C,qBAAqBC,uBAAuB,GAAGnG,MAAMuD,QAAQ,CAACd,MAAMH,KAAK,KAAK8D;IACrF,MAAM,CAACnD,YAAYoD,cAAc,GAAGrG,MAAMuD,QAAQ,CAAC;IACnD,MAAM,CAAC+C,mBAAmBC,qBAAqB,GAAGvG,MAAMuD,QAAQ,CAC9D,IAAMd,MAAMH,KAAK,IAAIG,MAAM+D,YAAY,IAAKrB,CAAAA,mBAAmB,KAAKiB,SAAS,AAAD;IAE9E,MAAM,CAACK,eAAeC,iBAAiB,GAAG1G,MAAMuD,QAAQ,CAAC;IACzD,MAAM,CAACoD,iBAAiBC,mBAAmB,GAAG5G,MAAMuD,QAAQ,CAC1D6C;IAEF,MAAM,CAAC7E,SAASsF,WAAW,GAAG7G,MAAMuD,QAAQ,CAACuB;IAC7C,MAAM,CAACgC,qBAAqBC,uBAAuB,GAAG/G,MAAMuD,QAAQ,CAClEV,kBAAkBiC,aAAarC,MAAMH,KAAK,IAAIG,MAAM+D,YAAY,EAAErB;IAGpEnF,MAAMgH,SAAS,CAAC,IAAM;QACpBb,uBAAuB1D,MAAMH,KAAK,KAAK8D;QACvCG,qBAAqB,CAACD,oBAAsB7D,MAAMH,KAAK,IAAIgE;IAC7D,GAAG;QAAC7D,MAAMH,KAAK;KAAC;IAEhB/B,0BAA0B,IAAM;QAC9B,IACEgB,QAAQ0F,IAAI,CAAC,CAAC,EAAE3E,MAAK,EAAE,GAAKgE,sBAAsBhE,UACjD6C,oBAAoBmB,sBAAsB,IAC3C;YACA,MAAMY,QAAQ,IAAIC,MAAM,UAAU;gBAAEC,SAAS,IAAI;YAAC;YAElDrB,YAAYsB,OAAO,EAAEC,cAAcJ;QACrC,CAAC;IACH,GAAG;QAACZ;KAAkB;IAEtB,MAAMiB,WAAWvH,MAAMwH,OAAO,CAAC,IAAM;QACnC,IAAI,CAACjG,QAAQE,MAAM,EAAE;YACnB,OAAO,IAAI;QACb,CAAC;QAED,OAAOqF,wBAAwBV,YAAY7E,OAAO,CAACuF,oBAAoB,GAAGV,SAAS;IACrF,GAAG;QAAC7E;QAASuF;KAAoB;IAEjC,MAAMW,mBAAmBzH,MAAMwH,OAAO,CACpC,IACEvH,WACEoD,UACE+B,2BAA2B,KAC1BuB,CAAAA,iBAAiBe,SAAS,SACvBxG,MAAM,CAAC,uBAAuB,GAC9BA,MAAM,CAAC,yBAAyB,AAAD,IAEzC;QAACkE;QAAwB/B;QAAQsD;KAAgB;IAGnD,MAAMgB,qBAAqB3H,MAAM4H,WAAW,CAAC,IAAM;QACjDlB,iBAAiB;IACnB,GAAG,EAAE;IAEL,MAAMmB,kBAAkB7H,MAAM4H,WAAW,CAAC,CAACE,OAAeC,SAAS,KAAK,GAAK;QAC3E,MAAMC,WAAWlC,aAAauB,OAAO;QACrC,MAAMhF,OAAO2F,WAAYA,SAAShE,QAAQ,CAAC8D,MAAM,GAAmB,IAAI;QAExE,IAAI,CAACzF,QAAQ,CAAC2F,UAAU;YACtB;QACF,CAAC;QAED,MAAMC,iBAAiBD,SAASE,YAAY;QAC5C,MAAMC,YAAYH,SAASG,SAAS;QACpC,MAAMC,UAAU/F,KAAKgG,SAAS;QAC9B,MAAMC,aAAajG,KAAK6F,YAAY;QAEpC,IAAIH,QAAQ;YACVC,SAASG,SAAS,GAAGC,UAAUH,iBAAiB,IAAIK,aAAa;QACnE,OAAO,IAAIF,UAAUE,aAAaL,iBAAiBE,WAAW;YAC5DH,SAASG,SAAS,GAAGC,UAAUH,iBAAiBK;QAClD,OAAO,IAAIF,UAAUD,WAAW;YAC9BH,SAASG,SAAS,GAAGC;QACvB,CAAC;IACH,GAAG,EAAE;IAEL,MAAMG,eAAevI,MAAM4H,WAAW,CACpC,CAACE,QAAkB;QACjB,OAAOA,SAAS,KAAKA,QAASvG,CAAAA,QAAQE,MAAM,IAAI,CAAA;IAClD,GACA;QAACF,QAAQE,MAAM;KAAC;IAGlB,MAAM+G,qBAAqBxI,MAAM4H,WAAW,CAC1C,CAACE,OAA2BW,WAAW,IAAI,GAAK;QAC9C,IAAIX,UAAU1B,aAAa0B,QAAQ,KAAKA,QAAQ,AAACvG,CAAAA,QAAQE,MAAM,IAAI,CAAA,IAAK,GAAG;YACzE;QACF,CAAC;QAED,MAAME,SAASJ,OAAO,CAACuG,MAAM;QAE7B,IAAInG,QAAQE,UAAU;YACpB;QACF,CAAC;QAED,IAAI4G,UAAU;YACZZ,gBAAgBC;QAClB,CAAC;QAED,mDAAmD;QACnD7B,sBAAsB,CAACD,qBACrBA,uBAAuB8B,QAAQA,QAAQ9B,kBAAkB;IAE7D,GACA;QAACzE;QAASsG;KAAgB;IAG5B,MAAMa,kBAAkB1I,MAAM4H,WAAW,CAAC,IAAM;QAC9C,OAAO9B,aAAauB,OAAO,KAAK,IAAI;IACtC,GAAG,EAAE;IAEL,MAAMsB,kBAAkB3I,MAAM4H,WAAW,CACvC,CAACgB,MAA+B;QAC9B9C,aAAauB,OAAO,GAAGuB;QAEvB,IAAIA,OAAO9B,wBAAwBV,aAAamC,aAAazB,sBAAsB;YACjF;gBACEe,gBAAgBf,qBAAqB,IAAI;YAC3C;QACF,CAAC;IACH,GACA;QAACyB;QAAcV;QAAiBf;KAAoB;IAGtD,MAAM+B,kBAAkB7I,MAAM4H,WAAW,CACvC,CAACkB,MAAgB;QACf,MAAMC,YAAYtC,gBAAgBqC;QAElC,MAAME,cAAczH,QAAQG,SAAS,CAAC,CAACC,SAAW;YAChD,OAAOlB,qBAAqBkB,OAAOsH,KAAK,EAAEC,WAAW,GAAGxB,QAAQ,CAACqB;QACnE;QAEA,IAAIC,gBAAgB5C,aAAa4C,cAAc,CAAC,GAAG;YACjDR,mBAAmBQ;QACrB,CAAC;QAEDtC,iBAAiBqC;IACnB,GACA;QAACP;QAAoB/B;QAAelF;KAAQ;IAG9C;;;GAGC,GACD,MAAM4H,QAAQnJ,MAAM4H,WAAW,CAAC,IAAM;QACpCD;QAEAtB,cAAc;QACd/C,UAAU,KAAK;QACf2C,sBAAsB,CAAC;QACvB5B;IACF,GAAG;QAACA;QAASsD;KAAmB;IAEhC,MAAMyB,gBAAgBpJ,MAAM4H,WAAW,CAAC,IAAM;QAC5C,IAAI5B,uBAAuBI,aAAamC,aAAavC,qBAAqB;YACxE,MAAM3D,OAAOd,OAAO,CAACyE,mBAAmB;YAExCO,qBAAqBlE,MAAMC;YAC3B6G;YAEA,MAAME,8DACJnD,uBACAzD,MAAMH,KAAK,KAAKgE,qBAChBA,sBAAsBjE,MAAMC;YAE9B,IAAI+G,6DAA6D;gBAC/D,MAAMnC,QAAQ,IAAIC,MAAM,UAAU;oBAAEC,SAAS,IAAI;gBAAC;gBAClDrB,YAAYsB,OAAO,EAAEC,cAAcJ;YACrC,CAAC;QACH,CAAC;IACH,GAAG;QACDiC;QACAnD;QACAuC;QACAhH;QACAwE;QACAG;QACAzD,MAAMH,KAAK;QACXgE;KACD;IAED,MAAMgD,OAAOtJ,MAAM4H,WAAW,CAAC,IAAM;QACnCtE,UAAU,IAAI;QACd2C,sBAAsBa;QAEtB,IAAI,OAAO1C,WAAW,YAAY;YAChCA;QACF,CAAC;IACH,GAAG;QAACA;QAAQ0C;KAAoB;IAEhC,MAAMyC,SAASvJ,MAAM4H,WAAW,CAAC,IAAM;QACrCuB;QACA,MAAMjC,QAAQ,IAAIC,MAAM;QACxBpB,YAAYsB,OAAO,EAAEC,cAAcJ;IACrC,GAAG;QAACiC;QAAOpD;KAAY;IAEvB,MAAMyD,qBAAqBxJ,MAAM4H,WAAW,CAAC,IAAM;QACjD3B,sBAAsB,CAAC;IACzB,GAAG,EAAE;IAEL,MAAMwD,UAAUzJ,MAAM4H,WAAW,CAAC,IAAM;QACtC,MAAMV,QAAQ,IAAIC,MAAM;QACxBpB,YAAYsB,OAAO,EAAEC,cAAcJ;IACrC,GAAG;QAACnB;KAAY;IAEhB,MAAM2D,UAAU1J,MAAM4H,WAAW,CAAC,IAAM;QACtC,IAAIvE,QAAQ;YACV8F;QACF,OAAO;YACLG;QACF,CAAC;IACH,GAAG;QAACH;QAAOG;QAAMjG;KAAO;IAExB,MAAMsG,cAAc3J,MAAMwH,OAAO,CAAC,IAAMhH,SAASmH,oBAAoB,OAAO;QAACA;KAAmB;IAEhG,MAAMiC,cAAc5J,MAAM4H,WAAW,CACnC,CAACiC,OAA0B;QACzB,IAAI/B,QAAQ9B;QAEZ,IAAI6D,SAAS,QAAQ;YACnB,MAAMC,YAAYxI,eAAeC,SAASuG;YAC1CA,QAAQgC,cAAc,CAAC,IAAIxI,eAAeC,WAAWuI,SAAS,EAAE,kDAAkD;QACpH,OAAO,IAAID,SAAS,QAAQ;YAC1B,MAAME,cAAcjI,gBAAgBP,SAASuG;YAC7CA,QAAQiC,gBAAgB,CAAC,IAAIjI,gBAAgBP,WAAWwI,WAAW,EAAE,0DAA0D;QACjI,CAAC;QAEDvB,mBAAmBV;IACrB,GACA;QAACU;QAAoBxC;QAAoBzE;KAAQ;IAGnDvB,MAAMgH,SAAS,CACb,SAASgD,sCAAsC;QAC7C,MAAM1H,QAAQG,MAAMH,KAAK,IAAIgE,qBAAqB7D,MAAM+D,YAAY;QAEpE,MAAMjF,UACJoD,cAAc1B,eAAemD,YACzBpD,OAAO8B,aAAa7B,YAAYC,YAChC4B,WAAW;QAEjB+B,WAAWtF;QACXwF,uBAAuBlE,kBAAkBtB,SAASe,OAAO6C;IAC3D,GACA;QACEjC;QACAD;QACAqD;QACAxB;QACArC,MAAM+D,YAAY;QAClB/D,MAAMH,KAAK;QACXqC;QACAQ;KACD;IAGH;;;GAGC,GACD,MAAM8E,eAAejK,MAAM4H,WAAW,CAAC,CAACjF,IAA0C;QAChF,IAAImD,aAAauB,OAAO,EAAE6C,SAASvH,EAAEwH,MAAM,GAAW;YACpDxH,EAAEC,cAAc;QAClB,CAAC;IACH,GAAG,EAAE;IAEL,MAAMwH,uBAAoE,CAACzH,IAAM;QAC/E,MAAM0H,yBAAyBxH,kBAC7BtB,SACAoB,EAAE2H,aAAa,CAAChI,KAAK,EACrB6C;QAGF,IAAI2B,wBAAwBuD,wBAAwB;YAClD,IAAI,CAACnE,qBAAqB;gBACxBa,uBAAuBsD;YACzB,CAAC;YACDtG,WAAWpB;QACb,CAAC;IACH;IAEA,MAAM4H,iBAA+DvK,MAAM4H,WAAW,CACpF,CAACV,QAAU;QACT;YAAC;YAAW;YAAa;YAAU;SAAQ,CAACQ,QAAQ,CAACR,MAAM4B,GAAG,KAC5DJ,qBACAxB,MAAMtE,cAAc;QAEtB,OAAQsE,MAAM4B,GAAG;YACf,KAAK;gBACHJ,qBAAqBkB,YAAY;gBACjC,KAAM;YACR,KAAK;gBACHlB,qBAAqBkB,YAAY;gBACjC,KAAM;YACR,KAAK;gBACHT;gBACA,KAAM;YACR,KAAK;gBACHT,qBAAqBU;gBACrB,KAAM;QACV;IACF,GACA;QAACV;QAAiBS;QAAOS;QAAaR;KAAc;IAGtD,MAAMnF,gBAA4DjE,MAAM4H,WAAW,CACjF,CAACjF,IAAM;QACL,2CAA2C;QAC3C,IAAIuB,mBAAmB;YACrB,MAAM3C,UAAU2C,kBAAkBvB,GAAGmC;YACrC,IAAIvD,SAAS;gBACX,IAAIgE,QAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;oBAC1CxD,KACE,8EACE;gBAEN,CAAC;gBACD4E,WAAWtF;gBACXwF,uBAAuBlE,kBAAkBtB,SAAS+E,mBAAmBnB;YACvE,CAAC;QACH,OAAO;YACL,MAAM5D,UAAUyB,OAAO8B,aAAanC,EAAEwH,MAAM,CAAC7H,KAAK,EAAEY;YACpD2D,WAAWtF;YACXwF,uBAAuBlE,kBAAkBtB,SAAS+E,mBAAmBnB;QACvE,CAAC;QACDkB,cAAc1D,EAAEwH,MAAM,CAAC7H,KAAK;IAC9B,GACA;QAACY;QAAUoD;QAAmBpC;QAAmBY;QAAaK;KAAiB;IAGjF,MAAMqF,sBAAsBxK,MAAM4H,WAAW,CAC3C,CAACV,QAA+B;QAC9B,IAAIA,MAAM4B,GAAG,CAACrH,MAAM,KAAK,KAAKyF,MAAM4B,GAAG,KAAK,KAAK;YAC/CD,gBAAgB3B,MAAM4B,GAAG;YACzB;QACF,CAAC;QAED;YAAC;YAAW;YAAa;YAAU;SAAQ,CAACpB,QAAQ,CAACR,MAAM4B,GAAG,KAC5DJ,qBACAxB,MAAMtE,cAAc;QAEtB,OAAQsE,MAAM4B,GAAG;YACf,KAAK;gBACH,IAAIzF,QAAQ;oBACVqF,qBAAqBkB,YAAY;gBACnC,OAAO;oBACLN;gBACF,CAAC;gBACD,KAAM;YACR,KAAK;gBACH,IAAIjG,QAAQ;oBACVqF,qBAAqBkB,YAAY;gBACnC,OAAO;oBACLN;gBACF,CAAC;gBACD,KAAM;YACR,KAAK;gBACHH;gBACA,KAAM;YACR,KAAK;YACL,KAAK;YACL,KAAK;gBACH,IAAI9F,QAAQ;oBACVqF,qBAAqBU;gBACvB,OAAO;oBACLE;gBACF,CAAC;gBACD,KAAM;QACV;IACF,GACA;QAACZ;QAAiBS;QAAOS;QAAaf;QAAiBS;QAAMjG;QAAQ+F;KAAc;IAGrF,MAAMqB,oBAAoBzK,MAAM4H,WAAW,CACzC,CAACjF,IAAqC;QACpC,MAAMmF,QAAQ4C,MAAMC,SAAS,CAACC,OAAO,CAACC,IAAI,CACxClI,EAAE2H,aAAa,CAACQ,UAAU,EAAE9G,UAC5BrB,EAAE2H,aAAa;QAEjB,MAAM3I,SAASJ,OAAO,CAACuG,MAAM;QAE7B,IAAInG,UAAU,CAACA,OAAOE,QAAQ,EAAE;YAC9BuH;QACF,CAAC;IACH,GACA;QAAC7H;QAAS6H;KAAc;IAG1B,MAAM2B,oBAAoB/K,MAAM4H,WAAW,CACzC,CAACjF,IAAqC;QACpC6F,mBACEkC,MAAMC,SAAS,CAACC,OAAO,CAACC,IAAI,CAAClI,EAAE2H,aAAa,CAACQ,UAAU,EAAE9G,UAAUrB,EAAE2H,aAAa,GAClF,KAAK;IAET,GACA;QAAC9B;KAAmB;IAGtB,MAAM5D,eAAe5E,MAAM4H,WAAW,CACpC,CAACjG,QAAqCmG,QAAkB;QACtD,MAAMkD,UAAUlD,UAAU9B;QAC1B,MAAMuB,WAAWO,UAAUhB;QAE3B,qBACE,oBAAC9G,MAAMiL,QAAQ;YAACnC,KAAK,CAAC,EAAEnH,OAAOW,KAAK,CAAC,CAAC;WACnCuC,iBAAiB;YAChBlD;YACAqJ;YACAhH,UAAUrC,OAAOsH,KAAK;YACtB1B;YACA1F,UAAUF,OAAOE,QAAQ;YACzB6H,SAASe;YACTS,aAAaxI;YACb,kDAAkD;YAClD,kHAAkH;YAClH,sGAAsG;YACtG,qHAAqH;YACrH,+BAA+B;YAC/B,0IAA0I;YAC1I,oDAAoD;YACpD,kGAAkG;YAClGyI,aAAaJ;QACf;IAGN,GACA;QACE/E;QACAyE;QACAM;QACAlG;QACAiC;KACD;IAGH,MAAMsE,kBAAkBpL,MAAMwH,OAAO,CAAC,IAAM;QAC1C,MAAM6D,yBACJ9J,SAASE,SAAS,IAChBF,QAAQa,GAAG,CAACwC,8BAEZ,oBAAC5D;YAAS0C,WAAWxC,MAAM,CAAC,sBAAsB;WAAG6D,UACtD;QAEH,IAAI,OAAOZ,mBAAmB,YAAY;YACxC,OAAOA,eAAe;gBAAEkH;YAAuB;QACjD,OAAO;YACL,OAAOA;QACT,CAAC;IACH,GAAG;QAACtG;QAAWxD;QAAS4C;QAAgBS;KAAa;IAErD,MAAM0G,qBAAqBpF,uBAAuBzD,MAAMH,KAAK,KAAK;IAClE,MAAMiJ,uBAAuB,CAACrF,uBAAuBI,sBAAsB;IAC3E,MAAMkF,mBACJrG,oBAAoB,CAAC9B,UAAWiI,CAAAA,sBAAsBC,oBAAmB;IAE3E,MAAME,cAAczL,MAAMwH,OAAO,CAAC,IAAM;QACtC,IAAI,CAACgE,kBAAkB;YACrB,OAAO,IAAI;QACb,CAAC;QAED,qBACE,oBAACtG;YACCxB,WAAWuB,aAAamB,YAAYlF,MAAM,CAAC,2BAA2B,GAAGkF,SAAS;YAClFsD,SAAS,IAAMnD,qBAAqB;;IAG1C,GAAG;QAACiF;QAAkBtG;QAAaD;KAAS;IAE5C,MAAMD,OAAOhF,MAAMwH,OAAO,CAAC,IAAM;QAC/B,IAAIvC,aAAamB,WAAW;YAC1B,OAAOnB;QACT,CAAC;QAED,qBACE,oBAACpE;YACC6C,WAAW8H,mBAAmBtK,MAAM,CAAC,8BAA8B,GAAGkF,SAAS;YAC/E/C,QAAQA;;IAGd,GAAG;QAACmI;QAAkBvG;QAAU5B;KAAO;IAEvC,MAAMqI,aAAa,AAAC1G,CAAAA,QAAQwG,gBAAe,mBACzC,oBAACxL,MAAMiL,QAAQ,QACZQ,aACAzG;IAIL,qBACE,oBAACiE;QACCvF,WAAWzD,WACTiB,MAAM,CAAC,eAAe,EACtBwE,UAAUtF,SAASuL,OAAO,IAAIxK,eAAe,CAACuE,MAAM,EACpDhC;QAEFI,OAAOA;QACP8E,KAAK/C;QACL6D,SAASO;OAER5G,UAAUsB,2BACT,oBAAC7D;QACE,GAAGwE,SAAS;QACbsG,WAAAA,IAAS;QACTrC,QAAQA;QACR7F,WAAW+D;QACXnF,OAAOW;QACP4I,WAAWtB;QACXxG,UAAUE;QACV,kIAAkI;QAClI,4FAA4F;QAC5F,wGAAwG;QACxGyF,SAASjH,MAAMiH,OAAO;QACtBlG,QAAQA;QACRsI,OAAOJ;QACPK,MAAMzL,+BAA+BkE;uBAGvC,oBAACzD;QACE,GAAGuE,SAAS;QACb0G,eAAAA,IAAW;QACXtC,SAASA;QACTmC,WAAWrB;QACXyB,SAAStC;QACTF,SAASA;QACTF,QAAQA;QACR7F,WAAW+D;QACXjE,QAAQA;QACRsI,OAAOJ;QACPlH,YAAYA;OAEX+C,UAAU0B,MAEd,gBACD,oBAACiD;QACCtD,KAAK7C;QACLtC,MAAMA;QACNM,UAAUqG;QACVb,QAAQ9G,MAAM8G,MAAM;QACpBE,SAAShH,MAAMgH,OAAO;QACtBC,SAASjH,MAAMiH,OAAO;QACtBpH,OAAOgE;QACP0F,eAAAA,IAAW;QACXtI,WAAWxC,MAAM,CAAC,wBAAwB;OAEzCiE,kCAAoB,oBAACxD;QAAOmH,KAAI;QAAGxG,OAAM;QACzCwC,YAAY1C,GAAG,CAAC,CAACC,qBAChB,oBAACV;YAAOmH,KAAK,CAAC,EAAEzG,KAAKC,KAAK,CAAC,CAAC;YAAEA,OAAOD,KAAKC,KAAK;cAGlDe,wBACC,oBAAC1C;QACCwL,WAAWxG;QACXyG,WAAWvI;QACXiC,cAAc6C;QACd0D,mBAAmBzF;QACnB0F,cAAc9C;QACdlF,UAAUA;QACViI,gBAAgBnH;QAChBoH,WAAWnH;QACXoH,aAAalI;QACbE,mBAAmBA;QACnBC,wBAAwBA;OAEvB0G;AAKX,CAAC"}
|
|
@@ -44,4 +44,4 @@ export interface CustomSelectOptionProps extends React.HTMLAttributes<HTMLDivEle
|
|
|
44
44
|
/**
|
|
45
45
|
* @see https://vkcom.github.io/VKUI/#/CustomSelectOption
|
|
46
46
|
*/
|
|
47
|
-
export declare const CustomSelectOption: ({ children, hierarchy, hovered, selected, before, after, option, description, disabled, style: styleProp, className, ...restProps }: CustomSelectOptionProps) => JSX.Element;
|
|
47
|
+
export declare const CustomSelectOption: ({ children, hierarchy, hovered, selected, before, after, option, description, disabled, style: styleProp, className, onClick, ...restProps }: CustomSelectOptionProps) => JSX.Element;
|
|
@@ -14,7 +14,7 @@ const sizeYClassNames = {
|
|
|
14
14
|
const warn = warnOnce('CustomSelectOption');
|
|
15
15
|
/**
|
|
16
16
|
* @see https://vkcom.github.io/VKUI/#/CustomSelectOption
|
|
17
|
-
*/ export const CustomSelectOption = ({ children , hierarchy =0 , hovered , selected , before , after , option , description , disabled , style: styleProp , className , ...restProps })=>{
|
|
17
|
+
*/ export const CustomSelectOption = ({ children , hierarchy =0 , hovered , selected , before , after , option , description , disabled , style: styleProp , className , onClick , ...restProps })=>{
|
|
18
18
|
const title = typeof children === 'string' ? children : undefined;
|
|
19
19
|
const { sizeY ='none' } = useAdaptivity();
|
|
20
20
|
const style = React.useMemo(()=>hierarchy > 0 ? {
|
|
@@ -30,6 +30,7 @@ const warn = warnOnce('CustomSelectOption');
|
|
|
30
30
|
}
|
|
31
31
|
return /*#__PURE__*/ React.createElement(Paragraph, {
|
|
32
32
|
...restProps,
|
|
33
|
+
onClick: disabled ? undefined : onClick,
|
|
33
34
|
Component: "div",
|
|
34
35
|
role: "option",
|
|
35
36
|
title: title,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/CustomSelectOption/CustomSelectOption.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Icon16Done } from '@vkontakte/icons';\nimport { classNames, hasReactNode } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { SizeType } from '../../lib/adaptivity';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { HasRootRef } from '../../types';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { Paragraph } from '../Typography/Paragraph/Paragraph';\nimport styles from './CustomSelectOption.module.css';\n\nconst sizeYClassNames = {\n none: styles['CustomSelectOption--sizeY-none'],\n [SizeType.REGULAR]: styles['CustomSelectOption--sizeY-regular'],\n};\n\nexport interface CustomSelectOptionProps\n extends React.HTMLAttributes<HTMLDivElement>,\n HasRootRef<HTMLDivElement> {\n /**\n * Вставляет основной контент.\n * @deprecated since v6.0.0\n */\n option?: any;\n /**\n * Добавляет описание под основным блоком.\n */\n description?: React.ReactNode;\n /**\n * Вставляет элемент в начало блока перед основным контентом.\n * Например, можно передать компонент `Avatar`, `Icon<Name>` или другие изображения.\n */\n before?: React.ReactNode;\n /**\n * Вставляет элемент в конец блока после основного контента.\n * Например, можно передать компонент `Avatar`, `Icon<Name>` или другие изображения.\n */\n after?: React.ReactNode;\n /**\n * Позволяет создавать вложенность.\n */\n hierarchy?: number;\n /**\n * Включает состояние выбранного элемента списка.\n */\n selected?: boolean;\n /**\n * Включает состояние наведения.\n */\n hovered?: boolean;\n /**\n * Включает состояние фокуса.\n */\n focused?: boolean;\n /**\n * Блокирует весь блок.\n */\n disabled?: boolean;\n}\n\nconst warn = warnOnce('CustomSelectOption');\n\n/**\n * @see https://vkcom.github.io/VKUI/#/CustomSelectOption\n */\nexport const CustomSelectOption = ({\n children,\n hierarchy = 0,\n hovered,\n selected,\n before,\n after,\n option,\n description,\n disabled,\n style: styleProp,\n className,\n ...restProps\n}: CustomSelectOptionProps) => {\n const title = typeof children === 'string' ? children : undefined;\n const { sizeY = 'none' } = useAdaptivity();\n const style = React.useMemo(\n () =>\n hierarchy > 0\n ? {\n '--vkui_internal--custom_select_option_hierarchy_level': hierarchy,\n ...styleProp,\n }\n : styleProp,\n [hierarchy, styleProp],\n );\n\n if (!!option && process.env.NODE_ENV === 'development') {\n // TODO [>=6]: Удалить св-во `option`\n warn('Свойство option было добавлено по ошибке и будет удалено в v6.0.0.');\n }\n\n return (\n <Paragraph\n {...restProps}\n Component=\"div\"\n role=\"option\"\n title={title}\n aria-disabled={disabled}\n aria-selected={selected}\n className={classNames(\n styles['CustomSelectOption'],\n sizeY !== SizeType.COMPACT && sizeYClassNames[sizeY],\n hovered && !disabled && styles['CustomSelectOption--hover'],\n disabled && styles['CustomSelectOption--disabled'],\n hierarchy > 0 && styles['CustomSelectOption--hierarchy'],\n className,\n )}\n style={style}\n >\n {hasReactNode(before) && <div className={styles['CustomSelectOption__before']}>{before}</div>}\n <div className={styles['CustomSelectOption__main']}>\n <div className={styles['CustomSelectOption__children']}>{children}</div>\n {hasReactNode(description) && (\n <Footnote className={styles['CustomSelectOption__description']}>{description}</Footnote>\n )}\n </div>\n <div className={styles['CustomSelectOption__after']}>\n {hasReactNode(after) && <div>{after}</div>}\n {selected && <Icon16Done className={styles['CustomSelectOption__selectedIcon']} />}\n </div>\n </Paragraph>\n );\n};\n"],"names":["React","Icon16Done","classNames","hasReactNode","useAdaptivity","SizeType","warnOnce","Footnote","Paragraph","styles","sizeYClassNames","none","REGULAR","warn","CustomSelectOption","children","hierarchy","hovered","selected","before","after","option","description","disabled","style","styleProp","className","restProps","title","undefined","sizeY","useMemo","process","env","NODE_ENV","Component","role","aria-disabled","aria-selected","COMPACT","div"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,mBAAmB;AAC9C,SAASC,UAAU,EAAEC,YAAY,QAAQ,kBAAkB;AAC3D,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,QAAQ,QAAQ,uBAAuB;AAChD,SAASC,QAAQ,QAAQ,qBAAqB;AAE9C,SAASC,QAAQ,QAAQ,kCAAkC;AAC3D,SAASC,SAAS,QAAQ,oCAAoC;AAC9D,OAAOC,YAAY,kCAAkC;AAErD,MAAMC,kBAAkB;IACtBC,MAAMF,MAAM,CAAC,iCAAiC;IAC9C,CAACJ,SAASO,OAAO,CAAC,EAAEH,MAAM,CAAC,oCAAoC;AACjE;AA8CA,MAAMI,OAAOP,SAAS;AAEtB;;CAEC,GACD,OAAO,MAAMQ,qBAAqB,CAAC,EACjCC,SAAQ,EACRC,WAAY,EAAC,EACbC,QAAO,EACPC,SAAQ,EACRC,OAAM,EACNC,MAAK,EACLC,OAAM,EACNC,YAAW,EACXC,SAAQ,EACRC,OAAOC,UAAS,EAChBC,UAAS,
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/CustomSelectOption/CustomSelectOption.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Icon16Done } from '@vkontakte/icons';\nimport { classNames, hasReactNode } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { SizeType } from '../../lib/adaptivity';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { HasRootRef } from '../../types';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { Paragraph } from '../Typography/Paragraph/Paragraph';\nimport styles from './CustomSelectOption.module.css';\n\nconst sizeYClassNames = {\n none: styles['CustomSelectOption--sizeY-none'],\n [SizeType.REGULAR]: styles['CustomSelectOption--sizeY-regular'],\n};\n\nexport interface CustomSelectOptionProps\n extends React.HTMLAttributes<HTMLDivElement>,\n HasRootRef<HTMLDivElement> {\n /**\n * Вставляет основной контент.\n * @deprecated since v6.0.0\n */\n option?: any;\n /**\n * Добавляет описание под основным блоком.\n */\n description?: React.ReactNode;\n /**\n * Вставляет элемент в начало блока перед основным контентом.\n * Например, можно передать компонент `Avatar`, `Icon<Name>` или другие изображения.\n */\n before?: React.ReactNode;\n /**\n * Вставляет элемент в конец блока после основного контента.\n * Например, можно передать компонент `Avatar`, `Icon<Name>` или другие изображения.\n */\n after?: React.ReactNode;\n /**\n * Позволяет создавать вложенность.\n */\n hierarchy?: number;\n /**\n * Включает состояние выбранного элемента списка.\n */\n selected?: boolean;\n /**\n * Включает состояние наведения.\n */\n hovered?: boolean;\n /**\n * Включает состояние фокуса.\n */\n focused?: boolean;\n /**\n * Блокирует весь блок.\n */\n disabled?: boolean;\n}\n\nconst warn = warnOnce('CustomSelectOption');\n\n/**\n * @see https://vkcom.github.io/VKUI/#/CustomSelectOption\n */\nexport const CustomSelectOption = ({\n children,\n hierarchy = 0,\n hovered,\n selected,\n before,\n after,\n option,\n description,\n disabled,\n style: styleProp,\n className,\n onClick,\n ...restProps\n}: CustomSelectOptionProps) => {\n const title = typeof children === 'string' ? children : undefined;\n const { sizeY = 'none' } = useAdaptivity();\n const style = React.useMemo(\n () =>\n hierarchy > 0\n ? {\n '--vkui_internal--custom_select_option_hierarchy_level': hierarchy,\n ...styleProp,\n }\n : styleProp,\n [hierarchy, styleProp],\n );\n\n if (!!option && process.env.NODE_ENV === 'development') {\n // TODO [>=6]: Удалить св-во `option`\n warn('Свойство option было добавлено по ошибке и будет удалено в v6.0.0.');\n }\n\n return (\n <Paragraph\n {...restProps}\n onClick={disabled ? undefined : onClick}\n Component=\"div\"\n role=\"option\"\n title={title}\n aria-disabled={disabled}\n aria-selected={selected}\n className={classNames(\n styles['CustomSelectOption'],\n sizeY !== SizeType.COMPACT && sizeYClassNames[sizeY],\n hovered && !disabled && styles['CustomSelectOption--hover'],\n disabled && styles['CustomSelectOption--disabled'],\n hierarchy > 0 && styles['CustomSelectOption--hierarchy'],\n className,\n )}\n style={style}\n >\n {hasReactNode(before) && <div className={styles['CustomSelectOption__before']}>{before}</div>}\n <div className={styles['CustomSelectOption__main']}>\n <div className={styles['CustomSelectOption__children']}>{children}</div>\n {hasReactNode(description) && (\n <Footnote className={styles['CustomSelectOption__description']}>{description}</Footnote>\n )}\n </div>\n <div className={styles['CustomSelectOption__after']}>\n {hasReactNode(after) && <div>{after}</div>}\n {selected && <Icon16Done className={styles['CustomSelectOption__selectedIcon']} />}\n </div>\n </Paragraph>\n );\n};\n"],"names":["React","Icon16Done","classNames","hasReactNode","useAdaptivity","SizeType","warnOnce","Footnote","Paragraph","styles","sizeYClassNames","none","REGULAR","warn","CustomSelectOption","children","hierarchy","hovered","selected","before","after","option","description","disabled","style","styleProp","className","onClick","restProps","title","undefined","sizeY","useMemo","process","env","NODE_ENV","Component","role","aria-disabled","aria-selected","COMPACT","div"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,mBAAmB;AAC9C,SAASC,UAAU,EAAEC,YAAY,QAAQ,kBAAkB;AAC3D,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,QAAQ,QAAQ,uBAAuB;AAChD,SAASC,QAAQ,QAAQ,qBAAqB;AAE9C,SAASC,QAAQ,QAAQ,kCAAkC;AAC3D,SAASC,SAAS,QAAQ,oCAAoC;AAC9D,OAAOC,YAAY,kCAAkC;AAErD,MAAMC,kBAAkB;IACtBC,MAAMF,MAAM,CAAC,iCAAiC;IAC9C,CAACJ,SAASO,OAAO,CAAC,EAAEH,MAAM,CAAC,oCAAoC;AACjE;AA8CA,MAAMI,OAAOP,SAAS;AAEtB;;CAEC,GACD,OAAO,MAAMQ,qBAAqB,CAAC,EACjCC,SAAQ,EACRC,WAAY,EAAC,EACbC,QAAO,EACPC,SAAQ,EACRC,OAAM,EACNC,MAAK,EACLC,OAAM,EACNC,YAAW,EACXC,SAAQ,EACRC,OAAOC,UAAS,EAChBC,UAAS,EACTC,QAAO,EACP,GAAGC,WACqB,GAAK;IAC7B,MAAMC,QAAQ,OAAOd,aAAa,WAAWA,WAAWe,SAAS;IACjE,MAAM,EAAEC,OAAQ,OAAM,EAAE,GAAG3B;IAC3B,MAAMoB,QAAQxB,MAAMgC,OAAO,CACzB,IACEhB,YAAY,IACR;YACE,yDAAyDA;YACzD,GAAGS,SAAS;QACd,IACAA,SAAS,EACf;QAACT;QAAWS;KAAU;IAGxB,IAAI,CAAC,CAACJ,UAAUY,QAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;QACtD,qCAAqC;QACrCtB,KAAK;IACP,CAAC;IAED,qBACE,oBAACL;QACE,GAAGoB,SAAS;QACbD,SAASJ,WAAWO,YAAYH,OAAO;QACvCS,WAAU;QACVC,MAAK;QACLR,OAAOA;QACPS,iBAAef;QACfgB,iBAAerB;QACfQ,WAAWxB,WACTO,MAAM,CAAC,qBAAqB,EAC5BsB,UAAU1B,SAASmC,OAAO,IAAI9B,eAAe,CAACqB,MAAM,EACpDd,WAAW,CAACM,YAAYd,MAAM,CAAC,4BAA4B,EAC3Dc,YAAYd,MAAM,CAAC,+BAA+B,EAClDO,YAAY,KAAKP,MAAM,CAAC,gCAAgC,EACxDiB;QAEFF,OAAOA;OAENrB,aAAagB,yBAAW,oBAACsB;QAAIf,WAAWjB,MAAM,CAAC,6BAA6B;OAAGU,uBAChF,oBAACsB;QAAIf,WAAWjB,MAAM,CAAC,2BAA2B;qBAChD,oBAACgC;QAAIf,WAAWjB,MAAM,CAAC,+BAA+B;OAAGM,WACxDZ,aAAamB,8BACZ,oBAACf;QAASmB,WAAWjB,MAAM,CAAC,kCAAkC;OAAGa,6BAGrE,oBAACmB;QAAIf,WAAWjB,MAAM,CAAC,4BAA4B;OAChDN,aAAaiB,wBAAU,oBAACqB,aAAKrB,QAC7BF,0BAAY,oBAACjB;QAAWyB,WAAWjB,MAAM,CAAC,mCAAmC;;AAItF,EAAE"}
|
|
@@ -34,7 +34,8 @@ class ModalRootTouchComponent extends React.Component {
|
|
|
34
34
|
super(props);
|
|
35
35
|
this.state = {
|
|
36
36
|
touchDown: false,
|
|
37
|
-
dragging: false
|
|
37
|
+
dragging: false,
|
|
38
|
+
modalOpenedLog: []
|
|
38
39
|
};
|
|
39
40
|
this.maskElementRef = /*#__PURE__*/ React.createRef();
|
|
40
41
|
this.modalRootContext = {
|
|
@@ -179,6 +180,14 @@ class ModalRootTouchComponent extends React.Component {
|
|
|
179
180
|
id && warn(`closeActiveModal: модальное окно (страница) ${id} не существует`, 'error');
|
|
180
181
|
return;
|
|
181
182
|
}
|
|
183
|
+
if (!this.state.modalOpenedLog.length) {
|
|
184
|
+
this.setState((prevState)=>({
|
|
185
|
+
modalOpenedLog: [
|
|
186
|
+
...prevState.modalOpenedLog,
|
|
187
|
+
id
|
|
188
|
+
]
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
182
191
|
const nextModalState = this.props.getModalState(this.props.activeModal);
|
|
183
192
|
const nextIsPage = !!nextModalState && nextModalState.type === ModalType.PAGE;
|
|
184
193
|
const prevIsPage = !!prevModalState && prevModalState.type === ModalType.PAGE;
|
|
@@ -188,6 +197,18 @@ class ModalRootTouchComponent extends React.Component {
|
|
|
188
197
|
if (!nextModalState) {
|
|
189
198
|
// NOTE: was only for clean exit
|
|
190
199
|
this.setMaskOpacity(prevModalState, 0);
|
|
200
|
+
this.setState({
|
|
201
|
+
modalOpenedLog: []
|
|
202
|
+
});
|
|
203
|
+
prevModalState.translateY = undefined;
|
|
204
|
+
} else if (nextModalState.id && !this.state.modalOpenedLog.includes(nextModalState.id)) {
|
|
205
|
+
nextModalState.translateY = undefined;
|
|
206
|
+
this.setState((prevState)=>({
|
|
207
|
+
modalOpenedLog: [
|
|
208
|
+
...prevState.modalOpenedLog,
|
|
209
|
+
nextModalState.id
|
|
210
|
+
]
|
|
211
|
+
}));
|
|
191
212
|
}
|
|
192
213
|
}
|
|
193
214
|
onTouchMove = (e)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/ModalRoot/ModalRoot.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { clamp } from '../../helpers/math';\nimport { withContext } from '../../hoc/withContext';\nimport { withPlatform } from '../../hoc/withPlatform';\nimport { DOMProps, withDOM } from '../../lib/dom';\nimport { getNavId } from '../../lib/getNavId';\nimport { Platform } from '../../lib/platform';\nimport { setTransformStyle } from '../../lib/styles';\nimport { transitionEvent } from '../../lib/supportEvents';\nimport { rubber } from '../../lib/touch';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { ConfigProviderContext, WebviewType } from '../ConfigProvider/ConfigProviderContext';\nimport { FocusTrap } from '../FocusTrap/FocusTrap';\nimport { Touch, TouchEvent } from '../Touch/Touch';\nimport TouchRootContext from '../Touch/TouchContext';\nimport { ModalRootContext, ModalRootContextInterface } from './ModalRootContext';\nimport { MODAL_PAGE_DEFAULT_PERCENT_HEIGHT } from './constants';\nimport { ModalRootWithDOMProps, ModalsStateEntry, ModalType, TranslateRange } from './types';\nimport { ModalTransitionProps, withModalManager } from './useModalManager';\nimport styles from './ModalRoot.module.css';\n\nconst warn = warnOnce('ModalRoot');\n\nfunction numberInRange(number: number, range: TranslateRange | undefined) {\n if (!range) {\n return false;\n }\n return number >= range[0] && number <= range[1];\n}\n\nfunction rangeTranslate(number: number) {\n return clamp(number, 0, 98);\n}\n\ninterface ModalRootState {\n touchDown?: boolean;\n dragging?: boolean;\n}\n\nclass ModalRootTouchComponent extends React.Component<\n ModalRootWithDOMProps & DOMProps & ModalTransitionProps,\n ModalRootState\n> {\n constructor(props: ModalRootWithDOMProps & ModalTransitionProps) {\n super(props);\n this.state = {\n touchDown: false,\n dragging: false,\n };\n\n this.maskElementRef = React.createRef();\n\n this.modalRootContext = {\n updateModalHeight: this.updateModalHeight,\n registerModal: ({ id, ...data }) => Object.assign(this.props.getModalState(id) ?? {}, data),\n onClose: () => this.props.onExit(),\n isInsideModal: true,\n };\n\n this.frameIds = {};\n }\n\n private documentScrolling = false;\n private readonly maskElementRef: React.RefObject<HTMLDivElement>;\n private readonly viewportRef = React.createRef<HTMLDivElement>();\n private maskAnimationFrame: number | undefined = undefined;\n private readonly modalRootContext: ModalRootContextInterface;\n private readonly frameIds: {\n [index: string]: number;\n };\n private restoreFocusTo: HTMLElement | undefined | null = undefined;\n\n get timeout(): number {\n return this.props.platform === Platform.IOS ? 400 : 320;\n }\n\n get document(): Document {\n return this.props.document as Document;\n }\n\n get window(): Window {\n return this.props.window as Window;\n }\n\n getModals() {\n return React.Children.toArray(this.props.children) as React.ReactElement[];\n }\n\n componentDidMount() {\n // Отслеживаем изменение размеров viewport\n this.window?.addEventListener('resize', this.updateModalHeight, false);\n }\n\n componentWillUnmount() {\n this.toggleDocumentScrolling(true);\n this.window.removeEventListener('resize', this.updateModalHeight, false);\n }\n\n componentDidUpdate(prevProps: ModalRootWithDOMProps & ModalTransitionProps) {\n // transition phase 2: animate exiting modal\n if (this.props.exitingModal && this.props.exitingModal !== prevProps.exitingModal) {\n this.closeModal(this.props.exitingModal);\n }\n\n // transition phase 3: animate entering modal\n if (this.props.enteringModal && this.props.enteringModal !== prevProps.enteringModal) {\n const { enteringModal } = this.props;\n const enteringState = this.props.getModalState(enteringModal);\n this.props.onEnter();\n this.waitTransitionFinish(enteringState, () => {\n if (enteringState?.innerElement) {\n enteringState.innerElement.style.transitionDelay = '';\n }\n this.props.onEntered(enteringModal);\n });\n\n if (enteringState?.innerElement) {\n enteringState.innerElement.style.transitionDelay = this.props.delayEnter\n ? `${this.timeout}ms`\n : '';\n this.animateTranslate(enteringState, enteringState.translateY);\n }\n }\n\n // focus restoration\n if (this.props.activeModal && !prevProps.activeModal) {\n this.restoreFocusTo = this.document.activeElement as HTMLElement;\n }\n if (!this.props.activeModal && !this.props.exitingModal && this.restoreFocusTo) {\n this.restoreFocusTo.focus();\n this.restoreFocusTo = null;\n }\n\n this.toggleDocumentScrolling(!this.props.activeModal && !this.props.exitingModal);\n }\n\n /* Отключает скролл документа */\n toggleDocumentScrolling(enabled: boolean) {\n if (this.documentScrolling === enabled) {\n return;\n }\n this.documentScrolling = enabled;\n\n if (enabled) {\n // Здесь нужен последний аргумент с такими же параметрами, потому что\n // некоторые браузеры на странных вендорах типа Meizu не удаляют обработчик.\n // https://github.com/VKCOM/VKUI/issues/444\n this.window.removeEventListener('touchmove', this.preventTouch, {\n // @ts-expect-error: TS2769 В интерфейсе EventListenerOptions нет поля passive\n passive: false,\n });\n } else {\n this.window.addEventListener('touchmove', this.preventTouch, {\n passive: false,\n });\n }\n }\n\n preventTouch = (event: any) => {\n if (!event) {\n return false;\n }\n while (event.originalEvent) {\n event = event.originalEvent;\n }\n if (event.preventDefault) {\n event.preventDefault();\n }\n return false;\n };\n\n checkPageContentHeight() {\n const modalState = this.props.getModalState(this.props.activeModal);\n\n if (modalState?.type === ModalType.PAGE && modalState?.modalElement) {\n const prevModalState = { ...modalState };\n initPageModal(modalState);\n const currentModalState = { ...modalState };\n\n let needAnimate = false;\n\n if (prevModalState.expandable === currentModalState.expandable) {\n if (prevModalState.translateYFrom !== currentModalState.translateYFrom) {\n needAnimate = true;\n }\n } else {\n needAnimate = true;\n }\n\n if (needAnimate) {\n this.animateTranslate(modalState, modalState.translateY);\n }\n }\n }\n\n updateModalHeight = () => {\n const modalState = this.props.getModalState(this.props.activeModal);\n\n if (modalState && modalState.type === ModalType.PAGE) {\n if (this.props.enteringModal) {\n this.waitTransitionFinish(modalState, () => {\n requestAnimationFrame(() => this.checkPageContentHeight());\n });\n } else {\n requestAnimationFrame(() => this.checkPageContentHeight());\n }\n }\n };\n\n closeModal(id: string) {\n // Сбрасываем состояния, которые могут помешать закрытию модального окна\n this.setState({ touchDown: false });\n\n const prevModalState = this.props.getModalState(id);\n\n if (!prevModalState) {\n id && warn(`closeActiveModal: модальное окно (страница) ${id} не существует`, 'error');\n return;\n }\n\n const nextModalState = this.props.getModalState(this.props.activeModal);\n const nextIsPage = !!nextModalState && nextModalState.type === ModalType.PAGE;\n\n const prevIsPage = !!prevModalState && prevModalState.type === ModalType.PAGE;\n this.waitTransitionFinish(prevModalState, () => this.props.onExited(id));\n const exitTranslate =\n prevIsPage &&\n nextIsPage &&\n (prevModalState.translateY ?? 0) <= (nextModalState?.translateYFrom ?? 0) &&\n !this.props.isBack\n ? (nextModalState?.translateYFrom ?? 0) + 10\n : 100;\n this.animateTranslate(prevModalState, exitTranslate);\n\n if (!nextModalState) {\n // NOTE: was only for clean exit\n this.setMaskOpacity(prevModalState, 0);\n }\n }\n\n onTouchMove = (e: TouchEvent) => {\n if (this.props.exitingModal) {\n return;\n }\n const modalState = this.props.getModalState(this.props.activeModal);\n if (!modalState) {\n return;\n }\n\n if (modalState.type === ModalType.PAGE) {\n return this.onPageTouchMove(e, modalState);\n }\n\n if (modalState.type === ModalType.CARD) {\n return this.onCardTouchMove(e, modalState);\n }\n };\n\n onPageTouchMove(event: TouchEvent, modalState: ModalsStateEntry) {\n const { shiftY, originalEvent } = event;\n const target = originalEvent.target as HTMLElement;\n\n if (!event.isY) {\n if (this.viewportRef.current?.contains(target)) {\n originalEvent.preventDefault();\n }\n return;\n }\n\n if (!modalState.innerElement?.contains(target)) {\n return originalEvent.preventDefault();\n }\n\n originalEvent.stopPropagation();\n\n const { expandable, contentScrolled, collapsed, expanded } = modalState;\n\n if (!this.state.touchDown) {\n modalState.touchStartContentScrollTop = modalState.contentElement?.scrollTop ?? 0;\n this.setState({ touchDown: true });\n }\n\n if (contentScrolled) {\n return;\n }\n\n if (modalState.touchMovePositive === null) {\n modalState.touchMovePositive = shiftY > 0;\n }\n\n if (\n !modalState.expandable ||\n collapsed ||\n (expanded && modalState.touchMovePositive && modalState.touchStartContentScrollTop === 0) ||\n modalState.headerElement?.contains(target)\n ) {\n originalEvent.preventDefault();\n\n if ((!expandable && shiftY < 0) || !this.window) {\n return;\n }\n\n !this.state.dragging && this.setState({ dragging: true });\n\n const shiftYPercent = (shiftY / this.window.innerHeight) * 100;\n const shiftYCurrent = rubber(shiftYPercent, 72, 0.8, this.props.platform !== Platform.IOS);\n\n modalState.touchShiftYPercent = shiftYPercent;\n modalState.translateYCurrent = rangeTranslate((modalState.translateY ?? 0) + shiftYCurrent);\n\n this.animateTranslate(modalState, modalState.translateYCurrent);\n this.setMaskOpacity(modalState);\n }\n }\n\n onCardTouchMove(event: TouchEvent, modalState: ModalsStateEntry) {\n const { originalEvent, shiftY } = event;\n const target = originalEvent.target as HTMLElement;\n if (modalState.innerElement?.contains(target)) {\n if (!this.state.touchDown) {\n this.setState({ touchDown: true, dragging: true });\n }\n\n const shiftYPercent = (shiftY / modalState.innerElement.offsetHeight) * 100;\n const shiftYCurrent = rubber(shiftYPercent, 72, 1.2, this.props.platform !== Platform.IOS);\n\n modalState.touchShiftYPercent = shiftYPercent;\n modalState.translateYCurrent = Math.max(0, (modalState.translateY ?? 0) + shiftYCurrent);\n\n this.animateTranslate(modalState, modalState.translateYCurrent);\n this.setMaskOpacity(modalState);\n }\n }\n\n onTouchEnd = (e: TouchEvent) => {\n const modalState = this.props.getModalState(this.props.activeModal);\n\n if (modalState?.type === ModalType.PAGE) {\n return this.onPageTouchEnd(e, modalState);\n }\n\n if (modalState?.type === ModalType.CARD) {\n return this.onCardTouchEnd(e, modalState);\n }\n };\n\n onPageTouchEnd(event: TouchEvent, modalState: ModalsStateEntry) {\n const { startY, shiftY } = event;\n\n modalState.contentScrolled = false;\n modalState.touchMovePositive = null;\n\n let setStateCallback;\n\n if (this.state.dragging && this.window) {\n const shiftYEndPercent = ((startY + shiftY) / this.window.innerHeight) * 100;\n\n let translateY = modalState.translateYCurrent ?? 0;\n const expectTranslateY =\n (translateY / event.duration) *\n 240 *\n 0.6 *\n ((modalState.touchShiftYPercent ?? 0) < 0 ? -1 : 1);\n translateY = rangeTranslate(translateY + expectTranslateY);\n\n if (modalState.settlingHeight !== 100) {\n if (numberInRange(translateY, modalState.expandedRange)) {\n translateY = modalState.expandedRange?.[0] ?? 0;\n } else if (numberInRange(translateY, modalState.collapsedRange)) {\n translateY = modalState.translateYFrom ?? 0;\n } else if (numberInRange(translateY, modalState.hiddenRange)) {\n translateY = 100;\n } else {\n translateY = modalState.translateYFrom ?? 0;\n }\n } else {\n if (numberInRange(translateY, [0, 25])) {\n translateY = 0;\n } else {\n translateY = 100;\n }\n }\n\n if (translateY !== 100 && shiftYEndPercent >= 75) {\n translateY = 100;\n }\n\n modalState.translateY = translateY;\n modalState.translateYCurrent = translateY;\n modalState.collapsed = translateY > 0 && translateY < shiftYEndPercent;\n modalState.expanded = translateY === 0;\n modalState.hidden = translateY === 100;\n\n if (modalState.hidden) {\n this.props.onExit();\n }\n\n setStateCallback = () => {\n if (!modalState.hidden) {\n this.animateTranslate(modalState, modalState.translateY);\n }\n\n this.setMaskOpacity(modalState);\n };\n }\n\n this.setState(\n {\n touchDown: false,\n dragging: false,\n },\n setStateCallback,\n );\n }\n\n onCardTouchEnd({ duration }: TouchEvent, modalState: ModalsStateEntry) {\n let setStateCallback;\n\n if (this.state.dragging) {\n let translateY = modalState.translateYCurrent ?? 0;\n\n const expectTranslateY =\n (translateY / duration) * 240 * 0.6 * ((modalState.touchShiftYPercent ?? 0) < 0 ? -1 : 1);\n translateY = Math.max(0, translateY + expectTranslateY);\n\n if (translateY >= 30) {\n translateY = 100;\n } else {\n translateY = 0;\n }\n\n modalState.translateY = translateY;\n modalState.hidden = translateY === 100;\n\n if (modalState.hidden) {\n this.props.onExit();\n }\n\n setStateCallback = () => {\n if (!modalState.hidden) {\n this.animateTranslate(modalState, modalState.translateY);\n }\n\n this.setMaskOpacity(modalState);\n };\n }\n\n this.setState(\n {\n touchDown: false,\n dragging: false,\n },\n setStateCallback,\n );\n }\n\n onScroll = (e: React.SyntheticEvent) => {\n const activeModal = this.props.activeModal;\n\n const target = e.target as HTMLElement;\n\n if (!activeModal) {\n return;\n }\n const modalState = this.props.getModalState(activeModal);\n if (modalState?.type === ModalType.PAGE && modalState?.contentElement?.contains(target)) {\n modalState.contentScrolled = true;\n\n if (modalState.contentScrollStopTimeout) {\n clearTimeout(modalState.contentScrollStopTimeout);\n }\n\n modalState.contentScrollStopTimeout = setTimeout(() => {\n if (modalState.contentScrolled) {\n modalState.contentScrolled = false;\n }\n }, 250);\n }\n };\n\n waitTransitionFinish(modalState: ModalsStateEntry | undefined, eventHandler: () => void) {\n if (transitionEvent.supported) {\n const onceHandler = () => {\n modalState?.innerElement?.removeEventListener(transitionEvent.name as string, onceHandler);\n eventHandler();\n };\n\n modalState?.innerElement?.addEventListener(transitionEvent.name as string, onceHandler);\n } else {\n setTimeout(eventHandler, this.timeout);\n }\n }\n\n /**\n * Анимирует сдвиг модалки\n *\n * @param {ModalsStateEntry} modalState\n * @param {number} percent Процент сдвига: 0 – полностью открыта, 100 – полностью закрыта\n */\n animateTranslate(modalState: ModalsStateEntry, percent: number | undefined) {\n const frameId = `animateTranslateFrame${modalState.id}`;\n\n cancelAnimationFrame(this.frameIds[frameId]);\n\n this.frameIds[frameId] = requestAnimationFrame(() => {\n setTransformStyle(modalState.innerElement, `translate3d(0, ${percent}%, 0)`);\n });\n }\n\n /* Устанавливает прозрачность для полупрозрачной подложки */\n setMaskOpacity(modalState: ModalsStateEntry, forceOpacity: number | null = null) {\n if (forceOpacity === null && this.props.history?.[0] !== modalState.id) {\n return;\n }\n if (this.maskAnimationFrame) {\n cancelAnimationFrame(this.maskAnimationFrame);\n }\n this.maskAnimationFrame = requestAnimationFrame(() => {\n if (this.maskElementRef.current) {\n const { translateY = 0, translateYCurrent = 0 } = modalState;\n\n const opacity =\n forceOpacity === null\n ? 1 - (translateYCurrent - translateY) / (100 - translateY) || 0\n : forceOpacity;\n this.maskElementRef.current.style.opacity = clamp(opacity, 0, 100).toString();\n }\n });\n }\n\n render() {\n const { activeModal, exitingModal, enteringModal } = this.props;\n const { touchDown, dragging } = this.state;\n\n if (!activeModal && !exitingModal) {\n return null;\n }\n\n return (\n <TouchRootContext.Provider value={true}>\n <ModalRootContext.Provider value={this.modalRootContext}>\n <Touch\n className={classNames(\n styles['ModalRoot'],\n this.props.configProvider?.webviewType === WebviewType.VKAPPS &&\n styles['ModalRoot--vkapps'],\n touchDown &&\n classNames(styles['ModalRoot--touched'], 'vkuiInternalModalRoot--touched'),\n !!(enteringModal || exitingModal) &&\n classNames(styles['ModalRoot--switching'], 'vkuiInternalModalRoot--switching'),\n )}\n onMove={this.onTouchMove}\n onEnd={this.onTouchEnd}\n onScroll={this.onScroll}\n >\n <div\n className={styles['ModalRoot__mask']}\n onClick={this.props.onExit}\n ref={this.maskElementRef}\n />\n <div className={styles['ModalRoot__viewport']} ref={this.viewportRef}>\n {this.getModals().map((Modal) => {\n const modalId = getNavId(Modal.props, warn);\n const _modalState = this.props.getModalState(modalId);\n if ((modalId !== activeModal && modalId !== exitingModal) || !_modalState) {\n return null;\n }\n const modalState = { ..._modalState };\n\n const isPage = modalState.type === ModalType.PAGE;\n const key = `modal-${modalId}`;\n\n return (\n <FocusTrap\n key={key}\n getRootRef={(e) => {\n const modalState = this.props.getModalState(modalId);\n if (modalState) {\n modalState.modalElement = e;\n }\n }}\n onClose={this.props.onExit}\n timeout={this.timeout}\n className={classNames(\n styles['ModalRoot__modal'],\n\n dragging && 'vkuiInternalModalRoot__modal--dragging',\n\n isPage && modalState.expandable && 'vkuiInternalModalRoot__modal--expandable',\n isPage && modalState.collapsed && 'vkuiInternalModalRoot__modal--collapsed',\n )}\n restoreFocus={false}\n >\n {Modal}\n </FocusTrap>\n );\n })}\n </div>\n </Touch>\n </ModalRootContext.Provider>\n </TouchRootContext.Provider>\n );\n }\n}\n\nexport const ModalRootTouch = withContext(\n withPlatform(\n withDOM<ModalRootWithDOMProps>(withModalManager(initModal)(ModalRootTouchComponent)),\n ),\n ConfigProviderContext,\n 'configProvider',\n);\n\n/**\n * Инициализирует модалку перед анимацией открытия\n */\nfunction initModal(modalState: ModalsStateEntry) {\n switch (modalState.type) {\n case ModalType.PAGE:\n modalState.settlingHeight = modalState.settlingHeight || MODAL_PAGE_DEFAULT_PERCENT_HEIGHT;\n return initPageModal(modalState);\n case ModalType.CARD:\n return initCardModal(modalState);\n default:\n process.env.NODE_ENV === 'development' &&\n warn(`initActiveModal: modalState.type=\"${modalState.type}\" не поддерживается`, 'error');\n }\n}\n\nfunction initPageModal(modalState: ModalsStateEntry) {\n const { contentElement } = modalState;\n const contentHeight = (contentElement?.firstElementChild as HTMLElement).offsetHeight;\n\n let prevTranslateY = modalState.translateY;\n\n modalState.expandable =\n contentHeight > (contentElement?.clientHeight ?? 0) || modalState.settlingHeight === 100;\n\n let collapsed = false;\n let expanded = false;\n let translateYFrom;\n let translateY;\n let expandedRange: TranslateRange;\n let collapsedRange: TranslateRange;\n let hiddenRange: TranslateRange;\n\n if (modalState.expandable) {\n translateYFrom = 100 - (modalState.settlingHeight ?? 0);\n\n const shiftHalf = translateYFrom / 2;\n const visiblePart = 100 - translateYFrom;\n\n expandedRange = [0, shiftHalf];\n collapsedRange = [shiftHalf, translateYFrom + visiblePart / 4];\n hiddenRange = [translateYFrom + visiblePart / 4, 100];\n\n collapsed = translateYFrom > 0;\n expanded = translateYFrom <= 0;\n translateY = translateYFrom;\n } else {\n const headerHeight = modalState.headerElement?.offsetHeight ?? 0;\n const height = contentHeight + headerHeight;\n\n translateYFrom =\n 100 - (height / (modalState.innerElement?.parentElement?.offsetHeight ?? 0)) * 100;\n translateY = translateYFrom;\n\n expandedRange = [translateY, translateY + 25];\n collapsedRange = [translateY + 25, translateY + 25];\n hiddenRange = [translateY + 25, translateY + 100];\n }\n\n // Если модалка может открываться на весь экран, и новый сдвиг больше предыдущего, то откроем её на весь экран\n if (\n (modalState.expandable && translateY > (prevTranslateY ?? 100)) ||\n modalState.settlingHeight === 100\n ) {\n translateY = 0;\n }\n\n // Если модалка уже раскрыта обновляем состояния\n if (translateY === 0) {\n expanded = true;\n collapsed = false;\n }\n\n modalState.expandedRange = expandedRange;\n modalState.collapsedRange = collapsedRange;\n modalState.hiddenRange = hiddenRange;\n modalState.translateY = translateY;\n modalState.translateYFrom = translateYFrom;\n modalState.collapsed = collapsed;\n modalState.expanded = expanded;\n}\n\nfunction initCardModal(modalState: ModalsStateEntry) {\n modalState.translateY = 0;\n}\n"],"names":["React","classNames","clamp","withContext","withPlatform","withDOM","getNavId","Platform","setTransformStyle","transitionEvent","rubber","warnOnce","ConfigProviderContext","WebviewType","FocusTrap","Touch","TouchRootContext","ModalRootContext","MODAL_PAGE_DEFAULT_PERCENT_HEIGHT","ModalType","withModalManager","styles","warn","numberInRange","number","range","rangeTranslate","ModalRootTouchComponent","Component","constructor","props","state","touchDown","dragging","maskElementRef","createRef","modalRootContext","updateModalHeight","registerModal","id","data","Object","assign","getModalState","onClose","onExit","isInsideModal","frameIds","documentScrolling","viewportRef","maskAnimationFrame","undefined","restoreFocusTo","timeout","platform","IOS","document","window","getModals","Children","toArray","children","componentDidMount","addEventListener","componentWillUnmount","toggleDocumentScrolling","removeEventListener","componentDidUpdate","prevProps","exitingModal","closeModal","enteringModal","enteringState","onEnter","waitTransitionFinish","innerElement","style","transitionDelay","onEntered","delayEnter","animateTranslate","translateY","activeModal","activeElement","focus","enabled","preventTouch","passive","event","originalEvent","preventDefault","checkPageContentHeight","modalState","type","PAGE","modalElement","prevModalState","initPageModal","currentModalState","needAnimate","expandable","translateYFrom","requestAnimationFrame","setState","nextModalState","nextIsPage","prevIsPage","onExited","exitTranslate","isBack","setMaskOpacity","onTouchMove","e","onPageTouchMove","CARD","onCardTouchMove","shiftY","target","isY","current","contains","stopPropagation","contentScrolled","collapsed","expanded","touchStartContentScrollTop","contentElement","scrollTop","touchMovePositive","headerElement","shiftYPercent","innerHeight","shiftYCurrent","touchShiftYPercent","translateYCurrent","offsetHeight","Math","max","onTouchEnd","onPageTouchEnd","onCardTouchEnd","startY","setStateCallback","shiftYEndPercent","expectTranslateY","duration","settlingHeight","expandedRange","collapsedRange","hiddenRange","hidden","onScroll","contentScrollStopTimeout","clearTimeout","setTimeout","eventHandler","supported","onceHandler","name","percent","frameId","cancelAnimationFrame","forceOpacity","history","opacity","toString","render","Provider","value","className","configProvider","webviewType","VKAPPS","onMove","onEnd","div","onClick","ref","map","Modal","modalId","_modalState","isPage","key","getRootRef","restoreFocus","ModalRootTouch","initModal","initCardModal","process","env","NODE_ENV","contentHeight","firstElementChild","prevTranslateY","clientHeight","shiftHalf","visiblePart","headerHeight","height","parentElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ModalRoot/ModalRoot.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { clamp } from '../../helpers/math';\nimport { withContext } from '../../hoc/withContext';\nimport { withPlatform } from '../../hoc/withPlatform';\nimport { DOMProps, withDOM } from '../../lib/dom';\nimport { getNavId } from '../../lib/getNavId';\nimport { Platform } from '../../lib/platform';\nimport { setTransformStyle } from '../../lib/styles';\nimport { transitionEvent } from '../../lib/supportEvents';\nimport { rubber } from '../../lib/touch';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { ConfigProviderContext, WebviewType } from '../ConfigProvider/ConfigProviderContext';\nimport { FocusTrap } from '../FocusTrap/FocusTrap';\nimport { Touch, TouchEvent } from '../Touch/Touch';\nimport TouchRootContext from '../Touch/TouchContext';\nimport { ModalRootContext, ModalRootContextInterface } from './ModalRootContext';\nimport { MODAL_PAGE_DEFAULT_PERCENT_HEIGHT } from './constants';\nimport { ModalRootWithDOMProps, ModalsStateEntry, ModalType, TranslateRange } from './types';\nimport { ModalTransitionProps, withModalManager } from './useModalManager';\nimport styles from './ModalRoot.module.css';\n\nconst warn = warnOnce('ModalRoot');\n\nfunction numberInRange(number: number, range: TranslateRange | undefined) {\n if (!range) {\n return false;\n }\n return number >= range[0] && number <= range[1];\n}\n\nfunction rangeTranslate(number: number) {\n return clamp(number, 0, 98);\n}\n\ninterface ModalRootState {\n touchDown?: boolean;\n dragging?: boolean;\n modalOpenedLog: string[];\n}\n\nclass ModalRootTouchComponent extends React.Component<\n ModalRootWithDOMProps & DOMProps & ModalTransitionProps,\n ModalRootState\n> {\n constructor(props: ModalRootWithDOMProps & ModalTransitionProps) {\n super(props);\n this.state = {\n touchDown: false,\n dragging: false,\n modalOpenedLog: [],\n };\n\n this.maskElementRef = React.createRef();\n\n this.modalRootContext = {\n updateModalHeight: this.updateModalHeight,\n registerModal: ({ id, ...data }) => Object.assign(this.props.getModalState(id) ?? {}, data),\n onClose: () => this.props.onExit(),\n isInsideModal: true,\n };\n\n this.frameIds = {};\n }\n\n private documentScrolling = false;\n private readonly maskElementRef: React.RefObject<HTMLDivElement>;\n private readonly viewportRef = React.createRef<HTMLDivElement>();\n private maskAnimationFrame: number | undefined = undefined;\n private readonly modalRootContext: ModalRootContextInterface;\n private readonly frameIds: {\n [index: string]: number;\n };\n private restoreFocusTo: HTMLElement | undefined | null = undefined;\n\n get timeout(): number {\n return this.props.platform === Platform.IOS ? 400 : 320;\n }\n\n get document(): Document {\n return this.props.document as Document;\n }\n\n get window(): Window {\n return this.props.window as Window;\n }\n\n getModals() {\n return React.Children.toArray(this.props.children) as React.ReactElement[];\n }\n\n componentDidMount() {\n // Отслеживаем изменение размеров viewport\n this.window?.addEventListener('resize', this.updateModalHeight, false);\n }\n\n componentWillUnmount() {\n this.toggleDocumentScrolling(true);\n this.window.removeEventListener('resize', this.updateModalHeight, false);\n }\n\n componentDidUpdate(prevProps: ModalRootWithDOMProps & ModalTransitionProps) {\n // transition phase 2: animate exiting modal\n if (this.props.exitingModal && this.props.exitingModal !== prevProps.exitingModal) {\n this.closeModal(this.props.exitingModal);\n }\n\n // transition phase 3: animate entering modal\n if (this.props.enteringModal && this.props.enteringModal !== prevProps.enteringModal) {\n const { enteringModal } = this.props;\n const enteringState = this.props.getModalState(enteringModal);\n this.props.onEnter();\n this.waitTransitionFinish(enteringState, () => {\n if (enteringState?.innerElement) {\n enteringState.innerElement.style.transitionDelay = '';\n }\n this.props.onEntered(enteringModal);\n });\n\n if (enteringState?.innerElement) {\n enteringState.innerElement.style.transitionDelay = this.props.delayEnter\n ? `${this.timeout}ms`\n : '';\n this.animateTranslate(enteringState, enteringState.translateY);\n }\n }\n\n // focus restoration\n if (this.props.activeModal && !prevProps.activeModal) {\n this.restoreFocusTo = this.document.activeElement as HTMLElement;\n }\n if (!this.props.activeModal && !this.props.exitingModal && this.restoreFocusTo) {\n this.restoreFocusTo.focus();\n this.restoreFocusTo = null;\n }\n\n this.toggleDocumentScrolling(!this.props.activeModal && !this.props.exitingModal);\n }\n\n /* Отключает скролл документа */\n toggleDocumentScrolling(enabled: boolean) {\n if (this.documentScrolling === enabled) {\n return;\n }\n this.documentScrolling = enabled;\n\n if (enabled) {\n // Здесь нужен последний аргумент с такими же параметрами, потому что\n // некоторые браузеры на странных вендорах типа Meizu не удаляют обработчик.\n // https://github.com/VKCOM/VKUI/issues/444\n this.window.removeEventListener('touchmove', this.preventTouch, {\n // @ts-expect-error: TS2769 В интерфейсе EventListenerOptions нет поля passive\n passive: false,\n });\n } else {\n this.window.addEventListener('touchmove', this.preventTouch, {\n passive: false,\n });\n }\n }\n\n preventTouch = (event: any) => {\n if (!event) {\n return false;\n }\n while (event.originalEvent) {\n event = event.originalEvent;\n }\n if (event.preventDefault) {\n event.preventDefault();\n }\n return false;\n };\n\n checkPageContentHeight() {\n const modalState = this.props.getModalState(this.props.activeModal);\n\n if (modalState?.type === ModalType.PAGE && modalState?.modalElement) {\n const prevModalState = { ...modalState };\n initPageModal(modalState);\n const currentModalState = { ...modalState };\n\n let needAnimate = false;\n\n if (prevModalState.expandable === currentModalState.expandable) {\n if (prevModalState.translateYFrom !== currentModalState.translateYFrom) {\n needAnimate = true;\n }\n } else {\n needAnimate = true;\n }\n\n if (needAnimate) {\n this.animateTranslate(modalState, modalState.translateY);\n }\n }\n }\n\n updateModalHeight = () => {\n const modalState = this.props.getModalState(this.props.activeModal);\n\n if (modalState && modalState.type === ModalType.PAGE) {\n if (this.props.enteringModal) {\n this.waitTransitionFinish(modalState, () => {\n requestAnimationFrame(() => this.checkPageContentHeight());\n });\n } else {\n requestAnimationFrame(() => this.checkPageContentHeight());\n }\n }\n };\n\n closeModal(id: string) {\n // Сбрасываем состояния, которые могут помешать закрытию модального окна\n this.setState({ touchDown: false });\n\n const prevModalState = this.props.getModalState(id);\n\n if (!prevModalState) {\n id && warn(`closeActiveModal: модальное окно (страница) ${id} не существует`, 'error');\n return;\n }\n if (!this.state.modalOpenedLog.length) {\n this.setState((prevState) => ({\n modalOpenedLog: [...prevState.modalOpenedLog, id],\n }));\n }\n const nextModalState = this.props.getModalState(this.props.activeModal);\n const nextIsPage = !!nextModalState && nextModalState.type === ModalType.PAGE;\n\n const prevIsPage = !!prevModalState && prevModalState.type === ModalType.PAGE;\n this.waitTransitionFinish(prevModalState, () => this.props.onExited(id));\n const exitTranslate =\n prevIsPage &&\n nextIsPage &&\n (prevModalState.translateY ?? 0) <= (nextModalState?.translateYFrom ?? 0) &&\n !this.props.isBack\n ? (nextModalState?.translateYFrom ?? 0) + 10\n : 100;\n this.animateTranslate(prevModalState, exitTranslate);\n\n if (!nextModalState) {\n // NOTE: was only for clean exit\n this.setMaskOpacity(prevModalState, 0);\n this.setState({ modalOpenedLog: [] });\n prevModalState.translateY = undefined;\n } else if (nextModalState.id && !this.state.modalOpenedLog.includes(nextModalState.id)) {\n nextModalState.translateY = undefined;\n this.setState((prevState) => ({\n modalOpenedLog: [...prevState.modalOpenedLog, nextModalState.id!],\n }));\n }\n }\n\n onTouchMove = (e: TouchEvent) => {\n if (this.props.exitingModal) {\n return;\n }\n const modalState = this.props.getModalState(this.props.activeModal);\n if (!modalState) {\n return;\n }\n\n if (modalState.type === ModalType.PAGE) {\n return this.onPageTouchMove(e, modalState);\n }\n\n if (modalState.type === ModalType.CARD) {\n return this.onCardTouchMove(e, modalState);\n }\n };\n\n onPageTouchMove(event: TouchEvent, modalState: ModalsStateEntry) {\n const { shiftY, originalEvent } = event;\n const target = originalEvent.target as HTMLElement;\n\n if (!event.isY) {\n if (this.viewportRef.current?.contains(target)) {\n originalEvent.preventDefault();\n }\n return;\n }\n\n if (!modalState.innerElement?.contains(target)) {\n return originalEvent.preventDefault();\n }\n\n originalEvent.stopPropagation();\n\n const { expandable, contentScrolled, collapsed, expanded } = modalState;\n\n if (!this.state.touchDown) {\n modalState.touchStartContentScrollTop = modalState.contentElement?.scrollTop ?? 0;\n this.setState({ touchDown: true });\n }\n\n if (contentScrolled) {\n return;\n }\n\n if (modalState.touchMovePositive === null) {\n modalState.touchMovePositive = shiftY > 0;\n }\n\n if (\n !modalState.expandable ||\n collapsed ||\n (expanded && modalState.touchMovePositive && modalState.touchStartContentScrollTop === 0) ||\n modalState.headerElement?.contains(target)\n ) {\n originalEvent.preventDefault();\n\n if ((!expandable && shiftY < 0) || !this.window) {\n return;\n }\n\n !this.state.dragging && this.setState({ dragging: true });\n\n const shiftYPercent = (shiftY / this.window.innerHeight) * 100;\n const shiftYCurrent = rubber(shiftYPercent, 72, 0.8, this.props.platform !== Platform.IOS);\n\n modalState.touchShiftYPercent = shiftYPercent;\n modalState.translateYCurrent = rangeTranslate((modalState.translateY ?? 0) + shiftYCurrent);\n\n this.animateTranslate(modalState, modalState.translateYCurrent);\n this.setMaskOpacity(modalState);\n }\n }\n\n onCardTouchMove(event: TouchEvent, modalState: ModalsStateEntry) {\n const { originalEvent, shiftY } = event;\n const target = originalEvent.target as HTMLElement;\n if (modalState.innerElement?.contains(target)) {\n if (!this.state.touchDown) {\n this.setState({ touchDown: true, dragging: true });\n }\n\n const shiftYPercent = (shiftY / modalState.innerElement.offsetHeight) * 100;\n const shiftYCurrent = rubber(shiftYPercent, 72, 1.2, this.props.platform !== Platform.IOS);\n\n modalState.touchShiftYPercent = shiftYPercent;\n modalState.translateYCurrent = Math.max(0, (modalState.translateY ?? 0) + shiftYCurrent);\n\n this.animateTranslate(modalState, modalState.translateYCurrent);\n this.setMaskOpacity(modalState);\n }\n }\n\n onTouchEnd = (e: TouchEvent) => {\n const modalState = this.props.getModalState(this.props.activeModal);\n\n if (modalState?.type === ModalType.PAGE) {\n return this.onPageTouchEnd(e, modalState);\n }\n\n if (modalState?.type === ModalType.CARD) {\n return this.onCardTouchEnd(e, modalState);\n }\n };\n\n onPageTouchEnd(event: TouchEvent, modalState: ModalsStateEntry) {\n const { startY, shiftY } = event;\n\n modalState.contentScrolled = false;\n modalState.touchMovePositive = null;\n\n let setStateCallback;\n\n if (this.state.dragging && this.window) {\n const shiftYEndPercent = ((startY + shiftY) / this.window.innerHeight) * 100;\n\n let translateY = modalState.translateYCurrent ?? 0;\n const expectTranslateY =\n (translateY / event.duration) *\n 240 *\n 0.6 *\n ((modalState.touchShiftYPercent ?? 0) < 0 ? -1 : 1);\n translateY = rangeTranslate(translateY + expectTranslateY);\n\n if (modalState.settlingHeight !== 100) {\n if (numberInRange(translateY, modalState.expandedRange)) {\n translateY = modalState.expandedRange?.[0] ?? 0;\n } else if (numberInRange(translateY, modalState.collapsedRange)) {\n translateY = modalState.translateYFrom ?? 0;\n } else if (numberInRange(translateY, modalState.hiddenRange)) {\n translateY = 100;\n } else {\n translateY = modalState.translateYFrom ?? 0;\n }\n } else {\n if (numberInRange(translateY, [0, 25])) {\n translateY = 0;\n } else {\n translateY = 100;\n }\n }\n\n if (translateY !== 100 && shiftYEndPercent >= 75) {\n translateY = 100;\n }\n\n modalState.translateY = translateY;\n modalState.translateYCurrent = translateY;\n modalState.collapsed = translateY > 0 && translateY < shiftYEndPercent;\n modalState.expanded = translateY === 0;\n modalState.hidden = translateY === 100;\n\n if (modalState.hidden) {\n this.props.onExit();\n }\n\n setStateCallback = () => {\n if (!modalState.hidden) {\n this.animateTranslate(modalState, modalState.translateY);\n }\n\n this.setMaskOpacity(modalState);\n };\n }\n\n this.setState(\n {\n touchDown: false,\n dragging: false,\n },\n setStateCallback,\n );\n }\n\n onCardTouchEnd({ duration }: TouchEvent, modalState: ModalsStateEntry) {\n let setStateCallback;\n\n if (this.state.dragging) {\n let translateY = modalState.translateYCurrent ?? 0;\n\n const expectTranslateY =\n (translateY / duration) * 240 * 0.6 * ((modalState.touchShiftYPercent ?? 0) < 0 ? -1 : 1);\n translateY = Math.max(0, translateY + expectTranslateY);\n\n if (translateY >= 30) {\n translateY = 100;\n } else {\n translateY = 0;\n }\n\n modalState.translateY = translateY;\n modalState.hidden = translateY === 100;\n\n if (modalState.hidden) {\n this.props.onExit();\n }\n\n setStateCallback = () => {\n if (!modalState.hidden) {\n this.animateTranslate(modalState, modalState.translateY);\n }\n\n this.setMaskOpacity(modalState);\n };\n }\n\n this.setState(\n {\n touchDown: false,\n dragging: false,\n },\n setStateCallback,\n );\n }\n\n onScroll = (e: React.SyntheticEvent) => {\n const activeModal = this.props.activeModal;\n\n const target = e.target as HTMLElement;\n\n if (!activeModal) {\n return;\n }\n const modalState = this.props.getModalState(activeModal);\n if (modalState?.type === ModalType.PAGE && modalState?.contentElement?.contains(target)) {\n modalState.contentScrolled = true;\n\n if (modalState.contentScrollStopTimeout) {\n clearTimeout(modalState.contentScrollStopTimeout);\n }\n\n modalState.contentScrollStopTimeout = setTimeout(() => {\n if (modalState.contentScrolled) {\n modalState.contentScrolled = false;\n }\n }, 250);\n }\n };\n\n waitTransitionFinish(modalState: ModalsStateEntry | undefined, eventHandler: () => void) {\n if (transitionEvent.supported) {\n const onceHandler = () => {\n modalState?.innerElement?.removeEventListener(transitionEvent.name as string, onceHandler);\n eventHandler();\n };\n\n modalState?.innerElement?.addEventListener(transitionEvent.name as string, onceHandler);\n } else {\n setTimeout(eventHandler, this.timeout);\n }\n }\n\n /**\n * Анимирует сдвиг модалки\n *\n * @param {ModalsStateEntry} modalState\n * @param {number} percent Процент сдвига: 0 – полностью открыта, 100 – полностью закрыта\n */\n animateTranslate(modalState: ModalsStateEntry, percent: number | undefined) {\n const frameId = `animateTranslateFrame${modalState.id}`;\n\n cancelAnimationFrame(this.frameIds[frameId]);\n\n this.frameIds[frameId] = requestAnimationFrame(() => {\n setTransformStyle(modalState.innerElement, `translate3d(0, ${percent}%, 0)`);\n });\n }\n\n /* Устанавливает прозрачность для полупрозрачной подложки */\n setMaskOpacity(modalState: ModalsStateEntry, forceOpacity: number | null = null) {\n if (forceOpacity === null && this.props.history?.[0] !== modalState.id) {\n return;\n }\n if (this.maskAnimationFrame) {\n cancelAnimationFrame(this.maskAnimationFrame);\n }\n this.maskAnimationFrame = requestAnimationFrame(() => {\n if (this.maskElementRef.current) {\n const { translateY = 0, translateYCurrent = 0 } = modalState;\n\n const opacity =\n forceOpacity === null\n ? 1 - (translateYCurrent - translateY) / (100 - translateY) || 0\n : forceOpacity;\n this.maskElementRef.current.style.opacity = clamp(opacity, 0, 100).toString();\n }\n });\n }\n\n render() {\n const { activeModal, exitingModal, enteringModal } = this.props;\n const { touchDown, dragging } = this.state;\n\n if (!activeModal && !exitingModal) {\n return null;\n }\n\n return (\n <TouchRootContext.Provider value={true}>\n <ModalRootContext.Provider value={this.modalRootContext}>\n <Touch\n className={classNames(\n styles['ModalRoot'],\n this.props.configProvider?.webviewType === WebviewType.VKAPPS &&\n styles['ModalRoot--vkapps'],\n touchDown &&\n classNames(styles['ModalRoot--touched'], 'vkuiInternalModalRoot--touched'),\n !!(enteringModal || exitingModal) &&\n classNames(styles['ModalRoot--switching'], 'vkuiInternalModalRoot--switching'),\n )}\n onMove={this.onTouchMove}\n onEnd={this.onTouchEnd}\n onScroll={this.onScroll}\n >\n <div\n className={styles['ModalRoot__mask']}\n onClick={this.props.onExit}\n ref={this.maskElementRef}\n />\n <div className={styles['ModalRoot__viewport']} ref={this.viewportRef}>\n {this.getModals().map((Modal) => {\n const modalId = getNavId(Modal.props, warn);\n const _modalState = this.props.getModalState(modalId);\n if ((modalId !== activeModal && modalId !== exitingModal) || !_modalState) {\n return null;\n }\n const modalState = { ..._modalState };\n\n const isPage = modalState.type === ModalType.PAGE;\n const key = `modal-${modalId}`;\n\n return (\n <FocusTrap\n key={key}\n getRootRef={(e) => {\n const modalState = this.props.getModalState(modalId);\n if (modalState) {\n modalState.modalElement = e;\n }\n }}\n onClose={this.props.onExit}\n timeout={this.timeout}\n className={classNames(\n styles['ModalRoot__modal'],\n\n dragging && 'vkuiInternalModalRoot__modal--dragging',\n\n isPage && modalState.expandable && 'vkuiInternalModalRoot__modal--expandable',\n isPage && modalState.collapsed && 'vkuiInternalModalRoot__modal--collapsed',\n )}\n restoreFocus={false}\n >\n {Modal}\n </FocusTrap>\n );\n })}\n </div>\n </Touch>\n </ModalRootContext.Provider>\n </TouchRootContext.Provider>\n );\n }\n}\n\nexport const ModalRootTouch = withContext(\n withPlatform(\n withDOM<ModalRootWithDOMProps>(withModalManager(initModal)(ModalRootTouchComponent)),\n ),\n ConfigProviderContext,\n 'configProvider',\n);\n\n/**\n * Инициализирует модалку перед анимацией открытия\n */\nfunction initModal(modalState: ModalsStateEntry) {\n switch (modalState.type) {\n case ModalType.PAGE:\n modalState.settlingHeight = modalState.settlingHeight || MODAL_PAGE_DEFAULT_PERCENT_HEIGHT;\n return initPageModal(modalState);\n case ModalType.CARD:\n return initCardModal(modalState);\n default:\n process.env.NODE_ENV === 'development' &&\n warn(`initActiveModal: modalState.type=\"${modalState.type}\" не поддерживается`, 'error');\n }\n}\n\nfunction initPageModal(modalState: ModalsStateEntry) {\n const { contentElement } = modalState;\n const contentHeight = (contentElement?.firstElementChild as HTMLElement).offsetHeight;\n\n let prevTranslateY = modalState.translateY;\n\n modalState.expandable =\n contentHeight > (contentElement?.clientHeight ?? 0) || modalState.settlingHeight === 100;\n\n let collapsed = false;\n let expanded = false;\n let translateYFrom;\n let translateY;\n let expandedRange: TranslateRange;\n let collapsedRange: TranslateRange;\n let hiddenRange: TranslateRange;\n\n if (modalState.expandable) {\n translateYFrom = 100 - (modalState.settlingHeight ?? 0);\n\n const shiftHalf = translateYFrom / 2;\n const visiblePart = 100 - translateYFrom;\n\n expandedRange = [0, shiftHalf];\n collapsedRange = [shiftHalf, translateYFrom + visiblePart / 4];\n hiddenRange = [translateYFrom + visiblePart / 4, 100];\n\n collapsed = translateYFrom > 0;\n expanded = translateYFrom <= 0;\n translateY = translateYFrom;\n } else {\n const headerHeight = modalState.headerElement?.offsetHeight ?? 0;\n const height = contentHeight + headerHeight;\n\n translateYFrom =\n 100 - (height / (modalState.innerElement?.parentElement?.offsetHeight ?? 0)) * 100;\n translateY = translateYFrom;\n\n expandedRange = [translateY, translateY + 25];\n collapsedRange = [translateY + 25, translateY + 25];\n hiddenRange = [translateY + 25, translateY + 100];\n }\n\n // Если модалка может открываться на весь экран, и новый сдвиг больше предыдущего, то откроем её на весь экран\n if (\n (modalState.expandable && translateY > (prevTranslateY ?? 100)) ||\n modalState.settlingHeight === 100\n ) {\n translateY = 0;\n }\n\n // Если модалка уже раскрыта обновляем состояния\n if (translateY === 0) {\n expanded = true;\n collapsed = false;\n }\n\n modalState.expandedRange = expandedRange;\n modalState.collapsedRange = collapsedRange;\n modalState.hiddenRange = hiddenRange;\n modalState.translateY = translateY;\n modalState.translateYFrom = translateYFrom;\n modalState.collapsed = collapsed;\n modalState.expanded = expanded;\n}\n\nfunction initCardModal(modalState: ModalsStateEntry) {\n modalState.translateY = 0;\n}\n"],"names":["React","classNames","clamp","withContext","withPlatform","withDOM","getNavId","Platform","setTransformStyle","transitionEvent","rubber","warnOnce","ConfigProviderContext","WebviewType","FocusTrap","Touch","TouchRootContext","ModalRootContext","MODAL_PAGE_DEFAULT_PERCENT_HEIGHT","ModalType","withModalManager","styles","warn","numberInRange","number","range","rangeTranslate","ModalRootTouchComponent","Component","constructor","props","state","touchDown","dragging","modalOpenedLog","maskElementRef","createRef","modalRootContext","updateModalHeight","registerModal","id","data","Object","assign","getModalState","onClose","onExit","isInsideModal","frameIds","documentScrolling","viewportRef","maskAnimationFrame","undefined","restoreFocusTo","timeout","platform","IOS","document","window","getModals","Children","toArray","children","componentDidMount","addEventListener","componentWillUnmount","toggleDocumentScrolling","removeEventListener","componentDidUpdate","prevProps","exitingModal","closeModal","enteringModal","enteringState","onEnter","waitTransitionFinish","innerElement","style","transitionDelay","onEntered","delayEnter","animateTranslate","translateY","activeModal","activeElement","focus","enabled","preventTouch","passive","event","originalEvent","preventDefault","checkPageContentHeight","modalState","type","PAGE","modalElement","prevModalState","initPageModal","currentModalState","needAnimate","expandable","translateYFrom","requestAnimationFrame","setState","length","prevState","nextModalState","nextIsPage","prevIsPage","onExited","exitTranslate","isBack","setMaskOpacity","includes","onTouchMove","e","onPageTouchMove","CARD","onCardTouchMove","shiftY","target","isY","current","contains","stopPropagation","contentScrolled","collapsed","expanded","touchStartContentScrollTop","contentElement","scrollTop","touchMovePositive","headerElement","shiftYPercent","innerHeight","shiftYCurrent","touchShiftYPercent","translateYCurrent","offsetHeight","Math","max","onTouchEnd","onPageTouchEnd","onCardTouchEnd","startY","setStateCallback","shiftYEndPercent","expectTranslateY","duration","settlingHeight","expandedRange","collapsedRange","hiddenRange","hidden","onScroll","contentScrollStopTimeout","clearTimeout","setTimeout","eventHandler","supported","onceHandler","name","percent","frameId","cancelAnimationFrame","forceOpacity","history","opacity","toString","render","Provider","value","className","configProvider","webviewType","VKAPPS","onMove","onEnd","div","onClick","ref","map","Modal","modalId","_modalState","isPage","key","getRootRef","restoreFocus","ModalRootTouch","initModal","initCardModal","process","env","NODE_ENV","contentHeight","firstElementChild","prevTranslateY","clientHeight","shiftHalf","visiblePart","headerHeight","height","parentElement"],"mappings":"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"}
|
|
@@ -55,7 +55,8 @@ const sizeYClassNames = {
|
|
|
55
55
|
}, placeholder && /*#__PURE__*/ React.createElement("option", {
|
|
56
56
|
value: ""
|
|
57
57
|
}, placeholder), children), /*#__PURE__*/ React.createElement("div", {
|
|
58
|
-
className: styles['Select__container']
|
|
58
|
+
className: styles['Select__container'],
|
|
59
|
+
"aria-hidden": true
|
|
59
60
|
}, /*#__PURE__*/ React.createElement(SelectTypography, {
|
|
60
61
|
className: styles['Select__title'],
|
|
61
62
|
selectType: selectType
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/NativeSelect/NativeSelect.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useEnsuredControl } from '../../hooks/useEnsuredControl';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { SizeType } from '../../lib/adaptivity';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { HasAlign, HasRef, HasRootRef } from '../../types';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport { FormField, FormFieldProps } from '../FormField/FormField';\nimport type { SelectType } from '../Select/Select';\nimport { SelectTypography } from '../SelectTypography/SelectTypography';\nimport styles from '../Select/Select.module.css';\n\nconst sizeYClassNames = {\n none: styles['Select--sizeY-none'],\n [SizeType.COMPACT]: styles['Select--sizeY-compact'],\n};\n\nexport interface NativeSelectProps\n extends React.SelectHTMLAttributes<HTMLSelectElement>,\n HasRef<HTMLSelectElement>,\n HasRootRef<HTMLLabelElement>,\n HasAlign,\n Pick<FormFieldProps, 'before' | 'status'> {\n placeholder?: string;\n multiline?: boolean;\n selectType?: SelectType;\n /**\n * Иконка раскрывающегося списка\n */\n icon?: React.ReactNode;\n}\n\nexport interface SelectState {\n value?: React.SelectHTMLAttributes<HTMLSelectElement>['value'];\n title?: string;\n notSelected?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/NativeSelect\n */\nconst NativeSelect = ({\n style,\n defaultValue = '',\n align,\n placeholder,\n children,\n className,\n getRef,\n getRootRef,\n disabled,\n multiline,\n selectType = 'default',\n status,\n icon = <DropdownIcon />,\n before,\n onChange: onChangeProp,\n value: valueProp,\n ...restProps\n}: NativeSelectProps) => {\n const [title, setTitle] = React.useState('');\n const [empty, setEmpty] = React.useState(false);\n const [value, onChange] = useEnsuredControl({\n defaultValue,\n disabled,\n onChange: onChangeProp,\n value: valueProp,\n });\n const selectRef = useExternRef(getRef);\n const { sizeY = 'none' } = useAdaptivity();\n\n useIsomorphicLayoutEffect(() => {\n const selectedOption = selectRef.current?.options[selectRef.current.selectedIndex];\n if (selectedOption) {\n setTitle(selectedOption.text);\n setEmpty(selectedOption.value === '' && placeholder != null);\n }\n }, [value, children]);\n\n return (\n <FormField\n Component=\"label\"\n className={classNames(\n styles['Select'],\n 'vkuiInternalNativeSelect',\n before && styles['Select--hasBefore'],\n empty && styles['Select--empty'],\n multiline && styles['Select--multiline'],\n align === 'center' && styles['Select--align-center'],\n align === 'right' && styles['Select--align-right'],\n sizeY !== SizeType.REGULAR && sizeYClassNames[sizeY],\n className,\n )}\n style={style}\n getRootRef={getRootRef}\n disabled={disabled}\n before={before}\n after={icon}\n status={status}\n >\n <select\n {...restProps}\n disabled={disabled}\n className={styles['Select__el']}\n onChange={onChange}\n value={value}\n ref={selectRef}\n >\n {placeholder && <option value=\"\">{placeholder}</option>}\n {children}\n </select>\n <div className={styles['Select__container']}>\n <SelectTypography className={styles['Select__title']} selectType={selectType}>\n {title}\n </SelectTypography>\n </div>\n </FormField>\n );\n};\n\nexport { NativeSelect };\n"],"names":["React","classNames","useAdaptivity","useEnsuredControl","useExternRef","SizeType","useIsomorphicLayoutEffect","DropdownIcon","FormField","SelectTypography","styles","sizeYClassNames","none","COMPACT","NativeSelect","style","defaultValue","align","placeholder","children","className","getRef","getRootRef","disabled","multiline","selectType","status","icon","before","onChange","onChangeProp","value","valueProp","restProps","title","setTitle","useState","empty","setEmpty","selectRef","sizeY","selectedOption","current","options","selectedIndex","text","Component","REGULAR","after","select","ref","option","div"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,iBAAiB,QAAQ,gCAAgC;AAClE,SAASC,YAAY,QAAQ,2BAA2B;AACxD,SAASC,QAAQ,QAAQ,uBAAuB;AAChD,SAASC,yBAAyB,QAAQ,sCAAsC;AAEhF,SAASC,YAAY,QAAQ,+BAA+B;AAC5D,SAASC,SAAS,QAAwB,yBAAyB;AAEnE,SAASC,gBAAgB,QAAQ,uCAAuC;AACxE,OAAOC,YAAY,8BAA8B;AAEjD,MAAMC,kBAAkB;IACtBC,MAAMF,MAAM,CAAC,qBAAqB;IAClC,CAACL,SAASQ,OAAO,CAAC,EAAEH,MAAM,CAAC,wBAAwB;AACrD;AAuBA;;CAEC,GACD,MAAMI,eAAe,CAAC,EACpBC,MAAK,EACLC,cAAe,GAAE,EACjBC,MAAK,EACLC,YAAW,EACXC,SAAQ,EACRC,UAAS,EACTC,OAAM,EACNC,WAAU,EACVC,SAAQ,EACRC,UAAS,EACTC,YAAa,UAAS,EACtBC,OAAM,EACNC,oBAAO,oBAACpB,oBAAe,EACvBqB,OAAM,EACNC,UAAUC,aAAY,EACtBC,OAAOC,UAAS,EAChB,GAAGC,WACe,GAAK;IACvB,MAAM,CAACC,OAAOC,SAAS,GAAGnC,MAAMoC,QAAQ,CAAC;IACzC,MAAM,CAACC,OAAOC,SAAS,GAAGtC,MAAMoC,QAAQ,CAAC,KAAK;IAC9C,MAAM,CAACL,OAAOF,SAAS,GAAG1B,kBAAkB;QAC1Ca;QACAO;QACAM,UAAUC;QACVC,OAAOC;IACT;IACA,MAAMO,YAAYnC,aAAaiB;IAC/B,MAAM,EAAEmB,OAAQ,OAAM,EAAE,GAAGtC;IAE3BI,0BAA0B,IAAM;QAC9B,MAAMmC,iBAAiBF,UAAUG,OAAO,EAAEC,OAAO,CAACJ,UAAUG,OAAO,CAACE,aAAa,CAAC;QAClF,IAAIH,gBAAgB;YAClBN,SAASM,eAAeI,IAAI;YAC5BP,SAASG,eAAeV,KAAK,KAAK,MAAMb,eAAe,IAAI;QAC7D,CAAC;IACH,GAAG;QAACa;QAAOZ;KAAS;IAEpB,qBACE,oBAACX;QACCsC,WAAU;QACV1B,WAAWnB,WACTS,MAAM,CAAC,SAAS,EAChB,4BACAkB,UAAUlB,MAAM,CAAC,oBAAoB,EACrC2B,SAAS3B,MAAM,CAAC,gBAAgB,EAChCc,aAAad,MAAM,CAAC,oBAAoB,EACxCO,UAAU,YAAYP,MAAM,CAAC,uBAAuB,EACpDO,UAAU,WAAWP,MAAM,CAAC,sBAAsB,EAClD8B,UAAUnC,SAAS0C,OAAO,IAAIpC,eAAe,CAAC6B,MAAM,EACpDpB;QAEFL,OAAOA;QACPO,YAAYA;QACZC,UAAUA;QACVK,QAAQA;QACRoB,OAAOrB;QACPD,QAAQA;qBAER,oBAACuB;QACE,GAAGhB,SAAS;QACbV,UAAUA;QACVH,WAAWV,MAAM,CAAC,aAAa;QAC/BmB,UAAUA;QACVE,OAAOA;QACPmB,KAAKX;OAEJrB,6BAAe,oBAACiC;QAAOpB,OAAM;OAAIb,cACjCC,yBAEH,oBAACiC;QAAIhC,WAAWV,MAAM,CAAC,oBAAoB;
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/NativeSelect/NativeSelect.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useEnsuredControl } from '../../hooks/useEnsuredControl';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { SizeType } from '../../lib/adaptivity';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { HasAlign, HasRef, HasRootRef } from '../../types';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport { FormField, FormFieldProps } from '../FormField/FormField';\nimport type { SelectType } from '../Select/Select';\nimport { SelectTypography } from '../SelectTypography/SelectTypography';\nimport styles from '../Select/Select.module.css';\n\nconst sizeYClassNames = {\n none: styles['Select--sizeY-none'],\n [SizeType.COMPACT]: styles['Select--sizeY-compact'],\n};\n\nexport interface NativeSelectProps\n extends React.SelectHTMLAttributes<HTMLSelectElement>,\n HasRef<HTMLSelectElement>,\n HasRootRef<HTMLLabelElement>,\n HasAlign,\n Pick<FormFieldProps, 'before' | 'status'> {\n placeholder?: string;\n multiline?: boolean;\n selectType?: SelectType;\n /**\n * Иконка раскрывающегося списка\n */\n icon?: React.ReactNode;\n}\n\nexport interface SelectState {\n value?: React.SelectHTMLAttributes<HTMLSelectElement>['value'];\n title?: string;\n notSelected?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/NativeSelect\n */\nconst NativeSelect = ({\n style,\n defaultValue = '',\n align,\n placeholder,\n children,\n className,\n getRef,\n getRootRef,\n disabled,\n multiline,\n selectType = 'default',\n status,\n icon = <DropdownIcon />,\n before,\n onChange: onChangeProp,\n value: valueProp,\n ...restProps\n}: NativeSelectProps) => {\n const [title, setTitle] = React.useState('');\n const [empty, setEmpty] = React.useState(false);\n const [value, onChange] = useEnsuredControl({\n defaultValue,\n disabled,\n onChange: onChangeProp,\n value: valueProp,\n });\n const selectRef = useExternRef(getRef);\n const { sizeY = 'none' } = useAdaptivity();\n\n useIsomorphicLayoutEffect(() => {\n const selectedOption = selectRef.current?.options[selectRef.current.selectedIndex];\n if (selectedOption) {\n setTitle(selectedOption.text);\n setEmpty(selectedOption.value === '' && placeholder != null);\n }\n }, [value, children]);\n\n return (\n <FormField\n Component=\"label\"\n className={classNames(\n styles['Select'],\n 'vkuiInternalNativeSelect',\n before && styles['Select--hasBefore'],\n empty && styles['Select--empty'],\n multiline && styles['Select--multiline'],\n align === 'center' && styles['Select--align-center'],\n align === 'right' && styles['Select--align-right'],\n sizeY !== SizeType.REGULAR && sizeYClassNames[sizeY],\n className,\n )}\n style={style}\n getRootRef={getRootRef}\n disabled={disabled}\n before={before}\n after={icon}\n status={status}\n >\n <select\n {...restProps}\n disabled={disabled}\n className={styles['Select__el']}\n onChange={onChange}\n value={value}\n ref={selectRef}\n >\n {placeholder && <option value=\"\">{placeholder}</option>}\n {children}\n </select>\n <div className={styles['Select__container']} aria-hidden>\n <SelectTypography className={styles['Select__title']} selectType={selectType}>\n {title}\n </SelectTypography>\n </div>\n </FormField>\n );\n};\n\nexport { NativeSelect };\n"],"names":["React","classNames","useAdaptivity","useEnsuredControl","useExternRef","SizeType","useIsomorphicLayoutEffect","DropdownIcon","FormField","SelectTypography","styles","sizeYClassNames","none","COMPACT","NativeSelect","style","defaultValue","align","placeholder","children","className","getRef","getRootRef","disabled","multiline","selectType","status","icon","before","onChange","onChangeProp","value","valueProp","restProps","title","setTitle","useState","empty","setEmpty","selectRef","sizeY","selectedOption","current","options","selectedIndex","text","Component","REGULAR","after","select","ref","option","div","aria-hidden"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,aAAa,QAAQ,4BAA4B;AAC1D,SAASC,iBAAiB,QAAQ,gCAAgC;AAClE,SAASC,YAAY,QAAQ,2BAA2B;AACxD,SAASC,QAAQ,QAAQ,uBAAuB;AAChD,SAASC,yBAAyB,QAAQ,sCAAsC;AAEhF,SAASC,YAAY,QAAQ,+BAA+B;AAC5D,SAASC,SAAS,QAAwB,yBAAyB;AAEnE,SAASC,gBAAgB,QAAQ,uCAAuC;AACxE,OAAOC,YAAY,8BAA8B;AAEjD,MAAMC,kBAAkB;IACtBC,MAAMF,MAAM,CAAC,qBAAqB;IAClC,CAACL,SAASQ,OAAO,CAAC,EAAEH,MAAM,CAAC,wBAAwB;AACrD;AAuBA;;CAEC,GACD,MAAMI,eAAe,CAAC,EACpBC,MAAK,EACLC,cAAe,GAAE,EACjBC,MAAK,EACLC,YAAW,EACXC,SAAQ,EACRC,UAAS,EACTC,OAAM,EACNC,WAAU,EACVC,SAAQ,EACRC,UAAS,EACTC,YAAa,UAAS,EACtBC,OAAM,EACNC,oBAAO,oBAACpB,oBAAe,EACvBqB,OAAM,EACNC,UAAUC,aAAY,EACtBC,OAAOC,UAAS,EAChB,GAAGC,WACe,GAAK;IACvB,MAAM,CAACC,OAAOC,SAAS,GAAGnC,MAAMoC,QAAQ,CAAC;IACzC,MAAM,CAACC,OAAOC,SAAS,GAAGtC,MAAMoC,QAAQ,CAAC,KAAK;IAC9C,MAAM,CAACL,OAAOF,SAAS,GAAG1B,kBAAkB;QAC1Ca;QACAO;QACAM,UAAUC;QACVC,OAAOC;IACT;IACA,MAAMO,YAAYnC,aAAaiB;IAC/B,MAAM,EAAEmB,OAAQ,OAAM,EAAE,GAAGtC;IAE3BI,0BAA0B,IAAM;QAC9B,MAAMmC,iBAAiBF,UAAUG,OAAO,EAAEC,OAAO,CAACJ,UAAUG,OAAO,CAACE,aAAa,CAAC;QAClF,IAAIH,gBAAgB;YAClBN,SAASM,eAAeI,IAAI;YAC5BP,SAASG,eAAeV,KAAK,KAAK,MAAMb,eAAe,IAAI;QAC7D,CAAC;IACH,GAAG;QAACa;QAAOZ;KAAS;IAEpB,qBACE,oBAACX;QACCsC,WAAU;QACV1B,WAAWnB,WACTS,MAAM,CAAC,SAAS,EAChB,4BACAkB,UAAUlB,MAAM,CAAC,oBAAoB,EACrC2B,SAAS3B,MAAM,CAAC,gBAAgB,EAChCc,aAAad,MAAM,CAAC,oBAAoB,EACxCO,UAAU,YAAYP,MAAM,CAAC,uBAAuB,EACpDO,UAAU,WAAWP,MAAM,CAAC,sBAAsB,EAClD8B,UAAUnC,SAAS0C,OAAO,IAAIpC,eAAe,CAAC6B,MAAM,EACpDpB;QAEFL,OAAOA;QACPO,YAAYA;QACZC,UAAUA;QACVK,QAAQA;QACRoB,OAAOrB;QACPD,QAAQA;qBAER,oBAACuB;QACE,GAAGhB,SAAS;QACbV,UAAUA;QACVH,WAAWV,MAAM,CAAC,aAAa;QAC/BmB,UAAUA;QACVE,OAAOA;QACPmB,KAAKX;OAEJrB,6BAAe,oBAACiC;QAAOpB,OAAM;OAAIb,cACjCC,yBAEH,oBAACiC;QAAIhC,WAAWV,MAAM,CAAC,oBAAoB;QAAE2C,eAAAA,IAAW;qBACtD,oBAAC5C;QAAiBW,WAAWV,MAAM,CAAC,gBAAgB;QAAEe,YAAYA;OAC/DS;AAKX;AAEA,SAASpB,YAAY,GAAG"}
|