@vkontakte/vkui 4.34.2 → 4.35.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 (467) hide show
  1. package/.browserslistrc +5 -0
  2. package/.cache/.eslintcache +1 -1
  3. package/.cache/.stylelintcache +1 -1
  4. package/.cache/.tsbuildinfo +242 -215
  5. package/.cache/ts/src/components/ConfigProvider/ConfigProviderContext.d.ts +1 -0
  6. package/.cache/ts/src/components/CustomSelect/CustomSelect.d.ts +1 -1
  7. package/.cache/ts/src/components/Dropdown/Dropdown.d.ts +46 -5
  8. package/.cache/ts/src/components/FocusTrap/FocusTrap.d.ts +1 -1
  9. package/.cache/ts/src/components/ModalRoot/ModalRoot.d.ts +1 -1
  10. package/.cache/ts/src/components/ModalRoot/ModalRootDesktop.d.ts +1 -1
  11. package/.cache/ts/src/components/Popper/Popper.d.ts +18 -1
  12. package/.cache/ts/src/components/PopperArrow/PopperArrow.d.ts +8 -0
  13. package/.cache/ts/src/components/RichTooltip/RichTooltip.d.ts +7 -2
  14. package/.cache/ts/src/components/Snackbar/Snackbar.d.ts +5 -1
  15. package/.cache/ts/src/components/SplitCol/SplitCol.d.ts +1 -0
  16. package/.cache/ts/src/components/Tabbar/Tabbar.d.ts +8 -1
  17. package/.cache/ts/src/components/Tabs/Tabs.d.ts +13 -2
  18. package/.cache/ts/src/components/TabsItem/TabsItem.d.ts +22 -1
  19. package/.cache/ts/src/components/TextTooltip/TextTooltip.d.ts +5 -1
  20. package/.cache/ts/src/components/Tooltip/Tooltip.d.ts +18 -1
  21. package/.cache/ts/src/components/Typography/Headline/Headline.d.ts +3 -3
  22. package/.cache/ts/src/components/View/View.d.ts +2 -18
  23. package/.cache/ts/src/components/View/ViewInfinite.d.ts +1 -1
  24. package/.cache/ts/src/components/WriteBar/WriteBar.d.ts +5 -1
  25. package/.cache/ts/src/tokenized/index.d.ts +26 -0
  26. package/.eslintrc.json +14 -4
  27. package/dist/cjs/components/CardScroll/CardScroll.js +3 -1
  28. package/dist/cjs/components/CardScroll/CardScroll.js.map +1 -1
  29. package/dist/cjs/components/ConfigProvider/ConfigProviderContext.js +7 -1
  30. package/dist/cjs/components/ConfigProvider/ConfigProviderContext.js.map +1 -1
  31. package/dist/cjs/components/CustomSelect/CustomSelect.js +477 -554
  32. package/dist/cjs/components/CustomSelect/CustomSelect.js.map +1 -1
  33. package/dist/cjs/components/CustomSelectDropdown/CustomSelectDropdown.js +3 -0
  34. package/dist/cjs/components/CustomSelectDropdown/CustomSelectDropdown.js.map +1 -1
  35. package/dist/cjs/components/Dropdown/Dropdown.js +147 -26
  36. package/dist/cjs/components/Dropdown/Dropdown.js.map +1 -1
  37. package/dist/cjs/components/Epic/Epic.js +1 -6
  38. package/dist/cjs/components/Epic/Epic.js.map +1 -1
  39. package/dist/cjs/components/FocusTrap/FocusTrap.js +9 -10
  40. package/dist/cjs/components/FocusTrap/FocusTrap.js.map +1 -1
  41. package/dist/cjs/components/HorizontalCell/HorizontalCell.js +4 -7
  42. package/dist/cjs/components/HorizontalCell/HorizontalCell.js.map +1 -1
  43. package/dist/cjs/components/HorizontalScroll/HorizontalScrollArrow.js +1 -1
  44. package/dist/cjs/components/HorizontalScroll/HorizontalScrollArrow.js.map +1 -1
  45. package/dist/cjs/components/MiniInfoCell/MiniInfoCell.js +2 -2
  46. package/dist/cjs/components/MiniInfoCell/MiniInfoCell.js.map +1 -1
  47. package/dist/cjs/components/Popper/Popper.js +63 -68
  48. package/dist/cjs/components/Popper/Popper.js.map +1 -1
  49. package/dist/cjs/components/PopperArrow/PopperArrow.js +40 -0
  50. package/dist/cjs/components/PopperArrow/PopperArrow.js.map +1 -0
  51. package/dist/cjs/components/RichTooltip/RichTooltip.js +6 -15
  52. package/dist/cjs/components/RichTooltip/RichTooltip.js.map +1 -1
  53. package/dist/cjs/components/SimpleCell/SimpleCell.js +20 -31
  54. package/dist/cjs/components/SimpleCell/SimpleCell.js.map +1 -1
  55. package/dist/cjs/components/Snackbar/Snackbar.js +7 -11
  56. package/dist/cjs/components/Snackbar/Snackbar.js.map +1 -1
  57. package/dist/cjs/components/SplitCol/SplitCol.js +7 -1
  58. package/dist/cjs/components/SplitCol/SplitCol.js.map +1 -1
  59. package/dist/cjs/components/SplitLayout/SplitLayout.js +5 -8
  60. package/dist/cjs/components/SplitLayout/SplitLayout.js.map +1 -1
  61. package/dist/cjs/components/Tabbar/Tabbar.js +15 -14
  62. package/dist/cjs/components/Tabbar/Tabbar.js.map +1 -1
  63. package/dist/cjs/components/TabbarItem/TabbarItem.js +8 -10
  64. package/dist/cjs/components/TabbarItem/TabbarItem.js.map +1 -1
  65. package/dist/cjs/components/Tabs/Tabs.js +23 -5
  66. package/dist/cjs/components/Tabs/Tabs.js.map +1 -1
  67. package/dist/cjs/components/TabsItem/TabsItem.js +39 -22
  68. package/dist/cjs/components/TabsItem/TabsItem.js.map +1 -1
  69. package/dist/cjs/components/TextTooltip/TextTooltip.js +6 -9
  70. package/dist/cjs/components/TextTooltip/TextTooltip.js.map +1 -1
  71. package/dist/cjs/components/Tooltip/Tooltip.js +94 -71
  72. package/dist/cjs/components/Tooltip/Tooltip.js.map +1 -1
  73. package/dist/cjs/components/Typography/Headline/Headline.js +11 -2
  74. package/dist/cjs/components/Typography/Headline/Headline.js.map +1 -1
  75. package/dist/cjs/components/View/View.js +388 -453
  76. package/dist/cjs/components/View/View.js.map +1 -1
  77. package/dist/cjs/components/WriteBar/WriteBar.js +12 -5
  78. package/dist/cjs/components/WriteBar/WriteBar.js.map +1 -1
  79. package/dist/cjs/components/WriteBarIcon/WriteBarIcon.js +3 -8
  80. package/dist/cjs/components/WriteBarIcon/WriteBarIcon.js.map +1 -1
  81. package/dist/cjs/hooks/useOrientationChange.js +2 -1
  82. package/dist/cjs/hooks/useOrientationChange.js.map +1 -1
  83. package/dist/cjs/tokenized/index.js +104 -0
  84. package/dist/cjs/tokenized/index.js.map +1 -1
  85. package/dist/components/CardScroll/CardScroll.js +3 -1
  86. package/dist/components/CardScroll/CardScroll.js.map +1 -1
  87. package/dist/components/ConfigProvider/ConfigProviderContext.d.ts +1 -0
  88. package/dist/components/ConfigProvider/ConfigProviderContext.js +3 -0
  89. package/dist/components/ConfigProvider/ConfigProviderContext.js.map +1 -1
  90. package/dist/components/CustomSelect/CustomSelect.d.ts +1 -1
  91. package/dist/components/CustomSelect/CustomSelect.js +473 -580
  92. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  93. package/dist/components/CustomSelectDropdown/CustomSelectDropdown.js +2 -0
  94. package/dist/components/CustomSelectDropdown/CustomSelectDropdown.js.map +1 -1
  95. package/dist/components/Dropdown/Dropdown.d.ts +46 -5
  96. package/dist/components/Dropdown/Dropdown.js +137 -27
  97. package/dist/components/Dropdown/Dropdown.js.map +1 -1
  98. package/dist/components/Epic/Epic.js +1 -4
  99. package/dist/components/Epic/Epic.js.map +1 -1
  100. package/dist/components/FocusTrap/FocusTrap.d.ts +1 -1
  101. package/dist/components/FocusTrap/FocusTrap.js +9 -9
  102. package/dist/components/FocusTrap/FocusTrap.js.map +1 -1
  103. package/dist/components/HorizontalCell/HorizontalCell.js +3 -5
  104. package/dist/components/HorizontalCell/HorizontalCell.js.map +1 -1
  105. package/dist/components/HorizontalScroll/HorizontalScrollArrow.js +2 -2
  106. package/dist/components/HorizontalScroll/HorizontalScrollArrow.js.map +1 -1
  107. package/dist/components/MiniInfoCell/MiniInfoCell.js +2 -2
  108. package/dist/components/MiniInfoCell/MiniInfoCell.js.map +1 -1
  109. package/dist/components/ModalRoot/ModalRoot.d.ts +1 -1
  110. package/dist/components/ModalRoot/ModalRootDesktop.d.ts +1 -1
  111. package/dist/components/Popper/Popper.d.ts +18 -1
  112. package/dist/components/Popper/Popper.js +62 -68
  113. package/dist/components/Popper/Popper.js.map +1 -1
  114. package/dist/components/PopperArrow/PopperArrow.d.ts +8 -0
  115. package/dist/components/PopperArrow/PopperArrow.js +27 -0
  116. package/dist/components/PopperArrow/PopperArrow.js.map +1 -0
  117. package/dist/components/RichTooltip/RichTooltip.d.ts +7 -2
  118. package/dist/components/RichTooltip/RichTooltip.js +5 -10
  119. package/dist/components/RichTooltip/RichTooltip.js.map +1 -1
  120. package/dist/components/SimpleCell/SimpleCell.js +18 -28
  121. package/dist/components/SimpleCell/SimpleCell.js.map +1 -1
  122. package/dist/components/Snackbar/Snackbar.d.ts +5 -1
  123. package/dist/components/Snackbar/Snackbar.js +8 -11
  124. package/dist/components/Snackbar/Snackbar.js.map +1 -1
  125. package/dist/components/SplitCol/SplitCol.d.ts +1 -0
  126. package/dist/components/SplitCol/SplitCol.js +3 -0
  127. package/dist/components/SplitCol/SplitCol.js.map +1 -1
  128. package/dist/components/SplitLayout/SplitLayout.js +4 -7
  129. package/dist/components/SplitLayout/SplitLayout.js.map +1 -1
  130. package/dist/components/Tabbar/Tabbar.d.ts +8 -1
  131. package/dist/components/Tabbar/Tabbar.js +15 -14
  132. package/dist/components/Tabbar/Tabbar.js.map +1 -1
  133. package/dist/components/TabbarItem/TabbarItem.js +7 -9
  134. package/dist/components/TabbarItem/TabbarItem.js.map +1 -1
  135. package/dist/components/Tabs/Tabs.d.ts +13 -2
  136. package/dist/components/Tabs/Tabs.js +23 -5
  137. package/dist/components/Tabs/Tabs.js.map +1 -1
  138. package/dist/components/TabsItem/TabsItem.d.ts +22 -1
  139. package/dist/components/TabsItem/TabsItem.js +40 -21
  140. package/dist/components/TabsItem/TabsItem.js.map +1 -1
  141. package/dist/components/TextTooltip/TextTooltip.d.ts +5 -1
  142. package/dist/components/TextTooltip/TextTooltip.js +5 -7
  143. package/dist/components/TextTooltip/TextTooltip.js.map +1 -1
  144. package/dist/components/Tooltip/Tooltip.d.ts +18 -1
  145. package/dist/components/Tooltip/Tooltip.js +89 -68
  146. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  147. package/dist/components/Typography/Headline/Headline.d.ts +3 -3
  148. package/dist/components/Typography/Headline/Headline.js +10 -2
  149. package/dist/components/Typography/Headline/Headline.js.map +1 -1
  150. package/dist/components/View/View.d.ts +2 -18
  151. package/dist/components/View/View.js +384 -462
  152. package/dist/components/View/View.js.map +1 -1
  153. package/dist/components/View/ViewInfinite.d.ts +1 -1
  154. package/dist/components/WriteBar/WriteBar.d.ts +5 -1
  155. package/dist/components/WriteBar/WriteBar.js +10 -5
  156. package/dist/components/WriteBar/WriteBar.js.map +1 -1
  157. package/dist/components/WriteBarIcon/WriteBarIcon.js +3 -6
  158. package/dist/components/WriteBarIcon/WriteBarIcon.js.map +1 -1
  159. package/dist/components.css +143 -127
  160. package/dist/components.css.map +1 -1
  161. package/dist/cssm/components/ActionSheet/ActionSheet.css +1 -1
  162. package/dist/cssm/components/ActionSheetItem/ActionSheetItem.css +1 -1
  163. package/dist/cssm/components/Alert/Alert.css +1 -1
  164. package/dist/cssm/components/AppRoot/AppRoot.css +1 -1
  165. package/dist/cssm/components/Avatar/Avatar.css +3 -5
  166. package/dist/cssm/components/Badge/Badge.css +3 -3
  167. package/dist/cssm/components/Banner/Banner.css +5 -5
  168. package/dist/cssm/components/BaseGallery/BaseGallery.css +1 -1
  169. package/dist/cssm/components/Button/Button.css +53 -35
  170. package/dist/cssm/components/Calendar/Calendar.css +1 -1
  171. package/dist/cssm/components/CalendarDay/CalendarDay.css +1 -1
  172. package/dist/cssm/components/CalendarDays/CalendarDays.css +1 -1
  173. package/dist/cssm/components/CalendarHeader/CalendarHeader.css +1 -1
  174. package/dist/cssm/components/CalendarRange/CalendarRange.css +1 -1
  175. package/dist/cssm/components/CalendarTime/CalendarTime.css +1 -1
  176. package/dist/cssm/components/Card/Card.css +5 -6
  177. package/dist/cssm/components/CardGrid/CardGrid.css +1 -1
  178. package/dist/cssm/components/CardScroll/CardScroll.css +1 -1
  179. package/dist/cssm/components/CardScroll/CardScroll.js +3 -1
  180. package/dist/cssm/components/CardScroll/CardScroll.js.map +1 -1
  181. package/dist/cssm/components/Cell/Cell.css +3 -3
  182. package/dist/cssm/components/Cell/CellCheckbox/CellCheckbox.css +1 -1
  183. package/dist/cssm/components/Cell/CellDragger/CellDragger.css +1 -1
  184. package/dist/cssm/components/CellButton/CellButton.css +1 -1
  185. package/dist/cssm/components/Checkbox/Checkbox.css +1 -1
  186. package/dist/cssm/components/Chip/Chip.css +1 -1
  187. package/dist/cssm/components/ChipsInput/ChipsInput.css +1 -1
  188. package/dist/cssm/components/ChipsSelect/ChipsSelect.css +1 -1
  189. package/dist/cssm/components/ConfigProvider/ConfigProviderContext.d.ts +1 -0
  190. package/dist/cssm/components/ConfigProvider/ConfigProviderContext.js +3 -0
  191. package/dist/cssm/components/ConfigProvider/ConfigProviderContext.js.map +1 -1
  192. package/dist/cssm/components/ContentCard/ContentCard.css +1 -1
  193. package/dist/cssm/components/Counter/Counter.css +31 -31
  194. package/dist/cssm/components/CustomScrollView/CustomScrollView.css +1 -1
  195. package/dist/cssm/components/CustomSelect/CustomSelect.css +1 -1
  196. package/dist/cssm/components/CustomSelect/CustomSelect.d.ts +1 -1
  197. package/dist/cssm/components/CustomSelect/CustomSelect.js +473 -580
  198. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  199. package/dist/cssm/components/CustomSelectDropdown/CustomSelectDropdown.css +3 -3
  200. package/dist/cssm/components/CustomSelectDropdown/CustomSelectDropdown.js +2 -0
  201. package/dist/cssm/components/CustomSelectDropdown/CustomSelectDropdown.js.map +1 -1
  202. package/dist/cssm/components/CustomSelectOption/CustomSelectOption.css +3 -3
  203. package/dist/cssm/components/DateInput/DateInput.css +1 -1
  204. package/dist/cssm/components/DatePicker/DatePicker.css +1 -1
  205. package/dist/cssm/components/DateRangeInput/DateRangeInput.css +1 -1
  206. package/dist/cssm/components/Dropdown/Dropdown.css +1 -1
  207. package/dist/cssm/components/Dropdown/Dropdown.d.ts +46 -5
  208. package/dist/cssm/components/Dropdown/Dropdown.js +137 -27
  209. package/dist/cssm/components/Dropdown/Dropdown.js.map +1 -1
  210. package/dist/cssm/components/Epic/Epic.css +1 -1
  211. package/dist/cssm/components/Epic/Epic.js +1 -4
  212. package/dist/cssm/components/Epic/Epic.js.map +1 -1
  213. package/dist/cssm/components/FixedLayout/FixedLayout.css +1 -1
  214. package/dist/cssm/components/FocusTrap/FocusTrap.d.ts +1 -1
  215. package/dist/cssm/components/FocusTrap/FocusTrap.js +9 -9
  216. package/dist/cssm/components/FocusTrap/FocusTrap.js.map +1 -1
  217. package/dist/cssm/components/FocusVisible/FocusVisible.css +1 -1
  218. package/dist/cssm/components/Footer/Footer.css +1 -1
  219. package/dist/cssm/components/FormField/FormField.css +9 -9
  220. package/dist/cssm/components/FormItem/FormItem.css +1 -1
  221. package/dist/cssm/components/FormLayout/FormLayout.css +1 -1
  222. package/dist/cssm/components/FormLayoutGroup/FormLayoutGroup.css +1 -1
  223. package/dist/cssm/components/FormStatus/FormStatus.css +1 -1
  224. package/dist/cssm/components/Gradient/Gradient.css +1 -1
  225. package/dist/cssm/components/GridAvatar/GridAvatar.css +1 -1
  226. package/dist/cssm/components/Group/Group.css +1 -1
  227. package/dist/cssm/components/Header/Header.css +1 -1
  228. package/dist/cssm/components/HorizontalCell/HorizontalCell.css +1 -1
  229. package/dist/cssm/components/HorizontalCell/HorizontalCell.js +3 -5
  230. package/dist/cssm/components/HorizontalCell/HorizontalCell.js.map +1 -1
  231. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.css +1 -1
  232. package/dist/cssm/components/HorizontalScroll/HorizontalScrollArrow.css +3 -3
  233. package/dist/cssm/components/HorizontalScroll/HorizontalScrollArrow.js +2 -2
  234. package/dist/cssm/components/HorizontalScroll/HorizontalScrollArrow.js.map +1 -1
  235. package/dist/cssm/components/IconButton/IconButton.css +1 -1
  236. package/dist/cssm/components/InfoRow/InfoRow.css +1 -1
  237. package/dist/cssm/components/InitialsAvatar/InitialsAvatar.css +1 -1
  238. package/dist/cssm/components/Input/Input.css +1 -1
  239. package/dist/cssm/components/InputLike/InputLike.css +1 -1
  240. package/dist/cssm/components/InputLike/InputLikeDivider.css +1 -1
  241. package/dist/cssm/components/Link/Link.css +1 -1
  242. package/dist/cssm/components/MiniInfoCell/MiniInfoCell.css +1 -1
  243. package/dist/cssm/components/MiniInfoCell/MiniInfoCell.js +2 -2
  244. package/dist/cssm/components/MiniInfoCell/MiniInfoCell.js.map +1 -1
  245. package/dist/cssm/components/ModalCard/ModalCard.css +1 -1
  246. package/dist/cssm/components/ModalCardBase/ModalCardBase.css +3 -3
  247. package/dist/cssm/components/ModalDismissButton/ModalDismissButton.css +1 -1
  248. package/dist/cssm/components/ModalPage/ModalPage.css +1 -1
  249. package/dist/cssm/components/ModalPageHeader/ModalPageHeader.css +1 -1
  250. package/dist/cssm/components/ModalRoot/ModalRoot.css +1 -1
  251. package/dist/cssm/components/ModalRoot/ModalRoot.d.ts +1 -1
  252. package/dist/cssm/components/ModalRoot/ModalRootDesktop.d.ts +1 -1
  253. package/dist/cssm/components/Pagination/Pagination.css +1 -1
  254. package/dist/cssm/components/Panel/Panel.css +1 -1
  255. package/dist/cssm/components/PanelHeader/PanelHeader.css +1 -1
  256. package/dist/cssm/components/PanelHeaderButton/PanelHeaderButton.css +1 -1
  257. package/dist/cssm/components/PanelHeaderContent/PanelHeaderContent.css +1 -1
  258. package/dist/cssm/components/PanelHeaderContext/PanelHeaderContext.css +1 -1
  259. package/dist/cssm/components/Placeholder/Placeholder.css +3 -3
  260. package/dist/cssm/components/PopoutRoot/PopoutRoot.css +1 -1
  261. package/dist/cssm/components/PopoutWrapper/PopoutWrapper.css +1 -1
  262. package/dist/cssm/components/Popper/Popper.css +1 -1
  263. package/dist/cssm/components/Popper/Popper.d.ts +18 -1
  264. package/dist/cssm/components/Popper/Popper.js +62 -68
  265. package/dist/cssm/components/Popper/Popper.js.map +1 -1
  266. package/dist/cssm/components/PopperArrow/PopperArrow.css +1 -0
  267. package/dist/cssm/components/PopperArrow/PopperArrow.d.ts +8 -0
  268. package/dist/cssm/components/PopperArrow/PopperArrow.js +28 -0
  269. package/dist/cssm/components/PopperArrow/PopperArrow.js.map +1 -0
  270. package/dist/cssm/components/Progress/Progress.css +1 -1
  271. package/dist/cssm/components/PromoBanner/PromoBanner.css +1 -1
  272. package/dist/cssm/components/PullToRefresh/PullToRefresh.css +3 -3
  273. package/dist/cssm/components/Radio/Radio.css +1 -1
  274. package/dist/cssm/components/RadioGroup/RadioGroup.css +1 -1
  275. package/dist/cssm/components/Removable/Removable.css +1 -1
  276. package/dist/cssm/components/RichCell/RichCell.css +3 -3
  277. package/dist/cssm/components/RichTooltip/RichTooltip.css +3 -1
  278. package/dist/cssm/components/RichTooltip/RichTooltip.d.ts +7 -2
  279. package/dist/cssm/components/RichTooltip/RichTooltip.js +5 -10
  280. package/dist/cssm/components/RichTooltip/RichTooltip.js.map +1 -1
  281. package/dist/cssm/components/Root/Root.css +1 -1
  282. package/dist/cssm/components/ScreenSpinner/ScreenSpinner.css +1 -1
  283. package/dist/cssm/components/Search/Search.css +1 -1
  284. package/dist/cssm/components/SegmentedControl/SegmentedControl.css +1 -1
  285. package/dist/cssm/components/SegmentedControl/SegmentedControlOption/SegmentedControlOption.css +1 -1
  286. package/dist/cssm/components/Select/Select.css +1 -1
  287. package/dist/cssm/components/Separator/Separator.css +1 -1
  288. package/dist/cssm/components/SimpleCell/SimpleCell.css +1 -1
  289. package/dist/cssm/components/SimpleCell/SimpleCell.js +18 -28
  290. package/dist/cssm/components/SimpleCell/SimpleCell.js.map +1 -1
  291. package/dist/cssm/components/SimpleCheckbox/SimpleCheckbox.css +1 -1
  292. package/dist/cssm/components/Slider/Slider.css +3 -3
  293. package/dist/cssm/components/SliderSwitch/SliderSwitch.css +1 -1
  294. package/dist/cssm/components/Snackbar/Snackbar.css +1 -1
  295. package/dist/cssm/components/Snackbar/Snackbar.d.ts +5 -1
  296. package/dist/cssm/components/Snackbar/Snackbar.js +8 -11
  297. package/dist/cssm/components/Snackbar/Snackbar.js.map +1 -1
  298. package/dist/cssm/components/Spacing/Spacing.css +1 -1
  299. package/dist/cssm/components/Spinner/Spinner.css +1 -1
  300. package/dist/cssm/components/SplitCol/SplitCol.css +1 -1
  301. package/dist/cssm/components/SplitCol/SplitCol.d.ts +1 -0
  302. package/dist/cssm/components/SplitCol/SplitCol.js +3 -0
  303. package/dist/cssm/components/SplitCol/SplitCol.js.map +1 -1
  304. package/dist/cssm/components/SplitLayout/SplitLayout.css +1 -1
  305. package/dist/cssm/components/SplitLayout/SplitLayout.js +4 -7
  306. package/dist/cssm/components/SplitLayout/SplitLayout.js.map +1 -1
  307. package/dist/cssm/components/SubnavigationBar/SubnavigationBar.css +1 -1
  308. package/dist/cssm/components/SubnavigationButton/SubnavigationButton.css +1 -1
  309. package/dist/cssm/components/Switch/Switch.css +3 -3
  310. package/dist/cssm/components/Tabbar/Tabbar.css +5 -3
  311. package/dist/cssm/components/Tabbar/Tabbar.d.ts +8 -1
  312. package/dist/cssm/components/Tabbar/Tabbar.js +15 -14
  313. package/dist/cssm/components/Tabbar/Tabbar.js.map +1 -1
  314. package/dist/cssm/components/TabbarItem/TabbarItem.css +1 -1
  315. package/dist/cssm/components/TabbarItem/TabbarItem.js +7 -9
  316. package/dist/cssm/components/TabbarItem/TabbarItem.js.map +1 -1
  317. package/dist/cssm/components/Tabs/Tabs.css +1 -1
  318. package/dist/cssm/components/Tabs/Tabs.d.ts +13 -2
  319. package/dist/cssm/components/Tabs/Tabs.js +23 -5
  320. package/dist/cssm/components/Tabs/Tabs.js.map +1 -1
  321. package/dist/cssm/components/TabsItem/TabsItem.css +5 -1
  322. package/dist/cssm/components/TabsItem/TabsItem.d.ts +22 -1
  323. package/dist/cssm/components/TabsItem/TabsItem.js +40 -21
  324. package/dist/cssm/components/TabsItem/TabsItem.js.map +1 -1
  325. package/dist/cssm/components/Tappable/Tappable.css +5 -5
  326. package/dist/cssm/components/TextTooltip/TextTooltip.css +1 -1
  327. package/dist/cssm/components/TextTooltip/TextTooltip.d.ts +5 -1
  328. package/dist/cssm/components/TextTooltip/TextTooltip.js +5 -7
  329. package/dist/cssm/components/TextTooltip/TextTooltip.js.map +1 -1
  330. package/dist/cssm/components/Textarea/Textarea.css +1 -1
  331. package/dist/cssm/components/Tooltip/Tooltip.css +1 -1
  332. package/dist/cssm/components/Tooltip/Tooltip.d.ts +18 -1
  333. package/dist/cssm/components/Tooltip/Tooltip.js +89 -68
  334. package/dist/cssm/components/Tooltip/Tooltip.js.map +1 -1
  335. package/dist/cssm/components/Typography/Caption/Caption.css +1 -1
  336. package/dist/cssm/components/Typography/Footnote/Footnote.css +1 -1
  337. package/dist/cssm/components/Typography/Headline/Headline.css +1 -1
  338. package/dist/cssm/components/Typography/Headline/Headline.d.ts +3 -3
  339. package/dist/cssm/components/Typography/Headline/Headline.js +10 -2
  340. package/dist/cssm/components/Typography/Headline/Headline.js.map +1 -1
  341. package/dist/cssm/components/Typography/Paragraph/Paragraph.css +1 -1
  342. package/dist/cssm/components/Typography/Subhead/Subhead.css +1 -1
  343. package/dist/cssm/components/Typography/Text/Text.css +1 -1
  344. package/dist/cssm/components/Typography/Title/Title.css +1 -1
  345. package/dist/cssm/components/UsersStack/UsersStack.css +5 -5
  346. package/dist/cssm/components/View/View.css +1 -1
  347. package/dist/cssm/components/View/View.d.ts +2 -18
  348. package/dist/cssm/components/View/View.js +384 -462
  349. package/dist/cssm/components/View/View.js.map +1 -1
  350. package/dist/cssm/components/View/ViewIOS.css +1 -1
  351. package/dist/cssm/components/View/ViewInfinite.d.ts +1 -1
  352. package/dist/cssm/components/VisuallyHiddenInput/VisuallyHiddenInput.css +1 -1
  353. package/dist/cssm/components/WriteBar/WriteBar.css +3 -1
  354. package/dist/cssm/components/WriteBar/WriteBar.d.ts +5 -1
  355. package/dist/cssm/components/WriteBar/WriteBar.js +10 -5
  356. package/dist/cssm/components/WriteBar/WriteBar.js.map +1 -1
  357. package/dist/cssm/components/WriteBarIcon/WriteBarIcon.css +1 -1
  358. package/dist/cssm/components/WriteBarIcon/WriteBarIcon.js +3 -6
  359. package/dist/cssm/components/WriteBarIcon/WriteBarIcon.js.map +1 -1
  360. package/dist/cssm/fonts/fonts.css +1 -1
  361. package/dist/cssm/hooks/useOrientationChange.js +2 -1
  362. package/dist/cssm/hooks/useOrientationChange.js.map +1 -1
  363. package/dist/cssm/lib/calendar.d.ts +2 -2
  364. package/dist/cssm/styles/animations.css +1 -1
  365. package/dist/cssm/styles/bright_light.css +1 -1
  366. package/dist/cssm/styles/common.css +1 -1
  367. package/dist/cssm/styles/components.css +143 -127
  368. package/dist/cssm/styles/constants.css +3 -10
  369. package/dist/cssm/styles/space_gray.css +1 -1
  370. package/dist/cssm/styles/themes.css +1 -16
  371. package/dist/cssm/styles/unstable.css +3 -1
  372. package/dist/cssm/styles/vkcom_dark.css +1 -6
  373. package/dist/cssm/styles/vkcom_light.css +1 -11
  374. package/dist/cssm/tokenized/index.d.ts +26 -0
  375. package/dist/cssm/tokenized/index.js +13 -0
  376. package/dist/cssm/tokenized/index.js.map +1 -1
  377. package/dist/default_scheme.css +1 -1
  378. package/dist/default_scheme.css.map +1 -1
  379. package/dist/fonts.css +1 -1
  380. package/dist/fonts.css.map +1 -1
  381. package/dist/hooks/useOrientationChange.js +2 -1
  382. package/dist/hooks/useOrientationChange.js.map +1 -1
  383. package/dist/lib/calendar.d.ts +2 -2
  384. package/dist/tokenized/index.d.ts +26 -0
  385. package/dist/tokenized/index.js +13 -0
  386. package/dist/tokenized/index.js.map +1 -1
  387. package/dist/unstable.css +3 -1
  388. package/dist/unstable.css.map +1 -1
  389. package/dist/vkui.css +144 -143
  390. package/dist/vkui.css.map +1 -1
  391. package/package.json +6 -5
  392. package/src/components/Badge/Badge.css +0 -5
  393. package/src/components/CardScroll/CardScroll.tsx +1 -1
  394. package/src/components/Cell/Cell.css +3 -2
  395. package/src/components/ChipsInput/ChipsInput.css +2 -0
  396. package/src/components/ConfigProvider/ConfigProviderContext.tsx +2 -0
  397. package/src/components/Counter/Counter.css +30 -0
  398. package/src/components/CustomScrollView/CustomScrollView.css +10 -5
  399. package/src/components/CustomSelect/CustomSelect.tsx +543 -574
  400. package/src/components/CustomSelectDropdown/CustomSelectDropdown.tsx +2 -0
  401. package/src/components/Dropdown/Dropdown.css +12 -0
  402. package/src/components/Dropdown/Dropdown.tsx +174 -20
  403. package/src/components/Dropdown/Readme.md +1 -0
  404. package/src/components/Epic/Epic.tsx +1 -4
  405. package/src/components/FixedLayout/Readme.md +103 -109
  406. package/src/components/FocusTrap/FocusTrap.tsx +10 -10
  407. package/src/components/Group/Group.css +1 -1
  408. package/src/components/HorizontalCell/HorizontalCell.css +25 -43
  409. package/src/components/HorizontalCell/HorizontalCell.tsx +3 -9
  410. package/src/components/HorizontalScroll/HorizontalScroll.css +23 -0
  411. package/src/components/HorizontalScroll/HorizontalScrollArrow.tsx +2 -2
  412. package/src/components/Input/Input.css +2 -0
  413. package/src/components/MiniInfoCell/MiniInfoCell.css +13 -3
  414. package/src/components/MiniInfoCell/MiniInfoCell.tsx +3 -3
  415. package/src/components/Popper/Popper.css +0 -35
  416. package/src/components/Popper/Popper.tsx +66 -54
  417. package/src/components/PopperArrow/PopperArrow.css +34 -0
  418. package/src/components/PopperArrow/PopperArrow.tsx +40 -0
  419. package/src/components/RichTooltip/RichTooltip.css +44 -4
  420. package/src/components/RichTooltip/RichTooltip.tsx +9 -11
  421. package/src/components/SimpleCell/Readme.md +115 -129
  422. package/src/components/SimpleCell/SimpleCell.css +30 -68
  423. package/src/components/SimpleCell/SimpleCell.tsx +21 -25
  424. package/src/components/Snackbar/Readme.md +95 -123
  425. package/src/components/Snackbar/Snackbar.css +18 -27
  426. package/src/components/Snackbar/Snackbar.tsx +17 -11
  427. package/src/components/SplitCol/SplitCol.tsx +2 -0
  428. package/src/components/SplitLayout/SplitLayout.css +3 -7
  429. package/src/components/SplitLayout/SplitLayout.tsx +9 -6
  430. package/src/components/Tabbar/Tabbar.css +4 -1
  431. package/src/components/Tabbar/Tabbar.tsx +23 -12
  432. package/src/components/TabbarItem/TabbarItem.css +7 -5
  433. package/src/components/TabbarItem/TabbarItem.tsx +13 -7
  434. package/src/components/Tabs/Readme.md +191 -251
  435. package/src/components/Tabs/Tabs.css +27 -80
  436. package/src/components/Tabs/Tabs.tsx +45 -7
  437. package/src/components/TabsItem/Readme.md +1 -0
  438. package/src/components/TabsItem/TabsItem.css +191 -106
  439. package/src/components/TabsItem/TabsItem.tsx +72 -20
  440. package/src/components/TextTooltip/TextTooltip.css +41 -11
  441. package/src/components/TextTooltip/TextTooltip.tsx +9 -13
  442. package/src/components/Textarea/Textarea.css +2 -0
  443. package/src/components/Tooltip/Readme.md +128 -101
  444. package/src/components/Tooltip/Tooltip.css +29 -40
  445. package/src/components/Tooltip/Tooltip.tsx +98 -66
  446. package/src/components/Typography/Headline/Headline.tsx +15 -1
  447. package/src/components/View/Readme.md +2 -0
  448. package/src/components/View/View.tsx +451 -514
  449. package/src/components/WriteBar/WriteBar.css +27 -33
  450. package/src/components/WriteBar/WriteBar.tsx +16 -5
  451. package/src/components/WriteBarIcon/WriteBarIcon.css +6 -19
  452. package/src/components/WriteBarIcon/WriteBarIcon.tsx +6 -6
  453. package/src/hooks/useOrientationChange.ts +1 -0
  454. package/src/styles/components.css +1 -0
  455. package/src/styles/constants.css +8 -0
  456. package/src/tokenized/index.ts +39 -0
  457. package/tsconfig.json +1 -1
  458. package/.cache/ts/src/components/ClickPopper/ClickPopper.d.ts +0 -21
  459. package/dist/cjs/components/ClickPopper/ClickPopper.js +0 -96
  460. package/dist/cjs/components/ClickPopper/ClickPopper.js.map +0 -1
  461. package/dist/components/ClickPopper/ClickPopper.d.ts +0 -21
  462. package/dist/components/ClickPopper/ClickPopper.js +0 -71
  463. package/dist/components/ClickPopper/ClickPopper.js.map +0 -1
  464. package/dist/cssm/components/ClickPopper/ClickPopper.d.ts +0 -21
  465. package/dist/cssm/components/ClickPopper/ClickPopper.js +0 -71
  466. package/dist/cssm/components/ClickPopper/ClickPopper.js.map +0 -1
  467. package/src/components/ClickPopper/ClickPopper.tsx +0 -86
