@vkontakte/vkui 5.9.1 → 5.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/dist/cjs/components/Alert/Alert.d.ts +3 -3
  2. package/dist/cjs/components/Alert/Alert.d.ts.map +1 -1
  3. package/dist/cjs/components/Alert/Alert.js +5 -3
  4. package/dist/cjs/components/Alert/Alert.js.map +1 -1
  5. package/dist/cjs/components/CalendarRange/CalendarRange.d.ts +1 -1
  6. package/dist/cjs/components/CalendarRange/CalendarRange.d.ts.map +1 -1
  7. package/dist/cjs/components/CalendarRange/CalendarRange.js +1 -2
  8. package/dist/cjs/components/CalendarRange/CalendarRange.js.map +1 -1
  9. package/dist/cjs/components/ChipsSelect/ChipsSelect.js +1 -1
  10. package/dist/cjs/components/ChipsSelect/ChipsSelect.js.map +1 -1
  11. package/dist/cjs/components/CustomScrollView/CustomScrollView.d.ts +4 -2
  12. package/dist/cjs/components/CustomScrollView/CustomScrollView.d.ts.map +1 -1
  13. package/dist/cjs/components/CustomScrollView/CustomScrollView.js +17 -5
  14. package/dist/cjs/components/CustomScrollView/CustomScrollView.js.map +1 -1
  15. package/dist/cjs/components/CustomSelect/CustomSelect.d.ts +4 -1
  16. package/dist/cjs/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  17. package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
  18. package/dist/cjs/components/FormLayout/FormLayout.d.ts +3 -3
  19. package/dist/cjs/components/FormLayout/FormLayout.d.ts.map +1 -1
  20. package/dist/cjs/components/FormLayout/FormLayout.js +5 -2
  21. package/dist/cjs/components/FormLayout/FormLayout.js.map +1 -1
  22. package/dist/cjs/components/Gallery/Gallery.d.ts.map +1 -1
  23. package/dist/cjs/components/Gallery/Gallery.js +3 -10
  24. package/dist/cjs/components/Gallery/Gallery.js.map +1 -1
  25. package/dist/cjs/components/Gallery/hooks.d.ts +2 -0
  26. package/dist/cjs/components/Gallery/hooks.d.ts.map +1 -0
  27. package/dist/cjs/components/Gallery/hooks.js +52 -0
  28. package/dist/cjs/components/Gallery/hooks.js.map +1 -0
  29. package/dist/cjs/components/ModalPageHeader/ModalPageHeader.d.ts +3 -3
  30. package/dist/cjs/components/ModalPageHeader/ModalPageHeader.d.ts.map +1 -1
  31. package/dist/cjs/components/ModalPageHeader/ModalPageHeader.js +5 -2
  32. package/dist/cjs/components/ModalPageHeader/ModalPageHeader.js.map +1 -1
  33. package/dist/cjs/components/ModalRoot/ModalRoot.js +6 -8
  34. package/dist/cjs/components/ModalRoot/ModalRoot.js.map +1 -1
  35. package/dist/cjs/components/VisuallyHiddenInput/VisuallyHiddenInput.d.ts +3 -3
  36. package/dist/cjs/components/VisuallyHiddenInput/VisuallyHiddenInput.d.ts.map +1 -1
  37. package/dist/cjs/components/VisuallyHiddenInput/VisuallyHiddenInput.js +6 -3
  38. package/dist/cjs/components/VisuallyHiddenInput/VisuallyHiddenInput.js.map +1 -1
  39. package/dist/cjs/lib/floating/adapters.d.ts +1 -1
  40. package/dist/cjs/lib/floating/adapters.d.ts.map +1 -1
  41. package/dist/cjs/lib/floating/adapters.js +1 -1
  42. package/dist/cjs/lib/floating/adapters.js.map +1 -1
  43. package/dist/cjs/lib/floating/index.d.ts +1 -1
  44. package/dist/cjs/lib/floating/index.d.ts.map +1 -1
  45. package/dist/cjs/lib/floating/index.js +1 -1
  46. package/dist/cjs/lib/floating/index.js.map +1 -1
  47. package/dist/cjs/lib/floating/types.d.ts +2 -2
  48. package/dist/cjs/lib/floating/types.d.ts.map +1 -1
  49. package/dist/components/Alert/Alert.d.ts +3 -3
  50. package/dist/components/Alert/Alert.d.ts.map +1 -1
  51. package/dist/components/Alert/Alert.js +5 -3
  52. package/dist/components/Alert/Alert.js.map +1 -1
  53. package/dist/components/CalendarRange/CalendarRange.d.ts +1 -1
  54. package/dist/components/CalendarRange/CalendarRange.d.ts.map +1 -1
  55. package/dist/components/CalendarRange/CalendarRange.js +1 -2
  56. package/dist/components/CalendarRange/CalendarRange.js.map +1 -1
  57. package/dist/components/ChipsSelect/ChipsSelect.js +1 -1
  58. package/dist/components/ChipsSelect/ChipsSelect.js.map +1 -1
  59. package/dist/components/CustomScrollView/CustomScrollView.d.ts +4 -2
  60. package/dist/components/CustomScrollView/CustomScrollView.d.ts.map +1 -1
  61. package/dist/components/CustomScrollView/CustomScrollView.js +17 -5
  62. package/dist/components/CustomScrollView/CustomScrollView.js.map +1 -1
  63. package/dist/components/CustomSelect/CustomSelect.d.ts +4 -1
  64. package/dist/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  65. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  66. package/dist/components/FormLayout/FormLayout.d.ts +3 -3
  67. package/dist/components/FormLayout/FormLayout.d.ts.map +1 -1
  68. package/dist/components/FormLayout/FormLayout.js +5 -2
  69. package/dist/components/FormLayout/FormLayout.js.map +1 -1
  70. package/dist/components/Gallery/Gallery.d.ts.map +1 -1
  71. package/dist/components/Gallery/Gallery.js +3 -10
  72. package/dist/components/Gallery/Gallery.js.map +1 -1
  73. package/dist/components/Gallery/hooks.d.ts +2 -0
  74. package/dist/components/Gallery/hooks.d.ts.map +1 -0
  75. package/dist/components/Gallery/hooks.js +41 -0
  76. package/dist/components/Gallery/hooks.js.map +1 -0
  77. package/dist/components/ModalPageHeader/ModalPageHeader.d.ts +3 -3
  78. package/dist/components/ModalPageHeader/ModalPageHeader.d.ts.map +1 -1
  79. package/dist/components/ModalPageHeader/ModalPageHeader.js +5 -2
  80. package/dist/components/ModalPageHeader/ModalPageHeader.js.map +1 -1
  81. package/dist/components/ModalRoot/ModalRoot.js +6 -8
  82. package/dist/components/ModalRoot/ModalRoot.js.map +1 -1
  83. package/dist/components/VisuallyHiddenInput/VisuallyHiddenInput.d.ts +3 -3
  84. package/dist/components/VisuallyHiddenInput/VisuallyHiddenInput.d.ts.map +1 -1
  85. package/dist/components/VisuallyHiddenInput/VisuallyHiddenInput.js +6 -3
  86. package/dist/components/VisuallyHiddenInput/VisuallyHiddenInput.js.map +1 -1
  87. package/dist/components.css +5 -5
  88. package/dist/components.css.map +1 -1
  89. package/dist/components.js.tmp +3719 -2461
  90. package/dist/cssm/components/Alert/Alert.d.ts +3 -3
  91. package/dist/cssm/components/Alert/Alert.d.ts.map +1 -1
  92. package/dist/cssm/components/Alert/Alert.js +3 -2
  93. package/dist/cssm/components/Alert/Alert.js.map +1 -1
  94. package/dist/cssm/components/Button/Button.module.css +3 -1
  95. package/dist/cssm/components/CalendarRange/CalendarRange.d.ts +1 -1
  96. package/dist/cssm/components/CalendarRange/CalendarRange.d.ts.map +1 -1
  97. package/dist/cssm/components/CalendarRange/CalendarRange.js +1 -1
  98. package/dist/cssm/components/CalendarRange/CalendarRange.js.map +1 -1
  99. package/dist/cssm/components/ChipsSelect/ChipsSelect.js +1 -1
  100. package/dist/cssm/components/ChipsSelect/ChipsSelect.js.map +1 -1
  101. package/dist/cssm/components/CustomScrollView/CustomScrollView.d.ts +4 -2
  102. package/dist/cssm/components/CustomScrollView/CustomScrollView.d.ts.map +1 -1
  103. package/dist/cssm/components/CustomScrollView/CustomScrollView.js +4 -2
  104. package/dist/cssm/components/CustomScrollView/CustomScrollView.js.map +1 -1
  105. package/dist/cssm/components/CustomSelect/CustomSelect.d.ts +4 -1
  106. package/dist/cssm/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  107. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  108. package/dist/cssm/components/CustomSelectOption/CustomSelectOption.module.css +0 -5
  109. package/dist/cssm/components/FormLayout/FormLayout.d.ts +3 -3
  110. package/dist/cssm/components/FormLayout/FormLayout.d.ts.map +1 -1
  111. package/dist/cssm/components/FormLayout/FormLayout.js +4 -2
  112. package/dist/cssm/components/FormLayout/FormLayout.js.map +1 -1
  113. package/dist/cssm/components/Gallery/Gallery.d.ts.map +1 -1
  114. package/dist/cssm/components/Gallery/Gallery.js +2 -7
  115. package/dist/cssm/components/Gallery/Gallery.js.map +1 -1
  116. package/dist/cssm/components/Gallery/hooks.d.ts +2 -0
  117. package/dist/cssm/components/Gallery/hooks.d.ts.map +1 -0
  118. package/dist/cssm/components/Gallery/hooks.js +39 -0
  119. package/dist/cssm/components/Gallery/hooks.js.map +1 -0
  120. package/dist/cssm/components/ModalPage/ModalPage.module.css +1 -4
  121. package/dist/cssm/components/ModalPageHeader/ModalPageHeader.d.ts +3 -3
  122. package/dist/cssm/components/ModalPageHeader/ModalPageHeader.d.ts.map +1 -1
  123. package/dist/cssm/components/ModalPageHeader/ModalPageHeader.js +4 -2
  124. package/dist/cssm/components/ModalPageHeader/ModalPageHeader.js.map +1 -1
  125. package/dist/cssm/components/ModalRoot/ModalRoot.js +6 -8
  126. package/dist/cssm/components/ModalRoot/ModalRoot.js.map +1 -1
  127. package/dist/cssm/components/PanelHeaderButton/PanelHeaderButton.module.css +7 -1
  128. package/dist/cssm/components/Snackbar/Snackbar.module.css +1 -1
  129. package/dist/cssm/components/VisuallyHiddenInput/VisuallyHiddenInput.d.ts +3 -3
  130. package/dist/cssm/components/VisuallyHiddenInput/VisuallyHiddenInput.d.ts.map +1 -1
  131. package/dist/cssm/components/VisuallyHiddenInput/VisuallyHiddenInput.js +4 -2
  132. package/dist/cssm/components/VisuallyHiddenInput/VisuallyHiddenInput.js.map +1 -1
  133. package/dist/cssm/lib/floating/adapters.d.ts +1 -1
  134. package/dist/cssm/lib/floating/adapters.d.ts.map +1 -1
  135. package/dist/cssm/lib/floating/adapters.js +1 -1
  136. package/dist/cssm/lib/floating/adapters.js.map +1 -1
  137. package/dist/cssm/lib/floating/index.d.ts +1 -1
  138. package/dist/cssm/lib/floating/index.d.ts.map +1 -1
  139. package/dist/cssm/lib/floating/index.js +1 -1
  140. package/dist/cssm/lib/floating/index.js.map +1 -1
  141. package/dist/cssm/lib/floating/types.d.ts +2 -2
  142. package/dist/cssm/lib/floating/types.d.ts.map +1 -1
  143. package/dist/cssm/lib/floating/types.js.map +1 -1
  144. package/dist/lib/floating/adapters.d.ts +1 -1
  145. package/dist/lib/floating/adapters.d.ts.map +1 -1
  146. package/dist/lib/floating/adapters.js +1 -1
  147. package/dist/lib/floating/adapters.js.map +1 -1
  148. package/dist/lib/floating/index.d.ts +1 -1
  149. package/dist/lib/floating/index.d.ts.map +1 -1
  150. package/dist/lib/floating/index.js +1 -1
  151. package/dist/lib/floating/index.js.map +1 -1
  152. package/dist/lib/floating/types.d.ts +2 -2
  153. package/dist/lib/floating/types.d.ts.map +1 -1
  154. package/dist/lib/floating/types.js.map +1 -1
  155. package/dist/vkui.css +5 -5
  156. package/dist/vkui.css.map +1 -1
  157. package/dist/vkui.js.tmp +3719 -2461
  158. package/package.json +2 -2
  159. package/src/components/Alert/Alert.tsx +10 -3
  160. package/src/components/Button/Button.module.css +3 -1
  161. package/src/components/CalendarRange/CalendarRange.tsx +0 -1
  162. package/src/components/ChipsSelect/ChipsSelect.tsx +1 -1
  163. package/src/components/CustomScrollView/CustomScrollView.tsx +13 -2
  164. package/src/components/CustomSelect/CustomSelect.tsx +5 -1
  165. package/src/components/CustomSelectOption/CustomSelectOption.module.css +0 -5
  166. package/src/components/FormLayout/FormLayout.tsx +8 -3
  167. package/src/components/Gallery/Gallery.tsx +2 -6
  168. package/src/components/Gallery/hooks.ts +39 -0
  169. package/src/components/ModalPage/ModalPage.module.css +1 -4
  170. package/src/components/ModalPageHeader/ModalPageHeader.tsx +8 -4
  171. package/src/components/ModalRoot/ModalRoot.tsx +6 -5
  172. package/src/components/PanelHeaderButton/PanelHeaderButton.module.css +6 -1
  173. package/src/components/Snackbar/Snackbar.module.css +1 -1
  174. package/src/components/VisuallyHiddenInput/VisuallyHiddenInput.tsx +6 -2
  175. package/src/lib/floating/adapters.ts +1 -1
  176. package/src/lib/floating/index.ts +1 -1
  177. package/src/lib/floating/types.ts +2 -2
