@vkontakte/vkui 7.5.4 → 7.6.0

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 (475) hide show
  1. package/dist/components/Calendar/Calendar.js +6 -6
  2. package/dist/components/Calendar/Calendar.js.map +1 -1
  3. package/dist/components/CalendarDays/CalendarDays.js +3 -3
  4. package/dist/components/CalendarDays/CalendarDays.js.map +1 -1
  5. package/dist/components/CalendarRange/CalendarRange.d.ts.map +1 -1
  6. package/dist/components/CalendarRange/CalendarRange.js +16 -14
  7. package/dist/components/CalendarRange/CalendarRange.js.map +1 -1
  8. package/dist/components/CalendarRange/utils.d.ts.map +1 -1
  9. package/dist/components/CalendarRange/utils.js +6 -5
  10. package/dist/components/CalendarRange/utils.js.map +1 -1
  11. package/dist/components/Cell/Cell.d.ts.map +1 -1
  12. package/dist/components/Cell/Cell.js +6 -3
  13. package/dist/components/Cell/Cell.js.map +1 -1
  14. package/dist/components/CellButtonGroup/CellButtonGroup.d.ts +5 -3
  15. package/dist/components/CellButtonGroup/CellButtonGroup.d.ts.map +1 -1
  16. package/dist/components/Checkbox/Checkbox.d.ts +4 -0
  17. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
  18. package/dist/components/Checkbox/Checkbox.js +4 -2
  19. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  20. package/dist/components/Checkbox/CheckboxSimple/CheckboxSimple.d.ts +1 -1
  21. package/dist/components/Checkbox/CheckboxSimple/CheckboxSimple.d.ts.map +1 -1
  22. package/dist/components/Checkbox/CheckboxSimple/CheckboxSimple.js +6 -3
  23. package/dist/components/Checkbox/CheckboxSimple/CheckboxSimple.js.map +1 -1
  24. package/dist/components/ChipsInputBase/Chip/Chip.d.ts +41 -2
  25. package/dist/components/ChipsInputBase/Chip/Chip.d.ts.map +1 -1
  26. package/dist/components/ChipsInputBase/Chip/Chip.js +7 -2
  27. package/dist/components/ChipsInputBase/Chip/Chip.js.map +1 -1
  28. package/dist/components/ChipsInputBase/types.d.ts +2 -35
  29. package/dist/components/ChipsInputBase/types.d.ts.map +1 -1
  30. package/dist/components/ChipsInputBase/types.js.map +1 -1
  31. package/dist/components/ContentBadge/ContentBadge.d.ts +1 -1
  32. package/dist/components/ContentBadge/ContentBadge.d.ts.map +1 -1
  33. package/dist/components/ContentBadge/ContentBadge.js +15 -9
  34. package/dist/components/ContentBadge/ContentBadge.js.map +1 -1
  35. package/dist/components/ContentCard/ContentCard.d.ts +1 -1
  36. package/dist/components/ContentCard/ContentCard.d.ts.map +1 -1
  37. package/dist/components/ContentCard/ContentCard.js.map +1 -1
  38. package/dist/components/CustomSelect/CustomSelect.d.ts +16 -27
  39. package/dist/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  40. package/dist/components/CustomSelect/CustomSelect.js +161 -428
  41. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  42. package/dist/components/CustomSelect/CustomSelectInput/CustomSelectInput.d.ts +3 -1
  43. package/dist/components/CustomSelect/CustomSelectInput/CustomSelectInput.d.ts.map +1 -1
  44. package/dist/components/CustomSelect/CustomSelectInput/CustomSelectInput.js +25 -5
  45. package/dist/components/CustomSelect/CustomSelectInput/CustomSelectInput.js.map +1 -1
  46. package/dist/components/CustomSelect/helpers.d.ts +12 -0
  47. package/dist/components/CustomSelect/helpers.d.ts.map +1 -0
  48. package/dist/components/CustomSelect/helpers.js +63 -0
  49. package/dist/components/CustomSelect/helpers.js.map +1 -0
  50. package/dist/components/CustomSelect/hooks/useAfterItems.d.ts +11 -0
  51. package/dist/components/CustomSelect/hooks/useAfterItems.d.ts.map +1 -0
  52. package/dist/components/CustomSelect/hooks/useAfterItems.js +57 -0
  53. package/dist/components/CustomSelect/hooks/useAfterItems.js.map +1 -0
  54. package/dist/components/CustomSelect/hooks/useDropdownOpenedController.d.ts +13 -0
  55. package/dist/components/CustomSelect/hooks/useDropdownOpenedController.d.ts.map +1 -0
  56. package/dist/components/CustomSelect/hooks/useDropdownOpenedController.js +60 -0
  57. package/dist/components/CustomSelect/hooks/useDropdownOpenedController.js.map +1 -0
  58. package/dist/components/CustomSelect/hooks/useFocusedOptionController.d.ts +20 -0
  59. package/dist/components/CustomSelect/hooks/useFocusedOptionController.d.ts.map +1 -0
  60. package/dist/components/CustomSelect/hooks/useFocusedOptionController.js +52 -0
  61. package/dist/components/CustomSelect/hooks/useFocusedOptionController.js.map +1 -0
  62. package/dist/components/CustomSelect/hooks/useInputKeyboardController.d.ts +13 -0
  63. package/dist/components/CustomSelect/hooks/useInputKeyboardController.d.ts.map +1 -0
  64. package/dist/components/CustomSelect/hooks/useInputKeyboardController.js +78 -0
  65. package/dist/components/CustomSelect/hooks/useInputKeyboardController.js.map +1 -0
  66. package/dist/components/CustomSelect/hooks/useInputValueController.d.ts +15 -0
  67. package/dist/components/CustomSelect/hooks/useInputValueController.d.ts.map +1 -0
  68. package/dist/components/CustomSelect/hooks/useInputValueController.js +43 -0
  69. package/dist/components/CustomSelect/hooks/useInputValueController.js.map +1 -0
  70. package/dist/components/CustomSelect/hooks/useScrollListController.d.ts +9 -0
  71. package/dist/components/CustomSelect/hooks/useScrollListController.d.ts.map +1 -0
  72. package/dist/components/CustomSelect/hooks/useScrollListController.js +37 -0
  73. package/dist/components/CustomSelect/hooks/useScrollListController.js.map +1 -0
  74. package/dist/components/CustomSelect/hooks/useSelectedOptionController.d.ts +18 -0
  75. package/dist/components/CustomSelect/hooks/useSelectedOptionController.d.ts.map +1 -0
  76. package/dist/components/CustomSelect/hooks/useSelectedOptionController.js +81 -0
  77. package/dist/components/CustomSelect/hooks/useSelectedOptionController.js.map +1 -0
  78. package/dist/components/CustomSelect/types.d.ts +33 -0
  79. package/dist/components/CustomSelect/types.d.ts.map +1 -0
  80. package/dist/components/CustomSelect/types.js +3 -0
  81. package/dist/components/CustomSelect/types.js.map +1 -0
  82. package/dist/components/CustomSelectDropdown/CustomSelectDropdown.d.ts.map +1 -1
  83. package/dist/components/CustomSelectDropdown/CustomSelectDropdown.js +1 -0
  84. package/dist/components/CustomSelectDropdown/CustomSelectDropdown.js.map +1 -1
  85. package/dist/components/DateInput/DateInput.d.ts.map +1 -1
  86. package/dist/components/DateInput/DateInput.js +3 -2
  87. package/dist/components/DateInput/DateInput.js.map +1 -1
  88. package/dist/components/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  89. package/dist/components/DateRangeInput/DateRangeInput.js +4 -4
  90. package/dist/components/DateRangeInput/DateRangeInput.js.map +1 -1
  91. package/dist/components/ModalCard/ModalCard.d.ts +1 -1
  92. package/dist/components/ModalCard/ModalCard.d.ts.map +1 -1
  93. package/dist/components/ModalCard/ModalCard.js +4 -2
  94. package/dist/components/ModalCard/ModalCard.js.map +1 -1
  95. package/dist/components/ModalCard/ModalCardInternal.d.ts +1 -1
  96. package/dist/components/ModalCard/ModalCardInternal.d.ts.map +1 -1
  97. package/dist/components/ModalCard/ModalCardInternal.js +5 -3
  98. package/dist/components/ModalCard/ModalCardInternal.js.map +1 -1
  99. package/dist/components/ModalCard/types.d.ts +6 -0
  100. package/dist/components/ModalCard/types.d.ts.map +1 -1
  101. package/dist/components/ModalCard/types.js.map +1 -1
  102. package/dist/components/ModalOutlet/ModalOutlet.d.ts +2 -1
  103. package/dist/components/ModalOutlet/ModalOutlet.d.ts.map +1 -1
  104. package/dist/components/ModalOutlet/ModalOutlet.js +4 -3
  105. package/dist/components/ModalOutlet/ModalOutlet.js.map +1 -1
  106. package/dist/components/ModalPage/ModalPage.d.ts +1 -1
  107. package/dist/components/ModalPage/ModalPage.d.ts.map +1 -1
  108. package/dist/components/ModalPage/ModalPage.js +3 -1
  109. package/dist/components/ModalPage/ModalPage.js.map +1 -1
  110. package/dist/components/ModalPage/ModalPageInternal.d.ts +1 -1
  111. package/dist/components/ModalPage/ModalPageInternal.d.ts.map +1 -1
  112. package/dist/components/ModalPage/ModalPageInternal.js +5 -3
  113. package/dist/components/ModalPage/ModalPageInternal.js.map +1 -1
  114. package/dist/components/ModalPage/types.d.ts +6 -0
  115. package/dist/components/ModalPage/types.d.ts.map +1 -1
  116. package/dist/components/ModalPage/types.js.map +1 -1
  117. package/dist/components/ModalRoot/ModalRoot.d.ts +1 -1
  118. package/dist/components/ModalRoot/ModalRoot.d.ts.map +1 -1
  119. package/dist/components/ModalRoot/ModalRoot.js +4 -2
  120. package/dist/components/ModalRoot/ModalRoot.js.map +1 -1
  121. package/dist/components/ModalRoot/types.d.ts +4 -0
  122. package/dist/components/ModalRoot/types.d.ts.map +1 -1
  123. package/dist/components/ModalRoot/types.js.map +1 -1
  124. package/dist/components/ModalRoot/useModalManager.d.ts +3 -1
  125. package/dist/components/ModalRoot/useModalManager.d.ts.map +1 -1
  126. package/dist/components/ModalRoot/useModalManager.js +2 -1
  127. package/dist/components/ModalRoot/useModalManager.js.map +1 -1
  128. package/dist/components/OnboardingTooltip/OnboardingTooltip.d.ts +2 -2
  129. package/dist/components/OnboardingTooltip/OnboardingTooltip.d.ts.map +1 -1
  130. package/dist/components/OnboardingTooltip/OnboardingTooltip.js +4 -2
  131. package/dist/components/OnboardingTooltip/OnboardingTooltip.js.map +1 -1
  132. package/dist/components/Popover/Popover.d.ts +1 -1
  133. package/dist/components/Popover/Popover.d.ts.map +1 -1
  134. package/dist/components/Popover/Popover.js.map +1 -1
  135. package/dist/components/Popover/usePopover.d.ts +1 -1
  136. package/dist/components/Popover/usePopover.d.ts.map +1 -1
  137. package/dist/components/Popover/usePopover.js +3 -1
  138. package/dist/components/Popover/usePopover.js.map +1 -1
  139. package/dist/components/Popper/Popper.d.ts +2 -2
  140. package/dist/components/Popper/Popper.d.ts.map +1 -1
  141. package/dist/components/Popper/Popper.js +3 -1
  142. package/dist/components/Popper/Popper.js.map +1 -1
  143. package/dist/components/Select/Select.d.ts +2 -1
  144. package/dist/components/Select/Select.d.ts.map +1 -1
  145. package/dist/components/Select/Select.js +5 -2
  146. package/dist/components/Select/Select.js.map +1 -1
  147. package/dist/components/SelectionControl/SelectionControl.d.ts +5 -1
  148. package/dist/components/SelectionControl/SelectionControl.d.ts.map +1 -1
  149. package/dist/components/SelectionControl/SelectionControl.js +22 -6
  150. package/dist/components/SelectionControl/SelectionControl.js.map +1 -1
  151. package/dist/components/SelectionControl/SelectionControlContext.d.ts +7 -0
  152. package/dist/components/SelectionControl/SelectionControlContext.d.ts.map +1 -0
  153. package/dist/components/SelectionControl/SelectionControlContext.js +7 -0
  154. package/dist/components/SelectionControl/SelectionControlContext.js.map +1 -0
  155. package/dist/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.d.ts.map +1 -1
  156. package/dist/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.js +3 -1
  157. package/dist/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.js.map +1 -1
  158. package/dist/components/SimpleCell/SimpleCell.d.ts.map +1 -1
  159. package/dist/components/SimpleCell/SimpleCell.js +29 -8
  160. package/dist/components/SimpleCell/SimpleCell.js.map +1 -1
  161. package/dist/components/Skeleton/Skeleton.js +1 -1
  162. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  163. package/dist/components/Tabs/Tabs.d.ts.map +1 -1
  164. package/dist/components/Tabs/Tabs.js +19 -9
  165. package/dist/components/Tabs/Tabs.js.map +1 -1
  166. package/dist/components/Tabs/TabsController.d.ts +2 -2
  167. package/dist/components/Tabs/TabsController.d.ts.map +1 -1
  168. package/dist/components/Tabs/TabsController.js.map +1 -1
  169. package/dist/components/Tabs/TabsControllerContext.d.ts +5 -0
  170. package/dist/components/Tabs/TabsControllerContext.d.ts.map +1 -0
  171. package/dist/components/Tabs/TabsControllerContext.js +4 -0
  172. package/dist/components/Tabs/TabsControllerContext.js.map +1 -0
  173. package/dist/components/Tabs/TabsModeContext.d.ts +0 -2
  174. package/dist/components/Tabs/TabsModeContext.d.ts.map +1 -1
  175. package/dist/components/Tabs/TabsModeContext.js +1 -2
  176. package/dist/components/Tabs/TabsModeContext.js.map +1 -1
  177. package/dist/components/TabsItem/TabsItem.d.ts.map +1 -1
  178. package/dist/components/TabsItem/TabsItem.js +3 -1
  179. package/dist/components/TabsItem/TabsItem.js.map +1 -1
  180. package/dist/components/Tooltip/Tooltip.d.ts +1 -1
  181. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
  182. package/dist/components/Tooltip/Tooltip.js.map +1 -1
  183. package/dist/components/Tooltip/useTooltip.d.ts +1 -1
  184. package/dist/components/Tooltip/useTooltip.d.ts.map +1 -1
  185. package/dist/components/Tooltip/useTooltip.js +3 -1
  186. package/dist/components/Tooltip/useTooltip.js.map +1 -1
  187. package/dist/components/Typography/Caption/Caption.d.ts +2 -0
  188. package/dist/components/Typography/Caption/Caption.d.ts.map +1 -1
  189. package/dist/components/Typography/Caption/Caption.js +4 -1
  190. package/dist/components/Typography/Caption/Caption.js.map +1 -1
  191. package/dist/components/Typography/Footnote/Footnote.d.ts +2 -0
  192. package/dist/components/Typography/Footnote/Footnote.d.ts.map +1 -1
  193. package/dist/components/Typography/Footnote/Footnote.js +4 -1
  194. package/dist/components/Typography/Footnote/Footnote.js.map +1 -1
  195. package/dist/components/Typography/Typography.d.ts +1 -0
  196. package/dist/components/Typography/Typography.d.ts.map +1 -1
  197. package/dist/components/Typography/Typography.js +7 -1
  198. package/dist/components/Typography/Typography.js.map +1 -1
  199. package/dist/components/View/View.d.ts.map +1 -1
  200. package/dist/components/View/View.js +2 -1
  201. package/dist/components/View/View.js.map +1 -1
  202. package/dist/components/View/ViewInfinite.d.ts.map +1 -1
  203. package/dist/components/View/ViewInfinite.js +2 -1
  204. package/dist/components/View/ViewInfinite.js.map +1 -1
  205. package/dist/components.css +1 -1
  206. package/dist/components.css.map +1 -1
  207. package/dist/cssm/components/Banner/Banner.module.css +1 -6
  208. package/dist/cssm/components/Calendar/Calendar.js +6 -6
  209. package/dist/cssm/components/Calendar/Calendar.js.map +1 -1
  210. package/dist/cssm/components/CalendarDays/CalendarDays.js +3 -3
  211. package/dist/cssm/components/CalendarDays/CalendarDays.js.map +1 -1
  212. package/dist/cssm/components/CalendarRange/CalendarRange.js +16 -14
  213. package/dist/cssm/components/CalendarRange/CalendarRange.js.map +1 -1
  214. package/dist/cssm/components/CalendarRange/utils.js +6 -5
  215. package/dist/cssm/components/CalendarRange/utils.js.map +1 -1
  216. package/dist/cssm/components/Cell/Cell.js +3 -1
  217. package/dist/cssm/components/Cell/Cell.js.map +1 -1
  218. package/dist/cssm/components/Checkbox/Checkbox.js +2 -1
  219. package/dist/cssm/components/Checkbox/Checkbox.js.map +1 -1
  220. package/dist/cssm/components/Checkbox/CheckboxSimple/CheckboxSimple.js +4 -2
  221. package/dist/cssm/components/Checkbox/CheckboxSimple/CheckboxSimple.js.map +1 -1
  222. package/dist/cssm/components/Checkbox/CheckboxSimple/CheckboxSimple.module.css +11 -2
  223. package/dist/cssm/components/ChipsInputBase/Chip/Chip.js +6 -2
  224. package/dist/cssm/components/ChipsInputBase/Chip/Chip.js.map +1 -1
  225. package/dist/cssm/components/ChipsInputBase/Chip/Chip.module.css +8 -1
  226. package/dist/cssm/components/ChipsInputBase/types.js.map +1 -1
  227. package/dist/cssm/components/ContentBadge/ContentBadge.js +14 -8
  228. package/dist/cssm/components/ContentBadge/ContentBadge.js.map +1 -1
  229. package/dist/cssm/components/ContentCard/ContentCard.js.map +1 -1
  230. package/dist/cssm/components/CustomSelect/CustomSelect.js +154 -421
  231. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  232. package/dist/cssm/components/CustomSelect/CustomSelectInput/CustomSelectInput.js +22 -4
  233. package/dist/cssm/components/CustomSelect/CustomSelectInput/CustomSelectInput.js.map +1 -1
  234. package/dist/cssm/components/CustomSelect/CustomSelectInput/CustomSelectInput.module.css +12 -0
  235. package/dist/cssm/components/CustomSelect/helpers.js +62 -0
  236. package/dist/cssm/components/CustomSelect/helpers.js.map +1 -0
  237. package/dist/cssm/components/CustomSelect/hooks/useAfterItems.js +58 -0
  238. package/dist/cssm/components/CustomSelect/hooks/useAfterItems.js.map +1 -0
  239. package/dist/cssm/components/CustomSelect/hooks/useDropdownOpenedController.js +60 -0
  240. package/dist/cssm/components/CustomSelect/hooks/useDropdownOpenedController.js.map +1 -0
  241. package/dist/cssm/components/CustomSelect/hooks/useFocusedOptionController.js +52 -0
  242. package/dist/cssm/components/CustomSelect/hooks/useFocusedOptionController.js.map +1 -0
  243. package/dist/cssm/components/CustomSelect/hooks/useInputKeyboardController.js +78 -0
  244. package/dist/cssm/components/CustomSelect/hooks/useInputKeyboardController.js.map +1 -0
  245. package/dist/cssm/components/CustomSelect/hooks/useInputValueController.js +43 -0
  246. package/dist/cssm/components/CustomSelect/hooks/useInputValueController.js.map +1 -0
  247. package/dist/cssm/components/CustomSelect/hooks/useScrollListController.js +37 -0
  248. package/dist/cssm/components/CustomSelect/hooks/useScrollListController.js.map +1 -0
  249. package/dist/cssm/components/CustomSelect/hooks/useSelectedOptionController.js +81 -0
  250. package/dist/cssm/components/CustomSelect/hooks/useSelectedOptionController.js.map +1 -0
  251. package/dist/cssm/components/CustomSelect/types.js +3 -0
  252. package/dist/cssm/components/CustomSelect/types.js.map +1 -0
  253. package/dist/cssm/components/CustomSelectDropdown/CustomSelectDropdown.js +1 -0
  254. package/dist/cssm/components/CustomSelectDropdown/CustomSelectDropdown.js.map +1 -1
  255. package/dist/cssm/components/DateInput/DateInput.js +3 -2
  256. package/dist/cssm/components/DateInput/DateInput.js.map +1 -1
  257. package/dist/cssm/components/DateRangeInput/DateRangeInput.js +4 -4
  258. package/dist/cssm/components/DateRangeInput/DateRangeInput.js.map +1 -1
  259. package/dist/cssm/components/ModalCard/ModalCard.js +2 -1
  260. package/dist/cssm/components/ModalCard/ModalCard.js.map +1 -1
  261. package/dist/cssm/components/ModalCard/ModalCardInternal.js +3 -2
  262. package/dist/cssm/components/ModalCard/ModalCardInternal.js.map +1 -1
  263. package/dist/cssm/components/ModalCard/types.js.map +1 -1
  264. package/dist/cssm/components/ModalOutlet/ModalOutlet.js +2 -2
  265. package/dist/cssm/components/ModalOutlet/ModalOutlet.js.map +1 -1
  266. package/dist/cssm/components/ModalOutlet/ModalOutlet.module.css +4 -0
  267. package/dist/cssm/components/ModalOverlay/ModalOverlay.module.css +1 -1
  268. package/dist/cssm/components/ModalPage/ModalPage.js +2 -1
  269. package/dist/cssm/components/ModalPage/ModalPage.js.map +1 -1
  270. package/dist/cssm/components/ModalPage/ModalPage.module.css +1 -0
  271. package/dist/cssm/components/ModalPage/ModalPageInternal.js +3 -2
  272. package/dist/cssm/components/ModalPage/ModalPageInternal.js.map +1 -1
  273. package/dist/cssm/components/ModalPage/types.js.map +1 -1
  274. package/dist/cssm/components/ModalRoot/ModalRoot.js +4 -2
  275. package/dist/cssm/components/ModalRoot/ModalRoot.js.map +1 -1
  276. package/dist/cssm/components/ModalRoot/types.js.map +1 -1
  277. package/dist/cssm/components/ModalRoot/useModalManager.js +2 -1
  278. package/dist/cssm/components/ModalRoot/useModalManager.js.map +1 -1
  279. package/dist/cssm/components/OnboardingTooltip/OnboardingTooltip.js +3 -2
  280. package/dist/cssm/components/OnboardingTooltip/OnboardingTooltip.js.map +1 -1
  281. package/dist/cssm/components/Popover/Popover.js.map +1 -1
  282. package/dist/cssm/components/Popover/usePopover.js +2 -1
  283. package/dist/cssm/components/Popover/usePopover.js.map +1 -1
  284. package/dist/cssm/components/Popper/Popper.js +2 -1
  285. package/dist/cssm/components/Popper/Popper.js.map +1 -1
  286. package/dist/cssm/components/Select/Select.js +1 -1
  287. package/dist/cssm/components/Select/Select.js.map +1 -1
  288. package/dist/cssm/components/SelectionControl/SelectionControl.js +16 -6
  289. package/dist/cssm/components/SelectionControl/SelectionControl.js.map +1 -1
  290. package/dist/cssm/components/SelectionControl/SelectionControl.module.css +6 -3
  291. package/dist/cssm/components/SelectionControl/SelectionControlContext.js +7 -0
  292. package/dist/cssm/components/SelectionControl/SelectionControlContext.js.map +1 -0
  293. package/dist/cssm/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.js +3 -1
  294. package/dist/cssm/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.js.map +1 -1
  295. package/dist/cssm/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.module.css +6 -3
  296. package/dist/cssm/components/SimpleCell/SimpleCell.js +29 -8
  297. package/dist/cssm/components/SimpleCell/SimpleCell.js.map +1 -1
  298. package/dist/cssm/components/Skeleton/Skeleton.js +1 -1
  299. package/dist/cssm/components/Skeleton/Skeleton.js.map +1 -1
  300. package/dist/cssm/components/Slider/SliderThumb/SliderThumb.module.css +2 -1
  301. package/dist/cssm/components/Tabs/Tabs.js +19 -9
  302. package/dist/cssm/components/Tabs/Tabs.js.map +1 -1
  303. package/dist/cssm/components/Tabs/TabsController.js.map +1 -1
  304. package/dist/cssm/components/Tabs/TabsControllerContext.js +4 -0
  305. package/dist/cssm/components/Tabs/TabsControllerContext.js.map +1 -0
  306. package/dist/cssm/components/Tabs/TabsModeContext.js +1 -2
  307. package/dist/cssm/components/Tabs/TabsModeContext.js.map +1 -1
  308. package/dist/cssm/components/TabsItem/TabsItem.js +3 -1
  309. package/dist/cssm/components/TabsItem/TabsItem.js.map +1 -1
  310. package/dist/cssm/components/Tooltip/Tooltip.js.map +1 -1
  311. package/dist/cssm/components/Tooltip/useTooltip.js +2 -1
  312. package/dist/cssm/components/Tooltip/useTooltip.js.map +1 -1
  313. package/dist/cssm/components/Typography/Caption/Caption.js +4 -1
  314. package/dist/cssm/components/Typography/Caption/Caption.js.map +1 -1
  315. package/dist/cssm/components/Typography/Footnote/Footnote.js +4 -1
  316. package/dist/cssm/components/Typography/Footnote/Footnote.js.map +1 -1
  317. package/dist/cssm/components/Typography/Typography.js +7 -1
  318. package/dist/cssm/components/Typography/Typography.js.map +1 -1
  319. package/dist/cssm/components/View/View.js +2 -1
  320. package/dist/cssm/components/View/View.js.map +1 -1
  321. package/dist/cssm/components/View/View.module.css +1 -1
  322. package/dist/cssm/components/View/ViewInfinite.js +2 -1
  323. package/dist/cssm/components/View/ViewInfinite.js.map +1 -1
  324. package/dist/cssm/components/VisuallyHidden/VisuallyHidden.module.css +0 -2
  325. package/dist/cssm/hooks/useCalendar.js +6 -4
  326. package/dist/cssm/hooks/useCalendar.js.map +1 -1
  327. package/dist/cssm/hooks/useFloatingElement.js +3 -2
  328. package/dist/cssm/hooks/useFloatingElement.js.map +1 -1
  329. package/dist/cssm/hooks/useTodayDate.js +3 -2
  330. package/dist/cssm/hooks/useTodayDate.js.map +1 -1
  331. package/dist/cssm/index.js.map +1 -1
  332. package/dist/cssm/lib/accessibility.js +8 -0
  333. package/dist/cssm/lib/accessibility.js.map +1 -1
  334. package/dist/cssm/lib/calendar.js +9 -7
  335. package/dist/cssm/lib/calendar.js.map +1 -1
  336. package/dist/cssm/lib/date.js +66 -3
  337. package/dist/cssm/lib/date.js.map +1 -1
  338. package/dist/cssm/lib/floating/useFloatingMiddlewaresBootstrap/index.js +18 -8
  339. package/dist/cssm/lib/floating/useFloatingMiddlewaresBootstrap/index.js.map +1 -1
  340. package/dist/cssm/lib/floating/useFloatingWithInteractions/types.js.map +1 -1
  341. package/dist/cssm/lib/touch/UIPanGestureRecognizer.js +2 -2
  342. package/dist/cssm/lib/touch/UIPanGestureRecognizer.js.map +1 -1
  343. package/dist/cssm/lib/utils.js +1 -0
  344. package/dist/cssm/lib/utils.js.map +1 -1
  345. package/dist/cssm/styles/themes.css +1 -1
  346. package/dist/hooks/useCalendar.d.ts.map +1 -1
  347. package/dist/hooks/useCalendar.js +6 -4
  348. package/dist/hooks/useCalendar.js.map +1 -1
  349. package/dist/hooks/useFloatingElement.d.ts +1 -1
  350. package/dist/hooks/useFloatingElement.d.ts.map +1 -1
  351. package/dist/hooks/useFloatingElement.js +3 -2
  352. package/dist/hooks/useFloatingElement.js.map +1 -1
  353. package/dist/hooks/useTodayDate.d.ts.map +1 -1
  354. package/dist/hooks/useTodayDate.js +3 -2
  355. package/dist/hooks/useTodayDate.js.map +1 -1
  356. package/dist/index.d.ts +4 -2
  357. package/dist/index.d.ts.map +1 -1
  358. package/dist/index.js.map +1 -1
  359. package/dist/lib/accessibility.d.ts +1 -1
  360. package/dist/lib/accessibility.d.ts.map +1 -1
  361. package/dist/lib/accessibility.js +8 -0
  362. package/dist/lib/accessibility.js.map +1 -1
  363. package/dist/lib/calendar.d.ts.map +1 -1
  364. package/dist/lib/calendar.js +9 -7
  365. package/dist/lib/calendar.js.map +1 -1
  366. package/dist/lib/date.d.ts +31 -1
  367. package/dist/lib/date.d.ts.map +1 -1
  368. package/dist/lib/date.js +67 -3
  369. package/dist/lib/date.js.map +1 -1
  370. package/dist/lib/floating/useFloatingMiddlewaresBootstrap/index.d.ts +6 -1
  371. package/dist/lib/floating/useFloatingMiddlewaresBootstrap/index.d.ts.map +1 -1
  372. package/dist/lib/floating/useFloatingMiddlewaresBootstrap/index.js +18 -8
  373. package/dist/lib/floating/useFloatingMiddlewaresBootstrap/index.js.map +1 -1
  374. package/dist/lib/floating/useFloatingWithInteractions/types.d.ts +2 -0
  375. package/dist/lib/floating/useFloatingWithInteractions/types.d.ts.map +1 -1
  376. package/dist/lib/floating/useFloatingWithInteractions/types.js.map +1 -1
  377. package/dist/lib/touch/UIPanGestureRecognizer.d.ts.map +1 -1
  378. package/dist/lib/touch/UIPanGestureRecognizer.js +2 -2
  379. package/dist/lib/touch/UIPanGestureRecognizer.js.map +1 -1
  380. package/dist/lib/utils.d.ts +1 -0
  381. package/dist/lib/utils.d.ts.map +1 -1
  382. package/dist/lib/utils.js +1 -0
  383. package/dist/lib/utils.js.map +1 -1
  384. package/dist/vkui.css +1 -1
  385. package/dist/vkui.css.map +1 -1
  386. package/package.json +6 -7
  387. package/src/components/Banner/Banner.module.css +1 -6
  388. package/src/components/Banner/Banner.module.css.d.ts.map +1 -1
  389. package/src/components/Calendar/Calendar.tsx +6 -6
  390. package/src/components/CalendarDays/CalendarDays.tsx +3 -3
  391. package/src/components/CalendarRange/CalendarRange.tsx +15 -20
  392. package/src/components/CalendarRange/utils.ts +7 -6
  393. package/src/components/Cell/Cell.tsx +3 -0
  394. package/src/components/Checkbox/Checkbox.tsx +6 -0
  395. package/src/components/Checkbox/CheckboxSimple/CheckboxSimple.module.css +7 -2
  396. package/src/components/Checkbox/CheckboxSimple/CheckboxSimple.module.css.d.ts.map +1 -1
  397. package/src/components/Checkbox/CheckboxSimple/CheckboxSimple.tsx +12 -3
  398. package/src/components/ChipsInputBase/Chip/Chip.module.css +8 -1
  399. package/src/components/ChipsInputBase/Chip/Chip.module.css.d.ts.map +1 -1
  400. package/src/components/ChipsInputBase/Chip/Chip.tsx +55 -1
  401. package/src/components/ChipsInputBase/types.ts +2 -45
  402. package/src/components/ContentBadge/ContentBadge.tsx +18 -12
  403. package/src/components/ContentCard/ContentCard.tsx +1 -1
  404. package/src/components/CustomSelect/CustomSelect.tsx +216 -562
  405. package/src/components/CustomSelect/CustomSelectInput/CustomSelectInput.module.css +12 -0
  406. package/src/components/CustomSelect/CustomSelectInput/CustomSelectInput.module.css.d.ts.map +1 -1
  407. package/src/components/CustomSelect/CustomSelectInput/CustomSelectInput.tsx +25 -2
  408. package/src/components/CustomSelect/helpers.ts +103 -0
  409. package/src/components/CustomSelect/hooks/useAfterItems.tsx +89 -0
  410. package/src/components/CustomSelect/hooks/useDropdownOpenedController.ts +61 -0
  411. package/src/components/CustomSelect/hooks/useFocusedOptionController.ts +86 -0
  412. package/src/components/CustomSelect/hooks/useInputKeyboardController.ts +96 -0
  413. package/src/components/CustomSelect/hooks/useInputValueController.ts +58 -0
  414. package/src/components/CustomSelect/hooks/useScrollListController.ts +46 -0
  415. package/src/components/CustomSelect/hooks/useSelectedOptionController.ts +132 -0
  416. package/src/components/CustomSelect/types.ts +38 -0
  417. package/src/components/CustomSelectDropdown/CustomSelectDropdown.tsx +1 -0
  418. package/src/components/DateInput/DateInput.tsx +9 -3
  419. package/src/components/DateRangeInput/DateRangeInput.tsx +9 -6
  420. package/src/components/ModalCard/ModalCard.tsx +2 -0
  421. package/src/components/ModalCard/ModalCardInternal.tsx +8 -2
  422. package/src/components/ModalCard/types.ts +6 -0
  423. package/src/components/ModalOutlet/ModalOutlet.module.css +4 -0
  424. package/src/components/ModalOutlet/ModalOutlet.module.css.d.ts.map +1 -1
  425. package/src/components/ModalOutlet/ModalOutlet.tsx +8 -1
  426. package/src/components/ModalOverlay/ModalOverlay.module.css +1 -1
  427. package/src/components/ModalPage/ModalPage.module.css +1 -0
  428. package/src/components/ModalPage/ModalPage.module.css.d.ts.map +1 -1
  429. package/src/components/ModalPage/ModalPage.tsx +2 -0
  430. package/src/components/ModalPage/ModalPageInternal.tsx +8 -2
  431. package/src/components/ModalPage/types.ts +6 -0
  432. package/src/components/ModalRoot/ModalRoot.tsx +19 -6
  433. package/src/components/ModalRoot/types.ts +5 -0
  434. package/src/components/ModalRoot/useModalManager.tsx +4 -0
  435. package/src/components/OnboardingTooltip/OnboardingTooltip.tsx +3 -0
  436. package/src/components/Popover/Popover.tsx +1 -0
  437. package/src/components/Popover/usePopover.tsx +2 -0
  438. package/src/components/Popper/Popper.tsx +3 -0
  439. package/src/components/Select/Select.tsx +5 -5
  440. package/src/components/SelectionControl/SelectionControl.module.css +6 -3
  441. package/src/components/SelectionControl/SelectionControl.module.css.d.ts.map +1 -1
  442. package/src/components/SelectionControl/SelectionControl.tsx +30 -8
  443. package/src/components/SelectionControl/SelectionControlContext.ts +7 -0
  444. package/src/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.module.css +6 -3
  445. package/src/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.module.css.d.ts.map +1 -1
  446. package/src/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.tsx +7 -1
  447. package/src/components/SimpleCell/SimpleCell.tsx +5 -0
  448. package/src/components/Skeleton/Skeleton.tsx +1 -1
  449. package/src/components/Slider/SliderThumb/SliderThumb.module.css +1 -1
  450. package/src/components/Tabs/Tabs.tsx +16 -12
  451. package/src/components/Tabs/TabsController.ts +2 -2
  452. package/src/components/Tabs/TabsControllerContext.ts +7 -0
  453. package/src/components/Tabs/TabsModeContext.ts +0 -3
  454. package/src/components/TabsItem/TabsItem.tsx +5 -9
  455. package/src/components/Tooltip/Tooltip.tsx +1 -0
  456. package/src/components/Tooltip/useTooltip.tsx +2 -0
  457. package/src/components/Typography/Caption/Caption.tsx +14 -6
  458. package/src/components/Typography/Footnote/Footnote.tsx +10 -6
  459. package/src/components/Typography/Typography.tsx +9 -2
  460. package/src/components/View/View.module.css +1 -1
  461. package/src/components/View/View.tsx +2 -1
  462. package/src/components/View/ViewInfinite.tsx +2 -1
  463. package/src/components/VisuallyHidden/VisuallyHidden.module.css +0 -2
  464. package/src/components/VisuallyHidden/VisuallyHidden.module.css.d.ts.map +1 -1
  465. package/src/hooks/useCalendar.ts +6 -4
  466. package/src/hooks/useFloatingElement.tsx +2 -0
  467. package/src/hooks/useTodayDate.ts +3 -2
  468. package/src/index.ts +5 -3
  469. package/src/lib/accessibility.ts +4 -0
  470. package/src/lib/calendar.ts +8 -12
  471. package/src/lib/date.ts +82 -3
  472. package/src/lib/floating/useFloatingMiddlewaresBootstrap/index.ts +23 -10
  473. package/src/lib/floating/useFloatingWithInteractions/types.ts +2 -0
  474. package/src/lib/touch/UIPanGestureRecognizer.ts +2 -2
  475. package/src/lib/utils.ts +3 -0