@@ -9,23 +9,13 @@ Object.defineProperty(exports, "__esModule", {
9
9
  });
10
10
  exports.CustomSelect = void 0;
11
11
 
12
- var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
-
14
- var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
15
-
16
12
  var _jsxRuntime = require("../../lib/jsxRuntime");
17
13
 
18
- var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
19
-
20
- var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
21
-
22
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
23
-
24
- var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
14
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
25
15
 
26
- var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
16
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
27
17
 
28
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
18
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
29
19
 
30
20
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
31
21
 
@@ -39,12 +29,8 @@ var _classNames = require("../../lib/classNames");
39
29
 
40
30
  var _withAdaptivity = require("../../hoc/withAdaptivity");
41
31
 
42
- var _withPlatform = require("../../hoc/withPlatform");
43
-
44
32
  var _CustomSelectOption = require("../CustomSelectOption/CustomSelectOption");
45
33
 
46
- var _getClassName = require("../../helpers/getClassName");
47
-
48
34
  var _Input = require("../Input/Input");
49
35
 
50
36
  var _DropdownIcon = require("../DropdownIcon/DropdownIcon");
@@ -55,14 +41,14 @@ var _warnOnce = require("../../lib/warnOnce");
55
41
 
56
42
  var _select = require("../../lib/select");