@@ -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 (opened &&\n dropdownOffsetDistance === 0 &&\n (popperPlacement?.includes('top')\n ? styles['CustomSelect--pop-up']\n : styles['CustomSelect--pop-down'])) ||\n undefined,\n [dropdownOffsetDistance, opened, popperPlacement],\n );\n\n const 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","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","classNames","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,oBAAQ,CAACC,OAAO;AAGnB,IAAMC,iBAAiB;QAACC,2EAAyC,EAAE,EAAEC,8EAAa,CAAC;IACjF,IAAIA,cAAcD,QAAQE,MAAM,GAAG,GAAG;QACpC,OAAO,CAAC;IACV;IACA,OAAOF,QAAQG,SAAS,CAAC,SAACC,QAAQC;eAAMA,IAAIJ,cAAc,CAACG,OAAOE,QAAQ;;AAC5E;AAEA,IAAMC,kBAAkB;QACtBP,2EAAyC,EAAE,EAC3CQ,4EAAmBR,QAAQE,MAAM;IAEjC,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,QAAQ,EAAE;YACpBG,SAASJ;YACT;QACF;IACF;IACA,OAAOI;AACT;AAEA,IAAMC,OAAOC,IAAAA,kBAAQ,EAAC;AAEtB,IAAMC,wBAAwB,SAACZ;IAC7B,IAAI,IAAIa,IAAIb,QAAQc,GAAG,CAAC,SAACC;eAAS,UAAiB,CAAVA,KAAKC,KAAK;QAAGC,IAAI,GAAG,GAAG;QAC9DP,KACE,+FACA;IAEJ;AACF;AAEA,SAASQ,sBAAsB;QAAEd,SAAF,OAAEA,QAAWe,qCAAb;QAAEf;;IAC/B,qBAAO,qBAACgB,sCAAkB,EAAKD;AACjC;AAEA,IAAME,mBAAsC,SAACC;IAC3CA,EAAEC,cAAc;AAClB;AAEA,SAASC,kBACPxB,OAAsC,EACtCgB,KAAkB,EAClBS,SAAkB;IAElB,IAAIA,aAAaT,UAAU,IAAI;QAC7B,OAAO,CAAC;IACV;QAEEhB;IADF,OACEA,CAAAA,qBAAAA,QAAQG,SAAS,CAAC,SAACY;QACjBC,QAAQ,OAAOD,KAAKC,KAAK,KAAK,WAAWU,OAAOV,SAASA;QACzD,OAAOD,KAAKC,KAAK,KAAKA;IACxB,gBAHAhB,gCAAAA,qBAGM,CAAC;AAEX;AAEA,IAAM2B,SAAS,SACb3B,SACA4B,YACAC;IAEA,OAAO,OAAOA,aAAa,aACvB7B,QAAQ2B,MAAM,CAAC,SAACvB;eAAWyB,SAASD,YAAYxB;SAChDJ;AACN;AAEA,IAAM8B,iBAAgD,EAAE;AA0FjD,SAASpC,aAAayB,KAAkB;IAC7C,IAA4BY,qCAAAA,OAAMC,QAAQ,CAAC,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,uBAAe,oBAC1BC,AAAMC,WAMJ1C,MANFyC,2BAMEzC,MALF2C,aAAAA,8CAAcC,gDAAuB,iDAKnC5C,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,GAAG,CAACC,QAAQ,KAAK,eAAe;QAC1C1D,sBAAsB6C;IACxB;IAEA,IAA2Bc,kBAAAA,IAAAA,4BAAa,4BAAbA,gBAAnBC,OAAAA,0CAAQ;IAEhB,IAAMC,eAAe1C,OAAM2C,MAAM,CAAmB;IACpD,IAAMC,gBAAgBC,IAAAA,0BAAY,EAACH,cAAclC;IACjD,IAAMsC,eAAe9C,OAAM2C,MAAM,CAAwB;IACzD,IAAMI,cAAcF,IAAAA,0BAAY,EAACtC;IAEjC,IAAoDP,sCAAAA,OAAMC,QAAQ,CAAqB,CAAC,QAAjF+C,qBAA6ChD,qBAAzBiD,wBAAyBjD;IACpD,IAAsDA,sCAAAA,OAAMC,QAAQ,CAACb,MAAMH,KAAK,KAAKiE,gBAA9EC,sBAA+CnD,qBAA1BoD,yBAA0BpD;IACtD,IAAoCA,sCAAAA,OAAMC,QAAQ,CAAC,SAA5CJ,aAA6BG,qBAAjBqD,gBAAiBrD;IACpC,IAAkDA,sCAAAA,OAAMC,QAAQ,CAC9D;YAAMb,cAAAA;eAAAA,CAAAA,OAAAA,CAAAA,eAAAA,MAAMH,KAAK,cAAXG,0BAAAA,eAAeA,MAAMkE,YAAY,cAAjClE,kBAAAA,OAAsC6C,mBAAmB,KAAKiB;IAAS,QADxEK,oBAA2CvD,qBAAxBwD,uBAAwBxD;IAGlD,IAA0CA,sCAAAA,OAAMC,QAAQ,CAAC,SAAlDwD,gBAAmCzD,qBAApB0D,mBAAoB1D;IAC1C,IAA8CA,sCAAAA,OAAMC,QAAQ,CAC1DiD,gBADKS,kBAAuC3D,qBAAtB4D,qBAAsB5D;IAG9C,IAA8BA,sCAAAA,OAAMC,QAAQ,CAACyB,kBAAtCzD,UAAuB+B,qBAAd6D,aAAc7D;QAEGZ;IADjC,IAAsDY,sCAAAA,OAAMC,QAAQ,CAClER,kBAAkBiC,aAAatC,CAAAA,eAAAA,MAAMH,KAAK,cAAXG,0BAAAA,eAAeA,MAAMkE,YAAY,EAAErB,wBAD7D6B,sBAA+C9D,qBAA1B+D,yBAA0B/D;IAItDA,OAAMgE,SAAS,CAAC;QACdZ,uBAAuBhE,MAAMH,KAAK,KAAKiE;QACvCM,qBAAqB,SAACD;gBAAsBnE;mBAAAA,CAAAA,eAAAA,MAAMH,KAAK,cAAXG,0BAAAA,eAAemE;QAAgB;IAC7E,GAAG;QAACnE,MAAMH,KAAK;KAAC;IAEhBgF,IAAAA,oDAAyB,EAAC;QACxB,IACEhG,QAAQiG,IAAI,CAAC;gBAAGjF,cAAAA;mBAAYsE,sBAAsBtE;cACjDgD,oBAAoBsB,sBAAsB,IAC3C;gBAGAR;YAFA,IAAMoB,QAAQ,IAAIC,MAAM,UAAU;gBAAEC,SAAS;YAAK;aAElDtB,uBAAAA,YAAYuB,OAAO,cAAnBvB,2CAAAA,qBAAqBwB,aAAa,CAACJ;QACrC;IACF,GAAG;QAACZ;KAAkB;IAEtB,IAAMiB,WAAWxE,OAAMyE,OAAO,CAAC;QAC7B,IAAI,CAACxG,QAAQE,MAAM,EAAE;YACnB,OAAO;QACT;QAEA,OAAO2F,wBAAwBZ,YAAYjF,OAAO,CAAC6F,oBAAoB,GAAGZ;IAC5E,GAAG;QAACjF;QAAS6F;KAAoB;IAEjC,IAAMY,mBAAmB1E,OAAMyE,OAAO,CACpC;eACE,AAACvE,UACCgC,2BAA2B,KAC1ByB,CAAAA,CAAAA,4BAAAA,sCAAAA,gBAAiBgB,QAAQ,CAAC,mEAEQ,KACrCzB;OACF;QAAChB;QAAwBhC;QAAQyD;KAAgB;IAGnD,IAAMiB,qBAAqB5E,OAAM6E,WAAW,CAAC;QAC3CnB,iBAAiB;IACnB,GAAG,EAAE;IAEL,IAAMoB,kBAAkB9E,OAAM6E,WAAW,CAAC,SAACE;YAAeC,0EAAS;QACjE,IAAMC,WAAWnC,aAAawB,OAAO;QACrC,IAAMtF,OAAOiG,WAAYA,SAASrE,QAAQ,CAACmE,MAAM,GAAmB;QAEpE,IAAI,CAAC/F,QAAQ,CAACiG,UAAU;YACtB;QACF;QAEA,IAAMC,iBAAiBD,SAASE,YAAY;QAC5C,IAAMC,YAAYH,SAASG,SAAS;QACpC,IAAMC,UAAUrG,KAAKsG,SAAS;QAC9B,IAAMC,aAAavG,KAAKmG,YAAY;QAEpC,IAAIH,QAAQ;YACVC,SAASG,SAAS,GAAGC,UAAUH,iBAAiB,IAAIK,aAAa;QACnE,OAAO,IAAIF,UAAUE,aAAaL,iBAAiBE,WAAW;YAC5DH,SAASG,SAAS,GAAGC,UAAUH,iBAAiBK;QAClD,OAAO,IAAIF,UAAUD,WAAW;YAC9BH,SAASG,SAAS,GAAGC;QACvB;IACF,GAAG,EAAE;IAEL,IAAMG,eAAexF,OAAM6E,WAAW,CACpC,SAACE;YAC+B9G;QAA9B,OAAO8G,SAAS,KAAKA,QAAS9G,CAAAA,CAAAA,kBAAAA,QAAQE,MAAM,cAAdF,6BAAAA,kBAAkB,CAAA;IAClD,GACA;QAACA,QAAQE,MAAM;KAAC;IAGlB,IAAMsH,qBAAqBzF,OAAM6E,WAAW,CAC1C,SAACE;YAA2BW,4EAAW;YACYzH;QAAjD,IAAI8G,UAAU7B,aAAa6B,QAAQ,KAAKA,QAAQ,AAAC9G,CAAAA,CAAAA,kBAAAA,QAAQE,MAAM,cAAdF,6BAAAA,kBAAkB,CAAA,IAAK,GAAG;YACzE;QACF;QAEA,IAAMI,SAASJ,OAAO,CAAC8G,MAAM;QAE7B,IAAI1G,mBAAAA,6BAAAA,OAAQE,QAAQ,EAAE;YACpB;QACF;QAEA,IAAImH,UAAU;YACZZ,gBAAgBC;QAClB;QAEA,mDAAmD;QACnD9B,sBAAsB,SAACD;mBACrBA,uBAAuB+B,QAAQA,QAAQ/B;;IAE3C,GACA;QAAC/E;QAAS6G;KAAgB;IAG5B,IAAMa,kBAAkB3F,OAAM6E,WAAW,CAAC;QACxC,OAAO/B,aAAawB,OAAO,KAAK;IAClC,GAAG,EAAE;IAEL,IAAMsB,kBAAkB5F,OAAM6E,WAAW,CACvC,SAACgB;QACC/C,aAAawB,OAAO,GAAGuB;QAEvB,IAAIA,OAAO/B,wBAAwBZ,aAAasC,aAAa1B,sBAAsB;YACjF;gBACEgB,gBAAgBhB,qBAAqB;YACvC;QACF;IACF,GACA;QAAC0B;QAAcV;QAAiBhB;KAAoB;IAGtD,IAAMgC,kBAAkB9F,OAAM6E,WAAW,CACvC,SAACkB;QACC,IAAMC,YAAYvC,gBAAgBsC;QAElC,IAAME,cAAchI,QAAQG,SAAS,CAAC,SAACC;YACrC,OAAO6H,IAAAA,2BAAoB,EAAC7H,OAAO8H,KAAK,EAAEC,WAAW,GAAGzB,QAAQ,CAACqB;QACnE;QAEA,IAAIC,gBAAgB/C,aAAa+C,cAAc,CAAC,GAAG;YACjDR,mBAAmBQ;QACrB;QAEAvC,iBAAiBsC;IACnB,GACA;QAACP;QAAoBhC;QAAexF;KAAQ;IAG9C;;;GAGC,GACD,IAAMoI,QAAQrG,OAAM6E,WAAW,CAAC;QAC9BD;QAEAvB,cAAc;QACdlD,UAAU;QACV8C,sBAAsB,CAAC;QACvBhC,oBAAAA,8BAAAA;IACF,GAAG;QAACA;QAAS2D;KAAmB;IAEhC,IAAM0B,eAAetG,OAAM6E,WAAW,CACpC,SAACE;QACC,IAAM/F,OAAOf,OAAO,CAAC8G,MAAM;QAE3BvB,qBAAqBxE,iBAAAA,2BAAAA,KAAMC,KAAK;QAChCoH;QAEA,IAAME,8DACJpD,uBACA/D,MAAMH,KAAK,KAAKsE,qBAChBA,uBAAsBvE,iBAAAA,2BAAAA,KAAMC,KAAK;QAEnC,IAAIsH,6DAA6D;gBAE/DxD;YADA,IAAMoB,QAAQ,IAAIC,MAAM,UAAU;gBAAEC,SAAS;YAAK;aAClDtB,uBAAAA,YAAYuB,OAAO,cAAnBvB,2CAAAA,qBAAqBwB,aAAa,CAACJ;QACrC;IACF,GACA;QAACkC;QAAOpI;QAAS8E;QAAaI;QAAqB/D,MAAMH,KAAK;QAAEsE;KAAkB;IAGpF,IAAMiD,gBAAgBxG,OAAM6E,WAAW,CAAC;QACtC,IAAI7B,uBAAuBE,aAAa,CAACsC,aAAaxC,qBAAqB;YACzE;QACF;QAEAsD,aAAatD;IACf,GAAG;QAACA;QAAoBwC;QAAcc;KAAa;IAEnD,IAAMG,OAAOzG,OAAM6E,WAAW,CAAC;QAC7B1E,UAAU;QACV8C,sBAAsBa;QAEtB,IAAI,OAAO9C,WAAW,YAAY;YAChCA;QACF;IACF,GAAG;QAACA;QAAQ8C;KAAoB;IAEhC,IAAM4C,SAAS1G,OAAM6E,WAAW,CAAC;YAG/B9B;QAFAsD;QACA,IAAMlC,QAAQ,IAAIC,MAAM;SACxBrB,uBAAAA,YAAYuB,OAAO,cAAnBvB,2CAAAA,qBAAqBwB,aAAa,CAACJ;IACrC,GAAG;QAACkC;QAAOtD;KAAY;IAEvB,IAAM4D,qBAAqB3G,OAAM6E,WAAW,CAAC;QAC3C5B,sBAAsB,CAAC;IACzB,GAAG,EAAE;IAEL,IAAM2D,UAAU5G,OAAM6E,WAAW,CAAC;YAEhC9B;QADA,IAAMoB,QAAQ,IAAIC,MAAM;SACxBrB,uBAAAA,YAAYuB,OAAO,cAAnBvB,2CAAAA,qBAAqBwB,aAAa,CAACJ;IACrC,GAAG;QAACpB;KAAY;IAEhB,IAAM8D,UAAU7G,OAAM6E,WAAW,CAAC;QAChC,IAAI3E,QAAQ;YACVmG;QACF,OAAO;YACLI;QACF;IACF,GAAG;QAACJ;QAAOI;QAAMvG;KAAO;IAExB,IAAM4G,cAAc9G,OAAMyE,OAAO,CAAC;eAAMsC,IAAAA,eAAQ,EAACnC,oBAAoB;OAAO;QAACA;KAAmB;IAEhG,IAAMoC,cAAchH,OAAM6E,WAAW,CACnC,SAACoC;QACC,IAAIlC,QAAQ/B;QAEZ,IAAIiE,SAAS,QAAQ;YACnB,IAAMC,YAAYlJ,eAAeC,SAAS8G;YAC1CA,QAAQmC,cAAc,CAAC,IAAIlJ,eAAeC,WAAWiJ,WAAW,kDAAkD;QACpH,OAAO,IAAID,SAAS,QAAQ;YAC1B,IAAME,cAAc3I,gBAAgBP,SAAS8G;YAC7CA,QAAQoC,gBAAgB,CAAC,IAAI3I,gBAAgBP,WAAWkJ,aAAa,0DAA0D;QACjI;QAEA1B,mBAAmBV;IACrB,GACA;QAACU;QAAoBzC;QAAoB/E;KAAQ;IAGnD+B,OAAMgE,SAAS,CACb,SAASoD;YACOhI,cAAAA;QAAd,IAAMH,QAAQG,CAAAA,OAAAA,CAAAA,eAAAA,MAAMH,KAAK,cAAXG,0BAAAA,eAAemE,+BAAfnE,kBAAAA,OAAoCA,MAAMkE,YAAY;QAEpE,IAAMrF,UACJsD,cAAc1B,eAAeqD,YACzBtD,OAAO8B,aAAa7B,YAAYC,YAChC4B;QAENmC,WAAW5F;QACX8F,uBAAuBtE,kBAAkBxB,SAASgB,OAAOgD;IAC3D,GACA;QACEnC;QACAD;QACA0D;QACA7B;QACAtC,MAAMkE,YAAY;QAClBlE,MAAMH,KAAK;QACXsC;QACAU;KACD;IAGH;;;GAGC,GACD,IAAMoF,eAAerH,OAAM6E,WAAW,CAAC,SAACtF;YAClCuD;QAAJ,KAAIA,wBAAAA,aAAawB,OAAO,cAApBxB,4CAAAA,sBAAsBwE,QAAQ,CAAC/H,EAAEgI,MAAM,GAAW;YACpDhI,EAAEC,cAAc;QAClB;IACF,GAAG,EAAE;IAEL,IAAMgI,uBAAoE,SAACjI;QACzE,IAAMkI,yBAAyBhI,kBAC7BxB,SACAsB,EAAEmI,aAAa,CAACzI,KAAK,EACrBgD;QAGF,IAAI6B,wBAAwB2D,wBAAwB;YAClD,IAAI,CAACtE,qBAAqB;gBACxBY,uBAAuB0D;YACzB;YACA9G,qBAAAA,+BAAAA,SAAWpB;QACb;IACF;IAEA,IAAMoI,iBAA+D3H,OAAM6E,WAAW,CACpF,SAACV;QACC;YAAC;YAAW;YAAa;YAAU;SAAQ,CAACQ,QAAQ,CAACR,MAAM4B,GAAG,KAC5DJ,qBACAxB,MAAM3E,cAAc;QAEtB,OAAQ2E,MAAM4B,GAAG;YACf,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,IAAM3F,gBAA4Db,OAAM6E,WAAW,CACjF,SAACtF;QACC,2CAA2C;QAC3C,IAAIuB,mBAAmB;YACrB,IAAM7C,UAAU6C,kBAAkBvB,GAAGmC;YACrC,IAAIzD,SAAS;gBACX,IAAIoE,QAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;oBAC1C5D,KACE,8EACE;gBAEN;gBACAkF,WAAW5F;gBACX8F,uBAAuBtE,kBAAkBxB,SAASsF,mBAAmBtB;YACvE;QACF,OAAO;YACL,IAAMhE,WAAU2B,OAAO8B,aAAanC,EAAEgI,MAAM,CAACtI,KAAK,EAAEa;YACpD+D,WAAW5F;YACX8F,uBAAuBtE,kBAAkBxB,UAASsF,mBAAmBtB;QACvE;QACAoB,cAAc9D,EAAEgI,MAAM,CAACtI,KAAK;IAC9B,GACA;QAACa;QAAUyD;QAAmBzC;QAAmBY;QAAaO;KAAiB;IAGjF,IAAM2F,sBAAsB5H,OAAM6E,WAAW,CAC3C,SAACV;QACC,IAAIA,MAAM4B,GAAG,CAAC5H,MAAM,KAAK,KAAKgG,MAAM4B,GAAG,KAAK,KAAK;YAC/CD,gBAAgB3B,MAAM4B,GAAG;YACzB;QACF;QAEA;YAAC;YAAW;YAAa;YAAU;SAAQ,CAACpB,QAAQ,CAACR,MAAM4B,GAAG,KAC5DJ,qBACAxB,MAAM3E,cAAc;QAEtB,OAAQ2E,MAAM4B,GAAG;YACf,KAAK;gBACH,IAAI7F,QAAQ;oBACVyF,qBAAqBqB,YAAY;gBACnC,OAAO;oBACLP;gBACF;gBACA;YACF,KAAK;gBACH,IAAIvG,QAAQ;oBACVyF,qBAAqBqB,YAAY;gBACnC,OAAO;oBACLP;gBACF;gBACA;YACF,KAAK;gBACHJ;gBACA;YACF,KAAK;YACL,KAAK;YACL,KAAK;gBACH,IAAInG,QAAQ;oBACVyF,qBAAqBa;gBACvB,OAAO;oBACLC;gBACF;gBACA;QACJ;IACF,GACA;QAACd;QAAiBU;QAAOW;QAAalB;QAAiBW;QAAMvG;QAAQsG;KAAc;IAGrF,IAAMqB,oBAAoB7H,OAAM6E,WAAW,CACzC,SAACtF;YAEGA;QADF,IAAMwF,QAAQ+C,MAAMC,SAAS,CAACC,OAAO,CAACC,IAAI,EACxC1I,8BAAAA,EAAEmI,aAAa,CAACQ,UAAU,cAA1B3I,kDAAAA,4BAA4BqB,QAAQ,EACpCrB,EAAEmI,aAAa;QAEjB,IAAMrJ,SAASJ,OAAO,CAAC8G,MAAM;QAE7B,IAAI1G,UAAU,CAACA,OAAOE,QAAQ,EAAE;YAC9B+H,aAAavB;QACf;IACF,GACA;QAAC9G;QAASqI;KAAa;IAGzB,IAAM6B,oBAAoBnI,OAAM6E,WAAW,CACzC,SAACtF;YAEgCA;QAD/BkG,mBACEqC,MAAMC,SAAS,CAACC,OAAO,CAACC,IAAI,EAAC1I,8BAAAA,EAAEmI,aAAa,CAACQ,UAAU,cAA1B3I,kDAAAA,4BAA4BqB,QAAQ,EAAErB,EAAEmI,aAAa,GAClF;IAEJ,GACA;QAACjC;KAAmB;IAGtB,IAAMhE,eAAezB,OAAM6E,WAAW,CACpC,SAACxG,QAAqC0G;QACpC,IAAMqD,UAAUrD,UAAU/B;QAC1B,IAAMwB,WAAWO,UAAUjB;QAE3B,qBACE,qBAAC9D,OAAMqI,QAAQ;YAACtC,KAAK,AAAC,GAAe,OAAb1H,OAAOY,KAAK;WACjCuC,iBAAiB;YAChBnD,QAAAA;YACA+J,SAAAA;YACAxH,UAAUvC,OAAO8H,KAAK;YACtB3B,UAAAA;YACAjG,UAAUF,OAAOE,QAAQ;YACzBsI,SAASgB;YACTS,aAAahJ;YACb,kDAAkD;YAClD,kHAAkH;YAClH,sGAAsG;YACtG,qHAAqH;YACrH,+BAA+B;YAC/B,0IAA0I;YAC1I,oDAAoD;YACpD,kGAAkG;YAClGiJ,aAAaJ;QACf;IAGN,GACA;QACEnF;QACA6E;QACAM;QACA3G;QACAsC;KACD;IAGH,IAAM0E,kBAAkBxI,OAAMyE,OAAO,CAAC;QACpC,IAAMgE,yBACJxK,CAAAA,oBAAAA,8BAAAA,QAASE,MAAM,IAAG,IAChBF,QAAQc,GAAG,CAAC0C,8BAEZ,qBAACiH,kBAAQ;YAACpI,SAAS;WAAkCqB;QAGzD,IAAI,OAAOZ,mBAAmB,YAAY;YACxC,OAAOA,eAAe;gBAAE0H,wBAAAA;YAAuB;QACjD,OAAO;YACL,OAAOA;QACT;IACF,GAAG;QAAC9G;QAAW1D;QAAS8C;QAAgBU;KAAa;IAErD,IAAMkH,qBAAqBxF,uBAAuB/D,MAAMH,KAAK,KAAK;IAClE,IAAM2J,uBAAuB,CAACzF,uBAAuBI,sBAAsB;IAC3E,IAAMsF,mBACJ5G,oBAAoB,CAAC/B,UAAWyI,CAAAA,sBAAsBC,oBAAmB;IAE3E,IAAME,cAAc9I,OAAMyE,OAAO,CAAC;QAChC,IAAI,CAACoE,kBAAkB;YACrB,OAAO;QACT;QAEA,qBACE,qBAAC9G;YACCzB,WAAWwB,aAAaoB,6CAAiDA;YACzE2D,SAAS;uBAAMrD,qBAAqB;;;IAG1C,GAAG;QAACqF;QAAkB9G;QAAaD;KAAS;IAE5C,IAAMD,OAAO7B,OAAMyE,OAAO,CAAC;QACzB,IAAI3C,aAAaoB,WAAW;YAC1B,OAAOpB;QACT;QAEA,qBACE,qBAACiH,0BAAY;YACXzI,WAAWuI,uDAA2D3F;YACtEhD,QAAQA;;IAGd,GAAG;QAAC2I;QAAkB/G;QAAU5B;KAAO;IAEvC,IAAM8I,aAAa,AAACnH,CAAAA,QAAQgH,gBAAe,mBACzC,qBAAC7I,OAAMqI,QAAQ,QACZS,aACAjH;IAIL,qBACE,qBAACsE;QACC7F,WAAW2I,IAAAA,gBAAU,sBAEnBxG,UAAU3E,oBAAQ,CAACoL,OAAO,IAAItL,eAAe,CAAC6E,MAAM,EACpDnC;QAEFI,OAAOA;QACPmF,KAAKjD;QACLiE,SAASQ;OAERnH,UAAUqB,2BACT,qBAAC4H,YAAK,8CACA/G;QACJgH,WAAAA;QACA1C,QAAQA;QACRpG,WAAWoE;QACXzF,OAAOY;QACPwJ,WAAW1B;QACXhH,UAAUE;QACV,kIAAkI;QAClI,4FAA4F;QAC5F,wGAAwG;QACxGgG,SAASzH,MAAMyH,OAAO;QACtBzG,QAAQA;QACRkJ,OAAON;QACPO,MAAMC,IAAAA,sCAA8B,EAACpI;wBAGvC,qBAACqI,4BAAa,8CACRrH;QACJsH,eAAAA;QACA7C,SAASA;QACTwC,WAAWzB;QACX+B,SAAS7C;QACTF,SAASA;QACTF,QAAQA;QACRpG,WAAWoE;QACXtE,QAAQA;QACRkJ,OAAON;QACP5H,YAAYA;QAEXoD,qBAAAA,+BAAAA,SAAU2B,KAAK,iBAGpB,qBAACyD;QACC/D,KAAK9C;QACL1C,MAAMA;QACNM,UAAU6G;QACVd,QAAQtH,MAAMsH,MAAM;QACpBE,SAASxH,MAAMwH,OAAO;QACtBC,SAASzH,MAAMyH,OAAO;QACtB5H,OAAOsE;QACPmG,eAAAA;QACApJ,SAAS;OAER2B,kCAAoB,qBAAC5D;QAAO0H,KAAI;QAAG9G,OAAM;QACzCyC,YAAY3C,GAAG,CAAC,SAACC;6BAChB,qBAACX;YAAO0H,KAAK,AAAC,GAAa,OAAX/G,KAAKC,KAAK;YAAIA,OAAOD,KAAKC,KAAK;;SAGlDiB,wBACC,qBAAC2J,0CAAoB;QACnBC,WAAWpH;QACXqH,WAAWtJ;QACXqC,cAAc8C;QACdoE,mBAAmBpG;QACnBqG,cAActD;QACdzF,UAAUA;QACVgJ,gBAAgBhI;QAChBiI,WAAWhI;QACXiI,aAAajJ;QACbE,mBAAmBA;QACnBC,wBAAwBA;OAEvBkH;AAKX"}
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\ninterface CustomSelectRenderOption extends CustomSelectOptionProps {\n option?: CustomSelectOptionInterface;\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: CustomSelectRenderOption) => 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 (opened &&\n dropdownOffsetDistance === 0 &&\n (popperPlacement?.includes('top')\n ? styles['CustomSelect--pop-up']\n : styles['CustomSelect--pop-down'])) ||\n undefined,\n [dropdownOffsetDistance, opened, popperPlacement],\n );\n\n const 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","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","classNames","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,8 +1,8 @@
1
1
  import * as React from 'react';
