@vkontakte/vkui 5.5.2 → 5.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/ChipsSelect/ChipsSelect.js +13 -9
- package/dist/cjs/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/cjs/components/CustomSelect/CustomSelect.js +23 -17
- package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cjs/components/FixedLayout/FixedLayout.d.ts +6 -1
- package/dist/cjs/components/FixedLayout/FixedLayout.js +11 -4
- package/dist/cjs/components/FixedLayout/FixedLayout.js.map +1 -1
- package/dist/cjs/components/Group/Group.js +7 -5
- package/dist/cjs/components/Group/Group.js.map +1 -1
- package/dist/cjs/components/Header/Header.js +2 -2
- package/dist/cjs/components/Header/Header.js.map +1 -1
- package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js +7 -7
- package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
- package/dist/cjs/components/ImageBase/ImageBase.d.ts +2 -2
- package/dist/cjs/components/ImageBase/ImageBase.js.map +1 -1
- package/dist/cjs/components/PullToRefresh/PullToRefresh.js +2 -1
- package/dist/cjs/components/PullToRefresh/PullToRefresh.js.map +1 -1
- package/dist/cjs/components/ScreenSpinner/ScreenSpinner.js +3 -3
- package/dist/cjs/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
- package/dist/cjs/components/Select/Select.d.ts +1 -1
- package/dist/cjs/components/Select/Select.js +22 -11
- package/dist/cjs/components/Select/Select.js.map +1 -1
- package/dist/cjs/components/Spinner/Spinner.d.ts +1 -1
- package/dist/cjs/components/Spinner/Spinner.js +14 -4
- package/dist/cjs/components/Spinner/Spinner.js.map +1 -1
- package/dist/cjs/components/Tappable/Tappable.d.ts +4 -4
- package/dist/cjs/components/Tappable/Tappable.js.map +1 -1
- package/dist/cjs/hooks/useAutoDetectAppearance.js +9 -13
- package/dist/cjs/hooks/useAutoDetectAppearance.js.map +1 -1
- package/dist/cjs/lib/platform.d.ts +2 -1
- package/dist/cjs/lib/platform.js.map +1 -1
- package/dist/cjs/types.d.ts +12 -0
- package/dist/cjs/types.js.map +1 -1
- package/dist/components/ChipsSelect/ChipsSelect.js +13 -9
- package/dist/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.js +23 -17
- package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/components/FixedLayout/FixedLayout.d.ts +6 -1
- package/dist/components/FixedLayout/FixedLayout.js +11 -4
- package/dist/components/FixedLayout/FixedLayout.js.map +1 -1
- package/dist/components/Group/Group.js +7 -5
- package/dist/components/Group/Group.js.map +1 -1
- package/dist/components/Header/Header.js +2 -2
- package/dist/components/Header/Header.js.map +1 -1
- package/dist/components/HorizontalScroll/HorizontalScroll.js +7 -7
- package/dist/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
- package/dist/components/ImageBase/ImageBase.d.ts +2 -2
- package/dist/components/ImageBase/ImageBase.js.map +1 -1
- package/dist/components/PullToRefresh/PullToRefresh.js +2 -1
- package/dist/components/PullToRefresh/PullToRefresh.js.map +1 -1
- package/dist/components/ScreenSpinner/ScreenSpinner.js +3 -3
- package/dist/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
- package/dist/components/Select/Select.d.ts +1 -1
- package/dist/components/Select/Select.js +22 -11
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/Spinner/Spinner.d.ts +1 -1
- package/dist/components/Spinner/Spinner.js +14 -4
- package/dist/components/Spinner/Spinner.js.map +1 -1
- package/dist/components/Tappable/Tappable.d.ts +4 -4
- package/dist/components/Tappable/Tappable.js.map +1 -1
- package/dist/components.css +6 -6
- package/dist/components.css.map +1 -1
- package/dist/components.js.tmp +751 -739
- package/dist/cssm/components/ChipsSelect/ChipsSelect.js +13 -9
- package/dist/cssm/components/ChipsSelect/ChipsSelect.js.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelect.js +22 -16
- package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cssm/components/FixedLayout/FixedLayout.d.ts +6 -1
- package/dist/cssm/components/FixedLayout/FixedLayout.js +8 -3
- package/dist/cssm/components/FixedLayout/FixedLayout.js.map +1 -1
- package/dist/cssm/components/Group/Group.js +6 -4
- package/dist/cssm/components/Group/Group.js.map +1 -1
- package/dist/cssm/components/Group/Group.module.css +34 -30
- package/dist/cssm/components/Header/Header.js +2 -2
- package/dist/cssm/components/Header/Header.js.map +1 -1
- package/dist/cssm/components/Header/Header.module.css +7 -9
- package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js +7 -7
- package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
- package/dist/cssm/components/HorizontalScroll/HorizontalScroll.module.css +2 -0
- package/dist/cssm/components/ImageBase/ImageBase.d.ts +2 -2
- package/dist/cssm/components/ImageBase/ImageBase.js.map +1 -1
- package/dist/cssm/components/PullToRefresh/PullToRefresh.js +2 -1
- package/dist/cssm/components/PullToRefresh/PullToRefresh.js.map +1 -1
- package/dist/cssm/components/ScreenSpinner/ScreenSpinner.js +3 -3
- package/dist/cssm/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
- package/dist/cssm/components/ScreenSpinner/ScreenSpinner.module.css +4 -4
- package/dist/cssm/components/Select/Select.d.ts +1 -1
- package/dist/cssm/components/Select/Select.js +4 -9
- package/dist/cssm/components/Select/Select.js.map +1 -1
- package/dist/cssm/components/Spinner/Spinner.d.ts +1 -1
- package/dist/cssm/components/Spinner/Spinner.js +12 -3
- package/dist/cssm/components/Spinner/Spinner.js.map +1 -1
- package/dist/cssm/components/Tappable/Tappable.d.ts +4 -4
- package/dist/cssm/components/Tappable/Tappable.js.map +1 -1
- package/dist/cssm/hooks/useAutoDetectAppearance.js +9 -13
- package/dist/cssm/hooks/useAutoDetectAppearance.js.map +1 -1
- package/dist/cssm/lib/platform.d.ts +2 -1
- package/dist/cssm/lib/platform.js.map +1 -1
- package/dist/cssm/styles/constants.css +3 -0
- package/dist/cssm/types.d.ts +12 -0
- package/dist/cssm/types.js.map +1 -1
- package/dist/hooks/useAutoDetectAppearance.js +9 -13
- package/dist/hooks/useAutoDetectAppearance.js.map +1 -1
- package/dist/lib/platform.d.ts +2 -1
- package/dist/lib/platform.js.map +1 -1
- package/dist/types.d.ts +12 -0
- package/dist/types.js.map +1 -1
- package/dist/vkui.css +6 -6
- package/dist/vkui.css.map +1 -1
- package/dist/vkui.js.tmp +751 -739
- package/package.json +1 -1
|
@@ -156,15 +156,19 @@ var ChipsSelect = function(props) {
|
|
|
156
156
|
focusOption(focusedOptionIndex, FOCUS_ACTION_NEXT);
|
|
157
157
|
}
|
|
158
158
|
}
|
|
159
|
-
if (e.key === "Enter" && !e.defaultPrevented && opened
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
159
|
+
if (e.key === "Enter" && !e.defaultPrevented && opened) {
|
|
160
|
+
if (focusedOptionIndex != null) {
|
|
161
|
+
var option = filteredOptions[focusedOptionIndex];
|
|
162
|
+
if (option) {
|
|
163
|
+
onChangeStart(e, option);
|
|
164
|
+
if (!e.defaultPrevented) {
|
|
165
|
+
addOption(option);
|
|
166
|
+
setFocusedOptionIndex(null);
|
|
167
|
+
clearInput();
|
|
168
|
+
closeAfterSelect && setOpened(false);
|
|
169
|
+
e.preventDefault();
|
|
170
|
+
}
|
|
171
|
+
} else if (!creatable) {
|
|
168
172
|
e.preventDefault();
|
|
169
173
|
}
|
|
170
174
|
} else if (!creatable) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/ChipsSelect/ChipsSelect.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport { useChipsSelect } from '../../hooks/useChipsSelect';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useGlobalEventListener } from '../../hooks/useGlobalEventListener';\nimport { useDOM } from '../../lib/dom';\nimport type { Placement } from '../../lib/floating';\nimport { defaultFilterFn } from '../../lib/select';\nimport { ChipOption, ChipValue, RenderChip } from '../Chip/Chip';\nimport { ChipsInputProps } from '../ChipsInput/ChipsInput';\nimport { ChipsInputBase, chipsInputDefaultProps } from '../ChipsInputBase/ChipsInputBase';\nimport { CustomSelectDropdown } from '../CustomSelectDropdown/CustomSelectDropdown';\nimport {\n CustomSelectOption,\n CustomSelectOptionProps,\n} from '../CustomSelectOption/CustomSelectOption';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport { FormField } from '../FormField/FormField';\nimport { IconButton } from '../IconButton/IconButton';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport styles from './ChipsSelect.module.css';\n\nexport interface ChipsSelectProps<Option extends ChipOption>\n extends Omit<ChipsInputProps<Option>, 'after'> {\n popupDirection?: 'top' | 'bottom';\n options?: Option[];\n filterFn?:\n | false\n | ((\n value?: string,\n option?: Option,\n getOptionLabel?: Pick<ChipsInputProps<Option>, 'getOptionLabel'>['getOptionLabel'],\n ) => boolean);\n /**\n * Возможность создавать чипы которых нет в списке (по enter или с помощью пункта в меню, см creatableText)\n */\n creatable?: boolean;\n /**\n * Отрисовка лоадера вместо списка опций в выпадающем списке\n */\n fetching?: boolean;\n renderOption?: (props: CustomSelectOptionProps) => React.ReactNode;\n /**\n * Показывать или скрывать уже выбранные опции\n */\n showSelected?: boolean;\n /**\n * Текст для пункта создающего чипы при клике, так же отвечает за то будет ли показан этот пункт (показывается после того как в списке не отсанется опций)\n */\n creatableText?: string;\n /**\n * Текст который показывается если список опций пуст\n */\n emptyText?: string;\n /**\n * Событие срабатывающее перед onChange\n */\n onChangeStart?: (e: React.MouseEvent | React.KeyboardEvent, option: Option) => void;\n /**\n * Закрытие выпадающего списка после выбора элемента\n */\n closeAfterSelect?: boolean;\n fixDropdownWidth?: boolean;\n forceDropdownPortal?: boolean;\n /**\n * Иконка раскрывающегося списка\n */\n icon?: React.ReactNode;\n}\n\ntype FocusActionType = 'next' | 'prev';\n\nconst FOCUS_ACTION_NEXT: FocusActionType = 'next';\nconst FOCUS_ACTION_PREV: FocusActionType = 'prev';\n\nconst chipsSelectDefaultProps: ChipsSelectProps<any> = {\n ...chipsInputDefaultProps,\n emptyText: 'Ничего не найдено',\n creatableText: 'Создать значение',\n onChangeStart: noop,\n creatable: false,\n fetching: false,\n showSelected: true,\n closeAfterSelect: true,\n options: [],\n filterFn: defaultFilterFn,\n renderOption(props) {\n return <CustomSelectOption {...props} />;\n },\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ChipsSelect\n */\nexport const ChipsSelect = <Option extends ChipOption>(props: ChipsSelectProps<Option>) => {\n const propsWithDefault = { ...chipsSelectDefaultProps, ...props };\n const {\n style,\n onFocus,\n onKeyDown,\n className,\n fetching,\n renderOption,\n emptyText,\n getRef,\n getRootRef,\n disabled,\n placeholder,\n tabIndex,\n getOptionValue,\n getOptionLabel,\n showSelected,\n getNewOptionData,\n renderChip,\n popupDirection,\n creatable,\n filterFn,\n inputValue,\n creatableText,\n closeAfterSelect,\n onChangeStart,\n before,\n icon,\n options,\n fixDropdownWidth,\n forceDropdownPortal,\n ...restProps\n } = propsWithDefault;\n\n const { document } = useDOM();\n\n const [popperPlacement, setPopperPlacement] = React.useState<Placement | undefined>(undefined);\n\n const scrollBoxRef = React.useRef<HTMLDivElement>(null);\n const rootRef = useExternRef(getRef);\n const {\n fieldValue,\n selectedOptions = [],\n opened,\n setOpened,\n addOptionFromInput,\n filteredOptions,\n addOption,\n handleInputChange,\n clearInput,\n focusedOption,\n setFocusedOption,\n focusedOptionIndex,\n setFocusedOptionIndex,\n } = useChipsSelect(propsWithDefault);\n\n const showCreatable = Boolean(\n creatable && creatableText && !filteredOptions.length && fieldValue,\n );\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setOpened(true);\n setFocusedOptionIndex(null);\n onFocus!(e);\n };\n\n const handleClickOutside = (e: MouseEvent) => {\n if (e.target !== rootRef.current && !rootRef.current?.contains(e.target as Node)) {\n setOpened(false);\n }\n };\n\n const chipsSelectOptions = React.useRef<HTMLElement[]>([]).current;\n\n const scrollToElement = (index: number, center = false) => {\n const dropdown = scrollBoxRef.current;\n const item = chipsSelectOptions[index];\n\n if (!item || !dropdown) {\n return;\n }\n\n const dropdownHeight = dropdown.offsetHeight;\n const scrollTop = dropdown.scrollTop;\n const itemTop = item.offsetTop;\n const itemHeight = item.offsetHeight;\n\n if (center) {\n dropdown.scrollTop = itemTop - dropdownHeight / 2 + itemHeight / 2;\n } else if (itemTop + itemHeight > dropdownHeight + scrollTop) {\n dropdown.scrollTop = itemTop - dropdownHeight + itemHeight;\n } else if (itemTop < scrollTop) {\n dropdown.scrollTop = itemTop;\n }\n };\n\n const focusOptionByIndex = (index: number, oldIndex: number | null) => {\n const { length } = filteredOptions;\n\n if (index < 0) {\n index = length - 1;\n } else if (index >= length) {\n index = 0;\n }\n\n if (index === oldIndex) {\n return;\n }\n\n scrollToElement(index);\n setFocusedOptionIndex(index);\n };\n\n const focusOption = (nextIndex: number | null, type: FocusActionType) => {\n let index = nextIndex === null ? -1 : nextIndex;\n\n if (type === FOCUS_ACTION_NEXT) {\n index = index + 1;\n } else if (type === FOCUS_ACTION_PREV) {\n index = index - 1;\n }\n\n focusOptionByIndex(index, focusedOptionIndex);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDown!(e);\n\n if (e.key === 'ArrowUp' && !e.defaultPrevented) {\n e.preventDefault();\n\n if (!opened) {\n setOpened(true);\n setFocusedOptionIndex(0);\n } else {\n focusOption(focusedOptionIndex, FOCUS_ACTION_PREV);\n }\n }\n\n if (e.key === 'ArrowDown' && !e.defaultPrevented) {\n e.preventDefault();\n\n if (!opened) {\n setOpened(true);\n setFocusedOptionIndex(0);\n } else {\n focusOption(focusedOptionIndex, FOCUS_ACTION_NEXT);\n }\n }\n\n if (e.key === 'Enter' && !e.defaultPrevented && opened && focusedOptionIndex != null) {\n const option = filteredOptions[focusedOptionIndex];\n\n if (option) {\n onChangeStart!(e, option);\n\n if (!e.defaultPrevented) {\n addOption(option);\n setFocusedOptionIndex(null);\n clearInput();\n closeAfterSelect && setOpened(false);\n e.preventDefault();\n }\n } else if (!creatable) {\n e.preventDefault();\n }\n }\n\n if (['Escape', 'Tab'].includes(e.key) && !e.defaultPrevented && opened) {\n setOpened(false);\n }\n };\n\n React.useEffect(() => {\n if (focusedOptionIndex != null && filteredOptions[focusedOptionIndex]) {\n setFocusedOption(filteredOptions[focusedOptionIndex]);\n } else if (focusedOptionIndex === null || focusedOptionIndex === 0) {\n setFocusedOption(null);\n }\n }, [focusedOptionIndex, filteredOptions, setFocusedOption]);\n\n useGlobalEventListener(document, 'click', handleClickOutside);\n\n const renderChipWrapper = (renderChipProps: RenderChip<Option> | undefined) => {\n if (renderChipProps === undefined) {\n return null;\n }\n const onRemoveWrapper = (e: React.MouseEvent | undefined, value: ChipValue | undefined) => {\n e?.preventDefault();\n e?.stopPropagation();\n\n renderChipProps.onRemove?.(e, value);\n };\n\n return renderChip!({\n ...renderChipProps,\n onRemove: onRemoveWrapper,\n });\n };\n\n const isPopperDirectionTop = popperPlacement?.includes('top');\n\n const onPlacementChange = React.useCallback(\n (placement?: Placement) => {\n setPopperPlacement(placement);\n },\n [setPopperPlacement],\n );\n\n const onDropdownMouseLeave = React.useCallback(() => {\n setFocusedOptionIndex(null);\n }, [setFocusedOptionIndex]);\n\n const toggleOpened = () => {\n setOpened((prevOpened) => !prevOpened);\n };\n\n return (\n <>\n <FormField\n getRootRef={rootRef}\n style={style}\n className={classNames(\n styles['ChipsSelect'],\n opened &&\n (isPopperDirectionTop\n ? styles['ChipsSelect--pop-up']\n : styles['ChipsSelect--pop-down']),\n className,\n )}\n disabled={disabled}\n role=\"application\"\n aria-disabled={disabled}\n aria-readonly={restProps.readOnly}\n after={\n <IconButton\n className={styles['ChipsSelect__dropdown']}\n activeMode=\"\"\n hoverMode=\"\"\n // TODO: add label customization\n aria-label={opened ? 'Скрыть' : 'Развернуть'}\n onClick={toggleOpened}\n >\n {icon ?? <DropdownIcon className={styles['ChipsSelect__icon']} opened={opened} />}\n </IconButton>\n }\n before={before}\n >\n <ChipsInputBase\n {...restProps}\n tabIndex={tabIndex}\n value={selectedOptions}\n inputValue={fieldValue}\n getNewOptionData={getNewOptionData}\n getOptionLabel={getOptionLabel}\n getOptionValue={getOptionValue}\n renderChip={renderChipWrapper}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n getRef={getRef}\n disabled={disabled}\n onInputChange={handleInputChange}\n />\n </FormField>\n {opened && (\n <CustomSelectDropdown\n targetRef={rootRef}\n placement={popupDirection}\n scrollBoxRef={scrollBoxRef}\n onPlacementChange={onPlacementChange}\n onMouseLeave={onDropdownMouseLeave}\n fetching={fetching}\n sameWidth={fixDropdownWidth}\n forcePortal={forceDropdownPortal}\n >\n {showCreatable && (\n <CustomSelectOption\n hovered={focusedOptionIndex === 0}\n onMouseDown={addOptionFromInput}\n onMouseEnter={() => setFocusedOptionIndex(0)}\n >\n {creatableText}\n </CustomSelectOption>\n )}\n {!filteredOptions?.length && !showCreatable && emptyText ? (\n <Footnote className={styles['ChipsSelect__empty']}>{emptyText}</Footnote>\n ) : (\n filteredOptions.map((option: Option, index: number) => {\n const label = getOptionLabel!(option);\n const hovered =\n focusedOption && getOptionValue!(option) === getOptionValue!(focusedOption);\n const selected = selectedOptions.find((selectedOption: Option) => {\n return getOptionValue!(selectedOption) === getOptionValue!(option);\n });\n const value = getOptionValue!(option);\n\n return (\n <React.Fragment key={`${typeof value}-${value}`}>\n {renderOption!({\n option,\n hovered: Boolean(hovered),\n children: label,\n selected: !!selected,\n getRootRef: (e) => {\n if (e) {\n return (chipsSelectOptions[index] = e);\n }\n return undefined;\n },\n onMouseDown: (e: React.MouseEvent<HTMLDivElement>) => {\n onChangeStart?.(e, option);\n\n if (!e.defaultPrevented) {\n closeAfterSelect && setOpened(false);\n addOption(option);\n clearInput();\n }\n },\n onMouseEnter: () => setFocusedOptionIndex(index),\n })}\n </React.Fragment>\n );\n })\n )}\n </CustomSelectDropdown>\n )}\n </>\n );\n};\n"],"names":["ChipsSelect","FOCUS_ACTION_NEXT","FOCUS_ACTION_PREV","chipsSelectDefaultProps","chipsInputDefaultProps","emptyText","creatableText","onChangeStart","noop","creatable","fetching","showSelected","closeAfterSelect","options","filterFn","defaultFilterFn","renderOption","props","CustomSelectOption","propsWithDefault","style","onFocus","onKeyDown","className","getRef","getRootRef","disabled","placeholder","tabIndex","getOptionValue","getOptionLabel","getNewOptionData","renderChip","popupDirection","inputValue","before","icon","fixDropdownWidth","forceDropdownPortal","restProps","document","useDOM","React","useState","undefined","popperPlacement","setPopperPlacement","scrollBoxRef","useRef","rootRef","useExternRef","useChipsSelect","fieldValue","selectedOptions","opened","setOpened","addOptionFromInput","filteredOptions","addOption","handleInputChange","clearInput","focusedOption","setFocusedOption","focusedOptionIndex","setFocusedOptionIndex","showCreatable","Boolean","length","handleFocus","e","handleClickOutside","target","current","contains","chipsSelectOptions","scrollToElement","index","center","dropdown","item","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","focusOptionByIndex","oldIndex","focusOption","nextIndex","type","handleKeyDown","key","defaultPrevented","preventDefault","option","includes","useEffect","useGlobalEventListener","renderChipWrapper","renderChipProps","onRemoveWrapper","value","stopPropagation","onRemove","isPopperDirectionTop","onPlacementChange","useCallback","placement","onDropdownMouseLeave","toggleOpened","prevOpened","FormField","classNames","role","aria-disabled","aria-readonly","readOnly","after","IconButton","activeMode","hoverMode","aria-label","onClick","DropdownIcon","ChipsInputBase","onInputChange","CustomSelectDropdown","targetRef","onMouseLeave","sameWidth","forcePortal","hovered","onMouseDown","onMouseEnter","Footnote","map","label","selected","find","selectedOption","Fragment","children"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/ChipsSelect/ChipsSelect.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport { useChipsSelect } from '../../hooks/useChipsSelect';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useGlobalEventListener } from '../../hooks/useGlobalEventListener';\nimport { useDOM } from '../../lib/dom';\nimport type { Placement } from '../../lib/floating';\nimport { defaultFilterFn } from '../../lib/select';\nimport { ChipOption, ChipValue, RenderChip } from '../Chip/Chip';\nimport { ChipsInputProps } from '../ChipsInput/ChipsInput';\nimport { ChipsInputBase, chipsInputDefaultProps } from '../ChipsInputBase/ChipsInputBase';\nimport { CustomSelectDropdown } from '../CustomSelectDropdown/CustomSelectDropdown';\nimport {\n CustomSelectOption,\n CustomSelectOptionProps,\n} from '../CustomSelectOption/CustomSelectOption';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport { FormField } from '../FormField/FormField';\nimport { IconButton } from '../IconButton/IconButton';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport styles from './ChipsSelect.module.css';\n\nexport interface ChipsSelectProps<Option extends ChipOption>\n extends Omit<ChipsInputProps<Option>, 'after'> {\n popupDirection?: 'top' | 'bottom';\n options?: Option[];\n filterFn?:\n | false\n | ((\n value?: string,\n option?: Option,\n getOptionLabel?: Pick<ChipsInputProps<Option>, 'getOptionLabel'>['getOptionLabel'],\n ) => boolean);\n /**\n * Возможность создавать чипы которых нет в списке (по enter или с помощью пункта в меню, см creatableText)\n */\n creatable?: boolean;\n /**\n * Отрисовка лоадера вместо списка опций в выпадающем списке\n */\n fetching?: boolean;\n renderOption?: (props: CustomSelectOptionProps) => React.ReactNode;\n /**\n * Показывать или скрывать уже выбранные опции\n */\n showSelected?: boolean;\n /**\n * Текст для пункта создающего чипы при клике, так же отвечает за то будет ли показан этот пункт (показывается после того как в списке не отсанется опций)\n */\n creatableText?: string;\n /**\n * Текст который показывается если список опций пуст\n */\n emptyText?: string;\n /**\n * Событие срабатывающее перед onChange\n */\n onChangeStart?: (e: React.MouseEvent | React.KeyboardEvent, option: Option) => void;\n /**\n * Закрытие выпадающего списка после выбора элемента\n */\n closeAfterSelect?: boolean;\n fixDropdownWidth?: boolean;\n forceDropdownPortal?: boolean;\n /**\n * Иконка раскрывающегося списка\n */\n icon?: React.ReactNode;\n}\n\ntype FocusActionType = 'next' | 'prev';\n\nconst FOCUS_ACTION_NEXT: FocusActionType = 'next';\nconst FOCUS_ACTION_PREV: FocusActionType = 'prev';\n\nconst chipsSelectDefaultProps: ChipsSelectProps<any> = {\n ...chipsInputDefaultProps,\n emptyText: 'Ничего не найдено',\n creatableText: 'Создать значение',\n onChangeStart: noop,\n creatable: false,\n fetching: false,\n showSelected: true,\n closeAfterSelect: true,\n options: [],\n filterFn: defaultFilterFn,\n renderOption(props) {\n return <CustomSelectOption {...props} />;\n },\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ChipsSelect\n */\nexport const ChipsSelect = <Option extends ChipOption>(props: ChipsSelectProps<Option>) => {\n const propsWithDefault = { ...chipsSelectDefaultProps, ...props };\n const {\n style,\n onFocus,\n onKeyDown,\n className,\n fetching,\n renderOption,\n emptyText,\n getRef,\n getRootRef,\n disabled,\n placeholder,\n tabIndex,\n getOptionValue,\n getOptionLabel,\n showSelected,\n getNewOptionData,\n renderChip,\n popupDirection,\n creatable,\n filterFn,\n inputValue,\n creatableText,\n closeAfterSelect,\n onChangeStart,\n before,\n icon,\n options,\n fixDropdownWidth,\n forceDropdownPortal,\n ...restProps\n } = propsWithDefault;\n\n const { document } = useDOM();\n\n const [popperPlacement, setPopperPlacement] = React.useState<Placement | undefined>(undefined);\n\n const scrollBoxRef = React.useRef<HTMLDivElement>(null);\n const rootRef = useExternRef(getRef);\n const {\n fieldValue,\n selectedOptions = [],\n opened,\n setOpened,\n addOptionFromInput,\n filteredOptions,\n addOption,\n handleInputChange,\n clearInput,\n focusedOption,\n setFocusedOption,\n focusedOptionIndex,\n setFocusedOptionIndex,\n } = useChipsSelect(propsWithDefault);\n\n const showCreatable = Boolean(\n creatable && creatableText && !filteredOptions.length && fieldValue,\n );\n\n const handleFocus = (e: React.FocusEvent<HTMLInputElement>) => {\n setOpened(true);\n setFocusedOptionIndex(null);\n onFocus!(e);\n };\n\n const handleClickOutside = (e: MouseEvent) => {\n if (e.target !== rootRef.current && !rootRef.current?.contains(e.target as Node)) {\n setOpened(false);\n }\n };\n\n const chipsSelectOptions = React.useRef<HTMLElement[]>([]).current;\n\n const scrollToElement = (index: number, center = false) => {\n const dropdown = scrollBoxRef.current;\n const item = chipsSelectOptions[index];\n\n if (!item || !dropdown) {\n return;\n }\n\n const dropdownHeight = dropdown.offsetHeight;\n const scrollTop = dropdown.scrollTop;\n const itemTop = item.offsetTop;\n const itemHeight = item.offsetHeight;\n\n if (center) {\n dropdown.scrollTop = itemTop - dropdownHeight / 2 + itemHeight / 2;\n } else if (itemTop + itemHeight > dropdownHeight + scrollTop) {\n dropdown.scrollTop = itemTop - dropdownHeight + itemHeight;\n } else if (itemTop < scrollTop) {\n dropdown.scrollTop = itemTop;\n }\n };\n\n const focusOptionByIndex = (index: number, oldIndex: number | null) => {\n const { length } = filteredOptions;\n\n if (index < 0) {\n index = length - 1;\n } else if (index >= length) {\n index = 0;\n }\n\n if (index === oldIndex) {\n return;\n }\n\n scrollToElement(index);\n setFocusedOptionIndex(index);\n };\n\n const focusOption = (nextIndex: number | null, type: FocusActionType) => {\n let index = nextIndex === null ? -1 : nextIndex;\n\n if (type === FOCUS_ACTION_NEXT) {\n index = index + 1;\n } else if (type === FOCUS_ACTION_PREV) {\n index = index - 1;\n }\n\n focusOptionByIndex(index, focusedOptionIndex);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n onKeyDown!(e);\n\n if (e.key === 'ArrowUp' && !e.defaultPrevented) {\n e.preventDefault();\n\n if (!opened) {\n setOpened(true);\n setFocusedOptionIndex(0);\n } else {\n focusOption(focusedOptionIndex, FOCUS_ACTION_PREV);\n }\n }\n\n if (e.key === 'ArrowDown' && !e.defaultPrevented) {\n e.preventDefault();\n\n if (!opened) {\n setOpened(true);\n setFocusedOptionIndex(0);\n } else {\n focusOption(focusedOptionIndex, FOCUS_ACTION_NEXT);\n }\n }\n\n if (e.key === 'Enter' && !e.defaultPrevented && opened) {\n if (focusedOptionIndex != null) {\n const option = filteredOptions[focusedOptionIndex];\n\n if (option) {\n onChangeStart!(e, option);\n\n if (!e.defaultPrevented) {\n addOption(option);\n setFocusedOptionIndex(null);\n clearInput();\n closeAfterSelect && setOpened(false);\n e.preventDefault();\n }\n } else if (!creatable) {\n e.preventDefault();\n }\n } else if (!creatable) {\n e.preventDefault();\n }\n }\n\n if (['Escape', 'Tab'].includes(e.key) && !e.defaultPrevented && opened) {\n setOpened(false);\n }\n };\n\n React.useEffect(() => {\n if (focusedOptionIndex != null && filteredOptions[focusedOptionIndex]) {\n setFocusedOption(filteredOptions[focusedOptionIndex]);\n } else if (focusedOptionIndex === null || focusedOptionIndex === 0) {\n setFocusedOption(null);\n }\n }, [focusedOptionIndex, filteredOptions, setFocusedOption]);\n\n useGlobalEventListener(document, 'click', handleClickOutside);\n\n const renderChipWrapper = (renderChipProps: RenderChip<Option> | undefined) => {\n if (renderChipProps === undefined) {\n return null;\n }\n const onRemoveWrapper = (e: React.MouseEvent | undefined, value: ChipValue | undefined) => {\n e?.preventDefault();\n e?.stopPropagation();\n\n renderChipProps.onRemove?.(e, value);\n };\n\n return renderChip!({\n ...renderChipProps,\n onRemove: onRemoveWrapper,\n });\n };\n\n const isPopperDirectionTop = popperPlacement?.includes('top');\n\n const onPlacementChange = React.useCallback(\n (placement?: Placement) => {\n setPopperPlacement(placement);\n },\n [setPopperPlacement],\n );\n\n const onDropdownMouseLeave = React.useCallback(() => {\n setFocusedOptionIndex(null);\n }, [setFocusedOptionIndex]);\n\n const toggleOpened = () => {\n setOpened((prevOpened) => !prevOpened);\n };\n\n return (\n <>\n <FormField\n getRootRef={rootRef}\n style={style}\n className={classNames(\n styles['ChipsSelect'],\n opened &&\n (isPopperDirectionTop\n ? styles['ChipsSelect--pop-up']\n : styles['ChipsSelect--pop-down']),\n className,\n )}\n disabled={disabled}\n role=\"application\"\n aria-disabled={disabled}\n aria-readonly={restProps.readOnly}\n after={\n <IconButton\n className={styles['ChipsSelect__dropdown']}\n activeMode=\"\"\n hoverMode=\"\"\n // TODO: add label customization\n aria-label={opened ? 'Скрыть' : 'Развернуть'}\n onClick={toggleOpened}\n >\n {icon ?? <DropdownIcon className={styles['ChipsSelect__icon']} opened={opened} />}\n </IconButton>\n }\n before={before}\n >\n <ChipsInputBase\n {...restProps}\n tabIndex={tabIndex}\n value={selectedOptions}\n inputValue={fieldValue}\n getNewOptionData={getNewOptionData}\n getOptionLabel={getOptionLabel}\n getOptionValue={getOptionValue}\n renderChip={renderChipWrapper}\n onFocus={handleFocus}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n getRef={getRef}\n disabled={disabled}\n onInputChange={handleInputChange}\n />\n </FormField>\n {opened && (\n <CustomSelectDropdown\n targetRef={rootRef}\n placement={popupDirection}\n scrollBoxRef={scrollBoxRef}\n onPlacementChange={onPlacementChange}\n onMouseLeave={onDropdownMouseLeave}\n fetching={fetching}\n sameWidth={fixDropdownWidth}\n forcePortal={forceDropdownPortal}\n >\n {showCreatable && (\n <CustomSelectOption\n hovered={focusedOptionIndex === 0}\n onMouseDown={addOptionFromInput}\n onMouseEnter={() => setFocusedOptionIndex(0)}\n >\n {creatableText}\n </CustomSelectOption>\n )}\n {!filteredOptions?.length && !showCreatable && emptyText ? (\n <Footnote className={styles['ChipsSelect__empty']}>{emptyText}</Footnote>\n ) : (\n filteredOptions.map((option: Option, index: number) => {\n const label = getOptionLabel!(option);\n const hovered =\n focusedOption && getOptionValue!(option) === getOptionValue!(focusedOption);\n const selected = selectedOptions.find((selectedOption: Option) => {\n return getOptionValue!(selectedOption) === getOptionValue!(option);\n });\n const value = getOptionValue!(option);\n\n return (\n <React.Fragment key={`${typeof value}-${value}`}>\n {renderOption!({\n option,\n hovered: Boolean(hovered),\n children: label,\n selected: !!selected,\n getRootRef: (e) => {\n if (e) {\n return (chipsSelectOptions[index] = e);\n }\n return undefined;\n },\n onMouseDown: (e: React.MouseEvent<HTMLDivElement>) => {\n onChangeStart?.(e, option);\n\n if (!e.defaultPrevented) {\n closeAfterSelect && setOpened(false);\n addOption(option);\n clearInput();\n }\n },\n onMouseEnter: () => setFocusedOptionIndex(index),\n })}\n </React.Fragment>\n );\n })\n )}\n </CustomSelectDropdown>\n )}\n </>\n );\n};\n"],"names":["ChipsSelect","FOCUS_ACTION_NEXT","FOCUS_ACTION_PREV","chipsSelectDefaultProps","chipsInputDefaultProps","emptyText","creatableText","onChangeStart","noop","creatable","fetching","showSelected","closeAfterSelect","options","filterFn","defaultFilterFn","renderOption","props","CustomSelectOption","propsWithDefault","style","onFocus","onKeyDown","className","getRef","getRootRef","disabled","placeholder","tabIndex","getOptionValue","getOptionLabel","getNewOptionData","renderChip","popupDirection","inputValue","before","icon","fixDropdownWidth","forceDropdownPortal","restProps","document","useDOM","React","useState","undefined","popperPlacement","setPopperPlacement","scrollBoxRef","useRef","rootRef","useExternRef","useChipsSelect","fieldValue","selectedOptions","opened","setOpened","addOptionFromInput","filteredOptions","addOption","handleInputChange","clearInput","focusedOption","setFocusedOption","focusedOptionIndex","setFocusedOptionIndex","showCreatable","Boolean","length","handleFocus","e","handleClickOutside","target","current","contains","chipsSelectOptions","scrollToElement","index","center","dropdown","item","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","focusOptionByIndex","oldIndex","focusOption","nextIndex","type","handleKeyDown","key","defaultPrevented","preventDefault","option","includes","useEffect","useGlobalEventListener","renderChipWrapper","renderChipProps","onRemoveWrapper","value","stopPropagation","onRemove","isPopperDirectionTop","onPlacementChange","useCallback","placement","onDropdownMouseLeave","toggleOpened","prevOpened","FormField","classNames","role","aria-disabled","aria-readonly","readOnly","after","IconButton","activeMode","hoverMode","aria-label","onClick","DropdownIcon","ChipsInputBase","onInputChange","CustomSelectDropdown","targetRef","onMouseLeave","sameWidth","forcePortal","hovered","onMouseDown","onMouseEnter","Footnote","map","label","selected","find","selectedOption","Fragment","children"],"mappings":"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"}
|
|
@@ -273,30 +273,36 @@ function CustomSelect(props) {
|
|
|
273
273
|
onClose,
|
|
274
274
|
resetKeyboardInput
|
|
275
275
|
]);
|
|
276
|
-
var
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
(_selectElRef_current = selectElRef.current) === null || _selectElRef_current === void 0 ? void 0 : _selectElRef_current.dispatchEvent(event);
|
|
288
|
-
}
|
|
276
|
+
var selectOption = _react.useCallback(function(index) {
|
|
277
|
+
var item = options[index];
|
|
278
|
+
setNativeSelectValue(item === null || item === void 0 ? void 0 : item.value);
|
|
279
|
+
close();
|
|
280
|
+
var shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync = isControlledOutside && props.value !== nativeSelectValue && nativeSelectValue === (item === null || item === void 0 ? void 0 : item.value);
|
|
281
|
+
if (shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync) {
|
|
282
|
+
var _selectElRef_current;
|
|
283
|
+
var event = new Event("change", {
|
|
284
|
+
bubbles: true
|
|
285
|
+
});
|
|
286
|
+
(_selectElRef_current = selectElRef.current) === null || _selectElRef_current === void 0 ? void 0 : _selectElRef_current.dispatchEvent(event);
|
|
289
287
|
}
|
|
290
288
|
}, [
|
|
291
289
|
close,
|
|
292
|
-
focusedOptionIndex,
|
|
293
|
-
isValidIndex,
|
|
294
290
|
options,
|
|
295
291
|
selectElRef,
|
|
296
292
|
isControlledOutside,
|
|
297
293
|
props.value,
|
|
298
294
|
nativeSelectValue
|
|
299
295
|
]);
|
|
296
|
+
var selectFocused = _react.useCallback(function() {
|
|
297
|
+
if (focusedOptionIndex === undefined || !isValidIndex(focusedOptionIndex)) {
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
selectOption(focusedOptionIndex);
|
|
301
|
+
}, [
|
|
302
|
+
focusedOptionIndex,
|
|
303
|
+
isValidIndex,
|
|
304
|
+
selectOption
|
|
305
|
+
]);
|
|
300
306
|
var open = _react.useCallback(function() {
|
|
301
307
|
setOpened(true);
|
|
302
308
|
setFocusedOptionIndex(selectedOptionIndex);
|
|
@@ -495,11 +501,11 @@ function CustomSelect(props) {
|
|
|
495
501
|
var index = Array.prototype.indexOf.call((_e_currentTarget_parentNode = e.currentTarget.parentNode) === null || _e_currentTarget_parentNode === void 0 ? void 0 : _e_currentTarget_parentNode.children, e.currentTarget);
|
|
496
502
|
var option = options[index];
|
|
497
503
|
if (option && !option.disabled) {
|
|
498
|
-
|
|
504
|
+
selectOption(index);
|
|
499
505
|
}
|
|
500
506
|
}, [
|
|
501
507
|
options,
|
|
502
|
-
|
|
508
|
+
selectOption
|
|
503
509
|
]);
|
|
504
510
|
var handleOptionHover = _react.useCallback(function(e) {
|
|
505
511
|
var _e_currentTarget_parentNode;
|
|
@@ -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 * > ⚠️ Важно: cвойство опции `disabled` должно выставляться только через проп `options`.\n * > Запрещается выставлять `disabled` проп опциям в обход `options`, иначе селект не будет знать об актуальном состоянии\n * опции.\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":["CustomSelect","sizeYClassNames","none","SizeType","COMPACT","findIndexAfter","options","startIndex","length","findIndex","option","i","disabled","findIndexBefore","endIndex","result","warn","warnOnce","checkOptionsValueType","Set","map","item","value","size","defaultRenderOptionFn","props","CustomSelectOption","handleOptionDown","e","preventDefault","findSelectedIndex","withClear","Number","filter","inputValue","filterFn","defaultOptions","React","useState","opened","setOpened","before","name","className","getRef","getRootRef","popupDirection","style","onChange","children","onInputChange","onInputChangeProp","renderDropdown","onOpen","onClose","fetching","forceDropdownPortal","selectType","autoHideScrollbar","autoHideScrollbarDelay","searchable","renderOptionProp","renderOption","optionsProp","emptyText","defaultFilterFn","icon","iconProp","ClearButton","CustomSelectClearButton","allowClearButton","dropdownOffsetDistance","fixDropdownWidth","restProps","process","env","NODE_ENV","useAdaptivity","sizeY","containerRef","useRef","handleRootRef","useExternRef","scrollBoxRef","selectElRef","focusedOptionIndex","setFocusedOptionIndex","undefined","isControlledOutside","setIsControlledOutside","setInputValue","defaultValue","nativeSelectValue","setNativeSelectValue","keyboardInput","setKeyboardInput","popperPlacement","setPopperPlacement","setOptions","selectedOptionIndex","setSelectedOptionIndex","useEffect","useIsomorphicLayoutEffect","some","event","Event","bubbles","current","dispatchEvent","selected","useMemo","openedClassNames","classNames","includes","resetKeyboardInput","useCallback","scrollToElement","index","center","dropdown","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","isValidIndex","focusOptionByIndex","scrollTo","areOptionsShown","setScrollBoxRef","ref","onKeyboardInput","key","fullInput","optionIndex","getTitleFromChildren","label","toLowerCase","close","selectFocused","shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync","open","onBlur","resetFocusedOption","onFocus","onClick","handleKeyUp","debounce","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","Footnote","controlledValueSet","uncontrolledValueSet","clearButtonShown","clearButton","DropdownIcon","afterIcons","REGULAR","Input","autoFocus","onKeyDown","after","mode","getFormFieldModeFromSelectType","SelectMimicry","aria-hidden","onKeyUp","select","CustomSelectDropdown","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 * > ⚠️ Важно: cвойство опции `disabled` должно выставляться только через проп `options`.\n * > Запрещается выставлять `disabled` проп опциям в обход `options`, иначе селект не будет знать об актуальном состоянии\n * опции.\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 selectOption = React.useCallback(\n (index: number) => {\n const item = options[index];\n\n setNativeSelectValue(item?.value);\n close();\n\n const shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync =\n isControlledOutside &&\n props.value !== nativeSelectValue &&\n nativeSelectValue === item?.value;\n\n if (shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync) {\n const event = new Event('change', { bubbles: true });\n selectElRef.current?.dispatchEvent(event);\n }\n },\n [close, options, selectElRef, isControlledOutside, props.value, nativeSelectValue],\n );\n\n const selectFocused = React.useCallback(() => {\n if (focusedOptionIndex === undefined || !isValidIndex(focusedOptionIndex)) {\n return;\n }\n\n selectOption(focusedOptionIndex);\n }, [focusedOptionIndex, isValidIndex, selectOption]);\n\n const open = React.useCallback(() => {\n setOpened(true);\n setFocusedOptionIndex(selectedOptionIndex);\n\n if (typeof onOpen === 'function') {\n onOpen();\n }\n }, [onOpen, selectedOptionIndex]);\n\n const onBlur = React.useCallback(() => {\n close();\n const event = new Event('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 selectOption(index);\n }\n },\n [options, selectOption],\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":["CustomSelect","sizeYClassNames","none","SizeType","COMPACT","findIndexAfter","options","startIndex","length","findIndex","option","i","disabled","findIndexBefore","endIndex","result","warn","warnOnce","checkOptionsValueType","Set","map","item","value","size","defaultRenderOptionFn","props","CustomSelectOption","handleOptionDown","e","preventDefault","findSelectedIndex","withClear","Number","filter","inputValue","filterFn","defaultOptions","React","useState","opened","setOpened","before","name","className","getRef","getRootRef","popupDirection","style","onChange","children","onInputChange","onInputChangeProp","renderDropdown","onOpen","onClose","fetching","forceDropdownPortal","selectType","autoHideScrollbar","autoHideScrollbarDelay","searchable","renderOptionProp","renderOption","optionsProp","emptyText","defaultFilterFn","icon","iconProp","ClearButton","CustomSelectClearButton","allowClearButton","dropdownOffsetDistance","fixDropdownWidth","restProps","process","env","NODE_ENV","useAdaptivity","sizeY","containerRef","useRef","handleRootRef","useExternRef","scrollBoxRef","selectElRef","focusedOptionIndex","setFocusedOptionIndex","undefined","isControlledOutside","setIsControlledOutside","setInputValue","defaultValue","nativeSelectValue","setNativeSelectValue","keyboardInput","setKeyboardInput","popperPlacement","setPopperPlacement","setOptions","selectedOptionIndex","setSelectedOptionIndex","useEffect","useIsomorphicLayoutEffect","some","event","Event","bubbles","current","dispatchEvent","selected","useMemo","openedClassNames","classNames","includes","resetKeyboardInput","useCallback","scrollToElement","index","center","dropdown","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","isValidIndex","focusOptionByIndex","scrollTo","areOptionsShown","setScrollBoxRef","ref","onKeyboardInput","key","fullInput","optionIndex","getTitleFromChildren","label","toLowerCase","close","selectOption","shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync","selectFocused","open","onBlur","resetFocusedOption","onFocus","onClick","handleKeyUp","debounce","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","Footnote","controlledValueSet","uncontrolledValueSet","clearButtonShown","clearButton","DropdownIcon","afterIcons","REGULAR","Input","autoFocus","onKeyDown","after","mode","getFormFieldModeFromSelectType","SelectMimicry","aria-hidden","onKeyUp","select","CustomSelectDropdown","targetRef","placement","onPlacementChange","onMouseLeave","offsetDistance","sameWidth","forcePortal"],"mappings":";;;;+BAgMgBA;;;eAAAA;;;;;;;;;;+DAhMO;oBACI;6BACG;4BACD;0BACJ;sBAEuC;yCACtB;qBACK;wBACtB;oCAEY;kCAI9B;4BACsB;qBAEP;6BAGQ;wBACL;uCAC6C;AAGtE,IAAMC;IACJC,IAAI;GACHC,qBAASC;AAGZ,IAAMC,iBAAiB;QAACC,2EAAyC,EAAE,EAAEC,8EAAa,CAAC;IACjF,IAAIA,cAAcD,QAAQE,SAAS,GAAG;QACpC,OAAO,CAAC;IACV;IACA,OAAOF,QAAQG,UAAU,SAACC,QAAQC;eAAMA,IAAIJ,cAAc,CAACG,OAAOE;;AACpE;AAEA,IAAMC,kBAAkB;QACtBP,2EAAyC,EAAE,EAC3CQ,4EAAmBR,QAAQE;IAE3B,IAAIO,SAAS,CAAC;IACd,IAAID,YAAY,GAAG;QACjB,OAAOC;IACT;IACA,IAAK,IAAIJ,IAAIG,WAAW,GAAGH,KAAK,GAAGA,IAAK;QACtC,IAAID,SAASJ,OAAO,CAACK,EAAE;QAEvB,IAAI,CAACD,OAAOE,UAAU;YACpBG,SAASJ;YACT;QACF;IACF;IACA,OAAOI;AACT;AAEA,IAAMC,OAAOC,IAAAA,oBAAS;AAEtB,IAAMC,wBAAwB,SAACZ;IAC7B,IAAI,IAAIa,IAAIb,QAAQc,IAAI,SAACC;eAAS,WAAOA,KAAKC;QAAQC,OAAO,GAAG;QAC9DP,KACE,+FACA;IAEJ;AACF;AAEA,SAASQ,sBAAsB;QAAEd,SAAF,OAAEA,QAAWe,qCAAb;QAAEf;;IAC/B,qBAAO,qBAACgB,wCAAuBD;AACjC;AAEA,IAAME,mBAAsC,SAACC;IAC3CA,EAAEC;AACJ;AAEA,SAASC,kBACPxB,OAAsC,EACtCgB,KAAkB,EAClBS,SAAkB;IAElB,IAAIA,aAAaT,UAAU,IAAI;QAC7B,OAAO,CAAC;IACV;QAEEhB;IADF,OACEA,CAAAA,qBAAAA,QAAQG,UAAU,SAACY;QACjBC,QAAQ,OAAOD,KAAKC,UAAU,WAAWU,OAAOV,SAASA;QACzD,OAAOD,KAAKC,UAAUA;IACxB,gBAHAhB,gCAAAA,qBAGM,CAAC;AAEX;AAEA,IAAM2B,SAAS,SACb3B,SACA4B,YACAC;IAEA,OAAO,OAAOA,aAAa,aACvB7B,QAAQ2B,OAAO,SAACvB;eAAWyB,SAASD,YAAYxB;SAChDJ;AACN;AAEA,IAAM8B,iBAAgD,EAAE;AA0FjD,SAASpC,aAAayB,KAAkB;IAC7C,IAA4BY,qCAAAA,OAAMC,SAAS,YAApCC,SAAqBF,oBAAbG,YAAaH;IAC5B,IACEI,SA6BEhB,MA7BFgB,QACAC,OA4BEjB,MA5BFiB,MACAC,YA2BElB,MA3BFkB,WACAC,SA0BEnB,MA1BFmB,QACAC,aAyBEpB,MAzBFoB,YACAC,iBAwBErB,MAxBFqB,gBACAC,QAuBEtB,MAvBFsB,OACAC,WAsBEvB,MAtBFuB,UACAC,WAqBExB,MArBFwB,UACAC,AAAeC,oBAoBb1B,MApBFyB,eACAE,iBAmBE3B,MAnBF2B,gBACAC,SAkBE5B,MAlBF4B,QACAC,UAiBE7B,MAjBF6B,SACAC,WAgBE9B,MAhBF8B,UACAC,sBAeE/B,MAfF+B,yCAeE/B,MAdFgC,YAAAA,4CAAa,+BACbC,oBAaEjC,MAbFiC,mBACAC,yBAYElC,MAZFkC,4CAYElC,MAXFmC,YAAAA,4CAAa,2BACCC,MAUZpC,MAVFqC,cAAcD,mBAAAA,iBAAmBrC,wBAAnBqC,KACLE,OASPtC,MATFnB,SAASyD,cAAAA,kBAAc3B,iBAAd2B,yBASPtC,MARFuC,WAAAA,0CAAY,0DAQVvC,MAPFU,UAAAA,wCAAW8B,2CACXC,AAAMC,WAMJ1C,MANFyC,2BAMEzC,MALF2C,aAAAA,8CAAcC,iGAKZ5C,MAJF6C,kBAAAA,wDAAmB,iEAIjB7C,MAHF8C,wBAAAA,oEAAyB,6DAGvB9C,MAFF+C,kBAAAA,wDAAmB,gCAChBC,yCACDhD;QA7BFgB;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAE;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAE;QACAxD;QACA0D;QACA7B;QACA+B;QACAE;QACAE;QACAC;QACAC;;IAIF,IAAIE,QAAQC,IAAIC,aAAa,eAAe;QAC1C1D,sBAAsB6C;IACxB;IAEA,IAA2Bc,kBAAAA,IAAAA,wDAAAA,gBAAnBC,OAAAA,0CAAQ;IAEhB,IAAMC,eAAe1C,OAAM2C,OAAyB;IACpD,IAAMC,gBAAgBC,IAAAA,4BAAaH,cAAclC;IACjD,IAAMsC,eAAe9C,OAAM2C,OAA8B;IACzD,IAAMI,cAAcF,IAAAA,4BAAatC;IAEjC,IAAoDP,sCAAAA,OAAMC,SAA6B,CAAC,QAAjF+C,qBAA6ChD,qBAAzBiD,wBAAyBjD;IACpD,IAAsDA,sCAAAA,OAAMC,SAASb,MAAMH,UAAUiE,gBAA9EC,sBAA+CnD,qBAA1BoD,yBAA0BpD;IACtD,IAAoCA,sCAAAA,OAAMC,SAAS,SAA5CJ,aAA6BG,qBAAjBqD,gBAAiBrD;QAE5BZ,cAAAA;IADR,IAAkDY,sCAAAA,OAAMC,SACtD;eAAMb,CAAAA,OAAAA,CAAAA,eAAAA,MAAMH,mBAANG,0BAAAA,eAAeA,MAAMkE,0BAArBlE,kBAAAA,OAAsC6C,mBAAmB,KAAKiB;YAD/DK,oBAA2CvD,qBAAxBwD,uBAAwBxD;IAGlD,IAA0CA,sCAAAA,OAAMC,SAAS,SAAlDwD,gBAAmCzD,qBAApB0D,mBAAoB1D;IAC1C,IAA8CA,sCAAAA,OAAMC,SAClDiD,gBADKS,kBAAuC3D,qBAAtB4D,qBAAsB5D;IAG9C,IAA8BA,sCAAAA,OAAMC,SAASyB,kBAAtCzD,UAAuB+B,qBAAd6D,aAAc7D;QAEGZ;IADjC,IAAsDY,sCAAAA,OAAMC,SAC1DR,kBAAkBiC,aAAatC,CAAAA,gBAAAA,MAAMH,mBAANG,2BAAAA,gBAAeA,MAAMkE,cAAcrB,wBAD7D6B,sBAA+C9D,qBAA1B+D,yBAA0B/D;IAItDA,OAAMgE,UAAU;QACdZ,uBAAuBhE,MAAMH,UAAUiE;YACK9D;QAA5CoE,qBAAqB,SAACD;mBAAsBnE,CAAAA,eAAAA,MAAMH,mBAANG,0BAAAA,eAAemE;;IAC7D,GAAG;QAACnE,MAAMH;KAAM;IAEhBgF,IAAAA,sDAA0B;QACxB,IACEhG,QAAQiG,KAAK;gBAAGjF,cAAAA;mBAAYsE,sBAAsBtE;cACjDgD,oBAAoBsB,sBAAsB,IAC3C;gBAGAR;YAFA,IAAMoB,QAAQ,IAAIC,MAAM,UAAU;gBAAEC,SAAS;YAAK;YAElDtB,CAAAA,uBAAAA,YAAYuB,qBAAZvB,kCAAAA,KAAAA,IAAAA,qBAAqBwB,cAAcJ;QACrC;IACF,GAAG;QAACZ;KAAkB;IAEtB,IAAMiB,WAAWxE,OAAMyE,QAAQ;QAC7B,IAAI,CAACxG,QAAQE,QAAQ;YACnB,OAAO;QACT;QAEA,OAAO2F,wBAAwBZ,YAAYjF,OAAO,CAAC6F,oBAAoB,GAAGZ;IAC5E,GAAG;QAACjF;QAAS6F;KAAoB;IAEjC,IAAMY,mBAAmB1E,OAAMyE,QAC7B;QACEE,OAAAA,IAAAA,kBACEzE,UACEgC,2BAA2B,KAC1ByB,CAAAA,CAAAA,4BAAAA,6BAAAA,KAAAA,IAAAA,gBAAiBiB,SAAS,mEAEQ;OAEzC;QAAC1C;QAAwBhC;QAAQyD;KAAgB;IAGnD,IAAMkB,qBAAqB7E,OAAM8E,YAAY;QAC3CpB,iBAAiB;IACnB,GAAG,EAAE;IAEL,IAAMqB,kBAAkB/E,OAAM8E,YAAY,SAACE;YAAeC,0EAAS;QACjE,IAAMC,WAAWpC,aAAawB;QAC9B,IAAMtF,OAAOkG,WAAYA,SAAStE,QAAQ,CAACoE,MAAM,GAAmB;QAEpE,IAAI,CAAChG,QAAQ,CAACkG,UAAU;YACtB;QACF;QAEA,IAAMC,iBAAiBD,SAASE;QAChC,IAAMC,YAAYH,SAASG;QAC3B,IAAMC,UAAUtG,KAAKuG;QACrB,IAAMC,aAAaxG,KAAKoG;QAExB,IAAIH,QAAQ;YACVC,SAASG,YAAYC,UAAUH,iBAAiB,IAAIK,aAAa;QACnE,OAAO,IAAIF,UAAUE,aAAaL,iBAAiBE,WAAW;YAC5DH,SAASG,YAAYC,UAAUH,iBAAiBK;QAClD,OAAO,IAAIF,UAAUD,WAAW;YAC9BH,SAASG,YAAYC;QACvB;IACF,GAAG,EAAE;IAEL,IAAMG,eAAezF,OAAM8E,YACzB,SAACE;YAC+B/G;QAA9B,OAAO+G,SAAS,KAAKA,QAAS/G,CAAAA,CAAAA,kBAAAA,QAAQE,oBAARF,6BAAAA,kBAAkB,CAAA;IAClD,GACA;QAACA,QAAQE;KAAO;IAGlB,IAAMuH,qBAAqB1F,OAAM8E,YAC/B,SAACE;YAA2BW,4EAAW;YACY1H;QAAjD,IAAI+G,UAAU9B,aAAa8B,QAAQ,KAAKA,QAAQ,AAAC/G,CAAAA,CAAAA,kBAAAA,QAAQE,oBAARF,6BAAAA,kBAAkB,CAAA,IAAK,GAAG;YACzE;QACF;QAEA,IAAMI,SAASJ,OAAO,CAAC+G,MAAM;QAE7B,IAAI3G,mBAAAA,oBAAAA,KAAAA,IAAAA,OAAQE,UAAU;YACpB;QACF;QAEA,IAAIoH,UAAU;YACZZ,gBAAgBC;QAClB;QAEA,mDAAmD;QACnD/B,sBAAsB,SAACD;mBACrBA,uBAAuBgC,QAAQA,QAAQhC;;IAE3C,GACA;QAAC/E;QAAS8G;KAAgB;IAG5B,IAAMa,kBAAkB5F,OAAM8E,YAAY;QACxC,OAAOhC,aAAawB,YAAY;IAClC,GAAG,EAAE;IAEL,IAAMuB,kBAAkB7F,OAAM8E,YAC5B,SAACgB;QACChD,aAAawB,UAAUwB;QAEvB,IAAIA,OAAOhC,wBAAwBZ,aAAauC,aAAa3B,sBAAsB;YACjF;gBACEiB,gBAAgBjB,qBAAqB;YACvC;QACF;IACF,GACA;QAAC2B;QAAcV;QAAiBjB;KAAoB;IAGtD,IAAMiC,kBAAkB/F,OAAM8E,YAC5B,SAACkB;QACC,IAAMC,YAAYxC,gBAAgBuC;QAElC,IAAME,cAAcjI,QAAQG,UAAU,SAACC;YACrC,OAAO8H,IAAAA,6BAAqB9H,OAAO+H,OAAOC,cAAczB,SAASqB;QACnE;QAEA,IAAIC,gBAAgBhD,aAAagD,cAAc,CAAC,GAAG;YACjDR,mBAAmBQ;QACrB;QAEAxC,iBAAiBuC;IACnB,GACA;QAACP;QAAoBjC;QAAexF;KAAQ;IAG9C;;;GAGC,GACD,IAAMqI,QAAQtG,OAAM8E,YAAY;QAC9BD;QAEAxB,cAAc;QACdlD,UAAU;QACV8C,sBAAsB,CAAC;QACvBhC,oBAAAA,qBAAAA,KAAAA,IAAAA;IACF,GAAG;QAACA;QAAS4D;KAAmB;IAEhC,IAAM0B,eAAevG,OAAM8E,YACzB,SAACE;QACC,IAAMhG,OAAOf,OAAO,CAAC+G,MAAM;QAE3BxB,qBAAqBxE,iBAAAA,kBAAAA,KAAAA,IAAAA,KAAMC;QAC3BqH;QAEA,IAAME,8DACJrD,uBACA/D,MAAMH,UAAUsE,qBAChBA,sBAAsBvE,CAAAA,iBAAAA,kBAAAA,KAAAA,IAAAA,KAAMC,KAAI;QAElC,IAAIuH,6DAA6D;gBAE/DzD;YADA,IAAMoB,QAAQ,IAAIC,MAAM,UAAU;gBAAEC,SAAS;YAAK;YAClDtB,CAAAA,uBAAAA,YAAYuB,qBAAZvB,kCAAAA,KAAAA,IAAAA,qBAAqBwB,cAAcJ;QACrC;IACF,GACA;QAACmC;QAAOrI;QAAS8E;QAAaI;QAAqB/D,MAAMH;QAAOsE;KAAkB;IAGpF,IAAMkD,gBAAgBzG,OAAM8E,YAAY;QACtC,IAAI9B,uBAAuBE,aAAa,CAACuC,aAAazC,qBAAqB;YACzE;QACF;QAEAuD,aAAavD;IACf,GAAG;QAACA;QAAoByC;QAAcc;KAAa;IAEnD,IAAMG,OAAO1G,OAAM8E,YAAY;QAC7B3E,UAAU;QACV8C,sBAAsBa;QAEtB,IAAI,OAAO9C,WAAW,YAAY;YAChCA;QACF;IACF,GAAG;QAACA;QAAQ8C;KAAoB;IAEhC,IAAM6C,SAAS3G,OAAM8E,YAAY;YAG/B/B;QAFAuD;QACA,IAAMnC,QAAQ,IAAIC,MAAM;QACxBrB,CAAAA,uBAAAA,YAAYuB,qBAAZvB,kCAAAA,KAAAA,IAAAA,qBAAqBwB,cAAcJ;IACrC,GAAG;QAACmC;QAAOvD;KAAY;IAEvB,IAAM6D,qBAAqB5G,OAAM8E,YAAY;QAC3C7B,sBAAsB,CAAC;IACzB,GAAG,EAAE;IAEL,IAAM4D,UAAU7G,OAAM8E,YAAY;YAEhC/B;QADA,IAAMoB,QAAQ,IAAIC,MAAM;QACxBrB,CAAAA,uBAAAA,YAAYuB,qBAAZvB,kCAAAA,KAAAA,IAAAA,qBAAqBwB,cAAcJ;IACrC,GAAG;QAACpB;KAAY;IAEhB,IAAM+D,UAAU9G,OAAM8E,YAAY;QAChC,IAAI5E,QAAQ;YACVoG;QACF,OAAO;YACLI;QACF;IACF,GAAG;QAACJ;QAAOI;QAAMxG;KAAO;IAExB,IAAM6G,cAAc/G,OAAMyE,QAAQ;eAAMuC,IAAAA,iBAASnC,oBAAoB;OAAO;QAACA;KAAmB;IAEhG,IAAMoC,cAAcjH,OAAM8E,YACxB,SAACoC;QACC,IAAIlC,QAAQhC;QAEZ,IAAIkE,SAAS,QAAQ;YACnB,IAAMC,YAAYnJ,eAAeC,SAAS+G;YAC1CA,QAAQmC,cAAc,CAAC,IAAInJ,eAAeC,WAAWkJ,WAAW,kDAAkD;QACpH,OAAO,IAAID,SAAS,QAAQ;YAC1B,IAAME,cAAc5I,gBAAgBP,SAAS+G;YAC7CA,QAAQoC,gBAAgB,CAAC,IAAI5I,gBAAgBP,WAAWmJ,aAAa,0DAA0D;QACjI;QAEA1B,mBAAmBV;IACrB,GACA;QAACU;QAAoB1C;QAAoB/E;KAAQ;IAGnD+B,OAAMgE,UACJ,SAASqD;YACOjI,cAAAA;QAAd,IAAMH,QAAQG,CAAAA,OAAAA,CAAAA,eAAAA,MAAMH,mBAANG,0BAAAA,eAAemE,+BAAfnE,kBAAAA,OAAoCA,MAAMkE;QAExD,IAAMrF,UACJsD,cAAc1B,eAAeqD,YACzBtD,OAAO8B,aAAa7B,YAAYC,YAChC4B;QAENmC,WAAW5F;QACX8F,uBAAuBtE,kBAAkBxB,SAASgB,OAAOgD;IAC3D,GACA;QACEnC;QACAD;QACA0D;QACA7B;QACAtC,MAAMkE;QACNlE,MAAMH;QACNsC;QACAU;KACD;IAGH;;;GAGC,GACD,IAAMqF,eAAetH,OAAM8E,YAAY,SAACvF;YAClCuD;QAAJ,IAAIA,CAAAA,wBAAAA,aAAawB,qBAAbxB,mCAAAA,KAAAA,IAAAA,sBAAsByE,SAAShI,EAAEiI,SAAiB;YACpDjI,EAAEC;QACJ;IACF,GAAG,EAAE;IAEL,IAAMiI,uBAAoE,SAAClI;QACzE,IAAMmI,yBAAyBjI,kBAC7BxB,SACAsB,EAAEoI,cAAc1I,OAChBgD;QAGF,IAAI6B,wBAAwB4D,wBAAwB;YAClD,IAAI,CAACvE,qBAAqB;gBACxBY,uBAAuB2D;YACzB;YACA/G,qBAAAA,sBAAAA,KAAAA,IAAAA,SAAWpB;QACb;IACF;IAEA,IAAMqI,iBAA+D5H,OAAM8E,YACzE,SAACX;QACC;YAAC;YAAW;YAAa;YAAU;SAAQ,CAACS,SAAST,MAAM6B,QACzDJ,qBACAzB,MAAM3E;QAER,OAAQ2E,MAAM6B;YACZ,KAAK;gBACHJ,qBAAqBqB,YAAY;gBACjC;YACF,KAAK;gBACHrB,qBAAqBqB,YAAY;gBACjC;YACF,KAAK;gBACHX;gBACA;YACF,KAAK;gBACHV,qBAAqBa;gBACrB;QACJ;IACF,GACA;QAACb;QAAiBU;QAAOW;QAAaR;KAAc;IAGtD,IAAM5F,gBAA4Db,OAAM8E,YACtE,SAACvF;QACC,2CAA2C;QAC3C,IAAIuB,mBAAmB;YACrB,IAAM7C,UAAU6C,kBAAkBvB,GAAGmC;YACrC,IAAIzD,SAAS;gBACX,IAAIoE,QAAQC,IAAIC,aAAa,eAAe;oBAC1C5D,KACE,8EACE;gBAEN;gBACAkF,WAAW5F;gBACX8F,uBAAuBtE,kBAAkBxB,SAASsF,mBAAmBtB;YACvE;QACF,OAAO;YACL,IAAMhE,WAAU2B,OAAO8B,aAAanC,EAAEiI,OAAOvI,OAAOa;YACpD+D,WAAW5F;YACX8F,uBAAuBtE,kBAAkBxB,UAASsF,mBAAmBtB;QACvE;QACAoB,cAAc9D,EAAEiI,OAAOvI;IACzB,GACA;QAACa;QAAUyD;QAAmBzC;QAAmBY;QAAaO;KAAiB;IAGjF,IAAM4F,sBAAsB7H,OAAM8E,YAChC,SAACX;QACC,IAAIA,MAAM6B,IAAI7H,WAAW,KAAKgG,MAAM6B,QAAQ,KAAK;YAC/CD,gBAAgB5B,MAAM6B;YACtB;QACF;QAEA;YAAC;YAAW;YAAa;YAAU;SAAQ,CAACpB,SAAST,MAAM6B,QACzDJ,qBACAzB,MAAM3E;QAER,OAAQ2E,MAAM6B;YACZ,KAAK;gBACH,IAAI9F,QAAQ;oBACV0F,qBAAqBqB,YAAY;gBACnC,OAAO;oBACLP;gBACF;gBACA;YACF,KAAK;gBACH,IAAIxG,QAAQ;oBACV0F,qBAAqBqB,YAAY;gBACnC,OAAO;oBACLP;gBACF;gBACA;YACF,KAAK;gBACHJ;gBACA;YACF,KAAK;YACL,KAAK;YACL,KAAK;gBACH,IAAIpG,QAAQ;oBACV0F,qBAAqBa;gBACvB,OAAO;oBACLC;gBACF;gBACA;QACJ;IACF,GACA;QAACd;QAAiBU;QAAOW;QAAalB;QAAiBW;QAAMxG;QAAQuG;KAAc;IAGrF,IAAMqB,oBAAoB9H,OAAM8E,YAC9B,SAACvF;YAEGA;QADF,IAAMyF,QAAQ+C,MAAMC,UAAUC,QAAQC,KACpC3I,CAAAA,8BAAAA,EAAEoI,cAAcQ,wBAAhB5I,yCAAAA,KAAAA,IAAAA,4BAA4BqB,UAC5BrB,EAAEoI;QAEJ,IAAMtJ,SAASJ,OAAO,CAAC+G,MAAM;QAE7B,IAAI3G,UAAU,CAACA,OAAOE,UAAU;YAC9BgI,aAAavB;QACf;IACF,GACA;QAAC/G;QAASsI;KAAa;IAGzB,IAAM6B,oBAAoBpI,OAAM8E,YAC9B,SAACvF;YAEgCA;QAD/BmG,mBACEqC,MAAMC,UAAUC,QAAQC,KAAK3I,CAAAA,8BAAAA,EAAEoI,cAAcQ,wBAAhB5I,yCAAAA,KAAAA,IAAAA,4BAA4BqB,UAAUrB,EAAEoI,gBACrE;IAEJ,GACA;QAACjC;KAAmB;IAGtB,IAAMjE,eAAezB,OAAM8E,YACzB,SAACzG,QAAqC2G;QACpC,IAAMqD,UAAUrD,UAAUhC;QAC1B,IAAMwB,WAAWQ,UAAUlB;QAE3B,qBACE,qBAAC9D,OAAMsI;YAAStC,KAAK,AAAC,GAAe,OAAb3H,OAAOY;WAC5BuC,iBAAiB;YAChBnD,QAAAA;YACAgK,SAAAA;YACAzH,UAAUvC,OAAO+H;YACjB5B,UAAAA;YACAjG,UAAUF,OAAOE;YACjBuI,SAASgB;YACTS,aAAajJ;YACb,kDAAkD;YAClD,kHAAkH;YAClH,sGAAsG;YACtG,qHAAqH;YACrH,+BAA+B;YAC/B,0IAA0I;YAC1I,oDAAoD;YACpD,kGAAkG;YAClGkJ,aAAaJ;QACf;IAGN,GACA;QACEpF;QACA8E;QACAM;QACA5G;QACAsC;KACD;IAGH,IAAM2E,kBAAkBzI,OAAMyE,QAAQ;QACpC,IAAMiE,yBACJzK,CAAAA,oBAAAA,qBAAAA,KAAAA,IAAAA,QAASE,MAAK,IAAI,IAChBF,QAAQc,IAAI0C,8BAEZ,qBAACkH;YAASrI,SAAS;WAAkCqB;QAGzD,IAAI,OAAOZ,mBAAmB,YAAY;YACxC,OAAOA,eAAe;gBAAE2H,wBAAAA;YAAuB;QACjD,OAAO;YACL,OAAOA;QACT;IACF,GAAG;QAAC/G;QAAW1D;QAAS8C;QAAgBU;KAAa;IAErD,IAAMmH,qBAAqBzF,uBAAuB/D,MAAMH,UAAU;IAClE,IAAM4J,uBAAuB,CAAC1F,uBAAuBI,sBAAsB;IAC3E,IAAMuF,mBACJ7G,oBAAoB,CAAC/B,UAAW0I,CAAAA,sBAAsBC,oBAAmB;IAE3E,IAAME,cAAc/I,OAAMyE,QAAQ;QAChC,IAAI,CAACqE,kBAAkB;YACrB,OAAO;QACT;QAEA,qBACE,qBAAC/G;YACCzB,WAAWwB,aAAaoB,6CAAiDA;YACzE4D,SAAS;uBAAMtD,qBAAqB;;;IAG1C,GAAG;QAACsF;QAAkB/G;QAAaD;KAAS;IAE5C,IAAMD,OAAO7B,OAAMyE,QAAQ;QACzB,IAAI3C,aAAaoB,WAAW;YAC1B,OAAOpB;QACT;QAEA,qBACE,qBAACkH;YACC1I,WAAWwI,uDAA2D5F;YACtEhD,QAAQA;;IAGd,GAAG;QAAC4I;QAAkBhH;QAAU5B;KAAO;IAEvC,IAAM+I,aAAa,AAACpH,CAAAA,QAAQiH,gBAAe,mBACzC,qBAAC9I,OAAMsI,gBACJS,aACAlH;IAIL,qBACE,qBAACuE;QACC9F,WAAWqE,IAAAA,sCAETlC,UAAU3E,qBAASoL,WAAWtL,eAAe,CAAC6E,MAAM,EACpDnC;QAEFI,OAAOA;QACPoF,KAAKlD;QACLkE,SAASQ;OAERpH,UAAUqB,2BACT,qBAAC4H,0DACK/G;QACJgH,WAAAA;QACAzC,QAAQA;QACRrG,WAAWoE;QACXzF,OAAOY;QACPwJ,WAAWzB;QACXjH,UAAUE;QACV,kIAAkI;QAClI,4FAA4F;QAC5F,wGAAwG;QACxGiG,SAAS1H,MAAM0H;QACf1G,QAAQA;QACRkJ,OAAOL;QACPM,MAAMC,IAAAA,wCAA+BpI;wBAGvC,qBAACqI,0EACKrH;QACJsH,eAAAA;QACA5C,SAASA;QACTuC,WAAWxB;QACX8B,SAAS5C;QACTF,SAASA;QACTF,QAAQA;QACRrG,WAAWoE;QACXtE,QAAQA;QACRkJ,OAAOL;QACP7H,YAAYA;QAEXoD,qBAAAA,sBAAAA,KAAAA,IAAAA,SAAU4B,sBAGf,qBAACwD;QACC9D,KAAK/C;QACL1C,MAAMA;QACNM,UAAU8G;QACVd,QAAQvH,MAAMuH;QACdE,SAASzH,MAAMyH;QACfC,SAAS1H,MAAM0H;QACf7H,OAAOsE;QACPmG,eAAAA;QACApJ,SAAS;OAER2B,kCAAoB,qBAAC5D;QAAO2H,KAAI;QAAG/G,OAAM;QACzCyC,YAAY3C,IAAI,SAACC;6BAChB,qBAACX;YAAO2H,KAAK,AAAC,GAAa,OAAXhH,KAAKC;YAASA,OAAOD,KAAKC;;SAG7CiB,wBACC,qBAAC2J;QACCC,WAAWpH;QACXqH,WAAWtJ;QACXqC,cAAc+C;QACdmE,mBAAmBpG;QACnBqG,cAAcrD;QACd1F,UAAUA;QACVgJ,gBAAgBhI;QAChBiI,WAAWhI;QACXiI,aAAajJ;QACbE,mBAAmBA;QACnBC,wBAAwBA;OAEvBmH;AAKX"}
|
|
@@ -7,6 +7,11 @@ export interface FixedLayoutProps extends React.HTMLAttributes<HTMLDivElement>,
|
|
|
7
7
|
* Это часто необходимо для фиксированных кнопок в нижней части экрана.
|
|
8
8
|
*/
|
|
9
9
|
filled?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Всегда соответствовать ширине родителя.
|
|
12
|
+
* Ширина пересчитывается по событию `window` `resize`.
|
|
13
|
+
*/
|
|
14
|
+
useParentWidth?: boolean;
|
|
10
15
|
}
|
|
11
16
|
export interface FixedLayoutState {
|
|
12
17
|
position: 'absolute' | null;
|
|
@@ -17,4 +22,4 @@ export interface FixedLayoutState {
|
|
|
17
22
|
/**
|
|
18
23
|
* @see https://vkcom.github.io/VKUI/#/FixedLayout
|
|
19
24
|
*/
|
|
20
|
-
export declare const FixedLayout: ({ children, style, vertical, getRootRef, getRef, filled, className, ...restProps }: FixedLayoutProps) => React.JSX.Element;
|
|
25
|
+
export declare const FixedLayout: ({ children, style, vertical, getRootRef, getRef, filled, className, useParentWidth, ...restProps }: FixedLayoutProps) => React.JSX.Element;
|
|
@@ -23,14 +23,15 @@ var _platform = require("../../lib/platform");
|
|
|
23
23
|
var _SplitColContext = require("../SplitCol/SplitColContext");
|
|
24
24
|
var _TooltipContainer = require("../Tooltip/TooltipContainer");
|
|
25
25
|
var FixedLayout = function(_param) {
|
|
26
|
-
var children = _param.children, style = _param.style, vertical = _param.vertical, getRootRef = _param.getRootRef, getRef = _param.getRef, filled = _param.filled, className = _param.className, restProps = _object_without_properties._(_param, [
|
|
26
|
+
var children = _param.children, style = _param.style, vertical = _param.vertical, getRootRef = _param.getRootRef, getRef = _param.getRef, filled = _param.filled, className = _param.className, useParentWidth = _param.useParentWidth, restProps = _object_without_properties._(_param, [
|
|
27
27
|
"children",
|
|
28
28
|
"style",
|
|
29
29
|
"vertical",
|
|
30
30
|
"getRootRef",
|
|
31
31
|
"getRef",
|
|
32
32
|
"filled",
|
|
33
|
-
"className"
|
|
33
|
+
"className",
|
|
34
|
+
"useParentWidth"
|
|
34
35
|
]);
|
|
35
36
|
var platform = (0, _usePlatform.usePlatform)();
|
|
36
37
|
var ref = (0, _useExternRef.useExternRef)(getRootRef, getRef); // TODO [>=6]: удалить getRef
|
|
@@ -38,7 +39,11 @@ var FixedLayout = function(_param) {
|
|
|
38
39
|
var window = (0, _dom.useDOM)().window;
|
|
39
40
|
var colRef = _react.useContext(_SplitColContext.SplitColContext).colRef;
|
|
40
41
|
var doResize = function() {
|
|
41
|
-
if (
|
|
42
|
+
if (useParentWidth && ref.current) {
|
|
43
|
+
var _ref_current_parentElement;
|
|
44
|
+
var parentWidth = (_ref_current_parentElement = ref.current.parentElement) === null || _ref_current_parentElement === void 0 ? void 0 : _ref_current_parentElement.getBoundingClientRect().width;
|
|
45
|
+
setWidth(parentWidth ? "".concat(parentWidth, "px") : undefined);
|
|
46
|
+
} else if (colRef === null || colRef === void 0 ? void 0 : colRef.current) {
|
|
42
47
|
var computedStyle = getComputedStyle(colRef.current);
|
|
43
48
|
setWidth("".concat(colRef.current.clientWidth - parseFloat(computedStyle.paddingLeft) - parseFloat(computedStyle.paddingRight), "px"));
|
|
44
49
|
} else {
|
|
@@ -47,7 +52,9 @@ var FixedLayout = function(_param) {
|
|
|
47
52
|
};
|
|
48
53
|
_react.useEffect(doResize, [
|
|
49
54
|
colRef,
|
|
50
|
-
platform
|
|
55
|
+
platform,
|
|
56
|
+
ref,
|
|
57
|
+
useParentWidth
|
|
51
58
|
]);
|
|
52
59
|
(0, _useGlobalEventListener.useGlobalEventListener)(window, "resize", doResize);
|
|
53
60
|
return /*#__PURE__*/ _react.createElement(_TooltipContainer.TooltipContainer, _object_spread_props._(_object_spread._({}, restProps), {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/FixedLayout/FixedLayout.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useGlobalEventListener } from '../../hooks/useGlobalEventListener';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { useDOM } from '../../lib/dom';\nimport { Platform } from '../../lib/platform';\nimport { HasRef, HasRootRef } from '../../types';\nimport { SplitColContext } from '../SplitCol/SplitColContext';\nimport { TooltipContainer } from '../Tooltip/TooltipContainer';\nimport styles from './FixedLayout.module.css';\n\nexport interface FixedLayoutProps\n extends React.HTMLAttributes<HTMLDivElement>,\n HasRootRef<HTMLDivElement>,\n HasRef<HTMLDivElement> {\n vertical?: 'top' | 'bottom';\n /**\n * Это свойство определяет, будет ли фон компонента окрашен в цвет фона контента.\n * Это часто необходимо для фиксированных кнопок в нижней части экрана.\n */\n filled?: boolean;\n}\n\nexport interface FixedLayoutState {\n position: 'absolute' | null;\n top: number;\n bottom: number;\n width: string;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/FixedLayout\n */\nexport const FixedLayout = ({\n children,\n style,\n vertical,\n getRootRef,\n getRef,\n filled,\n className,\n ...restProps\n}: FixedLayoutProps) => {\n const platform = usePlatform();\n const ref = useExternRef(getRootRef, getRef); // TODO [>=6]: удалить getRef\n const [width, setWidth] = React.useState<string | undefined>(undefined);\n const { window } = useDOM();\n const { colRef } = React.useContext(SplitColContext);\n const doResize = () => {\n if (colRef?.current) {\n const computedStyle = getComputedStyle(colRef.current);\n\n setWidth(\n `${\n colRef.current.clientWidth -\n parseFloat(computedStyle.paddingLeft) -\n parseFloat(computedStyle.paddingRight)\n }px`,\n );\n } else {\n setWidth(undefined);\n }\n };\n React.useEffect(doResize, [colRef, platform]);\n useGlobalEventListener(window, 'resize', doResize);\n\n return (\n <TooltipContainer\n {...restProps}\n fixed\n ref={ref}\n className={classNames(\n styles['FixedLayout'],\n platform === Platform.IOS && 'vkuiInternalFixedLayout--ios',\n filled && styles['FixedLayout--filled'],\n vertical &&\n {\n top: styles['FixedLayout--vertical-top'],\n bottom: classNames(\n styles['FixedLayout--vertical-bottom'],\n 'vkuiInternalFixedLayout--vertical-bottom',\n ),\n }[vertical],\n className,\n )}\n style={{ ...style, width }}\n >\n {children}\n </TooltipContainer>\n );\n};\n"],"names":["FixedLayout","children","style","vertical","getRootRef","getRef","filled","className","restProps","platform","usePlatform","ref","useExternRef","React","useState","undefined","width","setWidth","window","useDOM","colRef","useContext","SplitColContext","doResize","current","computedStyle","getComputedStyle","clientWidth","parseFloat","paddingLeft","paddingRight","useEffect","useGlobalEventListener","TooltipContainer","fixed","classNames","Platform","IOS","top","bottom"],"mappings":";;;;+
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/FixedLayout/FixedLayout.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useGlobalEventListener } from '../../hooks/useGlobalEventListener';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { useDOM } from '../../lib/dom';\nimport { Platform } from '../../lib/platform';\nimport { HasRef, HasRootRef } from '../../types';\nimport { SplitColContext } from '../SplitCol/SplitColContext';\nimport { TooltipContainer } from '../Tooltip/TooltipContainer';\nimport styles from './FixedLayout.module.css';\n\nexport interface FixedLayoutProps\n extends React.HTMLAttributes<HTMLDivElement>,\n HasRootRef<HTMLDivElement>,\n HasRef<HTMLDivElement> {\n vertical?: 'top' | 'bottom';\n /**\n * Это свойство определяет, будет ли фон компонента окрашен в цвет фона контента.\n * Это часто необходимо для фиксированных кнопок в нижней части экрана.\n */\n filled?: boolean;\n /**\n * Всегда соответствовать ширине родителя.\n * Ширина пересчитывается по событию `window` `resize`.\n */\n useParentWidth?: boolean;\n}\n\nexport interface FixedLayoutState {\n position: 'absolute' | null;\n top: number;\n bottom: number;\n width: string;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/FixedLayout\n */\nexport const FixedLayout = ({\n children,\n style,\n vertical,\n getRootRef,\n getRef,\n filled,\n className,\n useParentWidth,\n ...restProps\n}: FixedLayoutProps) => {\n const platform = usePlatform();\n const ref = useExternRef(getRootRef, getRef); // TODO [>=6]: удалить getRef\n const [width, setWidth] = React.useState<string | undefined>(undefined);\n const { window } = useDOM();\n const { colRef } = React.useContext(SplitColContext);\n\n const doResize = () => {\n if (useParentWidth && ref.current) {\n const parentWidth = ref.current.parentElement?.getBoundingClientRect().width;\n setWidth(parentWidth ? `${parentWidth}px` : undefined);\n } else if (colRef?.current) {\n const computedStyle = getComputedStyle(colRef.current);\n\n setWidth(\n `${\n colRef.current.clientWidth -\n parseFloat(computedStyle.paddingLeft) -\n parseFloat(computedStyle.paddingRight)\n }px`,\n );\n } else {\n setWidth(undefined);\n }\n };\n React.useEffect(doResize, [colRef, platform, ref, useParentWidth]);\n useGlobalEventListener(window, 'resize', doResize);\n\n return (\n <TooltipContainer\n {...restProps}\n fixed\n ref={ref}\n className={classNames(\n styles['FixedLayout'],\n platform === Platform.IOS && 'vkuiInternalFixedLayout--ios',\n filled && styles['FixedLayout--filled'],\n vertical &&\n {\n top: styles['FixedLayout--vertical-top'],\n bottom: classNames(\n styles['FixedLayout--vertical-bottom'],\n 'vkuiInternalFixedLayout--vertical-bottom',\n ),\n }[vertical],\n className,\n )}\n style={{ ...style, width }}\n >\n {children}\n </TooltipContainer>\n );\n};\n"],"names":["FixedLayout","children","style","vertical","getRootRef","getRef","filled","className","useParentWidth","restProps","platform","usePlatform","ref","useExternRef","React","useState","undefined","width","setWidth","window","useDOM","colRef","useContext","SplitColContext","doResize","current","parentWidth","parentElement","getBoundingClientRect","computedStyle","getComputedStyle","clientWidth","parseFloat","paddingLeft","paddingRight","useEffect","useGlobalEventListener","TooltipContainer","fixed","classNames","Platform","IOS","top","bottom"],"mappings":";;;;+BAuCaA;;;eAAAA;;;;;;;;+DAvCU;oBACI;4BACE;sCACU;2BACX;mBACL;wBACE;+BAEO;gCACC;AA8B1B,IAAMA,cAAc;QACzBC,kBAAAA,UACAC,eAAAA,OACAC,kBAAAA,UACAC,oBAAAA,YACAC,gBAAAA,QACAC,gBAAAA,QACAC,mBAAAA,WACAC,wBAAAA,gBACGC;QARHR;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;;IAGA,IAAME,WAAWC,IAAAA;IACjB,IAAMC,MAAMC,IAAAA,4BAAaT,YAAYC,SAAS,6BAA6B;IAC3E,IAA0BS,qCAAAA,OAAMC,SAA6BC,gBAAtDC,QAAmBH,oBAAZI,WAAYJ;IAC1B,IAAM,AAAEK,SAAWC,IAAAA,eAAXD;IACR,IAAM,AAAEE,SAAWP,OAAMQ,WAAWC,kCAA5BF;IAER,IAAMG,WAAW;QACf,IAAIhB,kBAAkBI,IAAIa,SAAS;gBACbb;YAApB,IAAMc,cAAcd,CAAAA,6BAAAA,IAAIa,QAAQE,2BAAZf,wCAAAA,KAAAA,IAAAA,2BAA2BgB,wBAAwBX;YACvEC,SAASQ,cAAc,AAAC,GAAc,OAAZA,aAAY,QAAMV;QAC9C,OAAO,IAAIK,mBAAAA,oBAAAA,KAAAA,IAAAA,OAAQI,SAAS;YAC1B,IAAMI,gBAAgBC,iBAAiBT,OAAOI;YAE9CP,SACE,AAAC,GAIA,OAHCG,OAAOI,QAAQM,cACfC,WAAWH,cAAcI,eACzBD,WAAWH,cAAcK,eAC1B;QAEL,OAAO;YACLhB,SAASF;QACX;IACF;IACAF,OAAMqB,UAAUX,UAAU;QAACH;QAAQX;QAAUE;QAAKJ;KAAe;IACjE4B,IAAAA,gDAAuBjB,QAAQ,UAAUK;IAEzC,qBACE,qBAACa,gFACK5B;QACJ6B,OAAAA;QACA1B,KAAKA;QACLL,WAAWgC,IAAAA,qCAET7B,aAAa8B,mBAASC,OAAO,gCAC7BnC,qCACAH,YACE,CAAA;YACEuC,GAAG;YACHC,QAAQJ,IAAAA,sDAEN;QAEJ,CAAA,CAAC,CAACpC,SAAS,EACbI;QAEFL,OAAO,4CAAKA;YAAOe,OAAAA;;QAElBhB;AAGP"}
|
|
@@ -24,10 +24,9 @@ var _ModalRootContext = require("../ModalRoot/ModalRootContext");
|
|
|
24
24
|
var _Separator = require("../Separator/Separator");
|
|
25
25
|
var _Spacing = require("../Spacing/Spacing");
|
|
26
26
|
var _Footnote = require("../Typography/Footnote/Footnote");
|
|
27
|
-
var
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}, _define_property._(_obj, _adaptivity.SizeType.COMPACT, "vkuiGroup--sizeX-compact"), _define_property._(_obj, _adaptivity.SizeType.REGULAR, "vkuiGroup--sizeX-regular"), _obj);
|
|
27
|
+
var sizeXClassNames = _define_property._({
|
|
28
|
+
none: (0, _vkjs.classNames)("vkuiGroup--sizeX-none", "vkuiInternalGroup--sizeX-none")
|
|
29
|
+
}, _adaptivity.SizeType.COMPACT, "vkuiGroup--sizeX-compact");
|
|
31
30
|
var warn = (0, _warnOnce.warnOnce)("Group");
|
|
32
31
|
var Group = function(_param) {
|
|
33
32
|
var header = _param.header, description = _param.description, children = _param.children, _param_separator = _param.separator, separator = _param_separator === void 0 ? "auto" : _param_separator, getRootRef = _param.getRootRef, modeProps = _param.mode, _param_padding = _param.padding, padding = _param_padding === void 0 ? "m" : _param_padding, className = _param.className, tabIndexProp = _param.tabIndex, restProps = _object_without_properties._(_param, [
|
|
@@ -49,6 +48,9 @@ var Group = function(_param) {
|
|
|
49
48
|
// Подробнее в "none" можно прочитать в ADAPTIVITY_GUIDE.md
|
|
50
49
|
mode = isInsideModal ? "plain" : "none";
|
|
51
50
|
}
|
|
51
|
+
if (mode === "none" && sizeX !== "none") {
|
|
52
|
+
mode = sizeX === _adaptivity.SizeType.REGULAR ? "card" : "plain";
|
|
53
|
+
}
|
|
52
54
|
var isTabPanel = restProps.role === "tabpanel";
|
|
53
55
|
if (process.env.NODE_ENV === "development" && isTabPanel && (!restProps["aria-controls"] || !restProps["id"])) {
|
|
54
56
|
warn('При использовании роли "tabpanel" необходимо задать значение свойств "aria-controls" и "id"');
|
|
@@ -58,7 +60,7 @@ var Group = function(_param) {
|
|
|
58
60
|
return /*#__PURE__*/ _react.createElement(_react.Fragment, null, /*#__PURE__*/ _react.createElement("section", _object_spread_props._(_object_spread._({}, restProps), {
|
|
59
61
|
tabIndex: tabIndex,
|
|
60
62
|
ref: getRootRef,
|
|
61
|
-
className: (0, _vkjs.classNames)("vkuiInternalGroup", "vkuiGroup", platform === _platform.Platform.IOS && "vkuiGroup--ios", sizeXClassNames[sizeX], mode && ({
|
|
63
|
+
className: (0, _vkjs.classNames)("vkuiInternalGroup", "vkuiGroup", platform === _platform.Platform.IOS && "vkuiGroup--ios", sizeX !== _adaptivity.SizeType.REGULAR && sizeXClassNames[sizeX], mode && ({
|
|
62
64
|
none: (0, _vkjs.classNames)("vkuiGroup--mode-none", "vkuiInternalGroup--mode-none"),
|
|
63
65
|
plain: (0, _vkjs.classNames)("vkuiGroup--mode-plain", "vkuiInternalGroup--mode-plain"),
|
|
64
66
|
card: (0, _vkjs.classNames)("vkuiGroup--mode-card", "vkuiInternalGroup--mode-card")
|