57
43
 
58
- var _is = require("../../lib/is");
59
-
60
44
  var _CustomSelectDropdown = require("../CustomSelectDropdown/CustomSelectDropdown");
61
45
 
62
46
  var _Select = require("../Select/Select");
63
47
 
64
- var _excluded = ["before", "searchable", "name", "className", "getRef", "getRootRef", "popupDirection", "options", "sizeY", "platform", "style", "onChange", "onBlur", "onFocus", "onClick", "renderOption", "children", "emptyText", "onInputChange", "filterFn", "renderDropdown", "onOpen", "onClose", "fetching", "icon", "dropdownOffsetDistance", "fixDropdownWidth", "forceDropdownPortal", "selectType", "autoHideScrollbar", "autoHideScrollbarDelay"],
65
- _excluded2 = ["option"];
48
+ var _useIsomorphicLayoutEffect = require("../../lib/useIsomorphicLayoutEffect");
49
+
50
+ var _excluded = ["option"],
51
+ _excluded2 = ["before", "name", "className", "getRef", "getRootRef", "popupDirection", "sizeY", "platform", "style", "onChange", "children", "onInputChange", "renderDropdown", "onOpen", "onClose", "fetching", "forceDropdownPortal", "selectType", "autoHideScrollbar", "autoHideScrollbarDelay", "searchable", "renderOption", "options", "emptyText", "filterFn", "icon", "dropdownOffsetDistance", "fixDropdownWidth"];
66
52
 