2
- import { HasComponent, HasRef } from '../../types';
3
- export type FormLayoutProps = React.AllHTMLAttributes<HTMLElement> & HasRef<HTMLElement> & HasComponent;
2
+ import { HasComponent, HasRef, HasRootRef } from '../../types';
3
+ export type FormLayoutProps = React.AllHTMLAttributes<HTMLElement> & HasRef<HTMLElement> & HasRootRef<HTMLElement> & HasComponent;
4
4
  /**
5
5
  * @see https://vkcom.github.io/VKUI/#/FormLayout
6
6
  */
7
- export declare const FormLayout: ({ children, Component, getRef, onSubmit, className, ...restProps }: FormLayoutProps) => React.JSX.Element;
7
+ export declare const FormLayout: ({ children, Component, getRef, getRootRef, onSubmit, className, ...restProps }: FormLayoutProps) => React.JSX.Element;
8
8
  //# sourceMappingURL=FormLayout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormLayout.d.ts","sourceRoot":"","sources":["../../../../src/components/FormLayout/FormLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAKnD,MAAM,MAAM,eAAe,GAAG,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,GAChE,MAAM,CAAC,WAAW,CAAC,GACnB,YAAY,CAAC;AAEf;;GAEG;AACH,eAAO,MAAM,UAAU,uEAOpB,eAAe,sBAcjB,CAAC"}
