@vkontakte/vkui 7.3.8 → 7.4.1

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 (357) hide show
  1. package/dist/components/ActionSheet/ActionSheet.d.ts +1 -1
  2. package/dist/components/ActionSheet/ActionSheet.d.ts.map +1 -1
  3. package/dist/components/ActionSheet/ActionSheet.js.map +1 -1
  4. package/dist/components/AppRoot/ScrollContext.js +2 -2
  5. package/dist/components/AppRoot/ScrollContext.js.map +1 -1
  6. package/dist/components/Banner/Banner.d.ts +2 -2
  7. package/dist/components/Banner/Banner.d.ts.map +1 -1
  8. package/dist/components/Banner/Banner.js.map +1 -1
  9. package/dist/components/Button/Button.d.ts +2 -2
  10. package/dist/components/Button/Button.d.ts.map +1 -1
  11. package/dist/components/Button/Button.js.map +1 -1
  12. package/dist/components/Calendar/Calendar.d.ts.map +1 -1
  13. package/dist/components/Calendar/Calendar.js +9 -7
  14. package/dist/components/Calendar/Calendar.js.map +1 -1
  15. package/dist/components/CalendarRange/CalendarRange.d.ts +9 -2
  16. package/dist/components/CalendarRange/CalendarRange.d.ts.map +1 -1
  17. package/dist/components/CalendarRange/CalendarRange.js +48 -35
  18. package/dist/components/CalendarRange/CalendarRange.js.map +1 -1
  19. package/dist/components/CalendarRange/types.d.ts +2 -0
  20. package/dist/components/CalendarRange/types.d.ts.map +1 -0
  21. package/dist/components/CalendarRange/types.js +3 -0
  22. package/dist/components/CalendarRange/types.js.map +1 -0
  23. package/dist/components/CalendarRange/utils.d.ts +29 -0
  24. package/dist/components/CalendarRange/utils.d.ts.map +1 -0
  25. package/dist/components/CalendarRange/utils.js +123 -0
  26. package/dist/components/CalendarRange/utils.js.map +1 -0
  27. package/dist/components/Checkbox/Checkbox.d.ts +2 -2
  28. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
  29. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  30. package/dist/components/ChipsInput/useChipsInput.d.ts.map +1 -1
  31. package/dist/components/ChipsInput/useChipsInput.js +21 -2
  32. package/dist/components/ChipsInput/useChipsInput.js.map +1 -1
  33. package/dist/components/ChipsInputBase/types.d.ts +5 -1
  34. package/dist/components/ChipsInputBase/types.d.ts.map +1 -1
  35. package/dist/components/ChipsInputBase/types.js.map +1 -1
  36. package/dist/components/Clickable/Clickable.d.ts +4 -0
  37. package/dist/components/Clickable/Clickable.d.ts.map +1 -1
  38. package/dist/components/Clickable/Clickable.js +9 -5
  39. package/dist/components/Clickable/Clickable.js.map +1 -1
  40. package/dist/components/Clickable/RealClickable.d.ts +1 -1
  41. package/dist/components/Clickable/RealClickable.d.ts.map +1 -1
  42. package/dist/components/Clickable/RealClickable.js +3 -2
  43. package/dist/components/Clickable/RealClickable.js.map +1 -1
  44. package/dist/components/ContentCard/ContentCard.d.ts +2 -2
  45. package/dist/components/ContentCard/ContentCard.d.ts.map +1 -1
  46. package/dist/components/ContentCard/ContentCard.js.map +1 -1
  47. package/dist/components/CustomSelect/CustomSelect.d.ts +4 -1
  48. package/dist/components/CustomSelect/CustomSelect.d.ts.map +1 -1
  49. package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
  50. package/dist/components/DateInput/DateInput.d.ts +1 -1
  51. package/dist/components/DateInput/DateInput.d.ts.map +1 -1
  52. package/dist/components/DateInput/DateInput.js +48 -50
  53. package/dist/components/DateInput/DateInput.js.map +1 -1
  54. package/dist/components/DateRangeInput/DateRangeInput.d.ts +22 -2
  55. package/dist/components/DateRangeInput/DateRangeInput.d.ts.map +1 -1
  56. package/dist/components/DateRangeInput/DateRangeInput.js +159 -66
  57. package/dist/components/DateRangeInput/DateRangeInput.js.map +1 -1
  58. package/dist/components/FocusTrap/FocusTrap.d.ts +1 -1
  59. package/dist/components/FocusTrap/FocusTrap.d.ts.map +1 -1
  60. package/dist/components/FocusTrap/FocusTrap.js +6 -3
  61. package/dist/components/FocusTrap/FocusTrap.js.map +1 -1
  62. package/dist/components/HorizontalCell/HorizontalCell.d.ts +2 -2
  63. package/dist/components/HorizontalCell/HorizontalCell.d.ts.map +1 -1
  64. package/dist/components/HorizontalCell/HorizontalCell.js.map +1 -1
  65. package/dist/components/HorizontalScroll/HorizontalCellShowMore/HorizontalCellShowMore.d.ts +2 -2
  66. package/dist/components/HorizontalScroll/HorizontalCellShowMore/HorizontalCellShowMore.d.ts.map +1 -1
  67. package/dist/components/HorizontalScroll/HorizontalCellShowMore/HorizontalCellShowMore.js.map +1 -1
  68. package/dist/components/IconButton/IconButton.d.ts +2 -2
  69. package/dist/components/IconButton/IconButton.d.ts.map +1 -1
  70. package/dist/components/IconButton/IconButton.js.map +1 -1
  71. package/dist/components/InputLike/InputLike.d.ts +1 -1
  72. package/dist/components/InputLike/InputLike.d.ts.map +1 -1
  73. package/dist/components/InputLike/InputLike.js +7 -6
  74. package/dist/components/InputLike/InputLike.js.map +1 -1
  75. package/dist/components/Link/Link.d.ts +2 -2
  76. package/dist/components/Link/Link.d.ts.map +1 -1
  77. package/dist/components/Link/Link.js +2 -1
  78. package/dist/components/Link/Link.js.map +1 -1
  79. package/dist/components/MiniInfoCell/MiniInfoCell.d.ts.map +1 -1
  80. package/dist/components/MiniInfoCell/MiniInfoCell.js +1 -8
  81. package/dist/components/MiniInfoCell/MiniInfoCell.js.map +1 -1
  82. package/dist/components/ModalOutsideButton/ModalOutsideButton.d.ts +2 -2
  83. package/dist/components/ModalOutsideButton/ModalOutsideButton.d.ts.map +1 -1
  84. package/dist/components/ModalOutsideButton/ModalOutsideButton.js.map +1 -1
  85. package/dist/components/NumberInputLike/NumberInputLike.d.ts +8 -0
  86. package/dist/components/NumberInputLike/NumberInputLike.d.ts.map +1 -0
  87. package/dist/components/NumberInputLike/NumberInputLike.js +45 -0
  88. package/dist/components/NumberInputLike/NumberInputLike.js.map +1 -0
  89. package/dist/components/Pagination/PaginationPage/PaginationPageButton.d.ts +2 -2
  90. package/dist/components/Pagination/PaginationPage/PaginationPageButton.d.ts.map +1 -1
  91. package/dist/components/Pagination/PaginationPage/PaginationPageButton.js.map +1 -1
  92. package/dist/components/PanelHeader/PanelHeader.d.ts +3 -1
  93. package/dist/components/PanelHeader/PanelHeader.d.ts.map +1 -1
  94. package/dist/components/PanelHeader/PanelHeader.js.map +1 -1
  95. package/dist/components/PanelHeaderButton/PanelHeaderButton.d.ts +2 -2
  96. package/dist/components/PanelHeaderButton/PanelHeaderButton.d.ts.map +1 -1
  97. package/dist/components/PanelHeaderButton/PanelHeaderButton.js.map +1 -1
  98. package/dist/components/Radio/Radio.d.ts +2 -2
  99. package/dist/components/Radio/Radio.d.ts.map +1 -1
  100. package/dist/components/Radio/Radio.js.map +1 -1
  101. package/dist/components/Removable/Removable.d.ts +1 -4
  102. package/dist/components/Removable/Removable.d.ts.map +1 -1
  103. package/dist/components/Removable/Removable.js +39 -116
  104. package/dist/components/Removable/Removable.js.map +1 -1
  105. package/dist/components/Removable/RemovableIos.d.ts +10 -0
  106. package/dist/components/Removable/RemovableIos.d.ts.map +1 -0
  107. package/dist/components/Removable/RemovableIos.js +124 -0
  108. package/dist/components/Removable/RemovableIos.js.map +1 -0
  109. package/dist/components/RichCell/RichCell.d.ts +2 -2
  110. package/dist/components/RichCell/RichCell.d.ts.map +1 -1
  111. package/dist/components/RichCell/RichCell.js.map +1 -1
  112. package/dist/components/ScreenSpinner/ScreenSpinner.d.ts.map +1 -1
  113. package/dist/components/ScreenSpinner/ScreenSpinner.js +4 -2
  114. package/dist/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
  115. package/dist/components/ScreenSpinner/ScreenSpinnerContainer.d.ts +2 -2
  116. package/dist/components/ScreenSpinner/ScreenSpinnerContainer.d.ts.map +1 -1
  117. package/dist/components/ScreenSpinner/ScreenSpinnerContainer.js +4 -3
  118. package/dist/components/ScreenSpinner/ScreenSpinnerContainer.js.map +1 -1
  119. package/dist/components/SelectionControl/SelectionControl.d.ts +2 -2
  120. package/dist/components/SelectionControl/SelectionControl.d.ts.map +1 -1
  121. package/dist/components/SelectionControl/SelectionControl.js.map +1 -1
  122. package/dist/components/SimpleCell/SimpleCell.d.ts +2 -2
  123. package/dist/components/SimpleCell/SimpleCell.d.ts.map +1 -1
  124. package/dist/components/SimpleCell/SimpleCell.js.map +1 -1
  125. package/dist/components/Skeleton/Skeleton.d.ts +5 -1
  126. package/dist/components/Skeleton/Skeleton.d.ts.map +1 -1
  127. package/dist/components/Skeleton/Skeleton.js +7 -4
  128. package/dist/components/Skeleton/Skeleton.js.map +1 -1
  129. package/dist/components/Spinner/Spinner.d.ts +5 -1
  130. package/dist/components/Spinner/Spinner.d.ts.map +1 -1
  131. package/dist/components/Spinner/Spinner.js +6 -3
  132. package/dist/components/Spinner/Spinner.js.map +1 -1
  133. package/dist/components/SubnavigationButton/SubnavigationButton.d.ts +2 -2
  134. package/dist/components/SubnavigationButton/SubnavigationButton.d.ts.map +1 -1
  135. package/dist/components/SubnavigationButton/SubnavigationButton.js.map +1 -1
  136. package/dist/components/Tabs/Tabs.d.ts +13 -9
  137. package/dist/components/Tabs/Tabs.d.ts.map +1 -1
  138. package/dist/components/Tabs/Tabs.js +14 -10
  139. package/dist/components/Tabs/Tabs.js.map +1 -1
  140. package/dist/components/Tabs/TabsController.d.ts +7 -0
  141. package/dist/components/Tabs/TabsController.d.ts.map +1 -0
  142. package/dist/components/Tabs/TabsController.js +19 -0
  143. package/dist/components/Tabs/TabsController.js.map +1 -0
  144. package/dist/components/Tabs/TabsModeContext.d.ts +13 -0
  145. package/dist/components/Tabs/TabsModeContext.d.ts.map +1 -0
  146. package/dist/components/Tabs/TabsModeContext.js +11 -0
  147. package/dist/components/Tabs/TabsModeContext.js.map +1 -0
  148. package/dist/components/TabsItem/TabsItem.d.ts +3 -3
  149. package/dist/components/TabsItem/TabsItem.d.ts.map +1 -1
  150. package/dist/components/TabsItem/TabsItem.js +21 -6
  151. package/dist/components/TabsItem/TabsItem.js.map +1 -1
  152. package/dist/components/Tappable/Tappable.d.ts +1 -0
  153. package/dist/components/Tappable/Tappable.d.ts.map +1 -1
  154. package/dist/components/Tappable/Tappable.js.map +1 -1
  155. package/dist/components/ToolButton/ToolButton.d.ts +2 -2
  156. package/dist/components/ToolButton/ToolButton.d.ts.map +1 -1
  157. package/dist/components/ToolButton/ToolButton.js.map +1 -1
  158. package/dist/components/View/ViewInfinite.js.map +1 -1
  159. package/dist/components.css +1 -1
  160. package/dist/components.css.map +1 -1
  161. package/dist/cssm/components/ActionSheet/ActionSheet.js.map +1 -1
  162. package/dist/cssm/components/AppRoot/ScrollContext.js +2 -2
  163. package/dist/cssm/components/AppRoot/ScrollContext.js.map +1 -1
  164. package/dist/cssm/components/Banner/Banner.js.map +1 -1
  165. package/dist/cssm/components/Button/Button.js.map +1 -1
  166. package/dist/cssm/components/Calendar/Calendar.js +9 -7
  167. package/dist/cssm/components/Calendar/Calendar.js.map +1 -1
  168. package/dist/cssm/components/CalendarRange/CalendarRange.js +44 -31
  169. package/dist/cssm/components/CalendarRange/CalendarRange.js.map +1 -1
  170. package/dist/cssm/components/CalendarRange/types.js +3 -0
  171. package/dist/cssm/components/CalendarRange/types.js.map +1 -0
  172. package/dist/cssm/components/CalendarRange/utils.js +122 -0
  173. package/dist/cssm/components/CalendarRange/utils.js.map +1 -0
  174. package/dist/cssm/components/Checkbox/Checkbox.js.map +1 -1
  175. package/dist/cssm/components/ChipsInput/useChipsInput.js +21 -2
  176. package/dist/cssm/components/ChipsInput/useChipsInput.js.map +1 -1
  177. package/dist/cssm/components/ChipsInputBase/types.js.map +1 -1
  178. package/dist/cssm/components/Clickable/Clickable.js +4 -3
  179. package/dist/cssm/components/Clickable/Clickable.js.map +1 -1
  180. package/dist/cssm/components/Clickable/RealClickable.js +1 -1
  181. package/dist/cssm/components/Clickable/RealClickable.js.map +1 -1
  182. package/dist/cssm/components/ContentCard/ContentCard.js.map +1 -1
  183. package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
  184. package/dist/cssm/components/DateInput/DateInput.js +45 -46
  185. package/dist/cssm/components/DateInput/DateInput.js.map +1 -1
  186. package/dist/cssm/components/DateRangeInput/DateRangeInput.js +148 -58
  187. package/dist/cssm/components/DateRangeInput/DateRangeInput.js.map +1 -1
  188. package/dist/cssm/components/FocusTrap/FocusTrap.js +4 -2
  189. package/dist/cssm/components/FocusTrap/FocusTrap.js.map +1 -1
  190. package/dist/cssm/components/HorizontalCell/HorizontalCell.js.map +1 -1
  191. package/dist/cssm/components/HorizontalScroll/HorizontalCellShowMore/HorizontalCellShowMore.js.map +1 -1
  192. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.module.css +2 -3
  193. package/dist/cssm/components/IconButton/IconButton.js.map +1 -1
  194. package/dist/cssm/components/ImageBase/ImageBase.module.css +2 -3
  195. package/dist/cssm/components/InputLike/InputLike.js +3 -3
  196. package/dist/cssm/components/InputLike/InputLike.js.map +1 -1
  197. package/dist/cssm/components/Link/Link.js +1 -0
  198. package/dist/cssm/components/Link/Link.js.map +1 -1
  199. package/dist/cssm/components/MiniInfoCell/MiniInfoCell.js +1 -8
  200. package/dist/cssm/components/MiniInfoCell/MiniInfoCell.js.map +1 -1
  201. package/dist/cssm/components/ModalOutsideButton/ModalOutsideButton.js.map +1 -1
  202. package/dist/cssm/components/NumberInputLike/NumberInputLike.js +33 -0
  203. package/dist/cssm/components/NumberInputLike/NumberInputLike.js.map +1 -0
  204. package/dist/cssm/components/Pagination/PaginationPage/PaginationPageButton.js.map +1 -1
  205. package/dist/cssm/components/PanelHeader/PanelHeader.js.map +1 -1
  206. package/dist/cssm/components/PanelHeaderButton/PanelHeaderButton.js.map +1 -1
  207. package/dist/cssm/components/Radio/Radio.js.map +1 -1
  208. package/dist/cssm/components/Removable/Removable.js +39 -115
  209. package/dist/cssm/components/Removable/Removable.js.map +1 -1
  210. package/dist/cssm/components/Removable/Removable.module.css +9 -0
  211. package/dist/cssm/components/Removable/RemovableIos.js +118 -0
  212. package/dist/cssm/components/Removable/RemovableIos.js.map +1 -0
  213. package/dist/cssm/components/RichCell/RichCell.js.map +1 -1
  214. package/dist/cssm/components/ScreenSpinner/ScreenSpinner.js +2 -1
  215. package/dist/cssm/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
  216. package/dist/cssm/components/ScreenSpinner/ScreenSpinnerContainer.js +3 -2
  217. package/dist/cssm/components/ScreenSpinner/ScreenSpinnerContainer.js.map +1 -1
  218. package/dist/cssm/components/SelectionControl/SelectionControl.js.map +1 -1
  219. package/dist/cssm/components/SimpleCell/SimpleCell.js.map +1 -1
  220. package/dist/cssm/components/Skeleton/Skeleton.js +6 -3
  221. package/dist/cssm/components/Skeleton/Skeleton.js.map +1 -1
  222. package/dist/cssm/components/Spinner/Spinner.js +5 -2
  223. package/dist/cssm/components/Spinner/Spinner.js.map +1 -1
  224. package/dist/cssm/components/SubnavigationButton/SubnavigationButton.js.map +1 -1
  225. package/dist/cssm/components/Tabs/Tabs.js +10 -9
  226. package/dist/cssm/components/Tabs/Tabs.js.map +1 -1
  227. package/dist/cssm/components/Tabs/TabsController.js +19 -0
  228. package/dist/cssm/components/Tabs/TabsController.js.map +1 -0
  229. package/dist/cssm/components/Tabs/TabsModeContext.js +11 -0
  230. package/dist/cssm/components/Tabs/TabsModeContext.js.map +1 -0
  231. package/dist/cssm/components/TabsItem/TabsItem.js +17 -4
  232. package/dist/cssm/components/TabsItem/TabsItem.js.map +1 -1
  233. package/dist/cssm/components/Tappable/Tappable.js.map +1 -1
  234. package/dist/cssm/components/ToolButton/ToolButton.js.map +1 -1
  235. package/dist/cssm/components/View/ViewInfinite.js.map +1 -1
  236. package/dist/cssm/hooks/useCalendar.js +0 -10
  237. package/dist/cssm/hooks/useCalendar.js.map +1 -1
  238. package/dist/cssm/hooks/useDateInput.js +28 -17
  239. package/dist/cssm/hooks/useDateInput.js.map +1 -1
  240. package/dist/cssm/hooks/useEventListener.js.map +1 -1
  241. package/dist/cssm/hooks/useExternRef.js.map +1 -1
  242. package/dist/cssm/hooks/useFocusTrap.js +2 -2
  243. package/dist/cssm/hooks/useFocusTrap.js.map +1 -1
  244. package/dist/cssm/hooks/useMutationObserver.js +6 -5
  245. package/dist/cssm/hooks/useMutationObserver.js.map +1 -1
  246. package/dist/cssm/lib/dom.js +7 -1
  247. package/dist/cssm/lib/dom.js.map +1 -1
  248. package/dist/cssm/lib/floating/customResizeObserver.js.map +1 -1
  249. package/dist/cssm/lib/floating/index.js.map +1 -1
  250. package/dist/cssm/lib/floating/types/common.js.map +1 -1
  251. package/dist/cssm/lib/sheet/controllers/BottomSheetController.js.map +1 -1
  252. package/dist/cssm/lib/sheet/controllers/CSSTransitionController.js.map +1 -1
  253. package/dist/cssm/styles/animationVisibilityDelay.js +10 -0
  254. package/dist/cssm/styles/animationVisibilityDelay.js.map +1 -0
  255. package/dist/cssm/styles/animationVisibilityDelay.module.css +13 -0
  256. package/dist/cssm/styles/themes.css +4 -2
  257. package/dist/hooks/useCalendar.d.ts +0 -3
  258. package/dist/hooks/useCalendar.d.ts.map +1 -1
  259. package/dist/hooks/useCalendar.js +0 -10
  260. package/dist/hooks/useCalendar.js.map +1 -1
  261. package/dist/hooks/useDateInput.d.ts.map +1 -1
  262. package/dist/hooks/useDateInput.js +29 -18
  263. package/dist/hooks/useDateInput.js.map +1 -1
  264. package/dist/hooks/useEventListener.js.map +1 -1
  265. package/dist/hooks/useExternRef.js.map +1 -1
  266. package/dist/hooks/useFocusTrap.d.ts +5 -1
  267. package/dist/hooks/useFocusTrap.d.ts.map +1 -1
  268. package/dist/hooks/useFocusTrap.js +2 -2
  269. package/dist/hooks/useFocusTrap.js.map +1 -1
  270. package/dist/hooks/useMutationObserver.d.ts +2 -1
  271. package/dist/hooks/useMutationObserver.d.ts.map +1 -1
  272. package/dist/hooks/useMutationObserver.js +6 -5
  273. package/dist/hooks/useMutationObserver.js.map +1 -1
  274. package/dist/lib/dom.d.ts.map +1 -1
  275. package/dist/lib/dom.js +7 -1
  276. package/dist/lib/dom.js.map +1 -1
  277. package/dist/lib/floating/customResizeObserver.js.map +1 -1
  278. package/dist/lib/floating/index.d.ts +1 -1
  279. package/dist/lib/floating/index.d.ts.map +1 -1
  280. package/dist/lib/floating/index.js.map +1 -1
  281. package/dist/lib/floating/types/common.d.ts +1 -1
  282. package/dist/lib/floating/types/common.d.ts.map +1 -1
  283. package/dist/lib/floating/types/common.js.map +1 -1
  284. package/dist/lib/sheet/controllers/BottomSheetController.js.map +1 -1
  285. package/dist/lib/sheet/controllers/CSSTransitionController.js.map +1 -1
  286. package/dist/styles/animationVisibilityDelay.d.ts +3 -0
  287. package/dist/styles/animationVisibilityDelay.d.ts.map +1 -0
  288. package/dist/styles/animationVisibilityDelay.js +10 -0
  289. package/dist/styles/animationVisibilityDelay.js.map +1 -0
  290. package/dist/vkui.css +1 -1
  291. package/dist/vkui.css.map +1 -1
  292. package/package.json +3 -6
  293. package/src/components/ActionSheet/ActionSheet.tsx +4 -1
  294. package/src/components/AppRoot/AppRoot.mdx +1 -1
  295. package/src/components/AppRoot/ScrollContext.tsx +2 -2
  296. package/src/components/Banner/Banner.tsx +2 -2
  297. package/src/components/Button/Button.tsx +2 -2
  298. package/src/components/Calendar/Calendar.tsx +8 -7
  299. package/src/components/CalendarRange/CalendarRange.tsx +65 -42
  300. package/src/components/CalendarRange/types.ts +1 -0
  301. package/src/components/CalendarRange/utils.ts +190 -0
  302. package/src/components/Checkbox/Checkbox.tsx +2 -2
  303. package/src/components/ChipsInput/useChipsInput.ts +23 -2
  304. package/src/components/ChipsInputBase/types.ts +5 -1
  305. package/src/components/Clickable/Clickable.tsx +12 -4
  306. package/src/components/Clickable/RealClickable.tsx +1 -0
  307. package/src/components/ContentCard/ContentCard.tsx +2 -2
  308. package/src/components/CustomSelect/CustomSelect.tsx +11 -7
  309. package/src/components/DateInput/DateInput.tsx +41 -43
  310. package/src/components/DateRangeInput/DateRangeInput.tsx +183 -65
  311. package/src/components/FocusTrap/FocusTrap.tsx +3 -0
  312. package/src/components/FormItem/FormItemTop/FormItemTop.mdx +1 -1
  313. package/src/components/HorizontalCell/HorizontalCell.tsx +2 -2
  314. package/src/components/HorizontalScroll/HorizontalCellShowMore/HorizontalCellShowMore.tsx +2 -2
  315. package/src/components/HorizontalScroll/HorizontalScroll.module.css +2 -3
  316. package/src/components/HorizontalScroll/HorizontalScroll.module.css.d.ts.map +1 -1
  317. package/src/components/IconButton/IconButton.tsx +2 -2
  318. package/src/components/ImageBase/ImageBase.module.css +2 -3
  319. package/src/components/ImageBase/ImageBase.module.css.d.ts.map +1 -1
  320. package/src/components/InputLike/InputLike.tsx +4 -3
  321. package/src/components/Link/Link.tsx +3 -2
  322. package/src/components/MiniInfoCell/MiniInfoCell.tsx +2 -7
  323. package/src/components/ModalOutsideButton/ModalOutsideButton.tsx +2 -2
  324. package/src/components/NumberInputLike/NumberInputLike.tsx +56 -0
  325. package/src/components/Pagination/PaginationPage/PaginationPageButton.tsx +2 -2
  326. package/src/components/PanelHeader/PanelHeader.tsx +3 -1
  327. package/src/components/PanelHeaderButton/PanelHeaderButton.tsx +2 -2
  328. package/src/components/Radio/Radio.tsx +2 -2
  329. package/src/components/Removable/Removable.module.css +9 -0
  330. package/src/components/Removable/Removable.module.css.d.ts.map +1 -1
  331. package/src/components/Removable/Removable.tsx +50 -120
  332. package/src/components/Removable/RemovableIos.tsx +135 -0
  333. package/src/components/RichCell/RichCell.tsx +2 -2
  334. package/src/components/ScreenSpinner/ScreenSpinner.tsx +8 -1
  335. package/src/components/ScreenSpinner/ScreenSpinnerContainer.tsx +4 -1
  336. package/src/components/SelectionControl/SelectionControl.tsx +2 -2
  337. package/src/components/SimpleCell/SimpleCell.tsx +2 -2
  338. package/src/components/Skeleton/Skeleton.tsx +15 -2
  339. package/src/components/Spinner/Spinner.tsx +13 -1
  340. package/src/components/SubnavigationButton/SubnavigationButton.tsx +2 -2
  341. package/src/components/Tabs/Tabs.tsx +23 -19
  342. package/src/components/Tabs/TabsController.ts +37 -0
  343. package/src/components/Tabs/TabsModeContext.ts +24 -0
  344. package/src/components/TabsItem/TabsItem.tsx +22 -5
  345. package/src/components/Tappable/Tappable.tsx +5 -0
  346. package/src/components/ToolButton/ToolButton.tsx +2 -2
  347. package/src/components/UnstyledTextField/UnstyledTextField.mdx +1 -1
  348. package/src/hooks/useCalendar.ts +0 -12
  349. package/src/hooks/useDateInput.ts +21 -12
  350. package/src/hooks/useFocusTrap.ts +10 -1
  351. package/src/hooks/useMutationObserver.ts +7 -4
  352. package/src/lib/dom.tsx +7 -1
  353. package/src/lib/floating/index.ts +2 -0
  354. package/src/lib/floating/types/common.ts +2 -0
  355. package/src/styles/animationVisibilityDelay.module.css +13 -0
  356. package/src/styles/animationVisibilityDelay.module.css.d.ts.map +1 -0
  357. package/src/styles/animationVisibilityDelay.ts +13 -0