67
53
  var findIndexAfter = function findIndexAfter() {
68
54
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
@@ -108,593 +94,530 @@ var checkOptionsValueType = function checkOptionsValueType(options) {
108
94
  }
109
95
  };
110
96
 
111
- var CustomSelectComponent = /*#__PURE__*/function (_React$Component) {
112
- (0, _inherits2.default)(CustomSelectComponent, _React$Component);
113
-
114
- var _super = (0, _createSuper2.default)(CustomSelectComponent);
97
+ function defaultRenderOptionFn(_ref) {
98
+ var option = _ref.option,
99
+ props = (0, _objectWithoutProperties2.default)(_ref, _excluded);
100
+ return (0, _jsxRuntime.createScopedElement)(_CustomSelectOption.CustomSelectOption, props);
101
+ }
115
102
 
116
- function CustomSelectComponent(props) {
117
- var _this;
118
-
119
- (0, _classCallCheck2.default)(this, CustomSelectComponent);
120
- _this = _super.call(this, props);
121
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "keyboardInput", void 0);
122
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "isControlledOutside", false);
123
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "selectEl", null);
124
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "scrollBoxRef", /*#__PURE__*/React.createRef());
125
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "containerRef", /*#__PURE__*/React.createRef());
126
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "resetKeyboardInput", function () {
127
- _this.keyboardInput = "";
128
- });
129
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getSelectedItem", function () {
130
- var _this$state = _this.state,
131
- selectedOptionIndex = _this$state.selectedOptionIndex,
132
- options = _this$state.options;
103
+ var handleOptionDown = function handleOptionDown(e) {
104
+ e.preventDefault();
105
+ };
133
106
 
134
- if (!(options !== null && options !== void 0 && options.length)) {
135
- return null;
136
- }
107
+ function findSelectedIndex(options, value) {
108
+ var _options$findIndex;
137
109
 
138
- return selectedOptionIndex !== undefined ? options[selectedOptionIndex] : undefined;
139
- });
140
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "filter", function (options, inputValue, filterFn) {
141
- return typeof filterFn === "function" ? options.filter(function (option) {
142
- return filterFn(inputValue, option);
143
- }) : options;
144
- });
145
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "open", function () {
146
- _this.setState(function (_ref) {
147
- var selectedOptionIndex = _ref.selectedOptionIndex;
148
- return {
149
- opened: true,
150
- focusedOptionIndex: selectedOptionIndex
151
- };
152
- }, function () {
153
- var selectedOptionIndex = _this.state.selectedOptionIndex;
154
-
155
- if (selectedOptionIndex !== undefined && _this.isValidIndex(selectedOptionIndex)) {
156
- _this.scrollToElement(selectedOptionIndex, true);
157
- }
158
- });
110
+ return (_options$findIndex = options.findIndex(function (item) {
111
+ value = typeof item.value === "number" ? Number(value) : value;
112
+ return item.value === value;
113
+ })) !== null && _options$findIndex !== void 0 ? _options$findIndex : -1;
114
+ }
159
115
 