1
+ {"version":3,"file":"FormLayout.d.ts","sourceRoot":"","sources":["../../../../src/components/FormLayout/FormLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK/D,MAAM,MAAM,eAAe,GAAG,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,GAChE,MAAM,CAAC,WAAW,CAAC,GACnB,UAAU,CAAC,WAAW,CAAC,GACvB,YAAY,CAAC;AAEf;;GAEG;AACH,eAAO,MAAM,UAAU,mFAQpB,eAAe,sBAgBjB,CAAC"}
@@ -14,21 +14,24 @@ var _object_spread_props = require("@swc/helpers/_/_object_spread_props");
14
14
  var _object_without_properties = require("@swc/helpers/_/_object_without_properties");
15
15
  var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
16
16
  var _vkjs = require("@vkontakte/vkjs");
17
+ var _useExternRef = require("../../hooks/useExternRef");
17
18
  var preventDefault = function(e) {
18
19
  return e.preventDefault();
19
20
  };
20
21
  var FormLayout = function(_param) {
21
- var children = _param.children, _param_Component = _param.Component, Component = _param_Component === void 0 ? "form" : _param_Component, getRef = _param.getRef, _param_onSubmit = _param.onSubmit, onSubmit = _param_onSubmit === void 0 ? preventDefault : _param_onSubmit, className = _param.className, restProps = _object_without_properties._(_param, [
22
+ var children = _param.children, _param_Component = _param.Component, Component = _param_Component === void 0 ? "form" : _param_Component, getRef = _param.getRef, getRootRef = _param.getRootRef, _param_onSubmit = _param.onSubmit, onSubmit = _param_onSubmit === void 0 ? preventDefault : _param_onSubmit, className = _param.className, restProps = _object_without_properties._(_param, [
22
23
  "children",
23
24
  "Component",
24
25
  "getRef",
26
+ "getRootRef",
25
27
  "onSubmit",
26
28
  "className"
27
29
  ]);
30
+ var formLayoutRef = (0, _useExternRef.useExternRef)(getRef, getRootRef);
28
31
  return /*#__PURE__*/ _react.createElement(Component, _object_spread_props._(_object_spread._({}, restProps), {
29
32
  className: (0, _vkjs.classNames)("vkuiFormLayout", className),
30
33
  onSubmit: onSubmit,
31
- ref: getRef
34
+ ref: formLayoutRef
32
35
  }), children, Component === "form" && /*#__PURE__*/ _react.createElement("input", {
33
36
  type: "submit",
34
37
  className: "vkuiFormLayout__submit",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/FormLayout/FormLayout.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { HasComponent, HasRef } from '../../types';\nimport styles from './FormLayout.module.css';\n\nconst preventDefault = (e: React.FormEvent) => e.preventDefault();\n\nexport type FormLayoutProps = React.AllHTMLAttributes<HTMLElement> &\n HasRef<HTMLElement> &\n HasComponent;\n\n/**\n * @see https://vkcom.github.io/VKUI/#/FormLayout\n */\nexport const FormLayout = ({\n children,\n Component = 'form',\n getRef,\n onSubmit = preventDefault,\n className,\n ...restProps\n}: FormLayoutProps) => {\n return (\n <Component\n {...restProps}\n className={classNames(styles['FormLayout'], className)}\n onSubmit={onSubmit}\n ref={getRef}\n >\n {children}\n {Component === 'form' && (\n <input type=\"submit\" className={styles['FormLayout__submit']} value=\"\" />\n )}\n </Component>\n );\n};\n"],"names":["FormLayout","preventDefault","e","children","Component","getRef","onSubmit","className","restProps","classNames","ref","input","type","value"],"mappings":";;;;+BAcaA;;;eAAAA;;;;;;;+DAdU;oBACI;AAI3B,IAAMC,iBAAiB,SAACC;WAAuBA,EAAED,cAAc;;AASxD,IAAMD,aAAa;QACxBG,kBAAAA,oCACAC,WAAAA,0CAAY,2BACZC,gBAAAA,iCACAC,UAAAA,wCAAWL,kCACXM,mBAAAA,WACGC;QALHL;QACAC;QACAC;QACAC;QACAC;;IAGA,qBACE,qBAACH,uDACKI;QACJD,WAAWE,IAAAA,gBAAU,oBAAuBF;QAC5CD,UAAUA;QACVI,KAAKL;QAEJF,UACAC,cAAc,wBACb,qBAACO;QAAMC,MAAK;QAASL,SAAS;QAAgCM,OAAM;;AAI5E"}
1
+ {"version":3,"sources":["../../../../src/components/FormLayout/FormLayout.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { HasComponent, HasRef, HasRootRef } from '../../types';\nimport styles from './FormLayout.module.css';\n\nconst preventDefault = (e: React.FormEvent) => e.preventDefault();\n\nexport type FormLayoutProps = React.AllHTMLAttributes<HTMLElement> &\n HasRef<HTMLElement> &\n HasRootRef<HTMLElement> &\n HasComponent;\n\n/**\n * @see https://vkcom.github.io/VKUI/#/FormLayout\n */\nexport const FormLayout = ({\n children,\n Component = 'form',\n getRef, // TOOD [>=6]: remove\n getRootRef,\n onSubmit = preventDefault,\n className,\n ...restProps\n}: FormLayoutProps) => {\n const formLayoutRef = useExternRef(getRef, getRootRef);\n\n return (\n <Component\n {...restProps}\n className={classNames(styles['FormLayout'], className)}\n onSubmit={onSubmit}\n ref={formLayoutRef}\n >\n {children}\n {Component === 'form' && (\n <input type=\"submit\" className={styles['FormLayout__submit']} value=\"\" />\n )}\n </Component>\n );\n};\n"],"names":["FormLayout","preventDefault","e","children","Component","getRef","getRootRef","onSubmit","className","restProps","formLayoutRef","useExternRef","classNames","ref","input","type","value"],"mappings":";;;;+BAgBaA;;;eAAAA;;;;;;;+DAhBU;oBACI;4BACE;AAI7B,IAAMC,iBAAiB,SAACC;WAAuBA,EAAED,cAAc;;AAUxD,IAAMD,aAAa;QACxBG,kBAAAA,oCACAC,WAAAA,0CAAY,2BACZC,gBAAAA,QACAC,oBAAAA,qCACAC,UAAAA,wCAAWN,kCACXO,mBAAAA,WACGC;QANHN;QACAC;QACAC;QACAC;QACAC;QACAC;;IAGA,IAAME,gBAAgBC,IAAAA,0BAAY,EAACN,QAAQC;IAE3C,qBACE,qBAACF,uDACKK;QACJD,WAAWI,IAAAA,gBAAU,oBAAuBJ;QAC5CD,UAAUA;QACVM,KAAKH;QAEJP,UACAC,cAAc,wBACb,qBAACU;QAAMC,MAAK;QAASP,SAAS;QAAgCQ,OAAM;;AAI5E"}
@@ -1 +1 @@
1
- {"version":3,"file":"Gallery.d.ts","sourceRoot":"","sources":["../../../../src/components/Gallery/Gallery.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACpD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,OAAO,kFAQjB,YAAY,6BAyDd,CAAC"}
1
+ {"version":3,"file":"Gallery.d.ts","sourceRoot":"","sources":["../../../../src/components/Gallery/Gallery.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAGxD,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACpD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,OAAO,kFAQjB,YAAY,6BAqDd,CAAC"}
@@ -16,9 +16,9 @@ var _sliced_to_array = require("@swc/helpers/_/_sliced_to_array");
16
16
  var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
17
17
  var _math = require("../../helpers/math");
18
18
  var _useIsClient = require("../../hooks/useIsClient");
19
- var _useTimeout = require("../../hooks/useTimeout");
20
19
  var _BaseGallery = require("../BaseGallery/BaseGallery");
21
20
  var _CarouselBase = require("../BaseGallery/CarouselBase/CarouselBase");
21
+ var _hooks = require("./hooks");
22
22
  var Gallery = function(_param) {
23
23
  var _param_initialSlideIndex = _param.initialSlideIndex, initialSlideIndex = _param_initialSlideIndex === void 0 ? 0 : _param_initialSlideIndex, children = _param.children, _param_timeout = _param.timeout, timeout = _param_timeout === void 0 ? 0 : _param_timeout, onChange = _param.onChange, bullets = _param.bullets, looped = _param.looped, props = _object_without_properties._(_param, [
24
24
  "initialSlideIndex",
@@ -53,16 +53,9 @@ var Gallery = function(_param) {
53
53
  onChange,
54
54
  slideIndex
55
55
  ]);
56
- var autoplay = (0, _useTimeout.useTimeout)(function() {
56
+ (0, _hooks.useAutoPlay)(timeout, slideIndex, function() {
57
57
  return handleChange((slideIndex + 1) % childCount);
58
- }, timeout);
59
- _react.useEffect(function() {
60
- return timeout ? autoplay.set() : autoplay.clear();
61
- }, [
62
- timeout,
63
- slideIndex,
64
- autoplay
65
- ]);
58
+ });
66
59
  // prevent invalid slideIndex
67
60
  // any slide index is invalid with no slides, just keep it as is
68
61
  var safeSlideIndex = childCount > 0 ? (0, _math.clamp)(slideIndex, 0, childCount - 1) : slideIndex;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Gallery/Gallery.tsx"],"sourcesContent":["import * as React from 'react';\nimport { clamp } from '../../helpers/math';\nimport { useIsClient } from '../../hooks/useIsClient';\nimport { useTimeout } from '../../hooks/useTimeout';\nimport { BaseGallery } from '../BaseGallery/BaseGallery';\nimport { CarouselBase } from '../BaseGallery/CarouselBase/CarouselBase';\nimport { BaseGalleryProps } from '../BaseGallery/types';\n\nexport interface GalleryProps extends BaseGalleryProps {\n initialSlideIndex?: number;\n timeout?: number;\n // Отвечает за зацикливание слайдов\n looped?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Gallery\n */\nexport const Gallery = ({\n initialSlideIndex = 0,\n children,\n timeout = 0,\n onChange,\n bullets,\n looped,\n ...props\n}: GalleryProps) => {\n const [localSlideIndex, setSlideIndex] = React.useState(initialSlideIndex);\n const isControlled = typeof props.slideIndex === 'number';\n const slideIndex = isControlled ? props.slideIndex ?? 0 : localSlideIndex;\n const isDraggable = !isControlled || Boolean(onChange);\n const slides = React.useMemo(\n () => React.Children.toArray(children).filter((item) => Boolean(item)),\n [children],\n );\n const childCount = slides.length;\n const isClient = useIsClient();\n\n const handleChange: GalleryProps['onChange'] = React.useCallback(\n (current: number) => {\n if (current === slideIndex) {\n return;\n }\n !isControlled && setSlideIndex(current);\n onChange && onChange(current);\n },\n [isControlled, onChange, slideIndex],\n );\n\n const autoplay = useTimeout(() => handleChange((slideIndex + 1) % childCount), timeout);\n React.useEffect(\n () => (timeout ? autoplay.set() : autoplay.clear()),\n [timeout, slideIndex, autoplay],\n );\n\n // prevent invalid slideIndex\n // any slide index is invalid with no slides, just keep it as is\n const safeSlideIndex = childCount > 0 ? clamp(slideIndex, 0, childCount - 1) : slideIndex;\n // notify parent in controlled mode\n React.useEffect(() => {\n if (onChange && safeSlideIndex !== slideIndex) {\n onChange(safeSlideIndex);\n }\n setSlideIndex(safeSlideIndex);\n }, [onChange, safeSlideIndex, slideIndex]);\n\n if (!isClient) {\n return null;\n }\n\n const Component = looped ? CarouselBase : BaseGallery;\n\n return (\n <Component\n isDraggable={isDraggable}\n {...props}\n bullets={childCount > 0 && bullets}\n slideIndex={safeSlideIndex}\n onChange={handleChange}\n >\n {slides}\n </Component>\n );\n};\n"],"names":["Gallery","initialSlideIndex","children","timeout","onChange","bullets","looped","props","React","useState","localSlideIndex","setSlideIndex","isControlled","slideIndex","isDraggable","Boolean","slides","useMemo","Children","toArray","filter","item","childCount","length","isClient","useIsClient","handleChange","useCallback","current","autoplay","useTimeout","useEffect","set","clear","safeSlideIndex","clamp","Component","CarouselBase","BaseGallery"],"mappings":";;;;+BAkBaA;;;eAAAA;;;;;;;;+DAlBU;oBACD;2BACM;0BACD;2BACC;4BACC;AAatB,IAAMA,UAAU;0CACrBC,mBAAAA,0DAAoB,8BACpBC,kBAAAA,kCACAC,SAAAA,sCAAU,oBACVC,kBAAAA,UACAC,iBAAAA,SACAC,gBAAAA,QACGC;QANHN;QACAC;QACAC;QACAC;QACAC;QACAC;;IAGA,IAAyCE,qCAAAA,OAAMC,QAAQ,CAACR,wBAAjDS,kBAAkCF,oBAAjBG,gBAAiBH;IACzC,IAAMI,eAAe,OAAOL,MAAMM,UAAU,KAAK;QACfN;IAAlC,IAAMM,aAAaD,eAAeL,CAAAA,oBAAAA,MAAMM,UAAU,cAAhBN,+BAAAA,oBAAoB,IAAIG;IAC1D,IAAMI,cAAc,CAACF,gBAAgBG,QAAQX;IAC7C,IAAMY,SAASR,OAAMS,OAAO,CAC1B;eAAMT,OAAMU,QAAQ,CAACC,OAAO,CAACjB,UAAUkB,MAAM,CAAC,SAACC;mBAASN,QAAQM;;OAChE;QAACnB;KAAS;IAEZ,IAAMoB,aAAaN,OAAOO,MAAM;IAChC,IAAMC,WAAWC,IAAAA,wBAAW;IAE5B,IAAMC,eAAyClB,OAAMmB,WAAW,CAC9D,SAACC;QACC,IAAIA,YAAYf,YAAY;YAC1B;QACF;QACA,CAACD,gBAAgBD,cAAciB;QAC/BxB,YAAYA,SAASwB;IACvB,GACA;QAAChB;QAAcR;QAAUS;KAAW;IAGtC,IAAMgB,WAAWC,IAAAA,sBAAU,EAAC;eAAMJ,aAAa,AAACb,CAAAA,aAAa,CAAA,IAAKS;OAAanB;IAC/EK,OAAMuB,SAAS,CACb;eAAO5B,UAAU0B,SAASG,GAAG,KAAKH,SAASI,KAAK;OAChD;QAAC9B;QAASU;QAAYgB;KAAS;IAGjC,6BAA6B;IAC7B,gEAAgE;IAChE,IAAMK,iBAAiBZ,aAAa,IAAIa,IAAAA,WAAK,EAACtB,YAAY,GAAGS,aAAa,KAAKT;IAC/E,mCAAmC;IACnCL,OAAMuB,SAAS,CAAC;QACd,IAAI3B,YAAY8B,mBAAmBrB,YAAY;YAC7CT,SAAS8B;QACX;QACAvB,cAAcuB;IAChB,GAAG;QAAC9B;QAAU8B;QAAgBrB;KAAW;IAEzC,IAAI,CAACW,UAAU;QACb,OAAO;IACT;IAEA,IAAMY,YAAY9B,SAAS+B,0BAAY,GAAGC,wBAAW;IAErD,qBACE,qBAACF;QACCtB,aAAaA;OACTP;QACJF,SAASiB,aAAa,KAAKjB;QAC3BQ,YAAYqB;QACZ9B,UAAUsB;QAETV;AAGP"}
1
+ {"version":3,"sources":["../../../../src/components/Gallery/Gallery.tsx"],"sourcesContent":["import * as React from 'react';\nimport { clamp } from '../../helpers/math';\nimport { useIsClient } from '../../hooks/useIsClient';\nimport { BaseGallery } from '../BaseGallery/BaseGallery';\nimport { CarouselBase } from '../BaseGallery/CarouselBase/CarouselBase';\nimport { BaseGalleryProps } from '../BaseGallery/types';\nimport { useAutoPlay } from './hooks';\n\nexport interface GalleryProps extends BaseGalleryProps {\n initialSlideIndex?: number;\n timeout?: number;\n // Отвечает за зацикливание слайдов\n looped?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Gallery\n */\nexport const Gallery = ({\n initialSlideIndex = 0,\n children,\n timeout = 0,\n onChange,\n bullets,\n looped,\n ...props\n}: GalleryProps) => {\n const [localSlideIndex, setSlideIndex] = React.useState(initialSlideIndex);\n const isControlled = typeof props.slideIndex === 'number';\n const slideIndex = isControlled ? props.slideIndex ?? 0 : localSlideIndex;\n const isDraggable = !isControlled || Boolean(onChange);\n const slides = React.useMemo(\n () => React.Children.toArray(children).filter((item) => Boolean(item)),\n [children],\n );\n const childCount = slides.length;\n const isClient = useIsClient();\n\n const handleChange: GalleryProps['onChange'] = React.useCallback(\n (current: number) => {\n if (current === slideIndex) {\n return;\n }\n !isControlled && setSlideIndex(current);\n onChange && onChange(current);\n },\n [isControlled, onChange, slideIndex],\n );\n\n useAutoPlay(timeout, slideIndex, () => handleChange((slideIndex + 1) % childCount));\n\n // prevent invalid slideIndex\n // any slide index is invalid with no slides, just keep it as is\n const safeSlideIndex = childCount > 0 ? clamp(slideIndex, 0, childCount - 1) : slideIndex;\n // notify parent in controlled mode\n React.useEffect(() => {\n if (onChange && safeSlideIndex !== slideIndex) {\n onChange(safeSlideIndex);\n }\n setSlideIndex(safeSlideIndex);\n }, [onChange, safeSlideIndex, slideIndex]);\n\n if (!isClient) {\n return null;\n }\n\n const Component = looped ? CarouselBase : BaseGallery;\n\n return (\n <Component\n isDraggable={isDraggable}\n {...props}\n bullets={childCount > 0 && bullets}\n slideIndex={safeSlideIndex}\n onChange={handleChange}\n >\n {slides}\n </Component>\n );\n};\n"],"names":["Gallery","initialSlideIndex","children","timeout","onChange","bullets","looped","props","React","useState","localSlideIndex","setSlideIndex","isControlled","slideIndex","isDraggable","Boolean","slides","useMemo","Children","toArray","filter","item","childCount","length","isClient","useIsClient","handleChange","useCallback","current","useAutoPlay","safeSlideIndex","clamp","useEffect","Component","CarouselBase","BaseGallery"],"mappings":";;;;+BAkBaA;;;eAAAA;;;;;;;;+DAlBU;oBACD;2BACM;2BACA;4BACC;qBAED;AAYrB,IAAMA,UAAU;0CACrBC,mBAAAA,0DAAoB,8BACpBC,kBAAAA,kCACAC,SAAAA,sCAAU,oBACVC,kBAAAA,UACAC,iBAAAA,SACAC,gBAAAA,QACGC;QANHN;QACAC;QACAC;QACAC;QACAC;QACAC;;IAGA,IAAyCE,qCAAAA,OAAMC,QAAQ,CAACR,wBAAjDS,kBAAkCF,oBAAjBG,gBAAiBH;IACzC,IAAMI,eAAe,OAAOL,MAAMM,UAAU,KAAK;QACfN;IAAlC,IAAMM,aAAaD,eAAeL,CAAAA,oBAAAA,MAAMM,UAAU,cAAhBN,+BAAAA,oBAAoB,IAAIG;IAC1D,IAAMI,cAAc,CAACF,gBAAgBG,QAAQX;IAC7C,IAAMY,SAASR,OAAMS,OAAO,CAC1B;eAAMT,OAAMU,QAAQ,CAACC,OAAO,CAACjB,UAAUkB,MAAM,CAAC,SAACC;mBAASN,QAAQM;;OAChE;QAACnB;KAAS;IAEZ,IAAMoB,aAAaN,OAAOO,MAAM;IAChC,IAAMC,WAAWC,IAAAA,wBAAW;IAE5B,IAAMC,eAAyClB,OAAMmB,WAAW,CAC9D,SAACC;QACC,IAAIA,YAAYf,YAAY;YAC1B;QACF;QACA,CAACD,gBAAgBD,cAAciB;QAC/BxB,YAAYA,SAASwB;IACvB,GACA;QAAChB;QAAcR;QAAUS;KAAW;IAGtCgB,IAAAA,kBAAW,EAAC1B,SAASU,YAAY;eAAMa,aAAa,AAACb,CAAAA,aAAa,CAAA,IAAKS;;IAEvE,6BAA6B;IAC7B,gEAAgE;IAChE,IAAMQ,iBAAiBR,aAAa,IAAIS,IAAAA,WAAK,EAAClB,YAAY,GAAGS,aAAa,KAAKT;IAC/E,mCAAmC;IACnCL,OAAMwB,SAAS,CAAC;QACd,IAAI5B,YAAY0B,mBAAmBjB,YAAY;YAC7CT,SAAS0B;QACX;QACAnB,cAAcmB;IAChB,GAAG;QAAC1B;QAAU0B;QAAgBjB;KAAW;IAEzC,IAAI,CAACW,UAAU;QACb,OAAO;IACT;IAEA,IAAMS,YAAY3B,SAAS4B,0BAAY,GAAGC,wBAAW;IAErD,qBACE,qBAACF;QACCnB,aAAaA;OACTP;QACJF,SAASiB,aAAa,KAAKjB;QAC3BQ,YAAYiB;QACZ1B,UAAUsB;QAETV;AAGP"}
@@ -0,0 +1,2 @@
1
+ export declare function useAutoPlay(timeout: number, slideIndex: number, callbackFn: VoidFunction): void;
2
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../../src/components/Gallery/hooks.ts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,QAkCxF"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "useAutoPlay", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return useAutoPlay;
9
+ }
10
+ });
11
+ var _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
12
+ var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
13
+ var _useTimeout = require("../../hooks/useTimeout");
14
+ var _dom = require("../../lib/dom");
15
+ function useAutoPlay(timeout, slideIndex, callbackFn) {
16
+ var _useTimeout1 = (0, _useTimeout.useTimeout)(callbackFn, timeout), clearAutoPlay = _useTimeout1.clear, setAutoPlay = _useTimeout1.set;
17
+ var document = (0, _dom.useDOM)().document;
18
+ _react.useEffect(function() {
19
+ return timeout ? setAutoPlay() : clearAutoPlay();
20
+ }, [
21
+ timeout,
22
+ slideIndex,
23
+ clearAutoPlay,
24
+ setAutoPlay
25
+ ]);
26
+ // Отключаем прокрутку слайдов при неактивной вкладке
27
+ _react.useEffect(function preventSlideChange() {
28
+ if (!document || !timeout) {
29
+ return;
30
+ }
31
+ var changeAutoPlay = function() {
32
+ if (document.visibilityState === "visible") {
33
+ clearAutoPlay();
34
+ setAutoPlay();
35
+ }
36
+ if (document.visibilityState === "hidden") {
37
+ clearAutoPlay();
38
+ }
39
+ };
40
+ document.addEventListener("visibilitychange", changeAutoPlay);
41
+ return function() {
42
+ document.removeEventListener("visibilitychange", changeAutoPlay);
43
+ };
44
+ }, [
45
+ document,
46
+ timeout,
47
+ clearAutoPlay,
48
+ setAutoPlay
49
+ ]);
50
+ }
51
+
52
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/Gallery/hooks.ts"],"sourcesContent":["import * as React from 'react';\nimport { useTimeout } from '../../hooks/useTimeout';\nimport { useDOM } from '../../lib/dom';\n\nexport function useAutoPlay(timeout: number, slideIndex: number, callbackFn: VoidFunction) {\n const { clear: clearAutoPlay, set: setAutoPlay } = useTimeout(callbackFn, timeout);\n const { document } = useDOM();\n\n React.useEffect(\n () => (timeout ? setAutoPlay() : clearAutoPlay()),\n [timeout, slideIndex, clearAutoPlay, setAutoPlay],\n );\n\n // Отключаем прокрутку слайдов при неактивной вкладке\n React.useEffect(\n function preventSlideChange() {\n if (!document || !timeout) {\n return;\n }\n\n const changeAutoPlay = () => {\n if (document.visibilityState === 'visible') {\n clearAutoPlay();\n setAutoPlay();\n }\n if (document.visibilityState === 'hidden') {\n clearAutoPlay();\n }\n };\n\n document.addEventListener('visibilitychange', changeAutoPlay);\n\n return () => {\n document.removeEventListener('visibilitychange', changeAutoPlay);\n };\n },\n [document, timeout, clearAutoPlay, setAutoPlay],\n );\n}\n"],"names":["useAutoPlay","timeout","slideIndex","callbackFn","useTimeout","clear","clearAutoPlay","set","setAutoPlay","document","useDOM","React","useEffect","preventSlideChange","changeAutoPlay","visibilityState","addEventListener","removeEventListener"],"mappings":";;;;+BAIgBA;;;eAAAA;;;;+DAJO;0BACI;mBACJ;AAEhB,SAASA,YAAYC,OAAe,EAAEC,UAAkB,EAAEC,UAAwB;IACvF,IAAmDC,eAAAA,IAAAA,sBAAU,EAACD,YAAYF,UAAlEI,AAAOC,gBAAoCF,aAA3CC,OAAsBE,AAAKC,cAAgBJ,aAArBG;IAC9B,IAAM,AAAEE,WAAaC,IAAAA,WAAM,IAAnBD;IAERE,OAAMC,SAAS,CACb;eAAOX,UAAUO,gBAAgBF;OACjC;QAACL;QAASC;QAAYI;QAAeE;KAAY;IAGnD,qDAAqD;IACrDG,OAAMC,SAAS,CACb,SAASC;QACP,IAAI,CAACJ,YAAY,CAACR,SAAS;YACzB;QACF;QAEA,IAAMa,iBAAiB;YACrB,IAAIL,SAASM,eAAe,KAAK,WAAW;gBAC1CT;gBACAE;YACF;YACA,IAAIC,SAASM,eAAe,KAAK,UAAU;gBACzCT;YACF;QACF;QAEAG,SAASO,gBAAgB,CAAC,oBAAoBF;QAE9C,OAAO;YACLL,SAASQ,mBAAmB,CAAC,oBAAoBH;QACnD;IACF,GACA;QAACL;QAAUR;QAASK;QAAeE;KAAY;AAEnD"}
@@ -1,10 +1,10 @@
1
1
  import * as React from 'react';
2
- import { HasRef } from '../../types';
2
+ import { HasRef, HasRootRef } from '../../types';
3
3
  import { PanelHeaderProps } from '../PanelHeader/PanelHeader';
4
- export interface ModalPageHeaderProps extends React.HTMLAttributes<HTMLDivElement>, Omit<PanelHeaderProps, 'fixed' | 'shadow'>, HasRef<HTMLDivElement> {
4
+ export interface ModalPageHeaderProps extends React.HTMLAttributes<HTMLDivElement>, Omit<PanelHeaderProps, 'fixed' | 'shadow'>, HasRef<HTMLDivElement>, HasRootRef<HTMLDivElement> {
5
5
  }
6
6
  /**
7
7
  * @see https://vkcom.github.io/VKUI/#/ModalPageHeader
8
8
  */
9
- export declare const ModalPageHeader: ({ children, separator, getRef, className, typographyProps, ...restProps }: ModalPageHeaderProps) => React.JSX.Element;
9
+ export declare const ModalPageHeader: ({ children, separator, getRef, getRootRef, className, typographyProps, ...restProps }: ModalPageHeaderProps) => React.JSX.Element;
10
10
  //# sourceMappingURL=ModalPageHeader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ModalPageHeader.d.ts","sourceRoot":"","sources":["../../../../src/components/ModalPageHeader/ModalPageHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAe,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAI3E,MAAM,WAAW,oBACf,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAC1C,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,QAAQ,CAAC,EAC1C,MAAM,CAAC,cAAc,CAAC;CAAG;AAE7B;;GAEG;AACH,eAAO,MAAM,eAAe,8EAOzB,oBAAoB,sBAgCtB,CAAC"}
1
+ {"version":3,"file":"ModalPageHeader.d.ts","sourceRoot":"","sources":["../../../../src/components/ModalPageHeader/ModalPageHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAe,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAI3E,MAAM,WAAW,oBACf,SAAQ,KAAK,CAAC,cAAc,CAAC,cAAc,CAAC,EAC1C,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,QAAQ,CAAC,EAC1C,MAAM,CAAC,cAAc,CAAC,EACtB,UAAU,CAAC,cAAc,CAAC;CAAG;AAEjC;;GAEG;AACH,eAAO,MAAM,eAAe,0FAQzB,oBAAoB,sBAiCtB,CAAC"}
@@ -15,16 +15,18 @@ var _object_without_properties = require("@swc/helpers/_/_object_without_propert
15
15
  var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
16
16
  var _vkjs = require("@vkontakte/vkjs");
17
17
  var _useAdaptivityWithJSMediaQueries = require("../../hooks/useAdaptivityWithJSMediaQueries");
18
+ var _useExternRef = require("../../hooks/useExternRef");
18
19
  var _usePlatform = require("../../hooks/usePlatform");
19
20
  var _platform = require("../../lib/platform");
20
21
  var _ModalPageContext = require("../ModalPage/ModalPageContext");
21
22
  var _PanelHeader = require("../PanelHeader/PanelHeader");
22
23
  var _Separator = require("../Separator/Separator");
23
24
  var ModalPageHeader = function(_param) {
24
- var children = _param.children, _param_separator = _param.separator, separator = _param_separator === void 0 ? true : _param_separator, getRef = _param.getRef, className = _param.className, typographyProps = _param.typographyProps, restProps = _object_without_properties._(_param, [
25
+ var children = _param.children, _param_separator = _param.separator, separator = _param_separator === void 0 ? true : _param_separator, getRef = _param.getRef, getRootRef = _param.getRootRef, className = _param.className, typographyProps = _param.typographyProps, restProps = _object_without_properties._(_param, [
25
26
  "children",
26
27
  "separator",
27
28
  "getRef",
29
+ "getRootRef",
28
30
  "className",
29
31
  "typographyProps"
30
32
  ]);
@@ -32,9 +34,10 @@ var ModalPageHeader = function(_param) {
32
34
  var hasSeparator = separator && platform === _platform.Platform.VKCOM;
33
35
  var isDesktop = (0, _useAdaptivityWithJSMediaQueries.useAdaptivityWithJSMediaQueries)().isDesktop;
34
36
  var labelId = _react.useContext(_ModalPageContext.ModalPageContext).labelId;
37
+ var modalPageHeaderRef = (0, _useExternRef.useExternRef)(getRef, getRootRef);
35
38
  return /*#__PURE__*/ _react.createElement("div", {
36
39
  className: (0, _vkjs.classNames)("vkuiModalPageHeader", platform !== _platform.Platform.VKCOM && "vkuiModalPageHeader--withGaps", isDesktop && "vkuiModalPageHeader--desktop"),
37
- ref: getRef
40
+ ref: modalPageHeaderRef
38
41
  }, /*#__PURE__*/ _react.createElement(_PanelHeader.PanelHeader, _object_spread_props._(_object_spread._({
39
42
  className: (0, _vkjs.classNames)("vkuiInternalModalPageHeader__in", className),
40
43
  typographyProps: _object_spread._({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/ModalPageHeader/ModalPageHeader.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivityWithJSMediaQueries } from '../../hooks/useAdaptivityWithJSMediaQueries';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { Platform } from '../../lib/platform';\nimport { HasRef } from '../../types';\nimport { ModalPageContext } from '../ModalPage/ModalPageContext';\nimport { PanelHeader, PanelHeaderProps } from '../PanelHeader/PanelHeader';\nimport { Separator } from '../Separator/Separator';\nimport styles from './ModalPageHeader.module.css';\n\nexport interface ModalPageHeaderProps\n extends React.HTMLAttributes<HTMLDivElement>,\n Omit<PanelHeaderProps, 'fixed' | 'shadow'>,\n HasRef<HTMLDivElement> {}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ModalPageHeader\n */\nexport const ModalPageHeader = ({\n children,\n separator = true,\n getRef,\n className,\n typographyProps,\n ...restProps\n}: ModalPageHeaderProps) => {\n const platform = usePlatform();\n const hasSeparator = separator && platform === Platform.VKCOM;\n const { isDesktop } = useAdaptivityWithJSMediaQueries();\n const { labelId } = React.useContext(ModalPageContext);\n\n return (\n <div\n className={classNames(\n styles['ModalPageHeader'],\n platform !== Platform.VKCOM && styles['ModalPageHeader--withGaps'],\n isDesktop && styles['ModalPageHeader--desktop'],\n )}\n ref={getRef}\n >\n <PanelHeader\n className={classNames('vkuiInternalModalPageHeader__in', className)}\n typographyProps={{\n Component: 'h2',\n id: labelId,\n ...typographyProps,\n }}\n {...restProps}\n fixed={false}\n separator={false}\n transparent\n >\n {children}\n </PanelHeader>\n {hasSeparator && <Separator wide />}\n </div>\n );\n};\n"],"names":["ModalPageHeader","children","separator","getRef","className","typographyProps","restProps","platform","usePlatform","hasSeparator","Platform","VKCOM","isDesktop","useAdaptivityWithJSMediaQueries","labelId","React","useContext","ModalPageContext","div","classNames","ref","PanelHeader","Component","id","fixed","transparent","Separator","wide"],"mappings":";;;;+BAmBaA;;;eAAAA;;;;;;;+DAnBU;oBACI;+CACqB;2BACpB;wBACH;gCAEQ;2BACa;yBACpB;AAWnB,IAAMA,kBAAkB;QAC7BC,kBAAAA,oCACAC,WAAAA,0CAAY,yBACZC,gBAAAA,QACAC,mBAAAA,WACAC,yBAAAA,iBACGC;QALHL;QACAC;QACAC;QACAC;QACAC;;IAGA,IAAME,WAAWC,IAAAA,wBAAW;IAC5B,IAAMC,eAAeP,aAAaK,aAAaG,kBAAQ,CAACC,KAAK;IAC7D,IAAM,AAAEC,YAAcC,IAAAA,gEAA+B,IAA7CD;IACR,IAAM,AAAEE,UAAYC,OAAMC,UAAU,CAACC,kCAAgB,EAA7CH;IAER,qBACE,qBAACI;QACCd,WAAWe,IAAAA,gBAAU,yBAEnBZ,aAAaG,kBAAQ,CAACC,KAAK,qCAC3BC;QAEFQ,KAAKjB;qBAEL,qBAACkB,wBAAW;QACVjB,WAAWe,IAAAA,gBAAU,EAAC,mCAAmCf;QACzDC,iBAAiB;YACfiB,WAAW;YACXC,IAAIT;WACDT;OAEDC;QACJkB,OAAO;QACPtB,WAAW;QACXuB,aAAAA;QAECxB,WAEFQ,8BAAgB,qBAACiB,oBAAS;QAACC,MAAAA;;AAGlC"}
1
+ {"version":3,"sources":["../../../../src/components/ModalPageHeader/ModalPageHeader.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivityWithJSMediaQueries } from '../../hooks/useAdaptivityWithJSMediaQueries';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { Platform } from '../../lib/platform';\nimport { HasRef, HasRootRef } from '../../types';\nimport { ModalPageContext } from '../ModalPage/ModalPageContext';\nimport { PanelHeader, PanelHeaderProps } from '../PanelHeader/PanelHeader';\nimport { Separator } from '../Separator/Separator';\nimport styles from './ModalPageHeader.module.css';\n\nexport interface ModalPageHeaderProps\n extends React.HTMLAttributes<HTMLDivElement>,\n Omit<PanelHeaderProps, 'fixed' | 'shadow'>,\n HasRef<HTMLDivElement>,\n HasRootRef<HTMLDivElement> {}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ModalPageHeader\n */\nexport const ModalPageHeader = ({\n children,\n separator = true,\n getRef, // TODO [>=6]: remove\n getRootRef,\n className,\n typographyProps,\n ...restProps\n}: ModalPageHeaderProps) => {\n const platform = usePlatform();\n const hasSeparator = separator && platform === Platform.VKCOM;\n const { isDesktop } = useAdaptivityWithJSMediaQueries();\n const { labelId } = React.useContext(ModalPageContext);\n const modalPageHeaderRef = useExternRef(getRef, getRootRef);\n\n return (\n <div\n className={classNames(\n styles['ModalPageHeader'],\n platform !== Platform.VKCOM && styles['ModalPageHeader--withGaps'],\n isDesktop && styles['ModalPageHeader--desktop'],\n )}\n ref={modalPageHeaderRef}\n >\n <PanelHeader\n className={classNames('vkuiInternalModalPageHeader__in', className)}\n typographyProps={{\n Component: 'h2',\n id: labelId,\n ...typographyProps,\n }}\n {...restProps}\n fixed={false}\n separator={false}\n transparent\n >\n {children}\n </PanelHeader>\n {hasSeparator && <Separator wide />}\n </div>\n );\n};\n"],"names":["ModalPageHeader","children","separator","getRef","getRootRef","className","typographyProps","restProps","platform","usePlatform","hasSeparator","Platform","VKCOM","isDesktop","useAdaptivityWithJSMediaQueries","labelId","React","useContext","ModalPageContext","modalPageHeaderRef","useExternRef","div","classNames","ref","PanelHeader","Component","id","fixed","transparent","Separator","wide"],"mappings":";;;;+BAqBaA;;;eAAAA;;;;;;;+DArBU;oBACI;+CACqB;4BACnB;2BACD;wBACH;gCAEQ;2BACa;yBACpB;AAYnB,IAAMA,kBAAkB;QAC7BC,kBAAAA,oCACAC,WAAAA,0CAAY,yBACZC,gBAAAA,QACAC,oBAAAA,YACAC,mBAAAA,WACAC,yBAAAA,iBACGC;QANHN;QACAC;QACAC;QACAC;QACAC;QACAC;;IAGA,IAAME,WAAWC,IAAAA,wBAAW;IAC5B,IAAMC,eAAeR,aAAaM,aAAaG,kBAAQ,CAACC,KAAK;IAC7D,IAAM,AAAEC,YAAcC,IAAAA,gEAA+B,IAA7CD;IACR,IAAM,AAAEE,UAAYC,OAAMC,UAAU,CAACC,kCAAgB,EAA7CH;IACR,IAAMI,qBAAqBC,IAAAA,0BAAY,EAACjB,QAAQC;IAEhD,qBACE,qBAACiB;QACChB,WAAWiB,IAAAA,gBAAU,yBAEnBd,aAAaG,kBAAQ,CAACC,KAAK,qCAC3BC;QAEFU,KAAKJ;qBAEL,qBAACK,wBAAW;QACVnB,WAAWiB,IAAAA,gBAAU,EAAC,mCAAmCjB;QACzDC,iBAAiB;YACfmB,WAAW;YACXC,IAAIX;WACDT;OAEDC;QACJoB,OAAO;QACPzB,WAAW;QACX0B,aAAAA;QAEC3B,WAEFS,8BAAgB,qBAACmB,oBAAS;QAACC,MAAAA;;AAGlC"}
@@ -446,7 +446,7 @@ var ModalRootTouchComponent = /*#__PURE__*/ function(_React_Component) {
446
446
  }
447
447
  modalState.translateY = translateY;
448
448
  modalState.translateYCurrent = translateY;
449
- modalState.collapsed = translateY > 0 && translateY < shiftYEndPercent;
449
+ modalState.collapsed = numberInRange(translateY, modalState.collapsedRange);
450
450
  modalState.expanded = translateY === 0;
451
451
  modalState.hidden = translateY === 100;
452
452
  if (modalState.hidden) {
@@ -636,6 +636,7 @@ function initPageModal(modalState) {
636
636
  var expandedRange;
637
637
  var collapsedRange;
638
638
  var hiddenRange;
639
+ var hasCollapsedState = Boolean(modalState.expandable && modalState.settlingHeight !== 100);
639
640
  if (modalState.expandable) {
640
641
  var _modalState_settlingHeight;
641
642
  translateYFrom = 100 - ((_modalState_settlingHeight = modalState.settlingHeight) !== null && _modalState_settlingHeight !== void 0 ? _modalState_settlingHeight : 0);
@@ -645,15 +646,15 @@ function initPageModal(modalState) {
645
646
  0,
646
647
  shiftHalf
647
648
  ];
648
- collapsedRange = [
649
+ collapsedRange = hasCollapsedState ? [
649
650
  shiftHalf,
650
651
  translateYFrom + visiblePart / 4
651
- ];
652
+ ] : undefined;
652
653
  hiddenRange = [
653
654
  translateYFrom + visiblePart / 4,
654
655
  100
655
656
  ];
656
- collapsed = translateYFrom > 0;
657
+ collapsed = hasCollapsedState && translateYFrom > 0;
657
658
  expanded = translateYFrom <= 0;
658
659
  translateY = translateYFrom;
659
660
  } else {
@@ -668,10 +669,7 @@ function initPageModal(modalState) {
668
669
  translateY,
669
670
  translateY + 25
670
671
  ];
671
- collapsedRange = [
672
- translateY + 25,
673
- translateY + 25
674
- ];
672
+ collapsedRange = undefined;
675
673
  hiddenRange = [
676
674
  translateY + 25,
677
675
  translateY + 100