@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":["React","classNames","useAdaptivity","useExternRef","SizeType","defaultFilterFn","getFormFieldModeFromSelectType","useIsomorphicLayoutEffect","debounce","getTitleFromChildren","warnOnce","CustomSelectDropdown","CustomSelectOption","DropdownIcon","Input","SelectMimicry","Footnote","CustomSelectClearButton","sizeYClassNames","none","COMPACT","findIndexAfter","options","startIndex","length","findIndex","option","i","disabled","findIndexBefore","endIndex","result","warn","checkOptionsValueType","Set","map","item","value","size","defaultRenderOptionFn","props","handleOptionDown","e","preventDefault","findSelectedIndex","withClear","Number","filter","inputValue","filterFn","defaultOptions","CustomSelect","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","icon","iconProp","ClearButton","allowClearButton","dropdownOffsetDistance","fixDropdownWidth","restProps","process","env","NODE_ENV","sizeY","containerRef","useRef","handleRootRef","scrollBoxRef","selectElRef","focusedOptionIndex","setFocusedOptionIndex","undefined","isControlledOutside","setIsControlledOutside","setInputValue","defaultValue","nativeSelectValue","setNativeSelectValue","keyboardInput","setKeyboardInput","popperPlacement","setPopperPlacement","setOptions","selectedOptionIndex","setSelectedOptionIndex","useEffect","some","event","Event","bubbles","current","dispatchEvent","selected","useMemo","openedClassNames","includes","resetKeyboardInput","useCallback","scrollToElement","index","center","dropdown","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","isValidIndex","focusOptionByIndex","scrollTo","areOptionsShown","setScrollBoxRef","ref","onKeyboardInput","key","fullInput","optionIndex","label","toLowerCase","close","selectOption","shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync","selectFocused","open","onBlur","resetFocusedOption","onFocus","onClick","handleKeyUp","focusOption","type","nextIndex","beforeIndex","updateOptionsAndSelectedOptionIndex","onLabelClick","contains","target","onNativeSelectChange","newSelectedOptionIndex","currentTarget","onInputKeyDown","handleKeyDownSelect","handleOptionClick","Array","prototype","indexOf","call","parentNode","handleOptionHover","hovered","Fragment","onMouseDown","onMouseOver","resolvedContent","defaultDropdownContent","controlledValueSet","uncontrolledValueSet","clearButtonShown","clearButton","afterIcons","REGULAR","autoFocus","onKeyDown","after","mode","aria-hidden","onKeyUp","select","targetRef","placement","onPlacementChange","onMouseLeave","offsetDistance","sameWidth","forcePortal"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/CustomSelect/CustomSelect.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { SizeType } from '../../lib/adaptivity';\nimport type { PlacementWithAuto } from '../../lib/floating';\nimport { defaultFilterFn, getFormFieldModeFromSelectType } from '../../lib/select';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { debounce, getTitleFromChildren } from '../../lib/utils';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { TrackerOptionsProps } from '../CustomScrollView/useTrackerVisibility';\nimport { CustomSelectDropdown } from '../CustomSelectDropdown/CustomSelectDropdown';\nimport {\n CustomSelectOption,\n CustomSelectOptionProps,\n} from '../CustomSelectOption/CustomSelectOption';\nimport { DropdownIcon } from '../DropdownIcon/DropdownIcon';\nimport { FormFieldProps } from '../FormField/FormField';\nimport { Input } from '../Input/Input';\nimport { NativeSelectProps } from '../NativeSelect/NativeSelect';\nimport { SelectType } from '../Select/Select';\nimport { SelectMimicry } from '../SelectMimicry/SelectMimicry';\nimport { Footnote } from '../Typography/Footnote/Footnote';\nimport { CustomSelectClearButton, CustomSelectClearButtonProps } from './CustomSelectClearButton';\nimport styles from './CustomSelect.module.css';\n\nconst sizeYClassNames = {\n none: styles['CustomSelect--sizeY-none'],\n [SizeType.COMPACT]: styles['CustomSelect--sizeY-compact'],\n};\n\nconst findIndexAfter = (options: CustomSelectOptionInterface[] = [], startIndex = -1) => {\n if (startIndex >= options.length - 1) {\n return -1;\n }\n return options.findIndex((option, i) => i > startIndex && !option.disabled);\n};\n\nconst findIndexBefore = (\n options: CustomSelectOptionInterface[] = [],\n endIndex: number = options.length,\n) => {\n let result = -1;\n if (endIndex <= 0) {\n return result;\n }\n for (let i = endIndex - 1; i >= 0; i--) {\n let option = options[i];\n\n if (!option.disabled) {\n result = i;\n break;\n }\n }\n return result;\n};\n\nconst warn = warnOnce('CustomSelect');\n\nconst checkOptionsValueType = (options: CustomSelectOptionInterface[]) => {\n if (new Set(options.map((item) => typeof item.value)).size > 1) {\n warn(\n 'Некоторые значения ваших опций имеют разные типы. onChange всегда возвращает строковый тип.',\n 'error',\n );\n }\n};\n\nfunction defaultRenderOptionFn({ option, ...props }: CustomSelectOptionProps): React.ReactNode {\n return <CustomSelectOption {...props} />;\n}\n\nconst handleOptionDown: MouseEventHandler = (e: React.MouseEvent<HTMLElement>) => {\n e.preventDefault();\n};\n\nfunction findSelectedIndex(\n options: CustomSelectOptionInterface[],\n value: SelectValue,\n withClear: boolean,\n) {\n if (withClear && value === '') {\n return -1;\n }\n return (\n options.findIndex((item) => {\n value = typeof item.value === 'number' ? Number(value) : value;\n return item.value === value;\n }) ?? -1\n );\n}\n\nconst filter = (\n options: SelectProps['options'],\n inputValue: string,\n filterFn: SelectProps['filterFn'],\n) => {\n return typeof filterFn === 'function'\n ? options.filter((option) => filterFn(inputValue, option))\n : options;\n};\n\nconst defaultOptions: CustomSelectOptionInterface[] = [];\n\ntype SelectValue = React.SelectHTMLAttributes<HTMLSelectElement>['value'];\n\nexport interface CustomSelectOptionInterface {\n value: SelectValue;\n label: React.ReactElement | string;\n disabled?: boolean;\n [index: string]: any;\n}\n\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":["React","classNames","useAdaptivity","useExternRef","SizeType","defaultFilterFn","getFormFieldModeFromSelectType","useIsomorphicLayoutEffect","debounce","getTitleFromChildren","warnOnce","CustomSelectDropdown","CustomSelectOption","DropdownIcon","Input","SelectMimicry","Footnote","CustomSelectClearButton","sizeYClassNames","none","COMPACT","findIndexAfter","options","startIndex","length","findIndex","option","i","disabled","findIndexBefore","endIndex","result","warn","checkOptionsValueType","Set","map","item","value","size","defaultRenderOptionFn","props","handleOptionDown","e","preventDefault","findSelectedIndex","withClear","Number","filter","inputValue","filterFn","defaultOptions","CustomSelect","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","icon","iconProp","ClearButton","allowClearButton","dropdownOffsetDistance","fixDropdownWidth","restProps","process","env","NODE_ENV","sizeY","containerRef","useRef","handleRootRef","scrollBoxRef","selectElRef","focusedOptionIndex","setFocusedOptionIndex","undefined","isControlledOutside","setIsControlledOutside","setInputValue","defaultValue","nativeSelectValue","setNativeSelectValue","keyboardInput","setKeyboardInput","popperPlacement","setPopperPlacement","setOptions","selectedOptionIndex","setSelectedOptionIndex","useEffect","some","event","Event","bubbles","current","dispatchEvent","selected","useMemo","openedClassNames","includes","resetKeyboardInput","useCallback","scrollToElement","index","center","dropdown","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight","isValidIndex","focusOptionByIndex","scrollTo","areOptionsShown","setScrollBoxRef","ref","onKeyboardInput","key","fullInput","optionIndex","label","toLowerCase","close","selectOption","shouldTriggerOnChangeWhenControlledAndInnerValueIsOutOfSync","selectFocused","open","onBlur","resetFocusedOption","onFocus","onClick","handleKeyUp","focusOption","type","nextIndex","beforeIndex","updateOptionsAndSelectedOptionIndex","onLabelClick","contains","target","onNativeSelectChange","newSelectedOptionIndex","currentTarget","onInputKeyDown","handleKeyDownSelect","handleOptionClick","Array","prototype","indexOf","call","parentNode","handleOptionHover","hovered","Fragment","onMouseDown","onMouseOver","resolvedContent","defaultDropdownContent","controlledValueSet","uncontrolledValueSet","clearButtonShown","clearButton","afterIcons","REGULAR","autoFocus","onKeyDown","after","mode","aria-hidden","onKeyUp","select","targetRef","placement","onPlacementChange","onMouseLeave","offsetDistance","sameWidth","forcePortal"],"mappings":"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"}
@@ -1,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"}
@@ -3,23 +3,26 @@ import { _ as _object_spread_props } from "@swc/helpers/_/_object_spread_props";
3
3
  import { _ as _object_without_properties } from "@swc/helpers/_/_object_without_properties";