160
- typeof _this.props.onOpen === "function" && _this.props.onOpen();
161
- });
162
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "close", function () {
163
- _this.resetKeyboardInput();
164
-
165
- _this.setState(function () {
166
- return {
167
- inputValue: "",
168
- opened: false,
169
- focusedOptionIndex: -1,
170
- options: _this.props.options
171
- };
172
- });
116
+ var filter = function filter(options, inputValue, filterFn) {
117
+ return typeof filterFn === "function" ? options.filter(function (option) {
118
+ return filterFn(inputValue, option);
119
+ }) : options;
120
+ };
173
121
 
174
- typeof _this.props.onClose === "function" && _this.props.onClose();
175
- });
176
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "selectFocused", function () {
177
- var focusedOptionIndex = _this.state.focusedOptionIndex;
122
+ var defaultOptions = [];
123
+ var defaultIcon = (0, _jsxRuntime.createScopedElement)(_DropdownIcon.DropdownIcon, null);
124
+
125
+ function CustomSelectComponent(props) {
126
+ var _props$value, _props$value2;
127
+
128
+ var before = props.before,
129
+ name = props.name,
130
+ className = props.className,
131
+ getRef = props.getRef,
132
+ getRootRef = props.getRootRef,
133
+ popupDirection = props.popupDirection,
134
+ sizeY = props.sizeY,
135
+ platform = props.platform,
136
+ style = props.style,
137
+ onChange = props.onChange,
138
+ children = props.children,
139
+ onInputChangeProp = props.onInputChange,
140
+ renderDropdown = props.renderDropdown,
141
+ onOpen = props.onOpen,
142
+ onClose = props.onClose,
143
+ fetching = props.fetching,
144
+ forceDropdownPortal = props.forceDropdownPortal,
145
+ _props$selectType = props.selectType,
146
+ selectType = _props$selectType === void 0 ? _Select.SelectType.default : _props$selectType,
147
+ autoHideScrollbar = props.autoHideScrollbar,
148
+ autoHideScrollbarDelay = props.autoHideScrollbarDelay,
149
+ _props$searchable = props.searchable,
150
+ searchable = _props$searchable === void 0 ? false : _props$searchable,
151
+ _props$renderOption = props.renderOption,
152
+ renderOptionProp = _props$renderOption === void 0 ? defaultRenderOptionFn : _props$renderOption,
153
+ _props$options = props.options,
154
+ optionsProp = _props$options === void 0 ? defaultOptions : _props$options,
155
+ _props$emptyText = props.emptyText,
156
+ emptyText = _props$emptyText === void 0 ? "Ничего не найдено" : _props$emptyText,
157
+ _props$filterFn = props.filterFn,
158
+ filterFn = _props$filterFn === void 0 ? _select.defaultFilterFn : _props$filterFn,
159
+ _props$icon = props.icon,
160
+ icon = _props$icon === void 0 ? defaultIcon : _props$icon,
161
+ _props$dropdownOffset = props.dropdownOffsetDistance,
162
+ dropdownOffsetDistance = _props$dropdownOffset === void 0 ? 0 : _props$dropdownOffset,
163
+ _props$fixDropdownWid = props.fixDropdownWidth,
164
+ fixDropdownWidth = _props$fixDropdownWid === void 0 ? true : _props$fixDropdownWid,
165
+ restProps = (0, _objectWithoutProperties2.default)(props, _excluded2);
166
+
167
+ if (process.env.NODE_ENV === "development") {
168
+ checkOptionsValueType(optionsProp);
169
+ }
178
170
 
179
- if (focusedOptionIndex !== undefined) {
180
- _this.select(focusedOptionIndex);
181
- }
171
+ var containerRef = React.useRef(null);
172
+ var scrollBoxRef = React.useRef(null);
173
+ var selectElRef = React.useRef(null);
174
+
175
+ var _React$useState = React.useState(-1),
176
+ _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
177
+ focusedOptionIndex = _React$useState2[0],
178
+ setFocusedOptionIndex = _React$useState2[1];
179
+
180
+ var _React$useState3 = React.useState(props.value !== undefined),
181
+ _React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2),
182
+ isControlledOutside = _React$useState4[0],
183
+ setIsControlledOutside = _React$useState4[1];
184
+
185
+ var _React$useState5 = React.useState(""),
186
+ _React$useState6 = (0, _slicedToArray2.default)(_React$useState5, 2),
187
+ inputValue = _React$useState6[0],
188
+ setInputValue = _React$useState6[1];
189
+
190
+ var _React$useState7 = React.useState((_props$value = props.value) !== null && _props$value !== void 0 ? _props$value : props.defaultValue),
191
+ _React$useState8 = (0, _slicedToArray2.default)(_React$useState7, 2),
192
+ nativeSelectValue = _React$useState8[0],
193
+ setNativeSelectValue = _React$useState8[1];
194
+
195
+ var _React$useState9 = React.useState(""),
196
+ _React$useState10 = (0, _slicedToArray2.default)(_React$useState9, 2),
197
+ keyboardInput = _React$useState10[0],
198
+ setKeyboardInput = _React$useState10[1];
199
+
200
+ var _React$useState11 = React.useState(undefined),
201
+ _React$useState12 = (0, _slicedToArray2.default)(_React$useState11, 2),
202
+ popperPlacement = _React$useState12[0],
203
+ setPopperPlacement = _React$useState12[1];
204
+
205
+ var _React$useState13 = React.useState(optionsProp),
206
+ _React$useState14 = (0, _slicedToArray2.default)(_React$useState13, 2),
207
+ options = _React$useState14[0],
208
+ setOptions = _React$useState14[1];
209
+
210
+ var _React$useState15 = React.useState(findSelectedIndex(optionsProp, (_props$value2 = props.value) !== null && _props$value2 !== void 0 ? _props$value2 : props.defaultValue)),
211
+ _React$useState16 = (0, _slicedToArray2.default)(_React$useState15, 2),
212
+ selectedOptionIndex = _React$useState16[0],
213
+ setSelectedOptionIndex = _React$useState16[1];
214
+
215
+ var _React$useState17 = React.useState(false),
216
+ _React$useState18 = (0, _slicedToArray2.default)(_React$useState17, 2),
217
+ opened = _React$useState18[0],
218
+ setOpened = _React$useState18[1];
219
+
220
+ React.useEffect(function () {
221
+ setIsControlledOutside(props.value !== undefined);
222
+ setNativeSelectValue(function (nativeSelectValue) {
223
+ var _props$value3;
224
+
225
+ return (_props$value3 = props.value) !== null && _props$value3 !== void 0 ? _props$value3 : nativeSelectValue;
182
226
  });
183
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "select", function (index) {
184
- var _this$state$options;
185
-
186
- if (!_this.isValidIndex(index)) {
187
- return;
188
- }
189
-
190
- var item = (_this$state$options = _this.state.options) === null || _this$state$options === void 0 ? void 0 : _this$state$options[index];
227
+ }, [props.value]);
228
+ (0, _useIsomorphicLayoutEffect.useIsomorphicLayoutEffect)(function () {
229
+ if (nativeSelectValue !== undefined) {
230
+ var _selectElRef$current;
191
231
 
192
- _this.setState({
193
- nativeSelectValue: item === null || item === void 0 ? void 0 : item.value
194
- }, function () {
195
- var _this$selectEl;
196
-
197
- var event = new Event("change", {
198
- bubbles: true
199
- });
200
- (_this$selectEl = _this.selectEl) === null || _this$selectEl === void 0 ? void 0 : _this$selectEl.dispatchEvent(event);
232
+ var _event = new Event("change", {
233
+ bubbles: true
201
234
  });
202
235
 
203
- _this.close();
204
- });
205
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onClick", function () {
206
- _this.state.opened ? _this.close() : _this.open();
207
- });
208
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onFocus", function () {
209
- var _this$selectEl2;
236
+ (_selectElRef$current = selectElRef.current) === null || _selectElRef$current === void 0 ? void 0 : _selectElRef$current.dispatchEvent(_event);
237
+ }
238
+ }, [nativeSelectValue]);
239
+ var selected = React.useMemo(function () {
240
+ if (!options.length) {
241
+ return null;
242
+ }
210
243
 
211
- var event = new Event("focus");
212
- (_this$selectEl2 = _this.selectEl) === null || _this$selectEl2 === void 0 ? void 0 : _this$selectEl2.dispatchEvent(event);
213
- });
214
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onBlur", function () {
215
- var _this$selectEl3;
244
+ return selectedOptionIndex !== undefined ? options[selectedOptionIndex] : undefined;
245
+ }, [options, selectedOptionIndex]);
246
+ var openedClassNames = React.useMemo(function () {
247
+ return (0, _classNames.classNames)(opened && "Select--open", opened && dropdownOffsetDistance === 0 && (popperPlacement !== null && popperPlacement !== void 0 && popperPlacement.includes("top") ? "Select--pop-up" : "Select--pop-down"));
248
+ }, [dropdownOffsetDistance, opened, popperPlacement]);
249
+ var resetKeyboardInput = React.useCallback(function () {
250
+ setKeyboardInput("");
251
+ }, []);
252
+ var scrollToElement = React.useCallback(function (index) {
253
+ var center = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
254
+ var dropdown = scrollBoxRef.current;
255
+ var item = dropdown ? dropdown.children[index] : null;
256
+
257
+ if (!item || !dropdown) {
258
+ return;
259
+ }
216
260
 
217
- _this.close();
261
+ var dropdownHeight = dropdown.offsetHeight;
262
+ var scrollTop = dropdown.scrollTop;
263
+ var itemTop = item.offsetTop;
264
+ var itemHeight = item.offsetHeight;
265
+
266
+ if (center) {
267
+ dropdown.scrollTop = itemTop - dropdownHeight / 2 + itemHeight / 2;
268
+ } else if (itemTop + itemHeight > dropdownHeight + scrollTop) {
269
+ dropdown.scrollTop = itemTop - dropdownHeight + itemHeight;
270
+ } else if (itemTop < scrollTop) {
271
+ dropdown.scrollTop = itemTop;
272
+ }
273
+ }, []);
274
+ var isValidIndex = React.useCallback(function (index) {
275
+ var _options$length;
218
276
 
219
- var event = new Event("blur");
220
- (_this$selectEl3 = _this.selectEl) === null || _this$selectEl3 === void 0 ? void 0 : _this$selectEl3.dispatchEvent(event);
221
- });
222
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "focusOptionByIndex", function (index) {
223
- var _this$state$options$l, _this$state$options2, _this$state$options3;
277
+ return index >= 0 && index < ((_options$length = options.length) !== null && _options$length !== void 0 ? _options$length : 0);
278
+ }, [options.length]);
279
+ var focusOptionByIndex = React.useCallback(function (index) {
280
+ var _options$length2;
224
281
 
225
- var scrollTo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
282
+ var scrollTo = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
226
283
 
227
- if (index === undefined || index < 0 || index > ((_this$state$options$l = (_this$state$options2 = _this.state.options) === null || _this$state$options2 === void 0 ? void 0 : _this$state$options2.length) !== null && _this$state$options$l !== void 0 ? _this$state$options$l : 0) - 1) {
228
- return;
229
- }
284
+ if (index === undefined || index < 0 || index > ((_options$length2 = options.length) !== null && _options$length2 !== void 0 ? _options$length2 : 0) - 1) {
285
+ return;
286
+ }
230
287
 
231
- var option = (_this$state$options3 = _this.state.options) === null || _this$state$options3 === void 0 ? void 0 : _this$state$options3[index];
288
+ var option = options[index];
232
289
 
233
- if (option !== null && option !== void 0 && option.disabled) {
234
- return;
235
- }
290
+ if (option !== null && option !== void 0 && option.disabled) {
291
+ return;
292
+ }
236
293
 
237
- scrollTo && _this.scrollToElement(index);
294
+ if (scrollTo) {
295
+ scrollToElement(index);
296
+ } // Это оптимизация, прежде всего, под `onMouseOver`
238
297
 
239
- _this.setState(function (prevState) {
240
- return (// Это оптимизация, прежде всего, под `onMouseOver`
241
- prevState.focusedOptionIndex !== index ? {
242
- focusedOptionIndex: index
243
- } : null
244
- );
245
- });
246
- });
247
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "focusOption", function (type) {
248
- var focusedOptionIndex = _this.state.focusedOptionIndex;
249
- var index = focusedOptionIndex;
250
-
251
- if (type === "next") {
252
- var nextIndex = findIndexAfter(_this.state.options, index);
253
- index = nextIndex === -1 ? findIndexAfter(_this.state.options) : nextIndex; // Следующий за index или первый валидный до index
254
- } else if (type === "prev") {
255
- var beforeIndex = findIndexBefore(_this.state.options, index);
256
- index = beforeIndex === -1 ? findIndexBefore(_this.state.options) : beforeIndex; // Предшествующий index или последний валидный после index
257
- }
258
298
 
259
- _this.focusOptionByIndex(index);
299
+ setFocusedOptionIndex(function (focusedOptionIndex) {
300
+ return focusedOptionIndex !== index ? index : focusedOptionIndex;
260
301
  });
261
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "handleOptionHover", function (e) {
262
- var _e$currentTarget$pare;
263
-
264
- _this.focusOptionByIndex(Array.prototype.indexOf.call((_e$currentTarget$pare = e.currentTarget.parentNode) === null || _e$currentTarget$pare === void 0 ? void 0 : _e$currentTarget$pare.children, e.currentTarget), false);
265
- });
266
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "handleOptionDown", function (e) {
267
- e.preventDefault();
302
+ }, [options, scrollToElement]);
303
+ var areOptionsShown = React.useCallback(function () {
304
+ return scrollBoxRef.current !== null;
305
+ }, []);
306
+ var onKeyboardInput = React.useCallback(function (key) {
307
+ var fullInput = keyboardInput + key;
308
+ var optionIndex = options.findIndex(function (option) {
309
+ return (0, _utils.getTitleFromChildren)(option.label).toLowerCase().includes(fullInput);
268
310
  });
269
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "handleOptionClick", function (e) {
270
- var _e$currentTarget$pare2, _this$state$options4;
271
-
272
- var index = Array.prototype.indexOf.call((_e$currentTarget$pare2 = e.currentTarget.parentNode) === null || _e$currentTarget$pare2 === void 0 ? void 0 : _e$currentTarget$pare2.children, e.currentTarget);
273
- var option = (_this$state$options4 = _this.state.options) === null || _this$state$options4 === void 0 ? void 0 : _this$state$options4[index];
274
311
 
275
- if (option && !option.disabled) {
276
- _this.selectFocused();
277
- }
278
- });
279
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "resetFocusedOption", function () {
280
- _this.setState({
281
- focusedOptionIndex: -1
282
- });
283
- });
284
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onKeyboardInput", function (key) {
285
- var _this$state$options5;
312
+ if (optionIndex !== undefined && optionIndex > -1) {
313
+ focusOptionByIndex(optionIndex);
314
+ }
286
315
 