@@ -44,6 +44,14 @@
44
44
  padding-inline-end: 0;
45
45
  }
46
46
 
47
+ .inputHidden .el {
48
+ opacity: 0;
49
+ }
50
+
51
+ .labelHidden .container {
52
+ opacity: 0;
53
+ }
54
+
47
55
  .container {
48
56
  z-index: var(--vkui_internal--z_index_form_field_element);
49
57
  box-sizing: border-box;
@@ -55,6 +63,10 @@
55
63
  pointer-events: none;
56
64
  }
57
65
 
66
+ .accessible:not(.hasInputValue):focus-within .container {
67
+ color: var(--vkui--color_text_tertiary);
68
+ }
69
+
58
70
  .hasBefore .container {
59
71
  padding-inline-start: 0;
60
72
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["./CustomSelectInput.module.css"],"names":["host","el","elCursorPointer","sizeYCompact","sizeYNone","hasBefore","hasAfter","container","multiline","inputGroup","title","empty","alignRight","alignCenter"],"mappings":"AAAA;AAAA,E,aAAAA,M,WAAA;AAAA,E,aAIAC,I,WAJA;AAAA,E,aAwBAC,iB,WAxBA;AAAA,E,aA4BAC,c,WA5BA;AAAA,E,aA4BcF,I,WA5Bd;AAAA,E,aAiCEG,W,WAjCF;AAAA,E,aAiCaH,I,WAjCb;AAAA,E,aAsCAI,W,WAtCA;AAAA,E,aAsCWJ,I,WAtCX;AAAA,E,aA0CAK,U,WA1CA;AAAA,E,aA0CUL,I,WA1CV;AAAA,E,aA8CAM,W,WA9CA;AAAA,E,aAyDAF,W,WAzDA;AAAA,E,aAyDWE,W,WAzDX;AAAA,E,aA6DAC,W,WA7DA;AAAA,E,aA6DWD,W,WA7DX;AAAA,E,aAiEAJ,c,WAjEA;AAAA,E,aAiEaK,W,WAjEb;AAAA,E,aAiEwBD,W,WAjExB;AAAA,E,aAsEEH,W,WAtEF;AAAA,E,aAsEYI,W,WAtEZ;AAAA,E,aAsEuBD,W,WAtEvB;AAAA,E,aA2EAE,Y,WA3EA;AAAA,E,aAoFAJ,W,WApFA;AAAA,E,aAoFWI,Y,WApFX;AAAA,E,aAwFAC,O,WAxFA;AAAA,E,aA4FAV,M,WA5FA;AAAA,E,aA4FUQ,W,WA5FV;AAAA,E,aA4FsBE,O,WA5FtB;AAAA,E,aAkGAC,O,WAlGA;AAAA,E,aAkGOD,O,WAlGP;AAAA,E,aAyGAT,I,WAzGA;AAAA,E,aA6GAW,Y,WA7GA;AAAA,E,aA6GYF,O,WA7GZ;AAAA,E,aA8GAE,Y,WA9GA;AAAA,E,aA8GYX,I,WA9GZ;AAAA,E,aAkHAY,a,WAlHA;AAAA,E,aAkHaH,O,WAlHb;AAAA,E,aAmHAG,a,WAnHA;AAAA,E,aAmHaZ,I,WAnHb;AAAA,E,aA4H6CM,W,WA5H7C;AAAA;AAAA","file":"CustomSelectInput.module.css.d.ts","sourceRoot":""}
1
+ {"version":3,"sources":["./CustomSelectInput.module.css"],"names":["host","el","elCursorPointer","sizeYCompact","sizeYNone","hasBefore","hasAfter","inputHidden","labelHidden","container","accessible","hasInputValue","multiline","inputGroup","title","empty","alignRight","alignCenter"],"mappings":"AAAA;AAAA,E,aAAAA,M,WAAA;AAAA,E,aAIAC,I,WAJA;AAAA,E,aAwBAC,iB,WAxBA;AAAA,E,aA4BAC,c,WA5BA;AAAA,E,aA4BcF,I,WA5Bd;AAAA,E,aAiCEG,W,WAjCF;AAAA,E,aAiCaH,I,WAjCb;AAAA,E,aAsCAI,W,WAtCA;AAAA,E,aAsCWJ,I,WAtCX;AAAA,E,aA0CAK,U,WA1CA;AAAA,E,aA0CUL,I,WA1CV;AAAA,E,aA8CAM,a,WA9CA;AAAA,E,aA8CaN,I,WA9Cb;AAAA,E,aAkDAO,a,WAlDA;AAAA,E,aAkDaC,W,WAlDb;AAAA,E,aAsDAA,W,WAtDA;AAAA,E,aAiEAC,Y,WAjEA;AAAA,E,aAiEgBC,e,WAjEhB;AAAA,E,aAiE6CF,W,WAjE7C;AAAA,E,aAqEAJ,W,WArEA;AAAA,E,aAqEWI,W,WArEX;AAAA,E,aAyEAG,W,WAzEA;AAAA,E,aAyEWH,W,WAzEX;AAAA,E,aA6EAN,c,WA7EA;AAAA,E,aA6EaS,W,WA7Eb;AAAA,E,aA6EwBH,W,WA7ExB;AAAA,E,aAkFEL,W,WAlFF;AAAA,E,aAkFYQ,W,WAlFZ;AAAA,E,aAkFuBH,W,WAlFvB;AAAA,E,aAuFAI,Y,WAvFA;AAAA,E,aAgGAR,W,WAhGA;AAAA,E,aAgGWQ,Y,WAhGX;AAAA,E,aAoGAC,O,WApGA;AAAA,E,aAwGAd,M,WAxGA;AAAA,E,aAwGUY,W,WAxGV;AAAA,E,aAwGsBE,O,WAxGtB;AAAA,E,aA8GAC,O,WA9GA;AAAA,E,aA8GOD,O,WA9GP;AAAA,E,aAqHAb,I,WArHA;AAAA,E,aAyHAe,Y,WAzHA;AAAA,E,aAyHYF,O,WAzHZ;AAAA,E,aA0HAE,Y,WA1HA;AAAA,E,aA0HYf,I,WA1HZ;AAAA,E,aA8HAgB,a,WA9HA;AAAA,E,aA8HaH,O,WA9Hb;AAAA,E,aA+HAG,a,WA/HA;AAAA,E,aA+HahB,I,WA/Hb;AAAA,E,aAwI6CQ,W,WAxI7C;AAAA;AAAA","file":"CustomSelectInput.module.css.d.ts","sourceRoot":""}
@@ -31,6 +31,8 @@ export interface CustomSelectInputProps
31
31
  multiline?: boolean;