@@ -1,12 +1,14 @@
1
1
  import * as React from 'react';
2
2
  import { classNames, hasReactNode } from '@vkontakte/vkjs';
3
3
  import { defineComponentDisplayNames } from '../../lib/react/defineComponentDisplayNames';
4
+ import { animationVisibilityDelayStyles } from '../../styles/animationVisibilityDelay';
4
5
  import type { HTMLAttributesWithRootRef } from '../../types';
5
6
  import { RootComponent } from '../RootComponent/RootComponent';
6
7
  import { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';
7
8
  import { SpinnerAnimation } from './SpinnerAnimation';
8
9
  import { Icon16Spinner, Icon24Spinner, Icon32Spinner, Icon44Spinner } from './icons';
9
10
  import styles from './Spinner.module.css';
11
+ import stylesDelay from '../../styles/animationVisibilityDelay.module.css';
10
12
 
11
13
  const spinnerIconMap = {
12
14
  s: Icon16Spinner,
@@ -28,6 +30,10 @@ export interface SpinnerProps extends HTMLAttributesWithRootRef<HTMLSpanElement>
28
30
  * Задать цвет можно будет через свойство color родителя.
29
31
  */
30
32
  noColor?: boolean;
33
+ /**
34
+ * Задерживает отрисовку элемента на заданное количество миллисекунд.
35
+ */
36
+ visibilityDelay?: number;
31
37
  }
32
38
 
33
39
  /**
@@ -40,6 +46,7 @@ export const Spinner = React.memo(
40
46
  children = 'Загружается...',
41
47
  disableAnimation = false,
42
48
  noColor = false,
49
+ visibilityDelay,
43
50
  ...restProps
44
51
  }: SpinnerProps) => {
45
52
  const SpinnerIcon = spinnerIconMap[size];
@@ -49,7 +56,12 @@ export const Spinner = React.memo(
49
56
  Component="span"
50
57
  role="status"
51
58
  {...restProps}
52
- baseClassName={classNames(styles.host, noColor && styles.noColor)}
59
+ baseClassName={classNames(
60
+ styles.host,
61
+ noColor && styles.noColor,
62
+ visibilityDelay && stylesDelay.visibilityDelay,
63
+ )}
64
+ baseStyle={animationVisibilityDelayStyles(visibilityDelay)}
53
65
  >
54
66
  <SpinnerIcon>{disableAnimation ? null : <SpinnerAnimation size={size} />}</SpinnerIcon>
55
67
  {hasReactNode(children) && <VisuallyHidden>{children}</VisuallyHidden>}
@@ -5,7 +5,7 @@ import { Icon16Dropdown } from '@vkontakte/icons';
5
5
  import { classNames } from '@vkontakte/vkjs';
6
6
  import { useAdaptivity } from '../../hooks/useAdaptivity';
7
7
  import type { HasChildren, HasComponent } from '../../types';
8
- import { Tappable, type TappableProps } from '../Tappable/Tappable';
8
+ import { Tappable, type TappableOmitProps } from '../Tappable/Tappable';
9
9
  import { Caption } from '../Typography/Caption/Caption';
10
10
  import { Subhead } from '../Typography/Subhead/Subhead';
11
11
  import styles from './SubnavigationButton.module.css';
@@ -32,7 +32,7 @@ const sizeYClassNames = {
32
32
  compact: styles.sizeYCompact,
33
33
  };
34
34
 
35
- export interface SubnavigationButtonProps extends Omit<TappableProps, 'size'> {
35
+ export interface SubnavigationButtonProps extends Omit<TappableOmitProps, 'size'> {
36
36
  /**
37
37
  * Стиль отображения кнопки.
38
38
  */
@@ -7,6 +7,8 @@ import { usePlatform } from '../../hooks/usePlatform';
7
7
  import { useTabsNavigation } from '../../hooks/useTabsNavigation';
8
8
  import type { HTMLAttributesWithRootRef } from '../../types';
9
9
  import { RootComponent } from '../RootComponent/RootComponent';
10
+ import { useTabsController } from './TabsController';
11
+ import { TabsModeContext } from './TabsModeContext';
10
12
  import styles from './Tabs.module.css';
11
13
 
12
14
  export interface TabsProps extends HTMLAttributesWithRootRef<HTMLDivElement> {
@@ -33,27 +35,20 @@ export interface TabsProps extends HTMLAttributesWithRootRef<HTMLDivElement> {
33
35
  * либо выравниваются по контенту соответственно.
34
36
  */
35
37
  layoutFillMode?: 'auto' | 'stretched' | 'shrinked';
38
+ /**
39
+ * Идентификатор выбранной вкладки. Чтобы свойство работало корректно, у каждого `TabsItem` должно быть прокинуто свойство `id`.
40
+ */
41
+ selectedId?: string;
42
+ /**
43
+ * Идентификатор выбранной вкладки по умолчанию. Чтобы свойство работало корректно, у каждого `TabsItem` должно быть прокинуто свойство `id`.
44
+ */
45
+ defaultSelectedId?: string;
46
+ /**
47
+ * Обработчик изменения выбранной вкладки. Чтобы свойство работало корректно, у каждого `TabsItem` должно быть прокинуто свойство `id`.
48
+ */
49
+ onSelectedIdChange?: (id: string) => void;
36
50
  }
37
51
 
38
- /* eslint-disable jsdoc/require-jsdoc */
39
- export interface TabsContextProps {
40
- mode: TabsProps['mode'];
41
- withGaps: boolean;
42
- layoutFillMode: NonNullable<TabsProps['layoutFillMode']>;
43
- withScrollToSelectedTab: TabsProps['withScrollToSelectedTab'];
44
- scrollBehaviorToSelectedTab: Required<TabsProps['scrollBehaviorToSelectedTab']>;
45
- }
46
- /* eslint-enable jsdoc/require-jsdoc */
47
-
48
- export const TabsModeContext: React.Context<TabsContextProps> =
49
- React.createContext<TabsContextProps>({
50
- mode: 'default',
51
- withGaps: false,
52
- layoutFillMode: 'auto',
53
- withScrollToSelectedTab: false,
54
- scrollBehaviorToSelectedTab: 'nearest',
55
- });
56
-
57
52
  /**
58
53
  * @see https://vkcom.github.io/VKUI/#/Tabs
59
54
  */
@@ -64,8 +59,16 @@ export const Tabs = ({
64
59
  withScrollToSelectedTab,
65
60
  scrollBehaviorToSelectedTab = 'nearest',
66
61
  layoutFillMode = 'auto',
62
+ selectedId,
63
+ defaultSelectedId,
64
+ onSelectedIdChange,
67
65
  ...restProps
68
66
  }: TabsProps): React.ReactNode => {
67
+ const controller = useTabsController({
68
+ selectedId,
69
+ defaultSelectedId,
70
+ onSelectedIdChange,
71
+ });
69
72
  const platform = usePlatform();
70
73
  const direction = useConfigDirection();
71
74
  const isTabFlow = role === 'tablist';
@@ -93,6 +96,7 @@ export const Tabs = ({
93
96
  layoutFillMode,
94
97
  withScrollToSelectedTab,
95
98
  scrollBehaviorToSelectedTab,
99
+ controller,
96
100
  }}
97
101
  >
98
102
  {children}
@@ -0,0 +1,37 @@
1
+ import { useCustomEnsuredControl } from '../../hooks/useEnsuredControl';
2
+ import { useStableCallback } from '../../hooks/useStableCallback';
3
+ import { type TabsProps } from './Tabs';
4
+
5
+ /* eslint-disable jsdoc/require-jsdoc */
6
+ export type TabsController = {
7
+ onChange: (id: string) => void;
8
+ selectedTab: string;
9
+ };
10
+ /* eslint-enable jsdoc/require-jsdoc */
11
+
12
+ export const useTabsController = ({
13
+ selectedId,
14
+ defaultSelectedId,
15
+ onSelectedIdChange: onSelectedIdChangeProp,
16
+ }: Pick<
17
+ TabsProps,
18
+ 'selectedId' | 'defaultSelectedId' | 'onSelectedIdChange'
19
+ >): TabsController | null => {
20
+ const onSelectedIdChange = useStableCallback(
21
+ (id: string | undefined) => id && onSelectedIdChangeProp?.(id),
22
+ );
23
+
24
+ const [value, onChange] = useCustomEnsuredControl<string | undefined>({
25
+ onChange: onSelectedIdChange,
26
+ value: selectedId,
27
+ defaultValue: defaultSelectedId,
28
+ });
29
+
30
+ if ((!selectedId && !defaultSelectedId) || !value) {
31
+ return null;
32
+ }
33
+ return {
34
+ onChange,
35
+ selectedTab: value,
36
+ };
37
+ };
@@ -0,0 +1,24 @@
1
+ import * as React from 'react';
2
+ import { type TabsProps } from './Tabs';
3
+ import { type TabsController } from './TabsController';
4
+
5
+ /* eslint-disable jsdoc/require-jsdoc */
6
+ export interface TabsContextProps {
7
+ mode: TabsProps['mode'];
8
+ withGaps: boolean;
9
+ layoutFillMode: NonNullable<TabsProps['layoutFillMode']>;
10
+ withScrollToSelectedTab: TabsProps['withScrollToSelectedTab'];
11
+ scrollBehaviorToSelectedTab: Required<TabsProps['scrollBehaviorToSelectedTab']>;
12
+ controller: TabsController | null;
13
+ }
14
+ /* eslint-enable jsdoc/require-jsdoc */
15
+
16
+ export const TabsModeContext: React.Context<TabsContextProps> =
17
+ React.createContext<TabsContextProps>({
18
+ mode: 'default',
19
+ withGaps: false,
20
+ layoutFillMode: 'auto',
21
+ withScrollToSelectedTab: false,
22
+ scrollBehaviorToSelectedTab: 'nearest',
23
+ controller: null,
24
+ });
@@ -8,8 +8,8 @@ import { usePrevious } from '../../hooks/usePrevious';
8
8
  import { useDOM } from '../../lib/dom';
9
9
  import { warnOnce } from '../../lib/warnOnce';
10
10
  import type { AnchorHTMLAttributesOnly, HTMLAttributesWithRootRef } from '../../types';
11
- import { type TabsContextProps, TabsModeContext } from '../Tabs/Tabs';
12
- import { Tappable, type TappableProps } from '../Tappable/Tappable';
11
+ import { type TabsContextProps, TabsModeContext } from '../Tabs/TabsModeContext';
12
+ import { Tappable, type TappableOmitProps } from '../Tappable/Tappable';
13
13
  import { Headline } from '../Typography/Headline/Headline';
14
14
  import { Subhead } from '../Typography/Subhead/Subhead';
15
15
  import { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';
@@ -35,7 +35,7 @@ export interface TabsItemProps
35
35
  extends HTMLAttributesWithRootRef<HTMLElement>,
36
36
  AnchorHTMLAttributesOnly,
37
37
  Pick<
38
- TappableProps,
38
+ TappableOmitProps,
39
39
  | 'Component'
40
40
  | 'activeMode'
41
41
  | 'hoverMode'
@@ -86,7 +86,7 @@ export const TabsItem = ({
86
86
  children,
87
87
  status,
88
88
  after,
89
- selected = false,
89
+ selected: selectedProp = false,
90
90
  role = 'tab',
91
91
  tabIndex: tabIndexProp,
92
92
  getRootRef,
@@ -94,6 +94,8 @@ export const TabsItem = ({
94
94
  activeMode = '',
95
95
  hasActive = false,
96
96
  focusVisibleMode = 'inside',
97
+ id,
98
+ onClick,
97
99
  ...restProps
98
100
  }: TabsItemProps): React.ReactNode => {
99
101
  const { sizeY = 'none' } = useAdaptivity();
@@ -103,11 +105,14 @@ export const TabsItem = ({
103
105
  layoutFillMode,
104
106
  scrollBehaviorToSelectedTab,
105
107
  withScrollToSelectedTab,
108
+ controller,
106
109
  }: TabsContextProps = React.useContext(TabsModeContext);
107
110
  let statusComponent = null;
108
111
 
109
112
  const isTabFlow = role === 'tab';
110
113
 
114
+ const selected = selectedProp || (!!id && controller?.selectedTab === id);
115
+
111
116
  if (hasReactNode(status)) {
112
117
  statusComponent =
113
118
  typeof status === 'number' ? (
@@ -130,7 +135,7 @@ export const TabsItem = ({
130
135
  if (process.env.NODE_ENV === 'development' && isTabFlow) {
131
136
  if (!restProps['aria-controls']) {
132
137
  warn(`Передайте в "aria-controls" id контролируемого блока`, 'warn');
133
- } else if (!restProps['id']) {
138
+ } else if (!id) {
134
139
  warn(
135
140
  `Передайте "id" компоненту для использования в "aria-labelledby" контролируемого блока`,
136
141
  'warn',
@@ -183,6 +188,16 @@ export const TabsItem = ({
183
188
  [rootRef, document, shouldScrollToSelected, scrollBehaviorToSelectedTab],
184
189
  );
185
190
 
191
+ const _onClick: React.MouseEventHandler<HTMLElement> = React.useCallback(
192
+ (e) => {
193
+ onClick?.(e);
194
+ if (id) {
195
+ controller?.onChange(id);
196
+ }
197
+ },
198
+ [id, onClick, controller],
199
+ );
200
+
186
201
  return (
187
202
  <Tappable
188
203
  getRootRef={rootRef}
@@ -201,6 +216,8 @@ export const TabsItem = ({
201
216
  withGaps && styles.withGaps,
202
217
  layoutFillMode !== 'auto' && fillModeClassNames[layoutFillMode],
203
218
  )}
219
+ onClick={_onClick}
220
+ id={id}
204
221
  {...restProps}
205
222
  >
206
223
  {before && <div className={styles.before}>{before}</div>}
@@ -45,6 +45,11 @@ export interface TappableProps extends ClickableProps, StateProps {
45
45
  hoverClassName?: string; // Переделать на Omit<ClickableProps, 'activeClassName' | 'hoverClassName'>
46
46
  }
47
47
 
48
+ // TODO [>=8]: = React.AllHTMLAttributes<HTMLElement> & HasRootRef<HTMLElement>
49
+ //
50
+ // NOTE: Возможно стоит вообще запретить компонентам расширяться от TappableProps?
51
+ export type TappableOmitProps = Omit<TappableProps, 'DefaultComponent'>;
52
+
48
53
  export const Tappable = ({
49
54
  baseClassName,
50
55
  borderRadiusMode = 'auto',
@@ -6,7 +6,7 @@ import {
6
6
  AdaptiveIconRenderer,
7
7
  type AdaptiveIconRendererProps,
8
8
  } from '../AdaptiveIconRenderer/AdaptiveIconRenderer';
9
- import { Tappable, type TappableProps } from '../Tappable/Tappable';
9
+ import { Tappable, type TappableOmitProps } from '../Tappable/Tappable';
10
10
  import styles from './ToolButton.module.css';
11
11
 
12
12
  const stylesMode = {
@@ -31,7 +31,7 @@ const sizeYClassNames = {
31
31
  regular: styles.sizeYRegular,
32
32
  };
33
33
 
34
- export interface ToolButtonProps extends TappableProps, AdaptiveIconRendererProps {
34
+ export interface ToolButtonProps extends TappableOmitProps, AdaptiveIconRendererProps {
35
35
  /**
36
36
  * Режим отображения компонента.
37
37
  */
@@ -1,4 +1,4 @@
1
- import { Meta, Title, ArgTypes, Description } from '@storybook/blocks';
1
+ import { Meta, Title, ArgTypes, Description } from '@storybook/addon-docs/blocks';
2
2
  import { UnstyledTextField } from './UnstyledTextField';
3
3
 
4
4
  <Meta title="Service/UnstyledTextField" />
@@ -35,11 +35,8 @@ export function useCalendar({
35
35
  setNextMonth: () => void;
36
36
  focusedDay: Date | undefined;
37
37
  setFocusedDay: React.Dispatch<React.SetStateAction<Date | undefined>>;
38
- focusableDay: Date | undefined;
39
- setFocusableDay: React.Dispatch<React.SetStateAction<Date | undefined>>;
40
38
  isDayFocused: (day: Date) => boolean;
41
39
  isDayDisabled: (day: Date, withTime?: boolean) => boolean;
42
- resetSelectedDay: () => void;
43
40
  isMonthDisabled: (month: number, year?: number) => boolean;
44
41
  isYearDisabled: (year: number) => boolean;
45
42
  } {
@@ -49,8 +46,6 @@ export function useCalendar({
49
46
  // соответствует дню, на котором сейчас есть фокус
50
47
  // меняется при переключении дней с помощью стрелок
51
48
  const [focusedDay, setFocusedDay] = React.useState<Date>();
52
- // соотвествует дню, на котором можно сфокусироваться с помощью Tab
53
- const [focusableDay, setFocusableDay] = React.useState<Date>();
54
49
 
55
50
  const setPrevMonth = React.useCallback(() => {
56
51
  onPrevMonth?.();
@@ -144,10 +139,6 @@ export function useCalendar({
144
139
  [disableFuture, disablePast, minDateTime, maxDateTime],
145
140
  );
146
141
 
147
- const resetSelectedDay = React.useCallback(() => {
148
- setFocusedDay(undefined);
149
- }, [setFocusedDay]);
150
-
151
142
  return {
152
143
  viewDate,
153
144
  setViewDate: handleSetViewDate,
@@ -155,11 +146,8 @@ export function useCalendar({
155
146
  setNextMonth,
156
147
  focusedDay,
157
148
  setFocusedDay,
158
- focusableDay,
159
- setFocusableDay,
160
149
  isDayFocused,
161
150
  isDayDisabled,
162
- resetSelectedDay,
163
151
  isMonthDisabled,
164
152
  isYearDisabled,
165
153
  };
@@ -83,22 +83,27 @@ export function useDateInput<T extends HTMLElement, D>({
83
83
  }
84
84
  }, [onCalendarOpenChanged, open, openCalendar, accessible]);
85
85
 
86
- const toggleCalendar = useCallback(() => {
87
- if (open) {
88
- _onCalendarClose();
89
- } else {
90
- _onCalendarOpen();
91
- }
92
- }, [open, _onCalendarOpen, _onCalendarClose]);
93
-
94
- const removeFocusFromField = React.useCallback(() => {
86
+ const resetFocusedElement = React.useCallback(() => {
95
87
  if (focusedElement !== null) {
96
88
  setFocusedElement(null);
97
89
  window!.getSelection()?.removeAllRanges();
98
90
  setInternalValue(getInternalValue(value));
99
91
  }
92
+ }, [focusedElement, getInternalValue, value, window]);
93
+
94
+ const removeFocusFromField = React.useCallback(() => {
95
+ resetFocusedElement();
100
96
  _onCalendarClose();
101
- }, [_onCalendarClose, window, getInternalValue, value, focusedElement]);
97
+ }, [resetFocusedElement, _onCalendarClose]);
98
+
99
+ const toggleCalendar = useCallback(() => {
100
+ resetFocusedElement();
101
+ if (open) {
102
+ _onCalendarClose();
103
+ } else {
104
+ _onCalendarOpen();
105
+ }
106
+ }, [resetFocusedElement, open, _onCalendarClose, _onCalendarOpen]);
102
107
 
103
108
  const handleClickOutside = React.useCallback(
104
109
  (e: MouseEvent) => {
@@ -212,13 +217,17 @@ export function useDateInput<T extends HTMLElement, D>({
212
217
  ).padStart(config.length, '0');
213
218
  } else if (e.key === 'ArrowLeft' || e.key === 'Left' || (e.key === 'Tab' && e.shiftKey)) {
214
219
  if (focusedElement <= 0) {
215
- removeFocusFromField();
220
+ if (e.key === 'Tab') {
221
+ removeFocusFromField();
222
+ }
216
223
  return;
217
224
  }
218
225
  setFocusedElement(focusedElement - 1);
219
226
  } else if (e.key === 'ArrowRight' || e.key === 'Right' || e.key === 'Tab') {
220
227
  if (focusedElement >= maxElement) {
221
- removeFocusFromField();
228
+ if (e.key === 'Tab') {
229
+ removeFocusFromField();
230
+ }
222
231
  return;
223
232
  }
224
233
 
@@ -114,6 +114,10 @@ export type UseFocusTrapProps = {
114
114
  * @default true
115
115
  */
116
116
  captureEscapeKeyboardEvent?: boolean;
117
+ /**
118
+ * Пользовательские опции для MutationObserver, который отслеживает изменения DOM внутри компонента и пересчитывает ноды для фокуса.
119
+ */
120
+ mutationObserverOptions?: MutationObserverInit;
117
121
  };
118
122
 
119
123
  /**
@@ -129,6 +133,7 @@ export const useFocusTrap = (
129
133
  timeout = 0,
130
134
  onClose,
131
135
  captureEscapeKeyboardEvent = true,
136
+ mutationObserverOptions,
132
137
  }: UseFocusTrapProps,
133
138
  ) => {
134
139
  const { document } = useDOM();
@@ -189,7 +194,11 @@ export const useFocusTrap = (
189
194
  }
190
195
  };
191
196
 
192
- useMutationObserver(ref, () => ref.current && onMutateParentHandler(ref.current));
197
+ useMutationObserver(
198
+ ref,
199
+ () => ref.current && onMutateParentHandler(ref.current),
200
+ mutationObserverOptions,
201
+ );
193
202
 
194
203
  useIsomorphicLayoutEffect(() => {
195
204
  ref.current && recalculateFocusableNodesRef(ref.current);
@@ -2,9 +2,15 @@ import type * as React from 'react';
2
2
  import { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';
3
3
  import { useStableCallback } from './useStableCallback';
4
4
 
5
+ export const DEFAULT_MUTATION_OBSERVER_OPTIONS: MutationObserverInit = {
6
+ subtree: true,
7
+ childList: true,
8
+ };
9
+
5
10
  export const useMutationObserver = (
6
11
  ref: React.RefObject<HTMLElement | null> | null,
7
12
  callback: () => void,
13
+ options: MutationObserverInit = DEFAULT_MUTATION_OBSERVER_OPTIONS,
8
14
  ): void => {
9
15
  const stableCallback = useStableCallback(callback);
10
16
 
@@ -13,10 +19,7 @@ export const useMutationObserver = (
13
19
  return;
14
20
  }
15
21
  const observer = new MutationObserver(stableCallback);
16
- observer.observe(ref.current, {
17
- subtree: true,
18
- childList: true,
19
- });
22
+ observer.observe(ref.current, options);
20
23
  return () => observer.disconnect();
21
24
  }, [ref, stableCallback]);
22
25
  };
package/src/lib/dom.tsx CHANGED
@@ -95,7 +95,13 @@ export function getTransformedParentCoords(element: Element): {
95
95
  let parentNode = element.parentNode;
96
96
  while (parentNode !== null) {
97
97
  if (isHTMLElement(parentNode)) {
98
- const { transform, willChange } = getComputedStyle(parentNode);
98
+ let { transform, willChange } = getComputedStyle(parentNode);
99
+ if (transform === '') {
100
+ transform = 'unset';
101
+ }
102
+ if (willChange === '') {
103
+ willChange = 'unset';
104
+ }
99
105
  if (
100
106
  !TRANSFORM_DEFAULT_VALUES.includes(transform) ||
101
107
  !WILL_CHANGE_DEFAULT_VALUES.includes(willChange)
@@ -1,6 +1,8 @@
1
1
  export type {
2
2
  UseFloatingOptions,
3
3
  Placement,
4
+ Side,
5
+ Alignment,
4
6
  VirtualElement,
5
7
  PlacementWithAuto,
6
8
  AutoPlacementType,
@@ -15,6 +15,8 @@ export type {
15
15
  ArrowOptions,
16
16
  UseFloatingReturn,
17
17
  Placement,
18
+ Side,
19
+ Alignment,
18
20
  Middleware as UseFloatingMiddleware,
19
21
  UseFloatingData,
20
22
  Strategy as FloatingPositionStrategy,
@@ -0,0 +1,13 @@
1
+ .visibilityDelay {
2
+ --vkui_internal--animation_delay_visibility: 200ms;
3
+
4
+ visibility: hidden;
5
+ animation: 0ms linear var(--vkui_internal--animation_delay_visibility) forwards
6
+ animation-styles-delay-visibility;
7
+ }
8
+
9
+ @keyframes animation-styles-delay-visibility {
10
+ to {
11
+ visibility: visible;
12
+ }
13
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["./animationVisibilityDelay.module.css"],"names":["visibilityDelay"],"mappings":"AAAA;AAAA,E,aAAAA,iB,WAAA;AAAA;AAAA","file":"animationVisibilityDelay.module.css.d.ts","sourceRoot":""}
@@ -0,0 +1,13 @@
1
+ import { type CSSCustomProperties } from '../types';
2
+
3
+ export function animationVisibilityDelayStyles(
4
+ delay: number | undefined,
5
+ ): CSSCustomProperties | undefined {
6
+ if (delay === undefined) {
7
+ return undefined;
8
+ }
9
+
10
+ return {
11
+ '--vkui_internal--animation_delay_visibility': `${delay}ms`,
12
+ };
13
+ }