4
4
  import * as React from "react";
5
5
  import { classNames } from "@vkontakte/vkjs";
6
+ import { useExternRef } from "../../hooks/useExternRef";
6
7
  var preventDefault = function(e) {
7
8
  return e.preventDefault();
8
9
  };
9
10
  /**
10
11
  * @see https://vkcom.github.io/VKUI/#/FormLayout
11
12
  */ export var FormLayout = function(_param) {
12
- 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, [
13
+ 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, [
13
14
  "children",
14
15
  "Component",
15
16
  "getRef",
17
+ "getRootRef",
16
18
  "onSubmit",
17
19
  "className"
18
20
  ]);
21
+ var formLayoutRef = useExternRef(getRef, getRootRef);
19
22
  return /*#__PURE__*/ React.createElement(Component, _object_spread_props(_object_spread({}, restProps), {
20
23
  className: classNames("vkuiFormLayout", className),
21
24
  onSubmit: onSubmit,
22
- ref: getRef
25
+ ref: formLayoutRef
23
26
  }), children, Component === "form" && /*#__PURE__*/ React.createElement("input", {
24
27
  type: "submit",
25
28
  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":["React","classNames","preventDefault","e","FormLayout","children","Component","getRef","onSubmit","className","restProps","ref","input","type","value"],"mappings":";;;AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAI7C,IAAMC,iBAAiB,SAACC;WAAuBA,EAAED,cAAc;;AAM/D;;CAEC,GACD,OAAO,IAAME,aAAa;QACxBC,kBAAAA,oCACAC,WAAAA,0CAAY,2BACZC,gBAAAA,iCACAC,UAAAA,wCAAWN,kCACXO,mBAAAA,WACGC;QALHL;QACAC;QACAC;QACAC;QACAC;;IAGA,qBACE,oBAACH,mDACKI;QACJD,WAAWR,6BAAiCQ;QAC5CD,UAAUA;QACVG,KAAKJ;QAEJF,UACAC,cAAc,wBACb,oBAACM;QAAMC,MAAK;QAASJ,SAAS;QAAgCK,OAAM;;AAI5E,EAAE"}
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":["React","classNames","useExternRef","preventDefault","e","FormLayout","children","Component","getRef","getRootRef","onSubmit","className","restProps","formLayoutRef","ref","input","type","value"],"mappings":";;;AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,YAAY,QAAQ,2BAA2B;AAIxD,IAAMC,iBAAiB,SAACC;WAAuBA,EAAED,cAAc;;AAO/D;;CAEC,GACD,OAAO,IAAME,aAAa;QACxBC,kBAAAA,oCACAC,WAAAA,0CAAY,2BACZC,gBAAAA,QACAC,oBAAAA,qCACAC,UAAAA,wCAAWP,kCACXQ,mBAAAA,WACGC;QANHN;QACAC;QACAC;QACAC;QACAC;QACAC;;IAGA,IAAME,gBAAgBX,aAAaM,QAAQC;IAE3C,qBACE,oBAACF,mDACKK;QACJD,WAAWV,6BAAiCU;QAC5CD,UAAUA;QACVI,KAAKD;QAEJP,UACAC,cAAc,wBACb,oBAACQ;QAAMC,MAAK;QAASL,SAAS;QAAgCM,OAAM;;AAI5E,EAAE"}
@@ -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"}
@@ -5,9 +5,9 @@ import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
5
5
  import * as React from "react";
6
6
  import { clamp } from "../../helpers/math";
7
7
  import { useIsClient } from "../../hooks/useIsClient";
8
- import { useTimeout } from "../../hooks/useTimeout";
9
8
  import { BaseGallery } from "../BaseGallery/BaseGallery";
10
9
  import { CarouselBase } from "../BaseGallery/CarouselBase/CarouselBase";
10
+ import { useAutoPlay } from "./hooks";
11
11
  /**
12
12
  * @see https://vkcom.github.io/VKUI/#/Gallery
13
13
  */ export var Gallery = function(_param) {
@@ -44,16 +44,9 @@ import { CarouselBase } from "../BaseGallery/CarouselBase/CarouselBase";
44
44
  onChange,
45
45
  slideIndex
46
46
  ]);
47
- var autoplay = useTimeout(function() {
47
+ useAutoPlay(timeout, slideIndex, function() {
48
48
  return handleChange((slideIndex + 1) % childCount);
49
- }, timeout);
50
- React.useEffect(function() {
51
- return timeout ? autoplay.set() : autoplay.clear();
52
- }, [
53
- timeout,
54
- slideIndex,
55
- autoplay
56
- ]);
49
+ });
57
50
  // prevent invalid slideIndex
58
51
  // any slide index is invalid with no slides, just keep it as is
59
52
  var safeSlideIndex = childCount > 0 ? 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":["React","clamp","useIsClient","useTimeout","BaseGallery","CarouselBase","Gallery","initialSlideIndex","children","timeout","onChange","bullets","looped","props","useState","localSlideIndex","setSlideIndex","isControlled","slideIndex","isDraggable","Boolean","slides","useMemo","Children","toArray","filter","item","childCount","length","isClient","handleChange","useCallback","current","autoplay","useEffect","set","clear","safeSlideIndex","Component"],"mappings":";;;;AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,KAAK,QAAQ,qBAAqB;AAC3C,SAASC,WAAW,QAAQ,0BAA0B;AACtD,SAASC,UAAU,QAAQ,yBAAyB;AACpD,SAASC,WAAW,QAAQ,6BAA6B;AACzD,SAASC,YAAY,QAAQ,2CAA2C;AAUxE;;CAEC,GACD,OAAO,IAAMC,UAAU;0CACrBC,mBAAAA,0DAAoB,8BACpBC,kBAAAA,kCACAC,SAAAA,sCAAU,oBACVC,kBAAAA,UACAC,iBAAAA,SACAC,gBAAAA,QACGC;QANHN;QACAC;QACAC;QACAC;QACAC;QACAC;;IAGA,IAAyCZ,mCAAAA,MAAMc,QAAQ,CAACP,wBAAjDQ,kBAAkCf,oBAAjBgB,gBAAiBhB;IACzC,IAAMiB,eAAe,OAAOJ,MAAMK,UAAU,KAAK;QACfL;IAAlC,IAAMK,aAAaD,eAAeJ,CAAAA,oBAAAA,MAAMK,UAAU,cAAhBL,+BAAAA,oBAAoB,IAAIE;IAC1D,IAAMI,cAAc,CAACF,gBAAgBG,QAAQV;IAC7C,IAAMW,SAASrB,MAAMsB,OAAO,CAC1B;eAAMtB,MAAMuB,QAAQ,CAACC,OAAO,CAAChB,UAAUiB,MAAM,CAAC,SAACC;mBAASN,QAAQM;;OAChE;QAAClB;KAAS;IAEZ,IAAMmB,aAAaN,OAAOO,MAAM;IAChC,IAAMC,WAAW3B;IAEjB,IAAM4B,eAAyC9B,MAAM+B,WAAW,CAC9D,SAACC;QACC,IAAIA,YAAYd,YAAY;YAC1B;QACF;QACA,CAACD,gBAAgBD,cAAcgB;QAC/BtB,YAAYA,SAASsB;IACvB,GACA;QAACf;QAAcP;QAAUQ;KAAW;IAGtC,IAAMe,WAAW9B,WAAW;eAAM2B,aAAa,AAACZ,CAAAA,aAAa,CAAA,IAAKS;OAAalB;IAC/ET,MAAMkC,SAAS,CACb;eAAOzB,UAAUwB,SAASE,GAAG,KAAKF,SAASG,KAAK;OAChD;QAAC3B;QAASS;QAAYe;KAAS;IAGjC,6BAA6B;IAC7B,gEAAgE;IAChE,IAAMI,iBAAiBV,aAAa,IAAI1B,MAAMiB,YAAY,GAAGS,aAAa,KAAKT;IAC/E,mCAAmC;IACnClB,MAAMkC,SAAS,CAAC;QACd,IAAIxB,YAAY2B,mBAAmBnB,YAAY;YAC7CR,SAAS2B;QACX;QACArB,cAAcqB;IAChB,GAAG;QAAC3B;QAAU2B;QAAgBnB;KAAW;IAEzC,IAAI,CAACW,UAAU;QACb,OAAO;IACT;IAEA,IAAMS,YAAY1B,SAASP,eAAeD;IAE1C,qBACE,oBAACkC;QACCnB,aAAaA;OACTN;QACJF,SAASgB,aAAa,KAAKhB;QAC3BO,YAAYmB;QACZ3B,UAAUoB;QAETT;AAGP,EAAE"}
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":["React","clamp","useIsClient","BaseGallery","CarouselBase","useAutoPlay","Gallery","initialSlideIndex","children","timeout","onChange","bullets","looped","props","useState","localSlideIndex","setSlideIndex","isControlled","slideIndex","isDraggable","Boolean","slides","useMemo","Children","toArray","filter","item","childCount","length","isClient","handleChange","useCallback","current","safeSlideIndex","useEffect","Component"],"mappings":";;;;AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,KAAK,QAAQ,qBAAqB;AAC3C,SAASC,WAAW,QAAQ,0BAA0B;AACtD,SAASC,WAAW,QAAQ,6BAA6B;AACzD,SAASC,YAAY,QAAQ,2CAA2C;AAExE,SAASC,WAAW,QAAQ,UAAU;AAStC;;CAEC,GACD,OAAO,IAAMC,UAAU;0CACrBC,mBAAAA,0DAAoB,8BACpBC,kBAAAA,kCACAC,SAAAA,sCAAU,oBACVC,kBAAAA,UACAC,iBAAAA,SACAC,gBAAAA,QACGC;QANHN;QACAC;QACAC;QACAC;QACAC;QACAC;;IAGA,IAAyCZ,mCAAAA,MAAMc,QAAQ,CAACP,wBAAjDQ,kBAAkCf,oBAAjBgB,gBAAiBhB;IACzC,IAAMiB,eAAe,OAAOJ,MAAMK,UAAU,KAAK;QACfL;IAAlC,IAAMK,aAAaD,eAAeJ,CAAAA,oBAAAA,MAAMK,UAAU,cAAhBL,+BAAAA,oBAAoB,IAAIE;IAC1D,IAAMI,cAAc,CAACF,gBAAgBG,QAAQV;IAC7C,IAAMW,SAASrB,MAAMsB,OAAO,CAC1B;eAAMtB,MAAMuB,QAAQ,CAACC,OAAO,CAAChB,UAAUiB,MAAM,CAAC,SAACC;mBAASN,QAAQM;;OAChE;QAAClB;KAAS;IAEZ,IAAMmB,aAAaN,OAAOO,MAAM;IAChC,IAAMC,WAAW3B;IAEjB,IAAM4B,eAAyC9B,MAAM+B,WAAW,CAC9D,SAACC;QACC,IAAIA,YAAYd,YAAY;YAC1B;QACF;QACA,CAACD,gBAAgBD,cAAcgB;QAC/BtB,YAAYA,SAASsB;IACvB,GACA;QAACf;QAAcP;QAAUQ;KAAW;IAGtCb,YAAYI,SAASS,YAAY;eAAMY,aAAa,AAACZ,CAAAA,aAAa,CAAA,IAAKS;;IAEvE,6BAA6B;IAC7B,gEAAgE;IAChE,IAAMM,iBAAiBN,aAAa,IAAI1B,MAAMiB,YAAY,GAAGS,aAAa,KAAKT;IAC/E,mCAAmC;IACnClB,MAAMkC,SAAS,CAAC;QACd,IAAIxB,YAAYuB,mBAAmBf,YAAY;YAC7CR,SAASuB;QACX;QACAjB,cAAciB;IAChB,GAAG;QAACvB;QAAUuB;QAAgBf;KAAW;IAEzC,IAAI,CAACW,UAAU;QACb,OAAO;IACT;IAEA,IAAMM,YAAYvB,SAASR,eAAeD;IAE1C,qBACE,oBAACgC;QACChB,aAAaA;OACTN;QACJF,SAASgB,aAAa,KAAKhB;QAC3BO,YAAYe;QACZvB,UAAUoB;QAETT;AAGP,EAAE"}
@@ -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,41 @@
1
+ import * as React from "react";
2
+ import { useTimeout } from "../../hooks/useTimeout";
3
+ import { useDOM } from "../../lib/dom";
4
+ export function useAutoPlay(timeout, slideIndex, callbackFn) {
5
+ var _useTimeout = useTimeout(callbackFn, timeout), clearAutoPlay = _useTimeout.clear, setAutoPlay = _useTimeout.set;
6
+ var document = useDOM().document;
7
+ React.useEffect(function() {
8
+ return timeout ? setAutoPlay() : clearAutoPlay();
9
+ }, [
10
+ timeout,
11
+ slideIndex,
12
+ clearAutoPlay,
13
+ setAutoPlay
14
+ ]);
15
+ // Отключаем прокрутку слайдов при неактивной вкладке
16
+ React.useEffect(function preventSlideChange() {
17
+ if (!document || !timeout) {
18
+ return;
19
+ }
20
+ var changeAutoPlay = function() {
21
+ if (document.visibilityState === "visible") {
22
+ clearAutoPlay();
23
+ setAutoPlay();
24
+ }
25
+ if (document.visibilityState === "hidden") {
26
+ clearAutoPlay();
27
+ }
28
+ };
29
+ document.addEventListener("visibilitychange", changeAutoPlay);
30
+ return function() {
31
+ document.removeEventListener("visibilitychange", changeAutoPlay);
32
+ };
33
+ }, [
34
+ document,
35
+ timeout,
36
+ clearAutoPlay,
37
+ setAutoPlay
38
+ ]);
39
+ }
40
+
41
+ //# 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":["React","useTimeout","useDOM","useAutoPlay","timeout","slideIndex","callbackFn","clear","clearAutoPlay","set","setAutoPlay","document","useEffect","preventSlideChange","changeAutoPlay","visibilityState","addEventListener","removeEventListener"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,yBAAyB;AACpD,SAASC,MAAM,QAAQ,gBAAgB;AAEvC,OAAO,SAASC,YAAYC,OAAe,EAAEC,UAAkB,EAAEC,UAAwB;IACvF,IAAmDL,cAAAA,WAAWK,YAAYF,UAAlEG,AAAOC,gBAAoCP,YAA3CM,OAAsBE,AAAKC,cAAgBT,YAArBQ;IAC9B,IAAM,AAAEE,WAAaT,SAAbS;IAERX,MAAMY,SAAS,CACb;eAAOR,UAAUM,gBAAgBF;OACjC;QAACJ;QAASC;QAAYG;QAAeE;KAAY;IAGnD,qDAAqD;IACrDV,MAAMY,SAAS,CACb,SAASC;QACP,IAAI,CAACF,YAAY,CAACP,SAAS;YACzB;QACF;QAEA,IAAMU,iBAAiB;YACrB,IAAIH,SAASI,eAAe,KAAK,WAAW;gBAC1CP;gBACAE;YACF;YACA,IAAIC,SAASI,eAAe,KAAK,UAAU;gBACzCP;YACF;QACF;QAEAG,SAASK,gBAAgB,CAAC,oBAAoBF;QAE9C,OAAO;YACLH,SAASM,mBAAmB,CAAC,oBAAoBH;QACnD;IACF,GACA;QAACH;QAAUP;QAASI;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"}
@@ -4,6 +4,7 @@ import { _ as _object_without_properties } from "@swc/helpers/_/_object_without_
4
4
  import * as React from "react";
5
5
  import { classNames } from "@vkontakte/vkjs";
6
6
  import { useAdaptivityWithJSMediaQueries } from "../../hooks/useAdaptivityWithJSMediaQueries";
7
+ import { useExternRef } from "../../hooks/useExternRef";
7
8
  import { usePlatform } from "../../hooks/usePlatform";
8
9
  import { Platform } from "../../lib/platform";
9
10
  import { ModalPageContext } from "../ModalPage/ModalPageContext";
@@ -12,10 +13,11 @@ import { Separator } from "../Separator/Separator";
12
13
  /**
13
14
  * @see https://vkcom.github.io/VKUI/#/ModalPageHeader
14
15
  */ export var ModalPageHeader = function(_param) {
15
- 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, [
16
+ 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, [
16
17
  "children",
17
18
  "separator",
18
19
  "getRef",
20
+ "getRootRef",
19
21
  "className",
20
22
  "typographyProps"
21
23
  ]);
@@ -23,9 +25,10 @@ import { Separator } from "../Separator/Separator";
23
25
  var hasSeparator = separator && platform === Platform.VKCOM;
24
26
  var isDesktop = useAdaptivityWithJSMediaQueries().isDesktop;
25
27
  var labelId = React.useContext(ModalPageContext).labelId;
28
+ var modalPageHeaderRef = useExternRef(getRef, getRootRef);
26
29
  return /*#__PURE__*/ React.createElement("div", {
27
30
  className: classNames("vkuiModalPageHeader", platform !== Platform.VKCOM && "vkuiModalPageHeader--withGaps", isDesktop && "vkuiModalPageHeader--desktop"),
28
- ref: getRef
31
+ ref: modalPageHeaderRef
29
32
  }, /*#__PURE__*/ React.createElement(PanelHeader, _object_spread_props(_object_spread({
30
33
  className: classNames("vkuiInternalModalPageHeader__in", className),
31
34
  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":["React","classNames","useAdaptivityWithJSMediaQueries","usePlatform","Platform","ModalPageContext","PanelHeader","Separator","ModalPageHeader","children","separator","getRef","className","typographyProps","restProps","platform","hasSeparator","VKCOM","isDesktop","labelId","useContext","div","ref","Component","id","fixed","transparent","wide"],"mappings":";;;AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,+BAA+B,QAAQ,8CAA8C;AAC9F,SAASC,WAAW,QAAQ,0BAA0B;AACtD,SAASC,QAAQ,QAAQ,qBAAqB;AAE9C,SAASC,gBAAgB,QAAQ,gCAAgC;AACjE,SAASC,WAAW,QAA0B,6BAA6B;AAC3E,SAASC,SAAS,QAAQ,yBAAyB;AAQnD;;CAEC,GACD,OAAO,IAAMC,kBAAkB;QAC7BC,kBAAAA,oCACAC,WAAAA,0CAAY,yBACZC,gBAAAA,QACAC,mBAAAA,WACAC,yBAAAA,iBACGC;QALHL;QACAC;QACAC;QACAC;QACAC;;IAGA,IAAME,WAAWZ;IACjB,IAAMa,eAAeN,aAAaK,aAAaX,SAASa,KAAK;IAC7D,IAAM,AAAEC,YAAchB,kCAAdgB;IACR,IAAM,AAAEC,UAAYnB,MAAMoB,UAAU,CAACf,kBAA7Bc;IAER,qBACE,oBAACE;QACCT,WAAWX,kCAETc,aAAaX,SAASa,KAAK,qCAC3BC;QAEFI,KAAKX;qBAEL,oBAACL;QACCM,WAAWX,WAAW,mCAAmCW;QACzDC,iBAAiB;YACfU,WAAW;YACXC,IAAIL;WACDN;OAEDC;QACJW,OAAO;QACPf,WAAW;QACXgB,aAAAA;QAECjB,WAEFO,8BAAgB,oBAACT;QAAUoB,MAAAA;;AAGlC,EAAE"}
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":["React","classNames","useAdaptivityWithJSMediaQueries","useExternRef","usePlatform","Platform","ModalPageContext","PanelHeader","Separator","ModalPageHeader","children","separator","getRef","getRootRef","className","typographyProps","restProps","platform","hasSeparator","VKCOM","isDesktop","labelId","useContext","modalPageHeaderRef","div","ref","Component","id","fixed","transparent","wide"],"mappings":";;;AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,+BAA+B,QAAQ,8CAA8C;AAC9F,SAASC,YAAY,QAAQ,2BAA2B;AACxD,SAASC,WAAW,QAAQ,0BAA0B;AACtD,SAASC,QAAQ,QAAQ,qBAAqB;AAE9C,SAASC,gBAAgB,QAAQ,gCAAgC;AACjE,SAASC,WAAW,QAA0B,6BAA6B;AAC3E,SAASC,SAAS,QAAQ,yBAAyB;AASnD;;CAEC,GACD,OAAO,IAAMC,kBAAkB;QAC7BC,kBAAAA,oCACAC,WAAAA,0CAAY,yBACZC,gBAAAA,QACAC,oBAAAA,YACAC,mBAAAA,WACAC,yBAAAA,iBACGC;QANHN;QACAC;QACAC;QACAC;QACAC;QACAC;;IAGA,IAAME,WAAWb;IACjB,IAAMc,eAAeP,aAAaM,aAAaZ,SAASc,KAAK;IAC7D,IAAM,AAAEC,YAAclB,kCAAdkB;IACR,IAAM,AAAEC,UAAYrB,MAAMsB,UAAU,CAAChB,kBAA7Be;IACR,IAAME,qBAAqBpB,aAAaS,QAAQC;IAEhD,qBACE,oBAACW;QACCV,WAAWb,kCAETgB,aAAaZ,SAASc,KAAK,qCAC3BC;QAEFK,KAAKF;qBAEL,oBAAChB;QACCO,WAAWb,WAAW,mCAAmCa;QACzDC,iBAAiB;YACfW,WAAW;YACXC,IAAIN;WACDN;OAEDC;QACJY,OAAO;QACPjB,WAAW;QACXkB,aAAAA;QAECnB,WAEFQ,8BAAgB,oBAACV;QAAUsB,MAAAA;;AAGlC,EAAE"}
@@ -434,7 +434,7 @@ var ModalRootTouchComponent = /*#__PURE__*/ function(_React_Component) {
434
434
  }
435
435
  modalState.translateY = translateY;
436
436
  modalState.translateYCurrent = translateY;
437
- modalState.collapsed = translateY > 0 && translateY < shiftYEndPercent;
437
+ modalState.collapsed = numberInRange(translateY, modalState.collapsedRange);
438
438
  modalState.expanded = translateY === 0;
439
439
  modalState.hidden = translateY === 100;
440
440
  if (modalState.hidden) {
@@ -624,6 +624,7 @@ function initPageModal(modalState) {
624
624
  var expandedRange;
625
625
  var collapsedRange;
626
626
  var hiddenRange;
627
+ var hasCollapsedState = Boolean(modalState.expandable && modalState.settlingHeight !== 100);
627
628
  if (modalState.expandable) {
628
629
  var _modalState_settlingHeight;
629
630
  translateYFrom = 100 - ((_modalState_settlingHeight = modalState.settlingHeight) !== null && _modalState_settlingHeight !== void 0 ? _modalState_settlingHeight : 0);
@@ -633,15 +634,15 @@ function initPageModal(modalState) {
633
634
  0,
634
635
  shiftHalf
635
636
  ];
636
- collapsedRange = [
637
+ collapsedRange = hasCollapsedState ? [
637
638
  shiftHalf,
638
639
  translateYFrom + visiblePart / 4
639
- ];
640
+ ] : undefined;
640
641
  hiddenRange = [
641
642
  translateYFrom + visiblePart / 4,
642
643
  100
643
644
  ];
644
- collapsed = translateYFrom > 0;
645
+ collapsed = hasCollapsedState && translateYFrom > 0;
645
646
  expanded = translateYFrom <= 0;
646
647
  translateY = translateYFrom;
647
648
  } else {
@@ -656,10 +657,7 @@ function initPageModal(modalState) {
656
657
  translateY,
657
658
  translateY + 25
658
659
  ];
659
- collapsedRange = [
660
- translateY + 25,
661
- translateY + 25
662
- ];
660
+ collapsedRange = undefined;
663
661
  hiddenRange = [
664
662
  translateY + 25,
665
663
  translateY + 100