32
32
  labelTextTestId?: string;
33
33
  fetching?: boolean;
34
+ searchable?: boolean;
35
+ accessible?: boolean;
34
36
  }
35
37
 
36
38
  /**
@@ -53,6 +55,8 @@ export const CustomSelectInput = ({
53
55
  disabled,
54
56
  fetching,
55
57
  labelTextTestId,
58
+ searchable,
59
+ accessible,
56
60
  ...restProps
57
61
  }: CustomSelectInputProps): React.ReactNode => {
58
62
  const { sizeY = 'none' } = useAdaptivity();
@@ -63,12 +67,14 @@ export const CustomSelectInput = ({
63
67
  const handleRootRef = useExternRef(getRootRef);
64
68
  const focusWithin = useFocusWithin(handleRootRef);
65
69
 
70
+ const inputReadonly = restProps.readOnly || (disabled && fetching);
71
+
66
72
  const input = (
67
73
  <Text
68
74
  type="text"
69
75
  {...restProps}
70
76
  disabled={disabled && !fetching}
71
- readOnly={restProps.readOnly || (disabled && fetching)}
77
+ readOnly={inputReadonly}
72
78
  Component="input"
73
79
  normalize={false}
74
80
  className={classNames(
@@ -80,6 +86,19 @@ export const CustomSelectInput = ({
80
86
  />
81
87
  );
82
88
 
89
+ const inputHidden = React.useMemo(() => {
90
+ if (accessible) {
91
+ if (!searchable) {
92
+ return true;
93
+ }
94
+ return !focusWithin || (inputReadonly && !fetching);
95
+ } else {
96
+ return false;
97
+ }
98
+ }, [accessible, fetching, focusWithin, inputReadonly, searchable]);
99
+
100
+ const labelHidden = showLabelOrPlaceholder ? false : !inputHidden;
101
+
83
102
  const platform = usePlatform();
84
103
  return (
85
104
  <FormField
@@ -94,6 +113,10 @@ export const CustomSelectInput = ({
94
113
  sizeY !== 'regular' && sizeYClassNames[sizeY],
95
114
  before && styles.hasBefore,
96
115
  after && styles.hasAfter,
116
+ inputHidden && styles.inputHidden,
117
+ labelHidden && styles.labelHidden,
118
+ accessible && styles.accessible,
119
+ restProps.value && styles.hasInputValue,
97
120
  className,
98
121
  )}
99
122
  getRootRef={handleRootRef}
@@ -111,7 +134,7 @@ export const CustomSelectInput = ({
111
134
  data-testid={labelTextTestId}
112
135
  >
113
136
  <SelectTypography selectType={selectType} className={styles.title}>
114
- {showLabelOrPlaceholder && title}
137
+ {title}
115
138
  </SelectTypography>
116
139
  </div>
117
140
  {/* Чтобы отключить autosuggestion в iOS, тултипы которого начинают всплывать даже когда input
@@ -0,0 +1,103 @@
1
+ import { getTextFromChildren } from '../../lib/children';
2
+ import { warnOnce } from '../../lib/warnOnce';
3
+ import { NOT_SELECTED, type SelectValue } from '../NativeSelect/NativeSelect';
4
+ import { type SelectProps } from './CustomSelect';
5
+ import { type CustomSelectOptionInterface } from './types';
6
+
7
+ export const findIndexAfter = (options: CustomSelectOptionInterface[] = [], startIndex = -1) => {
8
+ if (startIndex >= options.length - 1) {
9
+ return -1;
10
+ }
11
+ return options.findIndex((option, i) => i > startIndex && !option.disabled);
12
+ };
13
+
14
+ export const findIndexBefore = (
15
+ options: CustomSelectOptionInterface[] = [],
16
+ endIndex: number = options.length,
17
+ ) => {
18
+ let result = -1;
19
+ if (endIndex <= 0) {
20
+ return result;
21
+ }
22
+ for (let i = endIndex - 1; i >= 0; i--) {
23
+ let option = options[i];
24
+
25
+ if (!option.disabled) {
26
+ result = i;
27
+ break;
28
+ }
29
+ }
30
+ return result;
31
+ };
32
+ const warn = warnOnce('CustomSelect');
33
+
34
+ export const checkOptionsValueType = <T extends CustomSelectOptionInterface>(options: T[]) => {
35
+ if (new Set(options.map((item) => typeof item.value)).size > 1) {
36
+ warn(
37
+ 'Некоторые значения ваших опций имеют разные типы. onChange всегда возвращает строковый тип.',
38
+ 'error',
39
+ );
40
+ }
41
+ };
42
+
43
+ export const checkMixControlledAndUncontrolledState = (
44
+ oldIsControlled: boolean,
45
+ newIsControlled: boolean,
46
+ ) => {
47
+ if (!oldIsControlled && newIsControlled) {
48
+ warn(
49
+ `Похоже, что компонент был переведен из состояния Uncontrolled в Controlled. Пожалуйста, не делайте так. Если вам нужно отобразить невыбранное состояние компонента, используйте value=null вместо undefined`,
50
+ 'error',
51
+ );
52
+ }
53
+ if (oldIsControlled && !newIsControlled) {
54
+ warn(
55
+ `Похоже, что компонент был переведен из состояния Controlled в Uncontrolled. Пожалуйста, не делайте так. Если вам нужно отобразить невыбранное состояние компонента, используйте value=null вместо undefined`,
56
+ 'error',
57
+ );
58
+ }
59
+ };
60
+
61
+ export function findSelectedIndex<T extends CustomSelectOptionInterface>(
62
+ options: T[] = [],
63
+ value: SelectValue,
64
+ ) {
65
+ if (value === NOT_SELECTED.CUSTOM) {
66
+ return -1;
67
+ }
68
+ return (
69
+ options.findIndex((item) => {
70
+ value = typeof item.value === 'number' ? Number(value) : value;
71
+ return item.value === value;
72
+ }) ?? -1
73
+ );
74
+ }
75
+
76
+ export function getOptionByValue<T extends CustomSelectOptionInterface>(
77
+ options: T[] = [],
78
+ value: SelectValue,
79
+ ): T | null {
80
+ const index = findSelectedIndex(options, value);
81
+ if (index === -1) {
82
+ return null;
83
+ }
84
+ return options[index];
85
+ }
86
+
87
+ export const filter = <T extends CustomSelectOptionInterface>(
88
+ options: SelectProps<T>['options'],
89
+ inputValue: string,
90
+ filterFn: SelectProps<T>['filterFn'],
91
+ ) => {
92
+ return typeof filterFn === 'function'
93
+ ? options.filter((option) => filterFn(inputValue, option))
94
+ : options;
95
+ };
96
+
97
+ export function calculateInputValueFromOptions<T extends CustomSelectOptionInterface>(
98
+ options: T[] = [],
99
+ selectValue: SelectValue,
100
+ ) {
101
+ const selectedOption = getOptionByValue(options, selectValue);
102
+ return selectedOption ? getTextFromChildren(selectedOption.label) : '';
103
+ }
@@ -0,0 +1,89 @@
1
+ 'use client';
2
+
3
+ import * as React from 'react';
4
+ import { useStableCallback } from '../../../hooks/useStableCallback';
5
+ import { DropdownIcon } from '../../DropdownIcon/DropdownIcon';
6
+ import { type NativeSelectValue, NOT_SELECTED } from '../../NativeSelect/NativeSelect';
7
+ import { type SelectProps } from '../CustomSelect';
8
+ import { CustomSelectClearButton } from '../CustomSelectClearButton';
9
+ import styles from '../CustomSelect.module.css';
10
+
11
+ /* eslint-disable jsdoc/require-jsdoc */
12
+ interface UseAfterItemsProps
13
+ extends Pick<
14
+ SelectProps,
15
+ | 'value'
16
+ | 'allowClearButton'
17
+ | 'icon'
18
+ | 'readOnly'
19
+ | 'disabled'
20
+ | 'ClearButton'
21
+ | 'clearButtonTestId'
22
+ > {
23
+ isControlledOutside: boolean;
24
+ nativeSelectValue: NativeSelectValue;
25
+ opened: boolean;
26
+ onClearButtonClick: () => void;
27
+ }
28
+ /* eslint-enable jsdoc/require-jsdoc */
29
+
30
+ export function useAfterItems({
31
+ value,
32
+ nativeSelectValue,
33
+ isControlledOutside,
34
+ opened,
35
+ allowClearButton,
36
+ ClearButton = CustomSelectClearButton,
37
+ onClearButtonClick,
38
+ clearButtonTestId,
39
+ disabled,
40
+ readOnly,
41
+ icon: iconProp,
42
+ }: UseAfterItemsProps) {
43
+ const onClearButtonClickCb = useStableCallback(onClearButtonClick);
44
+
45
+ const controlledValueSet = isControlledOutside && value !== NOT_SELECTED.CUSTOM;
46
+ const uncontrolledValueSet = !isControlledOutside && nativeSelectValue !== NOT_SELECTED.NATIVE;
47
+ const clearButtonShown =
48
+ allowClearButton && !opened && (controlledValueSet || uncontrolledValueSet);
49
+
50
+ const clearButton = React.useMemo(() => {
51
+ if (!clearButtonShown) {
52
+ return null;
53
+ }
54
+
55
+ return (
56
+ <ClearButton
57
+ className={iconProp === undefined ? styles.clearIcon : undefined}
58
+ onClick={onClearButtonClickCb}
59
+ disabled={disabled}
60
+ data-testid={clearButtonTestId}
61
+ />
62
+ );
63
+ }, [clearButtonShown, ClearButton, iconProp, onClearButtonClickCb, disabled, clearButtonTestId]);
64
+
65
+ const icon = React.useMemo(() => {
66
+ if (iconProp !== undefined) {
67
+ return iconProp;
68
+ }
69
+
70
+ return (
71
+ <DropdownIcon
72
+ className={clearButtonShown ? styles.dropdownIcon : undefined}
73
+ opened={opened}
74
+ />
75
+ );
76
+ }, [clearButtonShown, iconProp, opened]);
77
+
78
+ return React.useMemo(
79
+ () =>
80
+ !readOnly &&
81
+ (icon || clearButtonShown) && (
82
+ <React.Fragment>
83
+ {clearButton}
84
+ {icon}
85
+ </React.Fragment>
86
+ ),
87
+ [clearButton, clearButtonShown, icon, readOnly],
88
+ );
89
+ }
@@ -0,0 +1,61 @@
1
+ import * as React from 'react';
2
+ import { noop } from '@vkontakte/vkjs';
3
+ import { useStableCallback } from '../../../hooks/useStableCallback';
4
+ import { type SelectProps } from '../CustomSelect';
5
+ /* eslint-disable jsdoc/require-jsdoc */
6
+ type UseDropdownOpenedControllerProps = Pick<SelectProps, 'onOpen' | 'onClose'> & {
7
+ onOpened?: () => void;
8
+ onClosed?: () => void;
9
+ };
10
+ /* eslint-enable jsdoc/require-jsdoc */
11
+ export function useDropdownOpenedController({
12
+ onClose,
13
+ onOpen,
14
+ onOpened,
15
+ onClosed,
16
+ }: UseDropdownOpenedControllerProps) {
17
+ const [opened, setOpened] = React.useState(false);
18
+ const onCloseCb = useStableCallback(onClose || noop);
19
+ const onOpenCb = useStableCallback(onOpen || noop);
20
+ const onOpenedCb = useStableCallback(onOpened || noop);
21
+ const onClosedCb = useStableCallback(onClosed || noop);
22
+
23
+ const close = React.useCallback(() => {
24
+ if (!opened) {
25
+ return;
26
+ }
27
+ setOpened(false);
28
+ onCloseCb?.();
29
+ }, [onCloseCb, opened]);
30
+
31
+ const open = React.useCallback(() => {
32
+ if (opened) {
33
+ return;
34
+ }
35
+ setOpened(true);
36
+ onOpenCb?.();
37
+ }, [onOpenCb, opened]);
38
+
39
+ const toggleOpened = React.useCallback(() => {
40
+ if (opened) {
41
+ close();
42
+ } else {
43
+ open();
44
+ }
45
+ }, [close, open, opened]);
46
+
47
+ React.useEffect(() => {
48
+ if (opened) {
49
+ onOpenedCb();
50
+ } else {
51
+ onClosedCb();
52
+ }
53
+ }, [onClosedCb, onOpenedCb, opened]);
54
+
55
+ return {
56
+ opened,
57
+ open,
58
+ close,
59
+ toggleOpened,
60
+ };
61
+ }
@@ -0,0 +1,86 @@
1
+ import { type Dispatch, type SetStateAction } from 'react';
2
+ import * as React from 'react';
3
+ import { type SelectValue } from '../../NativeSelect/NativeSelect';
4
+ import { type SelectProps } from '../CustomSelect';
5
+ import { findIndexAfter, findIndexBefore, findSelectedIndex } from '../helpers';
6
+ import { type CustomSelectOptionInterface } from '../types';
7
+
8
+ /* eslint-disable jsdoc/require-jsdoc */
9
+ interface UseFocusedOptionControllerProps<OptionInterfaceT extends CustomSelectOptionInterface> {
10
+ filteredOptions: SelectProps<OptionInterfaceT>['options'];
11
+ scrollToElement: (index: number, center?: boolean) => void;
12
+ selectedOptionValue: SelectValue;
13
+ }
14
+
15
+ export interface UseFocusedOptionControllerReturn {
16
+ focusedOptionValue: SelectValue;
17
+ setFocusedOptionValue: Dispatch<SetStateAction<SelectValue>>;
18
+ focusOptionByIndex: (index: number | undefined, scrollTo: boolean) => void;
19
+ resetFocusedOption: () => void;
20
+ focusOption: (type: 'next' | 'prev') => void;
21
+ selectFocusedValue: () => void;
22
+ }
23
+ /* eslint-enable jsdoc/require-jsdoc */
24
+
25
+ export function useFocusedOptionController<OptionInterfaceT extends CustomSelectOptionInterface>({
26
+ selectedOptionValue,
27
+ filteredOptions,
28
+ scrollToElement,
29
+ }: UseFocusedOptionControllerProps<OptionInterfaceT>): UseFocusedOptionControllerReturn {
30
+ const [focusedOptionValue, setFocusedOptionValue] = React.useState<SelectValue>(null);
31
+
32
+ const focusOptionByIndex = React.useCallback(
33
+ (index: number | undefined, scrollTo = true) => {
34
+ if (index === undefined || index < 0 || index > filteredOptions.length - 1) {
35
+ return;
36
+ }
37
+ const option = filteredOptions[index];
38
+
39
+ if (!option || option.disabled) {
40
+ return;
41
+ }
42
+
43
+ if (scrollTo) {
44
+ scrollToElement(index);
45
+ }
46
+
47
+ setFocusedOptionValue(option.value);
48
+ },
49
+ [filteredOptions, scrollToElement],
50
+ );
51
+
52
+ const resetFocusedOption = React.useCallback(() => {
53
+ setFocusedOptionValue(null);
54
+ }, []);
55
+
56
+ const focusOption = React.useCallback(
57
+ (type: 'next' | 'prev') => {
58
+ let index = findSelectedIndex(filteredOptions, focusedOptionValue);
59
+
60
+ if (type === 'next') {
61
+ const nextIndex = findIndexAfter(filteredOptions, index);
62
+ index = nextIndex === -1 ? findIndexAfter(filteredOptions) : nextIndex; // Следующий за index или первый валидный до index
63
+ } else if (type === 'prev') {
64
+ const beforeIndex = findIndexBefore(filteredOptions, index);
65
+ index = beforeIndex === -1 ? findIndexBefore(filteredOptions) : beforeIndex; // Предшествующий index или последний валидный после index
66
+ }
67
+
68
+ focusOptionByIndex(index);
69
+ },
70
+ [filteredOptions, focusedOptionValue, focusOptionByIndex],
71
+ );
72
+
73
+ const selectFocusedValue = React.useCallback(
74
+ () => setFocusedOptionValue(selectedOptionValue),
75
+ [selectedOptionValue],
76
+ );
77
+
78
+ return {
79
+ focusedOptionValue,
80
+ setFocusedOptionValue,
81
+ focusOptionByIndex,
82
+ resetFocusedOption,
83
+ focusOption,
84
+ selectFocusedValue,
85
+ };
86
+ }
@@ -0,0 +1,96 @@
1
+ import * as React from 'react';
2
+ import { Keys, pressedKey } from '../../../lib/accessibility';
3
+ import { callMultiple } from '../../../lib/callMultiple';
4
+ import { type SelectProps } from '../CustomSelect';
5
+ import { type UseFocusedOptionControllerReturn } from './useFocusedOptionController';
6
+
7
+ const KEYS_TO_PREVENT_DEFAULT: string[] = [Keys.ARROW_UP, Keys.ARROW_DOWN, Keys.ESCAPE, Keys.ENTER];
8
+
9
+ /* eslint-disable jsdoc/require-jsdoc */
10
+ interface UseInputKeyboardController
11
+ extends Pick<UseFocusedOptionControllerReturn, 'resetFocusedOption' | 'focusOption'>,
12
+ Pick<SelectProps, 'onInputKeyDown'> {
13
+ opened: boolean;
14
+ scrollBoxRef: React.RefObject<HTMLDivElement | null>;
15
+ selectFocused: () => void;
16
+ open: () => void;
17
+ close: () => void;
18
+ }
19
+ /* eslint-enable jsdoc/require-jsdoc */
20
+
21
+ export function useInputKeyboardController({
22
+ opened,
23
+ resetFocusedOption,
24
+ focusOption,
25
+ scrollBoxRef,
26
+ selectFocused,
27
+ onInputKeyDown,
28
+ open,
29
+ close,
30
+ }: UseInputKeyboardController) {
31
+ const handleKeyDownSelect = React.useCallback(
32
+ (event: React.KeyboardEvent) => {
33
+ const key = pressedKey(event);
34
+ if (event.key.length === 1 && key !== Keys.SPACE) {
35
+ open();
36
+ resetFocusedOption();
37
+ return;
38
+ }
39
+ if (!key) {
40
+ return;
41
+ }
42
+ const areOptionsShown = () => scrollBoxRef.current !== null;
43
+
44
+ if (KEYS_TO_PREVENT_DEFAULT.includes(key)) {
45
+ event.preventDefault();
46
+ }
47
+ switch (key) {
48
+ case Keys.ARROW_UP:
49
+ if (opened) {
50
+ areOptionsShown() && focusOption('prev');
51
+ } else {
52
+ open();
53
+ }
54
+ break;
55
+ case Keys.ARROW_DOWN:
56
+ if (opened) {
57
+ areOptionsShown() && focusOption('next');
58
+ } else {
59
+ open();
60
+ }
61
+ break;
62
+ case Keys.ESCAPE:
63
+ close();
64
+ break;
65
+ case Keys.BACKSPACE:
66
+ case Keys.DELETE: {
67
+ open();
68
+ resetFocusedOption();
69
+ break;
70
+ }
71
+ case Keys.ENTER:
72
+ case Keys.SPACE:
73
+ if (opened) {
74
+ areOptionsShown() && selectFocused();
75
+ } else {
76
+ open();
77
+ }
78
+ break;
79
+ }
80
+ },
81
+ [scrollBoxRef, opened, close, focusOption, open, resetFocusedOption, selectFocused],
82
+ );
83
+
84
+ const handleInputKeydown = React.useCallback(
85
+ (event: React.KeyboardEvent) => {
86
+ onInputKeyDown?.(event, opened);
87
+ },
88
+ [opened, onInputKeyDown],
89
+ );
90
+ const _onInputKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => void = callMultiple(
91
+ handleKeyDownSelect,
92
+ handleInputKeydown,
93
+ );
94
+
95
+ return _onInputKeyDown;
96
+ }
@@ -0,0 +1,58 @@
1
+ import * as React from 'react';
2
+ import { useIsomorphicLayoutEffect } from '../../../lib/useIsomorphicLayoutEffect';
3
+ import { type SelectValue } from '../../NativeSelect/NativeSelect';
4
+ import { type SelectProps } from '../CustomSelect';
5
+ import { calculateInputValueFromOptions } from '../helpers';
6
+ import { type CustomSelectOptionInterface } from '../types';
7
+
8
+ /* eslint-disable jsdoc/require-jsdoc */
9
+ type UseInputValueControllerProps<OptionInterfaceT extends CustomSelectOptionInterface> = Pick<
10
+ SelectProps<OptionInterfaceT>,
11
+ 'options' | 'onInputChange' | 'accessible'
12
+ > & {
13
+ selectedValue: SelectValue;
14
+ };
15
+ /* eslint-enable jsdoc/require-jsdoc */
16
+
17
+ export function useInputValueController<OptionInterfaceT extends CustomSelectOptionInterface>({
18
+ options,
19
+ accessible,
20
+ selectedValue,
21
+ onInputChange: onInputChangeProp,
22
+ }: UseInputValueControllerProps<OptionInterfaceT>) {
23
+ const [inputValue, setInputValue] = React.useState('');
24
+ const optionsRef = React.useRef(options);
25
+
26
+ useIsomorphicLayoutEffect(() => {
27
+ optionsRef.current = options;
28
+ }, [options]);
29
+
30
+ const resetInputValueBySelectedOption = React.useCallback(() => {
31
+ setInputValue(calculateInputValueFromOptions(optionsRef.current, selectedValue));
32
+ }, [selectedValue]);
33
+
34
+ useIsomorphicLayoutEffect(() => {
35
+ if (accessible) {
36
+ resetInputValueBySelectedOption();
37
+ }
38
+ }, [accessible, resetInputValueBySelectedOption]);
39
+
40
+ const resetInputValue = React.useCallback(() => {
41
+ setInputValue('');
42
+ }, []);
43
+
44
+ const onInputChange: React.ChangeEventHandler<HTMLInputElement> = React.useCallback(
45
+ (e) => {
46
+ onInputChangeProp && onInputChangeProp(e);
47
+ setInputValue(e.target.value);
48
+ },
49
+ [onInputChangeProp, setInputValue],
50
+ );
51
+
52
+ return {
53
+ inputValue,
54
+ resetInputValue,
55
+ resetInputValueBySelectedOption,
56
+ onInputChange,
57
+ };
58
+ }
@@ -0,0 +1,46 @@
1
+ import * as React from 'react';
2
+
3
+ /* eslint-disable jsdoc/require-jsdoc */
4
+ interface UseScrollListControllerReturn {
5
+ scrollBoxRef: React.RefObject<HTMLDivElement | null>;
6
+ optionsWrapperRef: React.RefObject<HTMLDivElement | null>;
7
+ scrollToElement: (index: number, center?: boolean) => void;
8
+ }
9
+ /* eslint-enable jsdoc/require-jsdoc */
10
+
11
+ export function useScrollListController(): UseScrollListControllerReturn {
12
+ const scrollBoxRef = React.useRef<HTMLDivElement | null>(null);
13
+ const optionsWrapperRef = React.useRef<HTMLDivElement>(null);
14
+
15
+ const scrollToElement = React.useCallback(
16
+ (index: number, center = false) => {
17
+ const dropdown = scrollBoxRef.current;
18
+ const optionsWrapper = optionsWrapperRef.current;
19
+
20
+ if (!dropdown || !optionsWrapper || index < 0 || index > optionsWrapper.children.length) {
21
+ return;
22
+ }
23
+ const item = optionsWrapper.children[index] as HTMLElement | null;
24
+ /* istanbul ignore if: проверка для TS (ситуация, когда среди children нет элемента с index, маловероятна) */
25
+ if (!item) {
26
+ return;
27
+ }
28
+
29
+ const dropdownHeight = dropdown.offsetHeight;
30
+ const scrollTop = dropdown.scrollTop;
31
+ const itemTop = item.offsetTop;
32
+ const itemHeight = item.offsetHeight;
33
+
34
+ if (center) {
35
+ dropdown.scrollTop = itemTop - dropdownHeight / 2 + itemHeight / 2;
36
+ } else if (itemTop + itemHeight > dropdownHeight + scrollTop) {
37
+ dropdown.scrollTop = itemTop - dropdownHeight + itemHeight;
38
+ } else if (itemTop < scrollTop) {
39
+ dropdown.scrollTop = itemTop;
40
+ }
41
+ },
42
+ [optionsWrapperRef, scrollBoxRef],
43
+ );
44
+
45
+ return { scrollToElement, scrollBoxRef, optionsWrapperRef };
46
+ }