287
- var fullInput = _this.keyboardInput + key;
288
- var optionIndex = (_this$state$options5 = _this.state.options) === null || _this$state$options5 === void 0 ? void 0 : _this$state$options5.findIndex(function (option) {
289
- return (0, _utils.getTitleFromChildren)(option.label).toLowerCase().includes(fullInput);
290
- });
316
+ setKeyboardInput(fullInput);
317
+ }, [focusOptionByIndex, keyboardInput, options]);
318
+ var close = React.useCallback(function () {
319
+ resetKeyboardInput();
320
+ setInputValue("");
321
+ setOpened(false);
322
+ setFocusedOptionIndex(-1);
323
+ setOptions(optionsProp);
324
+ onClose === null || onClose === void 0 ? void 0 : onClose();
325
+ }, [onClose, optionsProp, resetKeyboardInput]);
326
+ var selectFocused = React.useCallback(function () {
327
+ if (focusedOptionIndex !== undefined && isValidIndex(focusedOptionIndex)) {
328
+ var item = options[focusedOptionIndex];
329
+ setNativeSelectValue(item === null || item === void 0 ? void 0 : item.value);
330
+ close();
331
+ }
332
+ }, [close, focusedOptionIndex, isValidIndex, options]);
333
+ var open = React.useCallback(function () {
334
+ setOpened(true);
335
+ setFocusedOptionIndex(selectedOptionIndex);
291
336
 
292
- if (optionIndex !== undefined && optionIndex > -1) {
293
- _this.focusOptionByIndex(optionIndex);
294
- }
337
+ if (typeof onOpen === "function") {
338
+ onOpen();
339
+ }
340
+ }, [onOpen, selectedOptionIndex]);
341
+ React.useEffect(function () {
342
+ if (opened && selectedOptionIndex !== undefined && isValidIndex(selectedOptionIndex)) {
343
+ scrollToElement(selectedOptionIndex, true);
344
+ }
345
+ }, [isValidIndex, opened, scrollToElement, selectedOptionIndex]);
346
+ var onBlur = React.useCallback(function () {
347
+ var _selectElRef$current2;
348
+
349
+ close();
350
+ var event = new Event("blur");
351
+ (_selectElRef$current2 = selectElRef.current) === null || _selectElRef$current2 === void 0 ? void 0 : _selectElRef$current2.dispatchEvent(event);
352
+ }, [close]);
353
+ var resetFocusedOption = React.useCallback(function () {
354
+ setFocusedOptionIndex(-1);
355
+ }, []);
356
+ var onFocus = React.useCallback(function () {
357
+ var _selectElRef$current3;
358
+
359
+ var event = new Event("focus");
360
+ (_selectElRef$current3 = selectElRef.current) === null || _selectElRef$current3 === void 0 ? void 0 : _selectElRef$current3.dispatchEvent(event);
361
+ }, []);
362
+ var onClick = React.useCallback(function () {
363
+ if (opened) {
364
+ close();
365
+ } else {
366
+ open();
367
+ }
368
+ }, [close, open, opened]);
369
+ var handleKeyUp = React.useMemo(function () {
370
+ return (0, _utils.debounce)(resetKeyboardInput, 1000);
371
+ }, [resetKeyboardInput]);
372
+ var focusOption = React.useCallback(function (type) {
373
+ var index = focusedOptionIndex;
374
+
375
+ if (type === "next") {
376
+ var nextIndex = findIndexAfter(options, index);
377
+ index = nextIndex === -1 ? findIndexAfter(options) : nextIndex; // Следующий за index или первый валидный до index
378
+ } else if (type === "prev") {
379
+ var beforeIndex = findIndexBefore(options, index);
380
+ index = beforeIndex === -1 ? findIndexBefore(options) : beforeIndex; // Предшествующий index или последний валидный после index
381
+ }
295
382
 
296
- _this.keyboardInput = fullInput;
297
- });
298
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onLabelClick", function (e) {
299
- var _this$scrollBoxRef$cu;
383
+ focusOptionByIndex(index);
384
+ }, [focusOptionByIndex, focusedOptionIndex, options]);
385
+ React.useEffect(function () {
386
+ var _ref2, _props$value4;
387
+
388
+ var value = (_ref2 = (_props$value4 = props.value) !== null && _props$value4 !== void 0 ? _props$value4 : nativeSelectValue) !== null && _ref2 !== void 0 ? _ref2 : props.defaultValue;
389
+ var options = searchable && inputValue !== undefined ? filter(optionsProp, inputValue, filterFn) : optionsProp;
390
+ setOptions(options);
391
+ setSelectedOptionIndex(findSelectedIndex(options, value));
392
+ }, [filterFn, inputValue, nativeSelectValue, optionsProp, props.defaultValue, props.value, searchable]);
393
+ /**
394
+ * Нужен для правильного поведения обработчика onClick на select. Фильтрует клики, которые были сделаны по
395
+ * выпадающему списку.
396
+ */
397
+
398
+ var onLabelClick = React.useCallback(function (e) {
399
+ var _scrollBoxRef$current;
400
+
401
+ if ((_scrollBoxRef$current = scrollBoxRef.current) !== null && _scrollBoxRef$current !== void 0 && _scrollBoxRef$current.contains(e.target)) {
402
+ e.preventDefault();
403
+ }
404
+ }, []);
405
+ var onNativeSelectChange = React.useCallback(function (e) {
406
+ var newSelectedOptionIndex = findSelectedIndex(options, e.currentTarget.value);
300
407
 
301
- if ((_this$scrollBoxRef$cu = _this.scrollBoxRef.current) !== null && _this$scrollBoxRef$cu !== void 0 && _this$scrollBoxRef$cu.contains(e.target)) {
302
- e.preventDefault();
408
+ if (selectedOptionIndex !== newSelectedOptionIndex) {
409
+ if (!isControlledOutside) {
410
+ setSelectedOptionIndex(newSelectedOptionIndex);
303
411
  }
304
- });
305
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onNativeSelectChange", function (e) {
306
- var newSelectedOptionIndex = _this.findSelectedIndex(_this.state.options, e.currentTarget.value);
307
412
 
308
- if (_this.state.selectedOptionIndex !== newSelectedOptionIndex) {
309
- var _this$props$onChange, _this$props;
413
+ onChange === null || onChange === void 0 ? void 0 : onChange(e);
414
+ }
415
+ }, [isControlledOutside, onChange, options, selectedOptionIndex]);
416
+ var onInputKeyDown = React.useCallback(function (event) {
417
+ ["ArrowUp", "ArrowDown", "Escape", "Enter"].includes(event.key) && areOptionsShown() && event.preventDefault();
418
+
419
+ switch (event.key) {
420
+ case "ArrowUp":
421
+ areOptionsShown() && focusOption("prev");
422
+ break;
423
+
424
+ case "ArrowDown":
425
+ areOptionsShown() && focusOption("next");
426
+ break;
427
+
428
+ case "Escape":
429
+ close();
430
+ break;
431
+
432
+ case "Enter":
433
+ areOptionsShown() && selectFocused();
434
+ break;
435
+ }
436
+ }, [areOptionsShown, close, focusOption, selectFocused]);
437
+ var onInputChange = React.useCallback(function (e) {
438
+ if (onInputChangeProp) {
439
+ var _options = onInputChangeProp(e, optionsProp);
310
440
 
311
- if (!_this.isControlledOutside) {
312
- _this.setState({
313
- selectedOptionIndex: newSelectedOptionIndex
314
- });
441
+ if (_options) {
442
+ if (process.env.NODE_ENV === "development") {
443
+ warn("Этот метод фильтрации устарел. Возвращаемое значение onInputChange будет " + "проигнорировано в v5.0.0. Для фильтрации обновляйте props.options самостоятельно или используйте свойство filterFn.");
315
444
  }
316
445
 
317
- (_this$props$onChange = (_this$props = _this.props).onChange) === null || _this$props$onChange === void 0 ? void 0 : _this$props$onChange.call(_this$props, e);
446
+ setOptions(_options);
447
+ setSelectedOptionIndex(findSelectedIndex(_options, nativeSelectValue));
318
448
  }
319
- });
320
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onInputChange", function (e) {
321
- if (_this.props.onInputChange) {
322
- var _options = _this.props.onInputChange(e, _this.props.options);
323
-
324
- if (_options) {
325
- if (process.env.NODE_ENV === "development") {
326
- warn("Этот метод фильтрации устарел. Возвращаемое значение onInputChange будет " + "проигнорировано в v5.0.0. Для фильтрации обновляйте props.options самостоятельно или используйте свойство filterFn.");
327
- }
328
-
329
- _this.setState({
330
- options: _options,
331
- selectedOptionIndex: _this.findSelectedIndex(_options, _this.state.nativeSelectValue),
332
- inputValue: e.target.value
333
- });
334
- } else {
335
- _this.setState({
336
- inputValue: e.target.value
337
- });
338
- }
339
- } else {
340
- var _options2 = _this.filter(_this.props.options, e.target.value, _this.props.filterFn);
341
-
342
- _this.setState({
343
- options: _options2,
344
- selectedOptionIndex: _this.findSelectedIndex(_options2, _this.state.nativeSelectValue),
345
- inputValue: e.target.value
346
- });
347
- }
348
- });
349
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onInputKeyDown", function (event) {
350
- ["ArrowUp", "ArrowDown", "Escape", "Enter"].includes(event.key) && _this.areOptionsShown && event.preventDefault();
351
-
352
- switch (event.key) {
353
- case "ArrowUp":
354
- _this.areOptionsShown && _this.focusOption("prev");
355
- break;
356
-
357
- case "ArrowDown":
358
- _this.areOptionsShown && _this.focusOption("next");
359
- break;
360
-
361
- case "Escape":
362
- _this.close();
363
-
364
- break;
365
-
366
- case "Enter":
367
- _this.areOptionsShown && _this.selectFocused();
368
- break;
369
- }
370
- });
371
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "handleKeyDownSelect", function (event) {
372
- var opened = _this.state.opened;
373
-
374
- if (event.key.length === 1 && event.key !== " ") {
375
- _this.onKeyboardInput(event.key);
376
-
377
- return;
378
- }
379
-
380
- ["ArrowUp", "ArrowDown", "Escape", "Enter"].includes(event.key) && _this.areOptionsShown && event.preventDefault();
381
-
382
- switch (event.key) {
383
- case "ArrowUp":
384
- if (opened) {
385
- _this.areOptionsShown && _this.focusOption("prev");
386
- } else {
387
- _this.open();
388
- }
389
-
390
- break;
391
-
392
- case "ArrowDown":
393
- if (opened) {
394
- _this.areOptionsShown && _this.focusOption("next");
395
- } else {
396
- _this.open();
397
- }
398
-
399
- break;
400
-
401
- case "Escape":
402
- _this.close();
403
-
404
- break;
405
-
406
- case "Enter":
407
- case "Spacebar":
408
- case " ":
409
- if (opened) {
410
- _this.areOptionsShown && _this.selectFocused();
411
- } else {
412
- _this.open();
413
- }
449
+ } else {
450
+ var _options2 = filter(optionsProp, e.target.value, filterFn);
414
451
 
415
- break;
416
- }
417
- });
418
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "handleKeyUp", (0, _utils.debounce)(_this.resetKeyboardInput, 1000));
419
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "renderOption", function (option, index) {
420
- var _this$state2 = _this.state,
421
- focusedOptionIndex = _this$state2.focusedOptionIndex,
422
- selectedOptionIndex = _this$state2.selectedOptionIndex;
423
- var renderOption = _this.props.renderOption;
424
- var hovered = index === focusedOptionIndex;
425
- var selected = index === selectedOptionIndex;
426
- return (0, _jsxRuntime.createScopedElement)(React.Fragment, {
427
- key: "".concat(option.value)
428
- }, renderOption({
429
- option: option,
430
- hovered: hovered,
431
- children: option.label,
432
- selected: selected,
433
- disabled: option.disabled,
434
- onClick: _this.handleOptionClick,
435
- onMouseDown: _this.handleOptionDown,
436
- // Используем `onMouseOver` вместо `onMouseEnter`.
437
- // При параметре `searchable`, обновляется "ребёнок", из-за чего `onMouseEnter` не срабатывает в следующих кейсах:
438
- // 1. До загрузки выпадающего списка, курсор мышки находится над произвольным элементом этого списка.
439
- // > Лечение: только увод курсора мыши и возвращении его обратно вызывает событие `onMouseEnter` на этот элемент.
440
- // 2. Если это тач-устройство.
441
- // > Лечение: нужно нажать на какой-нибудь произвольный элемент списка, после чего `onMouseEnter` будет работать на соседние элементы,
442
- // но не на тот, на который нажали в первый раз.
443
- // Более подробно по ссылке https://github.com/facebook/react/issues/13956#issuecomment-1082055744
444
- onMouseOver: _this.handleOptionHover
445
- }));
446
- });
447
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "selectRef", function (element) {
448
- _this.selectEl = element;
449
-
450
- if (_this.props.getRef) {
451
- (0, _utils.setRef)(element, _this.props.getRef);
452
- }
453
- });
454
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onPlacementChange", function (placement) {
455
- _this.setState(function () {
456
- return {
457
- popperPlacement: placement
458
- };
459
- });
460
- });
461
- var value = props.value,
462
- defaultValue = props.defaultValue;
463
- var initialValue = value !== undefined ? value : defaultValue;
464
- _this.keyboardInput = "";
465
-
466
- if (process.env.NODE_ENV === "development") {
467
- checkOptionsValueType(props.options);
452
+ setOptions(_options2);
453
+ setSelectedOptionIndex(findSelectedIndex(_options2, nativeSelectValue));
468
454
  }
469
455
 
470
- _this.state = {
471
- opened: false,
472
- focusedOptionIndex: -1,
473
- selectedOptionIndex: _this.findSelectedIndex(props.options, initialValue),
474
- nativeSelectValue: initialValue,
475
- options: props.options,
476
- inputValue: ""
477
- };
478
-
479
- if (props.value !== undefined) {
480
- _this.isControlledOutside = true;
456
+ setInputValue(e.target.value);
457
+ }, [filterFn, nativeSelectValue, onInputChangeProp, optionsProp]);
458
+ var handleKeyDownSelect = React.useCallback(function (event) {
459
+ if (event.key.length === 1 && event.key !== " ") {
460
+ onKeyboardInput(event.key);
461
+ return;
481
462
  }
482
463
 
483
- return _this;
484
- }
464
+ ["ArrowUp", "ArrowDown", "Escape", "Enter"].includes(event.key) && areOptionsShown() && event.preventDefault();
485
465
 
486
- (0, _createClass2.default)(CustomSelectComponent, [{
487
- key: "areOptionsShown",
488
- get: function get() {
489
- return this.scrollBoxRef.current !== null;
490
- }
491
- }, {
492
- key: "findSelectedIndex",
493
- value: function findSelectedIndex(options, value) {
494
- var _options$findIndex;
495
-
496
- return (_options$findIndex = options === null || options === void 0 ? void 0 : options.findIndex(function (item) {
497
- value = typeof item.value === "number" ? Number(value) : value;
498
- return item.value === value;
499
- })) !== null && _options$findIndex !== void 0 ? _options$findIndex : -1;
500
- }
501
- }, {
502
- key: "isValidIndex",
503
- value: function isValidIndex(index) {
504
- var _this$state$options$l2, _this$state$options6;
466
+ switch (event.key) {
467
+ case "ArrowUp":
468
+ if (opened) {
469
+ areOptionsShown() && focusOption("prev");
470
+ } else {
471
+ open();
472
+ }
505
473
 
506
- return index >= 0 && index < ((_this$state$options$l2 = (_this$state$options6 = this.state.options) === null || _this$state$options6 === void 0 ? void 0 : _this$state$options6.length) !== null && _this$state$options$l2 !== void 0 ? _this$state$options$l2 : 0);
507
- }
508
- }, {
509
- key: "scrollToElement",
510
- value: function scrollToElement(index) {
511
- var center = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
512
- var dropdown = this.scrollBoxRef.current;
513
- var item = dropdown ? dropdown.children[index] : null;
514
-
515
- if (!item || !dropdown) {
516
- return;
517
- }
474
+ break;
518
475
 
519
- var dropdownHeight = dropdown.offsetHeight;
520
- var scrollTop = dropdown.scrollTop;
521
- var itemTop = item.offsetTop;
522
- var itemHeight = item.offsetHeight;
523
-
524
- if (center) {
525
- dropdown.scrollTop = itemTop - dropdownHeight / 2 + itemHeight / 2;
526
- } else if (itemTop + itemHeight > dropdownHeight + scrollTop) {
527
- dropdown.scrollTop = itemTop - dropdownHeight + itemHeight;
528
- } else if (itemTop < scrollTop) {
529
- dropdown.scrollTop = itemTop;
530
- }
531
- }
532
- }, {
533
- key: "componentDidUpdate",
534
- value: function componentDidUpdate(prevProps) {
535
- // Внутри useEffect и так is, можно убрать
536
- if (!(0, _is.is)(prevProps.value, this.props.value) || prevProps.options !== this.props.options) {
537
- if (process.env.NODE_ENV === "development") {
538
- checkOptionsValueType(this.props.options);
476
+ case "ArrowDown":
477
+ if (opened) {
478
+ areOptionsShown() && focusOption("next");
479
+ } else {
480
+ open();
539
481
  }
540
482
 
541
- this.isControlledOutside = this.props.value !== undefined;
483
+ break;
542
484
 
543
- var _value = this.props.value === undefined ? this.state.nativeSelectValue : this.props.value;
485
+ case "Escape":
486
+ close();
487
+ break;
544
488
 
545
- var _options3 = this.props.searchable && this.state.inputValue !== undefined ? this.filter(this.props.options, this.state.inputValue, this.props.filterFn) : this.props.options;
489
+ case "Enter":
490
+ case "Spacebar":
491
+ case " ":
492
+ if (opened) {
493
+ areOptionsShown() && selectFocused();
494
+ } else {
495
+ open();
496
+ }
546
497
 
547
- this.setState({
548
- nativeSelectValue: _value,
549
- selectedOptionIndex: this.findSelectedIndex(_options3, _value),
550
- options: _options3
551
- });
552
- }
498
+ break;
553
499
  }
554
- }, {
555
- key: "render",
556
- value: function render() {
557
- var _this$state$popperPla;
558
-
559
- var _this$state3 = this.state,
560
- opened = _this$state3.opened,
561
- nativeSelectValue = _this$state3.nativeSelectValue,
562
- stateOptions = _this$state3.options;
563
- var _this$props2 = this.props,
564
- before = _this$props2.before,
565
- searchable = _this$props2.searchable,
566
- name = _this$props2.name,
567
- className = _this$props2.className,
568
- getRef = _this$props2.getRef,
569
- getRootRef = _this$props2.getRootRef,
570
- popupDirection = _this$props2.popupDirection,
571
- options = _this$props2.options,
572
- sizeY = _this$props2.sizeY,
573
- platform = _this$props2.platform,
574
- style = _this$props2.style,
575
- onChange = _this$props2.onChange,
576
- onBlur = _this$props2.onBlur,
577
- onFocus = _this$props2.onFocus,
578
- onClick = _this$props2.onClick,
579
- renderOption = _this$props2.renderOption,
580
- children = _this$props2.children,
581
- emptyText = _this$props2.emptyText,
582
- onInputChange = _this$props2.onInputChange,
583
- filterFn = _this$props2.filterFn,
584
- renderDropdown = _this$props2.renderDropdown,
585
- onOpen = _this$props2.onOpen,
586
- onClose = _this$props2.onClose,
587
- fetching = _this$props2.fetching,
588
- icon = _this$props2.icon,
589
- dropdownOffsetDistance = _this$props2.dropdownOffsetDistance,
590
- fixDropdownWidth = _this$props2.fixDropdownWidth,
591
- forceDropdownPortal = _this$props2.forceDropdownPortal,
592
- _this$props2$selectTy = _this$props2.selectType,
593
- selectType = _this$props2$selectTy === void 0 ? _Select.SelectType.default : _this$props2$selectTy,
594
- autoHideScrollbar = _this$props2.autoHideScrollbar,
595
- autoHideScrollbarDelay = _this$props2.autoHideScrollbarDelay,
596
- restProps = (0, _objectWithoutProperties2.default)(_this$props2, _excluded);
597
- var selected = this.getSelectedItem();
598
- var label = selected ? selected.label : undefined;
599
- var defaultDropdownContent = stateOptions !== undefined && stateOptions.length > 0 ? stateOptions.map(this.renderOption) : (0, _jsxRuntime.createScopedElement)(_Caption.Caption, {
600
- vkuiClass: "CustomSelect__empty"
601
- }, this.props.emptyText);
602
- var resolvedContent;
603
-
604
- if (typeof renderDropdown === "function") {
605
- resolvedContent = renderDropdown({
606
- defaultDropdownContent: defaultDropdownContent
607
- });
608
- } else {
609
- resolvedContent = defaultDropdownContent;
610
- }
500
+ }, [areOptionsShown, close, focusOption, onKeyboardInput, open, opened, selectFocused]);
501
+ var handleOptionClick = React.useCallback(function (e) {
502
+ var _e$currentTarget$pare;
503
+
504
+ var index = Array.prototype.indexOf.call((_e$currentTarget$pare = e.currentTarget.parentNode) === null || _e$currentTarget$pare === void 0 ? void 0 : _e$currentTarget$pare.children, e.currentTarget);
505
+ var option = options[index];
611
506
 
612
- var openedClassNames = (0, _classNames.classNames)(opened && "Select--open", opened && dropdownOffsetDistance === 0 && ((_this$state$popperPla = this.state.popperPlacement) !== null && _this$state$popperPla !== void 0 && _this$state$popperPla.includes("top") ? "Select--pop-up" : "Select--pop-down"));
613
- return (0, _jsxRuntime.createScopedElement)("label", {
614
- vkuiClass: (0, _getClassName.getClassName)("CustomSelect", platform),
615
- className: className,
616
- style: style,
617
- ref: (0, _utils.multiRef)(this.containerRef, getRootRef),
618
- onClick: this.onLabelClick
619
- }, opened && searchable ? (0, _jsxRuntime.createScopedElement)(_Input.Input, (0, _extends2.default)({}, restProps, {
620
- autoFocus: true,
621
- onBlur: this.onBlur,
622
- vkuiClass: openedClassNames,
623
- value: this.state.inputValue,
624
- onKeyDown: this.onInputKeyDown,
625
- onChange: this.onInputChange // TODO Ожидается, что клик поймает нативный select, но его перехватывает Input. К сожалению, это приводит к конфликтам типизации.
626
- // TODO Нужно перестать пытаться превратить CustomSelect в select. Тогда эта проблема уйдёт.
627
- // @ts-ignore
628
- ,
629
- onClick: onClick,
630
- before: before,
631
- after: icon,
632
- placeholder: restProps.placeholder,
633
- mode: (0, _select.getFormFieldModeFromSelectType)(selectType)
634
- })) : (0, _jsxRuntime.createScopedElement)(_SelectMimicry.SelectMimicry, (0, _extends2.default)({}, restProps, {
635
- "aria-hidden": true,
636
- onClick: this.onClick,
637
- onKeyDown: this.handleKeyDownSelect,
638
- onKeyUp: this.handleKeyUp,
639
- onFocus: this.onFocus,
640
- onBlur: this.onBlur,
641
- vkuiClass: openedClassNames,
642
- after: icon,
643
- selectType: selectType
644
- }), label), (0, _jsxRuntime.createScopedElement)("select", {
645
- ref: this.selectRef,
646
- name: name,
647
- onChange: this.onNativeSelectChange,
648
- onBlur: onBlur,
649
- onFocus: onFocus,
650
- onClick: onClick,
651
- value: nativeSelectValue,
652
- "aria-hidden": true,
653
- vkuiClass: "CustomSelect__control"
654
- }, options.map(function (item) {
655
- return (0, _jsxRuntime.createScopedElement)("option", {
656
- key: "".concat(item.value),
657
- value: item.value
658
- });
659
- })), opened && (0, _jsxRuntime.createScopedElement)(_CustomSelectDropdown.CustomSelectDropdown, {
660
- targetRef: this.containerRef,
661
- placement: popupDirection,
662
- scrollBoxRef: this.scrollBoxRef,
663
- onPlacementChange: this.onPlacementChange,
664
- onMouseLeave: this.resetFocusedOption,
665
- fetching: fetching,
666
- offsetDistance: dropdownOffsetDistance,
667
- sameWidth: fixDropdownWidth,
668
- forcePortal: forceDropdownPortal,
669
- autoHideScrollbar: autoHideScrollbar,
670
- autoHideScrollbarDelay: autoHideScrollbarDelay,
671
- observableRefs: this.scrollBoxRef
672
- }, resolvedContent));
507
+ if (option && !option.disabled) {
508
+ selectFocused();
509
+ }
510
+ }, [options, selectFocused]);
511
+ var handleOptionHover = React.useCallback(function (e) {
512
+ var _e$currentTarget$pare2;
513
+
514
+ focusOptionByIndex(Array.prototype.indexOf.call((_e$currentTarget$pare2 = e.currentTarget.parentNode) === null || _e$currentTarget$pare2 === void 0 ? void 0 : _e$currentTarget$pare2.children, e.currentTarget), false);
515
+ }, [focusOptionByIndex]);
516
+ var renderOption = React.useCallback(function (option, index) {
517
+ var hovered = index === focusedOptionIndex;
518
+ var selected = index === selectedOptionIndex;
519
+ return (0, _jsxRuntime.createScopedElement)(React.Fragment, {
520
+ key: "".concat(option.value)
521
+ }, renderOptionProp({
522
+ option: option,
523
+ hovered: hovered,
524
+ children: option.label,
525
+ selected: selected,
526
+ disabled: option.disabled,
527
+ onClick: handleOptionClick,
528
+ onMouseDown: handleOptionDown,
529
+ // Используем `onMouseOver` вместо `onMouseEnter`.
530
+ // При параметре `searchable`, обновляется "ребёнок", из-за чего `onMouseEnter` не срабатывает в следующих кейсах:
531
+ // 1. До загрузки выпадающего списка, курсор мышки находится над произвольным элементом этого списка.
532
+ // > Лечение: только увод курсора мыши и возвращении его обратно вызывает событие `onMouseEnter` на этот элемент.
533
+ // 2. Если это тач-устройство.
534
+ // > Лечение: нужно нажать на какой-нибудь произвольный элемент списка, после чего `onMouseEnter` будет работать на соседние элементы,
535
+ // но не на тот, на который нажали в первый раз.
536
+ // Более подробно по ссылке https://github.com/facebook/react/issues/13956#issuecomment-1082055744
537
+ onMouseOver: handleOptionHover
538
+ }));
539
+ }, [focusedOptionIndex, handleOptionClick, handleOptionHover, renderOptionProp, selectedOptionIndex]);
540
+ var resolvedContent = React.useMemo(function () {
541
+ var defaultDropdownContent = (options === null || options === void 0 ? void 0 : options.length) > 0 ? options.map(renderOption) : (0, _jsxRuntime.createScopedElement)(_Caption.Caption, {
542
+ vkuiClass: "CustomSelect__empty"
543
+ }, emptyText);
544
+
545
+ if (typeof renderDropdown === "function") {
546
+ return renderDropdown({
547
+ defaultDropdownContent: defaultDropdownContent
548
+ });
549
+ } else {
550
+ return defaultDropdownContent;
673
551
  }
674
- }]);
675
- return CustomSelectComponent;
676
- }(React.Component);
552
+ }, [emptyText, options, renderDropdown, renderOption]);
553
+ return (0, _jsxRuntime.createScopedElement)("label", {
554
+ vkuiClass: "CustomSelect",
555
+ className: className,
556
+ style: style,
557
+ ref: (0, _utils.multiRef)(containerRef, getRootRef),
558
+ onClick: onLabelClick
559
+ }, opened && searchable ? (0, _jsxRuntime.createScopedElement)(_Input.Input, (0, _extends2.default)({}, restProps, {
560
+ autoFocus: true,
561
+ onBlur: onBlur,
562
+ vkuiClass: openedClassNames,
563
+ value: inputValue,
564
+ onKeyDown: onInputKeyDown,
565
+ onChange: onInputChange // TODO Ожидается, что клик поймает нативный select, но его перехватывает Input. К сожалению, это приводит к конфликтам типизации.
566
+ // TODO Нужно перестать пытаться превратить CustomSelect в select. Тогда эта проблема уйдёт.
567
+ // @ts-ignore
568
+ ,
569
+ onClick: props.onClick,
570
+ before: before,
571
+ after: icon,
572
+ placeholder: restProps.placeholder,
573
+ mode: (0, _select.getFormFieldModeFromSelectType)(selectType)
574
+ })) : (0, _jsxRuntime.createScopedElement)(_SelectMimicry.SelectMimicry, (0, _extends2.default)({}, restProps, {
575
+ "aria-hidden": true,
576
+ onClick: onClick,
577
+ onKeyDown: handleKeyDownSelect,
578
+ onKeyUp: handleKeyUp,
579
+ onFocus: onFocus,
580
+ onBlur: onBlur,
581
+ vkuiClass: openedClassNames,
582
+ after: icon,
583
+ selectType: selectType
584
+ }), selected === null || selected === void 0 ? void 0 : selected.label), (0, _jsxRuntime.createScopedElement)("select", {
585
+ ref: selectElRef,
586
+ name: name,
587
+ onChange: onNativeSelectChange,
588
+ onBlur: props.onBlur,
589
+ onFocus: props.onFocus,
590
+ onClick: props.onClick,
591
+ value: nativeSelectValue,
592
+ "aria-hidden": true,
593
+ vkuiClass: "CustomSelect__control"
594
+ }, optionsProp.map(function (item) {
595
+ return (0, _jsxRuntime.createScopedElement)("option", {
596
+ key: "".concat(item.value),
597
+ value: item.value
598
+ });
599
+ })), opened && (0, _jsxRuntime.createScopedElement)(_CustomSelectDropdown.CustomSelectDropdown, {
600
+ targetRef: containerRef,
601
+ placement: popupDirection,
602
+ scrollBoxRef: scrollBoxRef,
603
+ onPlacementChange: setPopperPlacement,
604
+ onMouseLeave: resetFocusedOption,
605
+ fetching: fetching,
606
+ offsetDistance: dropdownOffsetDistance,
607
+ sameWidth: fixDropdownWidth,
608
+ forcePortal: forceDropdownPortal,
609
+ autoHideScrollbar: autoHideScrollbar,
610
+ autoHideScrollbarDelay: autoHideScrollbarDelay,
611
+ observableRefs: scrollBoxRef
612
+ }, resolvedContent));
613
+ }
677
614
  /**
678
615
  * @see https://vkcom.github.io/VKUI/#/CustomSelect
679
616
  */
680
617
 
681
618
 
682
- (0, _defineProperty2.default)(CustomSelectComponent, "defaultProps", {
683
- searchable: false,
684
- renderOption: function renderOption(_ref2) {
685
- var option = _ref2.option,
686
- props = (0, _objectWithoutProperties2.default)(_ref2, _excluded2);
687
- return (0, _jsxRuntime.createScopedElement)(_CustomSelectOption.CustomSelectOption, props);
688
- },
689
- options: [],
690
- emptyText: "Ничего не найдено",
691
- filterFn: _select.defaultFilterFn,
692
- icon: (0, _jsxRuntime.createScopedElement)(_DropdownIcon.DropdownIcon, null),
693
- dropdownOffsetDistance: 0,
694
- fixDropdownWidth: true
695
- });
696
- var CustomSelect = (0, _withPlatform.withPlatform)((0, _withAdaptivity.withAdaptivity)(CustomSelectComponent, {
619
+ var CustomSelect = (0, _withAdaptivity.withAdaptivity)(CustomSelectComponent, {
697
620
  sizeY: true
698
- }));
621
+ });
699
622
  exports.CustomSelect = CustomSelect;
700
623
  //# sourceMappingURL=CustomSelect.js.map